Anthropic API 요청을 OpenAI 호환 형식으로 변환하는 고성능 Rust 프록시
요약
Anthropic API 요청을 OpenAI와 호환되는 형식으로 변환하는 고성능 Rust 프록시를 소개합니다. 이 도구는 OpenRouter, 네이티브 OpenAI 등 모든 OpenAI 호환 엔드포인트에서 Claude Code 및 기타 Anthropic 클라이언트가 사용할 수 있도록 설계되었습니다.
핵심 포인트
- Rust로 작성되어 빠르고 가벼우며 async I/O를 사용합니다.
- Server-Sent Events (SSE)와 Tool Calling을 완벽하게 지원합니다.
- OpenAI 호환 API(OpenRouter, OpenAI 등)와 범용적으로 작동합니다.
- 공식 Anthropic SDK와 드롭인 대체품으로 사용할 수 있습니다.
Anthropic API 요청을 OpenAI와 호환되는 형식으로 번역하는 고성능 Rust 프록시입니다. OpenRouter, 네이티브 OpenAI 또는 모든 OpenAI 호환 엔드포인트를 사용하는 Claude Code, Claude Desktop 또는 기타 Anthropic API 클라이언트에서 사용하세요.
빠르고 가벼움: async I/O를 사용하여 Rust로 작성되었으며 (약 3MB 바이너리)
완전한 스트리밍: 실시간 응답을 위한 Server-Sent Events (SSE) 지원
Tool Calling: 함수/도구 호출에 대한 완벽한 지원
범용성: 모든 OpenAI 호환 API(OpenRouter, OpenAI, Azure, 로컬 LLM)와 작동합니다.
확장된 사고 과정: Claude의 추론 모드를 지원합니다.
드롭인 대체품: 공식 Anthropic SDK와 호환됩니다.
참고: 현재는 Task 사용이 권장됩니다. brew install go-task로 설치하거나, 설치 가이드를 참조하세요. 릴리스 버전에는 빌드 바이너리가 곧 제공될 예정입니다.
# Rust 설치 (필요한 경우)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
task local-install
curl -fsSL https://raw.githubusercontent.com/m0n0x41d/anthropic-proxy-rs/main/install.sh | bash
이 설치 프로그램은 내부적으로 cargo install --git ... --locked를 사용하므로, 여전히 Rust/Cargo가 시스템에 존재해야 합니다.
UPSTREAM_BASE_URL=https://openrouter.ai/api \
UPSTREAM_API_KEY=sk-or-... \
anthropic-proxy
cargo build --release
UPSTREAM_BASE_URL=https://api.openai.com \
UPSTREAM_API_KEY=sk-... \
...
anthropic-proxy --help
명령어:
| 명령어 | 설명 |
|---|---|
stop | 실행 중인 데몬을 중지합니다. |
status | 데몬 상태를 확인합니다. |
옵션:
옵션 (Options)
| Option | Short | Description |
|---|---|---|
--config <FILE> | -c | 사용자 정의 .env 파일 경로 |
--debug | -d | 디버그 로깅 활성화 |
--verbose | -v | 상세 로깅 활성화 (요청/응답 본문 전체 기록) |
--port <PORT> | -p | 리스닝 포트 (환경 변수 PORT 덮어쓰기) |
--bind <ADDR> | 리스너 바인딩 주소 (ANTHROPIC_PROXY_BIND 덮어쓰기, 기본값 0.0.0.0) | |
--system-prompt-ignore <TEXT> | 업스트림으로 전달하기 전에 하나 이상의 시스템 프롬프트 용어 제거 (반복 또는 ; 로 구분) | |
--daemon | 백그라운드 데몬으로 실행 | |
--pid-file <FILE> | PID 파일 경로 (기본값: /tmp/anthropic-proxy.pid) | |
--help | -h | 도움말 정보 출력 |
--version | -V | 버전 정보 출력 |
설정은 환경 변수 또는 .env 파일로 할 수 있습니다.
환경 변수 (Environment Variables)
| Variable | Required | Default | Description |
|---|---|---|---|
UPSTREAM_BASE_URL | 예 | - | OpenAI 호환 엔드포인트 URL |
UPSTREAM_API_KEY | 아니요* | - | 업스트림 서비스용 API 키 |
UPSTREAM_API_KEY_PASSTHROUGH | 아니요 | false | 들어오는 x-api-key 헤더에서 요청별로 API 키 추출 여부 (true/false) |
PORT | 아니요 | 3000 | 서버 포트 |
ANTHROPIC_PROXY_BIND | 아니요 | 0.0.0.0 | 리스너 바인딩 주소. 접근을 localhost로 제한하려면 127.0.0.1로 설정하는 것이 좋습니다 (공유 네트워크에서 권장). 0.0.0.0으로 바인딩할 경우 경고가 기록됩니다. |
ANTHROPIC_PROXY_SYSTEM_PROMPT_IGNORE_TERMS | 아니요 | - | 업스트림으로 전달하기 전에 제거할 시스템 프롬프트 용어 (; 또는 줄바꿈으로 구분) |
ANTHROPIC_PROXY_MODEL_MAP | 아니요 | - | 업스트림 호출 전 정확한 모델 재매핑 (source=target;other=target) |
REASONING_MODEL | 아니요 | (요청 모델 사용) | 확장된 사고(extended thinking)가 활성화될 때 사용할 모델. ** |
COMPLETION_MODEL | 아니요 | (요청 모델 사용) | 표준 요청에 사용할 모델 (사고 없음). ** |
DEBUG | 아니요 | false | 디버그 로깅 활성화 (1 또는 true) |
VERBOSE | 아니요 | false | 상세 로깅 활성화 (1 또는 true) |
- 업스트림 엔드포인트에 인증이 필요한 경우 필수
** 프록시는 요청에 확장된 사고(extended thinking)가 활성화되었는지 자동으로 감지합니다 (요청의 thinking 매개변리를 통해). 그리고 이를 REASONING_MODEL로 라우팅합니다. 일반적인 요청은 사고 기능 없이 COMPLETION_MODEL을 사용합니다. 이 기능을 통해 추론 작업에는 더 강력한 모델을, 간단한 완성(completion)에는 더 빠르고 저렴한 모델을 사용할 수 있습니다. 설정하지 않으면 클라이언트 요청의 모델이 사용됩니다.
UPSTREAM_BASE_URL은 다음 형식 중 어느 것도 허용합니다:
- 서비스 기본 URL:
https://api.openai.com->/v1/chat/completions - 버전 지정 기본 URL:
https://gateway.company.internal/v2->/v2/chat/completions - 전체 엔드포인트:
https://gateway.company.internal/v2/chat/completions
시스템 프롬프트 정제(System prompt sanitization):
- 프록시는 업스트림
system프롬프트에서 구성된 용어를 전달하기 전에 제거할 수 있습니다. - 다음으로 용어를 설정합니다:ANTHROPIC_PROXY_SYSTEM_PROMPT_IGNORE_TERMS='rm -rf;git reset --hard' - 또는
--system-prompt-ignore를 반복하여 사용합니다. 예를 들어,--system-prompt-ignore 'rm -rf' --system-prompt-ignore 'git reset --hard'
모델 매핑(Model mapping):
ANTHROPIC_PROXY_MODEL_MAP='claude-opus-4-6=openai/gpt-4.1;claude-haiku-4-5=openai/gpt-4.1-mini'
REASONING_MODEL과 COMPLETION_MODEL이 먼저 선택된 후, 업스트림 호출 전에 최종 모델 이름에 ANTHROPIC_PROXY_MODEL_MAP이 적용됩니다.
프록시는 다음 순서로 .env 파일을 검색합니다:
--config플래그로 지정된 사용자 정의 경로 - 현재 작업 디렉토리 (./.env) - 사용자 홈 디렉토리 (~/.anthropic-proxy.env) - 시스템 전체 설정 (/etc/anthropic-proxy/.env)
.env 파일이 발견되지 않으면, 프록시는 셸의 환경 변수를 사용합니다.
UPSTREAM_API_KEY_PASSTHROUGH=true로 설정되면, 프록시는 각 수신 요청의 x-api-key 헤더(Anthropic SDK 및 클라이언트가 사용하는 표준 헤더)에서 API 키를 추출하여 이를 Authorization: Bearer {key} 형식으로 업스트림 OpenAI 호환 엔드포인트에 전달합니다.
이는 각 클라이언트가 UPSTREAM_API_KEY에 설정된 단일 정적 키를 사용하는 대신, 자체 키로 업스트림 서비스에 인증하길 원할 때 유용합니다.
# 패스스루 모드 활성화 (UPSTREAM_API_KEY는 설정되지 않아야 함)
UPSTREAM_API_KEY_PASSTHROUGH=true \
UPSTREAM_BASE_URL=https://openrouter.ai/api \
...
중요 제약 사항:
UPSTREAM_API_KEY_PASSTHROUGH=true는 UPSTREAM_API_KEY와 결합될 수 없습니다. 둘 다 설정되면 프록시는 시작을 거부합니다.
- 패스스루가 활성화되었지만, 들어오는 요청에
x-api-key헤더(또는 빈 값)가 없는 경우,Authorization헤더는 업스트림으로 전송되지 않습니다. - 업스트림 엔드포인트가 인증되지 않은 요청을 수락할지 여부를 결정합니다. - 패스스루는/v1/messages와/v1/models엔드포인트 모두에 적용됩니다. 두 엔드포인트 모두 Anthropic 클라이언트로부터x-api-key헤더를 받기 때문입니다.
# 데몬으로 프록시 시작 및 Claude Code 즉시 사용
anthropic-proxy --daemon && ANTHROPIC_BASE_URL=http://localhost:3000 claude
# 또는 별도의 터미널 사용:
...
# CLI 플래그를 통해 디버그 로깅 활성화
anthropic-proxy --debug
# 또는 환경 변수를 통해
...
# 환경 변수를 통해 특정 용어 제거
ANTHROPIC_PROXY_SYSTEM_PROMPT_IGNORE_TERMS='rm -rf;git reset --hard' anthropic-proxy
# 또는 CLI 플래그를 통해
...
# 사용자 지정 .env 파일 사용
anthropic-proxy --config /path/to/my-config.env
# 또는 홈 디렉토리에 배치
...
# 추론(reasoning)과 표준 완료(completion)에 대해 다른 모델 사용
# 요청에서 확장된 사고(extended thinking)가 활성화될 때 추론 모델이 사용됩니다.
# 사고 없이 표준 요청에는 완료 모델이 사용됩니다.
...
# 백그라운드 데몬으로 시작
anthropic-proxy --daemon
# 데몬 상태 확인
...
참고: 데몬으로 실행할 때, 로그는 /tmp/anthropic-proxy.log에 작성됩니다.
UPSTREAM_BASE_URL=https://gateway.company.internal/v2 \
UPSTREAM_API_KEY=sk-... \
ANTHROPIC_PROXY_MODEL_MAP='claude-opus-4-6=openai/gpt-4.1;claude-haiku-4-5=openai/gpt-4.1-mini' \
...
✅ 텍스트 메시지
✅ 시스템 프롬프트 (단일 및 다중)
✅ 이미지 콘텐츠 (base64)
✅ 도구/함수 호출
✅ 도구 결과
✅ 스트리밍 응답
✅ 확장 사고 모드 (자동 모델 라우팅)
✅ Temperature, top_p, top_k
✅ Stop sequences
✅ Max tokens
참고: 업스트림 모델이 도구 사용을 지원하는지 확인하십시오. 특히 Claude Code와 같은 코딩 에이전트를 위해 이 프록시를 사용하는 경우 더욱 그렇습니다.
프록시는 요청에 thinking 매개변수가 포함되어 있는지(예: Claude Codes의 경우) 자동으로 감지하고 이를 REASONING_MODEL에 지정된 모델로 라우팅합니다. thinking이 없는 요청은 COMPLETION_MODEL을 사용합니다.
모델 오버라이드 변수를 설정하지 않은 경우, 프록시는 클라이언트 요청에 지정된 모델을 사용합니다.
현재 지원되지 않는 Anthropic API 기능(Claude Code 및 유사 도구는 이러한 매개변수 없이 작동):):
tool_choice 매개변수 (항상 auto 사용)
service_tier 매개변수
metadata 매개변수
context_management 매개변수
container 매개변수- 응답 내 인용(Citations in responses)
pause_turn 및 refusal 중지 이유
- 메시지 배치 API (Message Batches API)
- 파일 API (Files API)
- 관리자 API (Admin API)
오류: UPSTREAM_BASE_URL이 필요합니다
→ 업스트림 엔드포인트 URL을 설정해야 합니다. 예시:
-
OpenRouter:
https://openrouter.ai/api -
OpenAI:
https://api.openai.com -
로컬:
http://localhost:11434
오류: 405 Method Not Allowed 또는 잘못된 업스트림 경로
→ UPSTREAM_BASE_URL이 어떻게 해석되는지 확인하십시오:
https://api.openai.com -> https://api.openai.com/v1/chat/completions
https://openrouter.ai/api -> https://openrouter.ai/api/v1/chat/completions
https://gateway.company.internal/v2 -> https://gateway.company.internal/v2/chat/completions
https://gateway.company.internal/v2/chat/completions -> 사용된 그대로- .../chat과 같은 부분 경로나 쿼리 문자열/프래그먼트가 포함된 URL은 거부됩니다.
모델을 찾을 수 없음 오류 (Model not found errors)
→ 클라이언트 요청의 모델을 오버라이드하려면 REASONING_MODEL 및 COMPLETION_MODEL을 설정하거나 ANTHROPIC_PROXY_MODEL_MAP을 사용하십시오.
클라이언트 모델 이름을 업스트림(upstream) 모델 이름으로 매핑하기 위해
Gateway/WAF가 Claude Code 시스템 프롬프트에 대해 403을 차단하는 경우
→ 다음을 사용하세요:
ANTHROPIC_PROXY_SYSTEM_PROMPT_IGNORE_TERMS
또는 --system-prompt-ignore
이를 통해 문제가 되는 용어를 제거한 후 업스트림으로 전달할 수 있습니다.
MIT License - Copyright (c) 2025 m0n0x41d (Ivan Zakutnii)
자세한 내용은 LICENSE를 참조하세요.
기여 환영! 다음을 수행해 주세요:
-
저장소(repository) 포크(Fork)하기
-
기능 브랜치(feature branch) 생성하기
-
변경 사항 적용하기
-
실행하기
cargo test && cargo clippy -
풀 리퀘스트(pull request) 제출하기
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Tools의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기