OpenAI 호환 API
마지막 업데이트: 11 11월 2026
소개
OpenAI 호환 API를 사용하면 OpenAI의 chat completions 형식을 지원하는 도구가 ToRun 계정에서 결제하며 ToRun의 채팅 모델을 쓸 수 있습니다. opencode 같은 코딩 에이전트는 ToRun의 MCP 도구와 함께 ToRun을 모델 제공자로 쓸 수 있습니다.
주소와 로그인
| 기본 URL | https://mcp.torun.ai/v1 |
| 로그인 | Authorization: Bearer <your developer key> |
MCP 서버와 같은 개발자 키를 쓰세요. 개발자 키를 참고하세요. OpenAI 호환 API가 추가되기 전에 만든 키는 403 insufficient_scope를 받습니다. 키의 권한은 바뀌지 않으므로 새 키를 만드세요.
이 API의 엔드포인트는 GET /v1/models와 POST /v1/chat/completions 두 개입니다. /v1 아래의 다른 경로는 모두 404 not_found를 돌려줍니다.
모델
GET /v1/models는 먼저 torun/auto를, 그다음 요금제에서 쓸 수 있는 모든 텍스트 모델을 모델 ID로 나열합니다. 각 모델에는 다음이 표시됩니다.
- 읽을 수 있는 텍스트 양(
context_length)과 쓸 수 있는 답변 길이(max_completion_tokens), - 도구를 호출할 수 있는지(
supports_tools)와 이미지를 읽을 수 있는지(supports_vision), - 100만 토큰당 Runs로 나타낸 가격(
pricing:input과output).
torun/auto를 쓰면 ToRun이 요청마다 모델을 고릅니다. 요청에 이미지가 있으면 이미지를 읽는 모델을, tools를 보내면 도구를 호출하는 모델을 고릅니다.
Chat completions
POST /v1/chat/completions는 다음을 받습니다.
system,developer(system으로 처리),user,assistant,tool역할을 쓰는messages,tools와tool_choice(auto,none,required또는 이름을 지정한 함수 하나): 사용하는 도구 자체의 도구는 도구 호출로 그 도구에 돌아가며, ToRun은 절대 실행하지 않습니다,json_object를 지정한response_format.json_schema도 받아 JSON으로 답하지만 스키마 자체를 강제하지는 않습니다,temperature(02),top_p(01),max_completion_tokens또는max_tokens,stop(최대 4개 시퀀스),seed,reasoning_effort,stream과stream_options.include_usage.
1보다 큰 n, logprobs, top_logprobs, 오디오, 텍스트가 아닌 출력은 무시되지 않고 400 unsupported_parameter로 거부됩니다.
이미지
이미지는 image_url 파트에 data:image/...;base64,... 형태로 인라인으로 보내며, 요청당 최대 20 MB입니다. 링크로 보낸 이미지는 400 image_url_not_supported로 거부됩니다. ToRun은 그 이미지를 가져오지 않습니다. 이미지는 앱에서와 마찬가지로 안전 검사를 거칩니다.
스트리밍
"stream": true를 쓰면 답변이 chat.completion.chunk 형태의 server-sent events로 도착합니다.
- 첫 청크에는
assistant역할이 담기며, 도구 호출은 각자의index와 함께 스트리밍됩니다. - 보낼 것이 없는 동안에는 15초마다
: keepalive주석 줄이 옵니다. SSE 파서는 이 줄을 건너뜁니다. data: [DONE]은 성공한 스트림을 끝냅니다.stream_options.include_usage를 쓰면 마지막 청크는choices가 비어 있고usage를 담습니다.- 스트림이 시작된 뒤의 실패는
[DONE]없이data: {"error": ...}이벤트 하나로 옵니다.
스트리밍하지 않는 호출은 110초 뒤에 504 timeout으로 중단됩니다. 긴 요청은 "stream": true로 보내세요.
사용량
usage에는 prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens, completion_tokens_details.reasoning_tokens와 함께, 호출에 든 Runs를 나타내는 torun_credits가 담깁니다.
opencode에서 쓰기
개발자 페이지의 opencode 설정은 MCP 서버 옆에 ToRun을 모델 제공자로 추가합니다.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"torun": {
"npm": "@ai-sdk/openai-compatible",
"name": "ToRun",
"options": { "baseURL": "https://mcp.torun.ai/v1", "apiKey": "{env:TORUN_API_KEY}" },
"models": { "torun/auto": { "name": "ToRun Auto" } }
}
}
}
OpenAI 채팅 API를 지원하는 다른 도구도 같은 방식으로 작동합니다. 이 페이지의 OpenAI API 탭에는 다음 호출이 나와 있습니다.
curl https://mcp.torun.ai/v1/chat/completions \
-H "Authorization: Bearer $TORUN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "torun/auto", "messages": [{"role": "user", "content": "Hello"}]}'
호출 비용은 어떻게 결제되나요
API 호출에는 앱에서 같은 방식으로 쓸 때와 같은 Runs가 듭니다. 이 비용은 유료 자금으로만 결제됩니다. 먼저 유료 요금제 사용량에서, 키에서 허용했다면 그다음 지갑에서 결제됩니다. 무료 사용량은 API 호출 비용을 결제하지 않습니다. 키의 월 한도와 일일 한도가 적용되며, 답변은 채팅 답변처럼 안전 검사를 거칩니다.
한도
키마다 이 API에 분당 60개의 요청을 보낼 수 있고, completions를 동시에 4개까지 실행할 수 있습니다. 이를 넘으면 API는 Retry-After 헤더와 함께 429 rate_limit_exceeded를 돌려줍니다.
오류
모든 오류는 {"error": {"message": ..., "type": ..., "param": ..., "code": ...}} 형태입니다. message는 요청의 Accept-Language 헤더가 요청한 언어로 옵니다.
| 상태 | 코드 | 의미 |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
요청 형식이 잘못되었거나 ToRun이 지원하지 않는 매개변수를 썼습니다. |
| 400 | image_url_not_supported |
이미지를 링크로 보냈습니다. 인라인으로 보내세요. |
| 400 | content_blocked |
안전 검사가 콘텐츠를 차단했습니다. |
| 400 | upstream_rejected |
모델 제공자가 요청을 거부했습니다. 이유는 메시지에 있습니다. |
| 401 | invalid_api_key |
키가 없거나, 잘못 입력되었거나, 취소되었습니다. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
계정이나 키로 호출 비용을 결제할 수 없습니다. |
| 403 | insufficient_scope |
이 API가 추가되기 전에 만든 키입니다. 새 키를 만드세요. |
| 403 | model_not_available |
그 모델은 요금제에 포함되어 있지 않습니다. |
| 403 | account_suspended, no_developer_access |
계정이 정지되었거나 개발자 액세스가 없습니다. |
| 404 | model_not_found |
그 모델 ID는 GET /v1/models 목록에 없습니다. |
| 404 | not_found |
/v1 아래에 그런 경로가 없습니다. |
| 429 | rate_limit_exceeded |
호출이 너무 많습니다. Retry-After에 나온 시간만큼 기다리세요. |
| 500 | internal_error |
ToRun 쪽에서 문제가 생겼습니다. |
| 502 | upstream_error, empty_reply |
모델 제공자에서 오류가 났거나 빈 답변을 보냈습니다. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
호출에 필요한 서비스를 잠시 쓸 수 없습니다. 다시 시도하세요. |
| 504 | timeout |
스트리밍하지 않는 호출이 110초를 넘겼습니다. |
결제할 수 없는 요청은 클라이언트가 계속 다시 시도하지 않도록 429가 아니라 402를 받습니다.