






















@@ -163,6 +163,8 @@ type ApiKeyInfo = ResolvedProviderAuth;
163163164164const MAX_SAME_MODEL_IDLE_TIMEOUT_RETRIES = 1;
165165const EMBEDDED_RUN_LANE_TIMEOUT_GRACE_MS = 30_000;
166+const MID_TURN_PRECHECK_CONTINUATION_PROMPT =
167+"Continue from the current transcript after the latest tool result. Do not repeat the original user request, and do not rerun completed tools unless the transcript shows they are still needed.";
166168type EmbeddedRunAttemptForRunner = Awaited<ReturnType<typeof runEmbeddedAttemptWithBackend>>;
167169168170function resolveEmbeddedRunLaneTimeoutMs(timeoutMs: number): number | undefined {
@@ -759,6 +761,7 @@ export async function runEmbeddedPiAgent(
759761let planningOnlyRetryInstruction: string | null = null;
760762let reasoningOnlyRetryInstruction: string | null = null;
761763let emptyResponseRetryInstruction: string | null = null;
764+let nextAttemptPromptOverride: string | null = null;
762765const ackExecutionFastPathInstruction = resolveAckExecutionFastPathInstruction({
763766 provider,
764767 modelId,
@@ -963,7 +966,9 @@ export async function runEmbeddedPiAgent(
963966await fs.mkdir(resolvedWorkspace, { recursive: true });
964967965968const basePrompt =
966-provider === "anthropic" ? scrubAnthropicRefusalMagic(params.prompt) : params.prompt;
969+nextAttemptPromptOverride ??
970+(provider === "anthropic" ? scrubAnthropicRefusalMagic(params.prompt) : params.prompt);
971+nextAttemptPromptOverride = null;
967972const promptAdditions = [
968973ackExecutionFastPathInstruction,
969974planningOnlyRetryInstruction,
@@ -1201,10 +1206,15 @@ export async function runEmbeddedPiAgent(
12011206(attempt.toolMetas?.length ?? 0) === 0 &&
12021207(attempt.assistantTexts?.length ?? 0) === 0;
12031208if (preflightRecovery?.handled) {
1209+const retryingFromTranscript = preflightRecovery.source === "mid-turn";
12041210log.info(
12051211`[context-overflow-precheck] early recovery route=${preflightRecovery.route} ` +
1206-`completed for ${provider}/${modelId}; retrying prompt`,
1212+`completed for ${provider}/${modelId}; ` +
1213+(retryingFromTranscript ? "retrying from current transcript" : "retrying prompt"),
12071214);
1215+if (retryingFromTranscript) {
1216+nextAttemptPromptOverride = MID_TURN_PRECHECK_CONTINUATION_PROMPT;
1217+}
12081218continue;
12091219}
12101220const requestedSelection = shouldSwitchToLiveModel({
@@ -1385,6 +1395,9 @@ export async function runEmbeddedPiAgent(
13851395log.warn(
13861396`context overflow persisted after in-attempt compaction (attempt ${overflowCompactionAttempts}/${MAX_OVERFLOW_COMPACTION_ATTEMPTS}); retrying prompt without additional compaction for ${provider}/${modelId}`,
13871397);
1398+if (preflightRecovery?.source === "mid-turn") {
1399+nextAttemptPromptOverride = MID_TURN_PRECHECK_CONTINUATION_PROMPT;
1400+}
13881401continue;
13891402}
13901403// Attempt explicit overflow compaction only when this attempt did not
@@ -1512,6 +1525,9 @@ export async function runEmbeddedPiAgent(
15121525}
15131526autoCompactionCount += 1;
15141527log.info(`auto-compaction succeeded for ${provider}/${modelId}; retrying prompt`);
1528+if (preflightRecovery?.source === "mid-turn") {
1529+nextAttemptPromptOverride = MID_TURN_PRECHECK_CONTINUATION_PROMPT;
1530+}
15151531continue;
15161532}
15171533log.warn(
@@ -1550,6 +1566,9 @@ export async function runEmbeddedPiAgent(
15501566log.info(
15511567`[context-overflow-recovery] Truncated ${truncResult.truncatedCount} tool result(s); retrying prompt`,
15521568);
1569+if (preflightRecovery?.source === "mid-turn") {
1570+nextAttemptPromptOverride = MID_TURN_PRECHECK_CONTINUATION_PROMPT;
1571+}
15531572continue;
15541573}
15551574log.warn(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。