Overview
MeshPool exposes an OpenAI-compatible HTTP API (and an Anthropic Messages path for Claude Code). Your editor or script sends a request to the MeshPool gateway. MeshPool authenticates the key, applies your workspace budget and model policy, then returns a completion. Usage lands on the same seat and invoice as chat.
Get a key
Create keys in MeshPool chat. That is the primary path. You do not need administrator rights. Every employee with a seat can mint a key for their own tools.
In chat (recommended)
- Sign in to MeshPool chat.
- In the left rail, click the key icon. Alternatively open the Account menu and choose API keys.
- Give the key a name that says where it will live, for example
Claude Code — work laptoporCI — release pipeline. That name is what you will see when you revoke it later. - Create the key and copy it immediately. The secret is shown exactly once. MeshPool stores only the last four characters, so nobody — including support — can recover it.
In the console
You can also create keys at Account → API keys in the company console. The console lists every alias your workspace can call and includes Cursor, Android Studio, OpenCode, OpenWork, and Open WebUI walkthroughs.
Connection details
Substitute the live values below into your tool. Auth is always Authorization: Bearer sk-…. Keys start with sk- followed by an opaque string.
| Setting | Value |
|---|---|
| OpenAI base URL | https://llm.stg.meshpool.ai/v1 |
| Anthropic base URL | https://llm.stg.meshpool.ai — Claude Code only; no /v1 |
| Auth | Authorization: Bearer sk-… |
Supported endpoints:
| Endpoint | Purpose |
|---|---|
POST /v1/chat/completions | The path nearly every tool uses. Streaming is supported. |
POST /v1/completions | Legacy text completion. |
POST /v1/messages | Anthropic Messages API — Claude Code. |
POST /v1/messages/count_tokens | Token counting for the Anthropic path. |
POST /v1/responses | OpenAI Responses API. |
POST /v1/embeddings | Embeddings. |
POST /v1/rerank | Reranking. |
GET /v1/models | Lists exactly the models your key may call. |
Other paths return 404. That is intentional: only inference endpoints are public.
Claude Code
Claude Code talks to the Anthropic Messages API. Point it at the base URL without /v1, and use ANTHROPIC_AUTH_TOKEN — not ANTHROPIC_API_KEY, which triggers a different auth path.
- Create a personal key in chat (see Get a key) and copy the
sk-…secret. - Export the environment variables below in the shell where you run
claude. To make them permanent, add the same lines to~/.zshrcor~/.bashrc. To scope them to one project, put them in a.envrcand use direnv. - Set
ANTHROPIC_MODELto a MeshPool alias. Start withmeshpool-maxfor hard reasoning, or a named alias your workspace has enabled. - Point the small, fast background model at
meshpool-fastso summarising and similar work does not burn the expensive tier. - Optionally set
CLAUDE_CODE_MAX_CONTEXT_TOKENS. Claude Code does not recognise MeshPool alias names, so it prints anunrecognized_modelnotice and assumes a 200k-token window. Everything still works; this variable stops auto-compact from triggering earlier than it needs to when the underlying model is larger.
export ANTHROPIC_BASE_URL="https://llm.stg.meshpool.ai"
export ANTHROPIC_AUTH_TOKEN="sk-…"
export ANTHROPIC_MODEL="meshpool-max"
export ANTHROPIC_SMALL_FAST_MODEL="meshpool-fast"
export CLAUDE_CODE_MAX_CONTEXT_TOKENS=1000000
claudeVerify the connection:
claude -p "reply with exactly: connected"If that hangs or errors, run the curl check first. It isolates whether the problem is the key or the Claude Code config.
Cursor
Cursor talks OpenAI Chat Completions. Use the /v1 URL and add each MeshPool alias you want in the picker. Cursor does not import /v1/models into its dropdown — if you skip this step, the alias will not appear.
- Open Cursor Settings with ⌘⇧J (macOS) or Ctrl+Shift+J (Windows / Linux), then go to Models.
- Paste your MeshPool key into OpenAI API Key and turn that toggle on. Leave Cursor's Anthropic and Google keys empty for MeshPool traffic — Claude and Gemini on MeshPool are served on the OpenAI-compatible path.
- Enable Override OpenAI Base URL and set it to
https://llm.stg.meshpool.ai/v1. Keep/v1. Do not append/chat/completions. - In Add or search model, type a MeshPool alias exactly and click Add Custom Model, then toggle it on. Repeat for every model you want. Start with the modes — they never collide with Cursor's built-in list — then add the named aliases. Copy the full chat list:
meshpool-fast meshpool-balanced meshpool-max deepseek-v4-flash-0731 kimi-k3 glm-5.2 kimi-k2.7-code minimax-m3 qwen3.7-plus deepseek-v4-pro kimi-k2.6 minimax-m2.7 qwen3.7-max qwen3.6-plus gemma-4-26b-a4b-it gemma-4-31b-it glm-5.1 qwen3.5-397b-a17b kimi-k2.5 deepseek-v3.2 gpt-4o gpt-4o-mini gpt-4.1 gpt-4.1-mini gpt-4.1-nano gpt-5 gpt-5-mini gpt-5-nano gpt-5.1 gpt-5.2 gpt-5.4 gpt-5.4-mini gpt-5.4-nano gpt-5.5 gpt-5.6-sol o1 o3 o3-mini o4-mini grok-4.3 claude-opus-5 claude-opus-5-fast claude-fable-5 claude-opus-4.8 claude-opus-4-8-fast claude-opus-4.7 claude-opus-4-7-fast claude-opus-4.6 claude-opus-4.5 claude-sonnet-5 claude-sonnet-4.6 claude-sonnet-4.5 claude-haiku-4.5 gpt-5.6-terra gpt-5.6-luna gpt-5.5-pro gpt-5.4-pro gpt-5.3-codex gpt-5.2-codex gpt-oss-120b gemini-3.7-flash gemini-3.6-flash gemini-3.1-pro gemini-3.1-pro-preview gemini-3.1-flash-lite gemini-3-5-flash gemini-3-flash-preview google/gemini-3.5-flash-lite gemini-2.5-flash glm-5.3 glm-5 glm-4.7 glm-4.6 glm-4.5 glm-4.5-air qwen-3-8-max qwen3.6-27b qwen3-5-35b-a3b qwen3-6-35b-a3b deepseek-v4-flash deepseek-v4-pro-0813 grok-4.5 aion-labs.aion-2-0 muse-spark-1.2 stealth/ox-alpha - Press Verify. In Chat, pick the alias from the model dropdown. Avoid Auto — that stays on Cursor's own router.
Image aliases such as nano-banana, gpt-image-2, and grok-imagine cannot be used in Cursor Chat — see Image models.
Android Studio
Gemini in Android Studio can call MeshPool as a third-party remote provider. It talks OpenAI Chat Completions, so use the /v1 URL and your MeshPool sk-… key. Unlike Cursor, Android Studio does import GET /v1/models after you click Refresh — you do not type aliases by hand.
- Create a personal key in chat (see Get a key) and copy the
sk-…secret. - Open Android Studio settings: Android Studio → Settings on macOS, or File → Settings on Windows / Linux. Expand Tools → AI and select Model Providers.
- Click Add and choose Third-Party Remote Provider. If that menu is missing, update Android Studio to a current release that includes Tools → AI → Model Providers.
- Fill in the provider:
- Description — any label, for example
MeshPool. - URL —
https://llm.stg.meshpool.ai/v1. Keep/v1. Do not append/chat/completions, and do not use the Anthropic host (that path is for Claude Code only). - API key — paste your MeshPool secret.
- Description — any label, for example
- Click Refresh so Android Studio loads the aliases this key may call. Enable the ones you want — start with
meshpool-fast,meshpool-balanced, andmeshpool-max— then OK. - Open the AI chat or Agent panel and pick a MeshPool alias from the model picker. Leave Google's built-in Gemini selected only for features that third-party models do not cover.
OpenCode
OpenCode talks OpenAI Chat Completions. Use the /v1 URL and paste the config below. Like Cursor, OpenCode does not import /v1/models — every chat alias is listed in opencode.json. Your key can only call models the workspace has enabled; extra names in the file return 403.
- Create a personal key in chat (see Get a key) and copy the
sk-…secret. - In OpenCode, run
/connect, choose Other, set the provider id tomeshpool, and paste the key. That stores the credential only — you still need the config file next. - Create or update
~/.config/opencode/opencode.json(global) oropencode.jsonin the project root. The provider id must matchmeshpoolexactly. Keep/v1on the base URL. Do not append/chat/completions. - Restart OpenCode, run
/models, and pick a MeshPool alias (for examplemeshpool/meshpool-maxormeshpool/claude-opus-5).
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"meshpool": {
"npm": "@ai-sdk/openai-compatible",
"name": "MeshPool",
"options": {
"baseURL": "https://llm.stg.meshpool.ai/v1"
},
"models": {
"meshpool-fast": { "name": "MeshPool Fast" },
"meshpool-balanced": { "name": "MeshPool Balanced" },
"meshpool-max": { "name": "MeshPool Max" },
"deepseek-v4-flash-0731": { "name": "DeepSeek-V4-Flash-0731" },
"kimi-k3": { "name": "Kimi K3" },
"glm-5.2": { "name": "GLM 5.2" },
"kimi-k2.7-code": { "name": "Kimi K2.7 Code" },
"minimax-m3": { "name": "MiniMax M3" },
"qwen3.7-plus": { "name": "Qwen3.7 Plus" },
"deepseek-v4-pro": { "name": "DeepSeek-V4-Pro" },
"kimi-k2.6": { "name": "Kimi K2.6" },
"minimax-m2.7": { "name": "MiniMax M2.7" },
"qwen3.7-max": { "name": "Qwen3.7 Max" },
"qwen3.6-plus": { "name": "Qwen3.6 Plus" },
"gemma-4-26b-a4b-it": { "name": "Gemma 4 26B A4B IT" },
"gemma-4-31b-it": { "name": "Gemma 4 31B IT" },
"glm-5.1": { "name": "GLM 5.1" },
"qwen3.5-397b-a17b": { "name": "Qwen3.5 397B A17B" },
"kimi-k2.5": { "name": "Kimi K2.5" },
"deepseek-v3.2": { "name": "DeepSeek V3.2" },
"gpt-4o": { "name": "GPT-4o" },
"gpt-4o-mini": { "name": "GPT-4o mini" },
"gpt-4.1": { "name": "GPT-4.1" },
"gpt-4.1-mini": { "name": "GPT-4.1 mini" },
"gpt-4.1-nano": { "name": "GPT-4.1 nano" },
"gpt-5": { "name": "GPT-5" },
"gpt-5-mini": { "name": "GPT-5 mini" },
"gpt-5-nano": { "name": "GPT-5 nano" },
"gpt-5.1": { "name": "GPT-5.1" },
"gpt-5.2": { "name": "GPT-5.2" },
"gpt-5.4": { "name": "GPT-5.4" },
"gpt-5.4-mini": { "name": "GPT-5.4 mini" },
"gpt-5.4-nano": { "name": "GPT-5.4 nano" },
"gpt-5.5": { "name": "GPT-5.5" },
"gpt-5.6-sol": { "name": "GPT-5.6 Sol" },
"o1": { "name": "o1" },
"o3": { "name": "o3" },
"o3-mini": { "name": "o3-mini" },
"o4-mini": { "name": "o4-mini" },
"grok-4.3": { "name": "Grok 4.3" },
"claude-opus-5": { "name": "Claude Opus 5" },
"claude-opus-5-fast": { "name": "Claude Opus 5 Fast" },
"claude-fable-5": { "name": "Claude Fable 5" },
"claude-opus-4.8": { "name": "Claude Opus 4.8" },
"claude-opus-4-8-fast": { "name": "Claude Opus 4.8 Fast" },
"claude-opus-4.7": { "name": "Claude Opus 4.7" },
"claude-opus-4-7-fast": { "name": "Claude Opus 4.7 Fast" },
"claude-opus-4.6": { "name": "Claude Opus 4.6" },
"claude-opus-4.5": { "name": "Claude Opus 4.5" },
"claude-sonnet-5": { "name": "Claude Sonnet 5" },
"claude-sonnet-4.6": { "name": "Claude Sonnet 4.6" },
"claude-sonnet-4.5": { "name": "Claude Sonnet 4.5" },
"claude-haiku-4.5": { "name": "Claude Haiku 4.5" },
"gpt-5.6-terra": { "name": "GPT-5.6 Terra" },
"gpt-5.6-luna": { "name": "GPT-5.6 Luna" },
"gpt-5.5-pro": { "name": "GPT-5.5 Pro" },
"gpt-5.4-pro": { "name": "GPT-5.4 Pro" },
"gpt-5.3-codex": { "name": "GPT-5.3 Codex" },
"gpt-5.2-codex": { "name": "GPT-5.2 Codex" },
"gpt-oss-120b": { "name": "GPT-OSS 120B" },
"gemini-3.7-flash": { "name": "Gemini 3.7 Flash" },
"gemini-3.6-flash": { "name": "Gemini 3.6 Flash" },
"gemini-3.1-pro": { "name": "Gemini 3.1 Pro" },
"gemini-3.1-pro-preview": { "name": "Gemini 3.1 Pro Preview" },
"gemini-3.1-flash-lite": { "name": "Gemini 3.1 Flash Lite" },
"gemini-3-5-flash": { "name": "Gemini 3.5 Flash" },
"gemini-3-flash-preview": { "name": "Gemini 3 Flash Preview" },
"google/gemini-3.5-flash-lite": { "name": "Gemini 3.5 Flash Lite" },
"gemini-2.5-flash": { "name": "Gemini 2.5 Flash" },
"glm-5.3": { "name": "GLM 5.3" },
"glm-5": { "name": "GLM 5" },
"glm-4.7": { "name": "GLM 4.7" },
"glm-4.6": { "name": "GLM 4.6" },
"glm-4.5": { "name": "GLM 4.5" },
"glm-4.5-air": { "name": "GLM 4.5 Air" },
"qwen-3-8-max": { "name": "Qwen 3.8 Max" },
"qwen3.6-27b": { "name": "Qwen3.6 27B" },
"qwen3-5-35b-a3b": { "name": "Qwen3.5 35B A3B" },
"qwen3-6-35b-a3b": { "name": "Qwen3.6 35B A3B" },
"deepseek-v4-flash": { "name": "DeepSeek-V4-Flash" },
"deepseek-v4-pro-0813": { "name": "DeepSeek-V4-Pro-0813" },
"grok-4.5": { "name": "Grok 4.5" },
"aion-labs.aion-2-0": { "name": "Aion 2.0" },
"muse-spark-1.2": { "name": "Muse Spark 1.2" },
"stealth/ox-alpha": { "name": "Stealth OX Alpha" }
}
}
}
}
Official custom-provider steps: OpenCode providers.
OpenWork
OpenWork is an open-source desktop agent built on OpenCode primitives. Use the /v1 URL and a personal sk-… key. Like OpenCode, it does not import /v1/models — you name the aliases when you connect the provider.
Install from the project README or the official downloads page:
- Repository: github.com/different-ai/openwork
- Downloads: openworklabs.com/docs/start-here/downloads
- Custom LLM docs: Add a custom LLM
From the app
- Create a personal key (see Get a key) and copy the
sk-…secret. - Open Settings → AI → Connect provider.
- Choose Add custom provider at the bottom of the list.
- Set Name to
MeshPool, ID tomeshpool, and Base URL tohttps://llm.stg.meshpool.ai/v1. Keep/v1; do not append/chat/completions. Paste the MeshPool key as API key. For Model IDs, start withmeshpool-fast,meshpool-balanced, andmeshpool-max. Add named aliases from the OpenCodemodelsmap if you want them in the picker. - Click Add provider. OpenWork writes the workspace
opencode.jsoncand the aliases appear in the model picker.
From the config file
OpenWork prefers a workspace-local file over the global OpenCode config: <workspace>/.config/opencode/opencode.json. Paste the same MeshPool provider block as OpenCode. The provider id must be meshpool.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"meshpool": {
"npm": "@ai-sdk/openai-compatible",
"name": "MeshPool",
"options": {
"baseURL": "https://llm.stg.meshpool.ai/v1"
},
"models": {
"meshpool-fast": { "name": "MeshPool Fast" },
"meshpool-balanced": { "name": "MeshPool Balanced" },
"meshpool-max": { "name": "MeshPool Max" },
"deepseek-v4-flash-0731": { "name": "DeepSeek-V4-Flash-0731" },
"kimi-k3": { "name": "Kimi K3" },
"glm-5.2": { "name": "GLM 5.2" },
"kimi-k2.7-code": { "name": "Kimi K2.7 Code" },
"minimax-m3": { "name": "MiniMax M3" },
"qwen3.7-plus": { "name": "Qwen3.7 Plus" },
"deepseek-v4-pro": { "name": "DeepSeek-V4-Pro" },
"kimi-k2.6": { "name": "Kimi K2.6" },
"minimax-m2.7": { "name": "MiniMax M2.7" },
"qwen3.7-max": { "name": "Qwen3.7 Max" },
"qwen3.6-plus": { "name": "Qwen3.6 Plus" },
"gemma-4-26b-a4b-it": { "name": "Gemma 4 26B A4B IT" },
"gemma-4-31b-it": { "name": "Gemma 4 31B IT" },
"glm-5.1": { "name": "GLM 5.1" },
"qwen3.5-397b-a17b": { "name": "Qwen3.5 397B A17B" },
"kimi-k2.5": { "name": "Kimi K2.5" },
"deepseek-v3.2": { "name": "DeepSeek V3.2" },
"gpt-4o": { "name": "GPT-4o" },
"gpt-4o-mini": { "name": "GPT-4o mini" },
"gpt-4.1": { "name": "GPT-4.1" },
"gpt-4.1-mini": { "name": "GPT-4.1 mini" },
"gpt-4.1-nano": { "name": "GPT-4.1 nano" },
"gpt-5": { "name": "GPT-5" },
"gpt-5-mini": { "name": "GPT-5 mini" },
"gpt-5-nano": { "name": "GPT-5 nano" },
"gpt-5.1": { "name": "GPT-5.1" },
"gpt-5.2": { "name": "GPT-5.2" },
"gpt-5.4": { "name": "GPT-5.4" },
"gpt-5.4-mini": { "name": "GPT-5.4 mini" },
"gpt-5.4-nano": { "name": "GPT-5.4 nano" },
"gpt-5.5": { "name": "GPT-5.5" },
"gpt-5.6-sol": { "name": "GPT-5.6 Sol" },
"o1": { "name": "o1" },
"o3": { "name": "o3" },
"o3-mini": { "name": "o3-mini" },
"o4-mini": { "name": "o4-mini" },
"grok-4.3": { "name": "Grok 4.3" },
"claude-opus-5": { "name": "Claude Opus 5" },
"claude-opus-5-fast": { "name": "Claude Opus 5 Fast" },
"claude-fable-5": { "name": "Claude Fable 5" },
"claude-opus-4.8": { "name": "Claude Opus 4.8" },
"claude-opus-4-8-fast": { "name": "Claude Opus 4.8 Fast" },
"claude-opus-4.7": { "name": "Claude Opus 4.7" },
"claude-opus-4-7-fast": { "name": "Claude Opus 4.7 Fast" },
"claude-opus-4.6": { "name": "Claude Opus 4.6" },
"claude-opus-4.5": { "name": "Claude Opus 4.5" },
"claude-sonnet-5": { "name": "Claude Sonnet 5" },
"claude-sonnet-4.6": { "name": "Claude Sonnet 4.6" },
"claude-sonnet-4.5": { "name": "Claude Sonnet 4.5" },
"claude-haiku-4.5": { "name": "Claude Haiku 4.5" },
"gpt-5.6-terra": { "name": "GPT-5.6 Terra" },
"gpt-5.6-luna": { "name": "GPT-5.6 Luna" },
"gpt-5.5-pro": { "name": "GPT-5.5 Pro" },
"gpt-5.4-pro": { "name": "GPT-5.4 Pro" },
"gpt-5.3-codex": { "name": "GPT-5.3 Codex" },
"gpt-5.2-codex": { "name": "GPT-5.2 Codex" },
"gpt-oss-120b": { "name": "GPT-OSS 120B" },
"gemini-3.7-flash": { "name": "Gemini 3.7 Flash" },
"gemini-3.6-flash": { "name": "Gemini 3.6 Flash" },
"gemini-3.1-pro": { "name": "Gemini 3.1 Pro" },
"gemini-3.1-pro-preview": { "name": "Gemini 3.1 Pro Preview" },
"gemini-3.1-flash-lite": { "name": "Gemini 3.1 Flash Lite" },
"gemini-3-5-flash": { "name": "Gemini 3.5 Flash" },
"gemini-3-flash-preview": { "name": "Gemini 3 Flash Preview" },
"google/gemini-3.5-flash-lite": { "name": "Gemini 3.5 Flash Lite" },
"gemini-2.5-flash": { "name": "Gemini 2.5 Flash" },
"glm-5.3": { "name": "GLM 5.3" },
"glm-5": { "name": "GLM 5" },
"glm-4.7": { "name": "GLM 4.7" },
"glm-4.6": { "name": "GLM 4.6" },
"glm-4.5": { "name": "GLM 4.5" },
"glm-4.5-air": { "name": "GLM 4.5 Air" },
"qwen-3-8-max": { "name": "Qwen 3.8 Max" },
"qwen3.6-27b": { "name": "Qwen3.6 27B" },
"qwen3-5-35b-a3b": { "name": "Qwen3.5 35B A3B" },
"qwen3-6-35b-a3b": { "name": "Qwen3.6 35B A3B" },
"deepseek-v4-flash": { "name": "DeepSeek-V4-Flash" },
"deepseek-v4-pro-0813": { "name": "DeepSeek-V4-Pro-0813" },
"grok-4.5": { "name": "Grok 4.5" },
"aion-labs.aion-2-0": { "name": "Aion 2.0" },
"muse-spark-1.2": { "name": "Muse Spark 1.2" },
"stealth/ox-alpha": { "name": "Stealth OX Alpha" }
}
}
}
}
Open WebUI
Open WebUI is a self-hosted chat UI that talks OpenAI Chat Completions. Use the /v1 URL and a personal sk-… key. Unlike Cursor, it does import GET /v1/models — the picker fills from whatever this key may call. You do not need a local model runner.
Install from the project README or the official getting-started guide:
- Repository: github.com/open-webui/open-webui
- Install docs: docs.openwebui.com/getting-started
Docker
OpenAI-compatible API only. After it starts, open http://localhost:3000. Keep /v1 on the base URL.
docker run -d -p 3000:8080 \
-e OPENAI_API_BASE_URL="https://llm.stg.meshpool.ai/v1" \
-e OPENAI_API_KEY="sk-…" \
-v open-webui:/app/backend/data \
--name open-webui --restart always \
ghcr.io/open-webui/open-webui:mainpip
Requires Python 3.11. Serves http://localhost:8080.
pip install open-webui
OPENAI_API_BASE_URL="https://llm.stg.meshpool.ai/v1" \
OPENAI_API_KEY="sk-…" \
open-webui serveAlready running
- Create a personal key (see Get a key) and copy the
sk-…secret. - Sign in as the first Open WebUI account — that user is the admin.
- Open Admin Panel → Settings → Connections.
- Enable the OpenAI connection. Set API Base URL to
https://llm.stg.meshpool.ai/v1. Keep/v1; do not append/chat/completions. Paste the MeshPool key as API Key. - Save, refresh the model list, and pick a MeshPool alias (
meshpool-fast,meshpool-balanced,meshpool-max, or a named alias).
Continue
Continue is an OpenAI-compatible client. Paste the model list into ~/.continue/config.json (or your project config) with the /v1 base URL. The snippet includes every chat alias; delete rows you do not want. Image models are omitted.
- Create a personal key and copy the
sk-…secret. - Open
~/.continue/config.json. - Add a model entry with
providerset toopenai,apiBaseset tohttps://llm.stg.meshpool.ai/v1, andmodelset to a MeshPool alias — notopenai/….
{
"models": [
{ "title": "MeshPool Fast", "provider": "openai", "model": "meshpool-fast", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "MeshPool Balanced", "provider": "openai", "model": "meshpool-balanced", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "MeshPool Max", "provider": "openai", "model": "meshpool-max", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "DeepSeek-V4-Flash-0731", "provider": "openai", "model": "deepseek-v4-flash-0731", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Kimi K3", "provider": "openai", "model": "kimi-k3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GLM 5.2", "provider": "openai", "model": "glm-5.2", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Kimi K2.7 Code", "provider": "openai", "model": "kimi-k2.7-code", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "MiniMax M3", "provider": "openai", "model": "minimax-m3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Qwen3.7 Plus", "provider": "openai", "model": "qwen3.7-plus", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "DeepSeek-V4-Pro", "provider": "openai", "model": "deepseek-v4-pro", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Kimi K2.6", "provider": "openai", "model": "kimi-k2.6", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "MiniMax M2.7", "provider": "openai", "model": "minimax-m2.7", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Qwen3.7 Max", "provider": "openai", "model": "qwen3.7-max", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Qwen3.6 Plus", "provider": "openai", "model": "qwen3.6-plus", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemma 4 26B A4B IT", "provider": "openai", "model": "gemma-4-26b-a4b-it", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemma 4 31B IT", "provider": "openai", "model": "gemma-4-31b-it", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GLM 5.1", "provider": "openai", "model": "glm-5.1", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Qwen3.5 397B A17B", "provider": "openai", "model": "qwen3.5-397b-a17b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Kimi K2.5", "provider": "openai", "model": "kimi-k2.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "DeepSeek V3.2", "provider": "openai", "model": "deepseek-v3.2", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-4o", "provider": "openai", "model": "gpt-4o", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-4o mini", "provider": "openai", "model": "gpt-4o-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-4.1", "provider": "openai", "model": "gpt-4.1", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-4.1 mini", "provider": "openai", "model": "gpt-4.1-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-4.1 nano", "provider": "openai", "model": "gpt-4.1-nano", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5", "provider": "openai", "model": "gpt-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5 mini", "provider": "openai", "model": "gpt-5-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5 nano", "provider": "openai", "model": "gpt-5-nano", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.1", "provider": "openai", "model": "gpt-5.1", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.2", "provider": "openai", "model": "gpt-5.2", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.4", "provider": "openai", "model": "gpt-5.4", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.4 mini", "provider": "openai", "model": "gpt-5.4-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.4 nano", "provider": "openai", "model": "gpt-5.4-nano", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.5", "provider": "openai", "model": "gpt-5.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.6 Sol", "provider": "openai", "model": "gpt-5.6-sol", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "o1", "provider": "openai", "model": "o1", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "o3", "provider": "openai", "model": "o3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "o3-mini", "provider": "openai", "model": "o3-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "o4-mini", "provider": "openai", "model": "o4-mini", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Grok 4.3", "provider": "openai", "model": "grok-4.3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Opus 5", "provider": "openai", "model": "claude-opus-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Opus 5 Fast", "provider": "openai", "model": "claude-opus-5-fast", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Fable 5", "provider": "openai", "model": "claude-fable-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Opus 4.8", "provider": "openai", "model": "claude-opus-4.8", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Opus 4.8 Fast", "provider": "openai", "model": "claude-opus-4-8-fast", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Opus 4.7", "provider": "openai", "model": "claude-opus-4.7", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Opus 4.7 Fast", "provider": "openai", "model": "claude-opus-4-7-fast", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Opus 4.6", "provider": "openai", "model": "claude-opus-4.6", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Opus 4.5", "provider": "openai", "model": "claude-opus-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Sonnet 5", "provider": "openai", "model": "claude-sonnet-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Sonnet 4.6", "provider": "openai", "model": "claude-sonnet-4.6", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Sonnet 4.5", "provider": "openai", "model": "claude-sonnet-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Claude Haiku 4.5", "provider": "openai", "model": "claude-haiku-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.6 Terra", "provider": "openai", "model": "gpt-5.6-terra", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.6 Luna", "provider": "openai", "model": "gpt-5.6-luna", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.5 Pro", "provider": "openai", "model": "gpt-5.5-pro", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.4 Pro", "provider": "openai", "model": "gpt-5.4-pro", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.3 Codex", "provider": "openai", "model": "gpt-5.3-codex", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-5.2 Codex", "provider": "openai", "model": "gpt-5.2-codex", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GPT-OSS 120B", "provider": "openai", "model": "gpt-oss-120b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 3.7 Flash", "provider": "openai", "model": "gemini-3.7-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 3.6 Flash", "provider": "openai", "model": "gemini-3.6-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 3.1 Pro", "provider": "openai", "model": "gemini-3.1-pro", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 3.1 Pro Preview", "provider": "openai", "model": "gemini-3.1-pro-preview", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 3.1 Flash Lite", "provider": "openai", "model": "gemini-3.1-flash-lite", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 3.5 Flash", "provider": "openai", "model": "gemini-3-5-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 3 Flash Preview", "provider": "openai", "model": "gemini-3-flash-preview", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 3.5 Flash Lite", "provider": "openai", "model": "google/gemini-3.5-flash-lite", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Gemini 2.5 Flash", "provider": "openai", "model": "gemini-2.5-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GLM 5.3", "provider": "openai", "model": "glm-5.3", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GLM 5", "provider": "openai", "model": "glm-5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GLM 4.7", "provider": "openai", "model": "glm-4.7", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GLM 4.6", "provider": "openai", "model": "glm-4.6", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GLM 4.5", "provider": "openai", "model": "glm-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "GLM 4.5 Air", "provider": "openai", "model": "glm-4.5-air", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Qwen 3.8 Max", "provider": "openai", "model": "qwen-3-8-max", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Qwen3.6 27B", "provider": "openai", "model": "qwen3.6-27b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Qwen3.5 35B A3B", "provider": "openai", "model": "qwen3-5-35b-a3b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Qwen3.6 35B A3B", "provider": "openai", "model": "qwen3-6-35b-a3b", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "DeepSeek-V4-Flash", "provider": "openai", "model": "deepseek-v4-flash", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "DeepSeek-V4-Pro-0813", "provider": "openai", "model": "deepseek-v4-pro-0813", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Grok 4.5", "provider": "openai", "model": "grok-4.5", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Aion 2.0", "provider": "openai", "model": "aion-labs.aion-2-0", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Muse Spark 1.2", "provider": "openai", "model": "muse-spark-1.2", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" },
{ "title": "Stealth OX Alpha", "provider": "openai", "model": "stealth/ox-alpha", "apiBase": "https://llm.stg.meshpool.ai/v1", "apiKey": "sk-…" }
]
}
aider
aider uses the OpenAI-compatible path. Export the base URL and key, then prefix the MeshPool alias with openai/ so aider knows which protocol to speak.
- Export the two variables below in the shell where you run aider.
- Launch aider with
--model openai/meshpool-maxor a named alias such as--model openai/claude-opus-5. Theopenai/prefix is aider's driver name, not part of the MeshPool alias.
export OPENAI_API_BASE="https://llm.stg.meshpool.ai/v1"
export OPENAI_API_KEY="sk-…"
aider --model openai/meshpool-maxOpenAI SDKs
Both official SDKs take a base_url / baseURL. Nothing else changes. Streaming, tool calling, and JSON mode work as they do against OpenAI, subject to what the underlying model supports.
Python
from openai import OpenAI
client = OpenAI(
api_key="sk-…", # or os.environ["MESHPOOL_API_KEY"]
base_url="https://llm.stg.meshpool.ai/v1",
)
response = client.chat.completions.create(
model="meshpool-balanced",
messages=[{"role": "user", "content": "Say hello"}],
)
print(response.choices[0].message.content)Node / TypeScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MESHPOOL_API_KEY,
baseURL: "https://llm.stg.meshpool.ai/v1",
});
const response = await client.chat.completions.create({
model: "meshpool-balanced",
messages: [{ role: "user", content: "Say hello" }],
});
console.log(response.choices[0].message.content);LangChain, LlamaIndex, and similar libraries follow the same pattern: set the OpenAI base URL to https://llm.stg.meshpool.ai/v1, paste the key where the library asks for an OpenAI API key, and pass a MeshPool alias as model.
curl
Use this as a first check whenever a tool misbehaves. A 200 here means the key, URL, and alias are fine — look at the client config next.
curl -sS https://llm.stg.meshpool.ai/v1/chat/completions \
-H "Authorization: Bearer sk-…" \
-H "Content-Type: application/json" \
-d '{"model":"meshpool-fast","messages":[{"role":"user","content":"say ok"}]}'List every alias this key is allowed to call:
curl -s https://llm.stg.meshpool.ai/v1/models \
-H "Authorization: Bearer sk-…" | jq -r '.data[].id' | sortModes and named aliases
The model field must be a MeshPool alias, not a raw vendor model id. Your key can only call aliases your administrator has enabled. A 403 with key_model_access_denied means the name is real but not on the workspace allowlist. Enabling it under Model policy takes effect on existing keys — you do not need to mint a new one.
Three aliases route by intent rather than naming a specific model, so you keep working when MeshPool updates the default behind the tier:
| Alias | Use for |
|---|---|
meshpool-fast | High-volume, latency-sensitive work. Cheap. A good default for background tasks. |
meshpool-balanced | General coding and reasoning. Everyday work. |
meshpool-max | Hard problems where quality matters more than cost. |
Named chat aliases are in the OpenCode, OpenWork, Continue, and Cursor snippets above. Open WebUI loads the same list from /v1/models. Use a named model when you care about that model's behaviour; use a mode when you want MeshPool to pick the current default for that tier. Image aliases are listed separately under Image models.
Ask the key what it can reach — that list is always authoritative:
curl -s https://llm.stg.meshpool.ai/v1/models \
-H "Authorization: Bearer sk-…" | jq -r '.data[].id' | sortImage models
Aliases such as nano-banana, gpt-image-2, and grok-imagine are image generation, not chat. They speak POST /v1/images/generations. They will not work as the model in Cursor Chat, Agent, Composer, Android Studio Chat or Agent, OpenCode, OpenWork, Open WebUI chat, Continue, aider, or /v1/chat/completions.
Budgets, limits, and revoke
Requests made with an API key are treated like chat requests:
- They count against your seat budget. Chat and API usage share one monthly cap. Spending it in Claude Code means you cannot spend it in chat.
- Minting more keys does not raise your budget. Ten keys share one allowance.
- Your rate limits apply. Requests-per-minute and tokens-per-minute ceilings on your seat apply to API traffic too.
- Usage is attributed to you. It appears in workspace usage reports and invoices under your name, alongside chat.
- Workspace model policy applies. A key can only call models your administrator has enabled.
- Guardrails and residency apply the same way they do in chat.
When you exhaust your budget the gateway returns 429. That is not a bug in your client — top up, or ask an administrator to raise your seat cap.
Rotating and revoking
Revoke a key from the chat API keys dialog or from Account → API keys. It stops working immediately, everywhere.
Rotate by creating the replacement first, updating your tool, then revoking the old key. There is no overlap penalty — both are valid until you revoke. Revoke immediately if a key was committed to a repository, pasted into a chat or ticket, or lived on a machine you no longer control. Revoking an API key does not sign you out of chat; they are separate credentials by design.
Troubleshooting
Start here. This single command distinguishes a bad key from a bad client config:
curl -sS https://llm.stg.meshpool.ai/v1/chat/completions \
-H "Authorization: Bearer sk-…" \
-H "Content-Type: application/json" \
-d '{"model":"meshpool-fast","messages":[{"role":"user","content":"say ok"}]}'| Symptom | Cause | Fix |
|---|---|---|
401 Unauthorized | Key is wrong, revoked, or has stray whitespace. | Re-copy it. Check you did not paste a trailing newline. |
400 naming the model, or 403 key_model_access_denied | The alias is missing or not on your key's allowlist. | Run the /v1/models call above and use a name from it, or ask an admin to enable the alias. |
429 with a budget message | Seat budget exhausted. | Top up, or ask an admin to raise your cap. |
429 without a budget message | RPM/TPM ceiling hit. | Back off and retry; ask an admin if it is persistent. |
404 on an unexpected path | That endpoint is not exposed on the public gateway. | Use one of the supported endpoints. |
| Claude Code 404s on every turn | ANTHROPIC_BASE_URL has a trailing /v1, so requests go to /v1/v1/messages. | Drop the /v1; Claude Code appends its own path. |
| Cursor Verify hangs | HTTP/2 compatibility with the custom base URL. | Set Network → HTTP Compatibility Mode to HTTP/1.1. |
| Cursor picker missing a model | Cursor does not import /v1/models. | Add the alias with Add Custom Model. Prefer meshpool-fast / meshpool-balanced / meshpool-max first. |
| Android Studio Refresh is empty | Wrong URL, missing /v1, or the key cannot list models. | Use https://llm.stg.meshpool.ai/v1, re-paste the key, then Refresh again. Confirm the curl models call returns aliases. |
| No Model Providers menu | This Android Studio build does not include remote providers. | Update to a current Android Studio with Tools → AI → Model Providers. |
| OpenCode picker missing MeshPool | Custom providers do not import /v1/models, or the provider id does not match. | List every chat alias under models in opencode.json (the snippet on this page). The /connect provider id must be meshpool. |
| OpenWork picker missing MeshPool | The custom provider was not added, the base URL is missing /v1, or the provider id does not match. | Use Settings → AI → Connect provider → Add custom provider with id meshpool and base URL https://llm.stg.meshpool.ai/v1, or paste the OpenCode models map into <workspace>/.config/opencode/opencode.json. |
| Open WebUI model list is empty | Missing /v1, key cannot list models, or the connection still points at the default OpenAI host. | Set OPENAI_API_BASE_URL / API Base URL to https://llm.stg.meshpool.ai/v1, re-paste the key, then refresh models. |
| Connection refused or DNS failure | The gateway host does not resolve from your network. | Confirm you can reach https://llm.stg.meshpool.ai. If it fails from the company network, write support@meshpool.ai. |
Still stuck? Email support@meshpool.ai, or get a demo.
