> AI 에이전트용: 단계별 설정 안내 — [`/docs/agents.md`](https://gate.joingonka.ai/docs/agents.md), 문서 인덱스 — [`/llms.txt`](https://gate.joingonka.ai/llms.txt).

# API 레퍼런스

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

## 프로토콜 및 주소

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

| 메서드 및 경로 | 형식 | 용도 | 특징 |
| --- | --- | --- | --- |
| `POST /v1/chat/completions` | OpenAI Chat Completions | 채팅, 에이전트, 도구 호출 | 기본 경로: 다른 형식은 게이트웨이가 이 경로로 변환합니다. |
| `POST /v1/messages` | Anthropic Messages | Claude Code 및 Anthropic SDK | 기본 URL에 `/v1` 없이; 모델 `claude-*`는 권장 모델로 대체됩니다; `max_tokens` 필드는 필수입니다. |
| `POST /v1/responses` | OpenAI Responses | Codex CLI 및 새로운 OpenAI SDK | 상태 비저장: 매 요청마다 전체 기록을 보내세요. |
| `POST /v1/completions` | OpenAI Completions (legacy) | 에디터의 자동 완성 및 코드 수정 | `suffix`는 프롬프트 내 힌트로 모델에 전달됩니다; 응답에는 `logprobs: null`가 포함됩니다. |
| `POST /v1/embeddings` | OpenAI Embeddings | 텍스트의 벡터 표현 | 응답 `501`: 네트워크에 임베딩 모델이 없습니다. |

### 레퍼런스 주소

키 없이 응답합니다. 컨텍스트와 상태를 포함한 모델 표는 [모델](https://gate.joingonka.ai/ko/docs/models) 섹션에 있습니다.

| 메서드 및 경로 | 설명 |
| --- | --- |
| `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`은 게이트웨이의 웹 검색 플러그인이 실행합니다 — [플러그인](https://gate.joingonka.ai/ko/docs/api#plugins) 섹션을 참조하세요.
- 토큰 수 계산(`/v1/messages/count_tokens`)은 없습니다 — 응답은 `404`.

Claude Code는 설치 프로그램으로 설정하는 것이 더 간편합니다 — [도구 연결](https://gate.joingonka.ai/ko/docs#connect). 수동으로는 환경 변수를 사용하세요; `ANTHROPIC_MODEL`는 네트워크의 모델을 고정합니다.

#### Claude Code

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

#### cURL

```bash
curl 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

- 게이트웨이는 응답을 저장하지 않습니다: `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](https://gate.joingonka.ai/keys) 페이지에서 가입 후 생성합니다.

| 접두사 | 키 | 모델 요청 |
| --- | --- | --- |
| `jg-` | 일반 계정 키 | 예 |
| `gc-` | 하위 키: 자체 한도, 소비는 소유자 잔액에서 | 예 |
| `gm-` | 관리 키: 하위 키 관리만 가능 | 아니요 — `403 forbidden` |

- 마이페이지에서 각 키에 일간, 월간, 총 지출 한도를 설정할 수 있습니다; 초과 시 `402 child_key_limit_exceeded`.
- 키당 분당 요청 수에 제한이 있습니다 — 값은 [한도](https://gate.joingonka.ai/ko/docs/errors#limits) 섹션에 있습니다.
- 키 없이 작동하는 것은 사이트의 데모 채팅뿐입니다: 자체 코드에서 키 없이 요청하면 `is_demo`와 함께 `402`가 반환됩니다.
- 키 관리는 마이페이지에서만 가능합니다: API 키를 사용한 `/api/keys`는 접근할 수 없습니다. 잔액과 키별 소비는 [계정 API](https://gate.joingonka.ai/ko/docs/billing#account-api)에서 확인하세요.

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

## 예제

동일한 요청을 네 가지 SDK로. 모델은 권장 모델(`MiniMaxAI/MiniMax-M2.7`), 키는 환경 변수 `JOINGONKA_API_KEY`에서 가져옵니다.

### Python

```python
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)
```

### TypeScript

```typescript
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

```bash
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?"}]
  }'
```

### Anthropic SDK

```python
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)
```

### 스트리밍 응답

#### Python

```python
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)
```

#### TypeScript

```typescript
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

```bash
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
  }'
```

#### Anthropic SDK

```python
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)
```

## 요청 파라미터

게이트웨이가 자체적으로 보장하는 `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_tokens` | `max_tokens`의 다른 이름. 게이트웨이가 값을 이쪽으로 옮깁니다. |
| `tools` | 모델이 호출할 수 있는 함수. OpenAI 형식. |
| `tool_choice` | 함수 호출 여부: 모델 재량, 호출 안 함, 반드시 호출, 특정 함수 지정. |
| `response_format` | 구조화된 응답: `json_object` 또는 `json_schema`. |

- `temperature`가 없으면 게이트웨이가 `0.7`를 적용합니다.
- `max_tokens`가 없으면 게이트웨이가 모델 기본값을 적용합니다: 비스트림에서는 더 짧게, 스트림에서는 모델 상한. 모델별 수치는 [한도](https://gate.joingonka.ai/ko/docs/errors#limits) 섹션을 참조하세요.

### 그대로 네트워크로 전달

`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`에서는 청크당 한 번의 호출. 네트워크가 합친 호출은 게이트웨이가 분리합니다.

```text
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-citations` | `delta.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-parser` | PDF에서 텍스트를 추출합니다. | 메시지 텍스트 전체가 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`이 동일한 플러그인을 에이전트 모드로 실행합니다.

#### plugins: web

```json
{
  "model": "MiniMaxAI/MiniMax-M2.7",
  "messages": [{"role": "user", "content": "What is new in the Gonka network?"}],
  "plugins": [{"id": "web", "max_results": 5}]
}
```

#### mode: agent

```json
{
  "model": "MiniMaxAI/MiniMax-M2.7",
  "messages": [{"role": "user", "content": "What is new in the Gonka network?"}],
  "plugins": [{"id": "web", "mode": "agent", "max_searches": 3}]
}
```

## 비용 및 메타데이터 필드

비스트리밍 응답은 요청 비용을 `usage`에 담아 반환합니다:

| 필드 | 설명 |
| --- | --- |
| `usage.cost_gnk` | GNK 기준 요청 비용 |
| `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`를 반환합니다 — 네트워크에 임베딩 모델이 없습니다.
- 에러 코드, 제한, 타임아웃은 [오류 및 한도](https://gate.joingonka.ai/ko/docs/errors) 섹션을 참고하세요.
