Start visible text stream after reasoning status

This commit is contained in:
wuyang6
2026-05-14 20:26:42 +08:00
parent 2895425869
commit 05a014d03c
+17
View File
@@ -53,6 +53,7 @@ type ClawStreamItem =
type StreamState = { type StreamState = {
textStarted: boolean; textStarted: boolean;
textStreamed: boolean; textStreamed: boolean;
reasoningEnded: boolean;
phase: "waiting" | "queued" | "running" | "done"; phase: "waiting" | "queued" | "running" | "done";
runId?: string; runId?: string;
announcedToolCallKeys: Set<string>; announcedToolCallKeys: Set<string>;
@@ -111,6 +112,7 @@ export async function POST(req: Request) {
const streamState: StreamState = { const streamState: StreamState = {
textStarted: false, textStarted: false,
textStreamed: false, textStreamed: false,
reasoningEnded: false,
phase: "waiting", phase: "waiting",
announcedToolCallKeys: new Set<string>(), announcedToolCallKeys: new Set<string>(),
streamedToolCallIds: new Set<string>(), streamedToolCallIds: new Set<string>(),
@@ -138,12 +140,15 @@ export async function POST(req: Request) {
const elapsedMs = payload.elapsed_ms ?? Date.now() - startedAt; const elapsedMs = payload.elapsed_ms ?? Date.now() - startedAt;
const text = formatClawResponse(payload); const text = formatClawResponse(payload);
if (!streamState.reasoningEnded) {
writer.write({ writer.write({
type: "reasoning-delta", type: "reasoning-delta",
id: "reasoning-1", id: "reasoning-1",
delta: `\n思考并执行完成,用时 ${formatDuration(elapsedMs)}`, delta: `\n思考并执行完成,用时 ${formatDuration(elapsedMs)}`,
}); });
writer.write({ type: "reasoning-end", id: "reasoning-1" }); writer.write({ type: "reasoning-end", id: "reasoning-1" });
streamState.reasoningEnded = true;
}
writeToolTrace(writer, payload.transcript, streamState); writeToolTrace(writer, payload.transcript, streamState);
if (!streamState.textStreamed) { if (!streamState.textStreamed) {
writer.write({ type: "text-start", id: "text-1" }); writer.write({ type: "text-start", id: "text-1" });
@@ -508,6 +513,10 @@ function writeRuntimeEvent(
} }
if (event.type === "content_delta" && event.delta) { if (event.type === "content_delta" && event.delta) {
if (!streamState?.textStarted) { if (!streamState?.textStarted) {
if (streamState && !streamState.reasoningEnded) {
writer.write({ type: "reasoning-end", id: "reasoning-1" });
streamState.reasoningEnded = true;
}
writer.write({ type: "text-start", id: "text-1" }); writer.write({ type: "text-start", id: "text-1" });
if (streamState) streamState.textStarted = true; if (streamState) streamState.textStarted = true;
} }
@@ -531,12 +540,20 @@ function writeRuntimeEvent(
} }
if (event.type === "final_text_start") { if (event.type === "final_text_start") {
if (!streamState?.textStarted) { if (!streamState?.textStarted) {
if (streamState && !streamState.reasoningEnded) {
writer.write({ type: "reasoning-end", id: "reasoning-1" });
streamState.reasoningEnded = true;
}
writer.write({ type: "text-start", id: "text-1" }); writer.write({ type: "text-start", id: "text-1" });
if (streamState) streamState.textStarted = true; if (streamState) streamState.textStarted = true;
} }
} }
if (event.type === "final_text_delta" && event.delta) { if (event.type === "final_text_delta" && event.delta) {
if (!streamState?.textStarted) { if (!streamState?.textStarted) {
if (streamState && !streamState.reasoningEnded) {
writer.write({ type: "reasoning-end", id: "reasoning-1" });
streamState.reasoningEnded = true;
}
writer.write({ type: "text-start", id: "text-1" }); writer.write({ type: "text-start", id: "text-1" });
if (streamState) streamState.textStarted = true; if (streamState) streamState.textStarted = true;
} }