NezhaGateNezhaGate
POST https://nezhagate.com/v1/chat/completions

Claude Opus 5(Anthropic) 채팅 API로, 적응형 사고를 갖췄으며 복잡한 추론, 코드 엔지니어링, 에이전트 오케스트레이션에 강합니다. 사고 강도는 low부터 max까지 다섯 단계로 조절할 수 있고, 이미지 입력, 도구 호출, 프롬프트 캐싱을 지원합니다. OpenAI 호환 API와 Anthropic 네이티브 API를 모두 제공하므로 Claude Code를 바로 연결할 수 있습니다.

📥 컨텍스트 창 (최대 입력):약 200K 토큰.

플레이그라운드에서 사용해 보기 →

빠른 시작

두 단계면 됩니다: 요청 보내기 → 스트리밍으로 답변 받기. YOUR_API_KEY를 내 키로 바꾸면 아래 명령을 그대로 실행할 수 있습니다. 엔드포인트가 OpenAI Chat Completions와 같으므로 기존 OpenAI 코드는 base_url과 model만 바꾸면 됩니다.

1단계 · 요청 보내기

curl
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-opus-5", "messages": [{"role": "user", "content": "광합성을 한 문장으로 설명해 줘"}]}'

응답(HTTP 200)

JSON
{
  "id": "chatcmpl-7f3c9a1e2b4d6f8a",
  "object": "chat.completion",
  "created": 1791281400,
  "model": "claude-opus-5",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "광합성은 식물이 햇빛을 이용해 이산화탄소와 물을 당으로 바꾸고 산소를 내보내는 과정입니다."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 18,
    "completion_tokens": 42,
    "total_tokens": 60
  }
}

message.content는 답변이고 usage는 이 요청에 과금되는 토큰 수입니다. 프롬프트 캐싱의 과금 방식은 아래 「프롬프트 캐싱」을 보세요.

2단계 · 스트리밍으로 받기(권장)

curl
curl -N https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-opus-5", "stream": true, "messages": [{"role": "user", "content": "광합성을 한 문장으로 설명해 줘"}]}'

스트림은 표준 SSE입니다. 각 청크의 본문은 choices[0].delta.content에 담기고, 마지막 청크에는 usage가 담기며, 스트림은 data: [DONE]으로 끝납니다. 답변이 길거나 모델이 먼저 생각해야 할 때는 스트리밍을 쓰세요. 비스트리밍 요청은 약 10분이 지나면 연결이 끊깁니다.

Python(OpenAI SDK)

Python
from openai import OpenAI

client = OpenAI(base_url="https://nezhagate.com/v1", api_key="YOUR_API_KEY")

# 1. 질문 하나에 답변 하나
resp = client.chat.completions.create(
    model="claude-opus-5",
    messages=[{"role": "user", "content": "광합성을 한 문장으로 설명해 줘"}],
)
print(resp.choices[0].message.content)

# 2. 스트리밍
stream = client.chat.completions.create(
    model="claude-opus-5",
    messages=[{"role": "user", "content": "광합성을 한 문장으로 설명해 줘"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Anthropic SDK로 호출할 수도 있습니다(네이티브 API)

Python · Anthropic SDK
import anthropic

client = anthropic.Anthropic(base_url="https://nezhagate.com/anthropic", api_key="YOUR_API_KEY")
msg = client.messages.create(
    model="claude-opus-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "광합성을 한 문장으로 설명해 줘"}],
)
print(next(b.text for b in msg.content if b.type == "text"))

Anthropic SDK의 base_url은 /anthropic까지만 적으면 됩니다. /v1/messages는 SDK가 알아서 붙입니다. 키는 위와 같은 키를 씁니다.

인증

Header
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

콘솔에서 API 키를 만들면 시작할 수 있습니다.

사양 한눈에 보기

컨텍스트 창~200K 토큰
입력텍스트, 이미지
사고적응형 사고(기본으로 켜짐), 강도는 reasoning_effort로 조절
도구 호출지원(OpenAI tools 형식)
웹 검색지원(web_search: true, 검색 자체는 무료)
엔드포인트/v1/chat/completions · /anthropic/v1/messages
스트리밍지원(stream: true, SSE)
과금 방식토큰 단위: 입력, 출력(사고 포함), 캐시 적중에 각각 요금 적용, 실패하면 과금되지 않음

요청 파라미터

POST /v1/chat/completions의 요청 본문(JSON)이며, OpenAI Chat Completions와 같습니다. 자주 쓰는 파라미터와 이 모델에서의 실제 동작은 다음과 같습니다:

파라미터타입필수설명
modelstring예모델 ID: claude-opus-5.
messagesarray예대화 메시지 배열입니다. 각 메시지에는 role(system, user, assistant, tool 중 하나)과 content가 있습니다. content는 문자열이거나 text와 image_url 파트로 이루어진 배열입니다(이미지 입력, 아래 참고). 여러 턴에 걸친 대화는 이전 메시지를 순서대로 모두 보내세요.
streamboolean아니오true면 SSE로 스트리밍하며, 마지막 청크에 usage가 담깁니다. 기본값은 false입니다.
max_tokensinteger아니오출력 상한이며 사고 토큰도 여기에 포함됩니다. 너무 작게 잡으면 모델이 답변을 쓰기 전에 다 써 버릴 수 있으며, 이때 게이트웨이는 400 max_tokens_too_small을 돌려주고 과금하지 않습니다(512 이상 권장). 일부 모델에서는 너무 작은 값을 온전한 답변이 가능한 하한까지 자동으로 올리며, 이때도 실제 사용량만 과금됩니다.
temperature / top_pnumber아니오이 세대의 Claude는 샘플링 파라미터를 더 이상 지원하지 않습니다. 게이트웨이가 temperature, top_p, top_k를 제거하며(오류 없음), 모델은 기본 방식대로 샘플링합니다.
reasoning_effortstring아니오사고 강도: low / medium / high / xhigh / max. 게이트웨이가 Claude의 output_config.effort로 변환하며, minimal과 none은 low로 처리됩니다. claude-opus-5-high처럼 써도 됩니다.
thinkingobject아니오{"type": "disabled"}로 사고를 끕니다. 예전 형식인 {"type": "enabled", "budget_tokens": N}은 예산에 맞춰 가장 가까운 사고 강도로 변환됩니다.
tools / tool_choicearray / string아니오OpenAI 표준 형식의 함수 호출입니다. 모델이 함수를 호출할 때는 finish_reason: "tool_calls"와 함께 tool_calls를 돌려줍니다. 자세한 내용은 아래를 보세요.
web_searchboolean아니오true면 먼저 웹 검색을 하고 그 결과를 참고 자료로 모델에 넘깁니다. 자세한 내용은 아래를 보세요.

그 밖의 OpenAI 파라미터(stop, seed, user 등)는 보낸 그대로 모델에 전달되며, 적용 여부는 모델에 따라 다릅니다.

가격

토큰 단위로 과금하며, 아래 요금(100만 토큰당)은 실시간으로 반영됩니다. 프롬프트 캐시에 쓴 토큰은 캐시 쓰기 요금으로, 캐시에 적중한 토큰은 캐시 적중 요금으로 과금됩니다. 성공한 요청의 실제 사용량만 과금합니다. 1크레딧 = $0.005.

종류100만 토큰당 가격(USD)100만 토큰당 크레딧
입력$4.00800
출력(사고 포함)$20.004000
캐시 적중$0.4080
캐시 쓰기$5.001000

예를 들어 입력 2,000 토큰, 출력 1,000 토큰(사고 포함)인 요청 한 건은 약 $0.028입니다.

사고(Thinking)

적응형 사고가 기본으로 켜져 있어, 질문마다 얼마나 생각할지 모델이 정합니다. reasoning_effort에는 low / medium / high / xhigh / max를 쓸 수 있으며 게이트웨이가 Claude의 output_config.effort로 변환합니다. claude-opus-5-high처럼 단계를 모델 ID에 넣어도 되며, 과금은 claude-opus-5 기준입니다.

사고 요약을 받으려면 네이티브 API /anthropic을 쓰고 요청에 "thinking": {"type": "adaptive", "display": "summarized"}를 넣으세요. 사고 강도는 "output_config": {"effort": "high"}처럼 지정합니다.

이 모델은 사고를 끌 수 있습니다. "thinking": {"type": "disabled"}를 보내세요.

사고 토큰은 출력 토큰으로 계산되어 출력 요금으로 과금됩니다.

프롬프트 캐싱

긴 프롬프트는 따로 표시하지 않아도 자동으로 캐시에 쓰일 수 있으며(캐시 쓰기 요금으로 과금), 이후 반복되는 접두어는 캐시 적중 요금으로 과금됩니다. 네이티브 API /anthropic에서는 시스템 프롬프트나 메시지 블록에 "cache_control": {"type": "ephemeral"}을 붙여 캐시 위치를 직접 지정할 수 있으며, Claude Code는 이를 자동으로 처리합니다.

네이티브 API는 캐시 토큰 수를 usage.cache_creation_input_tokens(쓰기)와 usage.cache_read_input_tokens(적중)로 돌려주며, 과금은 이 숫자를 기준으로 계산됩니다.

이미지 입력

content 배열에 image_url 파트를 넣으세요. base64 data URI(data:image/png;base64,...)를 권장하며, 이 방식은 모든 회선에서 읽을 수 있습니다. 공개 이미지 링크는 회선이 직접 내려받아야 해서 일부 회선에서는 가져오지 못하거나 시간이 초과될 수 있습니다. 이미지는 모델 제공사의 규칙에 따라 입력 토큰으로 환산됩니다.

curl
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-opus-5", "messages": [{"role": "user", "content": [{"type": "text", "text": "이 이미지에 무엇이 있는지 알려 줘"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,iVBORw0KGgo..."}}]}]}'

도구 호출(Function Calling)

tools에 JSON Schema로 함수를 정의하세요. 모델이 함수를 호출하기로 하면 finish_reason: "tool_calls"를 돌려주며, message.tool_calls에 함수 이름과 인자(JSON 문자열)가 담깁니다.

curl
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-opus-5", "messages": [{"role": "user", "content": "지금 상하이 날씨를 알려 줘"}], "tools": [{"type": "function", "function": {"name": "get_weather", "description": "Current weather of a city", "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}}}]}'

함수를 실행한 뒤 그 결과를 role: "tool" 메시지로(해당 tool_call_id와 함께) 대화에 덧붙여 다시 요청하면, 모델이 이를 바탕으로 최종 답변을 줍니다. tool_choice에는 auto, none, required 또는 특정 함수를 지정할 수 있습니다.

Anthropic 네이티브 API(/anthropic)

  • 주소는 https://nezhagate.com/anthropic/v1/messages입니다. 요청과 응답 모두 Anthropic Messages 형식이며, 스트리밍 이벤트, 도구 호출(tool_use / tool_result), 이미지 블록이 모두 Anthropic과 같으므로 Anthropic SDK와 Claude Code를 그대로 쓸 수 있습니다.
  • 인증은 x-api-key: YOUR_API_KEY로 합니다(Authorization: Bearer도 됩니다). 키는 /v1과 같은 키입니다. anthropic-version, anthropic-beta 헤더는 보낸 그대로 전달되며, max_tokens는 필수입니다.
  • 이 엔드포인트는 Claude 모델만 받으며, 다른 모델을 지정하면 404 not_found_error가 돌아옵니다. 이 밖에 POST /anthropic/v1/messages/count_tokens(토큰 수 계산, 무료)와 GET /anthropic/v1/models도 쓸 수 있습니다.
  • 사고 요약: "thinking": {"type": "adaptive", "display": "summarized"}. 사고 강도: "output_config": {"effort": "high"}(low부터 max까지). temperature, top_p, top_k는 제거됩니다.
  • 오류는 Anthropic 형식으로 돌아옵니다: {"type": "error", "error": {"type": ..., "message": ...}}. 잔액이 부족하면 402 billing_error가 돌아옵니다.
  • 이 엔드포인트에서는 웹 검색이 기본으로 꺼져 있습니다(Claude Code가 매 턴 똑같이 보내는 접두어가 바뀌어 캐시가 깨지지 않도록). 켜려면 x-web-search: 1 헤더를 추가하세요.
curl
curl https://nezhagate.com/anthropic/v1/messages \
  -H "x-api-key: YOUR_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-opus-5", "max_tokens": 1024, "messages": [{"role": "user", "content": "광합성을 한 문장으로 설명해 줘"}]}'

Claude Code에서 사용하기 →

회선과 안정성

  • 모든 모델은 여러 회선으로 제공됩니다. 한 회선에서 오류나 시간 초과가 나거나 회선이 가득 차면, 게이트웨이는 응답을 돌려주기 시작하기 전에 자동으로 다음 회선으로 넘어갑니다. 따로 재시도할 필요가 없고, 두 번 과금되지도 않습니다.
  • 스트리밍은 출력을 시작한 뒤에는 회선을 바꾸지 않습니다. 중간에 끊기면 끊기기 전까지 생성된 사용량만큼 과금됩니다(과금과 환불 참고).
  • 모든 회선이 가득 차면 게이트웨이가 Retry-After와 함께 429를 돌려줍니다. 그 초만큼 기다린 뒤 다시 시도하세요. 실패한 요청은 과금되지 않습니다. 모델별 상태는 서비스 상태에서 볼 수 있습니다.

오류와 환불

오류는 error 객체(message, type, code, param)로 돌아옵니다. HTTP 상태 코드와 code로 판단하고, message 문구로는 판단하지 마세요. 실패한 요청은 과금되지 않으며, 전체 목록은 오류 코드에 있습니다.

HTTPcode원인조치
400invalid_messages / invalid_role / invalid_max_tokens채팅 요청의 messages가 없거나 비어 있거나 형식이 잘못되었거나, role이 허용된 값이 아니거나, max_tokens가 양의 정수가 아닙니다. 문제가 된 필드는 param에 표시됩니다.param이 가리키는 필드를 고치세요.
400model_not_found모델 ID의 철자가 틀렸거나, model이 없거나, 이 엔드포인트에서 쓸 수 없는 모델입니다(예: 이미지 엔드포인트에 채팅 모델을 지정한 경우).GET /v1/models 또는 API 레퍼런스에 있는 모델 ID를 쓰세요.
400max_tokens_too_small추론 모델이 max_tokens를 모두 사고에 써서 답변을 쓰지 못했습니다(비스트리밍 채팅).max_tokens를 늘린 뒤 다시 시도하세요.
4xxinvalid_request모델 제공사가 요청을 거부했습니다(예: 컨텍스트가 너무 길거나 지원하지 않는 파라미터). 상태 코드와 message는 모델 제공사가 보낸 그대로 전달되며, code는 모델 제공사가 준 값입니다.message에 적힌 대로 요청을 고치세요.
401invalid_api_key키가 없거나, 삭제되었거나, 비활성화되었습니다. 계정이 비활성화된 경우에도 나옵니다.콘솔의 「API Keys」 페이지에서 이 키를 확인하세요.
402insufficient_quota이 요청의 크레딧을 예약하기에 잔액이 부족합니다. 게이트웨이는 요청에 들 수 있는 최대 비용을 먼저 예약하므로, 동시 호출이 몰릴 때도 이 오류가 날 수 있습니다.동시 호출이 몰린 경우라면 몇 초 기다린 뒤 다시 시도하고, 그렇지 않으면 충전하세요.
403permission_denied이 모델이 키의 모델 허용 목록에 없습니다.허용 목록에 있는 모델을 쓰거나, 콘솔에서 허용 목록을 수정하세요.
429rate_limit_exceeded이 키에 설정한 분당 요청 수를 넘었습니다(최근 60초 기준). Retry-After 헤더는 붙지 않습니다.몇 초 기다린 뒤 다시 시도하거나, 콘솔에서 이 키의 한도를 올리세요.
429rate_limit_exceeded이 모델의 모든 회선이 가득 차서 요청을 보내지 못했습니다. 채팅 엔드포인트에서만 나오며, 이미지와 영상 작업은 거절되지 않고 대기열에서 기다립니다. OpenAI 호환 엔드포인트는 Retry-After를 붙입니다.Retry-After의 초만큼 기다린 뒤 다시 시도하세요.
502upstream_timeout회선이 시간 초과되었습니다. 첫 토큰이 너무 늦게 오는 경우도 포함됩니다.다시 시도하세요. 긴 답변에는 stream: true를 쓰세요.
502upstream_unavailable회선에 오류가 났거나 잠시 쓸 수 없습니다.잠시 후 다시 시도하세요.
502upstream_busy모델 제공사가 요청 빈도를 제한하고 있습니다. 모델 제공사의 429는 그대로 전달되지 않고 이 502로 바뀌어 돌아옵니다.잠시 후 다시 시도하세요.
502empty_completion모델 제공사가 빈 내용을 돌려주었습니다. 요청 내용에 대한 판정이 아닙니다.다시 시도하세요.
503model_maintenance모델이 점검 중이라 요청을 받지 않습니다. 점검 중에는 다른 모델이 대신 답변하지도 않습니다.점검이 끝나면 다시 시도하세요. 진행 상황은 서비스 상태에서 볼 수 있습니다.

스트리밍이 출력을 시작한 뒤 실패하면 상태 코드는 바뀌지 않습니다. 오류는 error가 담긴 데이터 줄로 오거나, 스트림이 그냥 끝납니다(data: [DONE] 없이). 이런 경우 중단된 것으로 처리하세요.