01 Przygotuj środowisko
Potrzebujesz Pythona 3.10 lub nowszego i klucza JANUSZ API. Klucza nie wklejaj do kodu ani repozytorium.
Wygeneruj klucz testowy →python -m venv .venv
source .venv/bin/activate
pip install openai pydantic
export JANUSZ_API_KEY="jan_..."
.venv\Scripts\Activate.ps1 oraz
$env:JANUSZ_API_KEY="jan_...".
02 Wyślij pierwszy request
Klient korzysta ze znanego SDK, ale wskazuje endpoint JANUSZ przez
base_url. Odpowiedź tekstową znajdziesz w pierwszym
elemencie choices.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["JANUSZ_API_KEY"],
base_url="https://janusz.fabryka.ai/v1",
timeout=30.0,
)
response = client.chat.completions.create(
model="bielik-11b-v3",
messages=[
{"role": "system", "content": "Odpowiadaj krótko po polsku."},
{"role": "user", "content": "Podaj trzy zalety automatyzacji faktur."},
],
temperature=0.2,
max_tokens=300,
)
print(response.choices[0].message.content)
print(response.usage.total_tokens)
Uruchom python app.py. Pole usage pokazuje
faktycznie przetworzone tokeny, a
response.model identyfikuje model, który odpowiedział.
03 Dodaj kontekst rozmowy
API jest bezstanowe: przy każdym wywołaniu wysyłasz potrzebną historię ponownie. To aplikacja decyduje, które wiadomości zachować.
messages = [{"role": "system", "content": "Jesteś pomocnym doradcą."}]
def ask(prompt: str) -> str:
messages.append({"role": "user", "content": prompt})
result = client.chat.completions.create(
model="bielik-11b-v3", messages=messages[-12:]
)
answer = result.choices[0].message.content
messages.append({"role": "assistant", "content": answer})
return answer
Limit ostatnich 12 wiadomości jest prostym początkiem, nie uniwersalną strategią. W produkcji kontroluj budżet tokenów i streszczaj starszy kontekst.
04 Waliduj odpowiedź JSON
Instrukcja „zwróć JSON” nie jest gwarancją schematu. Parsuj wynik i waliduj pola przed użyciem biznesowym.
import json
from pydantic import BaseModel
class Ticket(BaseModel):
category: str
priority: int
raw = response.choices[0].message.content
ticket = Ticket.model_validate(json.loads(raw))
print(ticket.category, ticket.priority)
05 Obsłuż błędy świadomie
Retry stosuj dla timeoutów, 429 i wybranych 5xx, z wykładniczym opóźnieniem i limitem prób. Nie ponawiaj automatycznie błędów walidacji ani uwierzytelnienia.
06 Checklista produkcyjna
- Klucz jest w managerze sekretów, nie w kodzie.
- Klient ma jawny timeout i ograniczone retry.
- Logi zawierają status, latency, model i tokeny — bez promptów.
- Odpowiedzi JSON są walidowane schematem.
- Testy sprawdzają rzeczywiste zadania, nie pytanie „kim jesteś?”.