Overview
Bifrost ships a comprehensive end-to-end test harness (tests/e2e/api/collections/provider-harness.json) that exercises every provider’s translation surface. This page documents which features are covered for each provider, sourced from each upstream’s official docs and verified against what’s in the harness collection today.
Total: 725 requests across 12 folders covering native API, provider-native drop-in routes (/openai, /anthropic, /bedrock, /genai), umbrella SDK drop-in shapes (/langchain, /litellm, /pydanticai, /cursor, /cohere), cross-model routing, passthrough endpoints, an endpoint × provider × modality matrix (chat / embeddings / audio / images), feature variations, and explicit backlog coverage.
[PREVIEW] tag: 25 requests prefixed [PREVIEW] are gated behind INCLUDE_PREVIEW=1 (default-skipped) because they target account/region-scoped resources (preview-model deployments, vector stores, cached content references, MCP servers, audio-capable deployments) that the harness can’t provision in arbitrary environments. Run make run-provider-harness-test INCLUDE_PREVIEW=1 to include them.
Run it with:
tmp/newman-report.html— rich HTML reporttmp/harness-failures.md— categorized failures + coverage matrices- Interactive viewer at
http://localhost:8090with Resend + Copy curl
Status legend
✅— exercised by the harness, expected to pass against a properly-configured upstream✅*— exercised, but needs an environment-side resource the harness can’t manufacture (vector store, cached content reference, real audio bytes, MCP server, preview deployment, etc.). These rows are typically[PREVIEW]-tagged in the collection so they default-skip; opt in withmake run-provider-harness-test INCLUDE_PREVIEW=1❌— provider supports this feature but the harness doesn’t yet exercise it (gap; PRs welcome)
N/A row, since each table only lists features within that provider’s own API surface.
Per-provider coverage
OpenAI
Anthropic
Bedrock
Gemini (Google AI Studio)
Vertex AI
Azure OpenAI
Bifrost-side normalizations applied automatically (don’t appear as separate rows):
- Vision URL images on Bedrock — fetched and inlined as base64 (Bedrock Converse only accepts inline bytes)
- PDF URL documents on Bedrock — same fetch+inline path
- PDF URL documents on Vertex Claude — same (Vertex-Anthropic doesn’t accept URL document sources)
- Anthropic-style
{type:"document",source:{...}}blocks on/v1/chat/completions— normalized to{type:"file",file:{...}}at JSON unmarshal so every provider’s converter sees the same shape
Modalities (8. Criss-Cross)
The harness exercises every non-chat modality across providers via both native /v1/<modality> routes and OpenAI / GenAI drop-in shapes. Cells marked N/A are not applicable (provider does not expose the modality through Bifrost, or the cell is the provider talking to itself through its own drop-in shape). Cells the harness deliberately skips at run time (encoded as [SKIP] in the collection) inherit N/A here.
Folder 8 also contains a
8.6 Feature combinations sub-folder (26 requests) that exercises tool-calling, vision, JSON/structured-output, and reasoning across the /v1/chat/completions × /openai × /anthropic × /bedrock × /genai shape grid - these are tabulated in the cross-cutting matrices below.
Cross-cutting (Bifrost-specific)
These exercise Bifrost’s translation layer between provider shapes — every check uses the unifiedPOST /v1/chat/completions endpoint with provider/model prefix routing.
Translation-layer matrices (/v1/chat/completions with provider/model prefix)
Each row is a dedicated Round N sub-folder under 12. Backlog Coverage. The number in parentheses is the count of (provider, model) cells exercised today.
Drop-in (native-shape) matrices
These exercise the same features but against the provider-native drop-in routes (/openai, /anthropic, /bedrock, /genai) rather than /v1/chat/completions.
Umbrella-SDK drop-in shapes
Bifrost exposes umbrella SDK routes that accept the OpenAI / Anthropic / Gemini / Bedrock / Cohere request shape byte-for-byte and dispatch to the right typed provider underneath. Each umbrella has its own smoke folder plus a shared vision matrix.Bifrost-only behaviors
Passthrough surface (*_passthrough/*)
Catch-all forwarding routes that strip incoming auth headers and inject Bifrost’s configured provider key.
Covered across the
Passthrough Backlog folder + Cross-Cut Round 28: Passthrough Advanced Matrix (24 requests total).
Bedrock: passthrough is not supported by design. AWS SigV4 signing requires bifrost to sign the request with its own credentials, which fundamentally conflicts with byte-for-byte forwarding. Use the typed /bedrock/model/{modelId}/converse, /converse-stream, or /invoke routes instead — those go through bifrost’s typed Bedrock provider with proper sigv4 handling.
Vertex: no passthrough variant. Google OAuth bearer tokens are rotated per-request and can’t be bridged through a byte-for-byte forward.
Coverage by transport route
Known gaps that need external setup
These cells stay❌ even after running because they require provider-side state the harness can’t manufacture:
- OpenAI File Search — needs a real
vs_*vector store ([PREVIEW]-tagged) - OpenAI / Azure Audio Input — needs real base64 audio bytes (
[PREVIEW]-tagged) - OpenAI / Anthropic Batch creation — needs a real input file ID
- Gemini Cached Content reference — the lifecycle endpoints (create/list/retrieve/update/delete) work end-to-end; only the referencing tests (passing
cachedContents/{id}togenerateContent) need a pre-provisioned cache with 32k+ tokens of content (Gemini’s minimum) ([PREVIEW]-tagged) - Vertex Anthropic features in
us-central1— region-restricted unlessGOOGLE_LOCATION=global - Vertex preview-model deployments (Gemini-3.x, etc.) —
[PREVIEW]-tagged; require account access - Vertex-Anthropic URL document sources — Vertex doesn’t accept URL document sources upstream; bifrost auto-fetches and inlines via
inlineDocumentURLsfor parity with direct Anthropic - Azure preview deployments (
o3/gpt-4o-audio-preview/computer-use-preview) —[PREVIEW]-tagged; require deployment provisioning - MCP toolset tests —
[PREVIEW]-tagged; need a reachable MCP server
Coverage report layout
When you run the harness,tmp/harness-failures.md is generated with three matrices:
- Feature × Provider — every feature row × every provider column
- Feature × Route — same features ×
drop-in/cross-model/passthrough - Per-(provider, model) — every distinct provider/model tuple, with the exact features each one exercised
Extending coverage
The full backlog of candidate test additions lives intests/e2e/api/HARNESS_COVERAGE_BACKLOG.md — provider-by-provider feature inventory sourced from each provider’s official docs. Adding a new test is a one-line entry in the relevant sub-folder of provider-harness.json.
