@pikecode/api-key-manager 1.0.27 → 1.0.29
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/README.md +396 -69
- package/package.json +1 -1
- package/src/commands/switch.js +80 -58
package/README.md
CHANGED
|
@@ -1,123 +1,450 @@
|
|
|
1
|
-
# API Key Manager
|
|
1
|
+
# API Key Manager (akm)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一个强大的 CLI 工具,用于管理和快速切换 **Claude Code** 和 **Codex CLI** 的 API 配置。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/@pikecode/api-key-manager)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
- 🔐 **安全存储** - 本地安全存储 API 密钥
|
|
9
|
-
- 🌍 **多提供商支持** - 支持多个 API 提供商(Anthropic)
|
|
10
|
-
- 🎯 **灵活配置** - 支持多种认证模式(API Key、Auth Token、OAuth)
|
|
11
|
-
- 🚀 **开箱即用** - 无需复杂配置
|
|
12
|
-
- 💾 **环境变量管理** - 自动设置和管理环境变量
|
|
8
|
+
## ✨ 功能特性
|
|
13
9
|
|
|
14
|
-
|
|
10
|
+
- 🎯 **双 IDE 支持** - 同时管理 Claude Code 和 Codex CLI 配置
|
|
11
|
+
- 🔄 **快速切换** - 一键切换不同的 API 提供商
|
|
12
|
+
- 🔐 **安全存储** - 本地加密存储 API 密钥
|
|
13
|
+
- 🎨 **多认证模式** - 支持 OAuth、API Key、Auth Token
|
|
14
|
+
- 🚀 **启动参数** - 为每个供应商配置专属启动参数
|
|
15
|
+
- 💾 **备份恢复** - 配置导出、导入、备份功能
|
|
16
|
+
- 🏷️ **智能过滤** - 按 IDE 类型过滤供应商列表
|
|
17
|
+
- ⚡ **参数校验** - 自动检测互斥参数冲突
|
|
18
|
+
- 🌍 **跨平台** - macOS / Linux / Windows
|
|
19
|
+
|
|
20
|
+
## 📦 安装
|
|
15
21
|
|
|
16
22
|
```bash
|
|
17
23
|
npm install -g @pikecode/api-key-manager
|
|
18
24
|
```
|
|
19
25
|
|
|
20
|
-
## 快速开始
|
|
26
|
+
## 🚀 快速开始
|
|
21
27
|
|
|
22
28
|
```bash
|
|
23
|
-
#
|
|
24
|
-
akm --help
|
|
25
|
-
|
|
26
|
-
# 添加新的 API 提供商配置
|
|
29
|
+
# 添加第一个配置
|
|
27
30
|
akm add
|
|
28
31
|
|
|
29
|
-
#
|
|
32
|
+
# 切换供应商(交互式)
|
|
30
33
|
akm
|
|
31
34
|
|
|
32
|
-
#
|
|
35
|
+
# 查看所有配置
|
|
36
|
+
akm list
|
|
37
|
+
|
|
38
|
+
# 查看当前激活的配置
|
|
33
39
|
akm current
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 📖 完整命令参考
|
|
43
|
+
|
|
44
|
+
### 基础命令
|
|
45
|
+
|
|
46
|
+
#### `akm` / `akm switch`
|
|
47
|
+
交互式选择和切换供应商
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# 显示所有供应商
|
|
51
|
+
akm
|
|
52
|
+
|
|
53
|
+
# 直接切换到指定供应商
|
|
54
|
+
akm my-provider
|
|
34
55
|
|
|
35
|
-
#
|
|
56
|
+
# 仅显示 Codex CLI 供应商
|
|
57
|
+
akm switch --codex
|
|
58
|
+
|
|
59
|
+
# 仅显示 Claude Code 供应商
|
|
60
|
+
akm switch --claude
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
#### `akm add`
|
|
64
|
+
添加新的 API 供应商配置
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# 交互式添加(会询问 IDE 类型)
|
|
68
|
+
akm add
|
|
69
|
+
|
|
70
|
+
# 直接添加 Claude Code 供应商
|
|
71
|
+
akm add --claude
|
|
72
|
+
|
|
73
|
+
# 直接添加 Codex CLI 供应商
|
|
74
|
+
akm add --codex
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**添加过程中可配置:**
|
|
78
|
+
- IDE 类型(Claude Code / Codex CLI)
|
|
79
|
+
- 供应商名称和显示名称
|
|
80
|
+
- 认证模式(仅 Claude Code)
|
|
81
|
+
- API 密钥 / OAuth Token
|
|
82
|
+
- 基础 URL
|
|
83
|
+
- 启动参数
|
|
84
|
+
- 模型配置
|
|
85
|
+
|
|
86
|
+
#### `akm list`
|
|
87
|
+
列出所有已保存的配置
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 列出所有供应商
|
|
36
91
|
akm list
|
|
92
|
+
|
|
93
|
+
# 仅列出 Codex CLI 供应商
|
|
94
|
+
akm list --codex
|
|
95
|
+
|
|
96
|
+
# 仅列出 Claude Code 供应商
|
|
97
|
+
akm list --claude
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**显示内容:**
|
|
101
|
+
- ✅ 当前激活的供应商
|
|
102
|
+
- 🟢/🟡/🔴 API 可用性状态
|
|
103
|
+
- [Codex]/[Claude] IDE 类型标签
|
|
104
|
+
- 认证模式、环境变量、启动参数
|
|
105
|
+
- 创建时间、最后使用时间
|
|
106
|
+
|
|
107
|
+
#### `akm current`
|
|
108
|
+
显示当前激活的配置
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
akm current
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**显示内容:**
|
|
115
|
+
- 供应商名称和显示名称
|
|
116
|
+
- IDE 类型
|
|
117
|
+
- 认证模式
|
|
118
|
+
- 环境变量设置
|
|
119
|
+
- 启动参数
|
|
120
|
+
- 模型配置
|
|
121
|
+
|
|
122
|
+
#### `akm edit`
|
|
123
|
+
编辑供应商配置
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# 交互式选择要编辑的供应商
|
|
127
|
+
akm edit
|
|
128
|
+
|
|
129
|
+
# 直接编辑指定供应商
|
|
130
|
+
akm edit my-provider
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**可编辑项:**
|
|
134
|
+
- 显示名称
|
|
135
|
+
- 认证令牌
|
|
136
|
+
- 基础 URL
|
|
137
|
+
- 启动参数
|
|
138
|
+
- 模型配置
|
|
139
|
+
|
|
140
|
+
#### `akm remove`
|
|
141
|
+
删除供应商配置
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# 交互式选择要删除的供应商
|
|
145
|
+
akm remove
|
|
146
|
+
|
|
147
|
+
# 直接删除指定供应商
|
|
148
|
+
akm remove my-provider
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 备份与迁移
|
|
152
|
+
|
|
153
|
+
#### `akm export`
|
|
154
|
+
导出配置到文件
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# 导出到默认文件 (akm-config-{timestamp}.json)
|
|
158
|
+
akm export
|
|
159
|
+
|
|
160
|
+
# 导出到指定文件
|
|
161
|
+
akm export my-backup.json
|
|
162
|
+
|
|
163
|
+
# 导出时脱敏 Token(适合分享配置模板)
|
|
164
|
+
akm export template.json --mask
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**导出格式:**
|
|
168
|
+
```json
|
|
169
|
+
{
|
|
170
|
+
"version": "1.0",
|
|
171
|
+
"exportedAt": "2025-12-15T05:30:00.000Z",
|
|
172
|
+
"providers": {
|
|
173
|
+
"my-provider": {
|
|
174
|
+
"name": "my-provider",
|
|
175
|
+
"displayName": "My Provider",
|
|
176
|
+
"ideName": "claude",
|
|
177
|
+
"authMode": "api_key",
|
|
178
|
+
"authToken": "sk-ant-***",
|
|
179
|
+
"baseUrl": "https://api.anthropic.com"
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"currentProvider": "my-provider"
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### `akm import`
|
|
187
|
+
从文件导入配置
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# 导入配置(跳过已存在的供应商)
|
|
191
|
+
akm import my-backup.json
|
|
192
|
+
|
|
193
|
+
# 导入并覆盖已存在的供应商
|
|
194
|
+
akm import my-backup.json --overwrite
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**注意:** 如果导入的配置使用了 `--mask` 脱敏,需要手动编辑 Token。
|
|
198
|
+
|
|
199
|
+
#### `akm backup`
|
|
200
|
+
备份和恢复配置
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# 创建备份(默认保存到 ~/.akm-backups/)
|
|
204
|
+
akm backup
|
|
205
|
+
|
|
206
|
+
# 指定备份目录
|
|
207
|
+
akm backup --dir /path/to/backups
|
|
208
|
+
|
|
209
|
+
# 列出所有备份
|
|
210
|
+
akm backup --list
|
|
211
|
+
|
|
212
|
+
# 从备份恢复
|
|
213
|
+
akm backup --restore akm-backup-2025-12-15T05-30-00.json
|
|
214
|
+
|
|
215
|
+
# 从指定目录的备份恢复
|
|
216
|
+
akm backup --restore backup.json --dir /path/to/backups
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**自动清理:** 默认保留最近 10 个备份,自动删除旧备份。
|
|
220
|
+
|
|
221
|
+
## 🎨 IDE 支持
|
|
222
|
+
|
|
223
|
+
### Claude Code (Anthropic 官方)
|
|
224
|
+
|
|
225
|
+
**认证模式:**
|
|
226
|
+
- **oauth_token** - OAuth 令牌模式(官方推荐)
|
|
227
|
+
- **api_key** - 通用 API 密钥模式
|
|
228
|
+
- **auth_token** - 认证令牌模式
|
|
229
|
+
|
|
230
|
+
**环境变量:**
|
|
231
|
+
- `CLAUDE_CODE_OAUTH_TOKEN` - OAuth 模式
|
|
232
|
+
- `ANTHROPIC_API_KEY` - API Key 模式
|
|
233
|
+
- `ANTHROPIC_AUTH_TOKEN` - Auth Token 模式
|
|
234
|
+
- `ANTHROPIC_BASE_URL` - 自定义 API 端点
|
|
235
|
+
|
|
236
|
+
**启动参数:**
|
|
237
|
+
- `--continue` - 继续上次对话
|
|
238
|
+
- `--dangerously-skip-permissions` - 跳过权限检查(沙盒环境)
|
|
239
|
+
|
|
240
|
+
**配置示例:**
|
|
241
|
+
```bash
|
|
242
|
+
akm add --claude
|
|
243
|
+
# 选择认证模式 -> 输入 Token -> 配置启动参数
|
|
37
244
|
```
|
|
38
245
|
|
|
39
|
-
|
|
246
|
+
### Codex CLI (OpenAI)
|
|
40
247
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
| `akm` | 交互式选择和切换 API 提供商 |
|
|
44
|
-
| `akm add` | 添加新的 API 提供商配置 |
|
|
45
|
-
| `akm list` | 列出所有已保存的配置 |
|
|
46
|
-
| `akm current` | 显示当前激活的配置 |
|
|
47
|
-
| `akm edit <name>` | 编辑指定提供商的配置 |
|
|
48
|
-
| `akm remove <name>` | 删除指定的提供商配置 |
|
|
248
|
+
**认证模式:**
|
|
249
|
+
- 使用 `OPENAI_API_KEY` 和 `OPENAI_BASE_URL` 环境变量
|
|
49
250
|
|
|
50
|
-
|
|
251
|
+
**启动参数:**
|
|
252
|
+
- `resume` - 继续上次对话(子命令)
|
|
253
|
+
- `--full-auto` - 全自动模式(自动批准 + 工作区沙盒)⚠️ 与 `--dangerously-bypass-approvals-and-sandbox` 互斥
|
|
254
|
+
- `--dangerously-bypass-approvals-and-sandbox` - 跳过所有安全检查 ⚠️ 与 `--full-auto` 互斥
|
|
255
|
+
- `--search` - 启用网页搜索
|
|
51
256
|
|
|
52
|
-
|
|
257
|
+
**配置导入:**
|
|
258
|
+
```bash
|
|
259
|
+
akm add --codex
|
|
260
|
+
# 选择 "从 ~/.codex 导入现有配置" 自动读取现有配置
|
|
261
|
+
# 或选择 "手动输入配置" 手动设置
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**配置示例:**
|
|
265
|
+
```bash
|
|
266
|
+
# 方式1:从现有 Codex 配置导入
|
|
267
|
+
akm add --codex
|
|
268
|
+
# -> 选择 "从 ~/.codex 导入现有配置"
|
|
269
|
+
# -> 自动读取 ~/.codex/auth.json 和 config.toml
|
|
53
270
|
|
|
54
|
-
|
|
271
|
+
# 方式2:手动配置
|
|
272
|
+
akm add --codex
|
|
273
|
+
# -> 选择 "手动输入配置"
|
|
274
|
+
# -> 输入 API Key 和 Base URL
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## ⚙️ 配置文件
|
|
278
|
+
|
|
279
|
+
**位置:** `~/.akm-config.json`
|
|
280
|
+
|
|
281
|
+
**完整示例:**
|
|
55
282
|
```json
|
|
56
283
|
{
|
|
57
284
|
"version": "2.0.0",
|
|
58
|
-
"currentProvider": "
|
|
285
|
+
"currentProvider": "my-claude",
|
|
59
286
|
"providers": {
|
|
60
|
-
"claude
|
|
61
|
-
"name": "claude
|
|
62
|
-
"displayName": "Claude Code
|
|
287
|
+
"my-claude": {
|
|
288
|
+
"name": "my-claude",
|
|
289
|
+
"displayName": "Claude Code Official",
|
|
290
|
+
"ideName": "claude",
|
|
63
291
|
"authMode": "oauth_token",
|
|
64
|
-
"authToken": "sk-ant-oat01
|
|
292
|
+
"authToken": "sk-ant-oat01-xxx",
|
|
65
293
|
"baseUrl": null,
|
|
66
294
|
"tokenType": null,
|
|
295
|
+
"launchArgs": ["--continue"],
|
|
67
296
|
"models": {
|
|
68
297
|
"primary": "claude-sonnet-4",
|
|
69
298
|
"smallFast": "claude-haiku-4"
|
|
70
|
-
}
|
|
299
|
+
},
|
|
300
|
+
"createdAt": "2025-12-15T05:00:00.000Z",
|
|
301
|
+
"lastUsed": "2025-12-15T05:30:00.000Z"
|
|
71
302
|
},
|
|
72
|
-
"
|
|
73
|
-
"name": "
|
|
74
|
-
"displayName": "
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
303
|
+
"my-codex": {
|
|
304
|
+
"name": "my-codex",
|
|
305
|
+
"displayName": "Codex CLI",
|
|
306
|
+
"ideName": "codex",
|
|
307
|
+
"authMode": "openai_api_key",
|
|
308
|
+
"authToken": "sk-xxx",
|
|
309
|
+
"baseUrl": "https://api.openai.com",
|
|
310
|
+
"tokenType": null,
|
|
311
|
+
"launchArgs": ["resume", "--full-auto"],
|
|
312
|
+
"createdAt": "2025-12-15T05:00:00.000Z",
|
|
313
|
+
"lastUsed": "2025-12-15T05:25:00.000Z"
|
|
83
314
|
}
|
|
84
315
|
}
|
|
85
316
|
}
|
|
86
317
|
```
|
|
87
318
|
|
|
88
|
-
##
|
|
319
|
+
## 🎯 使用场景
|
|
89
320
|
|
|
90
|
-
###
|
|
91
|
-
- 认证模式:
|
|
92
|
-
- `oauth_token` - OAuth 令牌模式(推荐官方用户)
|
|
93
|
-
- `api_key` - 通用 API 密钥模式(支持 ANTHROPIC_API_KEY 和 ANTHROPIC_AUTH_TOKEN)
|
|
94
|
-
- `auth_token` - 认证令牌模式(仅 ANTHROPIC_AUTH_TOKEN)
|
|
95
|
-
- 环境变量:CLAUDE_CODE_OAUTH_TOKEN、ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_BASE_URL
|
|
321
|
+
### 场景 1: 同时使用多个 API Key
|
|
96
322
|
|
|
97
|
-
|
|
323
|
+
```bash
|
|
324
|
+
# 添加工作账号
|
|
325
|
+
akm add --claude
|
|
326
|
+
# 名称: work
|
|
327
|
+
# 显示名称: Work Account
|
|
328
|
+
# Token: sk-ant-work-xxx
|
|
329
|
+
|
|
330
|
+
# 添加个人账号
|
|
331
|
+
akm add --claude
|
|
332
|
+
# 名称: personal
|
|
333
|
+
# 显示名称: Personal Account
|
|
334
|
+
# Token: sk-ant-personal-xxx
|
|
335
|
+
|
|
336
|
+
# 快速切换
|
|
337
|
+
akm # 选择 work 或 personal
|
|
338
|
+
```
|
|
98
339
|
|
|
99
|
-
|
|
100
|
-
|------|-----|------|
|
|
101
|
-
| **oauth_token** | Claude Code | OAuth 令牌模式 |
|
|
102
|
-
| **api_key** | Claude Code | 标准 API 密钥模式 |
|
|
103
|
-
| **auth_token** | Claude Code | 认证令牌模式 |
|
|
340
|
+
### 场景 2: Claude Code 和 Codex CLI 混合使用
|
|
104
341
|
|
|
105
|
-
|
|
342
|
+
```bash
|
|
343
|
+
# 添加 Claude Code 配置
|
|
344
|
+
akm add --claude
|
|
345
|
+
|
|
346
|
+
# 添加 Codex CLI 配置
|
|
347
|
+
akm add --codex
|
|
348
|
+
|
|
349
|
+
# 查看所有配置(带 IDE 标签)
|
|
350
|
+
akm list
|
|
106
351
|
|
|
107
|
-
|
|
108
|
-
|
|
352
|
+
# 仅切换 Codex 供应商
|
|
353
|
+
akm switch --codex
|
|
354
|
+
|
|
355
|
+
# 仅切换 Claude 供应商
|
|
356
|
+
akm switch --claude
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### 场景 3: 团队配置分享
|
|
360
|
+
|
|
361
|
+
```bash
|
|
362
|
+
# 导出配置模板(脱敏)
|
|
363
|
+
akm export team-template.json --mask
|
|
364
|
+
|
|
365
|
+
# 团队成员导入后编辑 Token
|
|
366
|
+
akm import team-template.json
|
|
367
|
+
akm edit my-provider # 设置自己的 Token
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### 场景 4: 配置迁移
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
# 旧机器:导出配置
|
|
374
|
+
akm export my-config.json
|
|
375
|
+
|
|
376
|
+
# 新机器:导入配置
|
|
377
|
+
akm import my-config.json
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### 场景 5: 定期备份
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
# 创建备份
|
|
384
|
+
akm backup
|
|
385
|
+
|
|
386
|
+
# 查看备份列表
|
|
387
|
+
akm backup --list
|
|
388
|
+
|
|
389
|
+
# 恢复到某个备份
|
|
390
|
+
akm backup --restore akm-backup-2025-12-15T05-30-00.json
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## ⚠️ 参数互斥说明
|
|
394
|
+
|
|
395
|
+
某些参数不能同时使用,akm 会自动检测并提示:
|
|
396
|
+
|
|
397
|
+
**Codex CLI:**
|
|
398
|
+
- `--full-auto` ⚔️ `--dangerously-bypass-approvals-and-sandbox`
|
|
399
|
+
|
|
400
|
+
如果同时选择互斥参数,会显示警告并要求重新选择。
|
|
401
|
+
|
|
402
|
+
## ⌨️ 快捷键
|
|
403
|
+
|
|
404
|
+
- **↑/↓** - 上下导航
|
|
405
|
+
- **Space** - 切换选中(多选)
|
|
406
|
+
- **Enter** - 确认
|
|
407
|
+
- **ESC** - 返回上级菜单 / 取消操作
|
|
109
408
|
- **Ctrl+C** - 退出程序
|
|
110
409
|
|
|
111
|
-
## 系统要求
|
|
410
|
+
## 🔧 系统要求
|
|
112
411
|
|
|
113
412
|
- Node.js >= 14.0.0
|
|
114
413
|
- macOS / Linux / Windows
|
|
115
414
|
|
|
116
|
-
##
|
|
415
|
+
## 📝 更新日志
|
|
416
|
+
|
|
417
|
+
### v1.0.27 (最新)
|
|
418
|
+
- ✨ 新增参数互斥校验
|
|
419
|
+
- ✨ 新增 `export` / `import` / `backup` 命令
|
|
420
|
+
- 🧪 测试覆盖率提升 46%
|
|
421
|
+
|
|
422
|
+
### v1.0.26
|
|
423
|
+
- ✨ Codex 添加 `resume` 子命令支持
|
|
424
|
+
|
|
425
|
+
### v1.0.25
|
|
426
|
+
- 🐛 修复 Codex 启动参数
|
|
427
|
+
|
|
428
|
+
### v1.0.23
|
|
429
|
+
- ✨ list 和 switch 命令显示 IDE 类型标签
|
|
430
|
+
|
|
431
|
+
### v1.0.22
|
|
432
|
+
- ✨ 完整的 Codex CLI 支持优化
|
|
433
|
+
|
|
434
|
+
## 🤝 贡献
|
|
435
|
+
|
|
436
|
+
欢迎提交 Issue 和 Pull Request!
|
|
437
|
+
|
|
438
|
+
## 📄 许可证
|
|
439
|
+
|
|
440
|
+
MIT License
|
|
441
|
+
|
|
442
|
+
## 🔗 链接
|
|
117
443
|
|
|
118
|
-
|
|
444
|
+
- **GitHub**: https://github.com/pikecode/api-key-manager
|
|
445
|
+
- **NPM**: https://www.npmjs.com/package/@pikecode/api-key-manager
|
|
446
|
+
- **Issues**: https://github.com/pikecode/api-key-manager/issues
|
|
119
447
|
|
|
120
|
-
|
|
448
|
+
---
|
|
121
449
|
|
|
122
|
-
|
|
123
|
-
- NPM: https://www.npmjs.com/package/@pikecode/api-key-manager
|
|
450
|
+
Made with ❤️ by [pikecode](https://github.com/pikecode)
|
package/package.json
CHANGED
package/src/commands/switch.js
CHANGED
|
@@ -1325,27 +1325,32 @@ class EnvSwitcher extends BaseCommand {
|
|
|
1325
1325
|
this.showManageMenu();
|
|
1326
1326
|
}, '取消编辑');
|
|
1327
1327
|
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1328
|
+
// 根据 IDE 类型构建不同的问卷
|
|
1329
|
+
const isCodex = provider.ideName === 'codex';
|
|
1330
|
+
const questions = [
|
|
1331
|
+
{
|
|
1332
|
+
type: 'input',
|
|
1333
|
+
name: 'name',
|
|
1334
|
+
message: '请输入供应商名称 (用于命令行):',
|
|
1335
|
+
default: provider.name,
|
|
1336
|
+
validate: (input) => {
|
|
1337
|
+
const error = validator.validateName(input);
|
|
1338
|
+
if (error) return error;
|
|
1339
|
+
return true;
|
|
1340
|
+
}
|
|
1341
|
+
},
|
|
1342
|
+
{
|
|
1343
|
+
type: 'input',
|
|
1344
|
+
name: 'displayName',
|
|
1345
|
+
message: '显示名称:',
|
|
1346
|
+
default: provider.displayName,
|
|
1347
|
+
prefillDefault: true
|
|
1348
|
+
}
|
|
1349
|
+
];
|
|
1350
|
+
|
|
1351
|
+
// Claude Code 特定的字段
|
|
1352
|
+
if (!isCodex) {
|
|
1353
|
+
questions.push(
|
|
1349
1354
|
{
|
|
1350
1355
|
type: 'list',
|
|
1351
1356
|
name: 'authMode',
|
|
@@ -1368,33 +1373,6 @@ class EnvSwitcher extends BaseCommand {
|
|
|
1368
1373
|
default: provider.tokenType || 'api_key',
|
|
1369
1374
|
when: (answers) => answers.authMode === 'api_key'
|
|
1370
1375
|
},
|
|
1371
|
-
{
|
|
1372
|
-
type: 'input',
|
|
1373
|
-
name: 'baseUrl',
|
|
1374
|
-
message: '基础URL:',
|
|
1375
|
-
default: provider.baseUrl,
|
|
1376
|
-
prefillDefault: true,
|
|
1377
|
-
when: (answers) => answers.authMode === 'api_key' || answers.authMode === 'auth_token'
|
|
1378
|
-
},
|
|
1379
|
-
{
|
|
1380
|
-
type: 'input',
|
|
1381
|
-
name: 'authToken',
|
|
1382
|
-
message: (answers) => {
|
|
1383
|
-
switch (answers.authMode) {
|
|
1384
|
-
case 'api_key':
|
|
1385
|
-
const tokenTypeLabel = answers.tokenType === 'auth_token' ? 'ANTHROPIC_AUTH_TOKEN' : 'ANTHROPIC_API_KEY';
|
|
1386
|
-
return `Token (${tokenTypeLabel}):`;
|
|
1387
|
-
case 'auth_token':
|
|
1388
|
-
return '认证令牌 (ANTHROPIC_AUTH_TOKEN):';
|
|
1389
|
-
case 'oauth_token':
|
|
1390
|
-
return 'OAuth令牌 (CLAUDE_CODE_OAUTH_TOKEN):';
|
|
1391
|
-
default:
|
|
1392
|
-
return '认证令牌:';
|
|
1393
|
-
}
|
|
1394
|
-
},
|
|
1395
|
-
default: provider.authToken,
|
|
1396
|
-
prefillDefault: true
|
|
1397
|
-
},
|
|
1398
1376
|
{
|
|
1399
1377
|
type: 'input',
|
|
1400
1378
|
name: 'primaryModel',
|
|
@@ -1421,7 +1399,44 @@ class EnvSwitcher extends BaseCommand {
|
|
|
1421
1399
|
return true;
|
|
1422
1400
|
}
|
|
1423
1401
|
}
|
|
1424
|
-
|
|
1402
|
+
);
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
// 通用字段(Claude 和 Codex 都需要)
|
|
1406
|
+
questions.push({
|
|
1407
|
+
type: 'input',
|
|
1408
|
+
name: 'baseUrl',
|
|
1409
|
+
message: isCodex ? '基础URL (OPENAI_BASE_URL):' : '基础URL:',
|
|
1410
|
+
default: provider.baseUrl,
|
|
1411
|
+
prefillDefault: true
|
|
1412
|
+
});
|
|
1413
|
+
|
|
1414
|
+
questions.push({
|
|
1415
|
+
type: 'input',
|
|
1416
|
+
name: 'authToken',
|
|
1417
|
+
message: (answers) => {
|
|
1418
|
+
if (isCodex) {
|
|
1419
|
+
return 'API Key (OPENAI_API_KEY):';
|
|
1420
|
+
}
|
|
1421
|
+
switch (answers.authMode) {
|
|
1422
|
+
case 'api_key':
|
|
1423
|
+
const tokenTypeLabel = answers.tokenType === 'auth_token' ? 'ANTHROPIC_AUTH_TOKEN' : 'ANTHROPIC_API_KEY';
|
|
1424
|
+
return `Token (${tokenTypeLabel}):`;
|
|
1425
|
+
case 'auth_token':
|
|
1426
|
+
return '认证令牌 (ANTHROPIC_AUTH_TOKEN):';
|
|
1427
|
+
case 'oauth_token':
|
|
1428
|
+
return 'OAuth令牌 (CLAUDE_CODE_OAUTH_TOKEN):';
|
|
1429
|
+
default:
|
|
1430
|
+
return '认证令牌:';
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1433
|
+
default: provider.authToken,
|
|
1434
|
+
prefillDefault: true
|
|
1435
|
+
});
|
|
1436
|
+
|
|
1437
|
+
let answers;
|
|
1438
|
+
try {
|
|
1439
|
+
answers = await this.prompt(questions);
|
|
1425
1440
|
} catch (error) {
|
|
1426
1441
|
this.removeESCListener(escListener);
|
|
1427
1442
|
if (this.isEscCancelled(error)) {
|
|
@@ -1462,17 +1477,24 @@ class EnvSwitcher extends BaseCommand {
|
|
|
1462
1477
|
provider.displayName = answers.displayName || newName;
|
|
1463
1478
|
provider.baseUrl = answers.baseUrl;
|
|
1464
1479
|
provider.authToken = answers.authToken;
|
|
1465
|
-
provider.authMode = answers.authMode;
|
|
1466
|
-
if (answers.tokenType) {
|
|
1467
|
-
provider.tokenType = answers.tokenType; // 仅在 authMode 为 'api_key' 时使用
|
|
1468
|
-
}
|
|
1469
1480
|
|
|
1470
|
-
//
|
|
1471
|
-
if (!
|
|
1472
|
-
provider.
|
|
1481
|
+
// Claude Code 特定的更新
|
|
1482
|
+
if (!isCodex) {
|
|
1483
|
+
provider.authMode = answers.authMode;
|
|
1484
|
+
if (answers.tokenType) {
|
|
1485
|
+
provider.tokenType = answers.tokenType; // 仅在 authMode 为 'api_key' 时使用
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
// 更新模型配置
|
|
1489
|
+
if (!provider.models) {
|
|
1490
|
+
provider.models = {};
|
|
1491
|
+
}
|
|
1492
|
+
provider.models.primary = answers.primaryModel || null;
|
|
1493
|
+
provider.models.smallFast = answers.smallFastModel || null;
|
|
1473
1494
|
}
|
|
1474
|
-
|
|
1475
|
-
|
|
1495
|
+
|
|
1496
|
+
// 确保 ideName 不被改变
|
|
1497
|
+
provider.ideName = isCodex ? 'codex' : 'claude';
|
|
1476
1498
|
|
|
1477
1499
|
await this.configManager.save();
|
|
1478
1500
|
Logger.success(`供应商 '${newName}' 已更新`);
|