Für KI-Agenten: Schritt-für-Schritt-Anleitung zur Einrichtung — /docs/agents.md, Dokumentationsindex — /llms.txt.
API-Referenz
Alles zu Anfragen an das Gateway: Protokolle, Adressen, Schlüssel und Parameter. Unten — Streaming, Tool-Aufrufe, Reasoning, Plugins und die Kosten einer Anfrage in der Antwort.
Protokolle und Adressen#
Das Gateway akzeptiert die Formate von OpenAI und Anthropic. Die Basis-URL für das OpenAI SDK ist https://gate.joingonka.ai/v1, für das Anthropic SDK https://gate.joingonka.ai. Alle Protokolle nutzen denselben Schlüssel und dasselbe Guthaben: Eine Anfrage in jedem Format nimmt denselben Weg.
| Methode und Pfad | Format | Wofür | Besonderheiten |
|---|---|---|---|
POST /v1/chat/completions | OpenAI Chat Completions | Chat, Agenten, Tool-Aufrufe | Der Hauptweg: Alle anderen Formate übersetzt das Gateway in dieses. |
POST /v1/messages | Anthropic Messages | Claude Code und das Anthropic SDK | Basis-URL ohne /v1; die Modelle claude-* werden durch das empfohlene ersetzt; das Feld max_tokens ist Pflicht. |
POST /v1/responses | OpenAI Responses | Codex CLI und die neuen OpenAI SDKs | Zustandslos: Sende den gesamten Verlauf bei jeder Anfrage mit. |
POST /v1/completions | OpenAI Completions (legacy) | Autovervollständigung und Code-Bearbeitung in Editoren | suffix wird dem Modell als Hinweis übergeben; in der Antwort steht logprobs: null. |
POST /v1/embeddings | OpenAI Embeddings | Vektor-Darstellungen von Text | Antwort 501: Im Netzwerk gibt es keine Embedding-Modelle. |
Referenzadressen#
Antworten ohne Schlüssel. Die Modelltabelle mit Kontext und Status findest du im Abschnitt Modelle.
| Methode und Pfad | Beschreibung |
|---|---|
GET /v1/models | Modellliste: Kontext, Preise, unterstützte Parameter – Felder im OpenRouter-Format. |
GET /v1/models/{model} | Karte eines einzelnen Modells; der Slash in der id bleibt wie er ist oder %2F. Ein verborgenes oder unbekanntes Modell – 404 model_not_found. |
GET /v1/capabilities | Gateway-Funktionen: Parameter, Protokolle, Plugins, Kostenfelder und Limits (limits). |
GET /v1/plugins | Plugins: id und Name. |
GET /v1/network-status | Status der Netzwerk-Modelle: Verfügbarkeit, Latenzen, Uptime. |
GET /v1/nodes | Zusammenfassung des Node-Pools: Gesamtzahl, aktive und in Quarantäne. |
GET /v1/web-search/engines | Ob die Websuche aktiviert ist und in welchem Zustand ihre Engines sind. |
Anthropic Messages#
- Basis-URL –
https://gate.joingonka.ai: Das SDK fügt/v1/messagesselbst hinzu. - Der Schlüssel steht im Header
x-api-key(so sendet das Anthropic SDK) oderAuthorization: Bearer. - Die Modelle
claude-*ersetzt das Gateway durch das empfohlene (MiniMaxAI/MiniMax-M2.7); im Feldmodelder Antwort bleibt der Name, den der Client gesendet hat. max_tokensist Pflicht, wie in der Anthropic API; mehr als das Limit des Modells wird abgeschnitten.- Stream – Anthropic-Events; in Pausen sendet das Gateway
event: ping, ein Fehler kommt als Eventevent: error. - Die Überlegungen des Modells erscheinen nicht in der Antwort:
thinking-Blöcke gibt es nicht. - Das integrierte Tool
web_searchführt das Websuche-Plugin des Gateways aus – siehe Abschnitt Plugins. - Eine Token-Zählung (
/v1/messages/count_tokens) gibt es nicht – Antwort404.
Claude Code lässt sich am einfachsten mit dem Installer einrichten – Tools verbinden. Manuell über Umgebungsvariablen; ANTHROPIC_MODEL legt das Netzwerk-Modell fest.
export ANTHROPIC_BASE_URL=https://gate.joingonka.ai
export ANTHROPIC_AUTH_TOKEN=$JOINGONKA_API_KEY
export ANTHROPIC_MODEL=MiniMaxAI/MiniMax-M2.7
claudecurl https://gate.joingonka.ai/v1/messages \
-H "x-api-key: $JOINGONKA_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMaxAI/MiniMax-M2.7",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "What is Gonka?"}]
}'OpenAI Responses#
- Das Gateway speichert keine Antworten: Sende den gesamten Verlauf in
inputmit. Die Felderprevious_response_idundconversation– Fehler400mit Code. storewird akzeptiert und ändert nichts.- Tools:
functionundweb_search– letzteres führt das Websuche-Plugin aus. Andere integrierte Tools überspringt das Gateway, und die Anfrage wird ohne sie ausgeführt; ein solches Tool übertool_choicezu verlangen – Fehler400. - Die Teile
input_imageundinput_file– Fehler400: Die Netzwerk-Modelle arbeiten mit Text. - Die Zustands-Adressen (
GET /v1/responses/{id},DELETE /v1/responses/{id},GET /v1/responses/{id}/input_items,POST /v1/responses/{id}/cancel,POST /v1/responses/compact) antworten mit404und Code – Antworten speichert das Gateway nicht. - Codex CLI: Lege deine eigene Provider-id in
model_providerfest (nicht openai) – dann komprimiert Codex den Verlauf selbst, ohne/v1/responses/compact.
Legacy Completions#
prompt– ein String oder ein Array aus einem String; die Antwort steht inchoices[].text. Mehrere Prompts oder Tokens statt Text – Fehler400.suffixwird dem Modell als Hinweis im Prompt übergeben: Eine echte Mid-Fill-Funktion hat das Netzwerk nicht.- In der Antwort steht
logprobs: null;best_ofwird ignoriert;echofunktioniert.
Schlüssel und Autorisierung#
Der Schlüssel wird im Header Authorization: Bearer jg-… oder x-api-key: jg-… übergeben – an allen Adressen. Der Schlüssel wird nach der Registrierung auf der Seite gate.joingonka.ai/keys erstellt.
| Präfix | Schlüssel | Anfragen an Modelle |
|---|---|---|
jg- | Normaler Kontoschlüssel | ja |
gc- | Unterschlüssel: eigene Limits, Verbrauch geht vom Guthaben des Inhabers | ja |
gm- | Verwaltungsschlüssel: nur zur Verwaltung von Unterschlüsseln | nein – 403 forbidden |
- Jedem Schlüssel im Konto kann ein Ausgabenlimit pro Tag, pro Monat und insgesamt zugewiesen werden; Überschreitung –
402 child_key_limit_exceeded. - Die Anzahl der Anfragen pro Minute pro Schlüssel ist begrenzt – die Werte findest du im Abschnitt Limits.
- Ohne Schlüssel funktioniert nur der Demo-Chat auf der Website: Eine Anfrage ohne Schlüssel aus deinem eigenen Code erhält
402mitis_demo. - Schlüssel lassen sich nur im Konto verwalten:
/api/keysmit API-Schlüssel ist nicht verfügbar. Guthaben und Verbrauch pro Schlüssel – API-Konto.
Der Schlüssel ist ein Geheimnis: Bewahren Sie ihn nicht im Repository oder im Frontend-Code auf, sondern übergeben Sie ihn über Umgebungsvariablen.
Beispiele#
Dieselbe Anfrage in vier SDKs. Das Modell ist das empfohlene (MiniMaxAI/MiniMax-M2.7), der Schlüssel stammt aus der Umgebungsvariable JOINGONKA_API_KEY.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://gate.joingonka.ai/v1",
api_key=os.environ["JOINGONKA_API_KEY"],
)
response = client.chat.completions.create(
model="MiniMaxAI/MiniMax-M2.7",
messages=[{"role": "user", "content": "What is Gonka?"}],
)
print(response.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://gate.joingonka.ai/v1",
apiKey: process.env.JOINGONKA_API_KEY,
});
const response = await client.chat.completions.create({
model: "MiniMaxAI/MiniMax-M2.7",
messages: [{ role: "user", content: "What is Gonka?" }],
});
console.log(response.choices[0].message.content);curl https://gate.joingonka.ai/v1/chat/completions \
-H "Authorization: Bearer $JOINGONKA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMaxAI/MiniMax-M2.7",
"messages": [{"role": "user", "content": "What is Gonka?"}]
}'import os
import anthropic
client = anthropic.Anthropic(
base_url="https://gate.joingonka.ai",
api_key=os.environ["JOINGONKA_API_KEY"],
)
message = client.messages.create(
model="MiniMaxAI/MiniMax-M2.7",
max_tokens=1024,
messages=[{"role": "user", "content": "What is Gonka?"}],
)
print(message.content[0].text)Streaming-Antwort#
import os
from openai import OpenAI
client = OpenAI(base_url="https://gate.joingonka.ai/v1", api_key=os.environ["JOINGONKA_API_KEY"])
stream = client.chat.completions.create(
model="MiniMaxAI/MiniMax-M2.7",
messages=[{"role": "user", "content": "What is Gonka?"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://gate.joingonka.ai/v1", apiKey: process.env.JOINGONKA_API_KEY });
const stream = await client.chat.completions.create({
model: "MiniMaxAI/MiniMax-M2.7",
messages: [{ role: "user", content: "What is Gonka?" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}curl -N https://gate.joingonka.ai/v1/chat/completions \
-H "Authorization: Bearer $JOINGONKA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMaxAI/MiniMax-M2.7",
"messages": [{"role": "user", "content": "What is Gonka?"}],
"stream": true
}'import os
import anthropic
client = anthropic.Anthropic(base_url="https://gate.joingonka.ai", api_key=os.environ["JOINGONKA_API_KEY"])
with client.messages.stream(
model="MiniMaxAI/MiniMax-M2.7",
max_tokens=1024,
messages=[{"role": "user", "content": "What is Gonka?"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)Anfrageparameter#
Parameter von POST /v1/chat/completions, die das Gateway selbst garantiert – die Liste supported_parameters in der Antwort der Fähigkeiten:
| Parameter | Beschreibung |
|---|---|
temperature | Zufälligkeit der Antwort: je höher, desto vielfältiger. |
top_p | Token-Auswahl nach kumulierter Wahrscheinlichkeit. |
top_k | Auswahl aus den k wahrscheinlichsten Token. |
min_p | Abschneiden unwahrscheinlicher Token relativ zum wahrscheinlichsten. |
frequency_penalty | Strafe für häufige Wiederholungen. |
presence_penalty | Strafe für bereits vorgekommene Token. |
repetition_penalty | Multiplikator gegen Wiederholungen. |
stop | Zeichenketten, bei denen die Generierung stoppt. |
seed | Seed für Reproduzierbarkeit. |
max_tokens | Token-Limit der Antwort; über der Obergrenze des Modells wird auf diese gekürzt. |
max_completion_tokens | Anderer Name für max_tokens: Das Gateway überträgt den Wert dorthin. |
tools | Funktionen, die das Modell aufrufen kann, im OpenAI-Format. |
tool_choice | Ob eine Funktion aufgerufen wird: nach Wahl des Modells, nie, zwingend oder eine bestimmte. |
response_format | Strukturierte Antwort: json_object oder json_schema. |
- Ohne
temperaturesetzt das Gateway0.7ein. - Ohne
max_tokenssetzt das Gateway den Standard des Modells ein: ohne Stream kürzer, im Stream die Obergrenze des Modells. Zahlen je Modell finden Sie im Abschnitt Limits.
Werden unverändert ans Netz übergeben#
reasoning_effort, reasoning, enable_thinking, chat_template_kwargs, thinking_token_budget, min_tokens, logit_bias, n, parallel_tool_calls, extra_body. Das Gateway prüft sie nicht: Ein Wert außerhalb der Liste des Netzes führt zu Fehler 400 mit Typ api_error.
Werden nicht ans Netz übergeben#
Die übrigen Felder nimmt das Gateway an, übergibt sie aber nicht ans Netz – zum Beispiel user, metadata, store, logprobs, top_logprobs, thinking, stream_options, web_search_options. usage kommt im Stream immer mit.
Streaming#
stream: true– Antwort als SSE-Events; das letzte Event istdata: [DONE].- Vor dem Abschluss kommt ein Chunk mit
usage– immer, auch ohnestream_options. - In Pausen sendet das Gateway alle 15 s den Kommentar
: keep-alive– SSE-Clients überspringen ihn. - Solange der Stream nicht geöffnet ist, kommt die Ablehnung als normaler Antwortcode; danach als Chunk
joingonka-error. - Bei
delta.tool_calls– ein Aufruf pro Chunk: Vom Netz zusammengeklebte Aufrufe trennt das Gateway wieder.
data: {"object":"chat.completion.chunk","model":"MiniMaxAI/MiniMax-M2.7","choices":[{"index":0,"delta":{"content":"Hi"},"finish_reason":null}]}
data: {"object":"chat.completion.chunk","model":"MiniMaxAI/MiniMax-M2.7","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"object":"chat.completion.chunk","model":"MiniMaxAI/MiniMax-M2.7","choices":[],"usage":{"prompt_tokens":12,"completion_tokens":2,"total_tokens":14}}
data: [DONE]Service-Chunks des Gateways#
Sie sind am Feld id zu erkennen:
id | Wann und was drin steckt |
|---|---|
joingonka-error | Fehler nach Öffnen des Streams: Feld error, danach Abbruch ohne [DONE]. |
joingonka-stream-stalled | Das Netz schwieg länger als die zulässige Pause: Der Stream wird mit finish_reason: stop geschlossen. |
joingonka-stream-unfinished | Das Netz hat die Generierung abgebrochen: finish_reason: length – setzen Sie mit der nächsten Anfrage fort. |
joingonka-citations | Quellen der Websuche in delta.annotations – vor dem Abschluss. |
joingonka-meta | Kosten und Timings – nur mit dem Header x-joingonka-meta: 1. |
Stream in anderen Protokollen#
- Anthropic Messages: Events von
message_startbismessage_stop, in Pausenevent: ping, Fehler –event: error. - OpenAI Responses: Events
response.*, Fehler –response.failed. - Legacy Completions: bei Fehler –
data: {"error": …}, danach[DONE].
Tool-Aufrufe#
- OpenAI-Format:
toolsundtool_choice. Das alte Formatfunctionsundfunction_callwird ebenfalls akzeptiert – die Antwort kommt im selben Format. - Im Stream – ein Aufruf pro Chunk: Clients, die nur das erste Element lesen, verlieren keine Aufrufe.
- Verläufe, auf die das Netz mit Fehler
400antworten würde, repariert das Gateway: Die Rolledeveloperwird zusystem, leere und doppelte Aufruf-IDs erhalten eindeutige,argumentsals Objekt wird in einen JSON-String umgewandelt, ein fehlendertypewird ergänzt, ein Aufruf ohne Namen wird samt Ergebnis entfernt. - Einen Aufruf, den das Modell als Markup im Text geschrieben hat, überführt das Gateway in
tool_calls; falsche Aufrufe in einer Antwort auf eine Anfrage ohne Tools entfernt es. - Die Generierung brach mitten in den Argumenten ab – es kommt
finish_reason: length, nichttool_calls: Erhöhen Sie das Antwortlimit.
{
"model": "MiniMaxAI/MiniMax-M2.7",
"messages": [{"role": "user", "content": "What is the weather in Paris?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Current weather for a city",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}
}]
}Einschränkungen von JSON-Schema#
Tool-Schemas und response_format kompiliert das Netz zu einer Grammatik; reguläre Ausdrücke – mit der RE2-Engine. Das Gateway bringt das Schema in eine Form, die das Netz akzeptiert:
$refwerden an Ort und Stelle aufgelöst, die Abschnitte$defsunddefinitionsentfernt; eine rekursive Referenz wird zu einem Schema ohne Einschränkungen.patternmit Konstrukten, die es in RE2 nicht gibt (Lookahead und Lookbehind, Backreferences, atomare Gruppen, possessive Quantifizierer), wird entfernt; Wiederholungen über 1000 werden auf 1000 gekürzt.anyOfundoneOfaus Konstanten werden zuenumzusammengeführt; gibt es mehr nicht zusammenführbare Zweige als 16, wird die Vereinigung entfernt.
Das Schema kann weicher werden als das ursprüngliche – validieren Sie die Aufrufargumente auf Ihrer Seite.
Strukturierte Antwort#
response_format: {"type": "json_object"} – Antwort als valides JSON, {"type": "json_schema", "json_schema": {"name": …, "schema": …}} – nach Ihrem Schema mit den oben genannten Einschränkungen. Abgeschnittenes JSON ohne Stream repariert das Plugin response-healing.
{
"model": "MiniMaxAI/MiniMax-M2.7",
"messages": [{"role": "user", "content": "Name three planets."}],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "planets",
"schema": {
"type": "object",
"properties": {"planets": {"type": "array", "items": {"type": "string"}}},
"required": ["planets"]
}
}
}
}Reasoning#
- Die Überlegungen des Modells kommen getrennt von der Antwort:
message.reasoning_content, im Stream –delta.reasoning_content. Das Feldreasoningbenennt das Gateway in dieses Format um. - Überlegungen verbrauchen
max_tokens: Bei einem kleinen Limit bricht die Antwort (finish_reason: length) noch vor dem Text ab. - Gibt es keinen Antworttext, aber Überlegungen, überführt das Gateway sie in
content– außer bei Antworten mit Tool-Aufruf. reasoning_effortundreasoning.effortwerden ans Netz übergeben. Hat das Modell nur zwei Modi, passt das Gateway den Wert daran an:noneundminimal→low, höhere → Reasoning nach Standard.- Lehnt eine Node den Wert ab, stuft das Gateway ihn herab (
maxundxhigh→high,minimal→low, andernfalls wird das Feld entfernt) und wiederholt die Anfrage. - In
/v1/messageswerden Überlegungen nicht übergeben – es gibt keinethinking-Blöcke.
Plugins#
Plugins werden über das Feld plugins aktiviert – als Array von Strings oder Objekten mit Optionen. Die Liste – GET /v1/plugins.
| Plugin | Beschreibung | Bedingungen |
|---|---|---|
response-healing | Repariert abgeschnittenes JSON in der Antwort des Modells. | Nur ohne Stream und wenn die Antwort mit { oder [ beginnt. |
privacy-sanitization | Maskiert in Textnachrichten E-Mails, IPv4, Kartennummern, JWTs, 64-stellige Hex-Schlüssel und Schlüssel der Form sk-…, gw_…, gm-…, Bearer …. | Modus – Feld privacy_mode: redact (Standard) oder tokenize. |
file-parser | Extrahiert Text aus PDF. | Wenn der Nachrichtentext vollständig ein PDF als Base64 ist: data:application/pdf;base64,… oder ohne Präfix. |
web | Websuche: Ergebnisse werden in die Anfrage eingemischt, die Antwort erhält Quellenlinks. | Zusammen mit privacy-sanitization – Fehler 400. |
Websuche#
- Optionen:
max_results– von 1 bis 10, Standard 5;engine– Hinweis auf die Suchmaschine;search_prompt– eigener Text vor den Ergebnissen;enabled: false– Suche deaktivieren. - Quellen – in
message.annotations[].url_citation; im Stream – als Chunkjoingonka-citationsvor dem Abschluss. mode: "agent"– das Modell entscheidet selbst, ob und wonach es sucht;max_searches– von 1 bis 5, Standard 3.- Abrechnung: im Standardmodus nur Tokens (Suchergebnisse zählen zu den Eingabe-Tokens); im Agentenmodus die Tokens aller Schritte plus 1000 nGNK pro durchgeführter Suche (
x_joingonka.web_search_surcharge_ngonka). - In Anthropic Messages und OpenAI Responses führt das integrierte Tool
web_searchdasselbe Plugin im Agentenmodus aus.
{
"model": "MiniMaxAI/MiniMax-M2.7",
"messages": [{"role": "user", "content": "What is new in the Gonka network?"}],
"plugins": [{"id": "web", "max_results": 5}]
}{
"model": "MiniMaxAI/MiniMax-M2.7",
"messages": [{"role": "user", "content": "What is new in the Gonka network?"}],
"plugins": [{"id": "web", "mode": "agent", "max_searches": 3}]
}Kosten und Metafelder#
Eine Antwort ohne Streaming liefert die Kosten der Anfrage in usage:
| Feld | Beschreibung |
|---|---|
usage.cost_gnk | Kosten der Anfrage in GNK |
usage.platform_fee_gnk | Davon der Plattform-Aufschlag, GNK |
usage.total_cost_gnk | Gesamtbetrag zur Abbuchung in GNK |
usage.total_cost_usd | Gesamtbetrag in Dollar zum aktuellen GNK-Kurs |
- Im Stream enthält
usagenur Tokens; die Kosten stehen im Chunkjoingonka-meta. - Mit dem Header
x-joingonka-meta: 1erhält die AntwortPOST /v1/chat/completionseinen Blockx_joingonka: Kosten (cost_ngonka), Kontostand nach Abbuchung (balance_ngonka, nur ohne Streaming) und Timings (ttft_ms). Andere Protokolle geben diesen Block nicht zurück. x-request-id— die Anfrage-ID: fügen Sie sie Ihrem Support-Ticket bei.Retry-Afterkommt mit429: so viele Sekunden vor dem erneuten Versuch warten.- Die Header
X-TitleundHTTP-Referer(wie bei OpenRouter) helfen dem Gateway, Ihre Anwendung zu erkennen; ihr Inhalt wird nicht gespeichert.
Einschränkungen#
- Bilder:
image_url-Teile werden durch einen Text-Platzhalter ersetzt — das Modell sieht das Bild nicht (vision: falsein den Fähigkeiten). - Aus dem Browser ist die API nur von JoinGonka-Domains aus erreichbar (Prüfung
Origin): rufen Sie sie von Ihrem Server auf und legen Sie den Schlüssel nicht ins Frontend. - Embeddings:
POST /v1/embeddingsantwortet mit501— es gibt keine Embedding-Modelle im Netzwerk. - Fehlercodes, Limits und Timeouts finden Sie im Abschnitt Fehler und Limits.