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