Store thinking events in message timeline

This commit is contained in:
2026-06-15 11:50:35 -07:00
parent dfb79f3acd
commit a0e2364481

View File

@@ -1212,10 +1212,20 @@ export async function POST(request: Request) {
return; return;
} }
// Stream the model's reasoning narration as a separate SSE
// event type. We pay for thinking tokens whether or not we
// ask for them, so making them visible is free transparency
// — and it cures the "tool tray with no narrative" feel.
if (resp.thoughts) {
assistantTimeline.push({ kind: "thought", text: resp.thoughts });
emit({ type: "thinking", text: resp.thoughts });
}
// Stream user-facing text to client. // Stream user-facing text to client.
if (resp.text) { if (resp.text) {
assistantText += (assistantText ? "\n\n" : "") + resp.text; assistantText += (assistantText ? "\n\n" : "") + resp.text;
assistantTextSegments.push(resp.text); assistantTextSegments.push(resp.text);
assistantTimeline.push({ kind: "text", text: resp.text });
emit({ type: "text", text: resp.text }); emit({ type: "text", text: resp.text });
roundsSinceText = 0; roundsSinceText = 0;
toolCallsSinceText = 0; toolCallsSinceText = 0;
@@ -1224,14 +1234,6 @@ export async function POST(request: Request) {
toolCallsSinceText += resp.toolCalls.length; toolCallsSinceText += resp.toolCalls.length;
} }
// Stream the model's reasoning narration as a separate SSE
// event type. We pay for thinking tokens whether or not we
// ask for them, so making them visible is free transparency
// — and it cures the "tool tray with no narrative" feel.
if (resp.thoughts) {
emit({ type: "thinking", text: resp.thoughts });
}
// Announce tool calls // Announce tool calls
for (const tc of resp.toolCalls) { for (const tc of resp.toolCalls) {
assistantToolCalls.push(tc); assistantToolCalls.push(tc);
@@ -1568,6 +1570,10 @@ export async function POST(request: Request) {
emit({ type: "text", text: fallback }); emit({ type: "text", text: fallback });
} }
if (summary.thoughts) { if (summary.thoughts) {
assistantTimeline.push({
kind: "thought",
text: summary.thoughts,
});
emit({ type: "thinking", text: summary.thoughts }); emit({ type: "thinking", text: summary.thoughts });
} }
} catch { } catch {