<!-- OpenSmartRoute: Compatibility matrix. https://opensmartroute.ai/docs/COMPATIBILITY -->
# Compatibility matrix

What OpenSmartRoute connects to, how each connection is made, and how it was verified. One row per provider,
client, framework and adapter; the *Verified* column names the evidence - a unit test that runs on every push, a
live run with real credentials and its date, or "by protocol" when the connection is the OpenAI-compatible
wire format and no deeper adapter exists. A test holds this page to the code: every provider preset the platform
offers, every adapter module of the SDK and every framework the website names must have a row here.

Legend for *Verified*: **CI** = exercised by the test suite on every push (a fake endpoint speaking the
provider's wire format); **live `<date>`** = a real call with real credentials on that date, recorded in the
repository; **protocol** = reached through the OpenAI-compatible API without a dedicated adapter, so what is
verified is the protocol, not the vendor's quirks.

## Model providers (hosted platform and `osr serve`)

The platform's *Model providers* page offers these presets (`platform/api/osr_platform/providers.py`); each is
an OpenAI-compatible endpoint the router calls with the workspace's own key. The SDK reaches the same endpoints
through `attach_chat_handlers` / `OpenAICompatClient` and, for Anthropic, `AnthropicClient`.

| Preset | Vendor API | Wire format | Verified |
|---|---|---|---|
| `openai` | OpenAI | OpenAI chat / embeddings / responses | CI; live 2026-09-10 (token calibration against billed gpt-4.1 usage) |
| `azure` | Azure OpenAI / Azure AI Foundry | OpenAI v1 with `api-key` header | CI; live 2026-09-10 (multi-cloud benchmark, 150 prompts) |
| `azure-identity` | Azure OpenAI / Azure AI Foundry, keyless | OpenAI v1 with a managed-identity bearer token (`identity://https://cognitiveservices.azure.com`) | CI (reference resolution and caching); the token exchange is the same identity endpoint the Key Vault references use in production |
| `huggingface` | Hugging Face Inference Providers | OpenAI-compatible router (`router.huggingface.co/v1`, Hub model ids) | protocol |
| `bedrock` | Amazon Bedrock | OpenAI-compatible endpoint (`openai.gpt-oss-*`) | live 2026-09-10 (multi-cloud benchmark) |
| `gemini` | Google Gemini API | OpenAI-compatible endpoint | protocol |
| `vertex` | Google Cloud Vertex AI | OpenAI-compatible endpoint (`google.thinking_config` passed through) | live 2026-09-10 (multi-cloud benchmark, judge re-scoring) |
| `openrouter` | OpenRouter | OpenAI | CI (the example catalogue names OpenRouter ids) |
| `anthropic` | Anthropic | native Messages API (`AnthropicClient`) | CI (translation of chat calls, streaming) |
| `mistral` | Mistral | OpenAI | protocol |
| `groq` | Groq | OpenAI | protocol |
| `together` | Together AI | OpenAI | protocol |
| `fireworks` | Fireworks AI | OpenAI | protocol |
| `deepseek` | DeepSeek | OpenAI | protocol |
| `xai` | xAI | OpenAI | protocol |
| `cohere` | Cohere | OpenAI-compatible endpoint | protocol |
| `ollama` | Ollama (local models) | OpenAI | CI; live, in production (the on-prem targets of opensmartroute.ai run on it) |
| `vllm` | vLLM | OpenAI | protocol (the vLLM semantic-router import is CI) |
| `litellm` | LiteLLM proxy | OpenAI | protocol |
| `custom` | any OpenAI-compatible endpoint | OpenAI | CI (the test fleet is one) |

The platform's own model server (`osr-models`, Ollama and OpenAI APIs over llama.cpp) is a `ollama` preset to
the router; its API coverage has its own matrix in the model-serving plan.

## Clients that talk to the router

| Client | How | Verified |
|---|---|---|
| OpenAI Python SDK | `OpenAI(base_url=<router>/v1, api_key=<key>)`, `model="auto"` | CI (the official client against `osr serve`, chat, streaming, tools, embeddings); `openai>=1.50,<3` |
| OpenAI Node SDK and every OpenAI-compatible client (Vercel AI SDK, Continue, aider, LiteLLM, ...) | same base URL | protocol; the TypeScript SDK's live test runs against production |
| Anthropic SDK / Claude Code | `/v1/messages` with the router as `base_url` | CI (Messages API surface) |
| OpenAI Responses clients | `/v1/responses` | CI |
| MCP hosts (VS Code, Cursor, Windsurf, Claude Desktop, Claude Code) | `/mcp` (Streamable HTTP) or `osr mcp` (stdio) | CI (the official `mcp` client, `mcp>=1.10,<2`); live in production |
| `@opensmartroute/sdk` (TypeScript) | typed REST client over the platform API | CI (surface and live tests) |
| `osr` CLI | the SDK, in a terminal | CI |

## Agent frameworks

| Framework | Integration | Depth | Verified |
|---|---|---|---|
| LangGraph | `adapters.frameworks.langgraph_node` / `langgraph_condition` | deep adapter (a routing node and an edge condition) | CI (the node runs without LangGraph installed; the graph wiring is the framework's) |
| Microsoft Agent Framework / AutoGen | `adapters.frameworks.maf_router_executor` | deep adapter (an executor) | CI |
| OpenAI function calling / Agents SDK | `adapters.frameworks.openai_tool_spec` / `openai_tool_handler` | deep adapter (the router as a tool) | CI |
| LangChain | `ChatOpenAI(base_url=<router>/v1, model="auto")` | protocol | protocol |
| CrewAI | the OpenAI-compatible LLM setting | protocol | protocol |
| LlamaIndex | `OpenAILike(api_base=<router>/v1)` | protocol | protocol |
| Semantic Kernel | the OpenAI connector with a base URL | protocol | protocol |
| pydantic-ai | the OpenAI model with a base URL | protocol | protocol |

## SDK adapters (`opensmartroute.adapters`)

| Module | Connects | Verified |
|---|---|---|
| `a2a` | A2A Agent Cards as agent targets; `a2a_handler` with task polling | CI |
| `anthropic_client` | the Anthropic Messages API as a chat handler | CI |
| `catalogue` | the live model catalogue (prices, context windows) | CI; live every 8 hours on the platform |
| `frameworks` | LangGraph, Agent Framework, OpenAI tools (above) | CI |
| `handlers` | HTTP endpoints, MCP tools and asynchronous queues as handlers | CI |
| `harness` | agent harnesses: callable, HTTP, subprocess | CI |
| `marketplace` | the marketplace (search, pull, sync, signed manifests) | CI; live in production |
| `mcp` | MCP tool catalogues (stdio and Streamable HTTP), resources and prompts | CI (official client) |
| `mcp_servers` | MCP server recommendation from a request | CI |
| `mock_client` | the `mock` provider kind: a deterministic, network-free provider for tests, demos and pipelines | CI |
| `openai_compat` | OpenAI-compatible HTTP client (chat, embeddings, retries, error mapping) | CI; live (above) |
| `optional` | adapters with extra dependencies, imported lazily | CI |
| `personas` | persona catalogues as targets | CI |
| `semantic_router` | a vLLM semantic-router configuration imported as rules | CI |
| `skills` | Agent-Skills `SKILL.md` packages as targets | CI |
| `websearch` | web knowledge and feeds for the self-improver | CI; live on the platform |

## Runtimes

| Runtime | Verified |
|---|---|
| CPython 3.11, 3.12 (Linux, Windows) | CI on every push; 3.11 is the floor |
| Node 22 (web, TypeScript SDK, extension, desktop) | CI |
| PostgreSQL 16 (platform) | CI and production |
| Redis, Kafka (platform clustering, optional) | CI (platform cluster job) |

A vendor that changes its wire format breaks a *protocol* row first; the CI rows carry a fake of the format the
SDK was written against, so a change shows up as a red build only once the fake is updated - treat a *protocol*
row as "should work" and a *CI* or *live* row as "does work".
