From e3e6404d78602b82ef934ca9eeb5b93ff0fa0139 Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Sat, 13 Sep 2025 10:56:49 -0700 Subject: [PATCH] Fix: Correctly parse Google API thought stream --- index.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/index.js b/index.js index af1eea9..3bf8109 100644 --- a/index.js +++ b/index.js @@ -222,7 +222,7 @@ export class MyDurableObject { } mapToGoogleContents(messages) { - const contents = messages.reduce((acc, m) => { + return messages.reduce((acc, m) => { const role = m.role === 'assistant' ? 'model' : 'user'; const msgContent = Array.isArray(m.content) ? m.content : [{ type: 'text', text: String(m.content ?? '') }]; const parts = msgContent.map(p => { @@ -239,8 +239,6 @@ export class MyDurableObject { else acc.push({ role, parts }); return acc; }, []); - if (contents.at(-1)?.role !== 'user') contents.pop(); - return contents; } async streamOpenAI({ apiKey, body }) { @@ -289,11 +287,22 @@ export class MyDurableObject { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); - for (const line of buffer.split('\n')) { + const lines = buffer.split('\n'); + buffer = lines.pop() || ''; + for (const line of lines) { if (!line.startsWith('data: ')) continue; - try { JSON.parse(line.substring(6))?.candidates?.[0]?.content?.parts?.forEach(p => p.text && this.queueDelta(p.text)); } catch {} + try { + const chunk = JSON.parse(line.substring(6)); + const candidate = chunk?.candidates?.[0]; + if (!candidate) continue; + + candidate.content?.parts?.forEach(p => p.text && this.queueDelta(p.text)); + + const thoughts = candidate.execution_metadata?.tool_use_signals?.map(s => s.tool_code).filter(Boolean).join(''); + if (thoughts) this.queueDelta(thoughts); + + } catch {} } - buffer = buffer.slice(buffer.lastIndexOf('\n') + 1); } }