fix: deliver validated AI insight responses
This commit is contained in:
59
internal/aiprovider/client_test.go
Normal file
59
internal/aiprovider/client_test.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package aiprovider
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestClientNormalizesV1AndUsesPrivateStrictResponsesRequest(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/responses" {
|
||||
t.Fatalf("path = %q", r.URL.Path)
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&received); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
w.Header().Set("X-Request-ID", "aval-request-1")
|
||||
_, _ = w.Write([]byte(`{"status":"completed","output":[{"type":"message","content":[{"type":"output_text","text":"{\"answer\":\"ok\"}"}]}],"usage":{"input_tokens":12,"output_tokens":4}}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client := New(Config{BaseURL: server.URL + "/v1/", APIKey: "secret", Model: "test-model", Timeout: time.Second}, server.Client())
|
||||
result, usage, err := client.Generate(context.Background(), Request{SchemaName: "test_v1", Schema: map[string]any{"type": "object", "additionalProperties": false}, Input: json.RawMessage(`{"safe":"aggregate"}`)})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if string(result) != `{"answer":"ok"}` || usage.ProviderRequestID != "aval-request-1" {
|
||||
t.Fatalf("result=%s usage=%+v", result, usage)
|
||||
}
|
||||
if received["store"] != false {
|
||||
t.Fatalf("store = %#v, want false", received["store"])
|
||||
}
|
||||
format := received["text"].(map[string]any)["format"].(map[string]any)
|
||||
if format["strict"] != true || format["name"] != "test_v1" {
|
||||
t.Fatalf("format = %#v", format)
|
||||
}
|
||||
}
|
||||
|
||||
func TestClientRetriesOnlyTransientFailure(t *testing.T) {
|
||||
calls := 0
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
|
||||
calls++
|
||||
if calls == 1 {
|
||||
w.WriteHeader(http.StatusTooManyRequests)
|
||||
return
|
||||
}
|
||||
_, _ = w.Write([]byte(`{"status":"completed","output":[{"type":"message","content":[{"type":"output_text","text":"{}"}]}]}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
client := New(Config{BaseURL: server.URL, APIKey: "secret", Model: "model"}, server.Client())
|
||||
_, usage, err := client.Generate(t.Context(), Request{SchemaName: "test", Schema: map[string]any{"type": "object"}, Input: json.RawMessage(`{}`)})
|
||||
if err != nil || calls != 2 || usage.ProviderRequests != 2 {
|
||||
t.Fatalf("err=%v calls=%d usage=%+v", err, calls, usage)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user