mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-22 08:15:53 +00:00
fix: Gemini 适配器补全 usage 字段映射 (#1233)
* 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] <deepseek-ai@claude-code-best.win> * fix: 添加 cachedContentTokenCount 到 GeminiUsageMetadata 类型 streamAdapter.ts 使用 usage.cachedContentTokenCount 但该字段未 在 GeminiUsageMetadata 类型中声明。CodeRabbit 审查发现此问题。 Co-Authored-By: deepseek-v4-pro[1m] <deepseek-ai@claude-code-best.win> --------- Co-authored-by: deepseek-v4-pro[1m] <deepseek-ai@claude-code-best.win>
This commit is contained in:
@@ -16,6 +16,7 @@ export async function* adaptGeminiStreamToAnthropic(
|
|||||||
let finishReason: string | undefined
|
let finishReason: string | undefined
|
||||||
let inputTokens = 0
|
let inputTokens = 0
|
||||||
let outputTokens = 0
|
let outputTokens = 0
|
||||||
|
let cachedReadTokens = 0
|
||||||
|
|
||||||
for await (const chunk of stream) {
|
for await (const chunk of stream) {
|
||||||
const usage = chunk.usageMetadata
|
const usage = chunk.usageMetadata
|
||||||
@@ -23,6 +24,7 @@ export async function* adaptGeminiStreamToAnthropic(
|
|||||||
inputTokens = usage.promptTokenCount ?? inputTokens
|
inputTokens = usage.promptTokenCount ?? inputTokens
|
||||||
outputTokens =
|
outputTokens =
|
||||||
(usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0)
|
(usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0)
|
||||||
|
cachedReadTokens = usage.cachedContentTokenCount ?? cachedReadTokens
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!started) {
|
if (!started) {
|
||||||
@@ -41,7 +43,7 @@ export async function* adaptGeminiStreamToAnthropic(
|
|||||||
input_tokens: inputTokens,
|
input_tokens: inputTokens,
|
||||||
output_tokens: 0,
|
output_tokens: 0,
|
||||||
cache_creation_input_tokens: 0,
|
cache_creation_input_tokens: 0,
|
||||||
cache_read_input_tokens: 0,
|
cache_read_input_tokens: cachedReadTokens,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
} as unknown as BetaRawMessageStreamEvent
|
} as unknown as BetaRawMessageStreamEvent
|
||||||
@@ -204,7 +206,10 @@ export async function* adaptGeminiStreamToAnthropic(
|
|||||||
stop_sequence: null,
|
stop_sequence: null,
|
||||||
},
|
},
|
||||||
usage: {
|
usage: {
|
||||||
|
input_tokens: inputTokens,
|
||||||
output_tokens: outputTokens,
|
output_tokens: outputTokens,
|
||||||
|
cache_creation_input_tokens: 0,
|
||||||
|
cache_read_input_tokens: cachedReadTokens,
|
||||||
},
|
},
|
||||||
} as BetaRawMessageStreamEvent
|
} as BetaRawMessageStreamEvent
|
||||||
|
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ export type GeminiUsageMetadata = {
|
|||||||
candidatesTokenCount?: number
|
candidatesTokenCount?: number
|
||||||
thoughtsTokenCount?: number
|
thoughtsTokenCount?: number
|
||||||
totalTokenCount?: number
|
totalTokenCount?: number
|
||||||
|
cachedContentTokenCount?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export type GeminiCandidate = {
|
export type GeminiCandidate = {
|
||||||
|
|||||||
Reference in New Issue
Block a user