notatka · 1 września 2026

Jak podpiąć się do API LLM na pkrokosz.pl (krok-1)

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.

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": true zwraca 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żyj krok-1.

Limity i dobre praktyki

  • 120 requestów / minutę na klucz (limit proxy).
  • Hosting throttluje bardzo szybkie serie zapytań — jeśli dostaniesz 429 z Retry-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.