@pikecode/api-key-manager 1.0.3 → 1.0.5
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 +38 -10
- package/package.json +1 -1
- package/src/commands/add.js +31 -5
- package/src/config.js +1 -0
- package/src/utils/env-launcher.js +46 -20
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
- 🎯 **灵活配置** - 支持多种认证模式(API Key、Auth Token、OAuth)
|
|
11
11
|
- 🚀 **开箱即用** - 无需复杂配置
|
|
12
12
|
- 💾 **环境变量管理** - 自动设置和管理环境变量
|
|
13
|
+
- 🛠️ **多 IDE 支持** - 支持 Claude Code 和 Codex
|
|
13
14
|
|
|
14
15
|
## 安装
|
|
15
16
|
|
|
@@ -54,29 +55,56 @@ akm list
|
|
|
54
55
|
示例配置结构:
|
|
55
56
|
```json
|
|
56
57
|
{
|
|
57
|
-
"version": "
|
|
58
|
+
"version": "1.0.0",
|
|
58
59
|
"currentProvider": "provider-name",
|
|
59
60
|
"providers": {
|
|
60
|
-
"provider
|
|
61
|
-
"name": "provider
|
|
62
|
-
"displayName": "Provider
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
61
|
+
"claude-provider": {
|
|
62
|
+
"name": "claude-provider",
|
|
63
|
+
"displayName": "Claude Code Provider",
|
|
64
|
+
"ideName": "claude",
|
|
65
|
+
"authMode": "oauth_token",
|
|
66
|
+
"authToken": "sk-ant-oat01-...",
|
|
67
|
+
"baseUrl": null,
|
|
68
|
+
"tokenType": null,
|
|
66
69
|
"models": {
|
|
67
70
|
"primary": "claude-sonnet-4",
|
|
68
71
|
"smallFast": "claude-haiku-4"
|
|
69
72
|
}
|
|
73
|
+
},
|
|
74
|
+
"codex-provider": {
|
|
75
|
+
"name": "codex-provider",
|
|
76
|
+
"displayName": "Codex Provider",
|
|
77
|
+
"ideName": "codex",
|
|
78
|
+
"authMode": "api_key",
|
|
79
|
+
"authToken": "your-codex-api-key",
|
|
80
|
+
"baseUrl": "https://api.example.com",
|
|
81
|
+
"tokenType": "api_key",
|
|
82
|
+
"models": {
|
|
83
|
+
"primary": "gpt-4-turbo",
|
|
84
|
+
"smallFast": null
|
|
85
|
+
}
|
|
70
86
|
}
|
|
71
87
|
}
|
|
72
88
|
}
|
|
73
89
|
```
|
|
74
90
|
|
|
91
|
+
## 支持的 IDE
|
|
92
|
+
|
|
93
|
+
- **Claude Code** - Anthropic 官方代码编辑器
|
|
94
|
+
- 认证模式:oauth_token、api_key、auth_token
|
|
95
|
+
- 环境变量:CLAUDE_CODE_OAUTH_TOKEN、ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN
|
|
96
|
+
|
|
97
|
+
- **Codex** - 代码生成和编辑工具
|
|
98
|
+
- 认证模式:api_key、auth_token
|
|
99
|
+
- 环境变量:CODEX_API_KEY、CODEX_API_BASE、CODEX_MODEL
|
|
100
|
+
|
|
75
101
|
## 支持的认证模式
|
|
76
102
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
103
|
+
| 模式 | IDE | 说明 |
|
|
104
|
+
|------|-----|------|
|
|
105
|
+
| **oauth_token** | Claude Code | OAuth 令牌模式 |
|
|
106
|
+
| **api_key** | Claude Code / Codex | 标准 API 密钥模式 |
|
|
107
|
+
| **auth_token** | Claude Code / Codex | 认证令牌模式 |
|
|
80
108
|
|
|
81
109
|
## 快捷键
|
|
82
110
|
|
package/package.json
CHANGED
package/src/commands/add.js
CHANGED
|
@@ -196,13 +196,38 @@ class ProviderAdder extends BaseCommand {
|
|
|
196
196
|
},
|
|
197
197
|
{
|
|
198
198
|
type: 'list',
|
|
199
|
-
name: '
|
|
200
|
-
message: '
|
|
199
|
+
name: 'ideName',
|
|
200
|
+
message: '选择要使用的 IDE:',
|
|
201
201
|
choices: [
|
|
202
|
-
{ name: '
|
|
203
|
-
{ name: '
|
|
204
|
-
{ name: '🌐 OAuth令牌模式 (CLAUDE_CODE_OAUTH_TOKEN) - 适用于官方Claude Code', value: 'oauth_token' }
|
|
202
|
+
{ name: '🚀 Claude Code - Anthropic 官方代码编辑器', value: 'claude' },
|
|
203
|
+
{ name: '⚙️ Codex - 代码生成和编辑工具', value: 'codex' }
|
|
205
204
|
],
|
|
205
|
+
default: 'claude'
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
type: 'list',
|
|
209
|
+
name: 'authMode',
|
|
210
|
+
message: (answers) => {
|
|
211
|
+
if (answers.ideName === 'codex') {
|
|
212
|
+
return '选择 Codex 认证模式:';
|
|
213
|
+
}
|
|
214
|
+
return '选择 Claude Code 认证模式:';
|
|
215
|
+
},
|
|
216
|
+
choices: (answers) => {
|
|
217
|
+
if (answers.ideName === 'codex') {
|
|
218
|
+
// Codex 的认证模式选择
|
|
219
|
+
return [
|
|
220
|
+
{ name: '🔑 API 密钥模式 - 使用 CODEX_API_KEY', value: 'api_key' },
|
|
221
|
+
{ name: '🔐 认证令牌模式 - 使用认证令牌', value: 'auth_token' }
|
|
222
|
+
];
|
|
223
|
+
}
|
|
224
|
+
// Claude Code 的认证模式选择
|
|
225
|
+
return [
|
|
226
|
+
{ name: '🔑 通用API密钥模式 - 支持 ANTHROPIC_API_KEY 和 ANTHROPIC_AUTH_TOKEN', value: 'api_key' },
|
|
227
|
+
{ name: '🔐 认证令牌模式 (仅 ANTHROPIC_AUTH_TOKEN) - 适用于某些服务商', value: 'auth_token' },
|
|
228
|
+
{ name: '🌐 OAuth令牌模式 (CLAUDE_CODE_OAUTH_TOKEN) - 适用于官方Claude Code', value: 'oauth_token' }
|
|
229
|
+
];
|
|
230
|
+
},
|
|
206
231
|
default: 'api_key'
|
|
207
232
|
},
|
|
208
233
|
{
|
|
@@ -316,6 +341,7 @@ class ProviderAdder extends BaseCommand {
|
|
|
316
341
|
|
|
317
342
|
await this.configManager.addProvider(answers.name, {
|
|
318
343
|
displayName: answers.displayName || answers.name,
|
|
344
|
+
ideName: answers.ideName, // 'claude' 或 'codex'
|
|
319
345
|
baseUrl: answers.baseUrl,
|
|
320
346
|
authToken: answers.authToken,
|
|
321
347
|
authMode: answers.authMode,
|
package/src/config.js
CHANGED
|
@@ -143,6 +143,7 @@ class ConfigManager {
|
|
|
143
143
|
this.config.providers[name] = {
|
|
144
144
|
name,
|
|
145
145
|
displayName: providerConfig.displayName || name,
|
|
146
|
+
ideName: providerConfig.ideName || 'claude', // 'claude' 或 'codex'
|
|
146
147
|
baseUrl: providerConfig.baseUrl,
|
|
147
148
|
authToken: providerConfig.authToken,
|
|
148
149
|
authMode: providerConfig.authMode || 'api_key',
|
|
@@ -24,29 +24,51 @@ function clearTerminal() {
|
|
|
24
24
|
function buildEnvVariables(config) {
|
|
25
25
|
const env = { ...process.env };
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
// Claude Code 配置
|
|
28
|
+
if (config.ideName === 'claude' || !config.ideName) {
|
|
29
|
+
if (config.authMode === 'oauth_token') {
|
|
30
|
+
env.CLAUDE_CODE_OAUTH_TOKEN = config.authToken;
|
|
31
|
+
} else if (config.authMode === 'api_key') {
|
|
32
|
+
env.ANTHROPIC_BASE_URL = config.baseUrl;
|
|
33
|
+
// 根据 tokenType 选择设置哪种 token
|
|
34
|
+
if (config.tokenType === 'auth_token') {
|
|
35
|
+
env.ANTHROPIC_AUTH_TOKEN = config.authToken;
|
|
36
|
+
} else {
|
|
37
|
+
// 默认使用 ANTHROPIC_API_KEY
|
|
38
|
+
env.ANTHROPIC_API_KEY = config.authToken;
|
|
39
|
+
}
|
|
34
40
|
} else {
|
|
35
|
-
//
|
|
36
|
-
env.
|
|
41
|
+
// auth_token 模式
|
|
42
|
+
env.ANTHROPIC_BASE_URL = config.baseUrl;
|
|
43
|
+
env.ANTHROPIC_AUTH_TOKEN = config.authToken;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (config.models && config.models.primary) {
|
|
47
|
+
env.ANTHROPIC_MODEL = config.models.primary;
|
|
37
48
|
}
|
|
38
|
-
} else {
|
|
39
|
-
// auth_token 模式
|
|
40
|
-
env.ANTHROPIC_BASE_URL = config.baseUrl;
|
|
41
|
-
env.ANTHROPIC_AUTH_TOKEN = config.authToken;
|
|
42
|
-
}
|
|
43
49
|
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
if (config.models && config.models.smallFast) {
|
|
51
|
+
env.ANTHROPIC_SMALL_FAST_MODEL = config.models.smallFast;
|
|
52
|
+
}
|
|
46
53
|
}
|
|
47
54
|
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
// Codex 配置
|
|
56
|
+
if (config.ideName === 'codex') {
|
|
57
|
+
// Codex 使用环境变量来传递 API 密钥和配置
|
|
58
|
+
if (config.authMode === 'api_key' || config.authMode === 'auth_token') {
|
|
59
|
+
// Codex 支持通过环境变量设置 API 密钥
|
|
60
|
+
env.CODEX_API_KEY = config.authToken;
|
|
61
|
+
|
|
62
|
+
// 如果指定了基础 URL(用于自定义 API 端点)
|
|
63
|
+
if (config.baseUrl) {
|
|
64
|
+
env.CODEX_API_BASE = config.baseUrl;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Codex 模型配置
|
|
69
|
+
if (config.models && config.models.primary) {
|
|
70
|
+
env.CODEX_MODEL = config.models.primary;
|
|
71
|
+
}
|
|
50
72
|
}
|
|
51
73
|
|
|
52
74
|
return env;
|
|
@@ -58,8 +80,12 @@ async function executeWithEnv(config, launchArgs = []) {
|
|
|
58
80
|
|
|
59
81
|
clearTerminal();
|
|
60
82
|
|
|
83
|
+
// 确定要启动的命令(claude 或 codex)
|
|
84
|
+
const command = config.ideName === 'codex' ? 'codex' : 'claude';
|
|
85
|
+
const description = config.ideName === 'codex' ? 'Codex' : 'Claude Code';
|
|
86
|
+
|
|
61
87
|
return new Promise((resolve, reject) => {
|
|
62
|
-
const child = spawn(
|
|
88
|
+
const child = spawn(command, args, {
|
|
63
89
|
stdio: 'inherit',
|
|
64
90
|
env,
|
|
65
91
|
shell: true
|
|
@@ -69,7 +95,7 @@ async function executeWithEnv(config, launchArgs = []) {
|
|
|
69
95
|
if (code === 0) {
|
|
70
96
|
resolve();
|
|
71
97
|
} else {
|
|
72
|
-
reject(new Error(
|
|
98
|
+
reject(new Error(`${description} 退出,代码: ${code}`));
|
|
73
99
|
}
|
|
74
100
|
});
|
|
75
101
|
|