Skip to content

Commit 3217f0f

Browse files
committed
fix(chat): stream text chunks with fullText fallback and in-stream error diagnostics
1 parent 1bf3caa commit 3217f0f

1 file changed

Lines changed: 52 additions & 15 deletions

File tree

‎apps/site/src/pages/api/chat.ts‎

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -157,24 +157,61 @@ export const POST: APIRoute = async ({ request }) => {
157157
messages: coreMessages,
158158
tools,
159159
stopWhen: isStepCount(10),
160-
onFinish: async () => {
161-
try {
162-
if (mcpClient) {
163-
await mcpClient.close();
164-
}
165-
} catch {
166-
// Ignore cleanup errors
167-
}
160+
onError: ({ error }) => {
161+
console.error("[StreamText Internal Error]", error);
168162
},
169163
});
170164

171-
const textResponse = result.toTextStreamResponse();
172-
const headers = new Headers(textResponse.headers);
173-
headers.set("access-control-allow-origin", "*");
174-
return new Response(textResponse.body, {
175-
status: textResponse.status,
176-
statusText: textResponse.statusText,
177-
headers,
165+
// Pipe text stream through TransformStream with explicit error surface
166+
const transformStream = new TransformStream();
167+
const writer = transformStream.writable.getWriter();
168+
const encoder = new TextEncoder();
169+
170+
(async () => {
171+
try {
172+
let hasOutput = false;
173+
for await (const chunk of result.textStream) {
174+
if (chunk) {
175+
hasOutput = true;
176+
await writer.write(encoder.encode(chunk));
177+
}
178+
}
179+
if (!hasOutput) {
180+
// Fallback: check full text from result in case textStream did not emit intermediate text
181+
const fullText = await result.text;
182+
if (fullText) {
183+
await writer.write(encoder.encode(fullText));
184+
} else {
185+
await writer.write(
186+
encoder.encode(
187+
"I searched the CodingCat.dev dataset for your query, but did not find any matching results.",
188+
),
189+
);
190+
}
191+
}
192+
} catch (streamErr) {
193+
console.error("[StreamText Stream Loop Error]", streamErr);
194+
const errMsg =
195+
streamErr instanceof Error ? streamErr.message : String(streamErr);
196+
await writer.write(
197+
encoder.encode(`\n\n[Error generating response: ${errMsg}]`),
198+
);
199+
} finally {
200+
await writer.close();
201+
if (mcpClient) {
202+
try {
203+
await mcpClient.close();
204+
} catch {}
205+
}
206+
}
207+
})();
208+
209+
return new Response(transformStream.readable, {
210+
headers: {
211+
"content-type": "text/plain; charset=utf-8",
212+
"access-control-allow-origin": "*",
213+
"cache-control": "no-cache",
214+
},
178215
});
179216
} catch (err) {
180217
try {

0 commit comments

Comments
 (0)