
Claude Code 하네스에서 ChatGPT 모델 사용하기
요약
macOS 환경에서 Apple의 container CLI를 활용하여 Claude Code의 백엔드로 ChatGPT 모델을 연결하는 방법을 설명합니다. Docker Desktop 대신 Apple 공식 컨테이너 서비스를 사용하여 CLIProxyAPI를 실행하고, Codex OAuth를 통해 GPT 모델을 연동하는 절차를 다룹니다.
핵심 포인트
- macOS에서 Docker 대신 Apple container CLI를 사용하여 효율적인 환경 구축
- CLIProxyAPI를 통해 Claude Code와 ChatGPT 모델 간의 호환성 확보
- Apple container의 bind mount 시 발생할 수 있는 파일 마운트 에러 해결 방법 제시
- Codex OAuth를 이용한 GPT-5.6 Sol 모델 연동 및 설정 방법
Claude Code 하네스에서 ChatGPT 모델 사용하기
X에서 ChatGPT를 Claude Code 하네스에서 사용하면 성능이 높아진다는 포스트를 보고, 이를 macOS에서 구현할 때의 절차를 작성해 둡니다.
- 원문 출처
개인적으로 macOS에서 동작하는 Docker가 느려서 싫기 때문에, Apple의 공식 컨테이너 서비스인 container를 사용하는 절차로 작성했습니다.
개요
Docker Desktop을 사용하지 않고, macOS의 Apple container CLI로 CLIProxyAPI를 실행하여, Codex OAuth를 통해 GPT-5.6 Sol을 Claude Code의 백엔드로 이용합니다.
Claude Code
↓ Anthropic Messages 호환 API
CLIProxyAPI
...
Apple container가 자동으로 설정한 DNS 192.168.64.1이 작동하지 않는 경우가 있으므로 DNS는 Cloudflare를 지정합니다.
--dns 1.1.1.1
전제 조건
- macOS
- Apple
containerCLI - Claude Code
- ChatGPT 계정
curljqopenssl
확인:
container --version
container system status
claude --version
...
container version이 아니라 container --version을 사용합니다.
Apple container가 정지되어 있는 경우:
container system start
container system status
디렉토리 생성하기
mkdir -p \
"$HOME/.config/cliproxy" \
"$HOME/.local/share/cliproxy/auth" \
...
로컬 API 토큰 생성하기
기존 토큰을 덮어쓰지 않습니다.
if [[ ! -s "$HOME/.config/cliproxy/token" ]]; then
openssl rand -hex 32 > "$HOME/.config/cliproxy/token"
fi
...
확인:
cat "$HOME/.config/cliproxy/token"
이 토큰은 Claude Code에서 CLIProxyAPI로의 연결 인증에 사용합니다.
CLIProxyAPI 설정 파일 생성하기
TOKEN="$(cat "$HOME/.config/cliproxy/token")"
cat > "$HOME/.config/cliproxy/config.yaml" <<YAML
host: "0.0.0.0"
...
설정 요점:
- 컨테이너 내부에서는
0.0.0.0:8317에서 대기함 - 호스트 측은 나중에
127.0.0.1:8317로만 공개함 - Codex OAuth 인증 정보는
/root/.cli-proxy-api에 저장함 gpt-5.6-sol의 추론 강도를xhigh로 고정함- 원격 관리 화면은 비활성화함
Apple container에서의 bind mount
단일 파일을 직접 bind mount하면 다음과 같은 에러가 발생할 수 있습니다.
Error: path '/Users/.../.config/cliproxy/config.yaml' is not a directory
따라서 다음 형식은 사용하지 않습니다.
--mount "type=bind,source=$HOME/.config/cliproxy/config.yaml,target=/CLIProxyAPI/config.yaml"
설정 디렉토리 전체를 /config에 mount합니다.
--mount "type=bind,source=$HOME/.config/cliproxy,target=/config"
CLIProxyAPI에는 설정 파일의 위치를 명시합니다.
--config /config/config.yaml
CLIProxyAPI 이미지 가져오기
IMAGE='docker.io/eceasy/cli-proxy-api:latest'
container image pull "$IMAGE"
확인:
container image list
DNS 통신 확인하기
Apple container의 기본 DNS를 사용하지 않고, 외부 DNS를 명시합니다. (통신이 원활하지 않을 때가 있기 때문입니다.)
container run --rm \
--dns 1.1.1.1 \
alpine:latest \
...
정상이라면 IP 주소가 반환됩니다.
Codex OAuth로 인증하기
IMAGE='docker.io/eceasy/cli-proxy-api:latest'
container run --rm -it \
--name cliproxy-login \
...
표시된 OpenAI OAuth URL을 macOS 브라우저에서 엽니다. (API 과금이 아니라 구독을 사용할 수 있어 저렴합니다.)
성공 시:
Codex authentication successful!
인증 파일을 확인합니다.
find "$HOME/.local/share/cliproxy/auth" \
-maxdepth 2 \
-type f \
...
인증 정보 저장 위치:
~/.local/share/cliproxy/auth
※ 이 디렉토리를 Git에 추가하지 않도록 주의하세요.
CLIProxyAPI를 상주 실행하기
기존에 동일한 이름의 컨테이너가 있는 경우 삭제합니다.
container delete --force cliproxy 2>/dev/null || true
실행:
IMAGE='docker.io/eceasy/cli-proxy-api:latest'
container run --detach \
--name cliproxy \
...
포트는 macOS의 로컬호스트(localhost)에만 공개합니다.
127.0.0.1:8317 → container:8317
LAN(로컬 네트워크)에는 공개하지 않습니다.
실행 상태 및 로그 확인하기
container list --all
정상 예시:
cliproxy ... running
로그:
container logs cliproxy
정상 시 로그 예시:
API server started successfully on: 0.0.0.0:8317
server clients and configuration updated: 1 clients
지속 모니터링:
container logs -f cliproxy
모델 목록 확인하기
PROXY_TOKEN="$(cat "$HOME/.config/cliproxy/token")"
curl -fsS http://127.0.0.1:8317/v1/models \
-H "Authorization: Bearer $PROXY_TOKEN" |
...
정상 예시:
gpt-5.6-sol
gpt-5.6-terra
gpt-5.6-sol이 표시되지 않으면 Claude Code 측의 설정으로 넘어가지 마세요.
Anthropic Messages 호환 API 확인하기
PROXY_TOKEN="$(cat "$HOME/.config/cliproxy/token")"
curl -fsS http://127.0.0.1:8317/v1/messages \
-H "Authorization: Bearer $PROXY_TOKEN" \
...
정상 예시:
{
"type": "message",
"role": "assistant",
...
이 단계가 성공한 후에 Claude Code를 연결합니다.
Claude Code를 일시적으로 연결하기
PROXY_TOKEN="$(cat "$HOME/.config/cliproxy/token")"
export ANTHROPIC_BASE_URL="http://127.0.0.1:8317"
export ANTHROPIC_AUTH_TOKEN="$PROXY_TOKEN"
...
최초 실행 시에는 워크스페이스의 신뢰 확인이 표시된다.
~/YOUR_PROJECTS
전체가 아니라, 대상 프로젝트의 루트(root)에서 실행한다.
cd "$HOME/YOUR_PROJECTS/example-project"
claude --model gpt-5.6-sol --effort xhigh
Claude Code 내에서 확인:
/status
/model
/effort
다른 터미널에서 프록시 로그를 확인:
container logs -f cliproxy
모델 자체에게 모델 이름을 질문하는 방법은 검증이 되지 않는다. Claude Code의 상태(status)와 CLIProxyAPI의 로그를 사용한다.
claude-sol 래퍼(wrapper)를 작성한다
cat > "$HOME/.local/bin/claude-sol" <<'ZSH'
##!/bin/zsh
set -euo pipefail
...
~/.local/bin
이 PATH에 없는 경우:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.zshrc"
source "$HOME/.zshrc"
사용 방법:
cd "$HOME/YOUR_PROJECTS/example-project"
claude-sol
인자(argument)도 그대로 전달할 수 있다.
claude-sol --continue
컨테이너(container) 조작
목록:
container list --all
정지:
container stop cliproxy
재개:
container start cliproxy
로그:
container logs -f cliproxy
삭제:
container delete --force cliproxy
Apple container
시스템을 정지하면 CLIProxyAPI 이외의 컨테이너도 정지한다.
container system stop
재부팅 후에는 필요한 컨테이너를 개별적으로 시작한다.
container system start
container start cliproxy
이미지(image) 업데이트
IMAGE='docker.io/eceasy/cli-proxy-api:latest'
container image pull "$IMAGE"
container stop cliproxy 2>/dev/null || true
...
그 후, 상주 실행을 위한 container run을 재실행한다.
latest
는 업데이트에 의해 호환성이 깨질 가능성이 있다. 안정적인 동작을 확인한 후에는 사용 가능한 고정 버전 태그를 사용하는 것이 더 안전하다.
트러블슈팅 (Troubleshooting)
path '.../config.yaml' is not a directory
원인은 단일 파일을 직접 바인드 마운트(bind mount)하고 있기 때문이다.
사용하지 않음:
--mount "type=bind,source=$HOME/.config/cliproxy/config.yaml,target=/CLIProxyAPI/config.yaml"
사용함:
--mount "type=bind,source=$HOME/.config/cliproxy,target=/config"
--config /config/config.yaml
DNS: transient error
또는 Connection refused
확인:
container run --rm alpine:latest sh -lc '
cat /etc/resolv.conf
nslookup auth.openai.com
...
기본 DNS 192.168.64.1
이 거부되는 경우, 모든 대상 컨테이너에 외부 DNS를 지정한다.
--dns 1.1.1.1
ERR_CONNECTION_REFUSED
OAuth 이후에 로그인 컨테이너에 다음 포트 공개가 필요하다.
-p 127.0.0.1:1455:1455
추가로 DNS 지정이 필요하다.
--dns 1.1.1.1
Authentication failed
컨테이너에서 OpenAI 인증 서버를 이름 해결 (Name Resolution) 할 수 있는지 확인한다.
container run --rm \
--dns 1.1.1.1 \
alpine:latest \
...
성공한 후에 OAuth 로그인을 다시 실행한다.
/v1/models
로 접속할 수 없는 경우
container list --all
container logs cliproxy
CLIProxyAPI 설정은 다음과 같아야 한다.
host: "0.0.0.0"
port: 8317
호스트 측 공개 설정:
-p 127.0.0.1:8317:8317
API 인증 에러
PROXY_TOKEN="$(cat "$HOME/.config/cliproxy/token")"
요청 헤더 (Request Header):
-H "Authorization: Bearer $PROXY_TOKEN"
~/.config/cliproxy/token과 config.yaml의 api-keys가 일치하는지 확인한다.
보안
8317번 포트는 로컬호스트(localhost)에만 공개한다.
-p 127.0.0.1:8317:8317
다음과 같이 모든 인터페이스(All Interfaces)에 공개하지 않는다.
-p 8317:8317
보호 대상:
~/.config/cliproxy/token
~/.config/cliproxy/config.yaml
~/.local/share/cliproxy/auth
권장 권한:
chmod 600 "$HOME/.config/cliproxy/token"
chmod 600 "$HOME/.config/cliproxy/config.yaml"
chmod 700 "$HOME/.local/share/cliproxy/auth"
※ 이 구성은 Claude Code의 공식적인 비 Claude 모델 지원 방식이 아니므로, Claude Code, CLIProxyAPI 또는 Codex 인증 방식의 업데이트로 인해 호환성이 깨질 수 있다.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기