


























@@ -2669,6 +2669,35 @@ export async function runEmbeddedPiAgent(
26692669});
26702670const timedOutDuringPrompt =
26712671timedOut && !timedOutDuringCompaction && !timedOutDuringToolExecution;
2672+const finalAssistantStopReason = (sessionLastAssistant?.stopReason ?? "")
2673+.trim()
2674+.toLowerCase();
2675+const recoveredFinalAssistantTextAfterPromptTimeout =
2676+timedOutDuringPrompt &&
2677+["completed", "end_turn", "stop"].includes(finalAssistantStopReason)
2678+ ? (finalAssistantVisibleText ?? finalAssistantRawText)?.trim()
2679+ : undefined;
2680+const payloadAlreadyContainsRecoveredFinalAssistant =
2681+recoveredFinalAssistantTextAfterPromptTimeout
2682+ ? (payloadsWithToolMedia ?? []).some(
2683+(payload) =>
2684+payload?.isError !== true &&
2685+payload?.isReasoning !== true &&
2686+typeof payload.text === "string" &&
2687+payload.text.trim() === recoveredFinalAssistantTextAfterPromptTimeout,
2688+)
2689+ : false;
2690+const recoveredFinalAssistantPayloadsAfterPromptTimeout =
2691+recoveredFinalAssistantTextAfterPromptTimeout &&
2692+!payloadAlreadyContainsRecoveredFinalAssistant
2693+ ? [{ text: recoveredFinalAssistantTextAfterPromptTimeout }]
2694+ : undefined;
2695+const hasSuccessfulFinalAssistantAfterPromptTimeout =
2696+timedOutDuringPrompt &&
2697+Boolean(
2698+payloadAlreadyContainsRecoveredFinalAssistant ||
2699+recoveredFinalAssistantPayloadsAfterPromptTimeout?.length,
2700+);
26722701const hasPartialAssistantTextAfterPromptTimeout =
26732702timedOutDuringPrompt &&
26742703(attempt.assistantTexts ?? []).some((text) => text.trim().length > 0) &&
@@ -2690,7 +2719,11 @@ export async function runEmbeddedPiAgent(
26902719// Timeout aborts can leave the run without payloads or with only a
26912720// partial assistant fragment. Emit an explicit timeout error instead,
26922721// preserving any tool payloads that succeeded before the timeout.
2693-if (timedOutDuringPrompt && !hasMessagingToolDeliveryEvidence(attempt)) {
2722+if (
2723+timedOutDuringPrompt &&
2724+!hasSuccessfulFinalAssistantAfterPromptTimeout &&
2725+!hasMessagingToolDeliveryEvidence(attempt)
2726+) {
26942727const defaultTimeoutText = idleTimedOut
26952728 ? "The model did not produce a response before the model idle timeout. " +
26962729"Please try again, or increase `models.providers.<id>.timeoutSeconds` for slow local or self-hosted providers. " +
@@ -2755,11 +2788,13 @@ export async function runEmbeddedPiAgent(
27552788 timedOut,
27562789 attempt,
27572790});
2758-const payloadsForTerminalPath = payloadsWithToolMedia?.length
2759- ? payloadsWithToolMedia
2760- : silentToolResultReplyPayload
2761- ? [silentToolResultReplyPayload]
2762- : payloadsWithToolMedia;
2791+const payloadsForTerminalPath = recoveredFinalAssistantPayloadsAfterPromptTimeout
2792+ ? recoveredFinalAssistantPayloadsAfterPromptTimeout
2793+ : payloadsWithToolMedia?.length
2794+ ? payloadsWithToolMedia
2795+ : silentToolResultReplyPayload
2796+ ? [silentToolResultReplyPayload]
2797+ : payloadsWithToolMedia;
27632798const payloadCount = payloadsForTerminalPath?.length ?? 0;
27642799const emptyAssistantReplyIsSilent = shouldTreatEmptyAssistantReplyAsSilent({
27652800allowEmptyAssistantReplyAsSilent: params.allowEmptyAssistantReplyAsSilent,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。