OpenRouter: jeden klucz do wszystkich modeli AI - przewodnik
Przewodnik po OpenRouter: konto i klucz z limitem, opłaty, darmowe modele, prywatność danych, przydatne pola w kodzie i test, jak wybór dostawcy zmienia cenę i szybkość tego samego modelu.

👁 112 przeczytań
OpenRouter to pośrednik, który daje jeden klucz API i jedno saldo do ponad 460 modeli AI: OpenAI, Anthropic, Google, DeepSeek, Mistrala, Kimi i dziesiątek modeli otwartych. Ceny modeli są takie same jak u dostawców, a OpenRouter zarabia na prowizji 5,5% od doładowania. Kod piszesz w bibliotece OpenAI, zmieniasz tylko adres. Na OpenRouterze przetestowałem wszystkie skrypty ze ścieżki API AI od zera, więc poniżej opisuję go z praktyki: jak zacząć, ile kosztuje, które modele są darmowe, co z prywatnością i jak sterować wyborem dostawcy.
Stan na 4 października 2026
- Modele: 466 w katalogu API, w tym 17 darmowych (z dopiskiem
:free). - Opłaty: ceny modeli bez narzutu, prowizja od doładowania kartą 5,5% (minimum 0,80 USD), kryptowalutami 5%.
- Darmowe modele: 20 zapytań na minutę, 50 dziennie; po zakupie co najmniej 10 USD kredytów 1000 dziennie.
- Właściciel: od sierpnia 2026 Stripe (transakcja za ponad 7 mld USD, opisałem ją tutaj).
Co to jest OpenRouter i jak działa
OpenRouter sam nie trenuje ani nie uruchamia modeli. Przyjmuje Twoje zapytanie w formacie OpenAI (Chat Completions), sprawdza, którzy dostawcy obsługują wybrany model, i przekazuje zapytanie jednemu z nich. Przy modelach zamkniętych dostawca jest zwykle jeden (Claude obsługuje Anthropic, a także Google Vertex i Amazon Bedrock), przy otwartych może ich być kilkadziesiąt. 4 października model gpt-oss-120b hostowało 23 dostawców, a GLM-5.3 aż 41.
Co z tego masz:
- Jeden klucz i jedno saldo zamiast pięciu kont z osobnymi kartami, limitami i fakturami.
- Zmiana modelu jednym napisem:
openai/gpt-6.1-solnaanthropic/claude-sonnet-5.5bez zmiany kodu. - Automatyczne przełączanie, gdy dostawca ma awarię.
- Koszt w każdej odpowiedzi: pole
usage.costw dolarach, co bardzo ułatwia liczenie.
Czego nie masz: umowy bezpośrednio z OpenAI czy Anthropic, niektórych funkcji specyficznych dla dostawcy (np. części narzędzi serwerowych) i najwyższych limitów, które dostajesz po latach płacenia u źródła.
Jak zacząć: konto, klucz, limit
- Zaloguj się na openrouter.ai kontem Google, GitHub albo mailem.
- W Settings → Keys utwórz klucz (
sk-or-v1-...) i od razu ustaw Credit limit, np. 2 USD z odnowieniem miesięcznym. Limit może się odnawiać codziennie, co tydzień albo co miesiąc. - Jeśli chcesz płatnych modeli, w Settings → Credits doładuj konto. Przy 10 USD zapłacisz 10,80 USD (5,5% to 0,55 USD, ale obowiązuje minimum 0,80 USD), przy 20 USD - 21,10 USD.
- Zapisz klucz w pliku
.env(instrukcja w tekście Klucz API: jak go zdobyć i jak go nie spalić). - Uruchom pierwszy skrypt.
"""Pierwsze zapytanie do modelu AI przez OpenRouter (SDK openai)."""
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv() # wczytuje zmienne z pliku .env w bieżącym katalogu
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
)
odpowiedz = client.chat.completions.create(
model=os.getenv("MODEL", "openai/gpt-6-luna"),
messages=[
{"role": "system", "content": "Odpowiadasz po polsku, krótko i konkretnie."},
{"role": "user", "content": "Wyjaśnij w dwóch zdaniach, czym jest API."},
],
)
print(odpowiedz.choices[0].message.content)
print("---")
print("model:", odpowiedz.model)
print("tokeny wejścia:", odpowiedz.usage.prompt_tokens)
print("tokeny wyjścia:", odpowiedz.usage.completion_tokens)
szczegoly = odpowiedz.usage.completion_tokens_details
if szczegoly and szczegoly.reasoning_tokens:
print(" w tym tokeny myślenia:", szczegoly.reasoning_tokens)
koszt = getattr(odpowiedz.usage, "cost", None) # OpenRouter dokłada koszt w USD
if koszt is not None:
print(f"koszt: {koszt:.6f} USD")API to zestaw reguł i narzędzi, dzięki którym różne programy mogą się ze sobą komunikować. Określa, jak wysyłać żądania i odbierać dane lub funkcje od innego systemu.
---
model: openai/gpt-6-luna
tokeny wejścia: 40
tokeny wyjścia: 58
koszt: 0.000033 USDPełne omówienie kodu, streamingu i obsługi błędów jest w tekście Pierwsze zapytanie do API AI w Pythonie, a wersja z curl w tekście Co to jest API.
Ceny i opłaty
| Pozycja | Ile | Uwagi |
|---|---|---|
| Cena modeli | jak u dostawcy, bez narzutu | przy modelach otwartych każdy dostawca ma własną stawkę |
| Doładowanie kartą (Stripe) | 5,5%, minimum 0,80 USD | prowizja bezzwrotna |
| Doładowanie kryptowalutą | 5% | bez możliwości zwrotu |
| Własne klucze dostawców (BYOK) | bez opłaty do progu miesięcznego, potem 5% ceny modelu | FAQ z 4.10 podaje próg 25 000 USD miesięcznie |
| Zwrot niewykorzystanych kredytów | tylko w ciągu 24 godzin od zakupu | bez prowizji |
| Ważność kredytów | mogą wygasnąć po roku | wg regulaminu |
| Rabat za zgodę na zapisywanie zapytań | 1% | domyślnie wyłączone |
Stawki popularnych modeli i kalkulator kosztu miesięcznego znajdziesz w tekście Tokeny AI: co to jest i ile kosztują. Uwaga na jedną pułapkę: przy modelach otwartych karta modelu pokazuje jedną cenę, a zapytanie może trafić do dostawcy, który liczy kilka razy więcej. Sprawdziłem to na 15 modelach w tekście Cena na OpenRouter to nie cena, którą płacisz.
Mój test: ten sam model, czterech dostawców
Żeby pokazać, jak działa wybór dostawcy, wysłałem to samo pytanie do modelu gpt-oss-120b cztery razy, za każdym razem z innym ustawieniem pola provider:
"""OpenRouter: ten sam model u różnych dostawców. Kto obsłużył zapytanie, ile to trwało i ile kosztowało."""
import os, time
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key=os.environ["OPENROUTER_API_KEY"])
MODEL = "openai/gpt-oss-120b" # model otwarty, 4.10.2026 hostowało go 23 dostawców
PYTANIE = [{"role": "user", "content": "Napisz po polsku 3 zdania o tym, czym jest OpenRouter."}]
warianty = {
"domyślnie": {},
"najtaniej (sort=price)": {"provider": {"sort": "price"}},
"najszybciej (sort=throughput)": {"provider": {"sort": "throughput"}},
"bez zapisu danych (data_collection=deny, zdr)": {"provider": {"data_collection": "deny", "zdr": True}},
}
for nazwa, extra in warianty.items():
start = time.time()
r = client.chat.completions.create(model=MODEL, messages=PYTANIE, max_tokens=200, extra_body=extra)
czas = time.time() - start
dostawca = getattr(r, "provider", "?") # OpenRouter dokłada nazwę dostawcy do odpowiedzi
print(f"{nazwa:46} dostawca: {dostawca:12} {czas:4.1f} s "
f"{r.usage.completion_tokens:3} tokenów {r.usage.cost:.6f} USD")domyślnie dostawca: SambaNova 1.0 s 178 tokenów 0.000181 USD
najtaniej (sort=price) dostawca: CoreWeave 6.2 s 175 tokenów 0.000032 USD
najszybciej (sort=throughput) dostawca: Cerebras 0.4 s 200 tokenów 0.000180 USD
bez zapisu danych (data_collection=deny, zdr) dostawca: Crusoe 0.8 s 152 tokenów 0.000042 USDWyniki z 4 października:
- Domyślnie zapytanie trafiło do SambaNovy: szybko (1,0 s), ale za 0,000181 USD.
- Sortowanie po cenie wybrało CoreWeave: 5,6 razy taniej, ale odpowiedź trwała 6,2 s.
- Sortowanie po przepustowości wybrało Cerebras: 0,4 s, cena jak domyślnie.
- Bez zapisu danych (dostawcy, którzy nie przechowują zapytań) trafiło do Crusoe: 0,8 s i tylko o 30% drożej niż najtańszy wariant.
Przy jednym zapytaniu to ułamki centa. Przy automacie, który wysyła 10 tysięcy zapytań dziennie, różnica między wariantem domyślnym a sortowaniem po cenie to kilkadziesiąt dolarów miesięcznie. Dlatego w kodzie produkcyjnym zawsze ustawiam pole provider świadomie. Skróty działają też w nazwie modelu: :floor sortuje po cenie, :nitro po szybkości (np. openai/gpt-oss-120b:nitro).
Darmowe modele
Modele z dopiskiem :free kosztują 0 USD i nie wymagają doładowania. Listę pobierzesz bez klucza, a mój skrypt od razu testuje jeden z nich:
"""Lista darmowych modeli w OpenRouter (lista modeli nie wymaga klucza) i test jednego z nich."""
import os, sys, json, urllib.request
from dotenv import load_dotenv
from openai import OpenAI
with urllib.request.urlopen("https://openrouter.ai/api/v1/models") as f:
modele = json.load(f)["data"]
darmowe = [m for m in modele if m["id"].endswith(":free")]
print(f"Wszystkich modeli: {len(modele)}, darmowych: {len(darmowe)}\n")
for m in sorted(darmowe, key=lambda m: -m["context_length"]):
print(f"{m['id']:52} kontekst {m['context_length']:>9}")
load_dotenv()
client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key=os.environ["OPENROUTER_API_KEY"])
model = sys.argv[1] if len(sys.argv) > 1 else "google/gemma-4-31b-it:free"
r = client.chat.completions.create(model=model, messages=[{"role": "user", "content": "Napisz po polsku jedno zdanie o jesieni."}])
print(f"\n{model}: {r.choices[0].message.content.strip()}")
print(f"koszt: {r.usage.cost} USD")Wszystkich modeli: 466, darmowych: 17
thinkingmachines/inkling-small:free kontekst 1048576
thinkingmachines/inkling:free kontekst 1048576
nvidia/nemotron-3.5-lightning:free kontekst 1000000
nvidia/nemotron-3-ultra-550b-a55b:free kontekst 1000000
dots-studio/dots-3-note-preview:free kontekst 512000
apodex/apodex-1.1-mini:free kontekst 262144
inclusionai/ling-3.0-flash-sante:free kontekst 262144
qwen/qwen3.8-27b:free kontekst 262144
poolside/laguna-s-2.1:free kontekst 262144
poolside/laguna-xs-2.1:free kontekst 262144
google/gemma-4-26b-a4b-it:free kontekst 262144
google/gemma-4-31b-it:free kontekst 262144
nvidia/nemotron-3-super-120b-a12b:free kontekst 262144
cohere/north-mini-code:free kontekst 256000
nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free kontekst 256000
nvidia/nemotron-3.5-content-safety:free kontekst 128000
liquid/lfm-2.5-2.6b:free kontekst 65536
google/gemma-4-31b-it:free: Jesień to czas, kiedy liście mienią się złotem i czerwienią, a powietrze staje się rześkie i chłodne.
koszt: 0 USDOgraniczenia darmowych modeli:
- Limity: 20 zapytań na minutę i 50 dziennie łącznie dla wszystkich darmowych modeli; po zakupie co najmniej 10 USD kredytów (kiedykolwiek) 1000 dziennie.
- Dostępność: darmowe warianty bywają przeciążone (błąd 429) i znikają z katalogu bez zapowiedzi. Lista z 4 października nie musi być aktualna za miesiąc.
- Prywatność: część darmowych endpointów działa tylko po włączeniu w ustawieniach prywatności zgody na trenowanie na Twoich danych. Do danych klientów darmowych modeli nie używam.
- Polski: Gemma 4 31B odpowiedziała poprawną polszczyzną, ale mniejsze darmowe modele (np. 2,6B) radzą sobie z polskim słabo.
Prywatność i dane
Mam to spisane w całości
Zebrałem te rzeczy w ebookach, które możesz pobrać za darmo - bez zapisu na listę, bez haczyka.
Według FAQ OpenRouter domyślnie nie zapisuje treści zapytań ani odpowiedzi, nawet przy błędach, a zapisuje tylko metadane (czas, model, liczba tokenów). Treść trafia jednak do dostawcy modelu i to jego zasady decydują, co się z nią dzieje. Masz trzy narzędzia:
- Ustawienia prywatności konta - czy dopuszczasz dostawców, którzy mogą trenować na danych.
"data_collection": "deny"w poluprovider- tylko dostawcy, którzy nie przechowują danych."zdr": true- tylko endpointy z zerowym przechowywaniem danych (Zero Data Retention).
Do danych osobowych i firmowych i tak potrzebujesz umowy powierzenia przetwarzania. OpenRouter to dodatkowy podmiot w łańcuchu, więc przy RODO sprawdź, czy jego warunki Ci wystarczą, albo idź bezpośrednio do dostawcy.
Przydatne funkcje w kodzie
Lista zapasowych modeli: gdy pierwszy nie odpowie, OpenRouter sam spróbuje kolejnego. Składnię sprawdziłem (zapytanie przeszło i obsłużył je pierwszy model z listy), awarii nie symulowałem:
r = client.chat.completions.create(
model="anthropic/claude-haiku-4.5",
messages=[{"role": "user", "content": "Powiedz OK."}],
extra_body={"models": ["anthropic/claude-haiku-4.5", "openai/gpt-6-luna", "google/gemini-3.8-flash"]},
)
print(r.model) # który model faktycznie odpowiedziałInne pola, których używam:
"provider": {"require_parameters": true}- tylko dostawcy, którzy obsługują wszystkie parametry zapytania. Bez tego OpenRouter po cichu pomija nieobsługiwane, np. temperaturę w GPT-6 (sprawdziłem w tekście o parametrach API)."provider": {"order": ["Cerebras"], "allow_fallbacks": false}- tylko wskazany dostawca."provider": {"max_price": {"completion": 1.0}}- górny limit stawki za milion tokenów wyjścia.- Aliasy z tyldą, np.
~anthropic/claude-sonnet-latestalbo~openai/gpt-sol-latest- zawsze najnowsza wersja z rodziny. Wygodne, ale w produkcji wolę stałą nazwę, żeby model nie zmienił się bez mojej wiedzy.
OpenRouter czy bezpośrednio u dostawcy
| OpenRouter | Bezpośrednio (OpenAI, Anthropic, Google) | |
|---|---|---|
| Liczba modeli | 466 na jednym kluczu | tylko modele danej firmy |
| Cena tokenów | taka sama | taka sama |
| Dodatkowy koszt | 5,5% od doładowania | brak |
| Darmowy start | 17 darmowych modeli, 50 zapytań dziennie | Google: darmowy poziom Gemini; Anthropic: niewielkie kredyty na start; OpenAI: brak |
| Limity zapytań | wysokie, zależne od salda | rosną z historią płatności |
| Nowe funkcje dostawcy | czasem z opóźnieniem | od pierwszego dnia |
| Umowa i faktura | z OpenRouter | z dostawcą |
Moja zasada: OpenRouter do nauki, prototypów i porównywania modeli; bezpośrednio u dostawcy, gdy produkcja stoi na jednym modelu i liczy się każdy procent kosztu albo umowa. Alternatywą z abonamentem zamiast tokenów jest Poe, a lokalnie, bez żadnych opłat za tokeny, Ollama.
Najczęstsze pytania
Czy OpenRouter jest darmowy?
Konto i klucz są darmowe, 17 modeli z dopiskiem :free też (50 zapytań dziennie). Za pozostałe modele płacisz z doładowanego salda, a przy doładowaniu prowizję 5,5%.
Czy OpenRouter jest bezpieczny?
To duża, legalna firma (od sierpnia 2026 część Stripe) i według FAQ domyślnie nie zapisuje treści zapytań. Ryzyko leży raczej u dostawców modeli, do których trafia treść, i w wycieku Twojego klucza. Ustaw limit na kluczu i wybierz dostawców bez przechowywania danych.
Czy OpenRouter jest droższy niż API OpenAI?
Ceny tokenów są te same. Płacisz dodatkowo 5,5% przy doładowaniu, czyli przy 100 USD około 5,50 USD.
Jak sprawdzić saldo przez API?
Zapytanie GET na https://openrouter.ai/api/v1/key z kluczem w nagłówku zwraca zużycie i limit danego klucza, a /api/v1/credits stan całego konta.
Czy mogę płacić w złotówkach?
Nie, rozliczenia są w dolarach. Karta przeliczy kwotę po kursie Twojego banku.
Co znaczy błąd 402 w OpenRouter?
Brak środków na koncie albo wyczerpany limit klucza. Doładuj saldo albo podnieś Credit limit w ustawieniach klucza.
Google · Twoje źródłaPromptowy wyżej w Twoim Google - jednym kliknięciemDodaj do preferowanych źródeł →Źródła i data sprawdzenia
Sprawdzone i przetestowane 4 października 2026 na Windows 11, Python 3.13.15, openai 3.24.0. Koszt testów z tego tekstu: poniżej 0,001 USD.
- OpenRouter - Quickstart
- OpenRouter - FAQ (opłaty, prywatność, BYOK)
- OpenRouter - limity
- OpenRouter - wybór dostawcy
- OpenRouter - warianty modeli (:free, :nitro, :floor)
- OpenRouter - katalog modeli (API)
Cały tydzień w AI, w jednym mailu
Wybrane premiery, narzędzia i analizy. Raz w tygodniu, prosto do skrzynki.
Zapisz się za darmo →
