From 946c12b4d35dfc77f135057486e818394c6edc12 Mon Sep 17 00:00:00 2001 From: AmosLeeeeeeee Date: Tue, 12 May 2026 15:00:47 +0800 Subject: [PATCH] fix: include reasoning tokens in cost calc; auto-detect CNY on zh-Hans locale --- crates/tui/src/commands/debug.rs | 1 + crates/tui/src/pricing.rs | 4 +++- crates/tui/src/tui/app.rs | 6 ++++-- crates/tui/src/tui/ui/tests.rs | 6 +++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/crates/tui/src/commands/debug.rs b/crates/tui/src/commands/debug.rs index 1138a25d..373c927f 100644 --- a/crates/tui/src/commands/debug.rs +++ b/crates/tui/src/commands/debug.rs @@ -450,6 +450,7 @@ mod tests { }; let mut app = App::new(options, &Config::default()); app.ui_locale = crate::localization::Locale::En; + app.cost_currency = crate::pricing::CostCurrency::Usd; app.api_provider = crate::config::ApiProvider::Deepseek; app } diff --git a/crates/tui/src/pricing.rs b/crates/tui/src/pricing.rs index 74887a1c..750f9830 100644 --- a/crates/tui/src/pricing.rs +++ b/crates/tui/src/pricing.rs @@ -195,7 +195,9 @@ fn calculate_turn_cost_from_usage_with_pricing(pricing: CurrencyPricing, usage: let hit_cost = (hit_tokens as f64 / 1_000_000.0) * pricing.input_cache_hit_per_million; let miss_cost = ((miss_tokens.saturating_add(uncategorized_input)) as f64 / 1_000_000.0) * pricing.input_cache_miss_per_million; - let output_cost = (usage.output_tokens as f64 / 1_000_000.0) * pricing.output_per_million; + let reasoning = usage.reasoning_tokens.unwrap_or(0); + let effective_output = usage.output_tokens.saturating_add(reasoning); + let output_cost = (effective_output as f64 / 1_000_000.0) * pricing.output_per_million; hit_cost + miss_cost + output_cost } diff --git a/crates/tui/src/tui/app.rs b/crates/tui/src/tui/app.rs index ed47ba03..23de94ce 100644 --- a/crates/tui/src/tui/app.rs +++ b/crates/tui/src/tui/app.rs @@ -1245,8 +1245,10 @@ impl App { let show_thinking = settings.show_thinking; let show_tool_details = settings.show_tool_details; let ui_locale = resolve_locale(&settings.locale); - let cost_currency = - CostCurrency::from_setting(&settings.cost_currency).unwrap_or(CostCurrency::Usd); + let cost_currency = match (settings.cost_currency.as_str(), ui_locale.tag()) { + ("usd", "zh-Hans") => CostCurrency::Cny, + _ => CostCurrency::from_setting(&settings.cost_currency).unwrap_or(CostCurrency::Usd), + }; let composer_density = ComposerDensity::from_setting(&settings.composer_density); let composer_border = settings.composer_border; let composer_vim_enabled = settings diff --git a/crates/tui/src/tui/ui/tests.rs b/crates/tui/src/tui/ui/tests.rs index 628bffba..a1a13b8d 100644 --- a/crates/tui/src/tui/ui/tests.rs +++ b/crates/tui/src/tui/ui/tests.rs @@ -1059,7 +1059,11 @@ fn create_test_app() -> App { resume_session_id: None, initial_input: None, }; - App::new(options, &Config::default()) + let mut app = App::new(options, &Config::default()); + // Pin locale and currency for deterministic tests regardless of host locale. + app.cost_currency = crate::pricing::CostCurrency::Usd; + app.ui_locale = crate::localization::Locale::En; + app } fn create_test_options() -> TuiOptions {