@pikecode/api-key-manager 1.0.4 → 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 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": "2.0.0",
58
+ "version": "1.0.0",
58
59
  "currentProvider": "provider-name",
59
60
  "providers": {
60
- "provider-name": {
61
- "name": "provider-name",
62
- "displayName": "Provider Name",
63
- "authMode": "api_key",
64
- "authToken": "your-token",
65
- "tokenType": "api_key",
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
- - **api_key** - 标准 API 密钥模式
78
- - **auth_token** - 认证令牌模式
79
- - **oauth_token** - OAuth 令牌模式
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pikecode/api-key-manager",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "A CLI tool for managing and switching multiple API provider configurations",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -196,13 +196,38 @@ class ProviderAdder extends BaseCommand {
196
196
  },
197
197
  {
198
198
  type: 'list',
199
- name: 'authMode',
200
- message: '选择认证模式:',
199
+ name: 'ideName',
200
+ message: '选择要使用的 IDE:',
201
201
  choices: [
202
- { name: '🔑 通用API密钥模式 - 支持 ANTHROPIC_API_KEY 和 ANTHROPIC_AUTH_TOKEN', value: 'api_key' },
203
- { name: '🔐 认证令牌模式 (仅 ANTHROPIC_AUTH_TOKEN) - 适用于某些服务商', value: 'auth_token' },
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
- if (config.authMode === 'oauth_token') {
28
- env.CLAUDE_CODE_OAUTH_TOKEN = config.authToken;
29
- } else if (config.authMode === 'api_key') {
30
- env.ANTHROPIC_BASE_URL = config.baseUrl;
31
- // 根据 tokenType 选择设置哪种 token
32
- if (config.tokenType === 'auth_token') {
33
- env.ANTHROPIC_AUTH_TOKEN = config.authToken;
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
- // 默认使用 ANTHROPIC_API_KEY
36
- env.ANTHROPIC_API_KEY = config.authToken;
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
- if (config.models && config.models.primary) {
45
- env.ANTHROPIC_MODEL = config.models.primary;
50
+ if (config.models && config.models.smallFast) {
51
+ env.ANTHROPIC_SMALL_FAST_MODEL = config.models.smallFast;
52
+ }
46
53
  }
47
54
 
48
- if (config.models && config.models.smallFast) {
49
- env.ANTHROPIC_SMALL_FAST_MODEL = config.models.smallFast;
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('claude', args, {
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(`Claude Code 退出,代码: ${code}`));
98
+ reject(new Error(`${description} 退出,代码: ${code}`));
73
99
  }
74
100
  });
75
101