Referencja API
Uwierzytelnianie, powierzchnia endpointów zgodna z OpenAI, streaming, reasoning i taksonomia błędów.
Uwierzytelnianie
Każde żądanie do /v1/* uwierzytelnia się wirtualnym kluczem w nagłówku Authorization: Bearer. Klucze tworzysz w Konsoli; sekret jest pokazywany tylko raz, a przechowywany jest wyłącznie jego hash. Klucz niesie własne limity zapytań, budżet, tagi oraz opcjonalną listę dozwolonych modeli (pusta = dowolny model).
Żądanie, którego model nie znajduje się na niepustej liście dozwolonych modeli klucza, zostaje odrzucone zapieczętowanym 403 permission_error zanim cokolwiek zostanie wysłane; sama odmowa trafia do łańcucha audytu.
Utworzenie klucza produkcyjnego wymaga zweryfikowanego adresu e-mail.
curl https://api.sluis.ai/v1/models \ -H "Authorization: Bearer $SLUIS_KEY" # a model outside the key's allow-list never dispatches: # → 403 permission_error · the refusal is sealed in the audit chain
Endpointy
Sluis udostępnia poniższą powierzchnię zgodną z OpenAI. Endpointy bez dedykowanej obsługi są przekazywane dosłownie do wyznaczonego dostawcy, wraz ze streamingiem, więc zgodne z OpenAI usługi nadrzędne zachowują pełną wierność.
| Endpoint | Przeznaczenie |
|---|---|
| POST /v1/chat/completions | Chat completions, główna powierzchnia: routing, ochrona danych, buforowanie, streaming. |
| POST /v1/completions | Starsze text completions. |
| POST /v1/embeddings | Embeddingi; zasilają też cache semantyczny. |
| POST /v1/moderations | Klasyfikacja moderacji. |
| POST /v1/responses | API OpenAI Responses. |
| GET /v1/models | Modele, które Twoja polityka i poświadczenia faktycznie osiągają, nic hipotetycznego. |
| GET /v1/models/{id} | Metadane pojedynczego modelu. |
| POST /v1/audio/* | Transkrypcja, tłumaczenie, mowa · przekazywane do wyznaczonego dostawcy. |
| POST /v1/images/* | Generowanie i edycja obrazów · przekazywane. |
| POST /v1/video/generations | Generowanie wideo · przekazywane. |
| /v1/files | Operacje na plikach · przekazywane. |
Streaming
Ustaw stream: true, a odpowiedź nadchodzi jako server-sent events: każda ramka to delta chat.completion.chunk, a strumień kończy się data: [DONE]. Strumienie nigdy nie są buforowane w bramie: przepływają przez nią rozgałęzieniem (tee), a zapieczętowanie audytu i pomiar następują nawet wtedy, gdy klient rozłączy się wcześniej.
Poproś o stream_options.include_usage a ostatnia ramka niesie dokładne zużycie tokenów, te same liczby, które brama mierzy i rozlicza.
stream = client.chat.completions.create(
model="mistral/mistral-large-latest",
messages=[{"role": "user", "content": "Write a haiku"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")const stream = await client.chat.completions.create({ model: "mistral/mistral-large-latest", messages: [{ role: "user", content: "Write a haiku" }], stream: true, stream_options: { include_usage: true }, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? ""); }
Rozumowanie
Przekaż parametr OpenAI reasoning_effort (minimal | low | medium | high) na dowolnym modelu zdolnym do myślenia. Sluis tłumaczy go zależnie od dostawcy (poziom myślenia Gemini, adaptacyjny wysiłek myślowy Claude) i pomija go tam, gdzie model by go odrzucił, więc jeden parametr działa w całym katalogu.
resp = client.chat.completions.create(
model="vertex/claude-opus-4-8",
messages=[{"role": "user", "content": "Prove it step by step…"}],
reasoning_effort="high", # minimal | low | medium | high
)Kody błędów
Błędy używają koperty błędów OpenAI; wartość error.type odzwierciedla status HTTP, więc obsługa błędów w Twoim SDK działa bez zmian.
| Kod | Kiedy |
|---|---|
| 400 invalid_request_error | Nieprawidłowy body żądania lub parametry. |
| 400 invalid_request_error | Identyfikator modelu bez prefiksu dostawcy. Każdy wywoływalny identyfikator to provider/model, np. mistral/mistral-large-latest; treść odpowiedzi brzmi: model must be provider-prefixed. |
| 401 authentication_error | Brakujący lub nieznany klucz API. |
| 402 insufficient_quota | Wyczerpany darmowy limit lub osiągnięty budżet. Aktywuj plan albo podnieś budżet; żądanie nigdy nie dociera do dostawcy. |
| 403 permission_error | Klucz nie ma uprawnień, na przykład model nie jest na jego liście dozwolonych. |
| 422 invalid_request_error | Odrzucone przed wysyłką, na przykład ochrona danych w trybie block dopasowała żądanie. |
| 429 rate_limit_error | Osiągnięty limit zapytań. Egzekwowane na bramie; żądanie nigdy nie dociera do dostawcy. |
| 451 permission_error | Zablokowane przez politykę rezydencji: żadna dozwolona jurysdykcja nie obsłuży żądania. Body zawiera powód. |
| 5xx api_error | Awaria dostawcy nadrzędnego po ponowieniach; bezpiecznik kieruje ruch z pominięciem niesprawnych dostawców. |