Stream assistant content to chat output
This commit is contained in:
@@ -507,11 +507,12 @@ function writeRuntimeEvent(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (event.type === "content_delta" && event.delta) {
|
if (event.type === "content_delta" && event.delta) {
|
||||||
writer.write({
|
if (!streamState?.textStarted) {
|
||||||
type: "reasoning-delta",
|
writer.write({ type: "text-start", id: "text-1" });
|
||||||
id: "reasoning-1",
|
if (streamState) streamState.textStarted = true;
|
||||||
delta: event.delta,
|
}
|
||||||
});
|
writer.write({ type: "text-delta", id: "text-1", delta: event.delta });
|
||||||
|
if (streamState) streamState.textStreamed = true;
|
||||||
}
|
}
|
||||||
if (event.type === "tool_call_delta") {
|
if (event.type === "tool_call_delta") {
|
||||||
const key =
|
const key =
|
||||||
|
|||||||
@@ -984,18 +984,7 @@ function summarizeLiveRunEvents(
|
|||||||
events: readonly LiveRunEvent[],
|
events: readonly LiveRunEvent[],
|
||||||
) {
|
) {
|
||||||
const lines: string[] = [];
|
const lines: string[] = [];
|
||||||
let contentBuffer = "";
|
|
||||||
const flushContentBuffer = () => {
|
|
||||||
const preview = compactLiveContentDelta(contentBuffer);
|
|
||||||
contentBuffer = "";
|
|
||||||
if (preview) lines.push(`输出:${preview}`);
|
|
||||||
};
|
|
||||||
for (const event of events) {
|
for (const event of events) {
|
||||||
if (event.type === "content_delta") {
|
|
||||||
contentBuffer += event.delta ?? "";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
flushContentBuffer();
|
|
||||||
if (event.type === "run_queued") {
|
if (event.type === "run_queued") {
|
||||||
lines.push("当前会话已有任务在执行,本轮正在排队。");
|
lines.push("当前会话已有任务在执行,本轮正在排队。");
|
||||||
}
|
}
|
||||||
@@ -1024,7 +1013,6 @@ function summarizeLiveRunEvents(
|
|||||||
lines.push("正在整理回复");
|
lines.push("正在整理回复");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
flushContentBuffer();
|
|
||||||
if (runStatus.current_stage && lines.at(-1) !== runStatus.current_stage) {
|
if (runStatus.current_stage && lines.at(-1) !== runStatus.current_stage) {
|
||||||
lines.push(runStatus.current_stage);
|
lines.push(runStatus.current_stage);
|
||||||
}
|
}
|
||||||
@@ -1038,18 +1026,6 @@ function summarizeLiveRunEvents(
|
|||||||
return lines.slice(-40);
|
return lines.slice(-40);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isNoisyLiveDelta(value: string) {
|
|
||||||
return value === "。" || value === "," || value === "," || value.length <= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function compactLiveContentDelta(value: string) {
|
|
||||||
const normalized = value.replace(/\s+/g, " ").trim();
|
|
||||||
if (!normalized || isNoisyLiveDelta(normalized)) return "";
|
|
||||||
return normalized.length <= 36
|
|
||||||
? normalized
|
|
||||||
: `${normalized.slice(Math.max(0, normalized.length - 35))}…`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function collectActivityItems(messages: readonly MessageState[]) {
|
function collectActivityItems(messages: readonly MessageState[]) {
|
||||||
const items: ActivityItem[] = [];
|
const items: ActivityItem[] = [];
|
||||||
|
|
||||||
|
|||||||
@@ -647,18 +647,7 @@ function buildActiveRunParts(runStatus: ClawActiveRunStatus) {
|
|||||||
|
|
||||||
function summarizeRunEvents(runStatus: ClawActiveRunStatus) {
|
function summarizeRunEvents(runStatus: ClawActiveRunStatus) {
|
||||||
const lines: string[] = [];
|
const lines: string[] = [];
|
||||||
let contentBuffer = "";
|
|
||||||
const flushContentBuffer = () => {
|
|
||||||
const preview = compactLiveContentDelta(contentBuffer);
|
|
||||||
contentBuffer = "";
|
|
||||||
if (preview) lines.push(`输出:${preview}`);
|
|
||||||
};
|
|
||||||
for (const event of runStatus.events ?? []) {
|
for (const event of runStatus.events ?? []) {
|
||||||
if (event.type === "content_delta") {
|
|
||||||
contentBuffer += event.delta ?? "";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
flushContentBuffer();
|
|
||||||
if (event.type === "run_queued") {
|
if (event.type === "run_queued") {
|
||||||
lines.push("当前会话已有任务在执行,本轮正在排队。");
|
lines.push("当前会话已有任务在执行,本轮正在排队。");
|
||||||
}
|
}
|
||||||
@@ -690,25 +679,12 @@ function summarizeRunEvents(runStatus: ClawActiveRunStatus) {
|
|||||||
lines.push("等待用户 review");
|
lines.push("等待用户 review");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
flushContentBuffer();
|
|
||||||
if (runStatus.current_stage && lines.at(-1) !== runStatus.current_stage) {
|
if (runStatus.current_stage && lines.at(-1) !== runStatus.current_stage) {
|
||||||
lines.push(runStatus.current_stage);
|
lines.push(runStatus.current_stage);
|
||||||
}
|
}
|
||||||
return lines.slice(-40);
|
return lines.slice(-40);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isNoisyLiveDelta(value: string) {
|
|
||||||
return value === "。" || value === "," || value === "," || value.length <= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
function compactLiveContentDelta(value: string) {
|
|
||||||
const normalized = value.replace(/\s+/g, " ").trim();
|
|
||||||
if (!normalized || isNoisyLiveDelta(normalized)) return "";
|
|
||||||
return normalized.length <= 36
|
|
||||||
? normalized
|
|
||||||
: `${normalized.slice(Math.max(0, normalized.length - 35))}…`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildRunToolParts(events: readonly ClawRunEvent[]) {
|
function buildRunToolParts(events: readonly ClawRunEvent[]) {
|
||||||
const resultById = new Map<string, ClawRunEvent>();
|
const resultById = new Map<string, ClawRunEvent>();
|
||||||
for (const event of events) {
|
for (const event of events) {
|
||||||
|
|||||||
Reference in New Issue
Block a user