연동 가이드
Chat Completions
POST /v1/chat/completions 에서 Gateway가 받는 필드와 제공사별 차이를 설명합니다.
POST /v1/chat/completions는 OpenAI Chat Completions 형식으로 요청을 받습니다.
미지원 필드와 표에 없는 필드는 Gateway가 400으로 거절합니다.
“제공사별 차이”가 비어 있는 필드는 OpenAI, Anthropic, Gemini, DeepSeek, Kimi 중 어디로 배정되어도 동작이 같습니다.
공통 규칙과 오류 출처는 Gateway 개요에 있습니다.
제공사별 주요 차이
섹션 제목: “제공사별 주요 차이”- Anthropic은 최대 토큰이 필수입니다.
max_completion_tokens와max_tokens를 모두 생략하면 그 모델의 출력 상한을 넣습니다. 모델별 상한은GET /v1/models의max_output_tokens에서 확인하고, 긴 응답이 필요하면 직접 지정하세요. - Anthropic은
json_schema의 모든 object에additionalProperties: false를 추가합니다. 스키마에 선언하지 않은 속성은 응답에 나오지 않습니다. - Anthropic에는 스키마 없는 JSON 모드가 없습니다. Gateway가 자체적으로
json_output이라는 도구를 요청에 넣어 호출하게 한 뒤, 결과를content문자열로 되돌립니다.json_object는tools와 함께 쓸 수 없으며, 도구 이름json_output도 쓸 수 없습니다. - Kimi는 생성 파라미터를 모델이 정한 값으로 고정합니다. 다른 값을 보내면 Kimi가 거절하며, 그 응답을 그대로 돌려받습니다.
- DeepSeek과 Kimi는 OpenAI 형식을 그대로 받으므로 요청 모양이 같습니다. 받지 않는 값은 아래 표에 필드별로 적습니다.
요청 필드
섹션 제목: “요청 필드”모델과 메시지
섹션 제목: “모델과 메시지”| 필드 | 지원 | 제공사별 차이 |
|---|---|---|
model | 지원 | |
messages[].role: system, developer | 지원 (텍스트만) | Anthropic, Gemini: 이어 붙여 맨 앞 하나로 보냅니다 DeepSeek, Kimi: developer를 system으로 보내며 위치는 그대로입니다 |
messages[].role: user | 지원 (문자열 또는 파트 배열) | |
messages[].role: assistant | 지원 (텍스트만) | |
messages[].content[].image_url.url | 지원 (base64 data URL 또는 http(s) URL) | Gemini: URL은 주소 끝의 확장자로 종류를 판단하므로 확장자가 없으면 거절합니다 Kimi: http(s) URL을 받지 않습니다 DeepSeek: 이미지를 읽는 모델과 읽지 않는 모델이 있습니다 |
messages[].content[].file.file_data | 지원 (base64 PDF data URL만) | DeepSeek, Kimi: PDF를 받지 않습니다 |
messages[].content[].file.filename | 지원 | Gemini: 보내지 않습니다 |
- content 형태:
user메시지의 content는 문자열 또는text,image_url,file파트 배열입니다.assistant메시지는tool_calls와reasoning_details가 모두 없으면content가 있어야 합니다. - 미디어 파트: 이미지와 PDF는
user메시지에서만 받으며, 이미지는 png, jpeg, webp, gif를 지원합니다. - 이미지 URL: 이미지는 base64 data URL 대신 http(s) URL로도 보낼 수 있습니다. Gateway는 주소를 그대로 전달하고 제공사가 직접 내려받으므로, 제공사가 닿을 수 있는 공개 주소여야 합니다. PDF는 base64 data URL만 받습니다.
- 시스템 프롬프트: 옵션에 시스템 프롬프트가 있으면
system과developer메시지 대신 그 값을 사용합니다. - 모델 이름: 라우팅을 설정하기 전에는 요청이 OpenAI로 전달되므로
model에 OpenAI 모델 이름을 보내야 합니다. 라우팅을 설정하면 배정된 옵션이 제공사와 모델을 정합니다. 사용할 수 있는 이름은 모델 목록에서 확인하세요.
출력 길이와 스트리밍
섹션 제목: “출력 길이와 스트리밍”| 필드 | 지원 | 제공사별 차이 |
|---|---|---|
max_completion_tokens | 지원 | Anthropic: 둘 다 생략하면 모델의 출력 상한 |
max_tokens | 지원 (레거시) | Anthropic: 둘 다 생략하면 모델의 출력 상한 |
n | 다중 응답 미지원 (1만) | |
stream | 스트리밍 미지원 (false만) |
max_tokens와 max_completion_tokens를 함께 보내면 max_completion_tokens를 사용합니다.
생성 파라미터
섹션 제목: “생성 파라미터”| 필드 | 지원 | 제공사별 차이 |
|---|---|---|
temperature | 지원 | Kimi: 모델이 정한 값만 받습니다 DeepSeek: 추론하는 동안에는 반영되지 않습니다 |
top_p | 지원 | Kimi: 모델이 정한 값만 받습니다 |
frequency_penalty | 지원 | Kimi: 모델이 정한 값만 받습니다 DeepSeek: 반영되지 않습니다 |
presence_penalty | 지원 | Kimi: 모델이 정한 값만 받습니다 DeepSeek: 반영되지 않습니다 |
seed | 지원 | Kimi: 반영되지 않습니다 |
reasoning_effort | 지원 | DeepSeek, Kimi: 받는 값이 OpenAI와 다르므로 대시보드에서 확인하세요 |
verbosity | 지원 | DeepSeek, Kimi: 반영되지 않습니다 |
- 라우팅을 설정하기 전: 요청에 보낸 값을 그대로 사용하며, 그 구성이 Origin 옵션으로 등록됩니다.
- 라우팅을 설정한 뒤: 배정된 옵션의 값을 사용하고 요청에 보낸 값은 반영되지 않습니다. 옵션에 설정하지 않은 파라미터는 제공사에 전달되지 않고 제공사 기본값이 적용됩니다.
- 설정 범위: 옵션에 설정할 수 있는 값의 범위는 대시보드가 제공사와 모델별로 보여줍니다. 옵션에는 이 표에 없는 제공사 전용 파라미터도 존재합니다.
출력 형식
섹션 제목: “출력 형식”| 필드 | 지원 | 제공사별 차이 |
|---|---|---|
response_format: text | 지원 | |
response_format: json_schema | 지원 | Anthropic: additionalProperties: false를 추가합니다DeepSeek: 받지 않습니다 |
response_format: json_object | 지원 | Anthropic: 도구 호출로 구현합니다 |
- 스키마:
json_schema에는json_schema.schema가 있어야 합니다. 스키마 안쪽은 검사하지 않고 그대로 전달합니다. - 전달되는 범위:
json_schema에서 전달되는 키는name,description,strict,schema네 가지이며 그 밖의 키는 제공사에 전달되지 않습니다. 키 이름은 대소문자까지 정확히 일치해야 합니다. Anthropic과 Gemini는 제공사 형식으로 다시 만들며json_schema.schema만 옮기므로name,description,strict는 OpenAI에만 전달됩니다. - 값 타입:
name과description은 문자열,strict는 불리언입니다. 타입이 다르면 그 키를 알려 주는 400으로 거절합니다. - 함께 보내는 규칙:
json_object는tools와 함께 보낼 수 없습니다.
도구 호출
섹션 제목: “도구 호출”| 필드 | 지원 | 제공사별 차이 |
|---|---|---|
tools | 지원 (type: function만) | |
tools[].function.strict | 지원 | Gemini: 하나라도 true면 모든 도구를 검증합니다 |
tool_choice | 지원 (none, auto, required, 함수 지정) | 함수를 지정해도 같은 도구를 여러 번 호출할 수 있습니다 |
tool_choice: allowed_tools | 지원 (mode는 auto, required만) | Anthropic, DeepSeek, Kimi: 허용 밖 도구를 빼고 보냅니다 |
parallel_tool_calls | 병렬 호출 끄기 미지원 (true만) | |
functions | 지원 (레거시) | |
function_call | 지원 (레거시, none, auto, 함수 지정) | |
messages[].tool_calls[].id | 지원 | |
messages[].tool_calls[].function.arguments | 지원 (JSON object 문자열만) | |
messages[].role: tool | 지원 | |
messages[].role: function | 지원 (레거시) |
- 함께 보내는 규칙:
tool_choice는tools와 함께 보내야 합니다. 레거시functions는tools,tool_choice와 함께 보낼 수 없고,function_call은functions가 있어야 합니다. - 도구 이름과 스키마: 도구 이름
json_output은 쓸 수 없습니다.tools[].function.parameters내부는 검사하지 않고 그대로 전달합니다. - 결과 되돌리기:
tool_calls[].id와tool_call_id는 응답에서 받은 값을 그대로 보냅니다. 값이 짝을 이루지 않으면 제공사가 거절합니다.role: tool의content는 문자열 또는text파트이고,role: function은name이 앞선function_call과 같아야 합니다. - 응답 모양:
functions로 보낸 요청의 응답은message.function_call과finish_reason: "function_call"로 돌아옵니다. 한 응답에 호출이 여럿이면message.function_call에는 첫 호출만 담기고 나머지는message.tool_calls에서 확인합니다. 그 밖의 도구 호출 응답은message.tool_calls와finish_reason: "tool_calls"로 돌아옵니다. - 레거시 권장: 레거시
functions는 한 턴에 호출 하나만 표현합니다. Gemini, DeepSeek, Kimi는 한 응답에 여러 호출을 보내며, 결과를 하나씩 돌려주면 남은 호출을 다시 요청하므로 턴이 늘어납니다.tools를 사용하세요.
| 필드 | 지원 | 제공사별 차이 |
|---|---|---|
messages[].reasoning_details | 지원 | OpenAI: 추론을 반환하지 않으므로 보낼 값이 없습니다 |
- 응답에 오는 값: 추론하는 모델은
message.reasoning_details에 추론을 반환합니다. 각 항목은type으로 종류를 구분하며reasoning.text는text에 본문을,reasoning.encrypted는data에 제공사만 읽을 수 있는 값을 담습니다.format은 추론을 만든 제공사를 나타냅니다. - 다음 턴으로 잇기: 대화를 이어갈 때는 응답에서 받은
reasoning_details를 assistant 메시지에 고치지 않고 그대로 실어 보냅니다. 항목 순서를 바꾸거나 내용을 편집하면 추론이 이어지지 않습니다. 응답의message객체를 그대로 대화 이력에 넣으면 함께 따라갑니다. - 같은 대화는 같은 옵션으로: 여러 턴을 이어갈 때는 모든 요청에 같은
x-abto-device-id를 보냅니다. 이 값이 있어야 대화가 같은 옵션으로 배정되어 추론이 이어집니다. 값이 없으면 요청마다 옵션이 따로 정해지며, 제공사가 바뀐 턴부터는 이전 추론을 사용하지 않고 다시 추론합니다. - 생략했을 때: Gemini는 도구 호출이 있는 턴의 추론이 빠진 이력을 거절합니다. DeepSeek은 응답에서 받은
tool_calls[].id를 고쳐 보내면서 추론까지 빠뜨린 이력을 거절합니다. Anthropic과 Kimi는 추론 없이도 이어지며 매 턴 다시 추론하므로 추론 토큰이 늘어납니다. - 추론 토큰:
usage.completion_tokens_details.reasoning_tokens는 추론에 사용한 토큰 수이며 추론 내용과 별개입니다. - 도구 없는 대화: 추론은 도구 호출과 무관하게 이어집니다. 도구를 사용하지 않는 여러 턴 대화와
functions를 사용한 대화에서도 같은 방법으로 보냅니다.
미지원 필드
섹션 제목: “미지원 필드”아래 필드를 보내면 Gateway가 400으로 거절합니다. 표에 없는 필드도 같습니다.
| 구분 | 필드 |
|---|---|
| 토큰 확률 | logprobs, top_logprobs, logit_bias |
| 오디오와 그 밖의 입력 | modalities, audio, messages[].audio, 그 밖의 content 파트(input_audio 등) |
| 이미지와 파일 옵션 | messages[].content[].image_url.detail, messages[].content[].file.file_id, messages[].content[].file.file_data의 http(s) URL |
| 제공사 서버 기능 | store, service_tier, moderation, web_search_options, prediction |
| 프롬프트 캐시 | prompt_cache_key, prompt_cache_options, prompt_cache_retention |
| 요청 태그와 사용자 식별 | metadata, user, safety_identifier |
| 그 밖 | stop, stream_options, messages[].name (role: function 제외), messages[].refusal, messages[].reasoning, messages[].reasoning_content |
제공사에 태그를 남기거나 사용자를 식별하는 용도는 대체할 수 없습니다. 분석에 쓰던 식별자는 레퍼런스의 x-abto-feature-id와 x-abto-device-id로 보내며, 이 헤더는 ABTO에 기록되고 제공사에는 전달되지 않습니다.
제공사 API 참조
섹션 제목: “제공사 API 참조”Gateway는 아래 API 형식으로 요청을 보냅니다. 제공사가 받는 값의 범위와 거절 조건은 각 문서를 확인하세요.
- OpenAI: Chat Completions API
- Anthropic: Messages API
- Gemini: Interactions API