aixxai 1.5.4 → 1.5.6
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 +5 -0
- package/bin/aixx.js +56 -26
- package/package.json +1 -1
- package/src/commands/help.js +2 -0
- package/src/commands/install.js +40 -3
- package/src/commands/installed.js +62 -0
- package/src/commands/search.js +96 -0
- package/aixxai-1.5.2.tgz +0 -0
- package/aixxai-1.5.3.tgz +0 -0
package/README.md
CHANGED
|
@@ -19,8 +19,13 @@ npx aixxai install zhangsan
|
|
|
19
19
|
| 命令 | 说明 |
|
|
20
20
|
|---|---|
|
|
21
21
|
| `aixx install [推荐码]` | 安装AIXX skill到本地agent |
|
|
22
|
+
| `aixx search <关键词>` | 搜索AIXX能力库(数据/技能,免key) |
|
|
23
|
+
| `aixx installed` | 查看安装状态(skill/账号/版本) |
|
|
22
24
|
| `aixx config` | 查看当前配置 |
|
|
23
25
|
| `aixx test` | 测试AIXX连通性+调用模型 |
|
|
26
|
+
| `aixx balance` | 查询账户余额(还剩多少钱) |
|
|
27
|
+
| `aixx models` | 列出可用模型(国产/海外分组) |
|
|
28
|
+
| `aixx recharge [金额]` | 充值引导(默认$5) |
|
|
24
29
|
| `aixx --version` | 查看版本 |
|
|
25
30
|
| `aixx --help` | 帮助 |
|
|
26
31
|
|
package/bin/aixx.js
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
*
|
|
7
7
|
* 用法:
|
|
8
8
|
* npx aixxai install [推荐码] 安装AIXX skill到本地agent(含零配置)
|
|
9
|
+
* npx aixxai install --yes 非交互安装(脚本/CI用,跳过确认)
|
|
10
|
+
* npx aixxai search <关键词> 搜索AIXX能力库(数据/技能,免key)
|
|
11
|
+
* npx aixxai installed 查看安装状态(skill/账号/版本)
|
|
9
12
|
* npx aixxai config 配置/查看AIXX
|
|
10
13
|
* npx aixxai test 测试AIXX是否可用
|
|
11
14
|
* npx aixxai balance 查询账户余额
|
|
@@ -18,6 +21,8 @@ import { readFileSync } from 'fs';
|
|
|
18
21
|
import { fileURLToPath } from 'url';
|
|
19
22
|
import { dirname, join } from 'path';
|
|
20
23
|
import { install } from '../src/commands/install.js';
|
|
24
|
+
import { search } from '../src/commands/search.js';
|
|
25
|
+
import { installed } from '../src/commands/installed.js';
|
|
21
26
|
import { config } from '../src/commands/config.js';
|
|
22
27
|
import { test } from '../src/commands/test.js';
|
|
23
28
|
import { balance } from '../src/commands/balance.js';
|
|
@@ -35,38 +40,57 @@ const VERSION = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), '
|
|
|
35
40
|
// 改完后请全局搜索 "安全警告" 同步更新 env.js 与 templates/QUICKSTART.md 中的同名地址。
|
|
36
41
|
export const DEFAULT_BASE_URL = 'https://baodan.run/v1';
|
|
37
42
|
|
|
43
|
+
// 命令表:所有子命令的单一来源(新增命令在这里加一行即可)。
|
|
44
|
+
// 未知命令的"你想用的是不是"近似匹配也从这张表取已知命令名,不另写一份。
|
|
45
|
+
const COMMANDS = [
|
|
46
|
+
{ name: 'install', aliases: ['i'], run: install },
|
|
47
|
+
{ name: 'search', run: search },
|
|
48
|
+
{ name: 'installed', run: installed },
|
|
49
|
+
{ name: 'config', aliases: ['c'], run: config },
|
|
50
|
+
{ name: 'test', aliases: ['t'], run: test },
|
|
51
|
+
{ name: 'balance', aliases: ['b'], run: balance },
|
|
52
|
+
{ name: 'models', aliases: ['m'], run: models },
|
|
53
|
+
{ name: 'recharge', aliases: ['r'], run: recharge },
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
// help/version 不吃子参数(走 flag/无参分支),但命令名仍参与下面的近似匹配
|
|
57
|
+
const BUILTIN_NAMES = ['help', 'version'];
|
|
58
|
+
|
|
59
|
+
// 零依赖近似匹配的兜底:a 是否按顺序出现在 b 里(允许跳字,serch 也能对上 search)
|
|
60
|
+
function isSubsequence(a, b) {
|
|
61
|
+
let i = 0;
|
|
62
|
+
for (const ch of b) {
|
|
63
|
+
if (ch === a[i]) i++;
|
|
64
|
+
}
|
|
65
|
+
return i === a.length;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 未知命令 → 猜用户想输什么。小写比较;规则:前缀相同 / 互相包含 / 子序列。最多返回3个。
|
|
69
|
+
function didYouMean(input) {
|
|
70
|
+
const s = input.toLowerCase();
|
|
71
|
+
return [...COMMANDS.map(c => c.name), ...BUILTIN_NAMES]
|
|
72
|
+
.filter(n => {
|
|
73
|
+
const t = n.toLowerCase();
|
|
74
|
+
return t.startsWith(s) || s.startsWith(t) || t.includes(s) || s.includes(t) || isSubsequence(s, t);
|
|
75
|
+
})
|
|
76
|
+
.slice(0, 3);
|
|
77
|
+
}
|
|
78
|
+
|
|
38
79
|
async function main() {
|
|
39
80
|
const args = process.argv.slice(2);
|
|
40
81
|
const command = args[0];
|
|
41
82
|
const subArgs = args.slice(1);
|
|
42
83
|
|
|
84
|
+
const entry = COMMANDS.find(c => c.name === command || c.aliases?.includes(command));
|
|
85
|
+
if (entry) {
|
|
86
|
+
await entry.run(subArgs);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
43
90
|
switch (command) {
|
|
44
|
-
case 'install':
|
|
45
|
-
case 'i':
|
|
46
|
-
await install(subArgs);
|
|
47
|
-
break;
|
|
48
|
-
case 'config':
|
|
49
|
-
case 'c':
|
|
50
|
-
await config(subArgs);
|
|
51
|
-
break;
|
|
52
|
-
case 'test':
|
|
53
|
-
case 't':
|
|
54
|
-
await test(subArgs);
|
|
55
|
-
break;
|
|
56
|
-
case 'balance':
|
|
57
|
-
case 'b':
|
|
58
|
-
await balance(subArgs);
|
|
59
|
-
break;
|
|
60
|
-
case 'models':
|
|
61
|
-
case 'm':
|
|
62
|
-
await models(subArgs);
|
|
63
|
-
break;
|
|
64
|
-
case 'recharge':
|
|
65
|
-
case 'r':
|
|
66
|
-
await recharge(subArgs);
|
|
67
|
-
break;
|
|
68
91
|
case '--version':
|
|
69
92
|
case '-v':
|
|
93
|
+
case 'version':
|
|
70
94
|
showVersion(VERSION);
|
|
71
95
|
break;
|
|
72
96
|
case '--help':
|
|
@@ -75,10 +99,16 @@ async function main() {
|
|
|
75
99
|
case undefined:
|
|
76
100
|
showHelp(VERSION);
|
|
77
101
|
break;
|
|
78
|
-
default:
|
|
102
|
+
default: {
|
|
79
103
|
console.error(`未知命令: ${command}`);
|
|
80
|
-
|
|
104
|
+
const guesses = didYouMean(command);
|
|
105
|
+
if (guesses.length > 0) {
|
|
106
|
+
console.error(`你想用的是不是: ${guesses.join(', ')}`);
|
|
107
|
+
} else {
|
|
108
|
+
console.error('运行 aixx help 查看全部命令');
|
|
109
|
+
}
|
|
81
110
|
process.exit(1);
|
|
111
|
+
}
|
|
82
112
|
}
|
|
83
113
|
}
|
|
84
114
|
|
package/package.json
CHANGED
package/src/commands/help.js
CHANGED
|
@@ -12,6 +12,8 @@ export function showHelp(version) {
|
|
|
12
12
|
用法:
|
|
13
13
|
aixx install [推荐码] 安装AIXX skill到本地agent(含零配置)
|
|
14
14
|
aixx install --yes 非交互安装(脚本/CI用,跳过确认)
|
|
15
|
+
aixx search <关键词> 搜索AIXX能力库(数据/技能,免key)
|
|
16
|
+
aixx installed 查看安装状态(skill/账号/版本)
|
|
15
17
|
aixx config 配置或查看AIXX设置
|
|
16
18
|
aixx test 测试AIXX是否可用
|
|
17
19
|
aixx balance 查询账户余额(还剩多少钱)
|
package/src/commands/install.js
CHANGED
|
@@ -20,8 +20,8 @@ import { downloadSkill } from '../utils/download.js';
|
|
|
20
20
|
import { setupEnv, maskKey } from '../utils/env.js';
|
|
21
21
|
import { configureAgents } from '../utils/agentconfig.js';
|
|
22
22
|
|
|
23
|
-
// skill
|
|
24
|
-
function detectSkillDirs() {
|
|
23
|
+
// skill目录检测(installed/search 命令也会复用,所以 export)
|
|
24
|
+
export function detectSkillDirs() {
|
|
25
25
|
const home = homedir();
|
|
26
26
|
const candidates = [
|
|
27
27
|
join(home, '.zcode', 'skills'),
|
|
@@ -32,6 +32,13 @@ function detectSkillDirs() {
|
|
|
32
32
|
return candidates.filter(p => existsSync(p));
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
// 已实际装上AIXX skill的目录(候选目录里有 aixx/ 子目录才算装了),返回 aixx skill 的完整路径
|
|
36
|
+
export function detectAixxSkillDirs() {
|
|
37
|
+
return detectSkillDirs()
|
|
38
|
+
.filter(d => existsSync(join(d, 'aixx')))
|
|
39
|
+
.map(d => join(d, 'aixx'));
|
|
40
|
+
}
|
|
41
|
+
|
|
35
42
|
async function ask(question) {
|
|
36
43
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
37
44
|
return new Promise(resolve => rl.question(question, ans => { rl.close(); resolve(ans.trim()); }));
|
|
@@ -187,6 +194,18 @@ async function autoRegister(baseUrl, refCode) {
|
|
|
187
194
|
return `sk-${apiKey}`;
|
|
188
195
|
}
|
|
189
196
|
|
|
197
|
+
/**
|
|
198
|
+
* 安装动作清单:在自动注册发生前告诉用户将要执行的三步。
|
|
199
|
+
* 仅在"即将自动注册"的路径打印(已有key的老用户不打印)。
|
|
200
|
+
*/
|
|
201
|
+
function printInstallPlan() {
|
|
202
|
+
console.log('本次安装将执行:');
|
|
203
|
+
console.log(' ① 注册AIXX账号(免费,含试用额度)');
|
|
204
|
+
console.log(' ② 创建API Key并保存到 ~/.aixx/account.json');
|
|
205
|
+
console.log(' ③ 安装AIXX技能到检测到的skill目录');
|
|
206
|
+
console.log('');
|
|
207
|
+
}
|
|
208
|
+
|
|
190
209
|
export async function install(subArgs) {
|
|
191
210
|
console.log('╔══════════════════════════════════════════╗');
|
|
192
211
|
console.log('║ AIXX 安装程序 ║');
|
|
@@ -243,6 +262,9 @@ export async function install(subArgs) {
|
|
|
243
262
|
|
|
244
263
|
if (choice === '') {
|
|
245
264
|
// 自动注册
|
|
265
|
+
// 动作清单:让用户在注册发生前知道将要执行的三步(透明感=信任)。
|
|
266
|
+
// 放在确认之后:贴已有key的老用户不该看到"①注册账号"这种误导项。
|
|
267
|
+
printInstallPlan();
|
|
246
268
|
try {
|
|
247
269
|
apiKey = await autoRegister(DEFAULT_BASE_URL, refCode);
|
|
248
270
|
keySource = 'registered';
|
|
@@ -271,7 +293,7 @@ export async function install(subArgs) {
|
|
|
271
293
|
console.error('❌ 未提供有效Key,安装中断。');
|
|
272
294
|
process.exit(1);
|
|
273
295
|
}
|
|
274
|
-
|
|
296
|
+
// 有效key已拿到(apiKey/keySource 已赋值),不再退出,继续走后面的安装流程
|
|
275
297
|
}
|
|
276
298
|
} else if (choice.startsWith('sk-')) {
|
|
277
299
|
// 用户输入已有key
|
|
@@ -355,9 +377,24 @@ export async function install(subArgs) {
|
|
|
355
377
|
console.log('\n╔══════════════════════════════════════════╗');
|
|
356
378
|
console.log('║ 🎉 安装完成! ║');
|
|
357
379
|
console.log('╚══════════════════════════════════════════╝\n');
|
|
380
|
+
printQuickStart(apiKey);
|
|
358
381
|
printInstallBroadcast();
|
|
359
382
|
}
|
|
360
383
|
|
|
384
|
+
/**
|
|
385
|
+
* 安装完成后的 QuickStart——给用户一段"复制就能跑"的代码。
|
|
386
|
+
* 目标:让新用户在30秒内成功调通第一个模型,建立正反馈。
|
|
387
|
+
*/
|
|
388
|
+
function printQuickStart(apiKey) {
|
|
389
|
+
const key = apiKey || '你的API_KEY';
|
|
390
|
+
console.log('⚡ 30秒验证(复制粘贴到终端跑一下):\n');
|
|
391
|
+
console.log('curl -s https://baodan.run/v1/chat/completions \\');
|
|
392
|
+
console.log(' -H "Authorization: Bearer ' + key + '" \\');
|
|
393
|
+
console.log(' -H "Content-Type: application/json" \\');
|
|
394
|
+
console.log(' -d \'{"model":"deepseek-chat","messages":[{"role":"user","content":"你好"}],"max_tokens":50}\'');
|
|
395
|
+
console.log('\n 跑通了你就会看到 AI 回复你"你好"。\n');
|
|
396
|
+
}
|
|
397
|
+
|
|
361
398
|
async function testConnectivity(apiKey) {
|
|
362
399
|
// 用 /v1/models(带key)测试真实可用性,而不是 /api/status(管理接口,域名下404)
|
|
363
400
|
const url = DEFAULT_BASE_URL + '/models';
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIXX CLI - installed 命令
|
|
3
|
+
*
|
|
4
|
+
* 纯本地查询(不发任何网络请求),报告三件事:
|
|
5
|
+
* ① AIXX skill 是否已装(复用 install.js 的目录检测)
|
|
6
|
+
* ② 账号状态(~/.aixx/account.json)
|
|
7
|
+
* ③ CLI 自身版本(package.json 的 version,单一来源)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { existsSync, readFileSync } from 'fs';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
import { join, dirname } from 'path';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import { detectSkillDirs, detectAixxSkillDirs } from './install.js';
|
|
15
|
+
|
|
16
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const VERSION = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf-8')).version;
|
|
18
|
+
|
|
19
|
+
export async function installed() {
|
|
20
|
+
console.log('╔══════════════════════════════════════════╗');
|
|
21
|
+
console.log('║ AIXX 安装状态 ║');
|
|
22
|
+
console.log('╚══════════════════════════════════════════╝\n');
|
|
23
|
+
|
|
24
|
+
// ① skill 安装状态
|
|
25
|
+
const skillDirs = detectAixxSkillDirs();
|
|
26
|
+
if (skillDirs.length > 0) {
|
|
27
|
+
console.log('① skill: ✅ 已安装');
|
|
28
|
+
skillDirs.forEach(d => console.log(` ${d}`));
|
|
29
|
+
} else {
|
|
30
|
+
console.log('① skill: ❌ 未安装');
|
|
31
|
+
const candidateDirs = detectSkillDirs();
|
|
32
|
+
candidateDirs.forEach(d => console.log(` 检测到skill目录但没有aixx: ${d}`));
|
|
33
|
+
console.log(' 运行 npx aixxai install 一键开通');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ② 账号状态(~/.aixx/account.json)
|
|
37
|
+
const accountFile = join(homedir(), '.aixx', 'account.json');
|
|
38
|
+
let account = null;
|
|
39
|
+
let accountBroken = false;
|
|
40
|
+
if (existsSync(accountFile)) {
|
|
41
|
+
try {
|
|
42
|
+
account = JSON.parse(readFileSync(accountFile, 'utf-8'));
|
|
43
|
+
} catch (e) {
|
|
44
|
+
accountBroken = true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (account?.username) {
|
|
48
|
+
console.log(`② 账号: ✅ 已注册(${account.username})`);
|
|
49
|
+
} else if (accountBroken) {
|
|
50
|
+
console.log(`② 账号: ⚠️ 账号文件存在但读取失败(${accountFile})`);
|
|
51
|
+
} else {
|
|
52
|
+
console.log('② 账号: 未注册');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ③ CLI 自身版本
|
|
56
|
+
console.log(`③ CLI版本: v${VERSION}`);
|
|
57
|
+
|
|
58
|
+
// 已装给一句话用法
|
|
59
|
+
if (skillDirs.length > 0) {
|
|
60
|
+
console.log('\n用法:对<<你的AI>>说"用AIXX查余额/生图/搜数据"即可');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIXX CLI - search 命令
|
|
3
|
+
*
|
|
4
|
+
* 搜索AIXX能力库(数据/技能)。免key接口,未注册也能搜——
|
|
5
|
+
* 目的:让用户先看到"有什么、多少钱",再决定要不要装。
|
|
6
|
+
*
|
|
7
|
+
* 接口:POST {DEFAULT_BASE_URL}/capability body: {need: 关键词}
|
|
8
|
+
* 响应:{matched, capabilities:[{id,name,description,pricing:{per_use,weekly,monthly,free_quota},
|
|
9
|
+
* match_score,estimated_time}]},可能带 compliance_blocked(合规拦截,服务端会给message)
|
|
10
|
+
*
|
|
11
|
+
* 注意:搜到的能力不是装到本地的,装好AIXX技能后AI直接说需求即可调用。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { DEFAULT_BASE_URL } from '../../bin/aixx.js';
|
|
15
|
+
import { detectAixxSkillDirs } from './install.js';
|
|
16
|
+
|
|
17
|
+
// 与 install/balance 同款:统一 15 秒超时 + 网络/超时异常转友好提示
|
|
18
|
+
const FETCH_TIMEOUT = 15000;
|
|
19
|
+
function friendlyNetErr(err) {
|
|
20
|
+
return err?.name === 'TimeoutError' || err?.name === 'AbortError'
|
|
21
|
+
? '连接超时,请检查网络'
|
|
22
|
+
: err?.message || String(err);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 描述压成一句话并截断(≤60字)
|
|
26
|
+
function oneLine(text, max = 60) {
|
|
27
|
+
const line = String(text || '').replace(/\s+/g, ' ').trim();
|
|
28
|
+
return line.length > max ? line.slice(0, max) + '…' : line;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function search(subArgs) {
|
|
32
|
+
const keyword = subArgs.filter(a => a && !a.startsWith('-')).join(' ').trim();
|
|
33
|
+
|
|
34
|
+
// 无关键词:给用法示例,别让用户干瞪眼
|
|
35
|
+
if (!keyword) {
|
|
36
|
+
console.log('用法: aixx search <关键词>\n');
|
|
37
|
+
console.log('示例:');
|
|
38
|
+
console.log(' aixx search 抖音数据 查抖音相关的数据能力');
|
|
39
|
+
console.log(' aixx search UI设计 查设计相关的技能');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
console.log(`🔍 搜索AIXX能力: ${keyword}\n`);
|
|
44
|
+
|
|
45
|
+
// 免key接口,不加任何认证头
|
|
46
|
+
const baseUrl = process.env.AIXX_BASE_URL || DEFAULT_BASE_URL;
|
|
47
|
+
let data;
|
|
48
|
+
try {
|
|
49
|
+
const resp = await fetch(`${baseUrl}/capability`, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: { 'Content-Type': 'application/json' },
|
|
52
|
+
body: JSON.stringify({ need: keyword }),
|
|
53
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT),
|
|
54
|
+
});
|
|
55
|
+
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
|
|
56
|
+
data = await resp.json();
|
|
57
|
+
} catch (err) {
|
|
58
|
+
console.error(`❌ 搜索失败: ${friendlyNetErr(err)}`);
|
|
59
|
+
console.error(' 也可以直接到官网浏览全部能力: https://baodan.run/aixx/');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// 合规拦截:如实转达服务端说法
|
|
64
|
+
if (data?.compliance_blocked) {
|
|
65
|
+
console.log(`⛔ ${data.message || '该关键词被合规策略拦截,换个说法试试'}`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const caps = Array.isArray(data?.capabilities) ? data.capabilities : [];
|
|
70
|
+
if (!data?.matched || caps.length === 0) {
|
|
71
|
+
console.log(`没有找到与"${keyword}"相关的能力。`);
|
|
72
|
+
console.log('建议换个关键词再试试,比如:抖音数据、小红书、UI设计、视频脚本。');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
caps.forEach((cap, i) => {
|
|
77
|
+
// data-*前缀的id是数据接口,其余是技能
|
|
78
|
+
const type = cap.id?.startsWith('data-') ? '数据' : '技能';
|
|
79
|
+
console.log(`${i + 1}. ${cap.name || '未命名'} [${type}]`);
|
|
80
|
+
console.log(` ${oneLine(cap.description)}`);
|
|
81
|
+
const tags = [];
|
|
82
|
+
if (cap.pricing?.per_use !== undefined && cap.pricing?.per_use !== null) {
|
|
83
|
+
tags.push(`${cap.pricing.per_use} 元/次`);
|
|
84
|
+
}
|
|
85
|
+
if ((cap.pricing?.free_quota || 0) > 0) {
|
|
86
|
+
tags.push(`🆓 有${cap.pricing.free_quota}次免费试用`);
|
|
87
|
+
}
|
|
88
|
+
tags.push(`ID: ${cap.id}`);
|
|
89
|
+
console.log(` ${tags.join(' · ')}`);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
console.log('\n以上能力无需单独安装——安装AIXX技能后,你的AI直接说需求即可调用(能力ID给AI看就行)');
|
|
93
|
+
if (detectAixxSkillDirs().length === 0) {
|
|
94
|
+
console.log('还没安装AIXX技能?运行 npx aixxai install 一键开通');
|
|
95
|
+
}
|
|
96
|
+
}
|
package/aixxai-1.5.2.tgz
DELETED
|
Binary file
|
package/aixxai-1.5.3.tgz
DELETED
|
Binary file
|