Point Dify at kenari
Your canvas is built and the nodes are wired, so the last step is picking a model. Model Provider only lists providers Dify knows about, and kenari is not one of them.
Dify can read from any OpenAI-compatible endpoint, and so can Flowise. In either one you change three values: API Key takes your kn-, API Base URL points at kenari, and Model Name takes an id ending in :free.
n8n has its own post at Point n8n at kenari, and coding editors like Claude Code, Codex, and OpenCode live in Point your editor at kenari. This one is Dify, with Flowise at the end.
Dify has no “Kenari” card
Models in Dify come from a provider, never from a node you drop on a canvas, and kenari has no official plugin in that list. What you reach for instead is Dify’s own OpenAI-API-compatible plugin (langgenius/openai_api_compatible on the Marketplace), the same card people point at LM Studio, llama.cpp, or any gateway that imitates OpenAI.
Current Dify docs file it under Integrations → Model Provider, while older builds call it Settings → Model Providers. Either way you want the OpenAI-API-compatible card, then Add Model.
One thing not to do: fill the native OpenAI card with a gpt-4 id and expect kenari to accept it. Catalog ids here are different, and the compatible plugin is the one that takes a model name exactly as typed.
The fields that actually exist
The fields we touch, read off the current OpenAI-API-compatible plugin schema:
| Field | Required | Value for kenari |
|---|---|---|
| Model Name | yes | an id exactly as GET /v1/models spells it, e.g. step-3-7-flash:free |
| API Key | for kenari: yes | kn-... from the kenari dashboard |
| API Base URL | yes | https://kenari.id/v1 |
| Completion mode | no, default Chat | Chat, since kenari chat lives at /v1/chat/completions |
| model name for API endpoint | no | leave blank, or repeat the same id |
| Function Call Type | no, default Not Support | first chat test: leave it. Dify Agent: Tool Call |
| Compatibility mode | no, default strict | OpenAI compatible |
The plugin arrives with https://api.openai.com/v1 as the placeholder, so replace the whole value rather than editing around it. Do not append /v1 to a URL that already ends in one, because https://kenari.id/v1/v1/... usually comes back 405.
Whatever you type there, the plugin adds a path behind it (/chat/completions in Chat mode) and sends the header as Authorization: Bearer <API Key>, which is exactly kenari’s format.
Leave the rest (context size, thinking, vision, stream usage) on Dify defaults for the first test. Web Search Support is the one switch to keep off, since it describes another provider’s tool shape, not a kenari server tool.
Three values, then attach the app
1. A kn- key
Sign in to the dashboard, open API keys, and click Create key. The key starts with kn- and is shown exactly once, so copy it right away. One key covers every model and both protocols, and it belongs in the API Key field, not in your app prompt.
2. API Base URL
https://kenari.id/v1
That is a straight swap for https://api.openai.com/v1, and Dify appends /chat/completions behind it on its own.
3. A :free model
Model Name is a text field, not a dropdown of GPT names, so you type the id yourself. For a test with no balance, step-3-7-flash:free works: when we checked, that id sat in the catalog with pricing.free: true and tool_call: true, and that flag matters later if you move on to an Agent.
The list shifts, so memorizing it is wasted effort. Check it yourself:
curl https://kenari.id/v1/models
Look for an id ending in :free, or pricing.free: true. How to choose between them, and how a free id differs from PAYG or BYOK, is in Try a free model first.
Put it in Dify
- Open Integrations → Model Provider, or Settings → Model Providers on an older UI.
- Install OpenAI-API-compatible from the Marketplace if it is missing, then open the card and hit Add Model.
- Model type: LLM. Model Name:
step-3-7-flash:free. - API Key:
kn-.... API Base URL:https://kenari.id/v1. Completion mode: Chat. - Save. If Dify validates the key against that endpoint, a 200 means the Base URL and key already reached the gateway.
- Open a Chatbot, Chatflow, or Agent app, pick that model on the LLM node, and send one message. If it replies, the card is set up correctly.
Other apps in the workspace on that same model move with it, so there are no nodes to replace.
If the app is an Agent and the model has to call Dify tools, set Function Call Type to Tool Call, then confirm the id carries tool_call: true in GET /v1/models. A plain chat test needs none of that.
Knowledge base later
Dify Knowledge wants a separate embedding model, and a bare GET /v1/models only lists chat, so embeddings need a filter:
curl "https://kenari.id/v1/models?modality=embedding"
The ids that come back (when we checked: bge-m3, qwen3-embedding-0.6b, and similar) are not :free, so an embedding request on an empty balance is 402. Leave indexing for the second pass and keep the first one on chat LLM.
The same plugin can add a Text Embedding or Rerank card. For LLM the Base URL is https://kenari.id/v1, and the langgenius/openai_api_compatible source we read appends /embeddings to the Base URL as typed, without slipping in a second /v1. Some plugin guides, a Marketplace example among them, still tell you to drop the /v1 on non-LLM cards. If your path doubles up and 405 comes back, check the plugin version on that card, and do not carry that workaround over to the LLM card.
Flowise: Base Path, not a plugin
Flowise has no provider card to install. You drag in a ChatOpenAI node instead, and the custom URL goes under Additional Parameters → Base Path, the field Flowise documents for OpenRouter or Together.
| Field | Value for kenari |
|---|---|
| Credential (OpenAI API) | kn-... |
| Model Name | step-3-7-flash:free, typed by hand, not from the GPT dropdown |
| Base Path | https://kenari.id/v1 |
| Base Options | leave empty |
- Drag in ChatOpenAI, then Connect Credential → Create New and paste your
kn-.... - Open Additional Parameters and set Base Path to
https://kenari.id/v1. - For Model Name, type the kenari id. If the dropdown refuses a string it does not know, switch to ChatOpenAI Custom, the node Flowise provides for names outside the OpenAI list.
- Attach it to an LLM Chain or an Agent, then run it once. A reply means the Base Path and the credential are both right.
Leave Base Options empty, since kenari asks for no extra headers, and if an Organization ID field turns up on the credential, leave that blank too.
If you get stuck
- Dify validation goes red, or you get
401: the key is wrong, truncated, or still ansk-, so copykn-...again. kenari returns401as plain text, not JSON, so there is no error object to dig through. model_not_found: either the id has a typo or Model Name is stillgpt-4. Paste an id exactly asGET /v1/modelsspells it.402 insufficient_balance: a model without:freewhile the balance sits at Rp 0. Switch to a:freeid, or top up first (Pay for tokens with QRIS).405: the Base URL shape is off. For LLM it is exactlyhttps://kenari.id/v1, nothttps://kenari.idand not.../v1/v1.429withfree_quota_rpmorfree_quota_daily: you reached the:freerate limit, so readRetry-Afterand wait it out. The quota numbers live on the pricing page, not in this article, because they change.- A Dify Agent that stays quiet and never fires a tool: Function Call Type is still Not Support. Switch it to Tool Call, and check that the id carries
tool_call: true.
Dify Cloud and self-hosted Dify run the same plugin, and only the field values differ. Flowise works the same way: cloud or self-hosted, Base Path sits under Additional Parameters.