Docs

Copilot for Obsidian

Copilot's BYOK tab takes a custom OpenAI-compatible provider in three fields. Which surfaces the resulting models reach is the part the documentation is precise about, and this page keeps that precision rather than promising the whole plugin.

Settings → Copilot → BYOK → Add a custom provider: a Display name, your key and https://api.kunavo.com/v1 — Quick Chat always, Agent Chat under opencode when the provider is shown there.

Settings → Copilot → BYOK → Add a provider → Add a custom provider
Display name             Kunavo
API key                  sk-kn-...
Base URL                 https://api.kunavo.com/v1
Enable CORS              off — see the note below before turning it on
Model ID → Add           claude-sonnet-5
                         claude-haiku-4-5
Search available models  discovery reads GET /v1/models; typed ids also work
Save                     needs at least one model and a routable endpoint
The base URL keeps the /v1 suffix here, and the documentation settles that by example rather than by sentence: it says only that "A custom OpenAI-compatible provider must have a Base URL", but both OpenAI-compatible templates it ships default to a URL ending in /v1 http://localhost:11434/v1 for Ollama and http://localhost:1234/v1 for LM Studio — and it adds that "Model discovery uses the endpoint's /v1/models response". If discovery comes back empty, that pair is the first thing to re-read.
A BYOK provider does not reach every corner of the plugin, and the documentation is blunt about it: "Adding a key does not change the models supplied by Claude Code or Codex." Its own table gives BYOK models to Quick Chat outright and to Agent Chat only under the opencode backend, "when the provider is shown there" — a condition, not a rule, and "A model that opencode cannot route is left out of the opencode list, but may still work in Quick Chat." If you run the Claude or Codex backend, the lever is that CLI's own environment instead: see /docs/integrations/claude-code.
Enable CORS is a trade, not a fix to leave on. The documentation: "If Test succeeds but Quick Chat cannot send a message, edit the provider and turn on Enable CORS. Responses then appear after completion instead of streaming token by token." It also notes the switch does not change opencode routing, so turning it on to repair Quick Chat costs you token-by-token output there and nowhere else.
Copilot 4.x asks for no embedding provider: its semantic search moved to Miyo, a separate service, and the BYOK dialog has no such field — which is just as well, because Kunavo serves no embedding model and this page will not imply one.
Kunavo has not runtime-tested this plugin. Every field and quotation above was read off Copilot's own documentation on the date below; a published setup page is not a test run. Send one real task through Quick Chat before you move a workflow onto it.

Step by step

  1. Create a key at /app/keys and copy it — it is shown once.
  2. In Obsidian, open Settings → Copilot → BYOK and click Add a provider.
  3. Choose Add a custom provider rather than a named provider or a Self Host template.
  4. Fill in Display name, API key and Base URL as above. Leave Enable CORS off for now.
  5. Add at least one model — either type an id under Model ID → Add or pick from Search available models, which is filled from GET /v1/models. Click Test, then Save; saving is blocked until a model and a routable endpoint are both present.
  6. Curate where those models show up under Basic → Agents → Quick Chat and Basic → Agents → opencode, each with its own Default model. New chat models are enabled for both by default.

Checked against Copilot's Model Sources and BYOK page on September 21, 2026. Third-party settings move; if a field name here no longer matches what you see, that page is the authority, not this one.

This is the short version. The full walkthrough — model choice, what a real session costs, and the failure modes — is in which Copilot backend actually pays for the tokens.

Verify before you debug the client

One request settles whether a failure is the endpoint, the key, or the configuration file. If this returns JSON, the same base URL and key work in Copilot for Obsidian.

# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/models \
  -H "Authorization: Bearer sk-kn-..."

Which model id to put in the field

Every text model is reachable as a model id — the live list is GET /v1/models, and the catalog with prices is on the models page. Rates are USD per 1M tokens, input / output.

Model idKunavo in / outWhere it fits in Copilot for Obsidian
claude-haiku-4-5$0.40 / $2.00Quick Chat, where short asks against a note run all day
claude-sonnet-5$2.00 / $10.00the opencode backend in Agent Chat — the default working model
claude-opus-5$2.00 / $10.00long synthesis across many notes, where a wrong reading is expensive
gpt-5-6-sol$2.00 / $12.00a second opinion from another family, same key and same provider row
Billing is per token from a prepaid balance with no monthly fee — see billing. On repeated context — which is most of what an editor or a chat client sends — prompt caching moves the bill more than the model choice does.

FAQ

Where do I put an API key in Obsidian Copilot?

Settings → Copilot → BYOK → Add a provider, then "Add a custom provider" for an endpoint that is not in the built-in list. The dialog takes a Display name, the API key, a Base URL, an optional Enable CORS switch, and at least one model added by id or picked from the discovered list, then Save. Copilot's documentation says provider keys are stored in that device's Obsidian Keychain rather than the vault's data.json, so syncing a vault does not carry the credential to another computer.

Does the Obsidian Copilot base URL need /v1 at the end?

Use the /v1 form — https://api.kunavo.com/v1 for Kunavo. The documentation does not state the rule in a sentence; it states that a custom OpenAI-compatible provider must have a Base URL, that model discovery uses the endpoint's /v1/models response, and that the two OpenAI-compatible templates it ships default to http://localhost:11434/v1 and http://localhost:1234/v1. Both shipped defaults carry the suffix, which is the strongest thing the docs say on it. A wrong base URL usually shows up as an empty model list or a failed Test rather than as an authentication error.

Can Obsidian Copilot use a gateway like OpenRouter or Kunavo instead of a vendor key?

Yes for Quick Chat, and conditionally for Agent Chat. Copilot's own documentation describes BYOK as connecting "directly to an AI provider, a compatible gateway, or a model server on your computer", and "Add a custom provider" takes any OpenAI-compatible base URL plus a model id. Its model-source table then gives BYOK models to Quick Chat outright and to Agent Chat under the opencode backend only, "when the provider is shown there". The Claude and Codex backends never take a BYOK key at all — the documentation says adding a key does not change the models they supply.

Do I need an embedding model for Obsidian Copilot's vault search?

Not from your chat provider. Copilot 4.x no longer runs its own in-plugin index: the documentation says semantic search and Relevant Notes are supplied by Miyo, a separate local-or-remote service, and the BYOK dialog has no field for that kind of model. Kunavo serves no embedding model either, so nothing here should be read as offering one — a chat provider row in Copilot pays for chat and nothing else.

Does a Kunavo key replace a Copilot Lite or Plus licence?

No, and the two are separate lines on purpose. Copilot's documentation treats a licence and BYOK as different model sources: a licence supplies Copilot-hosted models billed by Brevilabs against your plan, while BYOK sends requests to your own endpoint with billing staying at that provider. A key here does not refill a licence allowance, does not unlock the locked Copilot-hosted rows, and does not change the licence-gated services; conversely you can run BYOK on the free tier with no licence at all.