Skip to content

Commit 20b8969

Browse files
authored
fix(doubao): set reasoning_effort field in doubao reasoning conversion (#616)
* fix(doubao): set reasoning_effort field in doubao reasoning conversion Previously, ApplyReasoningToDoubaoNode/Request only set the thinking field when applying reasoning config. Now they also set the reasoning_effort field mapped to doubao-specific values (minimal/low/medium/high), consistent with how other providers handle reasoning effort. Updated corresponding tests to verify reasoning_effort is correctly set. * fix(lint): fix golines and wsl_v5 issues in reasoning.go
1 parent 882a59c commit 20b8969

2 files changed

Lines changed: 94 additions & 14 deletions

File tree

core/relay/adaptor/doubao/main_test.go

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2239,16 +2239,20 @@ func TestAdaptorConvertRequestGeminiReasoning(t *testing.T) {
22392239
t.Fatalf("failed to unmarshal converted body: %v", err)
22402240
}
22412241

2242+
if openAIReq.ReasoningEffort == nil {
2243+
t.Fatal("expected reasoning_effort to be set")
2244+
}
2245+
2246+
if *openAIReq.ReasoningEffort != "low" {
2247+
t.Fatalf("expected reasoning_effort=low, got %s", *openAIReq.ReasoningEffort)
2248+
}
2249+
22422250
if openAIReq.Thinking == nil {
22432251
t.Fatal("expected thinking to be set")
22442252
}
22452253

22462254
if openAIReq.Thinking.Type != relaymodel.ClaudeThinkingTypeEnabled {
2247-
t.Fatalf("expected thinking.type enabled, got %s", openAIReq.Thinking.Type)
2248-
}
2249-
2250-
if openAIReq.ReasoningEffort != nil {
2251-
t.Fatal("expected reasoning_effort to be removed")
2255+
t.Fatalf("expected thinking.type=enabled, got %s", openAIReq.Thinking.Type)
22522256
}
22532257
}
22542258

@@ -2290,12 +2294,20 @@ func TestAdaptorConvertRequestChatReasoning(t *testing.T) {
22902294
t.Fatalf("failed to unmarshal converted body: %v", err)
22912295
}
22922296

2297+
if openAIReq.ReasoningEffort == nil {
2298+
t.Fatal("expected reasoning_effort to be set")
2299+
}
2300+
2301+
if *openAIReq.ReasoningEffort != "high" {
2302+
t.Fatalf("expected reasoning_effort=high, got %s", *openAIReq.ReasoningEffort)
2303+
}
2304+
22932305
if openAIReq.Thinking == nil {
22942306
t.Fatal("expected thinking to be set")
22952307
}
22962308

22972309
if openAIReq.Thinking.Type != relaymodel.ClaudeThinkingTypeEnabled {
2298-
t.Fatalf("expected thinking.type enabled, got %s", openAIReq.Thinking.Type)
2310+
t.Fatalf("expected thinking.type=enabled, got %s", openAIReq.Thinking.Type)
22992311
}
23002312
}
23012313

@@ -2337,12 +2349,20 @@ func TestAdaptorConvertRequestChatReasoningDisabled(t *testing.T) {
23372349
t.Fatalf("failed to unmarshal converted body: %v", err)
23382350
}
23392351

2352+
if openAIReq.ReasoningEffort == nil {
2353+
t.Fatal("expected reasoning_effort to be set")
2354+
}
2355+
2356+
if *openAIReq.ReasoningEffort != "minimal" {
2357+
t.Fatalf("expected reasoning_effort=minimal, got %s", *openAIReq.ReasoningEffort)
2358+
}
2359+
23402360
if openAIReq.Thinking == nil {
23412361
t.Fatal("expected thinking to be set")
23422362
}
23432363

23442364
if openAIReq.Thinking.Type != relaymodel.ClaudeThinkingTypeDisabled {
2345-
t.Fatalf("expected thinking.type disabled, got %s", openAIReq.Thinking.Type)
2365+
t.Fatalf("expected thinking.type=disabled, got %s", openAIReq.Thinking.Type)
23462366
}
23472367
}
23482368

@@ -2478,15 +2498,19 @@ func TestAdaptorConvertRequestAnthropicReasoning(t *testing.T) {
24782498
t.Fatalf("failed to unmarshal converted body: %v", err)
24792499
}
24802500

2501+
if openAIReq.ReasoningEffort == nil {
2502+
t.Fatal("expected reasoning_effort to be set")
2503+
}
2504+
2505+
if *openAIReq.ReasoningEffort != "low" {
2506+
t.Fatalf("expected reasoning_effort=low, got %s", *openAIReq.ReasoningEffort)
2507+
}
2508+
24812509
if openAIReq.Thinking == nil {
24822510
t.Fatal("expected thinking to be set")
24832511
}
24842512

24852513
if openAIReq.Thinking.Type != relaymodel.ClaudeThinkingTypeEnabled {
2486-
t.Fatalf("expected thinking.type enabled, got %s", openAIReq.Thinking.Type)
2487-
}
2488-
2489-
if openAIReq.ReasoningEffort != nil {
2490-
t.Fatal("expected reasoning_effort to be removed")
2514+
t.Fatalf("expected thinking.type=enabled, got %s", openAIReq.Thinking.Type)
24912515
}
24922516
}

core/relay/utils/reasoning.go

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,14 +449,70 @@ func ApplyReasoningToDoubaoNode(
449449
node *ast.Node,
450450
reasoning relaymodel.NormalizedReasoning,
451451
) error {
452-
return applyReasoningToThinkingNode(node, reasoning)
452+
if node == nil || !reasoning.Specified {
453+
return nil
454+
}
455+
456+
effort := doubaoReasoningEffort(reasoning)
457+
if effort == "" {
458+
return nil
459+
}
460+
461+
thinkingType := relaymodel.ClaudeThinkingTypeEnabled
462+
if reasoning.Disabled || effort == "minimal" {
463+
thinkingType = relaymodel.ClaudeThinkingTypeDisabled
464+
}
465+
466+
_, _ = node.Unset("thinking")
467+
468+
if _, err := node.SetAny(
469+
"thinking",
470+
relaymodel.ClaudeThinking{Type: thinkingType},
471+
); err != nil {
472+
return err
473+
}
474+
475+
_, err := node.Set("reasoning_effort", ast.NewString(effort))
476+
477+
return err
453478
}
454479

455480
func ApplyReasoningToDoubaoRequest(
456481
req *relaymodel.GeneralOpenAIRequest,
457482
reasoning relaymodel.NormalizedReasoning,
458483
) {
459-
applyReasoningToThinkingRequest(req, reasoning)
484+
if req == nil || !reasoning.Specified {
485+
return
486+
}
487+
488+
effort := doubaoReasoningEffort(reasoning)
489+
if effort == "" {
490+
return
491+
}
492+
493+
thinkingType := relaymodel.ClaudeThinkingTypeEnabled
494+
if reasoning.Disabled || effort == "minimal" {
495+
thinkingType = relaymodel.ClaudeThinkingTypeDisabled
496+
}
497+
498+
req.Thinking = &relaymodel.GeneralThinking{Type: thinkingType}
499+
req.ReasoningEffort = &effort
500+
}
501+
502+
func doubaoReasoningEffort(reasoning relaymodel.NormalizedReasoning) string {
503+
effort := ReasoningToOpenAIEffort(reasoning)
504+
switch effort {
505+
case relaymodel.ReasoningEffortNone, relaymodel.ReasoningEffortMinimal:
506+
return "minimal"
507+
case relaymodel.ReasoningEffortLow:
508+
return "low"
509+
case relaymodel.ReasoningEffortMedium:
510+
return "medium"
511+
case relaymodel.ReasoningEffortHigh, relaymodel.ReasoningEffortXHigh:
512+
return "high"
513+
default:
514+
return ""
515+
}
460516
}
461517

462518
func applyReasoningToThinkingNode(

0 commit comments

Comments
 (0)