문서
Claude Agent SDK
Agent SDK에는 기본 URL 옵션이 없습니다. Claude Code CLI를 실행하고 전체 환경을 전달합니다. 이것이 라우팅 접점이며, 변수 두 개만 설정하면 됩니다.
SDK에서 base_url 옵션을 검색해도 아무것도 나오지 않습니다. 문서에서 빠진 것이 아니라 해당 옵션이 존재하지 않기 때문입니다. SDK는 Claude Code CLI를 하위 프로세스로 실행하며, ANTHROPIC_BASE_URL와 ANTHROPIC_AUTH_TOKEN을 읽는 것은 CLI입니다. 이 두 변수를 설정하면 에이전트 코드를 변경하지 않아도 에이전트의 모든 호출이 해당 경로로 전달됩니다.
# The SDK has no base_url option. The CLI it spawns reads these, and the
# SDK passes the parent environment straight through — so exporting them
# before your program starts is enough.
export ANTHROPIC_BASE_URL=https://api.kunavo.com
export ANTHROPIC_AUTH_TOKEN=sk-kn-...
# Pin models Kunavo serves: the CLI's default and its opus/sonnet aliases
# follow Anthropic's newest models, and the sonnet alias asks for Sonnet 5.5,
# which Kunavo does not serve — unpinned, those requests 404.
export ANTHROPIC_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_OPUS_MODEL=claude-opus-5-5
export ANTHROPIC_DEFAULT_SONNET_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-haiku-4-5
python my_agent.pyhttps://api.kunavo.com이며, /v1는 붙이지 않습니다. Anthropic 클라이언트가 /v1/messages를 직접 덧붙입니다. 다른 Anthropic 방식 클라이언트에서도 흔히 문제가 되는 동일한 규칙이며, ANTHROPIC_BASE_URL 페이지에서 설명합니다.환경 변수가 CLI에 전달되는 이유
이 부분은 한 문단을 할애할 만합니다. 작동이 멈출 수도 있는 요령인지, 문서화된 속성이라 믿고 기반을 구축할 수 있는지의 차이이기 때문입니다. Python SDK의 하위 프로세스 전송은 부모의 os.environ에서 키 하나를 제외한 환경을 자식 환경으로 구성합니다. CLAUDECODE를 제외해 자식이 Claude Code 세션 안에서 실행 중이라고 판단하지 않게 한 뒤, CLAUDE_CODE_ENTRYPOINT, ClaudeAgentOptions.env를 병합하고 SDK 버전을 추가합니다.
여기서 두 가지를 알 수 있으며, 두 번째는 자주 오해하는 부분입니다. 셸에 있는 모든 항목이 CLI에 전달되므로 두 변수를 export해도 됩니다. 또한 options.env는 상속된 환경 위에 병합되므로 명시적으로 지정한 값이 오래된 export 값보다 우선합니다. 오래된 값에 밀리지 않습니다. 코드는 subprocess_cli.py에 있습니다.
명시적 설정 방식과 이를 반드시 사용해야 하는 경우
내보낸 변수는 개인 컴퓨터에서는 괜찮지만 다른 환경에서는 불안정합니다. 에이전트의 엔드포인트가 프로세스 실행 방식에 따라 달라져, 프로필을 불러오지 않는 스케줄러, 컨테이너 또는 CI 작업에서 처음 실행할 때 문제가 발생합니다. 옵션 객체에 env를 전달하면 라우팅이 프로그램의 일부가 됩니다.
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
# The explicit form. options.env is merged ON TOP of the inherited
# environment, so this wins over whatever the shell happens to hold —
# which is what you want in anything that is not your own laptop.
options = ClaudeAgentOptions(
env={
"ANTHROPIC_BASE_URL": "https://api.kunavo.com",
"ANTHROPIC_AUTH_TOKEN": "sk-kn-...",
"ANTHROPIC_MODEL": "claude-sonnet-5",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-5-5",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-5",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4-5",
},
)
async with ClaudeSDKClient(options=options) as client:
await client.query("Summarise the open TODOs in this repo")
async for message in client.receive_response():
print(message)단계별 안내
/app/keys에서 키를 생성해 복사하세요. 키는 한 번만 표시됩니다.- 라우팅을 어디에 둘지 정하세요. 로컬 작업에는 내보낸 변수를, 무인 실행 작업에는
ClaudeAgentOptions(env=…)를 사용하세요. ANTHROPIC_BASE_URL를https://api.kunavo.com로 설정하고,ANTHROPIC_AUTH_TOKEN를sk-kn-…키로 설정하세요.ANTHROPIC_MODEL,ANTHROPIC_DEFAULT_OPUS_MODEL및ANTHROPIC_DEFAULT_SONNET_MODEL를 제공되는 ID로 설정하세요. CLI의 내장 기본값과opus,sonnet별칭은 Anthropic의 최신 모델을 따르며, Kunavo가 제공하지 않는 모델인 Sonnet 5.5를sonnet별칭이 요청하면 404가 반환됩니다.- 선택적으로
ANTHROPIC_DEFAULT_HAIKU_MODEL를 설정하면 CLI가 실행하는 백그라운드 하위 작업을 가장 저렴한 티어로 보낼 수 있습니다. - 프로그램을 실행하세요. 에이전트 코드에는 변경 사항이 없습니다.
하위 작업별 티어 선택
에이전트는 여러 작업을 동시에 수행합니다. 하나의 요청이 청구 대상 왕복 호출 여러 건으로 늘어나므로, 티어 매핑은 채팅 앱보다 여기서 더 중요합니다. 요금은 카탈로그에서 실시간으로 가져온 토큰 1M개당 USD 기준이며, 입력/출력 순서입니다.
| 모델 ID | Kunavo 입력/출력 | 적합한 용도 |
|---|---|---|
claude-haiku-4-5 | $0.70 / $3.50 | CLI가 자체적으로 생성하는 백그라운드 하위 작업 — 자주 실행되고 자동으로 생성되며, 비용이 과도하게 청구되기 쉽습니다 |
claude-sonnet-5 | $1.40 / $7.00 | 에이전트의 실제 추론에 적합한 기본 설정 |
claude-opus-5 | $3.50 / $17.50 | 더 저렴한 티어로 같은 결과를 얻으려면 여러 번 시도해야 하는 경우에만 사용하세요 |
SDK 문제를 디버깅하기 전에 확인하세요
요청 한 번이면 문제가 키, 엔드포인트 또는 SDK 중 어디에 있는지 판단할 수 있습니다. 이 요청이 200을 반환하면 SDK가 실행하는 CLI에서도 같은 자격 증명이 작동합니다. 그래도 문제가 있다면 변수의 값이 아니라 변수가 설정된 위치를 확인해야 합니다.
# Settles whether a failure is the key, the endpoint, or the SDK.
# 200 here means the same credential works for the CLI the SDK spawns.
curl -sS https://api.kunavo.com/v1/messages \
-H "Authorization: Bearer sk-kn-..." \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-haiku-4-5","max_tokens":16,
"messages":[{"role":"user","content":"ping"}]}'참고 자료
SDK는 anthropics/claude-agent-sdk-python에서 오픈 소스로 제공됩니다. 여기에 설명된 환경 동작은 자체 하위 프로세스 전송 코드에서 확인했으며, 확인 날짜는 2026-09-04입니다. TypeScript SDK도 같은 아키텍처로 작동합니다. API를 직접 호출하지 않고 CLI를 구동하므로 라우팅 변수도 CLI가 읽습니다. README에는 옵션이나 동작 방식이 설명되어 있지 않으므로, 명시적 설정 방식에 의존하기 전에 해당 SDK의 타입 정의에서 옵션 이름을 확인하세요. Kunavo는 Messages API를 제공하며, 같은 방식으로 라우팅하는 다른 클라이언트는 통합 허브에서 확인할 수 있습니다.
자주 묻는 질문
Claude Agent SDK에서 사용자 지정 기본 URL을 사용할 수 있나요?
예. 다만 SDK 옵션으로는 사용할 수 없습니다. base_url 매개변수가 없으므로 README에서 해당 항목을 검색해도 아무것도 나오지 않습니다. SDK는 Claude Code CLI를 하위 프로세스로 실행하며, ANTHROPIC_BASE_URL과 ANTHROPIC_AUTH_TOKEN을 읽는 것은 CLI입니다. 프로그램이 실행되는 환경에서 이 두 변수를 설정하면 에이전트 코드 변경 없이 에이전트의 모든 호출이 해당 경로로 전달됩니다.
SDK는 CLI에 환경 변수를 어떻게 전달하나요?
부모 프로세스의 전체 환경을 상속한 뒤 키 하나만 정확히 제외합니다. Python SDK의 하위 프로세스 전송에서는 부모 os.environ에서 CLAUDECODE를 뺀 환경을 자식 환경으로 만들고, 여기에 CLAUDE_CODE_ENTRYPOINT를 병합한 다음 ClaudeAgentOptions.env를 병합하고, 마지막으로 SDK 버전을 병합합니다. 여기서 두 가지 결과가 따릅니다. 셸에 있는 모든 항목이 CLI에 전달되며, options.env가 그 위에 병합되므로 셸 환경보다 우선합니다.
환경 변수를 사용해야 하나요, 아니면 ClaudeAgentOptions(env=...)를 사용해야 하나요?
개인 노트북이 아닌 환경에서는 options.env를 사용하세요. 현재 셸 환경에 의존하면 에이전트의 엔드포인트가 프로세스 실행 방식에 따라 달라져, 프로필을 불러오지 않는 스케줄러, 컨테이너 또는 CI 작업에서 처음 실행할 때 문제가 발생합니다. options 객체에 env를 명시적으로 전달하면 라우팅이 실행 환경이 아닌 프로그램의 속성이 됩니다. 또한 상속된 환경 위에 병합되므로 오래된 export 값보다도 우선합니다.
Agent SDK를 사용하려면 별도의 Anthropic 계정이 필요한가요?
Claude Code CLI가 허용하는 자격 증명이 필요하지만, 반드시 Anthropic에서 발급한 자격 증명일 필요는 없습니다. ANTHROPIC_BASE_URL과 ANTHROPIC_AUTH_TOKEN을 통해 라우팅하므로 Anthropic Messages API를 제공하는 엔드포인트를 사용할 수 있습니다. Kunavo에서는 https://api.kunavo.com에 대한 sk-kn- 키 하나를 사용하고, 요금제 대신 선불 잔액에서 토큰별로 요금이 청구됩니다.
Agent SDK 프로그램에서는 어떤 모델을 사용해야 하나요?
에이전트는 작업을 여러 하위 작업으로 분기하므로 하위 작업에 맞춰 티어를 선택하세요. Claude Haiku 4.5는 1M 토큰당 $0.70 / $3.50이며 CLI가 자체적으로 생성하는 백그라운드 작업에 적합합니다. Claude Sonnet 5는 $1.40 / $7.00로 기본 작업에 적합하고, Claude Opus 5는 $3.50 / $17.50로 더 저렴한 티어에서 여러 번 시도해야 하는 경우에만 사용할 가치가 있습니다. 두 라우팅 변수와 함께 ANTHROPIC_DEFAULT_HAIKU_MODEL을 설정하는 것은 한 줄만 추가하면 되며, 모든 실행 비용을 줄여 줍니다.
TypeScript Agent SDK도 같은 방식으로 작동하나요?
아키텍처는 같습니다. SDK가 API를 직접 호출하는 대신 Claude Code CLI를 구동하므로, 라우팅 변수를 읽는 역할도 다시 CLI가 맡습니다. 이 페이지는 확인한 자료가 Python SDK이므로 해당 SDK의 작동 방식을 설명합니다. TypeScript SDK를 사용하는 경우 명시적 설정 방식에 의존하기 전에 자체 타입 정의에서 옵션 이름을 확인하고, 그동안에는 내보낸 환경 변수를 사용하세요.
SDK가 환경에서 CLAUDECODE를 제외하는 이유는 무엇인가요?
SDK가 실행한 CLI가 Claude Code 상위 세션 안에서 실행 중이라고 판단하지 않도록 하기 위해서입니다. 상속된 환경에서 제거되는 유일한 키이며, 여기서 중요한 이유는 이 키를 제외한 나머지 환경이 모두 전달된다는 점을 보여주기 때문입니다. 여기에는 이 페이지에서 다루는 두 라우팅 변수도 포함됩니다.