Start visible text stream after reasoning status
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user