Para sa mga AI agent: step-by-step na gabay sa setup — /docs/agents.md, index ng dokumentasyon — /llms.txt.
API reference
Lahat tungkol sa mga request sa gateway: mga protocol, address, key, at parameter. Sa ibaba — streaming, tool calling, reasoning, plugins, at ang halaga ng request sa response.
Mga protocol at address#
Tumatanggap ang gateway ng OpenAI at Anthropic formats. Ang base URL para sa OpenAI SDK ay https://gate.joingonka.ai/v1, para sa Anthropic SDK ay https://gate.joingonka.ai. Gumagana ang lahat ng protocol sa isang key at isang balance: ang request sa anumang format ay dumadaan sa parehong path.
| Method at path | Format | Para saan | Mga detalye |
|---|---|---|---|
POST /v1/chat/completions | OpenAI Chat Completions | Chat, agents, tool calls | Pangunahing path: dito isinasalin ng gateway ang iba pang format. |
POST /v1/messages | Anthropic Messages | Claude Code at Anthropic SDK | Base URL na walang /v1; ang mga modelong claude-* ay pinapalitan ng inirerekomenda; required ang field na max_tokens. |
POST /v1/responses | OpenAI Responses | Codex CLI at mga bagong OpenAI SDK | Walang state: ipadala ang buong history sa bawat request. |
POST /v1/completions | OpenAI Completions (legacy) | Autocomplete at pag-edit ng code sa mga editor | Ang suffix ay ipinapasa sa modelo bilang hint; sa response ay logprobs: null. |
POST /v1/embeddings | OpenAI Embeddings | Vector representations ng text | Response na 501: walang embedding models sa network. |
Mga reference address#
Sumasagot nang walang key. Ang talahanayan ng mga modelo na may context at status ay nasa seksyong Mga Modelo.
| Method at path | Paglalarawan |
|---|---|
GET /v1/models | Listahan ng mga modelo: context, presyo, mga sinusuportahang parameter — mga field sa OpenRouter format. |
GET /v1/models/{model} | Card ng isang modelo; ang slash sa id — as is o %2F. Nakatago o hindi kilalang modelo — 404 model_not_found. |
GET /v1/capabilities | Mga kakayahan ng gateway: parameters, protocols, plugins, cost fields, at limits (limits). |
GET /v1/plugins | Mga plugin: id at pangalan. |
GET /v1/network-status | Estado ng mga modelo ng network: availability, latency, uptime. |
GET /v1/nodes | Buod ng node pool: ilan ang total, active, at nasa quarantine. |
GET /v1/web-search/engines | Kung naka-enable ang web search at ano ang estado ng mga engine nito. |
Anthropic Messages#
- Base URL —
https://gate.joingonka.ai: idadagdag mismo ng SDK ang/v1/messages. - Key — sa header na
x-api-key(ganito ang ipinapadala ng Anthropic SDK) oAuthorization: Bearer. - Ang mga modelong
claude-*ay pinapalitan ng gateway ng inirerekomenda (MiniMaxAI/MiniMax-M2.7); sa field namodelng response, nananatili ang pangalang ipinadala ng client. - Required ang
max_tokens, tulad sa Anthropic API; kung lumampas sa ceiling ng modelo — pinuputol. - Stream — Anthropic events; sa mga pause, nagpapadala ang gateway ng
event: ping, dumarating ang error bilang event naevent: error. - Hindi kasama sa response ang reasoning ng modelo: walang
thinkingblocks. - Ang built-in na tool na
web_searchay pinapatupad ng web search plugin ng gateway — tingnan ang seksyong Mga plugin. - Walang token counting (
/v1/messages/count_tokens) — response na404.
Mas madaling i-setup ang Claude Code gamit ang installer — pagkonekta ng mga tool. Manu-manong paraan — gamit ang environment variables; ang ANTHROPIC_MODEL ay nagpi-pin ng network model.
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#
- Hindi nag-iimbak ng responses ang gateway: ipadala ang buong history sa
input. Ang mga field naprevious_response_idatconversation— error na400na may code. - Tinatanggap ang
storeat wala itong binabago. - Mga tool:
functionatweb_search— pinapatupad ito ng web search plugin. Ang iba pang built-in na tool ay nilalaktawan ng gateway, at ang request ay tumatakbo nang wala ang mga ito; ang paghingi ng ganoong tool sa pamamagitan ngtool_choice— error na400. - Ang mga parteng
input_imageatinput_file— error na400: text lang ang kayang gawin ng mga modelo ng network. - Ang mga state address (
GET /v1/responses/{id},DELETE /v1/responses/{id},GET /v1/responses/{id}/input_items,POST /v1/responses/{id}/cancel,POST /v1/responses/compact) ay sumasagot ng404na may code — hindi nag-iimbak ng responses ang gateway. - Codex CLI: itakda ang sariling provider id sa
model_provider(hindi openai) — sa ganoon, ang Codex mismo ang nag-compress ng history, walang/v1/responses/compact.
Legacy Completions#
- Ang
prompt— string o array na may isang string; ang response — sachoices[].text. Maraming prompt o tokens sa halip na text — error na400. - Ang
suffixay ipinapasa sa modelo bilang hint sa prompt: walang tunay na middle fill ang network. - Sa response ay
logprobs: null; hindi pinapansin angbest_of; gumagana angecho.
Mga key at authorization#
Ipinapasa ang key sa header na Authorization: Bearer jg-… o x-api-key: jg-… — sa lahat ng address. Ginagawa ang key pagkatapos ng registration sa page na gate.joingonka.ai/keys.
| Prefix | Key | Mga request sa mga modelo |
|---|---|---|
jg- | Karaniwang key ng account | oo |
gc- | Child key: sariling limits, gastos — mula sa balance ng may-ari | oo |
gm- | Management key: para sa pamamahala ng mga child key lang | hindi — 403 forbidden |
- Bawat key sa account ay maaaring bigyan ng limit sa gastos kada araw, kada buwan, at total; paglampas —
402 child_key_limit_exceeded. - Limitado ang bilang ng request kada minuto bawat key — ang mga value ay nasa seksyong Mga limitasyon.
- Walang key na gumagana maliban sa demo chat sa site: ang request na walang key mula sa sariling code ay makakatanggap ng
402na mayis_demo. - Sa account lang pinapamahalaan ang mga key: ang
/api/keysna may API key ay hindi available. Balance at gastos bawat key — API ng account.
Ang susi ay isang sikreto: huwag itong itago sa repository o sa code ng frontend, ipasa ito sa pamamagitan ng mga environment variable.
Mga halimbawa#
Isang kahilingan, apat na SDK. Ang modelo ay ang inirerekomenda (MiniMaxAI/MiniMax-M2.7), ang susi ay mula sa environment variable na 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 na tugon#
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)Mga parameter ng kahilingan#
Ang mga parameter ng POST /v1/chat/completions na garantiyado mismo ng gateway — ang listahang supported_parameters sa sagot ng capabilities:
| Parameter | Paglalarawan |
|---|---|
temperature | Ang randomness ng tugon: mas mataas, mas iba-iba. |
top_p | Pagpili ng mga token ayon sa kabuuang probabilidad. |
top_k | Pagpili mula sa k pinaka-malamang na mga token. |
min_p | Pagtatanggal ng mga token na mababa ang probabilidad kumpara sa pinaka-malamang. |
frequency_penalty | Parusa sa madalas na pag-uulit. |
presence_penalty | Parusa sa mga token na lumitaw na. |
repetition_penalty | Multiplier laban sa pag-uulit. |
stop | Mga string kung saan humihinto ang generasyon. |
seed | Seed para sa reproducibility. |
max_tokens | Limitasyon ng mga token ng tugon; lampas sa kisame ng modelo — pinuputol hanggang sa kisame. |
max_completion_tokens | Isa pang pangalan ng max_tokens: inililipat ng gateway ang halaga dito. |
tools | Mga function na maaaring tawagin ng modelo, sa format ng OpenAI. |
tool_choice | Kung tatawagin ang function: bahala sa modelo, hindi kailanman, sapilitan, o isang partikular. |
response_format | May istrukturang tugon: json_object o json_schema. |
- Kung walang
temperature, naglalagay ang gateway ng0.7. - Kung walang
max_tokens, naglalagay ang gateway ng default ng modelo: walang stream — mas maikli, sa stream — kisame ng modelo. Ang mga numero ayon sa modelo — sa seksyong Mga limitasyon.
Ipinapasa sa network nang ganito#
reasoning_effort, reasoning, enable_thinking, chat_template_kwargs, thinking_token_budget, min_tokens, logit_bias, n, parallel_tool_calls, extra_body. Hindi ito sinusuri ng gateway: ang halagang wala sa listahan ng network — error na 400 na may type na api_error.
Hindi ipinapasa sa network#
Ang iba pang field ay tinatanggap ng gateway at hindi ipinapasa sa network — halimbawa, user, metadata, store, logprobs, top_logprobs, thinking, stream_options, web_search_options. Ang usage sa stream ay laging dumarating.
Streaming#
stream: true— tugon sa mga event na SSE; ang huling event —data: [DONE].- Bago ang pagtatapos ay dumarating ang chunk na may
usage— lagi, kahit walangstream_options. - Sa mga paghinto, bawat 15 s ay nagpapadala ang gateway ng komentong
: keep-alive— nilalaktawan ito ng mga SSE client. - Habang hindi pa bukas ang stream, ang pagtanggi ay dumarating sa karaniwang response code; pagkatapos mabuksan — sa chunk na
joingonka-error. - Sa
delta.tool_calls— isang tawag bawat chunk: ang mga tawag na pinagdikit ng network ay hinihiwalay ng gateway.
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]Mga service chunk ng gateway#
Makikilala ang mga ito sa field na id:
id | Kailan at ano ang nasa loob |
|---|---|
joingonka-error | Pagkabigo pagkatapos mabuksan ang stream: field na error, pagkatapos ay putol na walang [DONE]. |
joingonka-stream-stalled | Tumahimik ang network nang mas matagal kaysa sa pinapayagang paghinto: nagsasara ang stream na may finish_reason: stop. |
joingonka-stream-unfinished | Pinutol ng network ang generasyon: finish_reason: length — ipagpatuloy sa susunod na kahilingan. |
joingonka-citations | Mga pinagmulan ng web search sa delta.annotations — bago ang pagtatapos. |
joingonka-meta | Gastos at timing — may header na x-joingonka-meta: 1 lamang. |
Stream sa iba pang protocol#
- Anthropic Messages: mga event mula
message_starthanggangmessage_stop, sa mga paghintoevent: ping, pagkabigo —event: error. - OpenAI Responses: mga event na
response.*, pagkabigo —response.failed. - Legacy Completions: sa pagkabigo —
data: {"error": …}, pagkatapos ay[DONE].
Pagtawag ng tool#
- Format ng OpenAI:
toolsattool_choice. Tinatanggap din ang lumang format nafunctionsatfunction_call— darating ang tugon sa parehong format. - Sa stream — isang tawag bawat chunk: ang mga client na binabasa lamang ang unang elemento ay hindi nawawalan ng mga tawag.
- Ang kasaysayan kung saan magbabalik sana ng error na
400ang network ay inaayos ng gateway: ang papel nadeveloperay nagigingsystem, ang mga walang laman at paulit-ulit na id ng tawag ay binibigyan ng natatangi, angargumentsbilang object ay ginagawang JSON string, ang nawawalangtypeay dinadagdagan, ang tawag na walang pangalan ay tinatanggal kasama ang resulta. - Ang tawag na isinulat ng modelo bilang markup sa teksto ay inililipat ng gateway sa
tool_calls; ang mga huwad na tawag sa sagot sa kahilingang walang tool ay tinatanggal. - Naputol ang generasyon sa gitna ng mga argumento — darating ang
finish_reason: length, hindi angtool_calls: taasan ang limitasyon ng tugon.
{
"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"]
}
}
}]
}Mga limitasyon ng JSON-Schema#
Ang mga schema ng tool at response_format ay kinokompila ng network sa gramatika; ang mga regular expression — sa engine na RE2. Ginagabayan ng gateway ang schema sa anyong tatanggapin ng network:
- Ang
$refay ibinubukas sa lugar, ang mga seksyong$defsatdefinitionsay tinatanggal; ang recursive reference ay nagiging schema na walang limitasyon. - Ang
patternna may mga konstruksyon na wala sa RE2 (lookahead at lookbehind, backreference, atomic group, possessive quantifier) ay inaalis; ang mga pag-uulit na higit sa 1000 ay pinaiikli hanggang 1000. - Ang
anyOfatoneOfmula sa mga constant ay nagsasama-sama saenum; kung ang mga hindi masasamang sangay ay higit sa 16, ang unyon ay inaalis.
Maaaring maging mas maluwag ang schema kaysa sa orihinal — suriin ang mga argumento ng tawag sa inyong panig.
May istrukturang tugon#
response_format: {"type": "json_object"} — tugon na valid na JSON, {"type": "json_schema", "json_schema": {"name": …, "schema": …}} — ayon sa inyong schema na may mga limitasyon sa itaas. Ang pinutol na JSON na walang stream ay inaayos ng plugin na 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"]
}
}
}
}Pangangatwiran#
- Ang pangangatwiran ng modelo ay dumarating hiwalay sa tugon:
message.reasoning_content, sa stream —delta.reasoning_content. Ang field nareasoningay pinapalitan ng pangalan ng gateway sa format na ito. - Ang pangangatwiran ay gumagastos ng
max_tokens: sa maliit na limitasyon, napuputol ang tugon (finish_reason: length) bago pa ang teksto. - Kung walang teksto ng tugon ngunit may pangangatwiran, inililipat ito ng gateway sa
content— maliban sa mga tugon na may tawag ng tool. - Ang
reasoning_effortatreasoning.effortay ipinapasa sa network. Kung ang modelo ay may dalawang mode lamang, iniaayos ng gateway ang halaga sa mga ito:noneatminimal— salow, mas mataas — sa default na pangangatwiran. - Kung tinanggihan ng node ang halaga, ibinababa ito ng gateway (
maxatxhigh→high,minimal→low, kung hindi ay inaalis ang field) at inuulit ang kahilingan. - Sa
/v1/messages, hindi ipinapasa ang pangangatwiran — walang mga block nathinking.
Mga plugin#
Ang mga plugin ay pinapagana ng field na plugins — array ng mga string o object na may mga opsyon. Ang listahan — GET /v1/plugins.
| Plugin | Paglalarawan | Mga kondisyon |
|---|---|---|
response-healing | Inaayos ang pinutol na JSON sa tugon ng modelo. | Walang stream lamang at kung ang tugon ay nagsisimula sa { o [. |
privacy-sanitization | Tinatakpan sa mga text message ang email, IPv4, numero ng card, JWT, 64-character hex key at mga key na parang sk-…, gw_…, gm-…, Bearer …. | Mode — field na privacy_mode: redact (default) o tokenize. |
file-parser | Kinukuha ang teksto mula sa PDF. | Kung ang teksto ng mensahe ay buong PDF sa base64: data:application/pdf;base64,… o walang prefix. |
web | Web search: ang mga resulta ay hinahalo sa kahilingan, ang tugon ay nakakakuha ng mga link sa mga pinagmulan. | Kasama ng privacy-sanitization — error na 400. |
Web search#
- Mga opsyon:
max_results— mula 1 hanggang 10, default 5;engine— hint ng engine;search_prompt— sariling teksto bago ang mga resulta;enabled: false— patayin ang paghahanap. - Mga pinagmulan — sa
message.annotations[].url_citation; sa stream — chunk najoingonka-citationsbago ang pagtatapos. mode: "agent"— ang modelo mismo ang nagpapasya kung maghahanap at ano;max_searches— mula 1 hanggang 5, default 3.- Pagbabayad: sa normal na mode — mga token lang (kasama sa input tokens ang mga resulta ng paghahanap); sa agent mode — mga token ng lahat ng hakbang at 1000 nGNK para sa bawat isinagawang paghahanap (
x_joingonka.web_search_surcharge_ngonka). - Sa Anthropic Messages at OpenAI Responses, ang built-in na tool na
web_searchay nagpapatupad ng parehong plugin sa agent mode.
{
"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}]
}Gastos at mga service field#
Ang sagot na walang stream ay nagdadala ng gastos ng request sa usage:
| Field | Paglalarawan |
|---|---|
usage.cost_gnk | Gastos ng request sa GNK |
usage.platform_fee_gnk | Mula rito — ang markup ng platform, GNK |
usage.total_cost_gnk | Kabuuan na ibabawas sa GNK |
usage.total_cost_usd | Kabuuan sa dolyar ayon sa kasalukuyang rate ng GNK |
- Sa stream, ang
usageay naglalaman lamang ng mga token; ang gastos — sa chunk najoingonka-meta. - Sa header na
x-joingonka-meta: 1, ang sagot naPOST /v1/chat/completionsay nakakakuha ng block nax_joingonka: gastos (cost_ngonka), balanse pagkatapos ng pagbawas (balance_ngonka, walang stream lang) at mga timing (ttft_ms). Hindi ibinibigay ng ibang protocol ang block na ito. x-request-id— identifier ng request: isama ito sa iyong pakikipag-ugnayan sa support.- Dumarating ang
Retry-Afterkasama ng429: ganoong karaming segundo ang hintayin bago ulitin. - Ang mga header na
X-TitleatHTTP-Referer(tulad ng sa OpenRouter) ay tumutulong sa gateway na makilala ang iyong app; hindi iniimbak ang kanilang teksto.
Mga limitasyon#
- Mga larawan: ang mga bahaging
image_urlay pinapalitan ng text placeholder — hindi nakikita ng modelo ang larawan (vision: falsesa mga kakayahan). - Mula sa browser, ang API ay maa-access lamang mula sa mga domain ng JoinGonka (check ng
Origin): tawagin ito mula sa iyong server, huwag ilagay ang key sa frontend. - Mga embedding: ang
POST /v1/embeddingsay tumutugon ng501— walang embedding models sa network. - Mga error code, limitasyon at timeout — sa seksyong Mga Error at Limit.