90 lines
3.4 KiB
Go
90 lines
3.4 KiB
Go
package clients
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestOpenAIChatOfficialParametersSurviveBoundary(t *testing.T) {
|
|
body := map[string]any{}
|
|
for key := range openAIChatRequestParameters {
|
|
body[key] = "sentinel-" + key
|
|
}
|
|
body["conversationId"] = "internal"
|
|
body["unknown"] = "must-not-leak"
|
|
|
|
filtered := FilterOpenAIChatRequestBody(body)
|
|
for key := range openAIChatRequestParameters {
|
|
if _, ok := filtered[key]; !ok {
|
|
t.Fatalf("official Chat parameter %q was removed", key)
|
|
}
|
|
}
|
|
for _, key := range []string{"conversationId", "unknown"} {
|
|
if _, ok := filtered[key]; ok {
|
|
t.Fatalf("internal/unknown parameter %q leaked upstream", key)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestOpenAIResponsesOfficialParametersSurviveBoundary(t *testing.T) {
|
|
body := map[string]any{}
|
|
for key := range openAIResponsesRequestParameters {
|
|
body[key] = "sentinel-" + key
|
|
}
|
|
body["request_id"] = "internal"
|
|
body["unknown"] = "must-not-leak"
|
|
|
|
filtered := FilterOpenAIResponsesRequestBody(body)
|
|
for key := range openAIResponsesRequestParameters {
|
|
if _, ok := filtered[key]; !ok {
|
|
t.Fatalf("official Responses parameter %q was removed", key)
|
|
}
|
|
}
|
|
for _, key := range []string{"request_id", "unknown"} {
|
|
if _, ok := filtered[key]; ok {
|
|
t.Fatalf("internal/unknown parameter %q leaked upstream", key)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestValidateOpenAIRequestParametersRejectsUnknownTopLevelField(t *testing.T) {
|
|
err := ValidateOpenAIRequestParameters("responses", map[string]any{"model": "demo", "input": "hello", "rogue": true})
|
|
if err == nil || ErrorCode(err) != "invalid_parameter" || !strings.Contains(err.Error(), "rogue") {
|
|
t.Fatalf("expected OpenAI-style invalid_parameter for rogue field, got %v", err)
|
|
}
|
|
if ErrorParam(err) != "rogue" {
|
|
t.Fatalf("expected rogue parameter attribution, got %q", ErrorParam(err))
|
|
}
|
|
if err := ValidateOpenAIRequestParameters("responses", map[string]any{"model": "demo", "input": "hello", "messages": []any{}, "request_id": "internal"}); err != nil {
|
|
t.Fatalf("expected controlled Responses extensions to remain accepted, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestResponsesFallbackMapsEquivalentCurrentParameters(t *testing.T) {
|
|
body, err := ResponsesRequestToChat(map[string]any{
|
|
"input": "hello", "store": false, "metadata": map[string]any{"trace": "1"},
|
|
"request_id": "internal-request", "platform_id": "internal-platform",
|
|
"moderation": map[string]any{"type": "auto"}, "prompt_cache_key": "cache-key",
|
|
"prompt_cache_options": map[string]any{"type": "ephemeral"}, "prompt_cache_retention": "in_memory",
|
|
"safety_identifier": "safe", "service_tier": "priority", "top_logprobs": 3,
|
|
"stream_options": map[string]any{"include_usage": true},
|
|
"text": map[string]any{"format": map[string]any{"type": "text"}, "verbosity": "low"},
|
|
}, nil)
|
|
if err != nil {
|
|
t.Fatalf("convert Responses request: %v", err)
|
|
}
|
|
for _, key := range []string{"store", "metadata", "moderation", "prompt_cache_key", "prompt_cache_options", "prompt_cache_retention", "safety_identifier", "service_tier", "top_logprobs", "stream_options", "verbosity"} {
|
|
if _, ok := body[key]; !ok {
|
|
t.Fatalf("equivalent parameter %q was not mapped", key)
|
|
}
|
|
}
|
|
if body["logprobs"] != true {
|
|
t.Fatalf("top_logprobs fallback must enable Chat logprobs: %+v", body)
|
|
}
|
|
for _, key := range []string{"request_id", "platform_id"} {
|
|
if _, ok := body[key]; ok {
|
|
t.Fatalf("internal Responses parameter %q leaked into Chat fallback: %+v", key, body)
|
|
}
|
|
}
|
|
}
|