From ee4147e24eada380ea7da49a337a748ceec58d34 Mon Sep 17 00:00:00 2001 From: ztimson Date: Fri, 18 Sep 2026 16:07:58 -0400 Subject: [PATCH] Fixed opanai early termination from tool calls --- package.json | 2 +- src/open-ai.ts | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index bdc4341..2e411fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/ai-utils", - "version": "1.6.9", + "version": "1.6.10", "description": "AI Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/open-ai.ts b/src/open-ai.ts index c507b96..feff9c6 100644 --- a/src/open-ai.ts +++ b/src/open-ai.ts @@ -110,7 +110,9 @@ export class OpenAi extends LLMProvider { } if(chunk.choices[0]?.delta?.tool_calls) { for(const deltaTC of chunk.choices[0].delta.tool_calls) { - const existing = msg.tool_calls.find((tc: any) => tc.index === deltaTC.index); + const existing = deltaTC.index != null + ? msg.tool_calls.find((tc: any) => tc.index === deltaTC.index) + : (deltaTC.id ? msg.tool_calls.find((tc: any) => tc.id === deltaTC.id) : undefined); if(existing) { if(deltaTC.id) existing.id = deltaTC.id; if(deltaTC.function?.name) existing.function.name = deltaTC.function.name; @@ -133,8 +135,13 @@ export class OpenAi extends LLMProvider { const duration = Date.now() - callStart; const tps = usage?.completion_tokens && duration > 0 ? usage.completion_tokens / (duration / 1000) : 0; - if(finishReason === 'length') { - console.warn('[OpenAi] Response truncated: max_completion_tokens reached before finish_reason=stop'); + if(finishReason === 'length' && !controller.signal.aborted) { + if(msg.content?.trim()) history.push({role: 'assistant', content: msg.content.trim(), timestamp: Date.now(), duration, tps}); + throw new Error(`[OpenAI] Response hit token limit before completing`); + } + + if(!finishReason && !controller.signal.aborted) { + throw new Error('[OpenAI] Stream ended prematurely - connection likely dropped'); } const toolCalls = msg.tool_calls || [];