diff --git a/README.md b/README.md index 39b0862..df3d0fb 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,34 @@ **๐Ÿ“ข ์ƒํƒœ**: ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ. ์ถ”๊ฐ€ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ถŒ์žฅ. +## ์†Œ๊ฐœ + +์„ธ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ AI ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•œ ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค: + +- Claude Code - Anthropic์˜ Claude์šฉ CLI +- Task Master - ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ์ž‘์—… ๊ด€๋ฆฌ ์‹œ์Šคํ…œ +- Cursor - ์ •๋ฐ€ํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์›Œํฌํ”Œ๋กœ๋ฅผ ์œ„ํ•œ AI ๊ธฐ๋ฐ˜ IDE (์„ ํƒ ์‚ฌํ•ญ) + +## ์‹œ์ž‘ํ•˜๊ธฐ + +### Claude Code ์‹คํ–‰ + +```bash +claude +``` + +or + +``` +ccr code # calude code router ์‚ฌ์šฉ ์‹œ +``` + +### Task Studio ์—ด๊ธฐ (์„ ํƒ์  ์›น ์ธํ„ฐํŽ˜์ด์Šค) + +```bash +npx task-studio@latest +``` + ## ์ฃผ์š” ๊ธฐ๋Šฅ โœจ - ๐Ÿ› ๏ธ **SuperClaude ๋ช…๋ น์–ด**: 16๊ฐœ ์ „๋ฌธ ๋ช…๋ น์–ด (e.g., `/sc:implement`, `/sc:analyze`). @@ -15,7 +43,17 @@ ## ์„ค์ • โš™๏ธ -`~/.claude/settings.json` ํŽธ์ง‘. ๊ธฐ๋ณธ ์„ค์ • ์ถฉ๋ถ„. +`~/.claude/settings.json` ํŽธ์ง‘์œผ๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•. ๊ธฐ๋ณธ ์„ค์ • ์ถฉ๋ถ„. + +๋˜ํ•œ `.mcp.json` ํŒŒ์ผ์„ ํ†ตํ•ด MCP(Model Context Protocol) ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๋‹ค์–‘ํ•œ AI ๋„๊ตฌ์™€์˜ ํ†ตํ•ฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„œ๋ฒ„๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: + +- taskmaster-ai: ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ์ž‘์—… ๊ด€๋ฆฌ ์‹œ์Šคํ…œ +- sequential-thinking: ๋ณต์žกํ•œ ๋ถ„์„์„ ์œ„ํ•œ ์ˆœ์ฐจ์  ์‚ฌ๊ณ  ์—”์ง„ +- playwright: ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ๋ฐ ํ…Œ์ŠคํŠธ +- magic: UI ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ +- context7: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ ๊ฒ€์ƒ‰ + +์ด ์„œ๋ฒ„๋“ค์„ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด MCP ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋„๊ตฌ๋ฅผ ํ™•์žฅํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ MCP ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ## ๋ฌธ์„œ ๐Ÿ“– diff --git a/docs/guides/Claude code router ์„ค์น˜ ๋ฐฉ๋ฒ•.md b/docs/guides/Claude code router ์„ค์น˜ ๋ฐฉ๋ฒ•.md new file mode 100644 index 0000000..e6fd5f5 --- /dev/null +++ b/docs/guides/Claude code router ์„ค์น˜ ๋ฐฉ๋ฒ•.md @@ -0,0 +1,226 @@ +# Claude Code Router ์„ค์น˜ ๊ฐ€์ด๋“œ + +์ด ๊ฐ€์ด๋“œ๋Š” Claude Code Router์˜ ์„ค์น˜, ์„ค์ • ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Claude Code Router๋Š” Claude Code ์š”์ฒญ์„ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ๋กœ ๋ผ์šฐํŒ…ํ•˜๊ณ , ์š”์ฒญ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๊ธฐ๋Šฅ์œผ๋กœ๋Š” ๋ชจ๋ธ ๋ผ์šฐํŒ…, ๋‹ค์ค‘ ์ œ๊ณต์ž ์ง€์›, ์š”์ฒญ/์‘๋‹ต ๋ณ€ํ™˜, ๋™์  ๋ชจ๋ธ ์ „ํ™˜ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด ๊ฐ€์ด๋“œ๋Š” ์˜์–ด README ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์„ค์น˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์„ค๋ช…๊ณผ `~/.claude-code-router/config.json` ํŒŒ์ผ์˜ ์˜ˆ์‹œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ค๋ช…์€ ํ•œ๊ตญ์–ด๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” ์›๋ฌธ์˜ ์˜์–ด ํ‘œ๊ธฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. + +## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ + +- **๋ชจ๋ธ ๋ผ์šฐํŒ…**: ๋ฐฐ๊ฒฝ ์ž‘์—…(background tasks), ์ƒ๊ฐ ๋ชจ๋“œ(thinking), ๊ธด ์ปจํ…์ŠคํŠธ(long context) ๋“ฑ์— ๋”ฐ๋ผ ์š”์ฒญ์„ ๋‹ค๋ฅธ ๋ชจ๋ธ๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. +- **๋‹ค์ค‘ ์ œ๊ณต์ž ์ง€์›**: OpenRouter, DeepSeek, Ollama, Gemini, Volcengine, SiliconFlow ๋“ฑ์˜ ๋ชจ๋ธ ์ œ๊ณต์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. +- **์š”์ฒญ/์‘๋‹ต ๋ณ€ํ™˜**: ์ œ๊ณต์ž์— ๋งž๊ฒŒ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ณ€ํ™˜ํ•˜๋Š” ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **๋™์  ๋ชจ๋ธ ์ „ํ™˜**: Claude Code ๋‚ด์—์„œ `/model` ๋ช…๋ น์–ด๋กœ ๋ชจ๋ธ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **GitHub Actions ํ†ตํ•ฉ**: GitHub ์›Œํฌํ”Œ๋กœ์—์„œ Claude Code ์ž‘์—…์„ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ**: ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ๋กœ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## ๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ + +### 1. ์„ค์น˜ + +๋จผ์ €, Claude Code๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. Claude Code๋Š” Anthropic์˜ ๊ณต์‹ ๋„๊ตฌ๋กœ, Claude ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”: + +```shell +npm install -g @anthropic-ai/claude-code +``` + +๊ทธ ๋‹ค์Œ, Claude Code Router๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธ€๋กœ๋ฒŒ๋กœ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค: + +```shell +npm install -g @musistudio/claude-code-router +``` + +**์ƒ์„ธ ์„ค๋ช…**: +- ์ด ๋ช…๋ น์–ด๋Š” Node.js ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Node.js๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋จผ์ € [Node.js ๊ณต์‹ ์‚ฌ์ดํŠธ](https://nodejs.org/)์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”. +- ์„ค์น˜ ํ›„, `ccr` ๋ช…๋ น์–ด๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. (์˜ˆ: `ccr code`๋กœ Claude Code๋ฅผ ๋ผ์šฐํ„ฐ์™€ ํ•จ๊ป˜ ์‹คํ–‰) +- ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, npm ์บ์‹œ๋ฅผ ์ง€์šฐ๊ณ  ์žฌ์„ค์น˜ํ•˜์„ธ์š”: `npm cache clean --force` ํ›„ ๋‹ค์‹œ ์„ค์น˜. + +### 2. ์„ค์ • + +์„ค์ • ํŒŒ์ผ์€ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค: `~/.claude-code-router/config.json`. ์ด ํŒŒ์ผ์€ ๋ชจ๋ธ ์ œ๊ณต์ž, ๋ผ์šฐํ„ฐ ๊ทœ์น™ ๋“ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ `config.example.json`์„ ์ฐธ์กฐํ•˜์„ธ์š”. + +**config.json ํŒŒ์ผ์˜ ์ฃผ์š” ์„น์…˜**: +- **PROXY_URL** (์„ ํƒ): API ์š”์ฒญ์„ ์œ„ํ•œ ํ”„๋ก์‹œ ์„ค์ • (์˜ˆ: `"http://127.0.0.1:7890"`). ๋„คํŠธ์›Œํฌ ์ œํ•œ์ด ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **LOG** (์„ ํƒ): ๋กœ๊ทธ ํ™œ์„ฑํ™” (`true`๋กœ ์„ค์ • ์‹œ `~/.claude-code-router.log` ํŒŒ์ผ์— ๋กœ๊ทธ ์ €์žฅ). +- **APIKEY** (์„ ํƒ): ์š”์ฒญ ์ธ์ฆ์„ ์œ„ํ•œ ์‹œํฌ๋ฆฟ ํ‚ค. ์„ค์ • ์‹œ ํด๋ผ์ด์–ธํŠธ๋Š” `Authorization: Bearer your-secret-key` ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **HOST** (์„ ํƒ): ์„œ๋ฒ„ ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ (๊ธฐ๋ณธ: `127.0.0.1`). APIKEY๊ฐ€ ์—†์œผ๋ฉด ๋ณด์•ˆ์„ ์œ„ํ•ด `127.0.0.1`๋กœ ๊ฐ•์ œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. +- **Providers**: ๋ชจ๋ธ ์ œ๊ณต์ž ๋ฐฐ์—ด. ๊ฐ ์ œ๊ณต์ž์— ์ด๋ฆ„, API ๋ฒ ์ด์Šค URL, API ํ‚ค, ๋ชจ๋ธ ๋ชฉ๋ก, ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. +- **Router**: ๋ผ์šฐํŒ… ๊ทœ์น™. `default`๋Š” ๊ธฐ๋ณธ ๋ชจ๋ธ, ๋‹ค๋ฅธ ํ‚ค(์˜ˆ: `background`, `think`)๋Š” ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์œ„ํ•œ ๋ชจ๋ธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. +- **transformers** (์„ ํƒ): ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด. + +**์˜ˆ์‹œ config.json ํŒŒ์ผ** (์‚ฌ์šฉ์ž ์ œ๊ณต ๊ฒฝ๋กœ: `\home\koolab\.claude-code-router\config.json` ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์‹ค์ œ ์˜ˆ์‹œ): +์•„๋ž˜๋Š” ์‹ค์ œ ์‚ฌ์šฉ ์ค‘์ธ config.json์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Gemini ์ œ๊ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ API ํ‚ค์™€ ๋ชจ๋ธ์„ ์ˆ˜์ •ํ•˜์„ธ์š”. + +```json +{ + "LOG": true, + "Providers": [ + { + "name": "gemini", + "api_base_url": "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions", + "api_key": "${GEMINI_API_KEY}", // ์‹ค์ œ API ํ‚ค๋กœ ๊ต์ฒดํ•˜์„ธ์š” + "models": [ + "gemini-2.5-pro" + ], + "transformer": { + "use": [ + "openai" + ] + } + } + ], + "Router": { + "default": "gemini,gemini-2.5-pro", + "background": "gemini,gemini-2.5-pro", + "think": "gemini,gemini-2.5-pro", + "longContext": "gemini,gemini-2.5-pro" + }, + "HOST": "0.0.0.0" +} +``` + +**ํฌ๊ด„์ ์ธ ์˜ˆ์‹œ config.json** (๋‹ค์ค‘ ์ œ๊ณต์ž ํฌํ•จ, README ๊ธฐ๋ฐ˜): +์ด ์˜ˆ์‹œ๋Š” ์—ฌ๋Ÿฌ ์ œ๊ณต์ž๋ฅผ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ฐ ์ œ๊ณต์ž์˜ API ํ‚ค๋ฅผ ์‹ค์ œ ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•˜์„ธ์š”. + +```json +{ + "APIKEY": "your-secret-key", // ์ธ์ฆ ํ‚ค (์„ ํƒ) + "PROXY_URL": "http://127.0.0.1:7890", // ํ”„๋ก์‹œ (์„ ํƒ) + "LOG": true, // ๋กœ๊ทธ ํ™œ์„ฑํ™” + "Providers": [ + { + "name": "openrouter", + "api_base_url": "https://openrouter.ai/api/v1/chat/completions", + "api_key": "sk-xxx", // ์‹ค์ œ OpenRouter API ํ‚ค + "models": [ + "google/gemini-2.5-pro-preview", + "anthropic/claude-sonnet-4", + "anthropic/claude-3.5-sonnet", + "anthropic/claude-3.7-sonnet:thinking" + ], + "transformer": { "use": ["openrouter"] } // ๊ธ€๋กœ๋ฒŒ ํŠธ๋žœ์Šคํฌ๋จธ + }, + { + "name": "deepseek", + "api_base_url": "https://api.deepseek.com/chat/completions", + "api_key": "sk-xxx", // ์‹ค์ œ DeepSeek API ํ‚ค + "models": ["deepseek-chat", "deepseek-reasoner"], + "transformer": { + "use": ["deepseek"], + "deepseek-chat": { "use": ["tooluse"] } // ๋ชจ๋ธ๋ณ„ ํŠธ๋žœ์Šคํฌ๋จธ + } + }, + { + "name": "ollama", + "api_base_url": "http://localhost:11434/v1/chat/completions", + "api_key": "ollama", + "models": ["qwen2.5-coder:latest"] + }, + { + "name": "gemini", + "api_base_url": "https://generativelanguage.googleapis.com/v1beta/models/", + "api_key": "sk-xxx", // ์‹ค์ œ Gemini API ํ‚ค + "models": ["gemini-2.5-flash", "gemini-2.5-pro"], + "transformer": { "use": ["gemini"] } + }, + { + "name": "volcengine", + "api_base_url": "https://ark.cn-beijing.volces.com/api/v3/chat/completions", + "api_key": "sk-xxx", // ์‹ค์ œ Volcengine API ํ‚ค + "models": ["deepseek-v3-250324", "deepseek-r1-250528"], + "transformer": { "use": ["deepseek"] } + } + ], + "Router": { + "default": "deepseek,deepseek-chat", // ๊ธฐ๋ณธ ๋ชจ๋ธ + "background": "ollama,qwen2.5-coder:latest", // ๋ฐฐ๊ฒฝ ์ž‘์—… ๋ชจ๋ธ + "think": "deepseek,deepseek-reasoner", // ์ƒ๊ฐ ๋ชจ๋“œ ๋ชจ๋ธ + "longContext": "openrouter,google/gemini-2.5-pro-preview", // ๊ธด ์ปจํ…์ŠคํŠธ ๋ชจ๋ธ + "webSearch": "gemini,gemini-2.5-flash" // ์›น ๊ฒ€์ƒ‰ ๋ชจ๋ธ + } +} +``` + +**์ƒ์„ธ ์„ค๋ช…**: +- **Providers ์„น์…˜**: ๊ฐ ์ œ๊ณต์ž์— API ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. ๋ชจ๋ธ ๋ชฉ๋ก์€ ์ œ๊ณต์ž ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. +- **Transformer**: ์ œ๊ณต์ž๋ณ„๋กœ ์š”์ฒญ์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "gemini"๋Š” Gemini API์— ๋งž๊ฒŒ ๋ณ€ํ™˜. +- **Router ์„น์…˜**: ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ๋ชจ๋ธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์›น ๊ฒ€์ƒ‰์€ ๋ชจ๋ธ์ด ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: `:online` ์ ‘๋ฏธ์‚ฌ ์‚ฌ์šฉ). +- ํŒŒ์ผ์„ ์ง์ ‘ ํŽธ์ง‘ํ•œ ํ›„, ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”. +- ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ: `transformers` ๋ฐฐ์—ด์— ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™•์žฅํ•˜์„ธ์š”. + +### 3. Claude Code Router ์‹คํ–‰ + +๋ผ์šฐํ„ฐ์™€ ํ•จ๊ป˜ Claude Code๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค: + +```shell +ccr code +``` + +**์ƒ์„ธ ์„ค๋ช…**: +- ์ด ๋ช…๋ น์–ด๋Š” ๋ผ์šฐํ„ฐ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  Claude Code๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. +- Claude Code ๋‚ด์—์„œ `/model provider_name,model_name`์œผ๋กœ ๋ชจ๋ธ์„ ์ „ํ™˜ํ•˜์„ธ์š” (์˜ˆ: `/model openrouter,anthropic/claude-3.5-sonnet`). + +## ๐Ÿค– GitHub Actions ํ†ตํ•ฉ + +GitHub ์›Œํฌํ”Œ๋กœ์—์„œ Claude Code Router๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด `.github/workflows/claude.yaml` ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์„ธ์š”. ์˜ˆ์‹œ: + +```yaml +name: Claude Code + +on: + issue_comment: + types: [created] + # ... other triggers + +jobs: + claude: + if: | + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || + # ... other conditions + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + issues: read + id-token: write + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Prepare Environment + run: | + curl -fsSL https://bun.sh/install | bash + mkdir -p $HOME/.claude-code-router + cat << 'EOF' > $HOME/.claude-code-router/config.json + { + "log": true, + "OPENAI_API_KEY": "${{ secrets.OPENAI_API_KEY }}", + "OPENAI_BASE_URL": "https://api.deepseek.com", + "OPENAI_MODEL": "deepseek-chat" + } + EOF + shell: bash + + - name: Start Claude Code Router + run: | + nohup ~/.bun/bin/bunx @musistudio/claude-code-router@1.0.8 start & + shell: bash + + - name: Run Claude Code + id: claude + uses: anthropics/claude-code-action@beta + env: + ANTHROPIC_BASE_URL: http://localhost:3456 + with: + anthropic_api_key: "any-string-is-ok" +``` + +**์ƒ์„ธ ์„ค๋ช…**: ์ด ์„ค์ •์€ GitHub Actions์—์„œ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. secrets์— API ํ‚ค๋ฅผ ์ €์žฅํ•˜์„ธ์š”. + +## ๐Ÿ“ ์ถ”๊ฐ€ ์ž๋ฃŒ +- [Claude Code Router ๊ณต์‹ ๊นƒํ—™ํ—™](https://github.com/musistudio/claude-code-router) +- [ํ”„๋กœ์ ํŠธ ๋™๊ธฐ ๋ฐ ์ž‘๋™ ์›๋ฆฌ](https://github.com/musistudio/claude-code-router/blob/main/blog/en/project-motivation-and-how-it-works.md) +- [๋ผ์šฐํ„ฐ๋กœ ๋” ๋งŽ์€ ์ž‘์—…ํ•˜๊ธฐ](https://github.com/musistudio/claude-code-router/blob/main/blog/en/maybe-we-can-do-more-with-the-route.md) + +๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋กœ๊ทธ ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, GitHub ์ด์Šˆ๋ฅผ ์ œ์ถœํ•˜์„ธ์š”. ์ด ๊ฐ€์ด๋“œ๋ฅผ ํ†ตํ•ด Claude Code Router๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค! \ No newline at end of file