From 7c43b7327d9b35db8b5a1865a07a7f1c23bf9d4b Mon Sep 17 00:00:00 2001 From: haruka <1628615876@qq.com> Date: Wed, 15 Jul 2026 09:24:44 -0700 Subject: [PATCH] =?UTF-8?q?feat(billing):=20=E8=A7=A3=E6=9E=90=20usage.inp?= =?UTF-8?q?ut=5Ftokens=5Fdetails=20=E6=8B=86=E5=88=86=E5=9B=BE/=E6=96=87?= =?UTF-8?q?=E8=BE=93=E5=85=A5=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /v1/images/edits 等带图请求,上游在 input_tokens_details.image_tokens 单独回传图片输入 token,此前被合并进 input_tokens 整体按文本输入价计费。 - openAIUsageFromGJSON 读取 input_tokens_details.image_tokens (回退 prompt_tokens_details.image_tokens)写入 OpenAIUsage.ImageInputTokens - mergeOpenAIUsage 补充 ImageInputTokens 的流式合并 配合全局定价的 input_cost_per_image_token,gpt-image-2 图片编辑请求的 图像输入即按独立单价计费。相关 #4386。 Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_015wcJTKDddxXSQrepSs3wrU --- .../internal/service/openai_gateway_response_handling.go | 8 ++++++++ backend/internal/service/openai_images.go | 3 +++ 2 files changed, 11 insertions(+) diff --git a/backend/internal/service/openai_gateway_response_handling.go b/backend/internal/service/openai_gateway_response_handling.go index 436e43116..8857bdd52 100644 --- a/backend/internal/service/openai_gateway_response_handling.go +++ b/backend/internal/service/openai_gateway_response_handling.go @@ -1015,8 +1015,16 @@ func openAIUsageFromGJSON(value gjson.Result) (OpenAIUsage, bool) { if imageOutputTokens == 0 { imageOutputTokens = value.Get("completion_tokens_details.image_tokens").Int() } + // 图片输入 token(如 gpt-image-2 的 /v1/images/edits 带图请求), + // 上游在 input_tokens_details.image_tokens 单独回传,用于图/文输入分价计费。 + // 普通文本请求该字段为 0,走原路径行为不变。 + imageInputTokens := firstPositiveGJSONInt( + value.Get("input_tokens_details.image_tokens"), + value.Get("prompt_tokens_details.image_tokens"), + ) return OpenAIUsage{ InputTokens: int(inputTokens), + ImageInputTokens: imageInputTokens, OutputTokens: int(outputTokens), CacheCreationInputTokens: cacheCreationTokens, CacheReadInputTokens: cacheReadTokens, diff --git a/backend/internal/service/openai_images.go b/backend/internal/service/openai_images.go index 081b5e741..0772830c4 100644 --- a/backend/internal/service/openai_images.go +++ b/backend/internal/service/openai_images.go @@ -1146,6 +1146,9 @@ func mergeOpenAIUsage(dst *OpenAIUsage, body []byte) { if parsed.CacheReadInputTokens > 0 { dst.CacheReadInputTokens = parsed.CacheReadInputTokens } + if parsed.ImageInputTokens > 0 { + dst.ImageInputTokens = parsed.ImageInputTokens + } if parsed.ImageOutputTokens > 0 { dst.ImageOutputTokens = parsed.ImageOutputTokens }