Files
MealQuest/internal/ai/llm/openai/testdata
dev_agentandClaude Opus 5.5 80d91eba70
CI / ci (push) Successful in 1m30s
CI / ci (pull_request) Successful in 1m28s
Keep the request URL out of transport errors and document fixture provenance
A base URL path may hold the API key, and net/http's *url.Error names the
full request URL. Transport failures now keep only the wrapped cause, with
the key redacted, and unwrap only to llm.ErrTimeout or context.Canceled.
The request-build error no longer echoes the URL either. A new test fails
the exchange (connection refused and connection dropped) against a base
URL whose path holds the key.

testdata/README.md records each fixture's source in the vendor's public
API documentation (Ollama: its openai middleware source), how it was
sanitized, and which fields are not in the public example.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 16:33:41 -04:00
..

OpenAI-compatible adapter fixtures

These are the vendor response bodies the contract tests in openai_test.go replay. They are not live captures. Product AI is tested with fakes, and live vendor calls are opt-in and never use credentials, so no request was sent to a vendor to make them. Each fixture is adapted from the response shape in that vendor's public API documentation or open source, then sanitized:

  • IDs, timestamps, fingerprints and token counts are illustrative values in the documented format, not values from a real account.
  • Message content is replaced with MealQuest dinner text.
  • No real credential appears anywhere. {{KEY}} is a placeholder the tests replace with a fake key, to prove the adapter redacts a key echoed back in a vendor body.

The tests check the adapter against these bodies with independent assertions on both the request sent (path, headers, response_format, messages) and the response decoded. The request side does not depend on the fixtures.

Below, not in the public example marks fields or values that were added for a test case and do not come from the vendor's documented example.

OpenAI

Sources: API reference, "The chat completion object" and "List models" (https://platform.openai.com/docs/api-reference/chat/object, https://platform.openai.com/docs/api-reference/models/list); the Structured Outputs guide, for refusal (https://platform.openai.com/docs/guides/structured-outputs); and the error codes guide (https://platform.openai.com/docs/guides/error-codes).

Fixture Shape Not in the public example
openai_chat_json_schema.json Chat completion object with usage details, service_tier, system_fingerprint. The JSON reply content.
openai_chat_refusal.json Structured Outputs refusal: content: null, refusal set. —
openai_models.json {object: list, data: [model]}. —
openai_error_invalid_key.json Error object, code: invalid_api_key, message echoing the key. The full key in the message; OpenAI masks most of it. Kept whole to test redaction.
openai_error_server.json Error object, type: server_error. The Authorization: Bearer {{KEY}} text; added to test redaction.

OpenRouter

Sources: API reference, chat completion response and errors (https://openrouter.ai/docs/api-reference/overview, https://openrouter.ai/docs/api-reference/errors), and "List available models" (https://openrouter.ai/docs/api-reference/list-available-models).

Fixture Shape Not in the public example
openrouter_chat_json_object.json Chat completion with provider, native_finish_reason and message.reasoning. The JSON reply content.
openrouter_chat_upstream_error.json An error object (code, message, metadata.provider_name, metadata.raw) in an HTTP 200 body, which OpenRouter documents for upstream failures. user_id.
openrouter_error_rate_limited.json Error object, code: 429, rate-limit metadata. The Key {{KEY}} text; added to test redaction.
openrouter_models.json {data: [model]} with name, context_length, architecture, pricing, supported_parameters. The second model is a minimal entry, to test optional fields.

Ollama

Ollama's OpenAI compatibility page (https://github.com/ollama/ollama/blob/main/docs/openai.md) documents requests but shows no response bodies. The shapes come from its openai middleware source (https://github.com/ollama/ollama/blob/main/openai/openai.go): chatcmpl-<n> IDs, system_fingerprint: fp_ollama, owned_by: library on models, and errors as {error: {message, type: api_error, param, code}}.

Fixture Shape Not in the public example
ollama_chat_text.json Plain chat completion. —
ollama_chat_prompt_only.json Chat completion. The reply text: prose and stray braces around a fenced JSON object, to test prompt-only extraction.
ollama_chat_truncated.json Chat completion with finish_reason: length. The cut-off JSON reply.
ollama_models.json {object: list, data: [model]}. —
ollama_error_not_found.json Middleware error object for a missing model. —