Три API key ring buffer'а (OpenAI, Anthropic, Google), три billing dashboard'а, три rate-limit policy — и agent падает на 429, потому что fallback написан на коленке в bash. OpenRouter — unified LLM gateway: https://openrouter.ai/api/v1/chat/completions, OpenAI-compatible wire format, naming openai/gpt-5.6-sol, anthropic/claude-sonnet-5, google/gemini-2.5-pro. Статья для инженеров, которые хотят (1) понять model vs provider routing, (2) скопировать working curl/Python/Node, (3) поднять persistent gateway на bare-metal Mac NUKCLOUD. Cross-read: CLI ranking, weekly token share, LLM trends июнь 2026.
00Архитектура OpenRouter
OpenRouter — aggregation proxy между вашим HTTP client и inference backends. Один account → one API key → 70+ providers, 400+ models, ~100T tokens/month platform throughput (июнь 2026). Wire protocol = OpenAI Chat Completions: messages[], optional stream: true (SSE), max_tokens, tool calls где backend поддерживает.
Model ID всегда vendor/model-slug. Discovery: GET /api/v1/models → JSON array с pricing per 1M tokens. Рекомендуемые headers: Authorization: Bearer sk-or-..., HTTP-Referer, X-Title (для app leaderboard attribution).
PainFailure modes multi-vendor setup
- Key sprawl: rotation, quota, alert fatigue × N vendors; zombie cron job съедает Anthropic credits пока OpenAI key протухает.
- Hand-rolled fallback: try/catch вокруг трёх SDK — нет unified 429/503 telemetry, нет cost attribution per route.
- Proxy latency tax: extra hop добавляет типично 10–80 ms TTFT; для voice/realtime chat — dealbreaker; для batch agent — OK.
- Compliance gap: данные через US aggregator при DPA только с одним vendor.
- Host layer: Hermes gateway / Claude Code на shared macOS VPS — CPU steal, bandwidth jitter, SSE long-poll disconnect на multi-hour tool loops. Routing layer healthy, transport layer dead.
01Model Routing vs Provider Routing
| Параметр | Model Routing | Provider Routing |
|---|---|---|
| Selection logic | Fixed model; OR picks cheapest/fastest backend for that slug | Fixed provider namespace; fallback within same vendor catalog |
| Typical use | claude-sonnet-5 with auto backend failover | «All traffic via Anthropic contract» compliance |
| Fallback API | models: ["a","b","c"] ordered list | Vendor-internal model chain on 429 |
| Latency overhead | +10–50 ms vs direct API | +15–80 ms (region-dependent) |
| Token pricing | Listed price = provider rate, zero token markup | Same; prepaid credits + 5.5% top-up fee |
Free tier: 25+ models, 50 req/day без balance, 1000 req/day после $10 top-up. POC only — не для 7×24 agent fleet.
025 advantages + anti-patterns
- Single SDK surface: swap
base_url+model— zero client fork. - Native fallback chains: declarative multi-model без custom orchestrator.
- BYOK economics: your direct keys, no token markup, 1M req/month platform quota free.
- Market telemetry: apps board + model rankings — см. июнь 2026 model share.
- Fast model A/B: Kimi K3, DeepSeek V4, Grok 4.5 — one-line switch без нового vendor account.
03Quick start (3 steps)
-
A
Register на openrouter.ai, generate
sk-or-..., optional BYOK для existing vendor keys. -
B
Export
OPENROUTER_API_KEYв shell profile на dev machine или cloud node. -
C
Smoke test curl ниже → migrate SDK на
https://openrouter.ai/api/v1.
04Code samples
curl — non-streaming completion:
curl https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-H "HTTP-Referer: https://yourdomain.com" \
-H "X-Title: Agent Gateway" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [{"role": "user", "content": "Explain OpenRouter routing in 3 sentences."}]
}'
Python requests (minimal deps):
import os, requests
resp = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
json={
"model": "openai/gpt-5.6-sol",
"messages": [{"role": "user", "content": "ping"}],
},
timeout=120,
)
print(resp.json()["choices"][0]["message"]["content"])
Python OpenAI SDK:
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
)
out = client.chat.completions.create(
model="google/gemini-2.5-pro",
messages=[{"role": "user", "content": "Summarize in Russian."}],
)
print(out.choices[0].message.content)
Node OpenAI SDK:
import OpenAI from "openai";
const or = new OpenAI({
baseURL: "https://openrouter.ai/api/v1",
apiKey: process.env.OPENROUTER_API_KEY,
});
const res = await or.chat.completions.create({
model: "anthropic/claude-sonnet-5",
messages: [{ role: "user", content: "test" }],
});
console.log(res.choices[0].message.content);
SSE streaming (Node):
const stream = await or.chat.completions.create({
model: "openai/gpt-5.6-sol",
messages: [{ role: "user", content: "stream me" }],
stream: true,
});
for await (const ev of stream) {
process.stdout.write(ev.choices[0]?.delta?.content ?? "");
}
Fallback payload:
{
"models": [
"anthropic/claude-sonnet-5",
"openai/gpt-5.6-sol",
"google/gemini-2.5-pro"
],
"messages": [{"role": "user", "content": "critical path"}],
"route": "fallback"
}
Model catalog introspection:
curl -s https://openrouter.ai/api/v1/models \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
| jq '.data[] | {id, pricing}' | head -20
05BYOK, billing, observability
BYOK mode: platform relays your OpenAI/Anthropic/Google keys — zero token markup, 1M requests/month free on OpenRouter side. Prepaid credits: displayed token price = provider rate; 5.5% fee только при purchase credits, не per-token.
- Metric 1: log
model,provider, input/output tokens, wall time per request — correlate с generation ID из response headers. - Metric 2: budget alert at 80% threshold до запуска Hermes 7×24 loop.
- Metric 3: IDE integration:
OPENROUTER_API_KEY+ base URL в Cursor/Claude Code — см. Agent Skills runbook.
06Low EN/RU traffic diagnostic
- GSC: indexed pages per locale, query/impression mismatch, crawl errors on
/ru/blog/. - CDN/WAF: geo block или aggressive bot filter режет crawler из EU/US.
- hreflang: matrix только на blog index, не на detail pages (NUKCLOUD convention).
- Machine translation: thin/duplicate content penalty — rewrite per locale, не Google Translate pipeline.
- Backlinks: RU anchors с Habr, EN с Dev.to/HN — не zh-only link graph.
07SEO keyword matrix (zh vs EN/RU)
| Signal | zh market | EN / RU market |
|---|---|---|
| Keywords | OpenRouter 教程, 大模型 API | OpenRouter API guide, GPT Claude Gemini one key |
| Title pattern | 年份 + 保姆级 + model list | How to + models + (2026 Guide) |
| Meta length | 70–80 CJK chars | 120–160 Latin chars, runbook hook |
| Body density | 对比表 + 价格 | Short paragraphs, spec-first (RU), logic-first (EN) |
| Localization | WeChat/docs CN context | GDPR, openrouter.ai/apps citations |
Правило: localize search intent, не transliterate zh skeleton. Один slug, восемь независимых тел в blog-data.js.
08hreflang, canonical, schema
- URL pattern:
https://nukcloud.com/{lang}/blog/2026-openrouter-api-guide-gpt-claude-gemini-20260724.html - Canonical: self-referencing per detail page; no hreflang on articles.
- Sitemap: regenerate project script post-publish; GSC per property.
- Schema:
BlogPosting+ nestedFAQPageвmainEntity. - IndexNow: push new slug для Bing/Yandex indexers.
09Distribution + metrics
| Channel | Priority | Action |
|---|---|---|
| GitHub README | P0 | curl snippet + canonical link |
| Habr / Dev.to | P0 | RU/EN excerpt, link back |
| Product newsletter | P1 | Dev vs procurement segments |
| Discord OpenRouter, r/LocalLLaMA | P1 | Answer threads, no spam |
| Telegram dev channels | P2 | Routing diagram + pricing table |
| YouTube screencast | P2 | 6 min: key → curl → SDK → Mac node |
30-day KPIs: GSC impressions/CTR per locale, avg time on page > 4 min, clicks tseny / zakaz, console signups UTM ?utm_source=blog&utm_campaign=openrouter-api.
106-step production runbook
-
01
Account + keys: OpenRouter signup,
sk-or-..., BYOK if existing vendor credits, budget cap at 80% alert threshold. -
02
Local smoke: curl + OpenAI SDK; validate streaming SSE + 3-model fallback JSON.
-
03
Provision node: NUKCLOUD console — Mac mini M4 32GB+ для parallel sub-agents; region co-located с Git/registry.
-
04
SSH baseline:
brew install node python@3.12, secrets in~/.zshrc, RTT toopenrouter.ai< 100ms from node. -
05
Agent gateway: launchd plist для Hermes/Claude Code/custom service; SKILL.md для recurring prompts — Hermes install.
-
06
Bi-weekly review: OpenRouter $ vs node $, p95 latency, apps board; tune fallback chain + RAM tier на tseny.
Shared macOS VPS trade fast spin-up за bandwidth jitter, CPU oversubscription, SSE disconnect на thousand-tool-call sessions. Для OpenRouter-powered agent gateway 7×24 с auditable tenant boundary — multi-region bare-metal Mac cloud NUKCLOUD: unified memory, Seatbelt, launchd persistence. Hourly trial на zakaz, monthly commit после acceptance.
11FAQ
base_url=https://openrouter.ai/api/v1, api_key=sk-or-.... Chat, streaming, /models — без rewrite client.