Skip to Content

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. Trea
September 12, 2026 by
A second provider is four fields, and three of them are easy to get wrong
OdooBot
route map
Pi Agent Guide · Part 7

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.

7 routes
One gateway, five direct providers, one inference host
3 fields
API mode, base URL and thinking format cause most failures
6 steps
From creating a key to a first low-risk test
Why compare at all

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?

In plain terms

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"]
The decisionEverything below the middle box is configuration. If you cannot fill that box in, stay where you are.
The decision rule: keep OpenRouter for catalog breadth. Add a direct provider for a native API feature, different terms, separate account controls, or an independent operational path.
The three fields

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.

In plain terms

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 uses anthropic-messages. Other supported modes include openai-responses, google-generative-ai, mistral-conversations and bedrock-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-thinking and ant-ling. Anthropic direct uses native blocks through anthropic-messages and leaves this field blank.

Where you type them depends on which group you pick in the Add provider catalog.

The Pi Agent Settings dialog on the Models tab, showing the top of the Add provider catalog: a Search providers box, then a CUSTOM group holding one card, OpenAI / Anthropic compatible, subtitled Custom endpoint format; a SUBSCRIPTIONS group of six cards each marked OAuth — Anthropic (Claude Pro/Max), GitHub Copilot, Kimi Code (subscription), OpenRouter OAuth, Radius and xAI (Grok/X subscription); and the start of an API KEY group with Amazon Bedrock 121 models, Ant Ling 3 models and Anthropic 14 models.
Where the fields liveThe catalog opens on the Models tab of Settings: a search box, then every route sorted into three groups.
  • 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.
Two names, one model

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"]
Two routes to ClaudeFour fields, four different values. The model IDs are not interchangeable strings for one model.Versioned examples
In plain terms

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.

Anthropic is the exception here. 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.
On prompt caching: Anthropic caching uses the 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.
The route table

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.

RouteAPI modeBase URLThinking formatModel 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
Note the extra 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.
One entry can hold several models. Models sharing a provider, credential, API mode and endpoint belong together: one GLM entry can list glm-4.6, glm-4-flash and glm-4-air.
Adding one

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.

  1. Step 1

    Create a provider key

    Open https://platform.deepseek.com/ and follow the current account process. Create a key named pi-agent-home and store it in a password manager. Account requirements vary by provider and region.

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

  3. Step 3

    Enter the four fields

    Name it DeepSeek, choose openai-completions, enter https://api.deepseek.com/v1, and paste the key. Use deepseek as the thinking format for the reasoning route.

  4. Step 4

    Add the exact model IDs

    Select + Add Model, add deepseek-chat, then add deepseek-reasoner. Recheck both against the official model page before saving.

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

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

In plain terms

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 Pi Agent model dropdown open over the composer, listing GPT-5.3 Codex Spark, GPT-5.4, GPT-5.4 mini, GPT-5.5, GPT-5.6 Luna, GPT-5.6 Sol with a check mark beside it, GPT-5.6 Terra and GPT-6 Astra.
Where step 6 happensThe model list opens from the button under the message box. The check mark is on GPT-5.6 Sol.
  • 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.
Choosing by task

Pick by the job in front of you

Use this after checking the live catalogs, not instead of it.

TaskFirst route to tryOptional alternative
Routine household questionsA current lower-cost OpenRouter modelA direct lower-cost model — low-risk work rarely needs premium reasoning
Complex Home Assistant YAMLA current capable OpenRouter modelAnthropic, DeepSeek or GLM direct — review and testing matter more than brand
Image analysisA current OpenRouter model with image inputA direct multimodal provider — the exact model must accept images
Long log analysisA model whose documented context fitsMiniMax or another large-context route — measure your input size first
Low-latency chatA current fast OpenRouter routeGroq direct — measure latency in your own environment
A provider refuses a requestChoose an appropriate alternative modelAn 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.

The lower half of the Pi Agent Add provider catalog, each card carrying a model count: OpenCode Go 27, OpenRouter 366, Qwen Token Plan 18, Qwen Token Plan CN 18, Qwen Token Plan Individual 9, Radius 0, Together 21, Vercel AI Gateway 237, xAI 3, Xiaomi 3, three Xiaomi Token Plan regions with 2 each, Z.AI 7 and Z.AI Coding CN 10.
Why the gateway staysOpenRouter, 366 models behind one key. Vercel AI Gateway, 237. Every other card on this screen is smaller than both.
  • 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
Copy exact IDs from the provider's current 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
Test may not reproduce a long generation. Check the provider's status page, your request size, the model, the network path and the logs. Do not raise timeouts before you know which request failed.
A Groq request comes back rate-limited
Inspect the 429 response and your account limits before assuming the quota resets that day. Reset periods and upgrade options vary by account and service.
Which route is the most private?
Every cloud route receives the data you send it. Official policies — not this page — decide whether a provider trains on API conversations, how long it retains them, where they are processed, and whether zero retention is offered. An aggregator does not add privacy by itself, and a local model changes the data path while adding local security work.
Can Pi Agent reach Perplexity, xAI or Google models?
When a provider offers an OpenAI-compatible API, use 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.
Next

Where to go from here

keep going

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.

Open the full guide

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.

Share this post