AI 에이전트용: 단계별 설정 안내 — /docs/agents.md, 문서 인덱스 — /llms.txt.

API 레퍼런스

게이트웨이 요청에 관한 모든 것: 프로토콜, 주소, 키, 파라미터. 아래에서는 스트리밍, 도구 호출, 추론, 플러그인, 그리고 응답에 포함된 요청 비용을 다룹니다.

프로토콜 및 주소#

게이트웨이는 OpenAI와 Anthropic 형식을 모두 허용합니다. OpenAI SDK의 기본 URL은 https://gate.joingonka.ai/v1, Anthropic SDK는 https://gate.joingonka.ai입니다. 모든 프로토콜이 하나의 키와 하나의 잔액으로 작동하며, 어떤 형식의 요청이든 동일한 경로를 거칩니다.

메서드 및 경로형식용도특징
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}단일 모델 카드; 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에 자체 provider id를 설정하세요(openai 아님) — 그러면 Codex가 /v1/responses/compact 없이 스스로 기록을 압축합니다.

Legacy Completions#

  • prompt는 문자열 또는 하나의 문자열 배열입니다; 응답은 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.
  • 키당 분당 요청 수에 제한이 있습니다 — 값은 한도 섹션에 있습니다.
  • 키 없이 작동하는 것은 사이트의 데모 채팅뿐입니다: 자체 코드에서 키 없이 요청하면 is_demo와 함께 402가 반환됩니다.
  • 키 관리는 마이페이지에서만 가능합니다: API 키를 사용한 /api/keys는 접근할 수 없습니다. 잔액과 키별 소비는 계정 API에서 확인하세요.

키는 비밀입니다. 저장소나 프론트엔드 코드에 보관하지 말고 환경 변수를 통해 전달하세요.

예제#

동일한 요청을 네 가지 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에서는 청크당 한 번의 호출. 네트워크가 합친 호출은 게이트웨이가 분리합니다.
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도 허용됩니다 — 응답도 같은 형식으로 옵니다.
  • 스트림에서는 청크당 한 번의 호출. 첫 번째 요소만 읽는 클라이언트도 호출을 잃지 않습니다.
  • 네트워크가 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는 네트워크로 전달됩니다. 모델에 두 가지 모드만 있으면 게이트웨이가 값을 그에 맞춥니다: 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는 요청 식별자입니다. 지원팀에 문의할 때 첨부해 주세요.
  • Retry-After는 429와 함께 반환됩니다. 재시도 전에 대기해야 할 초를 나타냅니다.
  • 헤더 X-Title와 HTTP-Referer(OpenRouter와 동일)는 게이트웨이가 고객님의 앱을 식별하는 데 도움이 됩니다. 텍스트는 저장되지 않습니다.

제한#

  • 이미지: image_url 파트는 텍스트 자리표시자로 대체됩니다 — 모델이 이미지를 볼 수 없습니다(기능의 vision: false).
  • 브라우저에서 API는 JoinGonka 도메인에서만 접근 가능합니다(Origin 검사). 서버에서 호출하고, 키를 프론트엔드에 두지 마세요.
  • 임베딩: POST /v1/embeddings는 501를 반환합니다 — 네트워크에 임베딩 모델이 없습니다.
  • 에러 코드, 제한, 타임아웃은 오류 및 한도 섹션을 참고하세요.