Which coding tools let you bring your own OpenAI-compatible endpoint
"OpenAI-compatible" is on every hosted model's front page, but whether a given coding tool can actually point at a custom endpoint, and what breaks when it does, varies a lot. This table is what we could verify from each tool's docs and issue tracker on 2026-09-18, with the highest-voted open requests linked. Corrections welcome by email.
Tool by tool
| Tool | Custom endpoint | Where | API it speaks | Known limits and open requests | Working config |
|---|---|---|---|---|---|
| Codex CLI | Yes | ~/.codex/config.toml: [model_providers.x] with base_url, env_key, wire_api | Responses API (preferred) or chat completions | MCP servers are sent as type:"namespace" tools that non-OpenAI backends reject (#26234, ๐48, our write-up); sub-agents send OpenAI-only items (#33551, write-up) and ignore model_provider (#40858); auto-review is pinned to an OpenAI model name (#24879) | Guide |
| Codex desktop app | Partly | Same config file as the CLI | Responses API | Custom providers do not work with existing chats or the model picker; selecting one for a new thread can fail with "model is not supported when using Codex with a ChatGPT account" (#29156, ๐33, open) | CLI guide |
| opencode | Yes | opencode.json: provider.x.npm = "@ai-sdk/openai-compatible" + options.baseURL | Chat completions | Model limits (context, output) must be declared per model; a custom provider also sidesteps the Go-plan "hosted in China" prompt (#39845, ๐30, write-up) | Guide |
| VS Code, Copilot Chat BYOK | Yes | Manage Models โ Custom endpoint (OpenAI-compatible), per-model entries with the base URL and key | Chat completions | No model discovery: every model is typed by hand (#319968, ๐49); no BYOK in the Agents window over SSH (#325738, ๐25); wish list in #325237, ๐26 | Guide |
| Warp | Hosted only | Settings โ search "inference endpoint": URL, API key, model ids | Chat completions | Requests are proxied through Warp's backend, so localhost and private URLs are rejected (#12142, ๐38, open); no per-model context or temperature settings (#11963); not available to Cloud Agents; Warp cannot enforce retention terms for the upstream. Free and small-team plans qualify; larger organisations need Business | A public endpoint such as ours works; use the model ids from the model list |
| Zed | Yes | settings.json: language_models.openai_compatible.<name> with api_url and available_models; key in <NAME>_API_KEY | Chat completions (Responses by setting chat_completions: false) | Set interleaved_reasoning: true for models that return reasoning_content, or the inline assistant breaks on thinking (#53135, ๐10) | Config below |
| Cursor | Not documented | Own API keys for the providers Cursor lists; no custom base URL in the current docs | โ | Users asking for DeepSeek, Kimi and GLM inside Cursor are a recurring theme (76 titled issues since March); nothing official to point at | โ |
| Claude Code | Anthropic API only | ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN + ANTHROPIC_MODEL, pointed at a server that speaks /v1/messages | Anthropic Messages API | A plain OpenAI-compatible endpoint does not work; the host has to implement the Messages API itself (373 titled issues since March about DeepSeek, Kimi or GLM in Claude Code). Ours does, and Claude Code 2.1.275 completed a real task on eight models through it | Guide |
| GitHub Copilot in JetBrains | Listed providers only | BYOK for the providers the plugin lists; no custom endpoint field | โ | Custom endpoint requested in #1283, DeepSeek in #1709, ๐12; both open | Use Continue in JetBrains instead |
| Cline | Yes | Provider "OpenAI Compatible": base URL, key, model id | Chat completions | Declare context and output limits per model | Guide |
| Continue | Yes | config.yaml: provider openai with apiBase | Chat completions | Guide | |
| Aider | Yes | OPENAI_API_BASE + OPENAI_API_KEY, model as openai/<id> | Chat completions | Model metadata (context, price) comes from a local JSON you may need to add | Guide |
| Open WebUI | Yes | Admin โ Connections โ OpenAI API: base URL and key | Chat completions, audio, embeddings | Guide | |
| n8n | Yes | OpenAI credential with a custom base URL | Chat completions | Guide | |
| Libraries (OpenAI SDKs, LiteLLM, LangChain, LlamaIndex, Vercel AI SDK) | Yes | base_url / provider config | Chat completions, Responses, embeddings | LiteLLM: inferenceapis/<model> once #41669 merges | All guides |
What the endpoint has to get right
Speaking /v1/chat/completions is the easy half. The tools above also depend on details that "compatible" does not promise, and most reported failures come from these:
- Streaming tool calls. Arguments arrive as
delta.tool_callsfragments and must reassemble into valid JSON. Every agent needs this. - The Responses API for Codex, which only speaks it, including
function_call_outputreplays and Codex's ownnamespacetools. - Replaying history without
reasoning_content. Most tools drop it; hosts that require it back fail the second turn (details). - Unknown OpenAI-only fields.
safety_identifier,store,metadataarrive from clients whether you want them or not (details). - Tools with no parameters and forced
tool_choice, which trips grammar compilers when{}becomes[]somewhere in the chain (details). - A
/v1/modelslist that includes every id you accept, because several tools validate the model name against it.
We test all of these against every chat model we serve and publish the results, failures included, on the model capabilities page.
Zed: the config the docs describe
{
"language_models": {
"openai_compatible": {
"inferenceapis": {
"api_url": "https://api.inferenceapis.com/v1",
"available_models": [
{ "name": "deepseek-ai/DeepSeek-V4-Flash", "display_name": "DeepSeek V4 Flash", "max_tokens": 1000000,
"capabilities": { "tools": true, "interleaved_reasoning": true, "parallel_tool_calls": true } },
{ "name": "zai-org/GLM-5.3", "display_name": "GLM 5.3", "max_tokens": 1000000,
"capabilities": { "tools": true, "interleaved_reasoning": true } },
{ "name": "moonshotai/Kimi-K2.7-Code", "display_name": "Kimi K2.7 Code", "max_tokens": 262144,
"capabilities": { "tools": true, "interleaved_reasoning": true } }
]
}
}
}
}Export INFERENCEAPIS_API_KEY before starting Zed; the variable name is derived from the provider key. interleaved_reasoning: true tells Zed to expect reasoning_content, which all three models return. We have not run Zed end to end ourselves yet; the fields are from Zed's documentation as of 2026-09-18.
Warp: what works and what does not
Warp added custom inference endpoints in May 2026 (Settings, search "inference endpoint"). The client sends your endpoint URL, key and prompt to Warp's backend, which makes the request, so two things follow: private and localhost URLs are refused, which is the open issue with the most votes, and Warp's own privacy terms apply to the prompt in transit. A public endpoint works. Ours takes the model ids from the model list; per-model settings such as context length are not configurable in Warp yet.
Claude Code
Claude Code talks to the Anthropic Messages API and nothing else. Pointing ANTHROPIC_BASE_URL at a plain OpenAI-compatible endpoint does not work; the host has to implement /v1/messages itself, including the streaming events, tool_use and tool_result blocks and thinking blocks. This endpoint does (https://api.inferenceapis.com/v1/messages), so the change is three environment variables. Claude Code 2.1.275 ran a fix-the-tests task end to end on eight models through it on 2026-09-18; the timings, costs and the gotchas are in the Claude Code guide.
