Keural API
Senden Sie Anfragen im OpenAI-Chat-Completions-Format mit einem API-Schlüssel.
Rufen Sie in Keural registrierte Modelle im OpenAI-Chat-Completions-Format auf.
Die Basis-URL hat das Format https://<Ihre öffentliche API-Domain>/llm/v1. Die öffentliche API-Domain unterscheidet sich je nach Umgebung. Fragen Sie Ihren Administrator.
| Methode | Pfad | Beschreibung |
|---|---|---|
POST | /llm/v1/chat/completions | Erstellt eine Chat-Vervollständigung (Streaming unterstützt) |
GET | /llm/v1/models | Listet die mit dem Schlüssel verbundenen Modelle auf |
GET | /llm/v1/models/{model} | Zeigt Informationen zu einem mit dem Schlüssel verbundenen Modell |
Pfade für Embeddings, Bildgenerierung, Sprache und die Responses-API werden nicht unterstützt. Anfragen an diese Pfade beantwortet die API mit 404.
Ablauf der Nutzung
| Schritt | Was zu tun ist |
|---|---|
| 1. Schlüssel ausstellen | Wählen Sie unter Einstellungen → API ein Modell und erhalten Sie einen Schlüssel. Kopieren Sie die Modell-ID und den Schlüssel. |
| 2. Client verbinden | Tragen Sie in der App oder im Code Basis-URL, API-Schlüssel und Modell-ID ein. |
| 3. Nutzen und verwalten | Auf demselben Bildschirm sehen Sie die Nutzung und können den Schlüssel bei Bedarf neu ausstellen oder widerrufen. |
Voraussetzungen
| Element | Details |
|---|---|
| Keural-Konto | Sie benötigen ein Konto, mit dem Sie sich anmelden können. |
| API-Menü | Fehlt API unter Einstellungen, bitten Sie Ihren Administrator, die Funktion zu aktivieren. |
| Berechtigung als Organisationsmitglied | Um Schlüssel in einem Organisations-Arbeitsbereich zu erhalten, muss der Organisationsadministrator Ihre API-Nutzung erlauben. Siehe API-Berechtigung der Organisationsmitglieder. |
| Basis-URL | Verwenden Sie die öffentliche API-Adresse, die Ihr Administrator mitteilt. |
| Client | Erforderlich ist eine App oder ein SDK, das OpenAI-API-kompatible Verbindungen unterstützt. |
API-Schlüssel ausstellen
- Öffnen Sie im Kontomenü unten links Einstellungen und wählen Sie API. In der Desktop- und Mobil-App finden Sie den Eintrag in der Gruppe Tools.
- Wählen Sie auf der Registerkarte API keys den Arbeitsbereich, zu dem der Schlüssel gehört (persönlich oder Organisation), sowie die Model ID.
- Legen Sie bei Bedarf das New key expiration (optional, Korea time) fest. Bleibt das Feld leer, gilt der Schlüssel bis zum Widerruf.
- Klicken Sie auf Issue key und bewahren Sie den angezeigten Schlüssel mit Copy key an einem sicheren Ort auf. Der vollständige Schlüssel wird nur in diesem Moment angezeigt und lässt sich nach dem Schließen nicht mehr einsehen.
- Der Schlüssel ist mit dem gewählten Arbeitsbereich und einem Modell verknüpft. Die Nutzung wird der Person zugeordnet, die den Schlüssel ausgestellt hat.
- Je Kombination aus Arbeitsbereich und Modell kann nur ein Schlüssel gültig sein. Existiert bereits einer, wird kein weiterer ausgestellt: Stellen Sie ihn neu aus (Rotate) oder widerrufen Sie ihn (Revoke).
- Verlieren Sie den Schlüssel, können Sie ihn nicht mehr einsehen. Stellen Sie ihn neu aus; der alte Schlüssel funktioniert dann sofort nicht mehr.
- Erscheint die Meldung, dass keine Modelle verfügbar sind, prüfen Sie mit Ihrem Administrator die Sichtbarkeit der Modelle, Ihren Tarif und die API-Berechtigung der Organisation.
API-Berechtigung der Organisationsmitglieder
Dies verwalten nur Inhaber und Administratoren der Organisation. Damit ein Mitglied im Organisations-Arbeitsbereich Schlüssel erstellen kann, muss der Administrator dies zuvor erlauben. Neue und bestehende Mitglieder sind standardmäßig gesperrt.
Organisationsverwaltung → Organization API besteht aus folgenden drei Bereichen. Fehlt das Menü, ist die API-Funktion deaktiviert oder Ihr Konto hat keine Organisationsverwaltungsrechte.
| Bereich | Funktion |
|---|---|
| API permissions by user | Aktiviert oder deaktiviert die API-Berechtigung je Mitglied. |
| Issued keys | Zeigt den Status der in der Organisation ausgestellten Schlüssel an und widerruft sie. Der Schlüsseltext ist nicht einsehbar. |
| API usage | Zeigt Anfragen und Token-Nutzung der in der Organisation ausgestellten Schlüssel. |
| Aktion | Ergebnis |
|---|---|
| Allow API access aktivieren | Das Mitglied kann im Organisations-Arbeitsbereich Schlüssel ausstellen. |
| Allow API access deaktivieren | Neue Ausstellungen und Aufrufe mit bestehenden Schlüsseln werden blockiert. Bereits ausgestellte Schlüssel werden nicht automatisch gelöscht; widerrufen Sie sie bei Bedarf unter Issued keys. |
Verlässt ein Mitglied die Organisation oder wird es entfernt, werden die von ihm in der Organisation erhaltenen Schlüssel automatisch widerrufen.
Mit einem Client verbinden
Tragen Sie diese drei Werte in Apps ein, die OpenAI-API-kompatibel sind (Chat-Clients, IDE-Erweiterungen, Automatisierungswerkzeuge usw.).
| Wert | Einzutragen | Bezeichnung in der App |
|---|---|---|
| Base URL | Die öffentliche API-Adresse, die Ihr Administrator mitgeteilt hat (…/llm/v1) | Base URL, API Base, Endpoint, Host |
| API Key | Der ausgestellte Schlüssel (ohne führende oder nachgestellte Leerzeichen) | API Key, Token, Secret Key, Authorization |
| Model | Die Model ID aus dem Ausstellungsbildschirm. Sie muss exakt mit dem Modell des Schlüssels übereinstimmen | Model, Model ID, Model Name |
- Wählen Sie in den App-Einstellungen das Hinzufügen einer OpenAI-kompatiblen Verbindung (Connection).
- Tragen Sie Base URL und API Key ein und speichern Sie.
- Wählen Sie in der Modellliste ein Modell. Die Liste zeigt nur das mit dem Schlüssel verbundene Modell.
- Senden Sie eine kurze Nachricht, um zu prüfen, ob eine Antwort kommt. Erscheint das ausgestellte Modell in der Modellliste, ist die Verbindung hergestellt.
Die Anfragen lauten wie folgt.
| Art | Inhalt |
|---|---|
| Chat-Anfrage | POST <Base URL>/chat/completions |
| Modellabfrage | GET <Base URL>/models |
| Authentifizierungs-Header | Authorization: Bearer <ausgestellter Schlüssel> |
| Inhalts-Header | Content-Type: application/json |
Erste Anfrage
export KEURAL_API_KEY='ihr_ausgestellter_schlüssel'
export KEURAL_BASE_URL='https://<ihre-api-domain>/llm/v1'
export MODEL_ID='modell-id_aus_dem_ausstellungsbildschirm'
curl "$KEURAL_BASE_URL/chat/completions" \
-H "Authorization: Bearer $KEURAL_API_KEY" \
-H 'Content-Type: application/json' \
-d "{\"model\":\"$MODEL_ID\",\"messages\":[{\"role\":\"user\",\"content\":\"Hallo.\"}]}"Das model im Anfragekörper muss mit dem Modell des Schlüssels übereinstimmen. Steht ein Pfadpräfix davor, wie etwa provider/Modell-ID, wird nur der Teil nach dem letzten / verglichen. Stimmt es nicht überein, liefert die API 403. Die Antwort enthält im Feld model immer die Modell-ID des Schlüssels.
from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["KEURAL_API_KEY"],
base_url=os.environ["KEURAL_BASE_URL"],
)
res = client.chat.completions.create(
model=os.environ["MODEL_ID"],
messages=[{"role": "user", "content": "Hallo."}],
)
print(res.choices[0].message.content)Unterstützte Anfragefelder
Die API akzeptiert nur diese 18 Felder auf oberster Ebene. Andere Felder führen zu 400. Optionale Felder mit dem Wert null gelten als nicht gesendet.
| Feld | Regel |
|---|---|
model | Pflicht. Die Modell-ID des Schlüssels |
messages | Pflicht. 1 bis 4.096 Einträge |
stream · stream_options | stream_options wird nur mit stream: true gesendet. Unterstützt include_usage. |
tools | Bis zu 128. Der Funktionsname verwendet [A-Za-z0-9_-], 1 bis 64 Zeichen |
tool_choice | none · auto · required · eine bestimmte Funktion. required setzt tools voraus. |
parallel_tool_calls | Unterstützt das Modell es nicht, liefert die API 400 |
response_format | text · json_object · json_schema |
max_tokens · max_completion_tokens | Senden Sie nur eines der beiden. Ohne Angabe gilt 4.096 (oder die Modellgrenze, falls niedriger). Überschreitet der Wert die Modellgrenze, liefert die API 400. |
temperature | 0 bis 2. Unterstützt das Modell es nicht, liefert die API 400 |
top_p | 0 bis 1 |
frequency_penalty · presence_penalty | -2 bis 2 |
stop | Eine Zeichenkette oder ein Array mit maximal 4 Einträgen |
seed | Ganzzahl |
user | Maximal 256 Zeichen |
n | Nur 1 |
Nachrichten
| Rolle | Akzeptierte Felder |
|---|---|
system · developer | content, name |
user | content (Zeichenkette oder Array aus Text- und Bildteilen), name |
assistant | content, name, refusal, tool_calls |
tool | content, tool_call_id |
- Eine
tool-Nachricht beantwortet jedeidder vorherigentool_callsnur einmal. - Bildteile (
image_url) sind nur inuser-Nachrichten von Modellen erlaubt, die Bilder verarbeiten. Verwenden Sie einehttp- oderhttps-Adresse oder eine Base64-Data-URI im Format PNG, JPEG, GIF oder WebP.detailistauto,lowoderhigh.
Anfragekörper
| Element | Grenze |
|---|---|
| Content-Type | application/json |
| Größe | 1 MiB |
| JSON-Struktur | Ein einziges Objekt auf oberster Ebene, Verschachtelungstiefe höchstens 64, keine doppelten Schlüssel |
| Dauer der Anfrage | Höchstens 600 Sekunden |
Verstoßen Sie gegen die Regeln für den Körper, lautet die Antwort 400, und param ist body.
Streaming
Mit "stream": true in der Anfrage antwortet die API per SSE. Jeder Abschnitt kommt als Ereignis data: ..., am Ende folgt data: [DONE]. Mit "stream_options": {"include_usage": true} wird kurz vor [DONE] noch ein Abschnitt mit der Token-Nutzung gesendet.
Mit include_usage enthalten alle Abschnitte usage: null, und der letzte Nutzungsabschnitt hat ein leeres Array choices. Nicht gestreamte Antworten enthalten usage nur, wenn Eingabe- und Ausgabe-Token bestätigt sind.
Die id der Antwort hat das Format chatcmpl-<x-request-id>. Alle Antworten enthalten den Header x-request-id.
Tritt während des Streamings ein Fehler auf, kommt ein data:-Ereignis mit dem Fehler-JSON, und die Verbindung endet ohne [DONE]. Überschreitet ein Abschnitt 1 MiB oder die Antwort 16 MiB, endet die Verbindung mit 503.
curl -N "$KEURAL_BASE_URL/chat/completions" \
-H "Authorization: Bearer $KEURAL_API_KEY" \
-H 'Content-Type: application/json' \
-d "{\"model\":\"$MODEL_ID\",\"messages\":[{\"role\":\"user\",\"content\":\"Hallo.\"}],\"stream\":true,\"stream_options\":{\"include_usage\":true}}"Nutzungsgrenzen
Anfragen sind je Benutzer, Organisation und Modell begrenzt: gleichzeitige Anfragen, Anfragen pro Minute (RPM) und Token pro Minute (TPM). Die tatsächlichen Werte unterscheiden sich je nach Umgebung.
Die Token pro Minute werden beim Eingang der Anfrage reserviert. Die Eingabe zählt 1 Token je 4 englische Zeichen, andere Zeichen zählen 1 Token je Zeichen; jedes Bild zählt 2.000 Token. Die Ausgabe wird anhand von max_tokens reserviert (maximal 4.096). Begrenzen Sie die Ausgabe auf das Nötige, bleibt mehr Spielraum innerhalb des Limits.
429-Code | Ursache | Retry-After |
|---|---|---|
rate_limit_exceeded | RPM, TPM oder gleichzeitige Anfragen überschritten | Bei RPM und TPM 60 Sekunden; bei gleichzeitigen Anfragen 1 Sekunde |
api_busy | Der Server kann derzeit keine weiteren Anfragen annehmen | Keine. Kurz warten und erneut versuchen. |
upstream_rate_limit | Der Modellanbieter hat sein eigenes Limit gemeldet | Keine |
Schlüsselverwaltung
Auf der Registerkarte API keys unter Einstellungen → API sehen Sie den Status der ausgestellten Schlüssel (gültig, abgelaufen oder widerrufen) und können sie neu ausstellen oder widerrufen.
Schlüssel sind 51-stellige Zeichenketten, die mit krl_llm_ beginnen. Pro Ausstellungsbereich kann nur ein Schlüssel gültig sein; existiert bereits einer, wird er neu ausgestellt statt ein neuer erstellt. Das Ablaufdatum kann nur ab heute festgelegt werden.
| Aktion | Ergebnis | Zu beachten |
|---|---|---|
| Neu ausstellen (Rotate) | Ein neuer Schlüssel wird erzeugt. | Der alte Schlüssel funktioniert sofort nicht mehr. Aktualisieren Sie auch den Schlüssel in verbundenen Apps. |
| Widerrufen (Revoke) | Der Schlüssel wird sofort gesperrt. | Verwenden Sie dies, wenn der Schlüssel vermutlich offengelegt wurde. Ein widerrufener Schlüssel lässt sich nicht wiederherstellen. |
Nutzung einsehen
Über die API gesendete Anfragen und verbrauchte Token sehen Sie an zwei Stellen.
| Ort | Inhalt |
|---|---|
| Einstellungen → API → API usage | Nutzung der von Ihnen ausgestellten Schlüssel im aktuellen Arbeitsbereich |
| Organisationsverwaltung → Organization API, Bereich API usage | Nutzung aller in der Organisation ausgestellten Schlüssel (Inhaber und Administratoren der Organisation) |
Abfragebedingungen
| Bedingung | Beschreibung |
|---|---|
| Startzeit · Endzeit | Koreanische Zeit. Die Startzeit ist enthalten, die Endzeit nicht. Bleiben beide leer, werden die letzten 7 Tage angezeigt; abgefragt werden höchstens 90 Tage auf einmal. |
| Model ID | Zeigt nur Anfragen eines bestimmten Modells. Bleibt das Feld leer, werden alle angezeigt. |
| Anfragestatus | Wählen Sie zwischen Alle · In Bearbeitung · Abgeschlossen · Fehlgeschlagen · Abgebrochen · Nicht bestätigt. |
Legen Sie die Bedingungen fest und klicken Sie auf Abfragen. Um eine gerade gesendete Anfrage erneut anzuzeigen, klicken Sie auf Aktualisieren.
Werte auf dem Bildschirm
- Angewendeter Abfragezeitraum: der tatsächlich abgefragte Zeitraum. Wurden Start- oder Endzeit leer gelassen oder überschreitet der Zeitraum 90 Tage, wird der vom Server angepasste Zeitraum angezeigt.
- Anzahl der Anfragen und Summen für Eingabe-Token · Ausgabe-Token · Gesamt-Token: Es werden nur bestätigte Werte addiert. Noch nicht bestätigte Token zählen nicht als 0, sondern werden als Nicht bestätigt angezeigt.
- Anfrageliste: Jede Anfrage steht in einer Zeile mit Uhrzeit, Model ID, Status sowie Eingabe-, Ausgabe- und Gesamt-Token. Pro Seite werden 20 angezeigt; mit Zurück und Weiter blättern Sie.
Mit Anfragedetails in einer Zeile klappen folgende Werte auf.
| Element | Beschreibung |
|---|---|
| Anfrage-ID | Wert, den Sie beim Kontakt mit dem Support angeben. |
| Antwortart | Streaming oder normale Antwort |
| Status der Nutzungsbestätigung | Bestätigt · Teilweise bestätigt · Nicht bestätigt |
| Endzeit · Antwortzeit (ms) | Zeitpunkt des Anfrageendes und benötigte Dauer |
| Cache-Lesevorgänge · Cache-Erstellung · Reasoning-Token | Erscheinen nur, wenn das Modell diese Werte zurückgibt. |
Streaming-Anfragen werden auch ohne stream_options.include_usage erfasst. Wird eine Anfrage mitten im Vorgang unterbrochen, kann sie als Teilweise bestätigt oder Nicht bestätigt erscheinen.
Fehlerformat
Fehler werden im OpenAI-kompatiblen Format zurückgegeben.
{
"error": {
"message": "Für Menschen lesbare Fehlerbeschreibung",
"type": "authentication_error",
"code": "invalid_api_key",
"param": null
}
}type richtet sich nach dem Statuscode, code nennt die Ursache.
| Status | type | code | Ursache |
|---|---|---|---|
400 | invalid_request_error | invalid_request | Verstoß gegen ein Feld, einen Wert oder eine Regel des Körpers. param nennt das betroffene Feld |
400 | invalid_request_error | upstream_rejected_request | Der Modellanbieter hat die Anfrage abgelehnt |
401 | authentication_error | invalid_api_key | Falsches Schlüsselformat, Schlüssel fehlt, abgelaufen, widerrufen oder neu ausgestellt, oder mehrere Authorization-Header |
403 | permission_error | api_disabled | Die Keural-API-Funktion ist deaktiviert |
403 | permission_error | model_api_disabled | Die API-Veröffentlichung des Modells ist deaktiviert |
403 | permission_error | model_not_allowed | model stimmt nicht mit dem Modell des Schlüssels überein, oder das Mitglied hat keine API-Berechtigung |
404 | invalid_request_error | not_found | Unbekannter Pfad |
405 | invalid_request_error | method_not_allowed | Falsche Methode. Der Header Allow nennt die erlaubten Methoden |
429 | rate_limit_error | Tabelle unter Nutzungsgrenzen | Limit überschritten |
503 | server_error | upstream_timeout | Die Antwort wurde nicht innerhalb von 600 Sekunden abgeschlossen |
503 | server_error | invalid_upstream_response | Ungewöhnliches Antwortformat des Anbieters, oder Streamgröße überschritten |
503 | server_error | dependency_unavailable · unsupported_provider | Vorübergehendes internes Problem. Wenden Sie sich mit x-request-id an den Support |
Fehlerbehebung
| Symptom | Antwortcode | Zuerst prüfen |
|---|---|---|
| Die Modellliste ist leer oder die Verbindung schlägt fehl | 404 · 405 | Ob die Basis-URL auf …/llm/v1 endet |
| Die Authentifizierung schlägt fehl | 401 | Tippfehler oder Leerzeichen im Schlüssel; ob der Schlüssel abgelaufen, widerrufen oder neu ausgestellt wurde |
| Die Verbindung funktioniert, das Modell ist aber nicht nutzbar | 403 | Ob die Modell-ID mit der des Schlüssels übereinstimmt, und die API-Berechtigung der Organisation |
| Antworten dauern lange oder schlagen gelegentlich fehl | 429 | Nutzungsgrenzen |
| Zeitweise keine Antwort | 5xx | Später erneut versuchen |
| Die Nutzung erscheint nicht oder stimmt nicht | — | Abfragezeitraum und der Arbeitsbereich, zu dem der Schlüssel gehört |
Lässt sich das Problem nicht lösen, wenden Sie sich mit den folgenden Angaben an Ihren Administrator, damit die Ursache schneller gefunden wird. Senden Sie weder den Schlüsseltext noch den Inhalt der Prompts.
- Zeitpunkt des Auftretens
- Verwendete Modell-ID
- Name und Version der Client-App
- Wert von
x-request-idaus dem Antwort-Header - Auf dem Bildschirm angezeigte Fehlermeldung