# HF Spaces Deployment - Claude Multi-API Key Feature ## Overview This version of CLIProxyAPI includes support for multiple Claude API keys with round-robin load balancing, accessible through both the Management UI and API endpoints. ## What's New ### 1. Multiple Claude API Keys - Add multiple API keys per Claude configuration - Each key can have its own proxy URL - Automatic round-robin load balancing across all keys - Backward compatible with single-key configurations ### 2. Updated Management UI The management UI (`/management.html`) now includes: - **AI Providers** → **Claude API Configuration** section - Add/remove multiple API keys with individual proxy settings - Visual interface for managing key entries ### 3. API Endpoints The following endpoints support the new `api-key-entries` field: - `GET /api/config/claude-api-key` - Returns configurations with `api-key-entries` - `PUT /api/config/claude-api-key` - Create/update with multiple keys - `PATCH /api/config/claude-api-key` - Update specific fields including `api-key-entries` - `DELETE /api/config/claude-api-key` - Delete by API key or index ## Configuration Examples ### Via Management UI 1. Access `https://your-space.hf.space/management.html` 2. Navigate to **AI Providers** → **Claude API Configuration** 3. Click **Add Configuration** 4. Add multiple API keys in the **API Keys** section 5. Save ### Via Config File (config.yaml) ```yaml claude-api-key: - api-key-entries: - api-key: "sk-ant-api03-key1..." proxy-url: "http://proxy1:8080" - api-key: "sk-ant-api03-key2..." proxy-url: "http://proxy2:8080" - api-key: "sk-ant-api03-key3..." base-url: "https://api.anthropic.com" priority: 10 prefix: "team-a/" models: - name: claude-3-5-sonnet-20241022 alias: claude-sonnet - name: claude-3-opus-20240229 alias: claude-opus ``` ### Via API ```bash # Add Claude configuration with multiple keys curl -X PUT https://your-space.hf.space/api/config/claude-api-key \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your-api-key" \ -d '[{ "api-key-entries": [ {"api-key": "sk-ant-api03-key1...", "proxy-url": "http://proxy1:8080"}, {"api-key": "sk-ant-api03-key2...", "proxy-url": "http://proxy2:8080"} ], "base-url": "https://api.anthropic.com", "priority": 10, "models": [ {"name": "claude-3-5-sonnet-20241022", "alias": "claude-sonnet"} ] }]' ``` ## How It Works 1. **Load Balancing**: Each API key becomes a separate Auth entry. The system uses round-robin selection to distribute requests across all available keys. 2. **Per-Key Proxy**: Each API key entry can specify its own `proxy-url`. If not specified, it falls back to the key-level `proxy-url` or no proxy. 3. **Backward Compatibility**: The old single `api-key` field still works. If `api-key-entries` is empty, the system uses the single `api-key`. 4. **Failover**: If one API key fails (e.g., rate limited), the system automatically tries the next key in the rotation. ## Files Modified ### Backend (Go) - `internal/config/config.go` - Added `ClaudeAPIKeyEntry` type and updated `ClaudeKey` - `internal/watcher/synthesizer/config.go` - Updated `synthesizeClaudeKeys()` for multi-key support - `internal/watcher/diff/config_diff.go` - Added diff detection for `api-key-entries` - `internal/api/handlers/management/config_lists.go` - Updated API handlers - `internal/managementasset/management.html` - Updated React UI build ### Frontend (React/TypeScript) - `management-center/src/types/provider.ts` - Added `apiKeyEntries` to types - `management-center/src/components/providers/ClaudeSection/ClaudeModal.tsx` - New multi-key UI - `management-center/src/components/providers/types.ts` - Updated form state types - `management-center/src/i18n/locales/*.json` - Added translation keys ## Testing All tests pass for the modified components: ```bash go test ./internal/config/... ./internal/watcher/... ./internal/api/handlers/management/... -v ``` ## Deployment Notes 1. The `management.html` file is embedded in the binary at `/home/internal/managementasset/management.html` 2. The Dockerfile copies the entire project, so the management UI is included automatically 3. No additional environment variables are required for the multi-key feature 4. The feature works out of the box once deployed ## Troubleshooting ### Management UI Not Loading - Ensure the `management.html` file exists in the Docker image - Check that `RemoteManagement.DisableControlPanel` is not set to `true` in config ### API Keys Not Rotating - Verify that `api-key-entries` is properly formatted in the config - Check logs for any synthesis errors - Ensure at least one API key has a non-empty value ### Per-Key Proxy Not Working - Verify the proxy URL format (e.g., `http://proxy.example.com:8080`) - Check that the proxy is accessible from the HF Spaces environment