--- description: Configure ccproxy/LiteLLM to use Claude Code with any LLM provider --- # ccproxy-tools Setup Configure Claude Code to use ccproxy/LiteLLM with Claude Pro/Max subscription, GitHub Copilot, or other LLM providers. ## Step 1: Check Prerequisites Check if `uv` is installed: ```bash which uv ``` If not installed, install it: ```bash curl -LsSf https://astral.sh/uv/install.sh | sh ``` Then reload shell or run `source ~/.bashrc` (or `~/.zshrc`). ## Step 2: Ask Provider Choice Use AskUserQuestion: - question: "Which LLM provider do you want to use with Claude Code?" - header: "Provider" - options: - label: "Claude Pro/Max (ccproxy)" description: "Use your Claude subscription via OAuth - no API keys needed" - label: "GitHub Copilot (LiteLLM)" description: "Use GitHub Copilot subscription via LiteLLM proxy" - label: "OpenAI API (LiteLLM)" description: "Use OpenAI models via LiteLLM proxy" - label: "Gemini API (LiteLLM)" description: "Use Google Gemini models via LiteLLM proxy" ## Step 3: Install Proxy Tool ### If Claude Pro/Max (ccproxy) Install and initialize ccproxy: ```bash uv tool install ccproxy ccproxy init ``` ### If GitHub Copilot, OpenAI, or Gemini (LiteLLM) Install LiteLLM: ```bash uv tool install 'litellm[proxy]' ``` ## Step 4: Configure LiteLLM (if applicable) ### For GitHub Copilot Auto-detect VS Code and Copilot versions: ```bash # Get VS Code version VSCODE_VERSION=$(code --version 2> /dev/null | head -1 || echo "1.96.0") # Find Copilot Chat extension version COPILOT_VERSION=$(ls ~/.vscode/extensions/ 2> /dev/null | grep "github.copilot-chat-" | sed 's/github.copilot-chat-//' | sort -V | tail -1 || echo "0.26.7") ``` Create `~/.litellm/config.yaml` with detected versions: ```yaml general_settings: master_key: sk-dummy litellm_settings: drop_params: true model_list: - model_name: "*" litellm_params: model: "github_copilot/*" extra_headers: editor-version: "vscode/${VSCODE_VERSION}" editor-plugin-version: "copilot-chat/${COPILOT_VERSION}" Copilot-Integration-Id: "vscode-chat" user-agent: "GitHubCopilotChat/${COPILOT_VERSION}" ``` ### For OpenAI API Ask for OpenAI API key using AskUserQuestion: - question: "Enter your OpenAI API key (starts with sk-):" - header: "OpenAI Key" - options: - label: "I have it ready" description: "I'll paste my OpenAI API key" - label: "Skip for now" description: "I'll configure it later" Create `~/.litellm/config.yaml`: ```yaml general_settings: master_key: sk-dummy litellm_settings: drop_params: true model_list: - model_name: "*" litellm_params: model: openai/gpt-4o api_key: ${OPENAI_API_KEY} ``` ### For Gemini API Ask for Gemini API key using AskUserQuestion: - question: "Enter your Gemini API key:" - header: "Gemini Key" - options: - label: "I have it ready" description: "I'll paste my Gemini API key" - label: "Skip for now" description: "I'll configure it later" Create `~/.litellm/config.yaml`: ```yaml general_settings: master_key: sk-dummy litellm_settings: drop_params: true model_list: - model_name: "*" litellm_params: model: gemini/gemini-2.5-flash api_key: ${GEMINI_API_KEY} ``` ## Step 5: Setup Auto-Start Service Detect platform and create appropriate service: ### macOS (launchd) For ccproxy, create `~/Library/LaunchAgents/com.ccproxy.plist`: ```xml Label com.ccproxy ProgramArguments ${HOME}/.local/bin/ccproxy start RunAtLoad KeepAlive StandardOutPath ${HOME}/.local/share/ccproxy/stdout.log StandardErrorPath ${HOME}/.local/share/ccproxy/stderr.log ``` For LiteLLM, create `~/Library/LaunchAgents/com.litellm.plist`: ```xml Label com.litellm ProgramArguments ${HOME}/.local/bin/litellm --config ${HOME}/.litellm/config.yaml RunAtLoad KeepAlive StandardOutPath ${HOME}/.local/share/litellm/stdout.log StandardErrorPath ${HOME}/.local/share/litellm/stderr.log ``` Load and start the service: ```bash launchctl load ~/Library/LaunchAgents/com.ccproxy.plist # or com.litellm.plist ``` ### Linux (systemd user service) For ccproxy, create `~/.config/systemd/user/ccproxy.service`: ```ini [Unit] Description=ccproxy LLM Proxy [Service] ExecStart=%h/.local/bin/ccproxy start Restart=always RestartSec=5 [Install] WantedBy=default.target ``` For LiteLLM, create `~/.config/systemd/user/litellm.service`: ```ini [Unit] Description=LiteLLM Proxy [Service] ExecStart=%h/.local/bin/litellm --config %h/.litellm/config.yaml Restart=always RestartSec=5 [Install] WantedBy=default.target ``` Enable and start the service: ```bash systemctl --user daemon-reload systemctl --user enable --now ccproxy # or litellm ``` ## Step 6: Authenticate (ccproxy only) For ccproxy, tell the user: ``` The proxy is starting. A browser window will open for authentication. 1. Sign in with your Claude Pro/Max account 2. Authorize the connection 3. Return here after successful authentication ``` Wait for authentication to complete. ## Step 7: Verify Proxy is Running Check if proxy is healthy: ```bash curl -s http://localhost:4000/health ``` Retry up to 5 times with 3-second delays if not responding. If proxy is not healthy after retries: - Show error and troubleshooting steps - Do NOT proceed to update settings - Exit ## Step 8: Confirm Before Updating Settings Use AskUserQuestion: - question: "Proxy is running. Ready to configure Claude Code to use it?" - header: "Configure" - options: - label: "Yes, configure now" description: "Update settings to use the proxy (requires restart)" - label: "No, not yet" description: "Keep current settings, I'll configure later" If user selects "No, not yet": - Tell them they can run `/ccproxy-tools:setup` again when ready - Exit without changing settings ## Step 9: Update Settings 1. Read current `~/.claude/settings.json` 2. Create backup at `~/.claude/settings.json.backup` 3. Add to env section based on provider: For ccproxy: ```json { "env": { "ANTHROPIC_BASE_URL": "http://localhost:4000" } } ``` For LiteLLM: ```json { "env": { "ANTHROPIC_BASE_URL": "http://localhost:4000", "ANTHROPIC_AUTH_TOKEN": "sk-dummy" } } ``` 4. Write updated settings ## Step 10: Confirm Success Tell the user: ``` Configuration complete! IMPORTANT: Restart Claude Code for changes to take effect. - Exit Claude Code - Run `claude` again The proxy will start automatically on system boot. To verify after restart: - Claude Code should connect to the proxy at localhost:4000 - Check proxy logs: ~/Library/LaunchAgents/*.log (macOS) or journalctl --user -u ccproxy (Linux) ``` ## Recovery Instructions Always show these recovery instructions: ``` If Claude Code stops working after setup: 1. Check proxy status: curl http://localhost:4000/health 2. Restart proxy: macOS: launchctl kickstart -k gui/$(id -u)/com.ccproxy Linux: systemctl --user restart ccproxy 3. Check proxy logs: macOS: cat ~/.local/share/ccproxy/stderr.log Linux: journalctl --user -u ccproxy 4. Restore original settings (removes proxy): cp ~/.claude/settings.json.backup ~/.claude/settings.json Or manually edit ~/.claude/settings.json and remove: - ANTHROPIC_BASE_URL - ANTHROPIC_AUTH_TOKEN (if present) ``` ## Troubleshooting If proxy setup fails: ``` Common fixes: 1. Port in use - Check if another process uses port 4000: lsof -i :4000 2. Service not starting - Check logs in ~/.local/share/ccproxy/ or ~/.local/share/litellm/ 3. Authentication failed - Re-run setup to re-authenticate 4. Permission denied - Ensure ~/.local/bin is in PATH 5. Config invalid - Verify ~/.litellm/config.yaml syntax ```