A second provider is four fields, and three of them are easy to get wrong
You have OpenRouter working. Read this before you add a second key: the three fields that decide whether a route works at all, why one model answers to two different names, and the seven routes the add-on documents. Treat every model ID here as a versioned example and check the provider's live page before saving.
Start from what is missing, not from a ranking
Part 6 made the case that one configured route can be enough, especially when that route is OpenRouter. So the question here is not which company wins. It is: what is my current route missing?
Nobody opens a second bank account because a magazine ranked the banks. You open one because the first will not do a specific thing you need — a currency, a card, a branch near work. A second provider is the same kind of decision. If you cannot name the thing, you do not need the account.
Compare native API features, model availability, account controls and route independence. A universal ranking would be stale the week it was published, and it still would not tell you whether your current route covers your work.
flowchart TD
A["OpenRouter already working"] --> B{"Can you name what is missing?"}
B -->|"nothing"| C["Stay on one route"]
B -->|"a native API feature"| D["A direct provider that documents it"]
B -->|"separate billing or account controls"| E["A direct provider account"]
B -->|"an independent path when a route fails"| F["A second route, different company"]
D --> G["Match API mode, base URL,
thinking format and model ID"]
E --> G
F --> G
G --> H["Test, then verify with a low-risk prompt"]
Three fields decide whether a route works at all
A provider entry is mostly ordinary: a name you choose, a key you paste. Three fields are not preferences — they are protocol settings, and no default covers every route.
Think of posting a letter. The base URL is the address. The API mode is the language you write it in. The thinking format is how you read the notes scribbled in the margin of the reply. Right address, wrong language: the letter reaches the right building, where nobody can read it.
- API mode — a supported protocol identifier. Most routes use
openai-completions. Anthropic direct usesanthropic-messages. Other supported modes includeopenai-responses,google-generative-ai,mistral-conversationsandbedrock-converse-stream. - baseUrl — the endpoint for that route. An OpenAI-compatible protocol does not imply the OpenAI endpoint. That is the commonest wrong assumption when copying a configuration from elsewhere.
- thinkingFormat — the parser for route-specific reasoning data. Legal values include
openai,openrouter,deepseek,together,baseten,zai,qwen,chat-template,qwen-chat-template,string-thinkingandant-ling. Anthropic direct uses native blocks throughanthropic-messagesand leaves this field blank.
Where you type them depends on which group you pick in the Add provider catalog.
- CUSTOM is one card: OpenAI / Anthropic compatible, subtitled Custom endpoint format. This is the entry that asks you for the three fields above — so it is where all three can go wrong.
- SUBSCRIPTIONS holds six cards — Anthropic (Claude Pro/Max), GitHub Copilot, Kimi Code, OpenRouter OAuth, Radius and xAI — each marked
OAuth. You connect by logging in; there is no endpoint to mistype. - API KEY is the third group, and the heading is the authentication method: a key rather than a login. Each card carries a model count — Amazon Bedrock 121 models, Ant Ling 3, Anthropic 14 — which tells you how large a route is before you open it.
The fourth field is the model ID, and it is route-specific
The same model family answers to a different string depending on whether you reach it through a gateway or directly. Claude is the clearest example: all four fields differ between the two routes.
flowchart LR A["You want a Claude model"] --> B["Route A · OpenRouter gateway"] A --> C["Route B · Anthropic direct"] B --> D["mode: openai-completions
url: https://openrouter.ai/api/v1
thinking: openrouter
id: anthropic/claude-sonnet-4.5"] C --> E["mode: anthropic-messages
url: https://api.anthropic.com/v1
thinking: blank, native blocks
id: claude-sonnet-4-6"]
A model ID is not a name, it is a catalog number. The same lamp carries one number in the maker's catalog and another in the shop that resells it. Order by the wrong number and you get nothing back — not a near match, just model not found.
So copy the ID from the route you configured, never from an article or a marketing page — and watch the punctuation. Direct Anthropic naming can use 4-6 where an OpenRouter catalog entry uses 4.5, and a dated ID such as claude-haiku-4-5-20251001 pins a version on purpose.
openai-completions reaches Claude only through a compatible gateway; direct access uses anthropic-messages. Older documentation may call that mode anthropic. Pick the currently documented one, or the request can fail or render incorrectly.cache_control request field. Whether it works through a gateway depends on the route, model and request. Do not assume Pi Agent caches every repeated prompt for you.All seven routes on one screen
This is the part worth coming back to. Protocol values are from the add-on baseline; model IDs are examples documented at the time of writing. Check each one against the provider's live catalog before you save — hosted models get retired and renamed without notice.
| Route | API mode | Base URL | Thinking format | Model IDs (verify) |
|---|---|---|---|---|
| OpenRouter gateway |
openai-completions |
https://openrouter.ai/api/v1 |
openrouter for a documented reasoning route; otherwise blank |
anthropic/claude-sonnet-4.5, anthropic/claude-opus-5, anthropic/claude-haiku-4.5, openai/gpt-5, meta-llama/llama-3.3-70b-instruct, google/gemini-2.5-flash, deepseek/deepseek-chat |
| Anthropic direct |
anthropic-messages |
https://api.anthropic.com/v1 |
Blank — native Messages blocks | claude-sonnet-4-6, claude-opus-4-7, claude-haiku-4-5; a dated ID such as claude-haiku-4-5-20251001 pins a version |
| OpenAI direct |
openai-responses |
https://api.openai.com/v1 |
Copy the documented value for the exact model and route | gpt-5, gpt-5-mini, gpt-5-nano; older IDs such as gpt-4o, gpt-4o-mini and o1-mini may have different lifecycle status |
| DeepSeek direct |
openai-completions |
https://api.deepseek.com/v1 |
deepseek for deepseek-reasoner; chat can be left blank |
deepseek-chat, deepseek-reasoner |
| GLM (Z.ai) direct |
openai-completions |
https://open.bigmodel.cn/api/paas/v4 |
zai |
glm-4.6, glm-4-flash, glm-4-air |
| Groq inference host |
openai-completions |
https://api.groq.com/openai/v1 |
Blank, unless the selected model requires a documented format | llama-3.3-70b-versatile, llama-3.1-8b-instant, openai/gpt-oss-120b, openai/gpt-oss-20b. Older IDs such as mixtral-8x7b-32768 and moonshotai/kimi-k2 may be retired |
| MiniMax direct |
openai-completions |
https://api.minimax.io/v1 for an international account; https://api.minimaxi.com/v1 for a mainland China account |
deepseek — the repository-tested M-series format |
MiniMax-M3; source examples also include abab7-chat-preview and abab6.5s-chat |
i. MiniMax runs two portals — https://www.minimax.io/ for international accounts and https://platform.minimaxi.com/ for mainland China — and the credentials are not interchangeable. Use the portal and the endpoint that match your account.glm-4.6, glm-4-flash and glm-4-air.Six steps, without disturbing the route that works
This adds DeepSeek as a second route. Any other provider follows the same shape with its own documented API mode and endpoint — that is what the table above is for.
Two controls, two jobs: + Add Provider creates the entry, + Add Model adds an ID to one that already exists. Your OpenRouter entry is not edited or replaced.
-
Step 1
Create a provider key
Open
https://platform.deepseek.com/and follow the current account process. Create a key namedpi-agent-homeand store it in a password manager. Account requirements vary by provider and region. -
Step 2
Open the Models panel and choose Add Provider
Keep the existing OpenRouter card. In the Models panel, select + Add Provider, or the equivalent control in your version.
-
Step 3
Enter the four fields
Name it
DeepSeek, chooseopenai-completions, enterhttps://api.deepseek.com/v1, and paste the key. Usedeepseekas the thinking format for the reasoning route. -
Step 4
Add the exact model IDs
Select + Add Model, add
deepseek-chat, then adddeepseek-reasoner. Recheck both against the official model page before saving. -
Step 5
Run Test, then Save
Select Test and wait for the result. If it fails, read the actual error before changing fields — guessing at the four values in turn is how a working route gets broken. Then select Save.
-
Step 6
Verify with a low-risk prompt
Select the new model in the composer and send something short. Confirm the expected route was used, then check the provider's own usage record.
Test is the dial tone. It proves the line is connected, not that the conversation will go well. A long generation can still time out on a route whose test passed in a second.
Step 6 is the one people miss, because it happens outside Settings.
- The check mark shows which model the next message will use — here, GPT-5.6 Sol. Adding a provider does not move it; you still have to come here and choose.
- The list is flat. Eight names on this instance, one line each. A second route just makes it longer — look for the models you added in step 4.
- It opens from the composer, not from the panel where you typed the four fields. Settings defines a route; the composer is where one gets used.
Pick by the job in front of you
Use this after checking the live catalogs, not instead of it.
| Task | First route to try | Optional alternative |
|---|---|---|
| Routine household questions | A current lower-cost OpenRouter model | A direct lower-cost model — low-risk work rarely needs premium reasoning |
| Complex Home Assistant YAML | A current capable OpenRouter model | Anthropic, DeepSeek or GLM direct — review and testing matter more than brand |
| Image analysis | A current OpenRouter model with image input | A direct multimodal provider — the exact model must accept images |
| Long log analysis | A model whose documented context fits | MiniMax or another large-context route — measure your input size first |
| Low-latency chat | A current fast OpenRouter route | Groq direct — measure latency in your own environment |
| A provider refuses a request | Choose an appropriate alternative model | An independently configured direct route. Do not try to bypass safety controls |
Notice how often the first column is the route you already have. The catalog shows why.
- Radius shows 0 models. A card in the catalog is not a promise of models behind it — which is why step 4 has you paste exact IDs and step 5 has you test.
I get 404, or model not found
docs → Models page — https://openrouter.ai/models for OpenRouter, https://console.groq.com/docs/models for Groq. Check capitalization, punctuation, namespaces and retirement notices.Test passes, but a real chat times out
A Groq request comes back rate-limited
Which route is the most private?
Can Pi Agent reach Perplexity, xAI or Google models?
openai-completions with its documented baseUrl, credential and model ID — for example https://api.x.ai/v1, or Google's compatibility endpoint https://generativelanguage.googleapis.com/v1beta/openai/. OpenRouter may also list these models.Where to go from here
You have the map. Part 8 is the field that keeps appearing on it.
Thinking format, reasoning blocks and cache_control get an article of their own — what reasoning models do differently, what that costs in tokens, and how to switch models mid-conversation.
Part 7 of the Pi Agent Onboarding Guide series, published by WoowTech.
Based on the Woow HA Pi Agent Onboarding Guide, produced by WoowTech and released under CC BY 4.0.
The Smart Space Solution · 智慧空間解決方案 · © 2026 WOOW Technology Co., Ltd.