Docs

Dyad

Dyad takes any OpenAI-compatible endpoint through Add Custom Provider: three fields, a key on the provider's page, then one row per model id you want in the picker.

Dyad takes any OpenAI-compatible endpoint through Settings → AI Providers → Add Custom Provider: API Base URL https://api.kunavo.com/v1, the key on the provider's own page, then one Add Custom Model row per model id.

Settings → AI Providers → Add Custom Provider
Settings → AI Providers → Add Custom Provider
  ID                  kunavo
  Display Name        Kunavo
  API Base URL        https://api.kunavo.com/v1

Then on the new provider's own page
  Set Kunavo API Key  sk-kn-...            → Save Key

Provider page → bottom → Add Custom Model
  Model ID            claude-sonnet-5
  Name                Claude Sonnet 5 (Kunavo)
  Description         Kunavo, OpenAI-compatible
  Max Output Tokens   128000
  Context Window      1000000
The base URL keeps its /v1 — but not because the documentation says so. The custom-models page offers only “You can usually find the API Base URL in the provider's documentation” and shows no example, so it does not settle the question. Two things in the shipping app do: the dialog's own placeholder reads E.g., https://api.example.com/v1, and a custom provider is constructed as an OpenAI-compatible client with your value used as baseURL unchanged — Dyad appends the route, never the /v1. Every OpenAI-compatible endpoint Dyad hard-codes for itself ends the same way. A base URL without it fails as a 404, not as a rejected key.
Two fields are not on the documentation page. The shipping dialog calls the first one Provider ID rather than ID, and adds Environment Variable (Optional) — a variable name such as KUNAVO_API_KEY, read only when no key is saved in settings. The key itself is nowhere in that dialog: create the provider first, open it, and use the Set Kunavo API Key box on its page.
Type the Context Window in; do not leave it blank. Dyad's only warning is that blank fields fall back to “default values, which may be smaller than optimal”. The shipping default is 128,000 tokens, and Dyad compacts a conversation at the lower of a per-provider ceiling and your context window minus 25,000. A custom provider is stored under a custom:: id, so it takes neither the Google nor the OpenAI ceiling but the 250,000 one. Left blank, a million-token model therefore starts summarising at 103,000 tokens instead of 250,000 — more compaction passes over the same work, for nothing.
This configuration was read off Dyad's own documentation and its shipping source on the date below. Kunavo has not run Dyad against its endpoint — not a build, not a streamed edit, not an Agent-mode tool round-trip — and the same is true of every client in this family. A published setup page is not a compatibility test. Keep whatever route you have working available while you try this one, and run one bounded feature before you move a project onto it.
Kunavo serves no embedding, text-to-speech or speech-to-text model, so a custom provider added this way answers chat completions and nothing else. Nothing in Dyad's build loop asks for the other three, so this costs you no feature here — it only means the provider you just added is not a drop-in for a stack that also wants them.

Step by step

  1. Create a key at /app/keys and copy it — it is shown once.
  2. In Dyad, go to Settings, find the AI Providers section and click Add Custom Provider. Fill in ID, Display Name and API Base URL as above. The ID is “used internally and cannot be changed later”, so pick something you can live with; the Display Name is what shows in the picker and is cosmetic.
  3. Open the provider you just created and paste the key into Set Kunavo API Key, then Save Key. Leave the base URL empty and Dyad refuses the request outright with a missing the API Base URL error rather than a network failure.
  4. On that same page, scroll to the bottom and click Add Custom Model. The Model ID must be the catalog slug exactly — Dyad's docs say it “must match exactly what's specified in the provider's API documentation. It's the identifier sent to the API” — so claude-sonnet-5, not a display name.
  5. Fill in Max Output Tokens and Context Window from /models rather than leaving them blank, then repeat Add Custom Model for each id you want in the picker — there is no bulk import and no fetched list here.
  6. Pick the new model in the model picker and give it a real task — a component to add, not a greeting. Build mode is an agentic loop that re-sends a working set each step, so streaming and repeated edits are what a first run should exercise.

Checked against Dyad's Custom Models 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 the Dyad pricing and API-cost guide.

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 Dyad.

# 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 Dyad
claude-sonnet-5$2.00 / $10.00the default Build-mode model — coding quality per dollar on a loop that runs all day
claude-opus-5$2.00 / $10.00Plan mode on a refactor where a wrong plan costs a whole session
claude-haiku-4-5$0.40 / $2.00Ask mode and quick questions about the codebase, where volume dominates
gpt-5-6-sol$2.00 / $12.00a second opinion from another family — add it as a second custom model, same provider
gemini-3-1-pro$0.70 / $4.20a large working set, once the Context Window field is filled in properly
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.

Three boundaries to know before you switch

These are Dyad's own rules, not Kunavo's, and each one changes what a customer key can reach. They are the reason this page describes a route to the models rather than to all of Dyad.

  1. Pro modes cannot be reached with your own key, by design. Dyad's pricing FAQ answers it flatly: Pro modes like Smart Context can only be used with Dyad Pro's AI credits, not with your own API keys, because they need server-side processing across several models. Turbo Edits is the other one. A custom provider gets you the models and the ordinary modes, not that machinery.
  2. Agent mode is rationed on the free plan. The cap is 20 Agent messages per 23-hour window and it applies no matter whose key you configure — Build, Ask and Plan are uncapped. So an unexpected stop mid-session may be Dyad's quota rather than anything about your balance or your endpoint.
  3. The Anthropic Messages protocol is not reachable from Dyad. A custom provider is always built as an OpenAI chat-completions client, and the built-in Anthropic provider takes no base-URL override. Claude models therefore arrive here over the OpenAI-compatible surface — which is what the setup above does, and why the verify request on this page is the OpenAI-shaped one.

FAQ

How do I add a custom API provider to Dyad?

Go to Settings, find the AI Providers section and click Add Custom Provider. Fill in an ID, which is used internally and cannot be changed later, a Display Name for the picker, and the API Base URL of your endpoint. Save it, then open the provider you just created and paste your key into the "Set <name> API Key" box on its page — the key is not part of the creation dialog. Finally, scroll to the bottom of that page and use Add Custom Model once per model id you want available. Dyad's documentation states the requirement on the endpoint side in one line: any provider works as long as it offers an OpenAI-compatible API.

Does Dyad's API Base URL need /v1 at the end?

For an OpenAI-compatible endpoint, yes — for example https://api.kunavo.com/v1. Dyad's Custom Models documentation does not settle this: it only says you can usually find the API Base URL in the provider's documentation, and shows no example. What settles it is the dialog itself, whose placeholder reads "E.g., https://api.example.com/v1", and the way Dyad builds the client — your value becomes the baseURL of an OpenAI-compatible client unchanged, with only the route appended. A base URL missing the /v1 fails as a 404 rather than as an authentication error, and one that already includes /chat/completions fails the same way.

Can I use Dyad with Claude models without an Anthropic account?

Yes, through a custom provider rather than through Dyad's built-in Anthropic entry. Dyad builds every custom provider as an OpenAI chat-completions client, so the model id you type is resolved at whatever endpoint you configured rather than in the app, and a Claude id is a valid thing to send there. The built-in Anthropic provider is the one that cannot help: it is constructed with no base-URL argument, so there is no ANTHROPIC_BASE_URL-style override and it reaches Anthropic's own endpoint and nothing else.

Is a custom provider in Dyad different from using OpenRouter?

Only in setup, not in kind. OpenRouter is the one independent multi-vendor gateway with a built-in preset in Dyad's provider list, so it needs a key and nothing else; every other gateway arrives through Add Custom Provider, where you also type each model's id, Max Output Tokens and Context Window by hand. Dyad's maintainer pointed at exactly that route when one gateway asked to be added as a preset. Compare the two on price, on funding terms and on which models you actually want, not on which one has a logo in the list.

Why does my Dyad custom model start summarising the conversation so early?

Because the Context Window field was probably left blank. Dyad falls back to 128,000 tokens when it is empty and compacts at the lower of a per-provider ceiling and the context window minus 25,000 — and a custom provider takes the 250,000 ceiling, not the Google or OpenAI one. Blank therefore means compaction starts around 103,000 tokens even on a model with a much larger window. Type the real numbers from the provider's catalog into Max Output Tokens and Context Window and the threshold moves to the ceiling instead.