aihezu 2.8.11 → 2.8.12
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/commands/config.js +5 -1
- package/commands/install.js +5 -1
- package/commands/usage.js +2 -22
- package/lib/url.js +32 -0
- package/package.json +1 -1
- package/services/claude.js +1 -2
- package/services/codex.js +1 -2
package/commands/config.js
CHANGED
|
@@ -2,6 +2,7 @@ const readline = require('readline');
|
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const fs = require('fs');
|
|
4
4
|
const { askQuestion } = require('../lib/prompts');
|
|
5
|
+
const { stripBaseSuffix } = require('../lib/url');
|
|
5
6
|
|
|
6
7
|
// Helper to extract value from args like --api=xxx or --api xxx
|
|
7
8
|
function getArgValue(args, keys) {
|
|
@@ -59,7 +60,10 @@ async function configCommand(service, args = []) {
|
|
|
59
60
|
apiUrl = 'https://' + apiUrl;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
//
|
|
63
|
+
// 兼容老用户输入:剥离 base_url 末尾的 /api 或 /openai 后缀
|
|
64
|
+
apiUrl = stripBaseSuffix(apiUrl);
|
|
65
|
+
|
|
66
|
+
// gemini 仍然需要保留 /gemini 后缀
|
|
63
67
|
const suffix = service.apiSuffix || '';
|
|
64
68
|
if (suffix) {
|
|
65
69
|
try {
|
package/commands/install.js
CHANGED
|
@@ -4,6 +4,7 @@ const fs = require('fs');
|
|
|
4
4
|
const { modifyHostsFile } = require('../lib/hosts');
|
|
5
5
|
const { cleanCache } = require('../lib/cache');
|
|
6
6
|
const { askQuestion } = require('../lib/prompts');
|
|
7
|
+
const { stripBaseSuffix } = require('../lib/url');
|
|
7
8
|
const platform = require('../lib/platform');
|
|
8
9
|
|
|
9
10
|
// Helper to extract value from args like --api=xxx or --api xxx
|
|
@@ -60,7 +61,10 @@ async function installCommand(service, args = []) {
|
|
|
60
61
|
apiUrl = 'https://' + apiUrl;
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
//
|
|
64
|
+
// 兼容老用户输入:剥离 base_url 末尾的 /api 或 /openai 后缀
|
|
65
|
+
apiUrl = stripBaseSuffix(apiUrl);
|
|
66
|
+
|
|
67
|
+
// gemini 仍然需要保留 /gemini 后缀
|
|
64
68
|
const suffix = service.apiSuffix || '';
|
|
65
69
|
if (suffix) {
|
|
66
70
|
try {
|
package/commands/usage.js
CHANGED
|
@@ -2,6 +2,7 @@ const fs = require('fs');
|
|
|
2
2
|
const os = require('os');
|
|
3
3
|
const path = require('path');
|
|
4
4
|
const { getJson } = require('../lib/http');
|
|
5
|
+
const { stripBaseSuffix } = require('../lib/url');
|
|
5
6
|
const platform = require('../lib/platform');
|
|
6
7
|
|
|
7
8
|
function normalizeHttpUrl(url) {
|
|
@@ -296,28 +297,7 @@ function usageHint(current, limit) {
|
|
|
296
297
|
}
|
|
297
298
|
|
|
298
299
|
function getUsageApiBase(baseUrl) {
|
|
299
|
-
|
|
300
|
-
// - Codex base_url 常见格式 https://xxx/openai
|
|
301
|
-
// - 部分用户 base_url 为 https://xxx/api
|
|
302
|
-
// - Claude 默认 base_url 不带后缀,等价于 no-op
|
|
303
|
-
const stripSuffix = (pathname) => {
|
|
304
|
-
let p = pathname.replace(/\/+$/, '');
|
|
305
|
-
const lower = p.toLowerCase();
|
|
306
|
-
if (lower.endsWith('/openai')) {
|
|
307
|
-
p = p.slice(0, -'/openai'.length);
|
|
308
|
-
} else if (lower.endsWith('/api')) {
|
|
309
|
-
p = p.slice(0, -'/api'.length);
|
|
310
|
-
}
|
|
311
|
-
return p;
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
try {
|
|
315
|
-
const url = new URL(baseUrl);
|
|
316
|
-
const pathname = stripSuffix(url.pathname);
|
|
317
|
-
return `${url.origin}${pathname}`;
|
|
318
|
-
} catch (error) {
|
|
319
|
-
return stripSuffix(baseUrl.replace(/\/+$/, ''));
|
|
320
|
-
}
|
|
300
|
+
return stripBaseSuffix(baseUrl);
|
|
321
301
|
}
|
|
322
302
|
|
|
323
303
|
async function queryUnifiedUsage(baseUrl, authToken) {
|
package/lib/url.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// 剥离 base_url 末尾的 /api 或 /openai 后缀
|
|
2
|
+
// - Claude 历史 base_url 形如 https://xxx/api
|
|
3
|
+
// - Codex 历史 base_url 形如 https://xxx/openai
|
|
4
|
+
// - 新版后端统一不需要这些后缀
|
|
5
|
+
function stripBaseSuffix(baseUrl) {
|
|
6
|
+
if (!baseUrl) return baseUrl;
|
|
7
|
+
|
|
8
|
+
const trimSuffix = (pathname) => {
|
|
9
|
+
let p = pathname.replace(/\/+$/, '');
|
|
10
|
+
const lower = p.toLowerCase();
|
|
11
|
+
if (lower.endsWith('/openai')) {
|
|
12
|
+
p = p.slice(0, -'/openai'.length);
|
|
13
|
+
} else if (lower.endsWith('/api')) {
|
|
14
|
+
p = p.slice(0, -'/api'.length);
|
|
15
|
+
}
|
|
16
|
+
return p;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
const url = new URL(baseUrl);
|
|
21
|
+
url.pathname = trimSuffix(url.pathname);
|
|
22
|
+
// URL 对象在 pathname 为空时会输出 "/",去掉末尾斜杠保持简洁
|
|
23
|
+
const result = url.toString().replace(/\/+$/, '');
|
|
24
|
+
return result;
|
|
25
|
+
} catch (error) {
|
|
26
|
+
return trimSuffix(String(baseUrl).replace(/\/+$/, ''));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = {
|
|
31
|
+
stripBaseSuffix,
|
|
32
|
+
};
|
package/package.json
CHANGED
package/services/claude.js
CHANGED
|
@@ -10,8 +10,7 @@ const settingsPath = path.join(configDir, 'settings.json');
|
|
|
10
10
|
module.exports = {
|
|
11
11
|
name: 'claude',
|
|
12
12
|
displayName: 'Claude Code',
|
|
13
|
-
defaultApiUrl: 'https://code.aihezu.top
|
|
14
|
-
apiSuffix: '/api',
|
|
13
|
+
defaultApiUrl: 'https://code.aihezu.top',
|
|
15
14
|
|
|
16
15
|
// Cache cleaning configuration
|
|
17
16
|
cacheConfig: {
|
package/services/codex.js
CHANGED
|
@@ -11,8 +11,7 @@ const authPath = path.join(configDir, 'auth.json');
|
|
|
11
11
|
module.exports = {
|
|
12
12
|
name: 'codex',
|
|
13
13
|
displayName: 'Codex',
|
|
14
|
-
defaultApiUrl: 'https://cc.aihezu.dev
|
|
15
|
-
apiSuffix: '/openai',
|
|
14
|
+
defaultApiUrl: 'https://cc.aihezu.dev',
|
|
16
15
|
|
|
17
16
|
// Cache cleaning configuration (minimal for Codex usually)
|
|
18
17
|
cacheConfig: {
|