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