返回 DeepSeek-Reasonix
effort_override_test.go
根目录 / internal / provider / openai / effort_override_test.go
1 package openai
2
3 import (
4 "context"
5 "errors"
6 "testing"
7
8 "reasonix/internal/provider"
9 )
10
11 func newTestClient(t *testing.T, model string, extra map[string]any) *client {
12 t.Helper()
13 cfg := provider.Config{Name: "p", BaseURL: "https://api.deepseek.com", Model: model, APIKey: "k", Extra: extra}
14 p, err := New(cfg)
15 if err != nil {
16 t.Fatalf("New: %v", err)
17 }
18 return p.(*client)
19 }
20
21 func TestEffortOverrideDeepSeekFlash(t *testing.T) {
22 c := newTestClient(t, "deepseek-v4-flash", map[string]any{"reasoning_protocol": "deepseek"})
23 if got := c.buildRequest(provider.Request{}).ReasoningEffort; got != "high" {
24 t.Fatalf("default reasoning_effort = %q, want high", got)
25 }
26 if got := c.buildRequest(provider.Request{EffortOverride: "low"}).ReasoningEffort; got != "low" {
27 t.Fatalf("override low: reasoning_effort = %q, want low", got)
28 }
29 assertRejectedEffort(t, c, "medium")
30 request := c.buildRequest(provider.Request{EffortOverride: "disabled"})
31 if request.ReasoningEffort != "" || request.Thinking == nil || request.Thinking.Type != "disabled" {
32 t.Fatalf("disabled override = thinking:%#v effort:%q, want thinking disabled and no effort", request.Thinking, request.ReasoningEffort)
33 }
34 }
35
36 func TestEffortOverrideDeepSeekNonFlashRejectsLow(t *testing.T) {
37 c := newTestClient(t, "deepseek-v4", map[string]any{"reasoning_protocol": "deepseek"})
38 assertRejectedEffort(t, c, "low")
39 if got := c.buildRequest(provider.Request{EffortOverride: "max"}).ReasoningEffort; got != "max" {
40 t.Fatalf("max is in the official DeepSeek vocabulary, got %q", got)
41 }
42 }
43
44 func TestEffortOverrideDeepSeekProSupportsLow(t *testing.T) {
45 c := newTestClient(t, "deepseek-v4-pro", map[string]any{"reasoning_protocol": "deepseek"})
46 if got := c.buildRequest(provider.Request{EffortOverride: "low"}).ReasoningEffort; got != "low" {
47 t.Fatalf("Pro low reasoning_effort = %q, want low", got)
48 }
49 }
50
51 func TestEffortOverrideHonorsSupportedEfforts(t *testing.T) {
52 c := newTestClient(t, "deepseek-v4", map[string]any{
53 "reasoning_protocol": "deepseek",
54 "effort": "high",
55 "supported_efforts": []string{"low", "high", "disabled"},
56 })
57 if got := c.buildRequest(provider.Request{EffortOverride: "low"}).ReasoningEffort; got != "low" {
58 t.Fatalf("declared vocabulary must admit low, got %q", got)
59 }
60 assertRejectedEffort(t, c, "max")
61 request := c.buildRequest(provider.Request{EffortOverride: "disabled"})
62 if request.ReasoningEffort != "" || request.Thinking == nil || request.Thinking.Type != "disabled" {
63 t.Fatalf("disabled override = thinking:%#v effort:%q, want thinking disabled and no effort", request.Thinking, request.ReasoningEffort)
64 }
65 }
66
67 func assertRejectedEffort(t *testing.T, c *client, id string) {
68 t.Helper()
69 _, err := c.Stream(context.Background(), provider.Request{EffortOverride: id})
70 var unsupported *provider.UnsupportedReasoningEffort
71 if !errors.As(err, &unsupported) {
72 t.Fatalf("expected rejection before I/O for %q, got %v", id, err)
73 }
74 }
75 func TestEffortOverrideRejectedByBinaryThinkingKnobs(t *testing.T) {
76 for _, url := range []string{"https://api.minimaxi.com/v1", "https://open.bigmodel.cn/api/paas/v4", "https://api.longcat.chat/v1"} {
77 p, err := New(provider.Config{Name: "test", BaseURL: url, Model: "model"})
78 if err != nil {
79 t.Fatal(err)
80 }
81 c := p.(*client)
82 assertRejectedEffort(t, c, "low")
83 out := c.buildRequest(provider.Request{EffortOverride: "disabled"})
84 if out.Thinking == nil || out.Thinking.Type != "disabled" || out.ReasoningEffort != "" {
85 t.Fatalf("disabled wire: %+v", out)
86 }
87 }
88 }
89 func TestEffortOverrideRejectedWithoutDepthVocabulary(t *testing.T) {
90 c := &client{model: "unknown"}
91 assertRejectedEffort(t, c, "low")
92 disabled := newTestClient(t, "deepseek-v4", map[string]any{"reasoning_protocol": "deepseek", "thinking": "disabled"})
93 assertRejectedEffort(t, disabled, "high")
94 }
95
95 lines GO