package llmruntime import ( "context" "encoding/json" "net/http" "net/http/httptest" "strings" "testing" "time" ) func TestOpenAICompatibleClient_ForwardsTemperatureAndMaxTokens(t *testing.T) { t.Parallel() var got map[string]any server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _ = json.NewDecoder(r.Body).Decode(&got) _, _ = w.Write([]byte(`{"choices":[{"message":{"content":"ok"}}]}`)) })) defer server.Close() factory := NewFactory(2 * time.Second) client, err := factory.ClientFor("openai") if err != nil { t.Fatalf("client creation failed: %v", err) } temperature := 0.77 maxTokens := 777 _, err = client.Generate(context.Background(), Request{ Provider: "openai", BaseURL: server.URL, Model: "gpt-5.4", APIKey: "key", Temperature: &temperature, MaxTokens: &maxTokens, SystemPrompt: "system", UserPrompt: "user", }) if err != nil { t.Fatalf("generate failed: %v", err) } gotTemperature, _ := got["temperature"].(float64) if gotTemperature != 0.77 { t.Fatalf("unexpected temperature: %v", gotTemperature) } if _, exists := got["max_tokens"]; exists { t.Fatalf("did not expect max_tokens for openai gpt-5 models") } gotMaxCompletionTokens, _ := got["max_completion_tokens"].(float64) if gotMaxCompletionTokens != 777 { t.Fatalf("unexpected max_completion_tokens: %v", gotMaxCompletionTokens) } } func TestOpenAICompatibleClient_UsesMaxTokensForOlderOpenAIModels(t *testing.T) { t.Parallel() var got map[string]any server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _ = json.NewDecoder(r.Body).Decode(&got) _, _ = w.Write([]byte(`{"choices":[{"message":{"content":"ok"}}]}`)) })) defer server.Close() factory := NewFactory(2 * time.Second) client, err := factory.ClientFor("openai") if err != nil { t.Fatalf("client creation failed: %v", err) } maxTokens := 512 _, err = client.Generate(context.Background(), Request{ Provider: "openai", BaseURL: server.URL, Model: "gpt-4.1", APIKey: "key", MaxTokens: &maxTokens, SystemPrompt: "system", UserPrompt: "user", }) if err != nil { t.Fatalf("generate failed: %v", err) } if _, exists := got["max_completion_tokens"]; exists { t.Fatalf("did not expect max_completion_tokens for non-gpt-5 model") } gotMaxTokens, _ := got["max_tokens"].(float64) if gotMaxTokens != 512 { t.Fatalf("unexpected max_tokens: %v", gotMaxTokens) } } func TestExtractProviderErrorMessage(t *testing.T) { t.Parallel() msg := extractProviderErrorMessage([]byte(`{"error":{"message":"invalid key"}}`)) if !strings.Contains(msg, "invalid key") { t.Fatalf("unexpected message: %q", msg) } }