feat: add configurable AgentRouter AI provider
This commit is contained in:
51
internal/aiprovider/agentrouter_test.go
Normal file
51
internal/aiprovider/agentrouter_test.go
Normal file
@@ -0,0 +1,51 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user