์ด ๊ธ€์€ ์›๋ž˜ hook ์ด์•ผ๊ธฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ์‹ค์ œ๋กœ ์ด๋ฒˆ ๊ตฌ์„ฑ์˜ ํ•ต์‹ฌ ํ๋ฆ„์€ ์•„๋ž˜๋‹ค.

OpenClaw โ†’ ACPX โ†’ Claude Agent Adapter โ†’ CCR(Claude Code Router) โ†’ GLM API

์ฆ‰ ๊ฒ‰์œผ๋กœ๋Š” claude ํ•˜๋‹ˆ์Šค๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ๋„, ์‹ค์ œ ๋ชจ๋ธ ์š”์ฒญ์€ CCR์ด ๋’ค์—์„œ GLM endpoint๋กœ ๋‹ค์‹œ ๋ผ์šฐํŒ…ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค. ๊ทธ๋ž˜์„œ ๋จผ์ € ํ•„์š”ํ•œ ๊ฒƒ์€ Node/npm ์ค€๋น„ โ†’ OpenClaw/CCR/Claude ์„ค์น˜ โ†’ CCR์˜ GLM endpoint ์„ค์ • โ†’ OpenClaw๊ฐ€ wrapper๋ฅผ ํ†ตํ•ด ACPX๋ฅผ CCR ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š” ์ผ์ด๊ณ , hook์€ ๊ทธ๋‹ค์Œ์— ๋ถ™์ด๋Š” ์„ ํƒํ˜• ํ•˜๋“œ๋‹์ด๋‹ค.

๊ฐ€์žฅ ๋งŽ์ด ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ง€์ ๋„ ๋”ฑ ์—ฌ๊ธฐ๋‹ค. api_base_url์€ CCR์ด ๋ฐ”๊นฅ ๋ชจ๋ธ ์ œ๊ณต์ž์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” upstream endpoint์ด๊ณ , ANTHROPIC_BASE_URL์€ Claude Code๊ฐ€ ๋กœ์ปฌ CCR๋กœ ๋ถ™๋Š” local endpoint๋‹ค. ์ด ๋‘˜์„ ์„ž์–ด ์ƒ๊ฐํ•˜๋ฉด โ€œCCR์„ ๊น”์•˜๋Š”๋ฐ๋„ ์™œ ๊ทธ๋ƒฅ ๊ธฐ๋ณธ Claude์ฒ˜๋Ÿผ ๊ฐ€์ง€?โ€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ”๋กœ ์ƒ๊ธด๋‹ค.

flowchart LR
A[OpenClaw] --> B[ACPX]
B --> C[Claude Agent Adapter]
C --> D[CCR local endpoint<br/>127.0.0.1:3456]
D --> E[GLM API<br/>api.z.ai]
E --> F[์„ ํƒ: Claude Hook]

๐Ÿง  ์น ํŒ ์น˜ํŠธ์‹œํŠธ

  • 1๋‹จ๊ณ„๋Š” hook์ด ์•„๋‹ˆ๋ผ Claude CLI ์„ค์น˜๋‹ค.
  • 2๋‹จ๊ณ„๋Š” CCR ์„ค์น˜ + config.json ์ž‘์„ฑ์ด๋‹ค.
  • 3๋‹จ๊ณ„๋Š” ccr activate๋กœ local endpoint๋ฅผ Claude์— ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • OpenClaw๋Š” CCR์— ์ง์ ‘ ๋ถ™๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, CCR์ด ์ฃผ์ž…๋œ Claude Code ํ•˜๋‹ˆ์Šค๋ฅผ ํ†ตํ•ด ์šฐํšŒํ•œ๋‹ค.
  • hook์€ ์—ฐ๊ฒฐ์ด ์•ˆ์ •ํ™”๋œ ๋’ค์—๋งŒ ๋ถ™์—ฌ๋„ ๋Šฆ์ง€ ์•Š๋‹ค.

๋จผ์ € ๊ฒฐ๋ก ๋ถ€ํ„ฐ

OpenClaw + CCR ์„ธํŒ…์€ ์•„๋ž˜ ์ˆœ์„œ๋กœ ๋ณด๋ฉด ๊ฐ€์žฅ ๋œ ๊ผฌ์ธ๋‹ค.

  1. Node/npm์„ ํ™•์ธํ•˜๊ณ  openclaw + ccr + claude CLI๋ฅผ ๊ฐ™์ด ์„ค์น˜ํ•œ๋‹ค.
  2. ~/.claude-code-router/config.json์—์„œ GLM endpoint๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  3. ccr start + ccr activate๋กœ Claude๊ฐ€ ๋กœ์ปฌ CCR endpoint๋ฅผ ๋ณด๊ฒŒ ๋งŒ๋“ ๋‹ค.
  4. OpenClaw๊ฐ€ wrapper๋ฅผ ํ†ตํ•ด acpx๋ฅผ CCR ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋งž์ถ˜๋‹ค.
  5. ๊ทธ ๋’ค์—๋งŒ hook์œผ๋กœ ๊ฐ์‹œ/์ฐจ๋‹จ์„ ์–‡๊ฒŒ ์ถ”๊ฐ€ํ•œ๋‹ค.

ํ•ต์‹ฌ์€ โ€œOpenClaw๋ฅผ ๋œฏ์–ด๊ณ ์นœ๋‹คโ€๊ฐ€ ์•„๋‹ˆ๋ผ, Claude Code ๋Ÿฐํƒ€์ž„์ด ์–ด๋–ค endpoint๋ฅผ ๋ฐ”๋ผ๋ณด๋Š”์ง€ ์ •ํ™•ํžˆ ๋งž์ถ˜๋‹ค๋Š” ๋ฐ ์žˆ๋‹ค.

Windows์—์„œ๋„ ๊ฐ€๋Šฅํ•œ๊ฐ€?

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด: ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ, ๊ตฌ๊ฐ„๋งˆ๋‹ค ์„ค์ • ๋ฐฉ์‹์ด ๋‹ค๋ฅด๊ณ  ๊ผฌ์ด๋Š” ํฌ์ธํŠธ๋„ ๋‹ค๋ฅด๋‹ค.

๊ตฌ๊ฐ„๋ณ„ Windows ๊ฐ€๋Šฅ ์—ฌ๋ถ€

  • Claude Code ๋‹จ๋… + GLM-5 ์ง๊ฒฐ: ๊ฐ€๋Šฅํ•˜๋‹ค. npm i -g @anthropic-ai/claude-code ํ›„ PowerShell์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค. CCR ์—†์ด ์ด ์กฐํ•ฉ๋งŒ ์“ฐ๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๋‹ค.
  • CCR ์„ค์น˜/์‹คํ–‰: ๊ฐ€๋Šฅํ•˜๋‹ค. npm ์ „์—ญ ์„ค์น˜ ํ›„ ccr start๊นŒ์ง€๋Š” ๊ฐ™๋‹ค. ๋‹ค๋งŒ ์…ธ ํ™œ์„ฑํ™” ๋ช…๋ น ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค(eval "$(ccr activate)"๋Š” bash ์ „์šฉ์ด๋ผ PowerShell/Cmd์—์„œ๋Š” ์ง์ ‘ ์“ธ ์ˆ˜ ์—†๋‹ค).
  • OpenClaw + CCR + acpx ์ „์ฒด ์กฐํ•ฉ: ๊ฐ€๋Šฅํ•˜์ง€๋งŒ wrapper๋ฅผ .sh ๋Œ€์‹  .cmd ๋˜๋Š” .ps1๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ , acpx ๊ฒฝ๋กœ๋„ Windows npm ์ „์—ญ ๊ฒฝ๋กœ ์Šคํƒ€์ผ๋กœ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.
  • WSL2 ๊ฒฝ์œ : ์ „์ฒด ์กฐํ•ฉ์—์„œ ๊ฐ€์žฅ ๋œ ๊ผฌ์ธ๋‹ค. Linux ๊ฒฝ๋กœ ๊ทธ๋Œ€๋กœ ์จ๋„ ๋˜๊ณ , eval "$(ccr activate)" ๊ฐ™์€ bash ๋ฌธ๋ฒ•๋„ ๊ทธ๋ƒฅ ์“ด๋‹ค. Windows ๋„ค์ดํ‹ฐ๋ธŒ ํŒŒ์ผ๊ณผ WSL2 ํŒŒ์ผ ๊ฒฝ๊ณ„๋งŒ ์ฃผ์˜ํ•˜๋ฉด ๋œ๋‹ค.

Windows์—์„œ ccr activate๋ฅผ ์“ฐ๋Š” ๋ฐฉ๋ฒ•

bash์˜ eval "$(ccr activate)"์— ํ•ด๋‹นํ•˜๋Š” PowerShell ๋ฐฉ์‹์€ ์•„๋ž˜์ฒ˜๋Ÿผ ๋œ๋‹ค.

# PowerShell์—์„œ CCR์ด ๋‚ด๋ณด๋‚ด๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:3456"
$env:ANTHROPIC_AUTH_TOKEN = "ccr-local-token"
$env:NO_PROXY = "127.0.0.1"

๋˜๋Š” ccr activate๊ฐ€ ์ถœ๋ ฅํ•˜๋Š” ๋‚ด์šฉ์„ ํ™•์ธํ•ด์„œ ๊ทธ์— ๋งž๋Š” PowerShell ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด๋„ ๋œ๋‹ค.

# ํ˜„์žฌ PowerShell ์„ธ์…˜์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ
Get-ChildItem Env: | Where-Object { $_.Name -like "ANTHROPIC_*" }

Cmd(๋ช…๋ น ํ”„๋กฌํ”„ํŠธ)์—์„œ ์„ค์ •ํ•˜๋ ค๋ฉด:

set ANTHROPIC_BASE_URL=http://127.0.0.1:3456
set ANTHROPIC_AUTH_TOKEN=ccr-local-token
set NO_PROXY=127.0.0.1

๋‹จ, set์œผ๋กœ ์„ค์ •ํ•œ ๊ฐ’์€ ํ•ด๋‹น Cmd ์ฐฝ์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค. ์‹œ์Šคํ…œ ์ „์—ญ์œผ๋กœ ๊ณ ์ •ํ•˜๋ ค๋ฉด setx๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์—์„œ ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

setx ANTHROPIC_BASE_URL "http://127.0.0.1:3456"

์ฃผ์˜: setx๋Š” ํ˜„์žฌ ์ฐฝ์—๋Š” ์ฆ‰์‹œ ๋ฐ˜์˜์ด ์•ˆ ๋œ๋‹ค. ์ƒˆ ์ฐฝ์—์„œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

Git Bash vs PowerShell vs WSL2 ๋น„๊ต

  • Git Bash: bash ๋ฌธ๋ฒ•(eval, export, chmod +x)์ด ๊ทธ๋Œ€๋กœ ํ†ตํ•œ๋‹ค. ๋‹จ, npm ์ „์—ญ ๊ฒฝ๋กœ๊ฐ€ Windows ์Šคํƒ€์ผ(C:/Users/...)์ด์–ด์„œ acpx ๊ฒฝ๋กœ๋ฅผ ๊ฑฐ๊ธฐ์— ๋งž๊ฒŒ ์จ์•ผ ํ•œ๋‹ค. which acpx๋‚˜ where acpx๋กœ ๋จผ์ € ์œ„์น˜๋ฅผ ์žก๋Š”๋‹ค.
  • PowerShell: ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์ด $env: ๋ฌธ๋ฒ•์ด๊ณ , eval์ด ์—†๋‹ค. wrapper๋Š” .ps1๋กœ ๋งŒ๋“œ๋Š” ๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค. ์‹คํ–‰ ์ •์ฑ…(ExecutionPolicy) ๋ฌธ์ œ๋กœ .ps1์ด ๋ง‰ํžˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋‹ˆ, ํ•„์š”ํ•˜๋ฉด Set-ExecutionPolicy RemoteSigned -Scope CurrentUser๋กœ ๋ฏธ๋ฆฌ ํ’€์–ด ๋‘”๋‹ค.
  • Cmd: set/setx๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์“ฐ๊ณ , wrapper๋Š” .cmd๋‚˜ .bat๋กœ ๋งŒ๋“ ๋‹ค. bash ๋ฌธ๋ฒ•์€ ์ „ํ˜€ ํ†ตํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • WSL2: Linux ํ™˜๊ฒฝ ๊ทธ๋Œ€๋กœ๋ผ bash ๋ฌธ๋ฒ•, .sh wrapper, chmod +x ๋ชจ๋‘ ๊ทธ๋ƒฅ ๋œ๋‹ค. Windows ๋„ค์ดํ‹ฐ๋ธŒ ํŒŒ์ผ์— ์ ‘๊ทผํ•  ๋•Œ /mnt/c/... ๊ฒฝ๋กœ๋ฅผ ์จ์•ผ ํ•˜๋Š” ์ ๋งŒ ์ฃผ์˜ํ•œ๋‹ค.

์ด ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜๋ฉด ๋œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค

CCR์€ Claude Code ์•ž์— ๋†“์ด๋Š” ์ž‘์€ ๋ผ์šฐํ„ฐ๋‹ค. Claude Code๋Š” ์›๋ž˜ Anthropic ์ชฝ์œผ๋กœ ๋ฐ”๋กœ ๊ฐ€๋ ค๋Š” CLI์ธ๋ฐ, CCR์„ ์ผœ๊ณ  local endpoint๋ฅผ ์ฃผ์ž…ํ•˜๋ฉด ๋จผ์ € ๋กœ์ปฌ 127.0.0.1:3456์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๋‹ค์Œ CCR์ด ์‹ค์ œ provider(OpenRouter, DeepSeek, Gemini, Ollama, GLM ๋“ฑ)๋กœ ๋‹ค์‹œ ๋ณด๋‚ด ์ค€๋‹ค.

์ฆ‰ ์—ญํ• ์€ ์ด๋ ‡๊ฒŒ ๋‚˜๋‰œ๋‹ค.

  • Claude Code: ์‹ค์ œ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ CLI
  • CCR: ์–ด๋–ค ๋ชจ๋ธ/์ œ๊ณต์ž๋กœ ๋ณด๋‚ผ์ง€ ๊ณ ๋ฅด๋Š” ๋ผ์šฐํ„ฐ
  • OpenClaw: ์ฑ„๋„, ์„ธ์…˜, ACP ํ•˜๋‹ˆ์Šค ์‹คํ–‰์„ ๊ด€๋ฆฌํ•˜๋Š” ์ƒ์œ„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ
  • Hook: Claude Code ํˆด ์‹คํ–‰ ์ „ํ›„๋ฅผ ๊ฐ์‹œํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•˜๋Š” ์„ ํƒํ˜• ๋ณด์•ˆ ๋ ˆ์ด์–ด

์ด ์ˆœ์„œ๋ฅผ ๋†“์น˜๋ฉด hook์„ ์ž˜ ๋‹ฌ์•„๋„, ์ •์ž‘ ์š”์ฒญ์€ CCR์„ ์•ˆ ํƒ€๊ณ  ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋กœ ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

1) ์‚ฌ์ „ ์ค€๋น„: Node / npm๋ถ€ํ„ฐ ํ™•์ธํ•œ๋‹ค

์ด ๊ฒฝ๋กœ๋Š” openclaw, ccr, claude, acpx๊ฐ€ ๋‹ค CLI ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ ๋จผ์ € ๋Ÿฐํƒ€์ž„๋ถ€ํ„ฐ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.

Linux/macOS/Git Bash/WSL2:

node -v
npm -v

PowerShell/Cmd์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ์‹ค๋ฌด ๊ธฐ์ค€์œผ๋กœ๋Š” Node 20+ ๋ฅผ ๋จผ์ € ๋งž์ถฐ ๋‘๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค.

2) ํ•„์ˆ˜ ์„ค์น˜

์ด๋ฒˆ ํ๋ฆ„์—์„œ๋Š” ์•„๋ž˜ 3๊ฐœ๊ฐ€ ํ•œ ์„ธํŠธ๋‹ค.

npm i -g openclaw @musistudio/claude-code-router @anthropic-ai/claude-code

PowerShell/Cmd์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์“ด๋‹ค. ๋‹จ, Windows์—์„œ npm ์ „์—ญ ์„ค์น˜ ์‹œ ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ํ„ฐ๋ฏธ๋„์„ ์—ด์–ด์„œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, npm config get prefix๋กœ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•œ ๋’ค ํ•ด๋‹น ๊ฒฝ๋กœ๊ฐ€ PATH์— ์žกํ˜€ ์žˆ๋Š”์ง€ ๋ณธ๋‹ค.

์„ค์น˜ ํ™•์ธ:

openclaw --version
ccr --help
claude --version

์—ฌ๊ธฐ์„œ ํ•˜๋‚˜๋ผ๋„ ์•ˆ ์žกํžˆ๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ํŽธ์ด ๋‚ซ๋‹ค.

Windows์—์„œ ๋ช…๋ น์ด ์•ˆ ์žกํž ๊ฒฝ์šฐ ์ฒดํฌํฌ์ธํŠธ:

  • npm config get prefix๋กœ ์ „์—ญ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋ณดํ†ต C:\Users\<user>\AppData\Roaming\npm์ด๋‹ค.
  • ์ด ๊ฒฝ๋กœ๊ฐ€ ์‹œ์Šคํ…œ PATH์— ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค (PowerShell: $env:PATH -split ';').
  • ์—†์œผ๋ฉด ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ํ’€ํŒจ์Šค๋กœ ์จ์„œ ์‹คํ–‰ํ•œ๋‹ค.

์ฐธ๊ณ : Claude ๊ณต์‹ ๋ฌธ์„œ๋Š” native install๋„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, ์ด๋ฒˆ OpenClaw + ACPX + CCR + GLM ๋ผ์šฐํŒ… ํ๋ฆ„์€ npm ์ „์—ญ ์„ค์น˜ ๊ธฐ์ค€์œผ๋กœ ๋งž์ถฐ ๋‘๋ฉด wrapper/acpx ๊ฒฝ๋กœ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ๊ฐ€ ๋” ๋‹จ์ˆœํ•˜๋‹ค. ์ค‘์š”ํ•œ ๊ฑด ์„ค์น˜ ๋ฐฉ์‹ ํ•˜๋‚˜๋ฅผ ์ •ํ•˜๋ฉด ๋๊นŒ์ง€ ์ผ๊ด€๋˜๊ฒŒ ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

3) config.json์—์„œ GLM provider endpoint๋ฅผ ์„ค์ •ํ•œ๋‹ค

CCR์˜ ํ•ต์‹ฌ ํŒŒ์ผ์€ ๋ณดํ†ต ์•„๋ž˜ ๊ฒฝ๋กœ๋‹ค.

Linux/macOS/WSL2:

~/.claude-code-router/config.json

Windows ๋„ค์ดํ‹ฐ๋ธŒ:

C:\Users\<user>\.claude-code-router\config.json

์ด๋ฒˆ ๊ธ€์˜ ๊ธฐ์ค€ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” CCR์ด GLM API๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ํ•ต์‹ฌ๋งŒ ๋‘๊ณ  ์‹œ์ž‘ํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

{
  "Providers": [
    {
      "name": "zhipu",
      "api_base_url": "https://api.z.ai/api/coding/paas/v4/chat/completions",
      "api_key": "YOUR_ZHIPU_API_KEY",
      "models": ["glm-4-plus", "glm-4-air", "glm-4-flash", "glm-5"]
    }
  ],
  "Router": {
    "default": "zhipu,glm-5",
    "background": "zhipu,glm-4-flash",
    "think": "zhipu,glm-5"
  }
}

ํฌ์ธํŠธ๋Š” ๋‘ ๊ฐ€์ง€๋‹ค.

  • ๊ธ€๋กœ๋ฒŒ ๊ธฐ์ค€์œผ๋กœ๋Š” api.z.ai endpoint๋ฅผ ์“ด๋‹ค.
  • API ํ‚ค๋Š” ์ ˆ๋Œ€ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๋Š”๋‹ค.

GLM-5 ํ”Œ๋žœ ์ œ์•ฝ ์‚ฌํ•ญ

GLM-5 ๋ชจ๋ธ์€ **Z.AI์˜ ์œ ๋ฃŒ ํ”Œ๋žœ(Max ์ด์ƒ)**์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. config.json์— "glm-5"๋ฅผ ๋„ฃ์–ด๋„ ํ”Œ๋žœ์ด ๋งž์ง€ ์•Š์œผ๋ฉด API ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. ๋ฌด๋ฃŒ/๊ธฐ๋ณธ ํ”Œ๋žœ์—์„œ๋Š” glm-4-flash ๋˜๋Š” glm-4-air๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธํ•ด์„œ ์—ฐ๊ฒฐ๋ถ€ํ„ฐ ํ™•์ธํ•˜๋Š” ๊ฒŒ ๋‚ซ๋‹ค. CCR settings.json์—์„œ Router.default๋ฅผ ํ”Œ๋žœ์— ๋งž๋Š” ๋ชจ๋ธ๋กœ ๋จผ์ € ์„ค์ •ํ•ด ๋‘๊ณ , ํ”Œ๋žœ์„ ์˜ฌ๋ฆฐ ๋’ค glm-5๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ผญ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•  ๊ฒŒ ์„ธ ๊ฐ€์ง€๋‹ค.

api_base_url

์ด๊ฑด CCR์ด ๋ฐ”๊นฅ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์‹ค์ œ provider endpoint๋‹ค.

์ด๋ฒˆ GLM ๋ผ์šฐํŒ… ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋ณดํ†ต ์•„๋ž˜์ฒ˜๋Ÿผ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

  • Z.ai / GLM โ†’ https://api.z.ai/api/coding/paas/v4/chat/completions
  • OpenRouter โ†’ https://openrouter.ai/api/v1/chat/completions
  • DeepSeek โ†’ https://api.deepseek.com/chat/completions
  • Ollama โ†’ http://localhost:11434/v1/chat/completions

์ฆ‰, ์ด ๊ฐ’์€ ๋กœ์ปฌ CCR ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค. provider ์ฃผ์†Œ๋‹ค.

transformer

provider๋งˆ๋‹ค ์š”์ฒญ/์‘๋‹ต ํ˜•ํƒœ๊ฐ€ ๋‹ฌ๋ผ์„œ, CCR์€ transformer๋กœ ํฌ๋งท์„ ๋งž์ถ˜๋‹ค. OpenRouter๋ฉด openrouter, DeepSeek๋ฉด deepseek, Gemini๋ฉด gemini ๊ฐ™์€ ์‹์ด๋‹ค.

Router

์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ ๋ชจ๋ธ๊ณผ ์ƒํ™ฉ๋ณ„ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์ •ํ•œ๋‹ค.

  • default: ์ผ๋ฐ˜ ์ž‘์—…
  • think: ๋” ์ƒ๊ฐ ๋งŽ์ด ์“ฐ๋Š” ์ž‘์—…
  • longContext: ๊ธด ๋ฌธ๋งฅ ์ž‘์—…
  • webSearch: ๊ฒ€์ƒ‰ํ˜• ์ž‘์—…

์ฒ˜์Œ์—๋Š” default ํ•˜๋‚˜๋งŒ ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ทธ๋‹ค์Œ์— think๋‚˜ longContext๋ฅผ ์–น๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๋‹ค.

4) local endpoint๋ฅผ Claude์— ์ฃผ์ž…ํ•ด์•ผ ๋น„๋กœ์†Œ CCR์„ ํƒ„๋‹ค

์—ฌ๊ธฐ๊ฐ€ ์‹ค์ „์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋น ์ง€๋Š” ๋ถ€๋ถ„์ด๋‹ค.

CCR ์„ค์ • ํŒŒ์ผ๋งŒ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  Claude๊ฐ€ ์ž๋™์œผ๋กœ CCR์„ ํƒ€๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. Claude CLI๊ฐ€ Anthropic ๊ธฐ๋ณธ ๊ฒฝ๋กœ ๋Œ€์‹  ๋กœ์ปฌ CCR endpoint๋ฅผ ๋ณด๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๋จผ์ € ๋ผ์šฐํ„ฐ๋ฅผ ์ผ ๋‹ค (๋ชจ๋“  ํ™˜๊ฒฝ ๊ณตํ†ต).

ccr start
ccr status

์—ฌ๊ธฐ์„œ Status: Running์ด ๋ณด์—ฌ์•ผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๋‹ค.

Linux/macOS/WSL2/Git Bash

eval "$(ccr activate)"
env | grep '^ANTHROPIC_'

Windows PowerShell

eval ๋ฌธ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์„ค์ •ํ•œ๋‹ค.

$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:3456"
$env:ANTHROPIC_AUTH_TOKEN = "ccr-local-token"
$env:NO_PROXY = "127.0.0.1"
 
# ํ™•์ธ
Get-ChildItem Env: | Where-Object { $_.Name -like "ANTHROPIC_*" }

๋˜๋Š” ccr activate๊ฐ€ ์–ด๋–ค ์ถœ๋ ฅ์„ ๋‚ด๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•ด์„œ ๋งž๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

ccr activate

Windows Cmd

set ANTHROPIC_BASE_URL=http://127.0.0.1:3456
set ANTHROPIC_AUTH_TOKEN=ccr-local-token
set NO_PROXY=127.0.0.1
 
rem ํ™•์ธ
set ANTHROPIC

๊ณตํ†ต

์ฃผ์ž…์ด ์ž˜ ๋๋‹ค๋ฉด Claude Code๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜:

claude

๋˜๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ CCR์„ ํ†ตํ•œ ์ง์ ‘ ์‹คํ–‰๋„ ๋œ๋‹ค.

ccr code

์ด๊ฑด CCR์„ ํ†ตํ•˜๋Š” Claude Code ์‹คํ–‰ ๊ฒฝ๋กœ๋ผ, ํ„ฐ๋ฏธ๋„ ๋‹จ๋… ์‚ฌ์šฉ์ด๋ผ๋ฉด ๊ฐ€์žฅ ๋œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค.

5) OpenClaw์—์„œ๋Š” acpx๋ฅผ CCR wrapper๋กœ ๊ฐ์‹ธ๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค

OpenClaw๋Š” ACP ์„ธ์…˜์œผ๋กœ Claude Code ๊ฐ™์€ ์™ธ๋ถ€ ํ•˜๋‹ˆ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฑด OpenClaw๊ฐ€ CCR์— ์ง์ ‘ ๋ถ™๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, OpenClaw๊ฐ€ ๋„์šฐ๋Š” acpx ํ”„๋กœ์„ธ์Šค๊ฐ€ CCR์ด ํ™œ์„ฑํ™”๋œ ์…ธ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰ ์•„๋ž˜ ๋‘ ๊ฒฝ์šฐ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค.

  • acpx๋ฅผ ๊ทธ๋ƒฅ ์‹คํ–‰ โ†’ Claude๊ฐ€ CCR์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Œ
  • CCR ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์ฃผ์ž…ํ•œ wrapper๋ฅผ ํ†ตํ•ด acpx ์‹คํ–‰ โ†’ Claude๊ฐ€ CCR ๊ฒฝ์œ 

OpenClaw ์ชฝ ์„ค์ • ์˜ˆ์‹œ

๋ณดํ†ต ~/.openclaw/openclaw.json์—์„œ ์•„๋ž˜ ๊ฐœ๋…์ด ์‚ด์•„ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

  • "acp.enabled": true
  • "acp.backend": "acpx"
  • "plugins.entries.acpx.enabled": true
  • "plugins.entries.acpx.config.command": "wrapper ๊ฒฝ๋กœ"

์˜ˆ์‹œ ๊ตฌ์กฐ:

{
  "acp": {
    "enabled": true,
    "backend": "acpx"
  },
  "plugins": {
    "entries": {
      "acpx": {
        "enabled": true,
        "config": {
          "command": "./acpx-ccr.sh"  // Linux/macOS/WSL2
          // Windows: "C:\\Users\\<user>\\.openclaw\\workspace\\acpx-ccr.cmd"
        }
      }
    }
  }
}

Linux/macOS/WSL2: acpx-ccr.sh

๊ฒฝ๋กœ ์˜ˆ์‹œ:

~/.openclaw/workspace/acpx-ccr.sh

์Šคํฌ๋ฆฝํŠธ:

#!/bin/sh
if command -v ccr >/dev/null 2>&1; then
  eval "$(ccr activate)"
fi
exec /path/to/acpx "$@"

acpx ๊ฒฝ๋กœ ํ™•์ธ:

which acpx
# ๋˜๋Š” npm ์ „์—ญ ๊ฒฝ๋กœ๋กœ: $(npm root -g)/.bin/acpx

์‹คํ–‰ ๊ถŒํ•œ:

chmod +x ~/.openclaw/workspace/acpx-ccr.sh

Windows: acpx-ccr.cmd

Windows Cmd ๊ธฐ๋ฐ˜ wrapper:

@echo off
set ANTHROPIC_BASE_URL=http://127.0.0.1:3456
set ANTHROPIC_AUTH_TOKEN=ccr-local-token
set NO_PROXY=127.0.0.1
 
rem acpx ๊ฒฝ๋กœ๋Š” npm global prefix ํ™•์ธ ํ›„ ๋งž๊ฒŒ ์ˆ˜์ •
"%APPDATA%\npm\acpx.cmd" %*

acpx ๊ฒฝ๋กœ ํ™•์ธ (Cmd/PowerShell):

where acpx
(npm root -g) + "\..\.bin\acpx"
# ๋˜๋Š”
Get-Command acpx | Select-Object -ExpandProperty Source

Windows: acpx-ccr.ps1

PowerShell ๊ธฐ๋ฐ˜ wrapper (๋” ์œ ์—ฐํ•˜๊ฒŒ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค):

# acpx-ccr.ps1
$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:3456"
$env:ANTHROPIC_AUTH_TOKEN = "ccr-local-token"
$env:NO_PROXY = "127.0.0.1"
 
$acpxPath = (Get-Command acpx -ErrorAction SilentlyContinue).Source
if (-not $acpxPath) {
    $acpxPath = "$env:APPDATA\npm\acpx.cmd"
}
 
& $acpxPath @args

openclaw.json์—์„œ .ps1์„ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ๋Š” PowerShell๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

"command": "powershell -ExecutionPolicy Bypass -File C:\\Users\\<user>\\.openclaw\\workspace\\acpx-ccr.ps1"

wrapper์˜ ์—ญํ•  ์š”์•ฝ

  1. CCR ํ™˜๊ฒฝ๋ณ€์ˆ˜(ANTHROPIC_BASE_URL ๋“ฑ)๋ฅผ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์— ์ฃผ์ž…ํ•œ๋‹ค.
  2. ๊ทธ ์ƒํƒœ๋กœ ์‹ค์ œ acpx๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  3. ๊ฒฐ๊ณผ์ ์œผ๋กœ OpenClaw๊ฐ€ ๋„์šด Claude ํ•˜๋‹ˆ์Šค๋„ CCR์„ ํƒ€๊ฒŒ ๋œ๋‹ค.

OpenClaw ๋‚ด๋ถ€๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , acpx ์‹คํ–‰ ์ง์ „ ํ•œ ๋ฒˆ๋งŒ CCR ํ™˜๊ฒฝ์„ ์ฃผ์ž…ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ ์—์„œ ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ๋œ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ฐฉ์‹์ด๋‹ค.

6) endpoint ์„ค์ •๊ณผ OpenClaw ์—ฐ๊ฒฐ์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋‚˜๋Š” ์‹ค์ˆ˜

์‹ค์ˆ˜ 1) api_base_url๊ณผ ANTHROPIC_BASE_URL์„ ๊ฐ™์€ ์˜๋ฏธ๋กœ ๋ณธ๋‹ค

์ด ๋‘˜์€ ์™„์ „ํžˆ ๋‹ค๋ฅด๋‹ค.

  • api_base_url: CCR โ†’ provider ๋กœ ๊ฐ€๋Š” ์ฃผ์†Œ
  • ANTHROPIC_BASE_URL: Claude โ†’ CCR ๋กœ ๊ฐ€๋Š” ์ฃผ์†Œ

์ด๊ฑธ ๋’ค์ง‘์œผ๋ฉด ๋ผ์šฐํ„ฐ๋Š” ์„ค์น˜๋ผ ์žˆ๋Š”๋ฐ ์‹ค์ œ๋กœ ์•ˆ ํƒ„๋‹ค.

์‹ค์ˆ˜ 2) config.json ์ˆ˜์ • ํ›„ ccr restart๋ฅผ ์•ˆ ํ•œ๋‹ค

README๋„ ์ด ์ ์„ ๋”ฐ๋กœ ์ ๊ณ  ์žˆ๋‹ค. ์„ค์ •์„ ๋ฐ”๊ฟจ์œผ๋ฉด ์žฌ์‹œ์ž‘ํ•ด์•ผ ๋ฐ˜์˜๋œ๋‹ค.

ccr restart

์‹ค์ˆ˜ 3) ccr activate๋Š” ํ–ˆ๋Š”๋ฐ OpenClaw๊ฐ€ ๋‹ค๋ฅธ ์…ธ/๋‹ค๋ฅธ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ Claude๋ฅผ ๋„์šด๋‹ค

ํ„ฐ๋ฏธ๋„์—์„œ๋Š” ์ž˜ ๋˜๋Š”๋ฐ OpenClaw ACP ์„ธ์…˜์—์„œ๋Š” ์•ˆ ๋˜๋Š” ๋Œ€ํ‘œ ์›์ธ์ด๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ OpenClaw๊ฐ€ ์‹คํ–‰ํ•œ Claude ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ทธ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋ชป ๋ณด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Windows์—์„œ๋Š” ํŠนํžˆ ๊ฐ ํ„ฐ๋ฏธ๋„ ์ฐฝ๋งˆ๋‹ค ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ๋ณ„๋„๋กœ ์œ ์ง€๋˜๋ฏ€๋กœ, wrapper์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ํ™•์‹คํ•˜๋‹ค.

์‹ค์ˆ˜ 4) Windows์—์„œ .ps1 wrapper๊ฐ€ ์‹คํ–‰ ์ •์ฑ… ์˜ค๋ฅ˜๋กœ ๋ง‰ํžŒ๋‹ค

์‹คํ–‰ ์ •์ฑ…์ด ์ด ์‹œ์Šคํ…œ์—์„œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

๋˜๋Š” openclaw.json์—์„œ -ExecutionPolicy Bypass ํ”Œ๋ž˜๊ทธ๋ฅผ ํฌํ•จํ•œ ๋ช…๋ น์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.

์‹ค์ˆ˜ 5) HOST=0.0.0.0๋งŒ ์—ด๊ณ  APIKEY๋ฅผ ์•ˆ ๊ฑด๋‹ค

CCR README๋Š” APIKEY๊ฐ€ ์—†์œผ๋ฉด ๋ณด์•ˆ์ƒ host๋ฅผ ๋กœ์ปฌ๋กœ ๊ฐ•์ œํ•˜๋Š” ์ชฝ์„ ์„ค๋ช…ํ•œ๋‹ค. ๋กœ์ปฌ ๋‹จ๋… ์‚ฌ์šฉ์ด๋ฉด ๊ตณ์ด ์™ธ๋ถ€ ๊ฐœ๋ฐฉ์„ ์—ด ์ด์œ ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค.

์‹ค์ˆ˜ 6) Windows์—์„œ acpx ๊ฒฝ๋กœ์— ๊ณต๋ฐฑ์ด ์žˆ๋‹ค

C:\Users\Kim Min Joon\AppData\... ๊ฐ™์€ ๊ฒฝ๋กœ๋Š” .cmd wrapper์—์„œ ๋ฐ˜๋“œ์‹œ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.

"%APPDATA%\npm\acpx.cmd" %*

์‹ค์ˆ˜ 7) provider endpoint๋ฅผ ์ž˜๋ชป ๋„ฃ์–ด ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ณต๊ธ‰์ž๋กœ ๋น ์ง„๋‹ค

GLM ๊ธ€๋กœ๋ฒŒ ๊ธฐ์ค€์ด๋ผ๋ฉด api.z.ai๋ฅผ ์“ฐ๊ณ  ์žˆ๋Š”์ง€๋ถ€ํ„ฐ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๊ฒŒ ๋น ๋ฅด๋‹ค.

7) OpenClaw ์ƒํƒœ ํ™•์ธ + ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ํ•œ ๋ฒˆ์— ๋ณธ๋‹ค

์„ค์น˜๊ฐ€ ๋๋‚ฌ์œผ๋ฉด ์•„๋ž˜ ์ˆœ์„œ๋กœ ์ ๊ฒ€ํ•˜๋Š” ํŽธ์ด ์ œ์ผ ์•ˆ์ „ํ•˜๋‹ค.

์ ๊ฒ€ 1) Claude ์„ค์น˜ ํ™•์ธ

Linux/macOS/WSL2/Git Bash:

claude --version
which claude

Windows PowerShell:

claude --version
Get-Command claude | Select-Object -ExpandProperty Source

์ ๊ฒ€ 2) CCR ์„ค์น˜์™€ ์ƒํƒœ ํ™•์ธ

ccr --help
ccr status

ํ•„์š”ํ•˜๋ฉด ๋จผ์ €:

ccr start

์ ๊ฒ€ 3) OpenClaw ์ƒํƒœ ํ™•์ธ

openclaw status

์—ฌ๊ธฐ์„œ๋Š” ์ตœ์†Œํ•œ OpenClaw๊ฐ€ ์‚ด์•„ ์žˆ๊ณ , ACP ๊ด€๋ จ ํ”Œ๋Ÿฌ๊ทธ์ธ/๋Ÿฐํƒ€์ž„์ด ์ด์ƒ ์—†์ด ๋œจ๋Š”์ง€ ๋ณธ๋‹ค.

์ ๊ฒ€ 4) local endpoint ์ฃผ์ž… ํ™•์ธ

Linux/macOS/WSL2/Git Bash:

eval "$(ccr activate)"
env | grep '^ANTHROPIC_'

Windows PowerShell:

$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:3456"
Get-ChildItem Env: | Where-Object { $_.Name -like "ANTHROPIC_*" }

์ ๊ฒ€ 5) wrapper ์Šคํฌ๋ฆฝํŠธ ๋‹จ๋… ์‹คํ–‰ ํ™•์ธ

OpenClaw๋ฅผ ํ†ตํ•˜๊ธฐ ์ „์— wrapper ์ž์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ณด๋Š” ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ๋‹ค.

Linux/macOS/WSL2:

cd ~/.openclaw/workspace
./acpx-ccr.sh claude exec "Respond exactly with PONG"

Windows PowerShell:

cd C:\Users\<user>\.openclaw\workspace
powershell -ExecutionPolicy Bypass -File acpx-ccr.ps1 claude exec "Respond exactly with PONG"

Windows Cmd:

cd C:\Users\<user>\.openclaw\workspace
acpx-ccr.cmd claude exec "Respond exactly with PONG"

์ •์ƒ์ด๋ผ๋ฉด ์‘๋‹ต์ด ์•„๋ž˜์ฒ˜๋Ÿผ ๋–จ์–ด์ ธ์•ผ ํ•œ๋‹ค.

PONG

์ด ํ…Œ์ŠคํŠธ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋‹จ์ˆœํ•˜๋‹ค. OpenClaw ์ „์ฒด๋ฅผ ์˜์‹ฌํ•˜๊ธฐ ์ „์—, wrapper + CCR + acpx + Claude ์—ฐ๊ฒฐ์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋จผ์ € ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ ๊ฒ€ 6) ๋กœ๊ทธ ํ™•์ธ

Linux/macOS/WSL2:

tail -f ~/.claude-code-router/claude-code-router.log

Windows PowerShell:

Get-Content "$env:USERPROFILE\.claude-code-router\claude-code-router.log" -Wait -Tail 50

8) ์ž์ฃผ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

๋ฌธ์ œ 1) CCR Not Running

  • ์ฆ์ƒ: wrapper๋Š” ์‹คํ–‰๋˜๋Š”๋ฐ ์‹ค์ œ ๋ผ์šฐํŒ…์ด ์•ˆ ๋œ๋‹ค.
  • ์กฐ์น˜: ccr start ํ›„ ์žฌ์‹œ๋„ํ•œ๋‹ค.

๋ฌธ์ œ 2) ์ค‘๊ตญ endpoint๋กœ ๊ฐ„๋‹ค

  • ์ฆ์ƒ: ๋‚ด๊ฐ€ ๊ธฐ๋Œ€ํ•œ ๊ธ€๋กœ๋ฒŒ GLM ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ endpoint๋กœ ๋น ์ง„๋‹ค.
  • ์กฐ์น˜: ~/.claude-code-router/config.json์˜ api_base_url์„ ๋‹ค์‹œ ํ™•์ธํ•œ๋‹ค. ๊ธ€๋กœ๋ฒŒ ๊ธฐ์ค€์ด๋ฉด api.z.ai์—ฌ์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ 3) ๊ถŒํ•œ/์“ฐ๊ธฐ ๊ฑฐ๋ถ€๊ฐ€ ๋‚œ๋‹ค

  • ์ฆ์ƒ: Claude ๋˜๋Š” acpx ์‹คํ–‰์€ ๋˜๋Š”๋ฐ ์ž‘์—… ์Šน์ธ์ด ๋ง‰ํžŒ๋‹ค.
  • ์กฐ์น˜: acpx ์‹คํ–‰ ์ •์ฑ…์ด๋‚˜ ์Šน์ธ ์˜ต์…˜์„ ๋‹ค์‹œ ํ™•์ธํ•œ๋‹ค. ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์Šน์ธ ์ •์ฑ…(--approve-all ๋“ฑ)์„ ์–ด๋–ป๊ฒŒ ๋‘˜์ง€ ๊ฐ™์ด ๋ด์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ 4) ์„ค์ •์„ ๋ฐ”๊ฟจ๋Š”๋ฐ ๋ฐ˜์˜์ด ์•ˆ ๋œ๋‹ค

  • ์ฆ์ƒ: config.json์„ ๋ฐ”๊ฟจ๋Š”๋ฐ ๊ณ„์† ์ด์ „ ๋ชจ๋ธ/endpoint๋ฅผ ์“ด๋‹ค.
  • ์กฐ์น˜: ์•„๋ž˜์ฒ˜๋Ÿผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
ccr restart

ํ•„์š”ํ•˜๋ฉด ๋” ํ™•์‹คํ•˜๊ฒŒ:

ccr stop && ccr start

๋ฌธ์ œ 5) Windows์—์„œ npm ์ „์—ญ ๋ช…๋ น์ด ์•ˆ ์žกํžŒ๋‹ค

  • ์ฆ์ƒ: ccr๋‚˜ claude๋ฅผ ์ณ๋„ โ€œ๋ช…๋ น์„ ์ฐพ์„ ์ˆ˜ ์—†์Œโ€ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.
  • ์กฐ์น˜: npm config get prefix๋กœ ๊ฒฝ๋กœ ํ™•์ธ ํ›„ ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ PATH์— ์ถ”๊ฐ€ํ•œ๋‹ค.
$npmPrefix = npm config get prefix
$env:PATH += ";$npmPrefix"

ํ˜„์žฅ ๋ฏธ๋‹ˆ ์‚ฌ๋ก€ 2๊ฐœ

์‚ฌ๋ก€ A) CCR์€ ์„ค์น˜ํ–ˆ๋Š”๋ฐ ์š”์ฒญ์ด ๊ณ„์† ๊ธฐ๋ณธ Claude์ฒ˜๋Ÿผ ๋ณด์ด๋˜ ๊ฒฝ์šฐ

  • ์ƒํ™ฉ: config.json์€ ์ž˜ ์จ ๋†จ๋Š”๋ฐ ๋ชจ๋ธ ๋ผ์šฐํŒ…์ด ์•ˆ ๋ฐ”๋€Œ์—ˆ๋‹ค.
  • ์›์ธ: ccr activate๋ฅผ ํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ํ•œ ์…ธ์—์„œ๋Š” ํ–ˆ๋Š”๋ฐ ์‹ค์ œ ์‹คํ–‰์€ ๋‹ค๋ฅธ ์…ธ/์„œ๋น„์Šค์—์„œ ์ด๋ค„์กŒ๋‹ค.
  • ํ•ด๊ฒฐ: env | grep '^ANTHROPIC_'(๋˜๋Š” PowerShell์—์„œ Get-ChildItem Env: | Where-Object { $_.Name -like "ANTHROPIC_*" })๋กœ ํ˜„์žฌ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋จผ์ € ํ™•์ธํ•˜๊ณ , OpenClaw ์ชฝ์€ wrapper ๊ฒฝ๋กœ๋กœ ํ†ต์ผํ–ˆ๋‹ค.

ํ•ต์‹ฌ์€ โ€œCCR ์„ค์น˜ ์—ฌ๋ถ€โ€๋ณด๋‹ค Claude ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค endpoint๋ฅผ ๋ณด๊ณ  ์‹คํ–‰๋˜๋А๋ƒ์˜€๋‹ค.

์‚ฌ๋ก€ B) hook์„ ๋จผ์ € ๋‹ฌ์•˜๋‹ค๊ฐ€ ์›์ธ ์ถ”์ ์ด ๋” ์–ด๋ ค์›Œ์ง„ ๊ฒฝ์šฐ

  • ์ƒํ™ฉ: ํˆด ์ฐจ๋‹จ์€ ๋ณด์ด๋Š”๋ฐ, ์• ์ดˆ์— ์š”์ฒญ์ด CCR์„ ํƒ”๋Š”์ง€๋ถ€ํ„ฐ ๋ถˆ๋ช…ํ™•ํ–ˆ๋‹ค.
  • ์›์ธ: ๋ผ์šฐํŒ… ๊ตฌ์กฐ๊ฐ€ ๋จผ์ € ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ hook๋ถ€ํ„ฐ ๋ถ™์˜€๋‹ค.
  • ํ•ด๊ฒฐ: hook์„ ์ž ์‹œ ๋นผ๊ณ  claude โ†’ CCR local endpoint โ†’ provider endpoint ํ๋ฆ„์ด ๋จผ์ € ์ •์ƒ์ธ์ง€ ํ™•์ธํ–ˆ๋‹ค.

๋ณด์•ˆ/๊ฐ์‹œ๋Š” ๋งˆ์ง€๋ง‰ 10%๊ณ , ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋Š” ์ฒ˜์Œ 90%๋‹ค.

9) hook์€ ๋งˆ์ง€๋ง‰์— ๋ถ™์ธ๋‹ค

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์•ˆ์ •ํ™”๋œ ๋’ค์—๋งŒ Claude Hook์„ ๋ถ™์ด๋Š” ๊ฒŒ ์ข‹๋‹ค. ์ด์œ ๋Š” ๋‹จ์ˆœํ•˜๋‹ค. hook์€ ์‹คํ–‰ ๊ฐ์‹œ/์ฐจ๋‹จ ๋ ˆ์ด์–ด์ด์ง€, ๋ผ์šฐํŒ… ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฒ˜์Œ ๋ถ™์ผ ์ด๋ฒคํŠธ๋Š” ์ด 4๊ฐœ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค.

  • PreToolUse
  • PostToolUse
  • PostToolUseFailure
  • UserPromptSubmit

๊ถŒ์žฅ ์ˆœ์„œ๋Š” ์ด๋ ‡๋‹ค.

  1. Bash๋งŒ ๋Œ€์ƒ์œผ๋กœ ๊ฐ์‹œ-only ์‹œ์ž‘
  2. JSONL ๋กœ๊ทธ๊ฐ€ ์Œ“์ด๋Š”์ง€ ํ™•์ธ
  3. ์ •์ƒ ๋ช…๋ น ์˜คํƒ์ด ์—†๋Š”์ง€ ํ™•์ธ
  4. ๊ทธ ๋’ค์—๋งŒ ์œ„ํ—˜ ๋ช…๋ น ์ฐจ๋‹จ์„ ์ถ”๊ฐ€

์ตœ์†Œ ์„ค์ •์˜ ๋А๋‚Œ์€ ์•„๋ž˜ ์ •๋„๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.openclaw/workspace/claude-hooks/pre_tool_use.py"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.openclaw/workspace/claude-hooks/post_tool_use.py"
          }
        ]
      }
    ]
  }
}

Windows์—์„œ hook ๋ช…๋ น ๊ฒฝ๋กœ๋Š” Windows ์Šคํƒ€์ผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์จ์•ผ ํ•œ๋‹ค.

"command": "python C:\\Users\\<user>\\.openclaw\\workspace\\claude-hooks\\pre_tool_use.py"

๊ถŒ์žฅ ๊ฒฝ๋กœ 2๊ฐ€์ง€

A. ์ œ์ผ ์‰ฌ์›€: Windows์—์„œ Claude Code + GLM-5 ์ง๊ฒฐ

CCR ์—†์ด Claude Code์—์„œ ์ง์ ‘ GLM endpoint๋ฅผ ๋ฐ”๋ผ๋ณด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋‹ค. OpenClaw ์—ฐ๋™์ด ์•„์ง ํ•„์š” ์—†๊ณ , GLM-5๋กœ ์ฝ”๋”ฉ๋งŒ ๋จผ์ € ์จ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๊ฒฝ๋กœ๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค.

Z.AI ๊ณต์‹ ๋ฌธ์„œ ๊ธฐ์ค€์œผ๋กœ๋Š” Claude Code ์ง๊ฒฐ ๊ฒฝ๋กœ์—์„œ ์•„๋ž˜ ๋‘ ๊ฐ’์„ ๋จผ์ € ๋งž์ถ˜๋‹ค.

# ์„ค์น˜
npm i -g @anthropic-ai/claude-code
 
# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • (PowerShell)
$env:ANTHROPIC_AUTH_TOKEN = "YOUR_ZHIPU_API_KEY"
$env:ANTHROPIC_BASE_URL = "https://api.z.ai/api/anthropic"
$env:API_TIMEOUT_MS = "3000000"
 
# ์‹คํ–‰
claude

GLM-5๋ฅผ ์“ฐ๋ ค๋ฉด ์—ฌ๊ธฐ์— ๋”ํ•ด Claude Code ์ชฝ ๋ชจ๋ธ ๋งคํ•‘์„ ๋ช…์‹œํ•ด ๋‘๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค.

{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "YOUR_ZHIPU_API_KEY",
    "ANTHROPIC_BASE_URL": "https://api.z.ai/api/anthropic",
    "API_TIMEOUT_MS": "3000000",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "glm-5",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "glm-5"
  }
}

GLM-5๋ฅผ ์“ฐ๋ ค๋ฉด Z.AI Max ์ด์ƒ ํ”Œ๋žœ์ด ํ•„์š”ํ•˜๋‹ค. ์—†์œผ๋ฉด glm-4.7์ด๋‚˜ glm-4.5-air๋กœ ๋จผ์ € ์—ฐ๊ฒฐ๋ถ€ํ„ฐ ํ™•์ธํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.

B. OpenClaw๊นŒ์ง€ ์—ฎ์Œ: WSL2 ๋˜๋Š” Windows wrapper ๊ธฐ๋ฐ˜ CCR ๊ฒฝ์œ 

์ „์ฒด ํ๋ฆ„ OpenClaw โ†’ acpx โ†’ CCR โ†’ GLM์„ ํ•œ PC์—์„œ ๋ถ™์ด๋Š” ๊ฒฝ์šฐ๋‹ค.

  • WSL2 ๊ถŒ์žฅ: bash ๋ฌธ๋ฒ•๊ณผ .sh wrapper๋ฅผ ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ์–ด ๊ฐ€์žฅ ๋œ ๊ผฌ์ธ๋‹ค. Windows ํŒŒ์ผ ์ ‘๊ทผ์ด ํ•„์š”ํ•  ๋•Œ๋งŒ /mnt/c/... ๊ฒฝ๋กœ๋ฅผ ์“ด๋‹ค.
  • Windows ๋„ค์ดํ‹ฐ๋ธŒ: CCR ccr activate ๋Œ€์‹  ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ง์ ‘ ์„ค์ • + .cmd/.ps1 wrapper ๋ฐฉ์‹์œผ๋กœ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋‚ธ๋‹ค. ๊ฒฝ๋กœ์— ๊ณต๋ฐฑ์ด ์žˆ์œผ๋ฉด ๋”ฐ์˜ดํ‘œ๋ฅผ ๊ผญ ์ฑ™๊ธด๋‹ค. PowerShell ์‹คํ–‰ ์ •์ฑ…๋„ ๋ฏธ๋ฆฌ ํ™•์ธํ•œ๋‹ค.

ํ•œ ์ค„ ๊ฒฐ๋ก 

OpenClaw + CCR์—์„œ ์ œ์ผ ๋จผ์ € ๋ณผ ๊ฒƒ์€ hook์ด ์•„๋‹ˆ๋ผ Claude CLI ์„ค์น˜, CCR ์„ค์น˜, provider endpoint ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  CCR ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ Claude ํ•˜๋‹ˆ์Šค์— ๋ฐ˜์˜๋๋Š”์ง€๋‹ค. Windows์—์„œ๋„ ์ด ํ๋ฆ„์€ ๊ทธ๋Œ€๋กœ์ด๊ณ , ๋‹ฌ๋ผ์ง€๋Š” ๊ฑด ์…ธ ํ™œ์„ฑํ™” ๋ฌธ๋ฒ•๊ณผ wrapper ํ™•์žฅ์ž๋ฟ์ด๋‹ค.

๋‹ค์Œ ์ฝ๊ธฐ

โ€ป ์ด ๋ฌธ์„œ๋Š” ์ƒ์„ฑํ˜• AI๋ฅผ ํ™œ์šฉํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.