Skip to content

Compatibility matrix

How each supported client connects, and the contract OpenGateway guarantees. The machine-checked version of this table lives in tests/compat/ and runs in CI against a mock gateway.

| Client | Base URL | Wire API | Discovery | Shape | Auth / headers | | --- | --- | --- | --- | --- | --- | | Claude Code | <host>/<lane> (no /v1) | Anthropic Messages (+ count_tokens) | optional, gated | Anthropic; claude*/anthropic* ids | x-api-key or Bearer; anthropic-version | | Codex | <host>/<lane>/v1 | OpenAI Responses only | avoid /v1/modelsmodel_catalog_json | n/a | Bearer | | OpenCode | <host>/<lane>/v1 | Chat / Responses / Messages | config-declared | n/a | Bearer or x-api-key | | Cursor | <host>/<lane>/v1 | OpenAI Chat | required 200 | OpenAI | Bearer | | Cline / Roo | <host>/<lane>/v1 | OpenAI Chat | optional | OpenAI | Bearer | | OpenAI SDK | <host>/<lane>/v1 (incl. /v1) | Chat / Responses | on demand | OpenAI | Bearer | | Anthropic SDK | <host>/<lane> (excl. /v1) | Messages | on demand | Anthropic | x-api-key |

  1. Dual-shape GET /v1/models — Anthropic shape when anthropic-version / x-api-key is present (ids claude*/anthropic*), else OpenAI shape returning 200 (Cursor verification). See Model discovery.
  2. Both wire protocols on every lane, with tolerant auth/headers — accept Bearer and x-api-key; never 400 on an unknown anthropic-version or a retired anthropic-beta. See Errors.
  • Cursor: global base-URL override self-disables periodically; vision via BYOK hits a hardcoded api.openai.com validation.
  • Codex: serving the OpenAI list can break its catalog refresh — use model_catalog_json.
  • Claude Code: the picker hides non-claude*/anthropic* ids.