API-Referenz

Die OpenAI-kompatible Data Plane.

Interaktive OpenAPI-Referenz

Die folgenden Operationen werden aus der maßgeblichen OpenAPI-Spezifikation generiert. Mit Test Request können Sie eine echte Anfrage erstellen und senden sowie alle Felder, Antworten und Fehlerschemas einsehen.

Der Test eines authentifizierten Endpunkts sendet eine echte Anfrage und kann Guthaben verbrauchen.

Chat-Completion erstellen

post/v1/chat/completions

Response erstellen

post/v1/responses

Embeddings erstellen

post/v1/embeddings

Audio transkribieren

post/v1/audio/transcriptions

Sprache erzeugen

post/v1/audio/speech

Modelle auflisten

get/v1/models

Service-Status prüfen

get/healthz

Konventionen

  • Modell-IDs haben die Form provider/model, z. B. mistral/mistral-medium-3.5.
  • Geld ist eine ganzzahlige Mikro-EUR-Größe (1 EUR = 1.000.000 µEUR), angegeben pro Million Tokens.
  • Anfrage-Bodies sind auf 2 MiB begrenzt.

Anleitungen und Beispiele

Chat-Completion

typescript
const res = await client.chat.completions.create({
  model: "mistral/mistral-medium-3.5",
  messages: [{ role: "user", content: "Hallo!" }],
});

Streaming funktioniert genauso mit "stream": true. Siehe Streaming.

Tool Calling funktioniert bei jedem Chat-Modell, dessen supported_parameters tools enthalten, im Stream wie ohne. Ein Modell ohne diese Fähigkeit liefert 400 tools_not_supported. Schicken Sie tools (Function Tools) mit optionalem tool_choice und parallel_tool_calls, und das Modell antwortet mit message.tool_calls (im Stream delta.tool_calls) und finish_reason: "tool_calls". Für die nächste Runde schicken Sie den Assistenten-Zug mit seinen tool_calls zurück, danach je Aufruf eine Nachricht {"role": "tool", "tool_call_id": "...", "content": "..."}; bei einem Reasoning-Modell zusätzlich die reasoning_details dieses Zuges.

Eine Tool-Definition reist vollständig, samt strict und dem JSON-Schema in parameters. Auf den Wegen, die den Request neu bauen, wird nichts davon stillschweigend verworfen: jedes Modell auf Bedrock, Claude auf Vertex sowie /v1/responses. Dort wird die Anfrage mit einem 400 abgelehnt, das das Feld benennt, wo ein Upstream einen Wert nicht ausdrücken kann: tool_choice: "none" und parallel_tool_calls: false bei jedem Modell, das Bedrock bedient, das Erzwingen eines Tools ("required" oder eine benannte Funktion) zusammen mit reasoning auf beiden Claude-Wegen und gehostete Tools wie Websuche oder MCP, denn dieses Gateway führt keine eigenen Tools aus. Bei den übrigen Anbietern geht die Anfrage stattdessen unverändert durch; ein Tool, das der Anbieter ablehnt, kommt daher als dessen eigener Fehler zurück. Die Form der Deltas steht unter Streaming.

JSON-Modus. response_format (etwa {"type": "json_object"} oder ein json_schema) wird an OpenAI-kompatible Anbieter unverändert weitergegeben und funktioniert dort, wo der Anbieter es unterstützt. Bei jedem Modell, das Bedrock bedient (Claude, Nova, GPT-OSS, Qwen und weitere), und bei Claude über Vertex wird es derzeit ignoriert: Die Anfrage gelingt, die Antwort ist aber nicht sicher JSON. Für strukturierte Ausgabe nutzen Sie dort ein Tool mit JSON-Schema in parameters und lesen die Argumente des Tool-Aufrufs.

Reasoning-Modelle nehmen ein reasoning-Objekt und antworten mit message.reasoning und/oder message.reasoning_details. Garantiert ist keines der beiden Felder: reasoning.exclude: true entfernt beide, und Denken, das ein Anbieter nur verschlüsselt herausgibt, kommt als reasoning_details-Eintrag ohne message.reasoning, weil es keinen Klartext gibt. Behandeln Sie beide als optional. Siehe Reasoning.

Responses

Dieselben Modelle in OpenAIs Responses-Form. input nimmt einen String oder eine Liste von Input-Items, max_output_tokens ersetzt max_tokens, und die Antwort ist ein response-Objekt, dessen output-Array reasoning- und message-Items enthält.

bash
curl https://api.kontinent.ai/v1/responses \
  -H "Authorization: Bearer $KONTINENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"bedrock/claude-sonnet-5","input":"Hallo!",
       "reasoning":{"effort":"high"}}'

Mit "stream": true kommen benannte Events, jedes mit monoton steigender sequence_number: response.created, response.output_item.added, response.reasoning_text.delta, response.reasoning_text.done, response.content_part.added, response.output_text.delta, response.output_text.done, response.content_part.done, response.function_call_arguments.delta, response.function_call_arguments.done, response.output_item.done, response.completed oder response.failed, wenn eine Generierung nach dem ersten Byte abbricht. Item- und Content-Part-Events kommen paarweise (added/done), ein Client kann also schliessen, was er geöffnet hat.

Tools funktionieren auch hier, in der flachen Responses-Form: tools: [{"type": "function", "name": "...", "parameters": {...}}], dazu tool_choice und parallel_tool_calls. Ein Aufruf kommt als Output-Item vom Typ function_call zurück (call_id, name, arguments); die Runde geht weiter, indem Sie ihn in input als function_call-Item wiederholen, gefolgt von einem function_call_output-Item mit derselben call_id. Bei einem Reasoning-Modell wiederholen Sie zusätzlich das reasoning-Output-Item, das vor dem Aufruf stand, samt reasoning_details: Claude prüft sein eigenes Denken und lehnt eine Tool-Runde ab, die ohne es zurückkommt. Abgelehnt wird genau das, was auch Chat-Completions ablehnen, mit demselben Feldnamen.

Eingabe-Items tragen nur Text: Ein Bild- oder Datei-Inhalt liefert 400. Felder, die dieser Endpunkt nicht übersetzt, etwa text.format, werden ignoriert statt abgelehnt. Verlassen Sie sich für strukturierte Ausgabe also nicht darauf.

Dieser Endpunkt ist zustandslos. store: true und previous_response_id werden mit 400 abgelehnt. Kontinent speichert keine Prompts und keine Antworten, eine gespeicherte Response könnte also nie gelesen werden. Schicken Sie die vorherigen Züge stattdessen in input.

Embeddings

bash
curl https://api.kontinent.ai/v1/embeddings \
  -H "Authorization: Bearer $KONTINENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"mistral/mistral-embed","input":"Hallo!"}'

Weitere OpenAI-Felder wie encoding_format und dimensions gehen unverändert an den Anbieter; ob sie wirken, hängt vom Modell ab. stream: true liefert 400, weil Embeddings keine schrittweise Form haben. Ein Chat-Modell hier zu senden (oder ein Embedding-Modell an den Chat-Endpunkt) wird abgelehnt.

Audio

Sprache zu Text und Text zu Sprache nutzen die OpenAI-Audioformen. Schicken Sie ein Transkriptionsmodell an den ersten Endpunkt und ein Sprachmodell an den zweiten; die falsche Modellart wird abgelehnt.

Die Transkription nimmt multipart/form-data mit file und model (beide Pflicht) sowie optional language, prompt, temperature, response_format und user. Die Datei darf bis zu 25 MB groß sein (die gesamte Anfrage bis zu 26 MB). response_format ist json (Standard) oder text; jeder andere Wert ergibt 400, ebenso stream=true. Der Dateiname wird nie an den Anbieter weitergegeben, nur eine unbedenkliche Dateiendung. Der gesamte Upload muss innerhalb von 5 Minuten abgeschlossen sein; ein langsamerer Upload wird abgebrochen und ergibt 400. Ist diese Gateway-Instanz bereits mit 4 Transkriptionen beschäftigt und wird binnen 10 Sekunden kein Platz frei, erhalten Sie 503 transcriptions_busy mit dem Header Retry-After: 10: Versuchen Sie es nach dieser Anzahl Sekunden erneut.

bash
curl https://api.kontinent.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $KONTINENT_API_KEY" \
  -F model=scaleway/whisper-large-v3 \
  -F file=@gespraech.m4a \
  -F language=de

Die Sprachausgabe nimmt JSON mit model, input (bis zu 4096 Zeichen) und voice (alle Pflicht) sowie optional response_format (mp3 Standard, wav, opus, aac, flac, pcm) und user. stream wird nicht unterstützt und ergibt 400. Der Antwort-Body ist die Audiodatei selbst.

bash
curl https://api.kontinent.ai/v1/audio/speech \
  -H "Authorization: Bearer $KONTINENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"mistral/voxtral-tts","input":"Guten Tag","voice":"en_paul_neutral"}' \
  --output antwort.mp3
  • Abrechnung. Die Transkription wird je angefangener Sekunde Audio abgerechnet, vom Gateway gemessen, mindestens eine Sekunde. Die Sprachausgabe wird je Zeichen von input abgerechnet, gezählt als Unicode-Zeichen, nicht als Bytes. Die Preise stehen in /v1/models als audio_micro_eur_per_hour und character_micro_eur_per_million; ein Feld fehlt, wenn es null ist.
  • Fallback. Die Transkription weicht wie Chat entlang der Fallback-Kette des Modells aus. Die Sprachausgabe wechselt nie von selbst auf ein anderes Modell, denn ein anderes Modell spricht mit einer anderen Stimme. Routing-Richtlinien, die Sie selbst anlegen, funktionieren weiterhin.
  • Stimmen. voice muss eine der Stimmen sein, die der Katalog für das Modell führt. Jeder andere Wert wird mit 400 abgelehnt, bevor der Anbieter angefragt wird, und die Fehlermeldung nennt die gültigen Stimmen. mistral/voxtral-tts bietet derzeit nur englische Stimmen. Für Deutsch nutzen Sie ovh/nvr-tts-de-de mit der Stimme German-DE-Male-1, seiner einzigen Stimme. Dieses Modell nimmt höchstens 1000 Zeichen an und liefert nur wav (16 kHz, mono): Senden Sie response_format wav oder lassen Sie das Feld weg, dann kommt wav statt mp3 zurück.
  • Guardrails. Inhalts-Guardrails (der Prompt-Injection-Scan) prüfen kein Audio. Anbieter-Sperren und Zero-Data-Retention-Regeln gelten weiterhin.

Modelle auflisten

typescript
const models = await client.models.list();

Liefert alle aktiven Modelle, für jeden Schlüssel dieselbe Liste, jeweils mit kind, context_length (sofern bekannt), sovereignty, pricing und, bei denkenden Modellen, einem reasoning-Objekt (supported_efforts, default_effort, supports_max_tokens, mandatory). Siehe Modelle & Souveränität.

Health

bash
curl https://api.kontinent.ai/healthz

Nicht authentifizierte Liveness-Probe. Nutzen Sie sie für Uptime-Monitoring, nicht für die Verfügbarkeit einzelner Modelle.

Verwandte Seiten

Limits & Konventionen Fehler behandeln

…