Continue.dev: connecting to the gateway

Continue.dev is configured through a config.yaml file rather than a settings form, which is exactly how a stale apiBase or an extra slash survives unnoticed. Here is a working config.

4 min · · Updated · IDE

Continue.dev is a VS Code and JetBrains extension configured through a config.yaml file rather than a settings form. That's convenient for versioning your config, but it also creates its own class of bug: a leftover apiBase from a previous provider can silently break every request.

Where the config lives

Open Continue → gear icon → Open Assistant Configuration, or find the file directly: ~/.continue/config.yaml. Models are defined as a list under the models section.

Anthropic provider

bash
models:
  - name: Claude Opus 5.5
    provider: anthropic
    model: claude-opus-5-5
    apiKey: fetch_your_key
    apiBase: https://api.zukko.pro/v1/

For the Anthropic provider, apiBase includes /v1/ (with the trailing slash): Continue only appends messages to it and adds the anthropic-version header itself. Without /v1/, requests miss /v1/messages and come back 404.

OpenAI-compatible provider

bash
models:
  - name: GPT 5.6 Sol
    provider: openai
    model: gpt-5.6-sol
    apiKey: fetch_your_key
    apiBase: https://api.zukko.pro/v1
  - name: GLM 5.3
    provider: openai
    model: glm-5.3
    apiKey: fetch_your_key
    apiBase: https://api.zukko.pro/v1

Here apiBase includes /v1 as well: the openai provider in Continue calls /chat/completions relative to whatever base URL you give it, and doesn't add or strip anything on its own.

You can keep both blocks in one config.yaml and switch between models right in the Continue UI without touching the file.

Testing the key outside Continue

If Continue stays silent after you save the config, hit the key directly:

bash
curl https://api.zukko.pro/v1/messages \
  -H "Authorization: Bearer fetch_your_key" \
  -H "Content-Type: application/json" \
  -H "anthropic-version: 2023-06-01" \
  -d '{"model":"claude-sonnet-5","max_tokens":64,"messages":[{"role":"user","content":"ping"}]}'

The anthropic-version: 2023-06-01 header is required for /v1/messages — without it the request can be rejected before your fetch_... key is even checked, so a 401 or 400 in that case is about the missing header, not the key.

YAML — a source of silent bugs

Indentation in YAML is significant: if apiKey ends up one level too high or too low, Continue either won't pick up the model at all, or will send the request without a key, in which case you get a 401 about a missing key rather than an invalid one. Check the syntax locally:

bash
python3 -c "import yaml, sys; yaml.safe_load(open('config.yaml'))"

If that command fails, Continue never even gets involved — fix the indentation first.

Reading the errors

  • 401 — key rejected or not sent: {"error":{"message":"Invalid API key. Use Authorization: Bearer fetch_*","type":"authentication_error"}}.
  • 402 — empty balance: {"error":{"message":"Недостаточно средств на балансе","code":"insufficient_balance"}}. The charge is checked before the model is called, so a failed attempt is free.
  • 404 — almost always a missing or extra /v1 in apiBase, less often a typo in model.
  • 400 model_retired — the model has been retired, and the replacement is named directly in the error text.
  • 503 model_disabled — the model is disabled in the catalog; replace it in config.yaml with a current one.
  • 429 — from Zukko this only means a per-key limit (key_daily_limit_reached, which resets at 00:00 UTC, or key_monthly_limit_reached), if you set one on the key's page in the dashboard; the gateway has no general rate limit, and any other 429 comes from the model provider.

The currently available models are claude-opus-5-5, claude-sonnet-5, gpt-5.6-sol, gpt-5.6-luna, glm-5.3 and glm-5.3-flash; the current list is at GET https://api.zukko.pro/v1/models. Prices and limits, no key needed:

bash
curl https://api.zukko.pro/v1/models/info

Unlike /v1/models, this endpoint also returns limits and prices — worth checking before writing a model id into your config.

Extra things worth setting up

For long Continue sessions, response caching helps — there's no direct header field for it in config.yaml, but if the model is called with temperature: 0 (typically true for code autocomplete; this doesn't apply to Claude models, which may reject a temperature other than 1), fully identical requests from the same user (the whole body matches) are cached anyway for up to 7 days, and the repeat answer comes back instantly and free.

On the key's page at https://zukko.pro/app/api-keys you can set a daily or monthly spend cap in dollars and restrict the allowed models list — worth doing right away if the key lives in a config that syncs across multiple machines.

Top up via SBP, a card through PayPear, crypto, or a foreign Mastercard EU card through Fride (about 13% fee, amounts $2–$594); the minimum is $1. A one-time $0.50 bonus is credited for subscribing to the Telegram channel @zukkopro — link Telegram in the dashboard, subscribe, and press "Check" (once per Telegram account). A plain signup carries no starting balance.

For anything else, support is at https://t.me/zukkopro?direct.

Free token counting for the Anthropic model

If config.yaml has a model set up through the anthropic provider, you can check a request's token weight ahead of time without spending anything — the /v1/messages/count_tokens endpoint only counts, it doesn't run the request:

bash
curl https://api.zukko.pro/v1/messages/count_tokens \
  -H "Authorization: Bearer fetch_your_key" \
  -H "Content-Type: application/json" \
  -H "anthropic-version: 2023-06-01" \
  -d '{"model":"claude-sonnet-5","messages":[{"role":"user","content":"the request text"}]}'

Useful when Continue assembles context from several open files at once — you see the final size before sending, not after a context-limit error.

Web search for models that lack it

If the configured model has no built-in web search — say, GLM — and a Continue chat task needs current information, you can call POST /v1/web-search with the same key separately and paste the result into the conversation by hand. It's a standalone endpoint, unrelated to whichever model is set in config.yaml.

If the config is shared across a team

Continue's config.yaml is easy to check into a shared team repo alongside other project settings, so everyone gets the same model list. In that case, set spend limits on the key in the dashboard and check GET /v1/usage — the cursor-paginated charge history (account-wide, covering all keys) shows what the whole team spent, not just you.

zukko

Pay 25×
less

for Claude Code & ChatGPT

One fetch_* key and base URL api.zukko.pro — for Cursor, Claude Code, Codex, and any SDK.

Get API keyDocumentation

api.zukko.pro · fetch_*

Continue.dev: connecting via config.yaml · Zukko