From 633b66dcb63f25c9b50ffd27226eb92a00c5497f Mon Sep 17 00:00:00 2001 From: decolua Date: Sat, 13 Jun 2026 21:27:22 +0700 Subject: [PATCH] =?UTF-8?q?refactor(translator):=20P4=20concern=20#5=20bui?= =?UTF-8?q?ldUsage=20=E2=80=94=20apply=20to=20kiro/ollama/commandcode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace 3 inline {prompt,completion,total} usage objects with buildUsage() - Preserves ?? vs total fallback semantics (commandcode) - Golden tests pass, identical output Co-authored-by: Cursor --- .../translator/response/commandcode-to-openai.js | 12 +++++++----- open-sse/translator/response/kiro-to-openai.js | 8 +++----- open-sse/translator/response/ollama-to-openai.js | 8 +++----- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/open-sse/translator/response/commandcode-to-openai.js b/open-sse/translator/response/commandcode-to-openai.js index a11d800d..d46d177e 100644 --- a/open-sse/translator/response/commandcode-to-openai.js +++ b/open-sse/translator/response/commandcode-to-openai.js @@ -18,6 +18,7 @@ import { register } from "../index.js"; import { FORMATS } from "../formats.js"; import { buildChunk } from "../helpers/chunkBuilder.js"; +import { buildUsage } from "../helpers/usageHelper.js"; import { reasoningDelta } from "../helpers/reasoningHelper.js"; import { toOpenAIFinish } from "../concerns/finishReasonMap.js"; @@ -157,11 +158,12 @@ export function convertCommandCodeToOpenAI(chunk, state) { const finalChunk = makeChunk(state, {}, finishReason); const totalUsage = event.totalUsage || state.usage; if (totalUsage) { - finalChunk.usage = { - prompt_tokens: totalUsage.inputTokens ?? 0, - completion_tokens: totalUsage.outputTokens ?? 0, - total_tokens: totalUsage.totalTokens ?? ((totalUsage.inputTokens ?? 0) + (totalUsage.outputTokens ?? 0)), - }; + const inTok = totalUsage.inputTokens ?? 0, outTok = totalUsage.outputTokens ?? 0; + finalChunk.usage = buildUsage({ + promptTokens: inTok, + completionTokens: outTok, + totalTokens: totalUsage.totalTokens ?? (inTok + outTok), + }); } out.push(finalChunk); break; diff --git a/open-sse/translator/response/kiro-to-openai.js b/open-sse/translator/response/kiro-to-openai.js index aeac3520..bcf2be38 100644 --- a/open-sse/translator/response/kiro-to-openai.js +++ b/open-sse/translator/response/kiro-to-openai.js @@ -5,6 +5,7 @@ import { register } from "../index.js"; import { FORMATS } from "../formats.js"; import { buildChunk } from "../helpers/chunkBuilder.js"; +import { buildUsage } from "../helpers/usageHelper.js"; import { fallbackToolCallId } from "../helpers/toolCallHelper.js"; import { reasoningDelta } from "../helpers/reasoningHelper.js"; @@ -143,11 +144,8 @@ export function convertKiroToOpenAI(chunk, state) { if (eventType === "usageEvent" || data.usageEvent) { const usage = data.usageEvent || data; if (usage && typeof usage === 'object') { - state.usage = { - prompt_tokens: usage.inputTokens || 0, - completion_tokens: usage.outputTokens || 0, - total_tokens: (usage.inputTokens || 0) + (usage.outputTokens || 0) - }; + const inTok = usage.inputTokens || 0, outTok = usage.outputTokens || 0; + state.usage = buildUsage({ promptTokens: inTok, completionTokens: outTok, totalTokens: inTok + outTok }); } return null; } diff --git a/open-sse/translator/response/ollama-to-openai.js b/open-sse/translator/response/ollama-to-openai.js index 00b4dcbc..c3e3faeb 100644 --- a/open-sse/translator/response/ollama-to-openai.js +++ b/open-sse/translator/response/ollama-to-openai.js @@ -1,6 +1,7 @@ import { register } from "../index.js"; import { FORMATS } from "../formats.js"; import { buildChunk } from "../helpers/chunkBuilder.js"; +import { buildUsage } from "../helpers/usageHelper.js"; import { fallbackToolCallId } from "../helpers/toolCallHelper.js"; /** @@ -79,11 +80,8 @@ export function ollamaToOpenAI(chunk, state) { * Extract usage stats from Ollama response */ function extractUsage(ollamaChunk) { - return { - prompt_tokens: ollamaChunk.prompt_eval_count || 0, - completion_tokens: ollamaChunk.eval_count || 0, - total_tokens: (ollamaChunk.prompt_eval_count || 0) + (ollamaChunk.eval_count || 0) - }; + const inTok = ollamaChunk.prompt_eval_count || 0, outTok = ollamaChunk.eval_count || 0; + return buildUsage({ promptTokens: inTok, completionTokens: outTok, totalTokens: inTok + outTok }); } /**