package ai import ( "encoding/json" "strings" "testing" ) func TestNewSchemaBindsCodeReferenceAndOpaqueParams(t *testing.T) { task, providers := currentFixture(t, "full_ai") task = changeCurrentAgent(t, task, func(a map[string]any) { a["asr"].(map[string]any)["params"] = map[string]any{"unknown_flag": false, "nullable": nil, "opaque": "vendor-value"} a["llm"].(map[string]any)["params"] = map[string]any{"temperature": 0, "unknown_limit": json.Number("9007199254740993")} a["tts"].(map[string]any)["params"] = map[string]any{"rate": 9.5, "language": "vendor-only"} a["prompt"].(map[string]any)["text"] = strings.Repeat("长", 40000) }) b, err := Bind(task, providers) if err != nil { t.Fatal(err) } if b.ASR.Provider.Code != task.Agent.ASR.ProviderRef || b.TTS.Protocol != TTSProtocolDashScopeTask { t.Fatal("provider code or fixed WebSocket protocol lost") } if string(b.ASR.Params["unknown_flag"]) != "false" || string(b.ASR.Params["nullable"]) != "null" || string(b.LLM.Params["unknown_limit"]) != "9007199254740993" || string(b.TTS.Params["rate"]) != "9.5" { t.Fatal("opaque parameter value changed") } if len(b.Prompt) != 120000 { t.Fatal("prompt was limited or truncated") } } func TestParamsRejectOnlyMalformedShape(t *testing.T) { for _, value := range []any{nil, []any{}, map[string]any{"nested": map[string]any{}}} { task, providers := currentFixture(t, "full_ai") task = changeCurrentAgent(t, task, func(a map[string]any) { a["llm"].(map[string]any)["params"] = value }) if _, err := Bind(task, providers); err == nil { t.Fatal("invalid parameter shape accepted") } } }