Docker Desktopを使わず、macOSのApple container CLIでCLIProxyAPIを実行し、 Codex OAuth経由でGPT-5.6 SolをClaude Codeのバックエンドとして利用する。
Claude Code
↓ Anthropic Messages互換API
CLIProxyAPI
↓ Codex OAuth
GPT-5.6 Sol / GPT-5.6 Terra
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
curl --version
jq --versioncontainer version ではなく container --version を使う。
Apple container が停止している場合:
container system start
container system statusmkdir -p \
"$HOME/.config/cliproxy" \
"$HOME/.local/share/cliproxy/auth" \
"$HOME/.local/share/cliproxy/plugins" \
"$HOME/.local/bin"
chmod 700 \
"$HOME/.config/cliproxy" \
"$HOME/.local/share/cliproxy" \
"$HOME/.local/share/cliproxy/auth" \
"$HOME/.local/share/cliproxy/plugins"既存トークンを上書きしない。
if [[ ! -s "$HOME/.config/cliproxy/token" ]]; then
openssl rand -hex 32 > "$HOME/.config/cliproxy/token"
fi
chmod 600 "$HOME/.config/cliproxy/token"確認:
cat "$HOME/.config/cliproxy/token"このトークンはClaude CodeからCLIProxyAPIへの接続認証に使用する。
TOKEN="$(cat "$HOME/.config/cliproxy/token")"
cat > "$HOME/.config/cliproxy/config.yaml" <<YAML
host: "0.0.0.0"
port: 8317
tls:
enable: false
auth-dir: "/root/.cli-proxy-api"
api-keys:
- "$TOKEN"
remote-management:
allow-remote: false
secret-key: ""
disable-control-panel: true
debug: false
logging-to-file: false
usage-statistics-enabled: false
payload:
override:
- models:
- name: "gpt-5.6-sol"
protocol: "codex"
params:
"reasoning.effort": "xhigh"
YAML
chmod 600 "$HOME/.config/cliproxy/config.yaml"
unset TOKEN設定の要点:
- コンテナ内では
0.0.0.0:8317で待ち受ける - ホスト側は後で
127.0.0.1:8317のみに公開する - Codex OAuth認証情報は
/root/.cli-proxy-apiに保存する gpt-5.6-solの推論強度をxhighに固定する- リモート管理画面は無効化する
単一ファイルを直接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.yamlIMAGE='docker.io/eceasy/cli-proxy-api:latest'
container image pull "$IMAGE"確認:
container image listApple container の既定DNSを使わず、外部DNSを明示する。
container run --rm \
--dns 1.1.1.1 \
alpine:latest \
nslookup auth.openai.com正常ならIPアドレスが返る。
IMAGE='docker.io/eceasy/cli-proxy-api:latest'
container run --rm -it \
--name cliproxy-login \
--dns 1.1.1.1 \
-p 127.0.0.1:1455:1455 \
--mount "type=bind,source=$HOME/.config/cliproxy,target=/config" \
--mount "type=bind,source=$HOME/.local/share/cliproxy/auth,target=/root/.cli-proxy-api" \
--mount "type=bind,source=$HOME/.local/share/cliproxy/plugins,target=/CLIProxyAPI/plugins" \
"$IMAGE" \
/CLIProxyAPI/CLIProxyAPI \
--config /config/config.yaml \
--no-browser \
--codex-login表示されたOpenAI OAuth URLをmacOSのブラウザで開く。
成功時:
Codex authentication successful!
認証ファイルを確認する。
find "$HOME/.local/share/cliproxy/auth" \
-maxdepth 2 \
-type f \
-ls認証情報の保存先:
~/.local/share/cliproxy/auth
このディレクトリをGitへ追加しない。
既存の同名コンテナがある場合は削除する。
container delete --force cliproxy 2>/dev/null || true起動:
IMAGE='docker.io/eceasy/cli-proxy-api:latest'
container run --detach \
--name cliproxy \
--dns 1.1.1.1 \
--cpus 3 \
--memory 3G \
-p 127.0.0.1:8317:8317 \
--mount "type=bind,source=$HOME/.config/cliproxy,target=/config" \
--mount "type=bind,source=$HOME/.local/share/cliproxy/auth,target=/root/.cli-proxy-api" \
--mount "type=bind,source=$HOME/.local/share/cliproxy/plugins,target=/CLIProxyAPI/plugins" \
"$IMAGE" \
/CLIProxyAPI/CLIProxyAPI \
--config /config/config.yamlポートはmacOSのローカルホストだけへ公開する。
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 cliproxyPROXY_TOKEN="$(cat "$HOME/.config/cliproxy/token")"
curl -fsS http://127.0.0.1:8317/v1/models \
-H "Authorization: Bearer $PROXY_TOKEN" |
jq -r '.data[].id' |
grep 'gpt-5\.6'正常例:
gpt-5.6-sol
gpt-5.6-terra
gpt-5.6-sol が表示されない場合、Claude Code側の設定へ進まない。
PROXY_TOKEN="$(cat "$HOME/.config/cliproxy/token")"
curl -fsS http://127.0.0.1:8317/v1/messages \
-H "Authorization: Bearer $PROXY_TOKEN" \
-H 'anthropic-version: 2023-06-01' \
-H 'content-type: application/json' \
-d '{
"model": "gpt-5.6-sol",
"max_tokens": 32,
"messages": [
{
"role": "user",
"content": "Reply with exactly OK."
}
]
}' | jq正常例:
{
"type": "message",
"role": "assistant",
"model": "gpt-5.6-sol",
"content": [
{
"type": "text",
"text": "OK"
}
]
}ここが成功してから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"
unset ANTHROPIC_API_KEY
claude --model gpt-5.6-sol --effort xhigh初回起動時にはワークスペースの信頼確認が表示される。
~/Sites 全体ではなく、対象プロジェクトのルートで起動する。
cd "$HOME/Sites/example-project"
claude --model gpt-5.6-sol --effort xhighClaude Code内で確認:
/status
/model
/effort
別ターミナルでプロキシログを確認:
container logs -f cliproxyモデル自身へモデル名を質問する方法は検証にならない。 Claude CodeのステータスとCLIProxyAPIのログを使う。
cat > "$HOME/.local/bin/claude-sol" <<'ZSH'
#!/bin/zsh
set -euo pipefail
TOKEN_FILE="$HOME/.config/cliproxy/token"
BASE_URL="http://127.0.0.1:8317"
if [[ ! -r "$TOKEN_FILE" ]]; then
print -u2 "Missing token: $TOKEN_FILE"
exit 1
fi
TOKEN="$(<"$TOKEN_FILE")"
if ! curl -fsS \
--max-time 3 \
"$BASE_URL/v1/models" \
-H "Authorization: Bearer $TOKEN" \
>/dev/null; then
print -u2 "CLIProxyAPI is not reachable."
exit 1
fi
ANTHROPIC_BASE_URL="$BASE_URL" \
ANTHROPIC_AUTH_TOKEN="$TOKEN" \
ANTHROPIC_MODEL=gpt-5.6-sol[1m] \
ANTHROPIC_SMALL_FAST_MODEL=gpt-5.6-luna[1m] \
CLAUDE_CODE_AUTO_COMPACT_WINDOW=372000 \
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 \
CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK=1 \
CLAUDE_CODE_SUBAGENT_MODEL=gpt-5.6-sol \
CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1 \
CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY=3 \
ENABLE_TOOL_SEARCH=false \
claude --model gpt-5.6-sol
"$@"
ZSH
chmod 700 "$HOME/.local/bin/claude-sol"~/.local/bin がPATHにない場合:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.zshrc"
source "$HOME/.zshrc"利用方法:
cd "$HOME/Sites/example-project"
claude-sol引数もそのまま渡せる。
claude-sol --continue一覧:
container list --all停止:
container stop cliproxy再開:
container start cliproxyログ:
container logs -f cliproxy削除:
container delete --force cliproxyApple container のシステムを停止すると、CLIProxyAPI以外のコンテナも停止する。
container system stop再起動後は必要なコンテナを個別に開始する。
container system start
container start cliproxyIMAGE='docker.io/eceasy/cli-proxy-api:latest'
container image pull "$IMAGE"
container stop cliproxy 2>/dev/null || true
container delete --force cliproxy 2>/dev/null || trueその後、常駐起動用の container run を再実行する。
latest は更新によって互換性が崩れる可能性がある。 安定動作を確認した後は、利用可能な固定バージョンタグを使う方が安全。
原因は単一ファイルを直接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確認:
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ログインコンテナに次のポート公開が必要。
-p 127.0.0.1:1455:1455さらにDNS指定が必要。
--dns 1.1.1.1コンテナからOpenAI認証サーバーを名前解決できるか確認する。
container run --rm \
--dns 1.1.1.1 \
alpine:latest \
nslookup auth.openai.com成功後にOAuthログインを再実行する。
container list --all
container logs cliproxyCLIProxyAPI設定は次である必要がある。
host: "0.0.0.0"
port: 8317ホスト側の公開設定:
-p 127.0.0.1:8317:8317PROXY_TOKEN="$(cat "$HOME/.config/cliproxy/token")"リクエストヘッダー:
-H "Authorization: Bearer $PROXY_TOKEN"~/.config/cliproxy/token と config.yaml の api-keys が一致していることを確認する。
8317番ポートはローカルホストだけへ公開する。
-p 127.0.0.1:8317:8317次のように全インターフェースへ公開しない。
-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認証方式の更新で互換性が崩れる可能性がある。
元ネタ
https://x.com/OmedVibeCodes/status/2080348655039500703