From 1b966dbea117db37dd3294ad094fb4c7e3b3c549 Mon Sep 17 00:00:00 2001 From: alfadb Date: Sun, 26 Jul 2026 16:53:18 +0800 Subject: [PATCH] fix: treat Kimi 1M suffix as client syntax --- backend/internal/service/billing_service.go | 6 +++--- backend/internal/service/billing_service_test.go | 12 ++++-------- backend/internal/service/thinking_protocol_test.go | 1 - 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/backend/internal/service/billing_service.go b/backend/internal/service/billing_service.go index 01f93285d7..898138e799 100644 --- a/backend/internal/service/billing_service.go +++ b/backend/internal/service/billing_service.go @@ -714,13 +714,13 @@ func (s *BillingService) getFallbackPricing(model string) *ModelPricing { // 月之暗面 Kimi(kimi-k3 / k3 / k3-256k / kimi-k2.6 / kimi-for-coding / kimi-k2.5 / kimi-k2-thinking / kimi-k2) // K2-0905 / K2-0711 官方未保留定价,不进入 fallback。 - // K3 规则置于 K2 前:API Platform 仅官方 kimi-k3 / kimi-k3[1m](及 / 路径后缀); + // K3 规则置于 K2 前:API Platform 仅官方 kimi-k3(及 / 路径后缀); // Code bare aliases 仅精确 k3 / k3-256k 或 /k3|/k3-256k 后缀,避免 kimi-k30 等未知型号误命中。 + // 注意:kimi-k3[1m] 是 Claude Code 上下文选择语法,不是 Kimi API 模型 ID,不进入 fallback。 if strings.Contains(modelLower, "kimi-for-coding") { return s.fallbackPrices["kimi-for-coding"] } - if modelLower == "kimi-k3" || modelLower == "kimi-k3[1m]" || - strings.HasSuffix(modelLower, "/kimi-k3") || strings.HasSuffix(modelLower, "/kimi-k3[1m]") || + if modelLower == "kimi-k3" || strings.HasSuffix(modelLower, "/kimi-k3") || modelLower == "k3" || modelLower == "k3-256k" || strings.HasSuffix(modelLower, "/k3") || strings.HasSuffix(modelLower, "/k3-256k") { return s.fallbackPrices["kimi-k3"] diff --git a/backend/internal/service/billing_service_test.go b/backend/internal/service/billing_service_test.go index e1f2bd7b22..5320df9f19 100644 --- a/backend/internal/service/billing_service_test.go +++ b/backend/internal/service/billing_service_test.go @@ -596,13 +596,6 @@ func TestGetFallbackPricing_FamilyMatching(t *testing.T) { expectedOutput: floatPtr(15e-6), expectedCacheRead: floatPtr(0.30e-6), }, - { - name: "kimi k3 anthropic 1m suffix", - model: "kimi-k3[1m]", - expectedInput: 3e-6, - expectedOutput: floatPtr(15e-6), - expectedCacheRead: floatPtr(0.30e-6), - }, { name: "kimi code bare alias k3", model: "k3", @@ -619,7 +612,7 @@ func TestGetFallbackPricing_FamilyMatching(t *testing.T) { }, { name: "kimi k3 path suffix moonshot", - model: "moonshot/kimi-k3[1m]", + model: "moonshot/kimi-k3", expectedInput: 3e-6, expectedOutput: floatPtr(15e-6), expectedCacheRead: floatPtr(0.30e-6), @@ -753,6 +746,9 @@ func TestGetFallbackPricing_FamilyMatching(t *testing.T) { // kimi-k3 非 Contains:kimi-k30 / 内嵌 foo-kimi-k3-bar 不得误命中。 {name: "kimi-k30 unknown no fallback", model: "kimi-k30", expectNilPricing: true}, {name: "embedded kimi-k3 unknown no fallback", model: "foo-kimi-k3-bar", expectNilPricing: true}, + // kimi-k3[1m] 是 Claude Code 上下文选择语法,不是 Kimi API 模型 ID,不命中 fallback。 + {name: "kimi-k3[1m] not an API model id no fallback", model: "kimi-k3[1m]", expectNilPricing: true}, + {name: "path kimi-k3[1m] not an API model id no fallback", model: "moonshot/kimi-k3[1m]", expectNilPricing: true}, // kimi-k2-0905 / kimi-k2-0711 官方未公布独立价,走 kimi-k2 隐性回退(接受)—— // 如未来官方公布独立价,需在 getFallbackPricing 加显式分支。 { diff --git a/backend/internal/service/thinking_protocol_test.go b/backend/internal/service/thinking_protocol_test.go index e16cfdec58..c3c209ed5e 100644 --- a/backend/internal/service/thinking_protocol_test.go +++ b/backend/internal/service/thinking_protocol_test.go @@ -23,7 +23,6 @@ func TestResolveThinkingProtocol(t *testing.T) { {"kimi-coding", "kimi-coding-v2", ThinkingProtocolPassbackRequired}, {"kimi-k2-thinking", "kimi-k2-thinking", ThinkingProtocolPassbackRequired}, {"kimi-k3 platform", "kimi-k3", ThinkingProtocolPassbackRequired}, - {"kimi-k3 anthropic 1m", "kimi-k3[1m]", ThinkingProtocolPassbackRequired}, {"kimi code bare k3", "k3", ThinkingProtocolPassbackRequired}, {"kimi code bare k3-256k", "k3-256k", ThinkingProtocolPassbackRequired}, {"moonshot-v1", "moonshot-v1-32k", ThinkingProtocolPassbackRequired},