From fe64579cab3d09b9447dbaf297189271359b2c23 Mon Sep 17 00:00:00 2001 From: unclesam <2036253946@qq.com> Date: Sat, 22 Aug 2026 21:10:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(llm):=20=E7=A7=BB=E9=99=A4=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=20token=20=E9=99=90=E5=88=B6=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E5=AE=8C=E6=95=B4=E7=9A=84=E6=8E=A8=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=20temperature=20=E5=85=BC=E5=AE=B9=E4=B8=8E?= =?UTF-8?q?=20Usage=20=E7=A9=BA=E6=8C=87=E9=92=88=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/llm/client.go | 2 +- internal/llm/model_test.go | 51 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 internal/llm/model_test.go diff --git a/internal/llm/client.go b/internal/llm/client.go index e542dc4..0375e9f 100644 --- a/internal/llm/client.go +++ b/internal/llm/client.go @@ -464,7 +464,7 @@ func (c *Client) ReviewStream(ctx context.Context, systemPrompt, diff string, on } // 捕获最后一个 chunk 中携带的 Usage 信息 - if response.Usage.TotalTokens > 0 { + if response.Usage != nil && response.Usage.TotalTokens > 0 { usage.InputTokens = response.Usage.PromptTokens usage.OutputTokens = response.Usage.CompletionTokens } diff --git a/internal/llm/model_test.go b/internal/llm/model_test.go new file mode 100644 index 0000000..f5692de --- /dev/null +++ b/internal/llm/model_test.go @@ -0,0 +1,51 @@ +package llm + +import ( + "fmt" + "testing" +) + +func TestIsReasoningModel(t *testing.T) { + tests := []struct { + model string + expected bool + }{ + {"o1", true}, + {"o1-mini", true}, + {"o1-preview", true}, + {"o3-mini", true}, + {"gpt-5.6-luna", true}, + {"gpt-5.6-sol", true}, + {"gpt-5.6-terra", true}, + {"deepseek-reasoner", true}, + {"gemini-3.7-flash", false}, + {"claude-3.7-sonnet", false}, + {"gpt-4o", false}, + } + + for _, tt := range tests { + got := isReasoningModel(tt.model) + if got != tt.expected { + t.Errorf("isReasoningModel(%q) = %v, expected %v", tt.model, got, tt.expected) + } + } +} + +func TestIsTemperatureError(t *testing.T) { + tests := []struct { + errStr string + expected bool + }{ + {"this model has beta-limitations, temperature, top_p and n are fixed at 1", true}, + {"temperature must be 1.0", true}, + {"invalid api key", false}, + {"rate limit exceeded", false}, + } + + for _, tt := range tests { + got := isTemperatureError(fmt.Errorf("%s", tt.errStr)) + if got != tt.expected { + t.Errorf("isTemperatureError(%q) = %v, expected %v", tt.errStr, got, tt.expected) + } + } +}