fix(agent): recover blank streamed replies from final answer · openclaw/openclaw@1f06dbd
Sanjays2402
·
2026-04-25
·
via Recent Commits to openclaw:main
File tree
src/agents/pi-embedded-runner/run
| Original file line number | Diff line number | Diff line change |
|---|
@@ -65,6 +65,29 @@ describe("buildEmbeddedRunPayloads tool-error warnings", () => {
|
65 | 65 | expectSinglePayloadText(payloads, "Done."); |
66 | 66 | }); |
67 | 67 | |
| 68 | +it("falls back to final-answer assistant text when streamed text only contains blanks", () => { |
| 69 | +const payloads = buildPayloads({ |
| 70 | +assistantTexts: [" "], |
| 71 | +lastAssistant: { |
| 72 | +role: "assistant", |
| 73 | +stopReason: "stop", |
| 74 | +content: [ |
| 75 | +{ |
| 76 | +type: "text", |
| 77 | +text: "Fixed.", |
| 78 | +textSignature: JSON.stringify({ |
| 79 | +v: 1, |
| 80 | +id: "item_final", |
| 81 | +phase: "final_answer", |
| 82 | +}), |
| 83 | +}, |
| 84 | +], |
| 85 | +} as AssistantMessage, |
| 86 | +}); |
| 87 | + |
| 88 | +expectSinglePayloadText(payloads, "Fixed."); |
| 89 | +}); |
| 90 | + |
68 | 91 | it("suppresses exec tool errors when verbose mode is off", () => { |
69 | 92 | expectNoPayloads({ |
70 | 93 | lastToolError: { toolName: "exec", error: "command failed" }, |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -293,20 +293,22 @@ export function buildEmbeddedRunPayloads(params: {
|
293 | 293 | const parsed = parseReplyDirectives(text); |
294 | 294 | return (parsed.mediaUrls?.length ?? 0) > 0 || parsed.audioAsVoice; |
295 | 295 | }); |
296 | | -const normalizedAssistantTexts = normalizeTextForComparison(params.assistantTexts.join("\n\n")); |
| 296 | +const nonEmptyAssistantTexts = params.assistantTexts.filter((text) => text.trim().length > 0); |
| 297 | +const normalizedAssistantTexts = normalizeTextForComparison(nonEmptyAssistantTexts.join("\n\n")); |
297 | 298 | const normalizedRawAnswerText = normalizeTextForComparison(rawAnswerDirectiveState?.text ?? ""); |
298 | 299 | const shouldPreferRawAnswerText = |
299 | 300 | rawAnswerHasMedia && |
300 | | -(!params.assistantTexts.length || |
| 301 | +(!nonEmptyAssistantTexts.length || |
301 | 302 | (!assistantTextsHaveMedia && |
302 | 303 | normalizedAssistantTexts.length > 0 && |
303 | 304 | normalizedAssistantTexts === normalizedRawAnswerText)); |
| 305 | +const hasAssistantTextPayload = nonEmptyAssistantTexts.length > 0; |
304 | 306 | const answerTexts = suppressAssistantArtifacts |
305 | 307 | ? [] |
306 | 308 | : (shouldPreferRawAnswerText && fallbackRawAnswerText |
307 | 309 | ? [fallbackRawAnswerText] |
308 | | - : params.assistantTexts.length |
309 | | - ? params.assistantTexts |
| 310 | + : hasAssistantTextPayload |
| 311 | + ? nonEmptyAssistantTexts |
310 | 312 | : fallbackAnswerText |
311 | 313 | ? [fallbackAnswerText] |
312 | 314 | : [] |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。