Na pkrokosz.pl działa mój router LLM — krok-1: OpenAI-kompatybilne API, które rozdziela zapytania po kilku darmowych dostawcach (NVIDIA NIM, Groq, Zhipu i in.) z automatycznym failoverem. Poniżej instrukcja, jak się podpiąć: klucz, endpointy, gotowe przykłady (curl / Node / Python) i limity.
Klucz API i adres
API jest chronione tokenem Bearer — klucz wydawany indywidualnie. Jeśli chcesz korzystać, napisz do mnie (kontakt znajdziesz na stronie).
- Base URL:
https://pkrokosz.pl/api/llm/v1 - Auth: nagłówek
Authorization: Bearer <TWÓJ_KLUCZ_API>na każdym requescie
Uwaga: to API hobbystyczne, oparte na darmowych tierach dostawców — działa bez gwarancji SLA. Router sam dbuje o failover między dostawcami, więc pojedyncze 429/limity po stronie dostawców są normalne i obsłużone.
Endpointy
GET /v1/models— lista dostępnych modeli (krok-1+ modele konkretnych dostawców)POST /v1/chat/completions— chat w formacie OpenAI; z"stream": truezwraca SSE
Trasy monitorujące /api/llm-admin/* są prywatne i wymagają osobnego klucza admina.
Pierwszy request (curl)
Non-streaming:
curl https://pkrokosz.pl/api/llm/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <TWÓJ_KLUCZ_API>" \
-d '{"model":"krok-1","messages":[{"role":"user","content":"Cześć, kim jesteś?"}]}'Streaming (SSE):
curl -N https://pkrokosz.pl/api/llm/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <TWÓJ_KLUCZ_API>" \
-d '{"model":"krok-1","stream":true,"messages":[{"role":"user","content":"Napisz haiku o routerze LLM"}]}'Odpowiedź non-streaming to standardowy JSON chat.completion (czytasz choices[0].message.content). Strumień składa się z linii data: {...} i kończy się data: [DONE].
Node.js
const res = await fetch("https://pkrokosz.pl/api/llm/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <TWÓJ_KLUCZ_API>",
},
body: JSON.stringify({
model: "krok-1",
messages: [{ role: "user", content: "Cześć!" }],
}),
});
const data = await res.json();
console.log(data.choices[0].message.content);Python (klient OpenAI)
API jest OpenAI-kompatybilne, więc wystarczy podmienić base_url:
from openai import OpenAI
client = OpenAI(
base_url="https://pkrokosz.pl/api/llm/v1",
api_key="<TWÓJ_KLUCZ_API>",
)
r = client.chat.completions.create(
model="krok-1",
messages=[{"role": "user", "content": "Cześć!"}],
)
print(r.choices[0].message.content)To samo działa w każdym kliencie wspierającym OpenAI-compat (opencode, LibreChat itd.) — ustaw baseURL, apiKey i model krok-1.
Model krok-1 vs konkretne modele
krok-1(polecany) — tryb routera: router wybiera dostawcę pod zapytanie, robi failover przy padnięciu, rotuje dostawców między turami i utrzymuje sesję kontekstu. Możesz dołączyć"session_id"w body, żeby kontynuować rozmowę.- konkretny model z listy
GET /v1/models(np.nvidia/nemotron-3-ultra-550b-a55b) — passthrough 1:1 do wybranego dostawcy, bez failoveru. Część modeli jest na darmowych tierach i może być chwilowo niedostępna (429) — wtedy użyjkrok-1.
Limity i dobre praktyki
- 120 requestów / minutę na klucz (limit proxy).
- Hosting throttluje bardzo szybkie serie zapytań — jeśli dostaniesz
429zRetry-After, odczekaj wskazany czas zamiast ponawiać w pętli. - Tura ma budżet 90 sekund (failover) — zamiast wiszącego połączenia dostaniesz błąd z listą odrzuconych dostawców.
- Do prototypów, botów i eksperymentów — nie do systemów produkcyjnych o krytycznym znaczeniu.
Pełna, aktualna lista modeli zawsze pod GET /v1/models — lista dostawców ewoluuje.