Skip to content
PrivateAI
← Back to Home
Local AI Tools

Continue.dev config.json Deep Dive: Multiple Models, Slash Commands, and Context Providers

9 min read min readBy PrivateAI Team

Last updated: 2026-06-15

Most Continue.dev users set it up once, pick a model, and stop there. That's leaving serious capability on the table. The real power is in config.json — where you can run a large model for architectural questions, a blazing-fast small model for autocomplete, pull in documentation on demand, and build slash commands that encode your entire team's standards.

This guide covers the config in full. No cloud required.

Where Your config.json Lives

```

~/.continue/config.json # global (all projects)

/.continue/config.json # per-project (overrides global)

```

Per-project configs are additive — they extend, not replace, your global config. That means your personal model profiles always load, and project-specific context providers layer on top.

Open it directly or via Continue → gear icon → Open config.json in VS Code.

Multiple Model Profiles: The Right Model for the Right Job

The models array is where you define every LLM Continue can reach. You switch between them with Cmd/Ctrl + ' or the model selector dropdown.

```json

{

"models": [

{

"title": "Llama 3.3 70B — Deep Work",

"provider": "ollama",

"model": "llama3.3:70b",

"apiBase": "http://localhost:11434"

},

{

"title": "Qwen 2.5 Coder 7B — Fast Chat",

"provider": "ollama",

"model": "qwen2.5-coder:7b",

"apiBase": "http://localhost:11434"

},

{

"title": "Gemma 3 27B — Long Context",

"provider": "ollama",

"model": "gemma3:27b",

"apiBase": "http://localhost:11434",

"contextLength": 131072

}

]

}

```

Strategy for local hardware:

| Task | Model Size | Why |

|---|---|---|

| Architectural review, refactors | 70B | Quality matters more than speed |

| Quick explanations, small edits | 7B–14B | Fast enough to feel instant |

| Long file analysis, big diffs | 27B+ with large context | Don't truncate the input |

If you have an Apple Silicon Mac, Ollama runs these efficiently on unified memory — a 70B Q4 model fits in 40GB RAM. For NVIDIA setups, VRAM is the constraint: a 24GB card handles 34B Q4 comfortably.

> Hardware recommendation: If you're bottle-necking on local inference speed, RunPod lets you spin up dedicated GPU instances by the hour — useful for one-off heavy tasks without committing to cloud subscriptions permanently.

Affiliate Disclosure: This article may contain affiliate links. If you make a purchase through these links, we may earn a small commission at no extra cost to you. We only recommend products we genuinely believe in. This helps support our work and allows us to continue providing free content.

Splitting Autocomplete and Chat: The Single Best Config Change

Autocomplete fires on every keystroke. Routing it through your 70B model will make it feel like typing through mud. Set a dedicated fast model for autocomplete only:

```json

{

"tabAutocompleteModel": {

"title": "Autocomplete — Qwen Coder 1.5B",

"provider": "ollama",

"model": "qwen2.5-coder:1.5b",

"apiBase": "http://localhost:11434"

},

"tabAutocompleteOptions": {

"useCopyBuffer": false,

"maxPromptTokens": 400,

"prefixPercentage": 0.85,

"multilineCompletions": "auto",

"debounceDelay": 350

}

}

```

Key options explained:

  • maxPromptTokens: 400 — Caps context sent to the autocomplete model. Smaller = faster. 400 is the sweet spot for most completions.
  • prefixPercentage: 0.85 — 85% of the token budget goes to code before the cursor, 15% to code after. Adjust if you find completions ignore upcoming structure.
  • debounceDelay: 350 — Milliseconds to wait after you stop typing before firing. Prevents spamming inference on every character.
  • multilineCompletions: "auto" — Lets the model decide whether to suggest one line or a block. "always" forces blocks; "never" keeps it single-line.

Good autocomplete models that stay snappy on CPU or integrated GPU: qwen2.5-coder:1.5b, deepseek-coder:1.3b, starcoder2:3b.

Context Providers: Teaching Continue What Your Codebase Knows

Context providers define what Continue can pull in when you use @ mentions in chat. The defaults are fine; configuring them turns Continue into something that actually understands your project.

```json

{

"contextProviders": [

{

"name": "code",

"params": {}

},

{

"name": "docs",

"params": {

"sites": [

{

"startUrl": "https://docs.astro.build/en/getting-started/",

"rootUrl": "https://docs.astro.build",

"title": "Astro Docs"

},

{

"startUrl": "https://orm.drizzle.team/docs/overview",

"rootUrl": "https://orm.drizzle.team",

"title": "Drizzle ORM"

}

]

}

},

{

"name": "codebase",

"params": {

"nRetrieve": 25,

"nFinal": 5,

"useReranking": true

}

},

{

"name": "diff",

"params": {}

},

{

"name": "terminal",

"params": {}

},

{

"name": "open",

"params": {

"onlyPinned": false

}

}

]

}

```

What each provider gives you in chat:

  • @code — Highlight a function and reference it directly. Precise, zero ambiguity.
  • @docs — Crawls and indexes the URLs you list. Type @Astro Docs and Continue searches those pages semantically. Index once, query forever.
  • @codebase — Semantic search across your entire repo using embeddings. nRetrieve pulls 25 candidate chunks; nFinal sends only the top 5 to the model (controlled by reranking). More accurate than grep, slower to set up.
  • @diff — Current git diff. Essential for asking "explain what I just changed" or writing commit messages.
  • @terminal — Last terminal output. Paste that stack trace directly without leaving the chat.
  • @open — All currently open editor tabs. Good for cross-file refactors.

Setting Up the Embeddings Provider for @codebase

@codebase requires an embeddings model. For fully local operation:

```json

{

"embeddingsProvider": {

"provider": "ollama",

"model": "nomic-embed-text",

"apiBase": "http://localhost:11434"

}

}

```

Run ollama pull nomic-embed-text first. After enabling, open the Continue panel and click "Index" — it crawls your project once and builds a local vector store under ~/.continue/index/. Re-indexing on file change happens automatically.

For better retrieval quality, add a reranker:

```json

{

"reranker": {

"name": "llm",

"params": {

"modelTitle": "Qwen 2.5 Coder 7B — Fast Chat"

}

}

}

```

This uses your fast chat model to re-score retrieved chunks before sending to the main model. Costs a few extra tokens per query; worth it for large codebases.

Custom Slash Commands: Encoding Your Standards

Slash commands let you create reusable prompts triggered by /commandname in the chat input. These are where team conventions, code review checklists, and personal workflows live.

```json

{

"slashCommands": [

{

"name": "review",

"description": "Review selected code for bugs, edge cases, and style issues",

"prompt": "Review the following code carefully. Flag: (1) potential bugs or edge cases, (2) missing error handling, (3) TypeScript strict mode violations, (4) anything that would fail in production under load. Be direct. List issues as bullets, most critical first. Do not suggest refactors unless they fix a real problem.\n\n{{{ input }}}"

},

{

"name": "doc",

"description": "Write JSDoc for the selected function",

"prompt": "Write a JSDoc comment for this function. Include: @param with types and descriptions, @returns, and one-line @description. Match the style of TypeScript strict mode. Output only the JSDoc block, nothing else.\n\n{{{ input }}}"

},

{

"name": "test",

"description": "Generate Vitest unit tests for selected code",

"prompt": "Write Vitest unit tests for the following code. Use describe/it blocks. Cover: happy path, edge cases, and error conditions. Import from vitest, not jest. Output only the test file content.\n\n{{{ input }}}"

},

{

"name": "commit",

"description": "Write a conventional commit message for the current diff",

"prompt": "Write a conventional commit message for this diff. Format: (): . Types: feat, fix, chore, refactor, docs, test. Subject: imperative, lowercase, no period, under 72 chars. Output only the commit message.\n\n{{{ diff }}}"

}

]

}

```

The {{{ input }}} placeholder inserts either selected code (if you have a selection) or prompts you to type context. {{{ diff }}} pulls the current git diff automatically.

Usage: type /review in the Continue chat box, optionally select code first, press Enter.

Custom Commands (Prompt Templates)

Distinct from slash commands — these appear in the right-click context menu in your editor and can use richer template variables:

```json

{

"customCommands": [

{

"name": "Explain This",

"prompt": "Explain this code to a senior engineer who hasn't seen this part of the codebase. Focus on: what it does, why it's structured this way, and any non-obvious behavior. Keep it under 150 words.\n\n{{{ selectedCode }}}"

},

{

"name": "Fix TypeScript Errors",

"prompt": "The following code has TypeScript errors. Fix them without changing the logic or adding any types. Output only the corrected code.\n\n{{{ selectedCode }}}"

}

]

}

```

Complete Production-Ready config.json

Putting it all together — a full config for a TypeScript monorepo on local hardware:

```json

{

"models": [

{

"title": "Llama 3.3 70B — Deep Work",

"provider": "ollama",

"model": "llama3.3:70b",

"apiBase": "http://localhost:11434",

"contextLength": 32768

},

{

"title": "Qwen 2.5 Coder 7B — Fast Chat",

"provider": "ollama",

"model": "qwen2.5-coder:7b",

"apiBase": "http://localhost:11434",

"contextLength": 32768

}

],

"tabAutocompleteModel": {

"title": "Autocomplete",

"provider": "ollama",

"model": "qwen2.5-coder:1.5b",

"apiBase": "http://localhost:11434"

},

"tabAutocompleteOptions": {

"maxPromptTokens": 400,

"debounceDelay": 350,

"multilineCompletions": "auto"

},

"embeddingsProvider": {

"provider": "ollama",

"model": "nomic-embed-text",

"apiBase": "http://localhost:11434"

},

"reranker": {

"name": "llm",

"params": { "modelTitle": "Qwen 2.5 Coder 7B — Fast Chat" }

},

"contextProviders": [

{ "name": "code", "params": {} },

{ "name": "codebase", "params": { "nRetrieve": 25, "nFinal": 5, "useReranking": true } },

{ "name": "diff", "params": {} },

{ "name": "terminal", "params": {} },

{ "name": "open", "params": {} },

{

"name": "docs",

"params": {

"sites": [

{ "startUrl": "https://www.typescriptlang.org/docs/", "rootUrl": "https://www.typescriptlang.org", "title": "TypeScript" }

]

}

}

],

"slashCommands": [

{

"name": "review",

"description": "Review selected code",

"prompt": "Review for bugs, edge cases, and TypeScript strict violations. Bullets only, most critical first.\n\n{{{ input }}}"

},

{

"name": "test",

"description": "Generate Vitest tests",

"prompt": "Write Vitest tests covering happy path, edge cases, and errors.\n\n{{{ input }}}"

},

{

"name": "commit",

"description": "Write commit message",

"prompt": "Write a conventional commit message for this diff.\n\n{{{ diff }}}"

}

]

}

```

What's Next

The config above runs entirely offline. No telemetry, no cloud sync, no API keys leaving your machine. Your code stays yours.

If you want Continue talking to a mix of local and remote models — say, Claude for hard problems when you're on a deadline and Llama for everything else — the models array handles that too. Just add an anthropic or openai provider entry alongside your Ollama ones and switch per-task.


Want more guides like this delivered to your inbox? We cover privacy-first AI tools, local LLM setups, and developer workflows every week — no surveillance, no spam.

Stay Updated

Local AI setups, privacy tools, and developer workflows. One email, every Monday.


```