Guard reasoning deltas after visible output
This commit is contained in:
@@ -484,20 +484,28 @@ function writeRuntimeEvent(
|
|||||||
if (event.type === "run_queued") {
|
if (event.type === "run_queued") {
|
||||||
if (streamState) streamState.phase = "queued";
|
if (streamState) streamState.phase = "queued";
|
||||||
if (streamState && event.run_id) streamState.runId = event.run_id;
|
if (streamState && event.run_id) streamState.runId = event.run_id;
|
||||||
writer.write({
|
writeReasoningDelta(
|
||||||
type: "reasoning-delta",
|
writer,
|
||||||
id: "reasoning-1",
|
{
|
||||||
delta: "\n当前会话已有任务在执行,本轮正在排队。",
|
type: "reasoning-delta",
|
||||||
});
|
id: "reasoning-1",
|
||||||
|
delta: "\n当前会话已有任务在执行,本轮正在排队。",
|
||||||
|
},
|
||||||
|
streamState,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (event.type === "run_started") {
|
if (event.type === "run_started") {
|
||||||
if (streamState) streamState.phase = "running";
|
if (streamState) streamState.phase = "running";
|
||||||
if (streamState && event.run_id) streamState.runId = event.run_id;
|
if (streamState && event.run_id) streamState.runId = event.run_id;
|
||||||
writer.write({
|
writeReasoningDelta(
|
||||||
type: "reasoning-delta",
|
writer,
|
||||||
id: "reasoning-1",
|
{
|
||||||
delta: "\n后端已开始执行本轮任务。",
|
type: "reasoning-delta",
|
||||||
});
|
id: "reasoning-1",
|
||||||
|
delta: "\n后端已开始执行本轮任务。",
|
||||||
|
},
|
||||||
|
streamState,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (event.type === "server_heartbeat") {
|
if (event.type === "server_heartbeat") {
|
||||||
const elapsed =
|
const elapsed =
|
||||||
@@ -505,11 +513,15 @@ function writeRuntimeEvent(
|
|||||||
? `,已等待 ${formatDuration(event.elapsed_ms)}`
|
? `,已等待 ${formatDuration(event.elapsed_ms)}`
|
||||||
: "";
|
: "";
|
||||||
const phase = streamState?.phase === "queued" ? "仍在排队" : "后端仍在处理";
|
const phase = streamState?.phase === "queued" ? "仍在排队" : "后端仍在处理";
|
||||||
writer.write({
|
writeReasoningDelta(
|
||||||
type: "reasoning-delta",
|
writer,
|
||||||
id: "reasoning-1",
|
{
|
||||||
delta: `\n${phase}${elapsed}。`,
|
type: "reasoning-delta",
|
||||||
});
|
id: "reasoning-1",
|
||||||
|
delta: `\n${phase}${elapsed}。`,
|
||||||
|
},
|
||||||
|
streamState,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (event.type === "content_delta" && event.delta) {
|
if (event.type === "content_delta" && event.delta) {
|
||||||
if (!streamState?.textStarted) {
|
if (!streamState?.textStarted) {
|
||||||
@@ -531,11 +543,15 @@ function writeRuntimeEvent(
|
|||||||
: `index:${event.tool_call_index}`);
|
: `index:${event.tool_call_index}`);
|
||||||
if (key && !streamState?.announcedToolCallKeys.has(key)) {
|
if (key && !streamState?.announcedToolCallKeys.has(key)) {
|
||||||
streamState?.announcedToolCallKeys.add(key);
|
streamState?.announcedToolCallKeys.add(key);
|
||||||
writer.write({
|
writeReasoningDelta(
|
||||||
type: "reasoning-delta",
|
writer,
|
||||||
id: "reasoning-1",
|
{
|
||||||
delta: `\n准备调用 ${event.tool_name ?? "工具"}。`,
|
type: "reasoning-delta",
|
||||||
});
|
id: "reasoning-1",
|
||||||
|
delta: `\n准备调用 ${event.tool_name ?? "工具"}。`,
|
||||||
|
},
|
||||||
|
streamState,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (event.type === "final_text_start") {
|
if (event.type === "final_text_start") {
|
||||||
@@ -576,11 +592,15 @@ function writeRuntimeEvent(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (event.type === "tool_delta" && event.tool_call_id && event.delta) {
|
if (event.type === "tool_delta" && event.tool_call_id && event.delta) {
|
||||||
writer.write({
|
writeReasoningDelta(
|
||||||
type: "reasoning-delta",
|
writer,
|
||||||
id: "reasoning-1",
|
{
|
||||||
delta: `\n${event.tool_name ?? "tool"} 输出中...`,
|
type: "reasoning-delta",
|
||||||
});
|
id: "reasoning-1",
|
||||||
|
delta: `\n${event.tool_name ?? "tool"} 输出中...`,
|
||||||
|
},
|
||||||
|
streamState,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (event.type === "tool_result" && event.tool_call_id) {
|
if (event.type === "tool_result" && event.tool_call_id) {
|
||||||
const preview = event.metadata?.output_preview;
|
const preview = event.metadata?.output_preview;
|
||||||
@@ -597,6 +617,15 @@ function writeRuntimeEvent(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function writeReasoningDelta(
|
||||||
|
writer: UIMessageStreamWriter<UIMessage>,
|
||||||
|
part: Parameters<UIMessageStreamWriter<UIMessage>["write"]>[0],
|
||||||
|
streamState?: StreamState,
|
||||||
|
) {
|
||||||
|
if (streamState?.reasoningEnded) return;
|
||||||
|
writer.write(part);
|
||||||
|
}
|
||||||
|
|
||||||
function formatClawResponse(payload: ClawChatResponse) {
|
function formatClawResponse(payload: ClawChatResponse) {
|
||||||
if (payload.error) return payload.error;
|
if (payload.error) return payload.error;
|
||||||
return payload.final_output ?? "";
|
return payload.final_output ?? "";
|
||||||
|
|||||||
Reference in New Issue
Block a user