Wróć do bloga
Przewodnik dla programistówNovember 15, 202611 min czytania

Jeden klucz API. 124 modeli. Trzy formaty.

unbottled.ai mówi OpenAI chat completions, OpenAI Responses API i Anthropic Messages API pod jednym endpointem. Twoje SDK zostaje. Twoje narzędzia zostają. Zmieniasz tylko adres bazowy.

GPT od OpenAI, Claude od Anthropic, Gemini od Google. Trzy SDK, trzy klucze, trzy rachunki, trzy panele. Albo gorzej: twoje ulubione narzędzie mówi tylko jednym formatem, więc dostaje modele tylko jednego dostawcy.

unbottled.ai daje 124 modeli czatu z 17 laboratoriów pod jednym kluczem i jednym saldem kredytów. Wołasz je w formacie OpenAI, Responses albo Anthropic. Te same modele na każdym endpoincie. Poniżej dokładnie: jak to działa, ile kosztuje i kiedy lepiej iść bezpośrednio do dostawcy albo do routera.

Pięć endpointów, jeden klucz

Każdy endpoint przyjmuje ten sam klucz, pobiera z tego samego salda i obsługuje te same modele.

  • POST /v1/chat/completions: OpenAI Chat Completions. Streaming przez SSE zakończony data: [DONE], stream_options.include_usage, wywołania narzędzi. Format, którym mówi prawie każdy klient zgodny z OpenAI.
  • POST /v1/responses: OpenAI Responses API, format, którym mówi Codex CLI. Streaming i narzędzia. Bezstanowe: store ma wartość false, a previous_response_id kończy się błędem 400. Wysyłaj więc pełny input w każdej turze.
  • POST /v1/messages: Anthropic Messages API. Streaming i tool use. Z tym rozmawiają Claude Code i SDK Anthropic.
  • POST /v1/messages/count_tokens: za darmo. Lokalne oszacowanie bez wywołania modelu, które nie zjada limitu zapytań na minutę. Claude Code woła go non stop, żeby mierzyć swój kontekst.
  • GET /v1/models: każdy model, który twój klucz może teraz wywołać, z długością kontekstu, obsługą narzędzi i cenami. Jedna odpowiedź, którą parsują zarówno SDK OpenAI, jak i Anthropic.

Uwierzytelnianie działa na dwa sposoby, na każdym endpoincie. Authorization: Bearer sk-unb-... dla klientów OpenAI i dla Claude Code z ANTHROPIC_AUTH_TOKEN. x-api-key: sk-unb-... dla SDK Anthropic. Klucze zaczynają się od sk-unb-, widzisz je tylko raz, a my przechowujemy wyłącznie hash. Tworzysz je w Ustawienia > Klucze API, do 20 aktywnych kluczy na konto.

Adres bazowy: https://unbottled.ai/api/pl-PL/v1

Dla SDK OpenAI i narzędzi w stylu OpenAI. Locale jest częścią ścieżki. Zmienia tylko język komunikatów o błędach, działa każde obsługiwane, ale musi tam być.

Adres bazowy Anthropic: https://unbottled.ai/api/pl-PL

Dla SDK Anthropic i Claude Code. Ten sam adres bez /v1: /v1/messages dopisują same.

Kod: twoje SDK, nasz adres bazowy

Żadnej nowej biblioteki. Oficjalne SDK OpenAI i Anthropic działają bez zmian. Wstaw swój klucz w miejsce sk-unb-YOUR_KEY.

curl

Najszybszy dowód, że klucz działa. Zwykłe chat completion, nic do instalowania.

Chat completions przez curl
terminal
curl https://unbottled.ai/api/pl-PL/v1/chat/completions \
  -H "Authorization: Bearer sk-unb-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kimi-k3.1-pro",
    "messages": [
      { "role": "system", "content": "You answer in one sentence." },
      { "role": "user", "content": "Why is the sky blue?" }
    ]
  }'

OpenAI Python SDK

Ustaw base_url i api_key w kliencie, potem wołaj chat.completions.create jak zawsze. W polu model działa każdy model z GET /v1/models, także Claude i Gemini.

Chat completions z SDK OpenAI
chat.py
from openai import OpenAI

client = OpenAI(
    base_url="https://unbottled.ai/api/pl-PL/v1",
    api_key="sk-unb-YOUR_KEY",
)

reply = client.chat.completions.create(
    model="kimi-k3.1-pro",
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)
print(reply.choices[0].message.content)

Ten sam klient mówi też Responses API: client.responses.create. Pamiętaj, że tutaj jest bezstanowe. W każdej turze przekazuj całą rozmowę jako input.

Responses API z SDK OpenAI
responses.py
reply = client.responses.create(
    model="kimi-k3.1-pro",
    input="Why is the sky blue?",
)
print(reply.output_text)

Anthropic Python SDK

Ustaw base_url bez /v1 i swój klucz jako api_key, potem messages.create. Modele rozumujące zaczynają od bloku thinking, dlatego przykład wypisuje blok text, a nie pierwszy blok.

Messages API z SDK Anthropic
messages.py
import anthropic

client = anthropic.Anthropic(
    base_url="https://unbottled.ai/api/pl-PL",
    api_key="sk-unb-YOUR_KEY",
)

reply = client.messages.create(
    model="kimi-k3.1-pro",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Why is the sky blue?"}],
)
# Reasoning models put a thinking block first: print the text block.
print(next(block.text for block in reply.content if block.type == "text"))

Chcesz znać rozmiar przed wysłaniem? count_tokens zwraca oszacowanie za darmo, bez wywołania modelu.

Liczenie tokenów przez curl
terminal
curl https://unbottled.ai/api/pl-PL/v1/messages/count_tokens \
  -H "x-api-key: sk-unb-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-5-20250929",
    "messages": [{ "role": "user", "content": "Why is the sky blue?" }]
  }'

Lista modeli

GET /v1/models to źródło prawdy. Pokazuje dokładnie, które ID może wywołać twój klucz, z długością kontekstu, obsługą narzędzi i ceną za token.

Lista modeli przez curl
terminal
curl https://unbottled.ai/api/pl-PL/v1/models \
  -H "Authorization: Bearer sk-unb-YOUR_KEY"

ID modeli: nasze albo dostawcy

Konfiguracji, które już podają model, nie musisz przepisywać. Przyjmujemy popularne zapisy.

  • Nasze ID, tak jak wypisuje je GET /v1/models: claude-sonnet-5.5, gpt-6.1-sol, glm-5.3. Używaj ich, gdy zaczynasz od zera.
  • Zapisy dostawców też działają. ID Anthropic z datą (claude-sonnet-4-5-20250929 trafia na claude-sonnet-4.5), numery wersji z myślnikami, sufiks -latest, sufiks kontekstu [1m] i ID z kropką, jak gpt-5.5.
  • Prefiksy dostawców, takie jak anthropic/... czy openai/..., więc ID w stylu OpenRouter z istniejącej konfiguracji dalej działają.
  • Tylko na /v1/messages: ID Claude, którego twoje konto nie może wywołać, na przykład wbudowane ID wysyłane przez Claude Code przy zadaniach w tle, trafia na najnowszego Claude z tej samej rodziny (Opus, Sonnet albo Haiku), do którego masz dostęp. Claude Code działa bez dodatkowych zmiennych środowiskowych. Każde inne nieznane ID zwraca 404 model_not_found.

Claude Code i Codex CLI z innymi modelami

Oba łączą się bezpośrednio. Bez proxy, bez warstwy tłumaczącej, nic do instalowania.

Każdy snippet domyślnie używa glm-5.3. Przeszedł prawdziwe sesje w Claude Code i Codex CLI, niezawodnie wywołuje narzędzia i mało kosztuje za token wyjściowy. Gdy wszystko działa, podmień go na dowolne ID.

Claude Code

Jedno polecenie (Testowane na Claude Code 2.1.323)
terminal
ANTHROPIC_BASE_URL="https://unbottled.ai/api/pl-PL" \
ANTHROPIC_AUTH_TOKEN="sk-unb-YOUR_KEY" \
ANTHROPIC_MODEL="glm-5.3" \
ANTHROPIC_DEFAULT_OPUS_MODEL="glm-5.3" \
ANTHROPIC_DEFAULT_SONNET_MODEL="glm-5.3" \
ANTHROPIC_DEFAULT_HAIKU_MODEL="glm-5.3-flash" \
CLAUDE_CODE_SUBAGENT_MODEL="glm-5.3" \
CLAUDE_CODE_MAX_CONTEXT_TOKENS="1048576" \
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC="1" \
claude

Tyle wystarczy, żeby używać Claude Code z innymi modelami. ANTHROPIC_BASE_URL kieruje go do nas, ANTHROPIC_AUTH_TOKEN niesie twój klucz, a zmienne modeli decydują, co działa. Podmień ID modelu na dowolne z GET /v1/models: GPT, Gemini, Kimi, DeepSeek albo model niecenzurowany. CLAUDE_CODE_MAX_CONTEXT_TOKENS jest ustawione na prawdziwe okno kontekstu modelu, więc Claude Code kompaktuje rozmowę we właściwym momencie.

Codex CLI

Jedno polecenie (Testowane na Codex CLI 0.118.0)
terminal
UNBOTTLED_API_KEY="sk-unb-YOUR_KEY" codex \
  -c 'model_providers.unbottled={name="unbottled.ai",base_url="https://unbottled.ai/api/pl-PL/v1",env_key="UNBOTTLED_API_KEY",wire_api="responses"}' \
  -c model_provider=unbottled \
  -m glm-5.3

Codex CLI dostaje własnego dostawcę modeli z wire_api ustawionym na responses. Rozmawia z nami przez Responses API dokładnie tak jak z OpenAI. Model zmieniasz przez -m.

OpenCode, Continue, Aider i Cline też działają, wszystkie przetestowane. Ich konfiguracje, stałe pliki ustawień i pułapki, na które trafiliśmy, znajdziesz w przewodniku po narzędziach do kodowania.

Skonfiguruj każde narzędzie do kodowania

Który model do jakiej roboty

Każdy model poniżej obsługuje wywołania narzędzi. Kliknij nazwę, żeby zobaczyć cenę i parametry, a ID skopiuj do kodu.

Czołówka: najtrudniejszy kod i rozumowanie

Duże refaktory, nieznane bazy kodu, długie łańcuchy rozumowania. Wyższa cena za token, mniej błędnych ścieżek.

Tanio i szybko: pętle agentów, masowe zadania, wywołania w tle

Pętle agentów z dużymi promptami, zadania wsadowe, klasyfikacja, wywołania w tle, które narzędzia do kodowania odpalają cały dzień. Ułamek cen czołówki.

Niecenzurowane: bez odruchu odmowy

GLM 5.3 Uncensored i Qwen 3.6 Plus Uncensored to modele głównego nurtu z usuniętymi odmowami. UncensoredLM v1.2 jest inny: ma własny światopogląd, to nie tylko odblokowany model. To samo API, te same narzędzia.

Nie możesz się zdecydować? Strony porównań stawiają dwa modele obok siebie.

Ile to kosztuje

Kredyty, rozliczane za token. Bez opłat za stanowisko.

  • Większość modeli rozliczamy po podanej cenie za token plus nasza marża. Tokeny wejściowe z cache liczymy po cenie cache modelu. Modele obsługiwane przez OpenRouter rozliczają rzeczywisty koszt, który OpenRouter policzył za wywołanie, plus tę samą marżę.
  • Każda odpowiedź podaje usage.credits_charged. Nigdy nie musisz zgadywać, ile kosztowało wywołanie.
  • Zanim wywołanie ruszy, sprawdzamy saldo względem najgorszego scenariusza. Za mało oznacza HTTP 402 insufficient_credits: nic nie rusza, nic nie jest pobierane.
  • Przy streamingu zamknięcie połączenia zatrzymuje generowanie. Płacisz tylko za to, co się wykonało. Tak samo, gdy dostawca padnie w trakcie streamu.
  • Czat i API rozliczają się tak samo. OpenRouter rozkłada model na kilku dostawców, a niektórzy biorą więcej niż najtańszy, którego podajemy. Dlatego przy tych modelach cena na liście to szacunek, a usage.credits_charged to prawdziwa kwota. Gdy OpenRouter nie poda kosztu wywołania, liczymy cenę z listy.
  • To samo saldo kredytów co w aplikacji czatu, które pokrywa tam też obrazy, wideo, muzykę, głos i wyszukiwanie w sieci. Samo API wymaga płatnego konta: aktywnej subskrypcji albo co najmniej jednego kupionego pakietu kredytów. Darmowe kredyty go nie odblokowują.
  • Subskrypcja: 800 kredytów miesięcznie za PLN 30.00.
  • Pakiet kredytów: 500 kredytów za PLN 40.00. Pakiety nigdy nie wygasają. Płacisz kartą albo kryptowalutą.
Zobacz plany i ceny

Bezpośrednio, przez router czy u nas?

Trzy uczciwe opcje. Każda jest dla kogoś najlepsza.

Bezpośrednio u OpenAI, Anthropic albo Google

Najnowsze funkcje producenta trafiają tam najpierw. Bez marży pośrednika. Regulamin tylko jednego dostawcy. Jeśli używasz modeli tylko jednego dostawcy, idź bezpośrednio.

Agregator, na przykład OpenRouter

Dużo modeli, płacisz za zużycie. Uczciwie: wiele naszych modeli działa przez OpenRouter. Jeśli potrzebujesz samego routingu, idź tam.

unbottled.ai

Jeden klucz do trzech formatów: chat completions, Responses i Anthropic Messages razem z count_tokens. Claude Code i Codex CLI łączą się bez proxy. Modele niecenzurowane stoją obok modeli głównego nurtu, za jednorazowym potwierdzeniem 18+. To samo saldo płaci za aplikację czatu i API, z kredytów subskrypcji albo pakietów. A unbottled.ai jest open source i możesz go hostować samodzielnie.

Podsumowując: jeden dostawca, idź bezpośrednio. Zwykły routing w formacie OpenAI załatwi router. Chcesz Claude Code, Codex CLI oraz SDK OpenAI i Anthropic na jednym kluczu, z modelami niecenzurowanymi i aplikacją czatu na tym samym saldzie? Właśnie po to to zbudowaliśmy.

Limity, które warto znać

Bez niespodzianek na produkcji. Oto twarde granice.

  • Bezstanowo. Responses API działa ze store ustawionym na false i odrzuca previous_response_id. Wysyłaj pełną historię w każdej turze. Dotyczy to każdego endpointu.
  • Odpowiedź jest ograniczona do 32768 tokenów na zapytanie.
  • Domyślnie 60 zapytań na minutę na klucz. Po przekroczeniu dostajesz 429 z nagłówkiem Retry-After. Agenci, którzy odpalają dużo wywołań, dostają własny klucz.
  • count_tokens to oszacowanie, nie dokładny tokenizer dostawcy. Dobre do mierzenia kontekstu, nie do rozliczeń.
  • Wywołania narzędzi działają tylko na modelach, które je obsługują. W przeciwnym razie dostajesz 400 tools_not_supported. GET /v1/models pokazuje supports_tools dla każdego modelu.
  • Modele niecenzurowane wymagają jednorazowego potwierdzenia 18+ na stronie Klucze API. Bez niego dostajesz 403 uncensored_consent_required i nic nie jest pobierane.
Dwa klasyczne błędy przy konfiguracji, oba kończą się 404. Pierwszy: brak locale w ścieżce. Adres bazowy to /api/<locale>/v1, nie /api/v1. Drugi: zostawione /v1 w adresie bazowym Anthropic. Claude Code i SDK Anthropic same dopisują /v1/messages, a podwójne /v1 niczego nie znajdzie.

Co dzieje się z twoimi promptami

W skrócie: zatrzymujemy rachunek, nie rozmowę.

  • API nie zapisuje żadnej rozmowy i nie tworzy wątków. U nas zostaje tylko wpis rozliczeniowy: jaki model, ile kredytów.
  • Twój prompt trafia do dostawcy, który obsługuje model. To, co otrzymuje, podlega jego regulaminowi.
  • W aplikacji czatu rozmowy incognito żyją tylko w pamięci lokalnej twojej przeglądarki, nie na naszych serwerach.
Chcesz pełnej kontroli? unbottled.ai jest open source (MIT i GPL v3). Postaw własną instancję z własnymi kluczami dostawców i płać im bezpośrednio. Hostuj samodzielnie

FAQ

Czy unbottled.ai to alternatywa dla OpenRouter?

W wielu zastosowaniach tak: jeden klucz, dużo modeli, płatność za token. Różnice: unbottled.ai natywnie mówi Anthropic Messages API i OpenAI Responses API, nie tylko chat completions. Ma modele niecenzurowane. A aplikacja czatu działa na tym samym saldzie. Wiele naszych modeli pod spodem obsługuje OpenRouter.

Czy mogę używać Claude Code z modelami innymi niż Claude?

Tak. Ustaw ANTHROPIC_BASE_URL na adres bazowy Anthropic w unbottled.ai, wpisz klucz do ANTHROPIC_AUTH_TOKEN i wybierz dowolne ID z GET /v1/models. GPT, Gemini, GLM, Kimi, DeepSeek i modele niecenzurowane działają tak w Claude Code.

Czy potrzebuję nowego SDK?

Nie. Używaj oficjalnych SDK OpenAI i Anthropic. Zmień adres bazowy i klucz. Nic więcej.

Czy API ma darmowy plan?

Nie. Aplikacja czatu ma darmowe kredyty, API nie. Potrzebuje subskrypcji (800 kredytów miesięcznie za PLN 30.00) albo jednego pakietu kredytów (500 kredytów za PLN 40.00). Raz kupiony pakiet utrzymuje API aktywne, dopóki starczy salda.

Czy płacę cenę z listy?

Przy większości modeli tak: cena za token z listy plus nasza marża. Modele obsługiwane przez OpenRouter rozliczają rzeczywisty koszt, który OpenRouter policzył za wywołanie, plus tę samą marżę, w czacie i w API tak samo. Ich cena na liście to szacunek. Dokładną kwotę podaje każda odpowiedź w usage.credits_charged.

Jakie modele mogę wywołać?

Obecnie 124 modeli czatu: Claude, GPT, Gemini, DeepSeek, Kimi, GLM, Qwen i modele niecenzurowane. GET /v1/models wypisuje dokładnie to, co może wywołać twój klucz, z cenami.

Czy unbottled.ai przechowuje moje prompty?

Z API nie. Żadna rozmowa nie jest zapisywana, zostaje tylko wpis rozliczeniowy: model i pobrane kredyty. Dostawca, który obsługuje model, widzi prompt na swoich zasadach.

Tworzysz narzędzia albo treści dla programistów? Program partnerski unbottled.ai płaci ci cykliczną prowizję od każdej płatności, którą polecisz. Dołącz do programu partnerskiego

Jeden klucz. Każdy model. Zaczynaj.

Utwórz klucz, zmień jeden adres bazowy, zostaw swoje SDK. Dokumentacja API opisuje każdy endpoint, pole i kod błędu.

Wróć do bloga