AI エージェント向け:セットアップの手順ガイド — /docs/agents.md、ドキュメントのインデックス — /llms.txt。

APIリファレンス

ゲートウェイへのリクエストに関するすべて:プロトコル、アドレス、キー、パラメータ。以下ではストリーミング、ツール呼び出し、推論、プラグイン、そしてレスポンスに含まれるリクエストのコストを解説します。

プロトコルとアドレス#

ゲートウェイはOpenAIとAnthropicのフォーマットを受け付けます。OpenAI SDKのベースURLはhttps://gate.joingonka.ai/v1、Anthropic SDKはhttps://gate.joingonka.aiです。すべてのプロトコルは1つのキーと1つの残高で動作し、どのフォーマットのリクエストも同じ経路を通ります。

メソッドとパスフォーマット用途特徴
POST /v1/chat/completionsOpenAI Chat Completionsチャット、エージェント、ツール呼び出しメイン経路:他のフォーマットはゲートウェイがこれに変換します。
POST /v1/messagesAnthropic MessagesClaude CodeとAnthropic SDKベースURLに/v1は不要。モデルclaude-*は推奨モデルに置き換えられます。max_tokensフィールドは必須です。
POST /v1/responsesOpenAI ResponsesCodex CLIと新しいOpenAI SDKステートレス:毎回のリクエストで履歴をすべて送ってください。
POST /v1/completionsOpenAI Completions (legacy)エディタでの自動補完とコード修正suffixはプロンプト内のヒントとしてモデルに渡されます。レスポンスにはlogprobs: nullが含まれます。
POST /v1/embeddingsOpenAI Embeddingsテキストのベクトル表現レスポンスは501:ネットワークに埋め込みモデルがありません。

リファレンスアドレス#

キーなしで応答します。コンテキストとステータスを含むモデル表はモデルセクションにあります。

メソッドとパス説明
GET /v1/modelsモデル一覧:コンテキスト、価格、対応パラメータ — フィールドはOpenRouter形式です。
GET /v1/models/{model}1つのモデルのカード。idのスラッシュはそのままか%2F。非表示または不明なモデルは404 model_not_found。
GET /v1/capabilitiesゲートウェイの機能:パラメータ、プロトコル、プラグイン、コストフィールド、リミット(limits)。
GET /v1/pluginsプラグイン:idと名前。
GET /v1/network-statusネットワークモデルの状態:可用性、レイテンシ、アップタイム。
GET /v1/nodesノードプールの概要:合計、アクティブ、隔離中。
GET /v1/web-search/enginesウェブ検索が有効かどうか、およびそのエンジンの状態。

Anthropic Messages#

  • ベースURL — https://gate.joingonka.ai:SDKが自動で/v1/messagesを追加します。
  • キーはx-api-keyヘッダー(Anthropic SDKが送信する形式)またはAuthorization: Bearerで渡します。
  • モデルclaude-*はゲートウェイが推奨モデル(MiniMaxAI/MiniMax-M2.7)に置き換えます。レスポンスのmodelフィールドにはクライアントが送った名前がそのまま残ります。
  • max_tokensはAnthropic APIと同様に必須です。モデルの上限を超える場合は切り詰められます。
  • ストリームはAnthropicのイベント形式。ポーズ中にゲートウェイはevent: pingを送り、障害はevent: errorイベントで通知されます。
  • モデルの推論はレスポンスに含まれません:thinkingブロックはありません。
  • 組み込みツールweb_searchはゲートウェイのウェブ検索プラグインが実行します — プラグインセクションを参照。
  • トークン数カウント(/v1/messages/count_tokens)はありません — レスポンスは404。

Claude Codeはインストーラーで設定するのが簡単です — ツールの接続。手動の場合は環境変数で。ANTHROPIC_MODELでネットワークのモデルを固定できます。

export ANTHROPIC_BASE_URL=https://gate.joingonka.ai
export ANTHROPIC_AUTH_TOKEN=$JOINGONKA_API_KEY
export ANTHROPIC_MODEL=MiniMaxAI/MiniMax-M2.7
claude

OpenAI Responses#

  • ゲートウェイはレスポンスを保存しません:inputに履歴をすべて送ってください。previous_response_idとconversationフィールドはコード付きの400エラーになります。
  • storeは受け付けられますが何も変わりません。
  • ツール:functionとweb_search — 後者はウェブ検索プラグインが実行します。その他の組み込みツールはゲートウェイがスキップし、リクエストはそれらなしで実行されます。tool_choiceでそのようなツールを要求すると400エラーになります。
  • input_imageとinput_fileパートは400エラー:ネットワークのモデルはテキストのみ扱います。
  • ステート関連のルート(GET /v1/responses/{id}, DELETE /v1/responses/{id}, GET /v1/responses/{id}/input_items, POST /v1/responses/{id}/cancel, POST /v1/responses/compact)はコード付きの404を返します — ゲートウェイはレスポンスを保存しません。
  • Codex CLI:model_providerに独自のプロバイダーidを設定してください(openai以外)。そうすればCodexが/v1/responses/compactなしで履歴を自ら圧縮します。

Legacy Completions#

  • promptは文字列または1つの文字列の配列。レスポンスはchoices[].textに含まれます。複数のプロンプトやテキストの代わりのトークンは400エラーになります。
  • suffixはプロンプト内のヒントとしてモデルに渡されます:ネットワークには本当のmid-fill機能はありません。
  • レスポンスにはlogprobs: nullが含まれます。best_ofは無視されます。echoは動作します。

キーと認証#

キーはAuthorization: Bearer jg-…またはx-api-key: jg-…ヘッダーで渡します — すべてのアドレスで同じです。キーはgate.joingonka.ai/keysページで登録後に作成します。

プレフィックスキーモデルへのリクエスト
jg-通常のアカウントキーはい
gc-子キー:独自のリミット、消費はオーナーの残高からはい
gm-管理キー:子キーの管理のみいいえ — 403 forbidden
  • マイページで各キーに日次・月次・累計の支出リミットを設定できます。超過時は402 child_key_limit_exceeded。
  • キーごとの1分あたりのリクエスト数には上限があります — 値はレート制限セクションにあります。
  • キーなしで動作するのはサイト上のデモチャットのみです:自分のコードからキーなしでリクエストするとis_demo付きの402が返ります。
  • キーの管理はマイページでのみ可能です:APIキーを使った/api/keysはアクセスできません。残高とキーごとの消費はアカウントAPIで確認できます。

キーはシークレットです。リポジトリやフロントエンドのコードに保存せず、環境変数を通じて渡してください。

例#

同じリクエストを4つのSDKで。モデルは推奨のMiniMaxAI/MiniMax-M2.7、キーは環境変数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 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)

リクエストパラメータ#

ゲートウェイが自ら保証するPOST /v1/chat/completionsのパラメータ — 機能レスポンスのsupported_parametersリスト:

パラメータ説明
temperature応答のランダム性。高いほど多様になります。
top_p累積確率によるトークンの選別。
top_k上位k個の最も確率の高いトークンからの選別。
min_p最も確率の高いトークンに対する低確率トークンのカットオフ。
frequency_penalty頻繁な繰り返しへのペナルティ。
presence_penalty既出トークンへのペナルティ。
repetition_penalty繰り返しを抑える乗数。
stop生成を停止する文字列。
seed再現性のためのシード。
max_tokens応答トークンの上限。モデルの上限を超える場合は上限まで切り詰められます。
max_completion_tokensmax_tokensの別名。ゲートウェイは値をこちらに移します。
toolsモデルが呼び出せる関数。OpenAI形式。
tool_choice関数を呼び出すかどうか: モデル任せ、呼ばない、必ず呼ぶ、特定の関数を指定。
response_format構造化応答: json_objectまたはjson_schema。
  • temperatureがない場合、ゲートウェイは0.7を適用します。
  • max_tokensがない場合、ゲートウェイはモデルのデフォルトを適用します。非ストリームでは短め、ストリームではモデルの上限。モデルごとの数値はレート制限を参照。

そのままネットワークに転送#

reasoning_effort, reasoning, enable_thinking, chat_template_kwargs, thinking_token_budget, min_tokens, logit_bias, n, parallel_tool_calls, extra_body。ゲートウェイは検証しません。ネットワークのリスト外の値は400エラー(タイプapi_error)になります。

ネットワークに転送されない#

その他のフィールドはゲートウェイが受け取りますが、ネットワークには転送しません — 例えばuser, metadata, store, logprobs, top_logprobs, thinking, stream_options, web_search_options。ストリームでのusageは常に届きます。

ストリーミング#

  • stream: true — SSEイベントとしての応答。最後のイベントはdata: [DONE]。
  • 完了前にusageを含むチャンクが届きます — stream_optionsがなくても常に。
  • ポーズ中、ゲートウェイは15秒ごとにコメント: keep-aliveを送信します — SSEクライアントはこれをスキップします。
  • ストリームが開く前は、拒否は通常のレスポンスコードで返ります。開いた後はjoingonka-errorチャンクで返ります。
  • delta.tool_callsでは1チャンクにつき1回の呼び出し。ネットワークが連結した呼び出しはゲートウェイが分割します。
SSE
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]

ゲートウェイの制御チャンク#

idフィールドで識別できます:

idいつ、何が含まれるか
joingonka-errorストリーム開放後の障害: errorフィールド、その後[DONE]なしで切断。
joingonka-stream-stalledネットワークが許容ポーズ以上に沈黙: ストリームはfinish_reason: stopで閉じられます。
joingonka-stream-unfinishedネットワークが生成を中断: finish_reason: length — 次のリクエストで続けてください。
joingonka-citationsdelta.annotations内のウェブ検索ソース — 完了前に。
joingonka-metaコストとタイミング — x-joingonka-meta: 1ヘッダーがある場合のみ。

他プロトコルでのストリーム#

  • Anthropic Messages: message_startからmessage_stopまでのイベント、ポーズ中はevent: ping、障害はevent: error。
  • OpenAI Responses: イベントresponse.*、障害はresponse.failed。
  • Legacy Completions: 障害時はdata: {"error": …}、その後[DONE]。

ツール呼び出し#

  • OpenAI形式: toolsとtool_choice。旧形式のfunctionsとfunction_callも受け付けます — 応答も同じ形式で返ります。
  • ストリームでは1チャンクにつき1回の呼び出し。最初の要素だけを読むクライアントも呼び出しを失いません。
  • ネットワークが400エラーを返すような履歴をゲートウェイが修正します: developerロールはsystemになり、空または重複する呼び出しIDにはユニークなIDが付与され、argumentsがオブジェクトの場合はJSON文字列に変換され、欠落したtypeが補完され、名前のない呼び出しは結果と共に削除されます。
  • モデルがテキスト内のマークアップで書いた呼び出しは、ゲートウェイがtool_callsに移します。ツールなしのリクエストへの応答内の偽の呼び出しは削除します。
  • 引数の途中で生成が中断された場合、tool_callsではなくfinish_reason: lengthが届きます: 応答の上限を増やしてください。
JSON
{
  "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"]
      }
    }
  }]
}

JSON-Schemaの制約#

ツールスキーマとresponse_formatはネットワークが文法にコンパイルします。正規表現はRE2エンジンです。ゲートウェイはスキーマをネットワークが受け入れる形式に整えます:

  • $refはその場で展開され、$defsとdefinitionsセクションは削除されます。再帰参照は制約なしのスキーマになります。
  • RE2にない構文(先読み・後読み、後方参照、アトミックグループ、独占的量指定子)を含むpatternは削除されます。1000を超える繰り返しは1000に短縮されます。
  • 定数からなるanyOfとoneOfはenumに折りたたまれます。折りたたみ不可能なブランチが16を超える場合、unionは削除されます。

スキーマは元より緩くなる可能性があります — 呼び出し引数はご自身で検証してください。

構造化応答#

response_format: {"type": "json_object"} — 有効なJSONとして応答、{"type": "json_schema", "json_schema": {"name": …, "schema": …}} — 上記の制約付きのあなたのスキーマに従って。ストリームなしで切り詰められたJSONはresponse-healingプラグインが修正します。

JSON
{
  "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"]
      }
    }
  }
}

推論#

  • モデルの推論は応答とは別に届きます: message.reasoning_content、ストリームではdelta.reasoning_content。reasoningフィールドはゲートウェイがこの形式にリネームします。
  • 推論はmax_tokensを消費します。上限が小さいと、テキストの前で応答が途切れます(finish_reason: length)。
  • 応答テキストがなく推論がある場合、ゲートウェイはそれをcontentに移します — ツール呼び出しを含む応答を除く。
  • reasoning_effortとreasoning.effortはネットワークに転送されます。モデルに2つのモードしかない場合、ゲートウェイは値をそれらに変換します: noneとminimalはlowへ、それ以上はデフォルトの推論へ。
  • ノードが値を拒否した場合、ゲートウェイはそれを下げて(maxとxhigh → high、minimal → low、それ以外はフィールドを削除)、リクエストを再試行します。
  • /v1/messagesでは推論は転送されません — thinkingブロックはありません。

プラグイン#

プラグインはpluginsフィールドで有効化します — 文字列の配列またはオプション付きオブジェクト。リストはGET /v1/plugins。

プラグイン説明条件
response-healingモデル応答内の切り詰められたJSONを修正します。ストリームなしで、かつ応答が{または[で始まる場合のみ。
privacy-sanitizationテキストメッセージ内のemail、IPv4、カード番号、JWT、64文字のhexキー、sk-…, gw_…, gm-…, Bearer …形式のキーをマスクします。モード — privacy_modeフィールド: redact(デフォルト)またはtokenize。
file-parserPDFからテキストを抽出します。メッセージテキスト全体がbase64のPDFの場合: data:application/pdf;base64,…またはプレフィックスなし。
webウェブ検索: 結果がリクエストに混ぜ込まれ、応答にソースへのリンクが付きます。privacy-sanitizationと併用すると400エラー。
  • オプション: max_results — 1から10まで、デフォルト5; engine — エンジンのヒント; search_prompt — 結果の前のカスタムテキスト; enabled: false — 検索をオフ。
  • ソース — message.annotations[].url_citation内; ストリームでは完了前のjoingonka-citationsチャンク。
  • mode: "agent" — モデル自身が検索するかどうかと何を検索するかを決めます; max_searches — 1から5まで、デフォルト3。
  • 課金:通常モードではトークンのみ(検索結果は入力トークンに含まれます)。エージェントモードでは全ステップのトークンに加え、実行された検索ごとに1000 nGNK(x_joingonka.web_search_surcharge_ngonka)がかかります。
  • Anthropic MessagesとOpenAI Responsesでは、組み込みツールweb_searchが同じプラグインをエージェントモードで実行します。
{
  "model": "MiniMaxAI/MiniMax-M2.7",
  "messages": [{"role": "user", "content": "What is new in the Gonka network?"}],
  "plugins": [{"id": "web", "max_results": 5}]
}

コストとメタデータフィールド#

非ストリーミングのレスポンスは、リクエストのコストをusageに含めて返します:

フィールド説明
usage.cost_gnkGNK建てのリクエストコスト
usage.platform_fee_gnkうちプラットフォーム手数料(GNK)
usage.total_cost_gnk請求合計(GNK)
usage.total_cost_usd現在のGNKレートによるドル換算の合計
  • ストリーミングではusageにトークンのみが含まれ、コストはチャンクjoingonka-metaに入ります。
  • ヘッダーx-joingonka-meta: 1を付けると、レスポンスPOST /v1/chat/completionsにブロックx_joingonkaが追加されます:コスト(cost_ngonka)、請求後の残高(balance_ngonka、非ストリーミングのみ)、タイミング(ttft_ms)。他のプロトコルはこのブロックを返しません。
  • x-request-idはリクエストIDです。サポートへの問い合わせの際に添付してください。
  • Retry-Afterは429とともに返されます。再試行までに待つべき秒数を示します。
  • ヘッダーX-TitleとHTTP-Referer(OpenRouterと同様)は、ゲートウェイがお客様のアプリを識別するのに役立ちます。テキストは保存されません。

制限#

  • 画像:image_urlパートはテキストのプレースホルダーに置き換えられます。モデルは画像を見ることができません(機能のvision: false)。
  • ブラウザからのAPIアクセスはJoinGonkaのドメインのみ許可されています(Originチェック)。サーバー側から呼び出し、キーをフロントエンドに置かないでください。
  • エンベディング:POST /v1/embeddingsは501を返します。ネットワークにエンベディングモデルがありません。
  • エラーコード、制限、タイムアウトはエラーと制限セクションをご覧ください。