package aiprovider import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "time" ) func TestAgentRouterUsesChatCompletionsContract(t *testing.T) { var received map[string]any server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/v1/chat/completions" { t.Fatalf("path = %q", r.URL.Path) } if r.Header.Get("Authorization") != "Bearer test-key" { t.Fatal("authorization header missing") } if r.Header.Get("User-Agent") != agentRouterUserAgent { t.Fatalf("user-agent = %q", r.Header.Get("User-Agent")) } if err := json.NewDecoder(r.Body).Decode(&received); err != nil { t.Fatal(err) } w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte(`{"id":"chat-1","choices":[{"finish_reason":"stop","message":{"role":"assistant","content":"{\"answer\":\"ok\"}"}}],"usage":{"prompt_tokens":12,"completion_tokens":4}}`)) })) defer server.Close() client := NewAgentRouter(Config{BaseURL: server.URL, APIKey: "test-key", Model: "gpt-test", Timeout: time.Second}, server.Client()) var generator Generator = client result, usage, err := generator.Generate(context.Background(), Request{ SchemaName: "answer", Schema: map[string]any{"type": "object", "additionalProperties": false}, Instructions: "system rules", Input: json.RawMessage(`{"safe":"aggregate"}`), MaxOutputTokens: 200, }) if err != nil { t.Fatal(err) } if string(result) != `{"answer":"ok"}` || usage.ProviderRequestID != "chat-1" || usage.InputTokens != 12 || usage.OutputTokens != 4 { t.Fatalf("result=%s usage=%+v", result, usage) } if received["model"] != "gpt-test" || received["reasoning_effort"] != "medium" || received["parallel_tool_calls"] != false || received["max_tokens"] != float64(200) { t.Fatalf("request controls = %#v", received) } format := received["response_format"].(map[string]any) if format["type"] != "json_schema" { t.Fatalf("response_format = %#v", format) } }