claude-ai-switcher 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +265 -0
- package/ARCHITECTURE.md +162 -0
- package/CLAUDE.md +267 -0
- package/LICENSE +21 -0
- package/QWEN.md +429 -0
- package/README.md +833 -0
- package/dist/clients/claude-code.d.ts +92 -0
- package/dist/clients/claude-code.d.ts.map +1 -0
- package/dist/clients/claude-code.js +312 -0
- package/dist/clients/claude-code.js.map +1 -0
- package/dist/clients/opencode.d.ts +71 -0
- package/dist/clients/opencode.d.ts.map +1 -0
- package/dist/clients/opencode.js +604 -0
- package/dist/clients/opencode.js.map +1 -0
- package/dist/config.d.ts +37 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +122 -0
- package/dist/config.js.map +1 -0
- package/dist/display.d.ts +51 -0
- package/dist/display.d.ts.map +1 -0
- package/dist/display.js +118 -0
- package/dist/display.js.map +1 -0
- package/dist/hooks/index.d.ts +60 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +223 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/token-tracker.js +280 -0
- package/dist/hooks/visual-enhancements.js +364 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1091 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +34 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +343 -0
- package/dist/models.js.map +1 -0
- package/dist/providers/alibaba.d.ts +25 -0
- package/dist/providers/alibaba.d.ts.map +1 -0
- package/dist/providers/alibaba.js +37 -0
- package/dist/providers/alibaba.js.map +1 -0
- package/dist/providers/anthropic.d.ts +14 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +19 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +44 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +156 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/glm.d.ts +25 -0
- package/dist/providers/glm.d.ts.map +1 -0
- package/dist/providers/glm.js +89 -0
- package/dist/providers/glm.js.map +1 -0
- package/dist/providers/ollama.d.ts +48 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +174 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openrouter.d.ts +24 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +36 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/verify.d.ts +24 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +262 -0
- package/dist/verify.js.map +1 -0
- package/package.json +57 -0
- package/scripts/copy-hooks.js +15 -0
- package/src/clients/claude-code.ts +340 -0
- package/src/clients/opencode.ts +618 -0
- package/src/config.ts +101 -0
- package/src/display.ts +151 -0
- package/src/hooks/index.ts +208 -0
- package/src/hooks/token-tracker.js +280 -0
- package/src/hooks/visual-enhancements.js +364 -0
- package/src/index.ts +1263 -0
- package/src/models.ts +366 -0
- package/src/providers/alibaba.ts +43 -0
- package/src/providers/anthropic.ts +23 -0
- package/src/providers/gemini.ts +136 -0
- package/src/providers/glm.ts +60 -0
- package/src/providers/ollama.ts +146 -0
- package/src/providers/openrouter.ts +42 -0
- package/src/verify.ts +258 -0
- package/tsconfig.json +19 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Chad Yantorno
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/QWEN.md
ADDED
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
# Claude AI Switcher - Project Context
|
|
2
|
+
|
|
3
|
+
## Project Overview
|
|
4
|
+
|
|
5
|
+
**Claude AI Switcher** is a TypeScript CLI tool that enables seamless switching between AI providers (Anthropic, Alibaba Coding Plan, GLM/Z.AI) for **Claude Code** and **OpenCode** clients. It manages configuration files, API keys, environment variables, and model alias env vars so users always know what model is active in Claude Code.
|
|
6
|
+
|
|
7
|
+
### Key Features
|
|
8
|
+
- Quick switching between Anthropic (default), Alibaba Coding Plan, GLM/Z.AI, OpenRouter, Ollama, and Gemini providers
|
|
9
|
+
- **Model alias env vars** written to `~/.claude/settings.json` so Claude Code routes model tiers to the correct provider model (`ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, `ANTHROPIC_DEFAULT_HAIKU_MODEL`)
|
|
10
|
+
- **Separate client control** — `claude-switch claude <provider>` targets Claude Code only, `claude-switch opencode <provider>` targets OpenCode only, bare `claude-switch <provider>` updates both
|
|
11
|
+
- **Custom tier overrides** via `--opus`, `--sonnet`, `--haiku` flags
|
|
12
|
+
- Model information display with context windows and capabilities
|
|
13
|
+
- **Token tracking** — Visual context bar with percentage usage display (green/yellow/red/magenta color-coded)
|
|
14
|
+
- **Visual enhancements** — Model card showing active model, provider, context window, and capabilities
|
|
15
|
+
- Secure API key storage in `~/.claude-ai-switcher/config.json`
|
|
16
|
+
- Automatic backup of existing configurations
|
|
17
|
+
- Auto-onboarding to prevent Anthropic connection errors
|
|
18
|
+
|
|
19
|
+
## Project Structure
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
claude-ai-switcher/
|
|
23
|
+
├── src/
|
|
24
|
+
│ ├── index.ts # Main CLI entry point (Commander.js)
|
|
25
|
+
│ ├── config.ts # API key and config management
|
|
26
|
+
│ ├── models.ts # Provider/model definitions + ModelTierMap
|
|
27
|
+
│ ├── display.ts # Console output utilities (chalk)
|
|
28
|
+
│ ├── verify.ts # API key verification
|
|
29
|
+
│ ├── hooks/
|
|
30
|
+
│ │ ├── index.ts # Hook manager (install/remove hooks)
|
|
31
|
+
│ │ ├── token-tracker.js # Token tracking script
|
|
32
|
+
│ │ └── visual-enhancements.js # Visual enhancements script
|
|
33
|
+
│ ├── clients/
|
|
34
|
+
│ │ ├── claude-code.ts # Claude Code config handler (~/.claude/)
|
|
35
|
+
│ │ └── opencode.ts # OpenCode config handler (~/.config/opencode/opencode.json)
|
|
36
|
+
│ └── providers/
|
|
37
|
+
│ ├── anthropic.ts # Anthropic provider config
|
|
38
|
+
│ ├── alibaba.ts # Alibaba Coding Plan config
|
|
39
|
+
│ ├── glm.ts # GLM/Z.AI provider (coding-helper)
|
|
40
|
+
│ ├── ollama.ts # Ollama provider (LiteLLM proxy)
|
|
41
|
+
│ ├── gemini.ts # Gemini provider (LiteLLM proxy)
|
|
42
|
+
│ ── openrouter.ts # OpenRouter provider config
|
|
43
|
+
├── dist/ # Compiled JavaScript output
|
|
44
|
+
├── package.json # Dependencies and scripts
|
|
45
|
+
── tsconfig.json # TypeScript configuration
|
|
46
|
+
└── README.md # User documentation
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Building and Running
|
|
50
|
+
|
|
51
|
+
### Prerequisites
|
|
52
|
+
- Node.js >= 18.0.0
|
|
53
|
+
- npm
|
|
54
|
+
|
|
55
|
+
### Build Commands
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Install dependencies (reproducible install from package-lock.json; does NOT modify it)
|
|
59
|
+
npm ci
|
|
60
|
+
|
|
61
|
+
# Build TypeScript to JavaScript
|
|
62
|
+
npm run build
|
|
63
|
+
|
|
64
|
+
# Run development version (ts-node)
|
|
65
|
+
npm run dev
|
|
66
|
+
|
|
67
|
+
# Run built version
|
|
68
|
+
npm start
|
|
69
|
+
|
|
70
|
+
# Clean build output
|
|
71
|
+
npm run clean
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Global Installation
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm link # Install CLI globally as 'claude-switch'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Usage
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Setup wizard (first-time use)
|
|
84
|
+
claude-switch setup
|
|
85
|
+
|
|
86
|
+
# Switch BOTH clients
|
|
87
|
+
claude-switch anthropic
|
|
88
|
+
claude-switch alibaba
|
|
89
|
+
claude-switch alibaba qwen3.6-plus
|
|
90
|
+
claude-switch glm
|
|
91
|
+
claude-switch openrouter
|
|
92
|
+
claude-switch ollama
|
|
93
|
+
claude-switch gemini
|
|
94
|
+
|
|
95
|
+
# Switch Claude Code only
|
|
96
|
+
claude-switch claude anthropic
|
|
97
|
+
claude-switch claude alibaba qwen3.6-plus
|
|
98
|
+
claude-switch claude glm
|
|
99
|
+
|
|
100
|
+
# Switch OpenCode only
|
|
101
|
+
claude-switch opencode anthropic
|
|
102
|
+
claude-switch opencode alibaba qwen3.6-plus
|
|
103
|
+
claude-switch opencode glm
|
|
104
|
+
|
|
105
|
+
# Custom model tier aliases (Claude Code only)
|
|
106
|
+
claude-switch claude alibaba --opus qwen3-max-2026-01-23 --sonnet qwen3.6-plus --haiku kimi-k2.5
|
|
107
|
+
claude-switch glm --opus glm-5.2[1m] --sonnet glm-5-turbo --haiku glm-5v-turbo
|
|
108
|
+
|
|
109
|
+
# Specific configuration with qwen3.7-plus for opus, qwen3.6-plus for sonnet, kimi-k2.5 for haiku
|
|
110
|
+
claude-switch claude alibaba --opus qwen3.7-plus --sonnet qwen3.6-plus --haiku kimi-k2.5
|
|
111
|
+
|
|
112
|
+
# View information
|
|
113
|
+
claude-switch current # Show current configuration (both clients)
|
|
114
|
+
claude-switch list # List all providers and models
|
|
115
|
+
claude-switch models alibaba # Show models for specific provider
|
|
116
|
+
|
|
117
|
+
# API key management
|
|
118
|
+
claude-switch key alibaba # Check if API key is set
|
|
119
|
+
claude-switch key alibaba <key> # Set API key
|
|
120
|
+
|
|
121
|
+
# Hooks - Token tracking and visual enhancements
|
|
122
|
+
claude-switch hooks install # Install token tracker + visual enhancements
|
|
123
|
+
claude-switch hooks status # Show current token usage and visual status
|
|
124
|
+
claude-switch hooks reset # Reset token usage counters
|
|
125
|
+
claude-switch hooks remove # Remove all hooks
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Configuration Files
|
|
129
|
+
|
|
130
|
+
| Client | Config File | Purpose |
|
|
131
|
+
|--------|-------------|---------|
|
|
132
|
+
| Claude Code | `~/.claude/settings.json` | Environment variables for provider config + model alias env vars |
|
|
133
|
+
| Claude Code | `~/.claude.json` | Onboarding flag (`hasCompletedOnboarding`) |
|
|
134
|
+
| OpenCode | `~/.config/opencode/opencode.json` | Provider and agent configuration |
|
|
135
|
+
| API Keys | `~/.claude-ai-switcher/config.json` | Secure API key storage |
|
|
136
|
+
| Hooks | `~/.claude/hooks-config.json` | Hook installation status and configuration |
|
|
137
|
+
| Token Tracker | `~/.claude/token-tracker.js` | Token tracking script (installed via hooks) |
|
|
138
|
+
| Visual Enhancements | `~/.claude/visual-enhancements.js` | Visual enhancements script (installed via hooks) |
|
|
139
|
+
| Token Usage Data | `~/.claude/token-usage.json` | Session token usage tracking |
|
|
140
|
+
|
|
141
|
+
## How It Works
|
|
142
|
+
|
|
143
|
+
### Alibaba Coding Plan Configuration
|
|
144
|
+
|
|
145
|
+
When switching Claude Code to Alibaba, the tool writes these environment variables to `~/.claude/settings.json`:
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
{
|
|
149
|
+
"env": {
|
|
150
|
+
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
|
|
151
|
+
"ANTHROPIC_BASE_URL": "https://coding-intl.dashscope.aliyuncs.com/apps/anthropic",
|
|
152
|
+
"ANTHROPIC_MODEL": "qwen3.7-plus",
|
|
153
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3.7-plus",
|
|
154
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3.6-plus",
|
|
155
|
+
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "kimi-k2.5"
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_BASE_URL`, `ANTHROPIC_MODEL` — Route Claude Code to Alibaba's endpoint
|
|
161
|
+
- `ANTHROPIC_DEFAULT_*_MODEL` — Map Claude's model tiers (opus/sonnet/haiku) to specific Alibaba models
|
|
162
|
+
- **Opus**: `qwen3.7-plus` (default, 1M context)
|
|
163
|
+
- **Sonnet**: `qwen3.6-plus` (balanced, 1M context)
|
|
164
|
+
- **Haiku**: `kimi-k2.5` (200K context)
|
|
165
|
+
|
|
166
|
+
Switching back to Anthropic clears all these env vars.
|
|
167
|
+
|
|
168
|
+
### GLM/Z.AI Configuration
|
|
169
|
+
|
|
170
|
+
GLM uses the `@z_ai/coding-helper` package to manage its configuration. The tool triggers `coding-helper auth reload claude` to apply GLM settings, plus sets the model tier aliases.
|
|
171
|
+
|
|
172
|
+
## Model Alias Env Vars
|
|
173
|
+
|
|
174
|
+
When switching Claude Code to a non-Anthropic provider, the tool writes into `~/.claude/settings.json`:
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"env": {
|
|
179
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL": "<model>",
|
|
180
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL": "<model>",
|
|
181
|
+
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "<model>"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Default tier maps per provider:
|
|
187
|
+
|
|
188
|
+
| Provider | opus | sonnet | haiku |
|
|
189
|
+
|----------|------|--------|-------|
|
|
190
|
+
| Alibaba | qwen3.7-plus (default), selected model (when specific model chosen) | qwen3.6-plus (default), qwen3.7-plus (when specific model chosen) | kimi-k2.5 (default), qwen3.6-plus (when specific model chosen) |
|
|
191
|
+
| GLM | glm-5.2[1m] | glm-5-turbo | glm-5v-turbo |
|
|
192
|
+
| Anthropic | (cleared) | (cleared) | (cleared) |
|
|
193
|
+
|
|
194
|
+
These are overridable per-switch with `--opus`, `--sonnet`, `--haiku` flags. Switching to Anthropic clears all three vars.
|
|
195
|
+
|
|
196
|
+
## Provider Details
|
|
197
|
+
|
|
198
|
+
### Alibaba Coding Plan
|
|
199
|
+
- **Endpoint**: `https://coding-intl.dashscope.aliyuncs.com/apps/anthropic`
|
|
200
|
+
- **Models**: qwen3.7-plus, qwen3.6-plus, qwen3-max-2026-01-23, qwen3-coder-next, qwen3-coder-plus, glm-5, glm-4.7, glm-4.7-flash, kimi-k2.5, MiniMax-M2.5
|
|
201
|
+
- **Context Windows**: 200K - 1M tokens
|
|
202
|
+
- **qwen3.7-plus**: 1M tokens (balanced, 1M context)
|
|
203
|
+
- **qwen3.6-plus**: 1M tokens (balanced, 1M context)
|
|
204
|
+
- **qwen3-coder-plus**: 1M tokens (code, 1M context)
|
|
205
|
+
- **qwen3-max-2026-01-23**: 262K tokens (complex reasoning)
|
|
206
|
+
- **qwen3-coder-next**: 262K tokens (coding agent)
|
|
207
|
+
- **glm-5**: 200K tokens (flagship GLM)
|
|
208
|
+
- **glm-4.7**: 256K tokens (balanced GLM)
|
|
209
|
+
- **glm-4.7-flash**: 256K tokens (fast GLM)
|
|
210
|
+
- **kimi-k2.5**: 200K tokens (multimodal, 200K context)
|
|
211
|
+
- **MiniMax-M2.5**: 200K tokens (reasoning, 200K context)
|
|
212
|
+
- **API Key Required**: Yes (from Alibaba Cloud Model Studio)
|
|
213
|
+
|
|
214
|
+
### GLM/Z.AI
|
|
215
|
+
- **Managed by**: `@z_ai/coding-helper` package
|
|
216
|
+
- **Models**: glm-5.2[1m], glm-5v-turbo, glm-5-turbo, glm-5.1, glm-4.7
|
|
217
|
+
- **Context Windows**: 200K - 1M tokens
|
|
218
|
+
- **Setup**: `npm install -g @z_ai/coding-helper && coding-helper auth`
|
|
219
|
+
|
|
220
|
+
### Anthropic (Default)
|
|
221
|
+
- **Models**: claude-opus-4-6, claude-opus-4-5, claude-sonnet-4-6, claude-sonnet-4-5, claude-haiku-4-5
|
|
222
|
+
- **Context Windows**: 200K tokens
|
|
223
|
+
- **Configuration**: Clears all provider env vars and model alias env vars to use native Claude
|
|
224
|
+
|
|
225
|
+
## Hooks - Token Tracking & Visual Enhancements
|
|
226
|
+
|
|
227
|
+
### Token Tracker (`~/.claude/token-tracker.js`)
|
|
228
|
+
|
|
229
|
+
Tracks token usage across Claude Code sessions with:
|
|
230
|
+
- **Input/Output token counting**
|
|
231
|
+
- **Total session token usage**
|
|
232
|
+
- **Visual context bar with percentage**
|
|
233
|
+
- **Color-coded alerts** (green <50%, yellow <75%, red <90%, magenta <100%)
|
|
234
|
+
|
|
235
|
+
#### Installation
|
|
236
|
+
```bash
|
|
237
|
+
claude-switch hooks install # Install all hooks
|
|
238
|
+
claude-switch hooks install-token # Install only token tracker
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
#### Usage
|
|
242
|
+
```bash
|
|
243
|
+
claude-switch hooks status # Show current token usage
|
|
244
|
+
claude-switch hooks reset # Reset token counters
|
|
245
|
+
claude-switch hooks remove-token # Remove token tracker
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
#### Output Example
|
|
249
|
+
```
|
|
250
|
+
╔══════════════════════════════════════════════════════════════╗
|
|
251
|
+
║ 🤖 Active Model: Qwen3 6 Plus ║
|
|
252
|
+
╠══════════════════════════════════════════════════════════════╣
|
|
253
|
+
║ 📊 Token Usage: ║
|
|
254
|
+
║ Input: 12,450 tokens ║
|
|
255
|
+
║ Output: 8,320 tokens ║
|
|
256
|
+
║ Total: 20,770 tokens ║
|
|
257
|
+
╠══════════════════════════════════════════════════════════════╣
|
|
258
|
+
║ Context Window: ║
|
|
259
|
+
║ Used: 20,770 tokens ║
|
|
260
|
+
║ Total: 1,000,000 tokens ║
|
|
261
|
+
║ ████░░░░░░░░░░░░░░░░ 2.1% ║
|
|
262
|
+
╚══════════════════════════════════════════════════════════════╝
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Visual Enhancements (`~/.claude/visual-enhancements.js`)
|
|
266
|
+
|
|
267
|
+
Provides visual display of active model and provider information:
|
|
268
|
+
- **Model card** with provider name, model, context window, and capabilities
|
|
269
|
+
- **Provider detection** from Claude Code settings
|
|
270
|
+
- **Context usage percentage bar**
|
|
271
|
+
- **Custom system prompt generation**
|
|
272
|
+
|
|
273
|
+
#### Installation
|
|
274
|
+
```bash
|
|
275
|
+
claude-switch hooks install # Install all hooks
|
|
276
|
+
claude-switch hooks install-visual # Install only visual enhancements
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
#### Usage
|
|
280
|
+
```bash
|
|
281
|
+
claude-switch hooks status # Show visual status
|
|
282
|
+
claude-switch hooks remove-visual # Remove visual enhancements
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
#### Output Example
|
|
286
|
+
```
|
|
287
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
288
|
+
│ 🤖 Alibaba Model Studio │
|
|
289
|
+
├─────────────────────────────────────────────────────────────┤
|
|
290
|
+
│ Model: qwen3.6-plus │
|
|
291
|
+
│ Context: 1M tokens │
|
|
292
|
+
│ Capabilities: │
|
|
293
|
+
│ Text Generation • Deep Thinking • Visual Understanding │
|
|
294
|
+
└─────────────────────────────────────────────────────────────┘
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Hook Configuration
|
|
298
|
+
|
|
299
|
+
Hooks are managed via `~/.claude/hooks-config.json`:
|
|
300
|
+
```json
|
|
301
|
+
{
|
|
302
|
+
"tokenTracking": true,
|
|
303
|
+
"visualEnhancements": true,
|
|
304
|
+
"customPrompts": false,
|
|
305
|
+
"lastInstalled": "2026-05-05T07:00:00.000Z"
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Token Usage Tracking
|
|
310
|
+
|
|
311
|
+
Token usage is stored in `~/.claude/token-usage.json`:
|
|
312
|
+
```json
|
|
313
|
+
{
|
|
314
|
+
"totalInputTokens": 12450,
|
|
315
|
+
"totalOutputTokens": 8320,
|
|
316
|
+
"sessionStart": "2026-05-05T07:00:00.000Z",
|
|
317
|
+
"lastUpdated": "2026-05-05T08:30:00.000Z"
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Development Conventions
|
|
322
|
+
|
|
323
|
+
### Code Style
|
|
324
|
+
- **TypeScript**: Strict mode enabled (`strict: true` in tsconfig.json)
|
|
325
|
+
- **Module System**: CommonJS with ES2020 target
|
|
326
|
+
- **Naming**: camelCase for variables/functions, PascalCase for types/interfaces
|
|
327
|
+
- **Imports**: ES module syntax with `.js` extensions for relative imports
|
|
328
|
+
- **Error Handling**: Try-catch blocks with user-friendly error messages via `displayError()`
|
|
329
|
+
|
|
330
|
+
### Architecture Patterns
|
|
331
|
+
- **Separation of Concerns**:
|
|
332
|
+
- `clients/` handles file I/O for specific AI clients
|
|
333
|
+
- `providers/` contains provider-specific configuration logic
|
|
334
|
+
- `models.ts` centralizes model definitions, tier maps, and `ModelTierMap` interface
|
|
335
|
+
- `display.ts` handles all console output formatting
|
|
336
|
+
- **Async/Await**: All file operations use async/await with fs-extra
|
|
337
|
+
- **Interface Definitions**: TypeScript interfaces for all config objects
|
|
338
|
+
|
|
339
|
+
### Key Types
|
|
340
|
+
|
|
341
|
+
```typescript
|
|
342
|
+
// ModelTierMap defines which model maps to each Anthropic tier
|
|
343
|
+
interface ModelTierMap {
|
|
344
|
+
opus: string;
|
|
345
|
+
sonnet: string;
|
|
346
|
+
haiku: string;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// GLM default: best model per tier
|
|
350
|
+
const GLM_DEFAULT_TIER_MAP: ModelTierMap = {
|
|
351
|
+
opus: "glm-5.2[1m]",
|
|
352
|
+
sonnet: "glm-5-turbo",
|
|
353
|
+
haiku: "glm-5v-turbo"
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
// Alibaba default: opus = selected model, sonnet = qwen3.7-plus, haiku = qwen3.6-plus
|
|
357
|
+
function getAlibabaTierMap(model: string): ModelTierMap
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Command Structure
|
|
361
|
+
|
|
362
|
+
```
|
|
363
|
+
claude-switch <provider> → both clients
|
|
364
|
+
claude-switch claude <provider> → Claude Code only
|
|
365
|
+
claude-switch opencode <provider> → OpenCode only
|
|
366
|
+
|
|
367
|
+
Tier override flags (Claude Code only):
|
|
368
|
+
--opus <model>
|
|
369
|
+
--sonnet <model>
|
|
370
|
+
--haiku <model>
|
|
371
|
+
|
|
372
|
+
Hooks commands:
|
|
373
|
+
claude-switch hooks install → Install all hooks
|
|
374
|
+
claude-switch hooks install-token → Install token tracker only
|
|
375
|
+
claude-switch hooks install-visual → Install visual enhancements only
|
|
376
|
+
claude-switch hooks status → Show current status
|
|
377
|
+
claude-switch hooks reset → Reset token counters
|
|
378
|
+
claude-switch hooks remove → Remove all hooks
|
|
379
|
+
claude-switch hooks remove-token → Remove token tracker
|
|
380
|
+
claude-switch hooks remove-visual → Remove visual enhancements
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Testing Practices
|
|
384
|
+
- Manual testing via CLI commands
|
|
385
|
+
- Configuration backup before modifications
|
|
386
|
+
- Validation of model IDs before applying configuration
|
|
387
|
+
|
|
388
|
+
### Key Dependencies
|
|
389
|
+
- `commander`: CLI framework
|
|
390
|
+
- `chalk`: Terminal styling
|
|
391
|
+
- `fs-extra`: Enhanced file system operations
|
|
392
|
+
- `ora`: Loading spinners
|
|
393
|
+
|
|
394
|
+
## External Dependencies
|
|
395
|
+
|
|
396
|
+
### Required for Full Functionality
|
|
397
|
+
- **Claude Code**: For Claude Code client support
|
|
398
|
+
- **OpenCode**: For OpenCode client support
|
|
399
|
+
- **@z_ai/coding-helper**: Required for GLM/Z.AI provider support
|
|
400
|
+
|
|
401
|
+
### API Key Sources
|
|
402
|
+
- **Alibaba**: [Alibaba Cloud Model Studio](https://modelstudio.console.alibabacloud.com/)
|
|
403
|
+
- **GLM/Z.AI**: Via `coding-helper auth` interactive setup
|
|
404
|
+
- **Anthropic**: Uses system/default Anthropic configuration
|
|
405
|
+
|
|
406
|
+
## Safety Features
|
|
407
|
+
|
|
408
|
+
1. **Backup Before Modify**: All config file modifications create timestamped backups
|
|
409
|
+
2. **Directory Creation**: Uses `fs.ensureDir()` to safely create directories
|
|
410
|
+
3. **Onboarding Auto-Complete**: Sets `hasCompletedOnboarding: true` to prevent connection errors
|
|
411
|
+
4. **Local-Only Storage**: No cloud sync of API keys or configurations
|
|
412
|
+
5. **Existence Checks**: Validates config files before reading/writing
|
|
413
|
+
6. **Env Var Cleanup**: Clears provider-specific env vars when switching between providers
|
|
414
|
+
7. **Hook Safety**: Hooks are optional and can be removed at any time without affecting core functionality
|
|
415
|
+
8. **Token Usage Privacy**: Token usage data stored locally only, never transmitted
|
|
416
|
+
|
|
417
|
+
## Common Issues & Solutions
|
|
418
|
+
|
|
419
|
+
| Issue | Solution |
|
|
420
|
+
|-------|----------|
|
|
421
|
+
| `coding-helper not found` | `npm install -g @z_ai/coding-helper` |
|
|
422
|
+
| `API Key not found` | Run `claude-switch setup` or `claude-switch key alibaba <key>` |
|
|
423
|
+
| `Unable to connect to Anthropic services` | Run any switch command to auto-set onboarding flag |
|
|
424
|
+
| Config file issues | Run `claude-switch current` to diagnose |
|
|
425
|
+
| Model aliases not working | Check `~/.claude/settings.json` for `env` section |
|
|
426
|
+
| Hooks not installed | Run `claude-switch hooks install` |
|
|
427
|
+
| Token tracker not showing | Check `~/.claude/token-tracker.js` exists |
|
|
428
|
+
| Visual enhancements not showing | Check `~/.claude/visual-enhancements.js` exists |
|
|
429
|
+
| Token usage not resetting | Run `claude-switch hooks reset` |
|