From ecd3f9d7918b74085a0e18c78e0ac6cfe1c033fa Mon Sep 17 00:00:00 2001 From: Cepvor <154242055+Evsdrg@users.noreply.github.com> Date: Sun, 17 May 2026 07:28:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Gemini=20=E9=80=82=E9=85=8D=E5=99=A8?= =?UTF-8?q?=E8=A1=A5=E5=85=A8=20usage=20=E5=AD=97=E6=AE=B5=E6=98=A0?= =?UTF-8?q?=E5=B0=84=20(#1233)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: Gemini 适配器补全 usage 字段映射 Gemini API 的 usageMetadata 包含 cachedContentTokenCount 字段, 但此前未映射到 Anthropic 格式的 cache_read_input_tokens,导致 cache_creation_input_tokens 和 cache_read_input_tokens 始终为 0。 同时 message_delta 事件此前只携带 output_tokens,缺失 input_tokens、cache_creation_input_tokens、cache_read_input_tokens, 导致下游从 message_delta 读取最终 token 计数时获取不完整数据。 修复: - 新增 cachedContentTokenCount → cache_read_input_tokens 映射 - message_start 和 message_delta 携带完整四个 usage 字段 - cache_creation_input_tokens 保持为 0(Gemini API 无等价概念) Co-Authored-By: deepseek-v4-pro[1m] * fix: 添加 cachedContentTokenCount 到 GeminiUsageMetadata 类型 streamAdapter.ts 使用 usage.cachedContentTokenCount 但该字段未 在 GeminiUsageMetadata 类型中声明。CodeRabbit 审查发现此问题。 Co-Authored-By: deepseek-v4-pro[1m] --------- Co-authored-by: deepseek-v4-pro[1m] --- .../model-provider/src/providers/gemini/streamAdapter.ts | 7 ++++++- packages/@ant/model-provider/src/providers/gemini/types.ts | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/@ant/model-provider/src/providers/gemini/streamAdapter.ts b/packages/@ant/model-provider/src/providers/gemini/streamAdapter.ts index 9095b6da0..1ea3d6c62 100644 --- a/packages/@ant/model-provider/src/providers/gemini/streamAdapter.ts +++ b/packages/@ant/model-provider/src/providers/gemini/streamAdapter.ts @@ -16,6 +16,7 @@ export async function* adaptGeminiStreamToAnthropic( let finishReason: string | undefined let inputTokens = 0 let outputTokens = 0 + let cachedReadTokens = 0 for await (const chunk of stream) { const usage = chunk.usageMetadata @@ -23,6 +24,7 @@ export async function* adaptGeminiStreamToAnthropic( inputTokens = usage.promptTokenCount ?? inputTokens outputTokens = (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0) + cachedReadTokens = usage.cachedContentTokenCount ?? cachedReadTokens } if (!started) { @@ -41,7 +43,7 @@ export async function* adaptGeminiStreamToAnthropic( input_tokens: inputTokens, output_tokens: 0, cache_creation_input_tokens: 0, - cache_read_input_tokens: 0, + cache_read_input_tokens: cachedReadTokens, }, }, } as unknown as BetaRawMessageStreamEvent @@ -204,7 +206,10 @@ export async function* adaptGeminiStreamToAnthropic( stop_sequence: null, }, usage: { + input_tokens: inputTokens, output_tokens: outputTokens, + cache_creation_input_tokens: 0, + cache_read_input_tokens: cachedReadTokens, }, } as BetaRawMessageStreamEvent diff --git a/packages/@ant/model-provider/src/providers/gemini/types.ts b/packages/@ant/model-provider/src/providers/gemini/types.ts index e8718fecd..a970ec654 100644 --- a/packages/@ant/model-provider/src/providers/gemini/types.ts +++ b/packages/@ant/model-provider/src/providers/gemini/types.ts @@ -68,6 +68,7 @@ export type GeminiUsageMetadata = { candidatesTokenCount?: number thoughtsTokenCount?: number totalTokenCount?: number + cachedContentTokenCount?: number } export type GeminiCandidate = {