52 lines
2.0 KiB
Go
52 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|