fix(api): 补全模型能力继承与响应推导
- 合并 base model 默认能力与平台覆盖项 - 在模型响应中补齐 text_generate 的上下文与推理能力字段 - 为相关逻辑补充测试和迁移脚本
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"slices"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestEffectivePlatformModelCapabilitiesDeepMergesNestedObjects(t *testing.T) {
|
||||
baseLevels := []any{"none", "minimal", "low"}
|
||||
baseTextGenerate := map[string]any{
|
||||
"max_context_tokens": 204800,
|
||||
"supportThinking": true,
|
||||
"thinkingEffortLevels": baseLevels,
|
||||
}
|
||||
overrideTextGenerate := map[string]any{
|
||||
"max_thinking_tokens": 131072,
|
||||
"supportThinking": false,
|
||||
"supportThinkingModeSwitch": true,
|
||||
}
|
||||
|
||||
capabilities := EffectivePlatformModelCapabilities(
|
||||
map[string]any{
|
||||
"originalTypes": []any{"text_generate"},
|
||||
"text_generate": baseTextGenerate,
|
||||
},
|
||||
map[string]any{
|
||||
"text_generate": overrideTextGenerate,
|
||||
},
|
||||
)
|
||||
|
||||
textGenerate, ok := capabilities["text_generate"].(map[string]any)
|
||||
if !ok {
|
||||
t.Fatalf("expected text_generate capabilities object, got %#v", capabilities["text_generate"])
|
||||
}
|
||||
if textGenerate["max_context_tokens"] != 204800 {
|
||||
t.Fatalf("expected base max_context_tokens to be preserved, got %#v", textGenerate["max_context_tokens"])
|
||||
}
|
||||
if textGenerate["max_thinking_tokens"] != 131072 {
|
||||
t.Fatalf("expected override max_thinking_tokens to be applied, got %#v", textGenerate["max_thinking_tokens"])
|
||||
}
|
||||
if textGenerate["supportThinking"] != false {
|
||||
t.Fatalf("expected override supportThinking false to win, got %#v", textGenerate["supportThinking"])
|
||||
}
|
||||
if textGenerate["supportThinkingModeSwitch"] != true {
|
||||
t.Fatalf("expected override supportThinkingModeSwitch true, got %#v", textGenerate["supportThinkingModeSwitch"])
|
||||
}
|
||||
assertAnyStringList(t, textGenerate["thinkingEffortLevels"], []string{"none", "minimal", "low"})
|
||||
|
||||
baseTextGenerate["max_context_tokens"] = 1
|
||||
overrideTextGenerate["max_thinking_tokens"] = 2
|
||||
baseLevels[0] = "changed"
|
||||
|
||||
if textGenerate["max_context_tokens"] != 204800 {
|
||||
t.Fatalf("expected merged capabilities to be detached from base mutations, got %#v", textGenerate["max_context_tokens"])
|
||||
}
|
||||
if textGenerate["max_thinking_tokens"] != 131072 {
|
||||
t.Fatalf("expected merged capabilities to be detached from override mutations, got %#v", textGenerate["max_thinking_tokens"])
|
||||
}
|
||||
assertAnyStringList(t, textGenerate["thinkingEffortLevels"], []string{"none", "minimal", "low"})
|
||||
}
|
||||
|
||||
func assertAnyStringList(t *testing.T, got any, want []string) {
|
||||
t.Helper()
|
||||
items, ok := got.([]any)
|
||||
if !ok {
|
||||
t.Fatalf("expected string list %v, got %#v", want, got)
|
||||
}
|
||||
normalized := make([]string, 0, len(items))
|
||||
for _, item := range items {
|
||||
text, ok := item.(string)
|
||||
if !ok {
|
||||
t.Fatalf("expected string list %v, got non-string item %#v in %#v", want, item, got)
|
||||
}
|
||||
normalized = append(normalized, text)
|
||||
}
|
||||
if !slices.Equal(normalized, want) {
|
||||
t.Fatalf("expected string list %v, got %v", want, normalized)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user