From ef5ad0fb10ce3d058cbf94436173b3438b69e4b2 Mon Sep 17 00:00:00 2001 From: erio Date: Tue, 26 May 2026 13:47:31 +0800 Subject: [PATCH 1/2] fix(frontend): display image_output_tokens breakdown in usage pages When image generation models are billed by token (channel pricing mode=token), the usage pages previously showed only image count format instead of detailed token breakdown. This fixes the display to properly show image output tokens separately from text output tokens. --- backend/internal/handler/dto/mappers.go | 2 + backend/internal/handler/dto/types.go | 2 + .../src/components/admin/usage/UsageTable.vue | 75 ++++++++----- frontend/src/i18n/locales/en.ts | 3 + frontend/src/i18n/locales/zh.ts | 3 + frontend/src/types/index.ts | 5 + frontend/src/utils/billingMode.ts | 21 ++++ frontend/src/utils/imageUsage.ts | 22 ++++ frontend/src/views/user/UsageView.vue | 106 ++++++++++++------ 9 files changed, 175 insertions(+), 64 deletions(-) diff --git a/backend/internal/handler/dto/mappers.go b/backend/internal/handler/dto/mappers.go index 51a11ea7782..c4d05b60981 100644 --- a/backend/internal/handler/dto/mappers.go +++ b/backend/internal/handler/dto/mappers.go @@ -609,6 +609,8 @@ func usageLogFromServiceUser(l *service.UsageLog) UsageLog { ImageSize: l.ImageSize, ImageInputSize: l.ImageInputSize, ImageOutputSize: l.ImageOutputSize, + ImageOutputTokens: l.ImageOutputTokens, + ImageOutputCost: l.ImageOutputCost, ImageSizeSource: l.ImageSizeSource, ImageSizeBreakdown: l.ImageSizeBreakdown, MediaType: l.MediaType, diff --git a/backend/internal/handler/dto/types.go b/backend/internal/handler/dto/types.go index b1841c622eb..92d0e7dcd5e 100644 --- a/backend/internal/handler/dto/types.go +++ b/backend/internal/handler/dto/types.go @@ -464,6 +464,8 @@ type UsageLog struct { ImageSize *string `json:"image_size"` ImageInputSize *string `json:"image_input_size"` ImageOutputSize *string `json:"image_output_size"` + ImageOutputTokens int `json:"image_output_tokens"` + ImageOutputCost float64 `json:"image_output_cost"` ImageSizeSource *string `json:"image_size_source"` ImageSizeBreakdown map[string]int `json:"image_size_breakdown"` MediaType *string `json:"media_type"` diff --git a/frontend/src/components/admin/usage/UsageTable.vue b/frontend/src/components/admin/usage/UsageTable.vue index 65ac1548f9f..af9ab466b68 100644 --- a/frontend/src/components/admin/usage/UsageTable.vue +++ b/frontend/src/components/admin/usage/UsageTable.vue @@ -125,6 +125,12 @@ R +
+
+ + {{ row.image_output_tokens.toLocaleString() }} +
+
{{ t('admin.usage.inputTokens') }} {{ tokenTooltipData.input_tokens.toLocaleString() }}
-
+
{{ t('admin.usage.outputTokens') }} {{ tokenTooltipData.output_tokens.toLocaleString() }}
+
+ {{ t('admin.usage.outputTokens') }} + {{ textOutputTokens(tokenTooltipData).toLocaleString() }} +
+
+ {{ t('usage.imageOutputTokens') }} + {{ tokenTooltipData.image_output_tokens.toLocaleString() }} +