---
title: VS Code extensions
description: Cline, Roo Code and Continue all take the same OpenAI-compatible provider: base URL, key, model ID. Here is where those fields live in each of them.
keywords: vs code, cline, roo code, continue, openai compatible, apiBase, config.yaml
group: integrations
---

## Quick {#quick keywords="openai compatible, base url, key, model"}

All three extensions connect the same way: they understand an "OpenAI-compatible" provider, so they need three values — the address, the key, the model.

```yaml title=Provider
# Cline Roo Code Continue → OpenAI-compatible provider
- name: Kumo
  provider: openai
  apiBase: https://api.kumorouter.com/v1
  apiKey: ${KUMO_API_KEY}
  model: <model>
```

The base URL ends in `/v1` — this is the OpenAI-compatible dialect. Take the model identifier from the [catalog](/en/models): the extension puts it into the request as-is and knows nothing about Kumo's own model list.

## Cline and Roo Code {#cline keywords="cline, roo code, api provider, model id, settings panel"}

Both extensions keep the provider in their own settings panel inside VS Code, and the key in the editor's secret storage. There is no file here worth hand-editing.

:::steps
- **Check what is installed** — `code --list-extensions` shows whether Cline, Roo Code, or both are present.
- **Open the extension's settings** — The provider screen in its panel.
- **API Provider** — Choose "OpenAI Compatible".
- **Base URL** — `https://api.kumorouter.com/v1`.
- **API Key** — Your Kumo key.
- **Model ID** — An identifier from the catalog.
:::

The extensions carry capability toggles — images, computer use, prompt caching. Leave off the ones the chosen model does not support: a toggle that is on adds fields to the request the model is not expecting. What a model can actually do is on its card in the [catalog](/en/models).

Field placement moves between releases. If the screen does not match the description above, go by what you see: the "provider" and "base URL" pair exists in every release.

## Continue {#continue keywords="continue, config.yaml, config.json, models, roles"}

Continue is configured by a file, and the file exists in two formats. Edit the one you **already have**, and do not create a second.

- `~/.continue/config.yaml` — the current format.
- `~/.continue/config.json` — the older format.

The model is **added** to the list rather than replacing it: whatever is already configured stays beside it.

:::code-group
```yaml title=config.yaml
models:
  - name: Kumo
    provider: openai
    model: <model>
    apiBase: https://api.kumorouter.com/v1
    apiKey: <your key>
    roles: [chat, edit, apply]
```
```json title=config.json
{
  "models": [
    {
      "title": "Kumo",
      "provider": "openai",
      "model": "<model>",
      "apiBase": "https://api.kumorouter.com/v1",
      "apiKey": "<your key>"
    }
  ]
}
```
:::

Add a second entry with another model if you want to switch inside Continue without going back to the file.

:::warning
The key sits in that file in plain text. Check whether your Continue release can read the key from an environment variable — if it can, use that. A config file in a version-controlled repository should not carry a key.
:::

## Verify {#verify keywords="verify, curl, reload window"}

You paste the key into the extension itself, while the command below reads it from a shell variable: export the key once in the terminal you verify from.

```bash title=Verify
export KUMO_API_KEY="kumo_sk_..."

curl https://api.kumorouter.com/v1/chat/completions \
  -H "Authorization: Bearer $KUMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model>",
    "max_tokens": 64,
    "messages": [{ "role": "user", "content": "reply with OK" }]
  }'
```

If curl answers, reload the editor window, pick the added model in the extension's chat, send one message, and find the call in the console log.

## When it does not work {#troubleshooting keywords="401, 404, config, model"}

- **401** — the key is wrong, or was never saved in the extension's panel.
- **404** — the base URL is missing the `/v1`, or the extension appends a path of its own; check the request address in the extension's output.
- **Model not found** — the identifier is not from the catalog.
- **Continue ignores your edits** — the wrong file is being edited: you have two config formats and only one is read.
- **The answer is cut off or refused** — a capability toggle is on for a model that lacks it. Turn it off and retry.

> [What a model can do →](/en/models) [Every status the gateway returns →](/en/errors)

:::cards
- [Cursor](/en/cursor) — an editor with its own settings screen.
- [Other tools](/en/other-tools) — Aider, Zed, OpenClaw.
- [Every recipe](/en/integrations) — the overview and the agent prompt.
:::
