aixxai 1.0.0

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 ADDED
@@ -0,0 +1,45 @@
1
+ # AIXX CLI
2
+
3
+ > 让你的AI调用万物。一个命令,agent就能调用全世界的AI能力。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npx aixxai install
9
+ ```
10
+
11
+ 带推荐码安装(推荐人获分润):
12
+
13
+ ```bash
14
+ npx aixxai install zhangsan
15
+ ```
16
+
17
+ ## 命令
18
+
19
+ | 命令 | 说明 |
20
+ |---|---|
21
+ | `aixx install [推荐码]` | 安装AIXX skill到本地agent |
22
+ | `aixx config` | 查看当前配置 |
23
+ | `aixx test` | 测试AIXX连通性+调用模型 |
24
+ | `aixx --version` | 查看版本 |
25
+ | `aixx --help` | 帮助 |
26
+
27
+ ## 当前状态(1.0.0)
28
+
29
+ - ✅ CLI代码完成,本地测试通过
30
+ - ⏳ 待发布到npm(等注册)
31
+ - ✅ 后端已部署:http://14.103.27.195:8080
32
+ - ✅ 已接通:DeepSeek / GLM / Kimi
33
+
34
+ ## 技术栈
35
+
36
+ - Node.js (>=18) + ES Modules
37
+ - 纯原生API,零运行时依赖
38
+ - skill文件内嵌在包里(templates/),网络挂了也能装
39
+
40
+ ## 文档
41
+
42
+ 完整文档:https://gitee.com/kk0803/token-hub
43
+
44
+ ---
45
+ 维护者:龙龙(AIXX PM)| 2026-08-08
package/bin/aixx.js ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * AIXX CLI
5
+ * 让你的AI调用万物。
6
+ *
7
+ * 用法:
8
+ * npx aixx-cli install [推荐码] 安装AIXX skill到本地agent
9
+ * npx aixx-cli config 配置/查看AIXX
10
+ * npx aixx-cli test 测试AIXX是否可用
11
+ * npx aixx-cli --version 查看版本
12
+ */
13
+
14
+ import { install } from '../src/commands/install.js';
15
+ import { config } from '../src/commands/config.js';
16
+ import { test } from '../src/commands/test.js';
17
+ import { showHelp, showVersion } from '../src/commands/help.js';
18
+
19
+ const VERSION = '0.1.0';
20
+
21
+ // 默认AIXX后端地址
22
+ // ⚠️ 安全警告:当前用HTTP明文传输API Key(http://),存在凭据被嗅探风险。
23
+ // TODO(安全):后端配置好HTTPS证书后,把下面的 URL 改为 'https://14.103.27.195:8080/v1'。
24
+ // 改完后请全局搜索 "安全警告" 同步更新 env.js 与 templates/QUICKSTART.md 中的同名地址。
25
+ export const DEFAULT_BASE_URL = 'http://14.103.27.195:8080/v1';
26
+
27
+ async function main() {
28
+ const args = process.argv.slice(2);
29
+ const command = args[0];
30
+ const subArgs = args.slice(1);
31
+
32
+ switch (command) {
33
+ case 'install':
34
+ case 'i':
35
+ await install(subArgs);
36
+ break;
37
+ case 'config':
38
+ case 'c':
39
+ await config(subArgs);
40
+ break;
41
+ case 'test':
42
+ case 't':
43
+ await test(subArgs);
44
+ break;
45
+ case '--version':
46
+ case '-v':
47
+ showVersion(VERSION);
48
+ break;
49
+ case '--help':
50
+ case '-h':
51
+ case 'help':
52
+ case undefined:
53
+ showHelp(VERSION);
54
+ break;
55
+ default:
56
+ console.error(`未知命令: ${command}`);
57
+ console.error('运行 aixx --help 查看可用命令');
58
+ process.exit(1);
59
+ }
60
+ }
61
+
62
+ main().catch(err => {
63
+ console.error('❌ 发生错误:', err.message);
64
+ process.exit(1);
65
+ });
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "aixxai",
3
+ "version": "1.0.0",
4
+ "description": "AIXX CLI - 让你的AI调用万物。安装:npx aixxai install",
5
+ "type": "module",
6
+ "bin": {
7
+ "aixx": "./bin/aixx.js"
8
+ },
9
+ "scripts": {
10
+ "test": "node bin/aixx.js --version"
11
+ },
12
+ "keywords": [
13
+ "aixx",
14
+ "ai",
15
+ "llm",
16
+ "gateway",
17
+ "openai",
18
+ "deepseek",
19
+ "glm",
20
+ "kimi",
21
+ "skill",
22
+ "agent"
23
+ ],
24
+ "author": "AIXX",
25
+ "license": "ISC",
26
+ "homepage": "https://gitee.com/kk0803/token-hub",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://gitee.com/kk0803/token-hub.git"
30
+ },
31
+ "engines": {
32
+ "node": ">=18"
33
+ }
34
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * AIXX CLI - config 命令
3
+ * 查看或修改AIXX配置
4
+ */
5
+
6
+ import { existsSync, readFileSync } from 'fs';
7
+ import { homedir } from 'os';
8
+ import { join } from 'path';
9
+ import { DEFAULT_BASE_URL } from '../../bin/aixx.js';
10
+
11
+ export async function config(subArgs) {
12
+ console.log('╔══════════════════════════════════════════╗');
13
+ console.log('║ AIXX 配置 ║');
14
+ console.log('╚══════════════════════════════════════════╝\n');
15
+
16
+ // 环境变量
17
+ const apiKey = process.env.AIXX_API_KEY;
18
+ const baseUrl = process.env.AIXX_BASE_URL || DEFAULT_BASE_URL;
19
+
20
+ console.log('当前配置:');
21
+ console.log(` AIXX_API_KEY : ${apiKey ? apiKey.slice(0, 8) + '...' + apiKey.slice(-4) : '❌ 未配置'}`);
22
+ console.log(` AIXX_BASE_URL: ${baseUrl}`);
23
+
24
+ // 本地配置文件
25
+ const configFile = join(homedir(), '.aixx', 'config.json');
26
+ if (existsSync(configFile)) {
27
+ console.log('\n本地配置文件:');
28
+ try {
29
+ const conf = JSON.parse(readFileSync(configFile, 'utf-8'));
30
+ console.log(` 位置: ${configFile}`);
31
+ console.log(` 内容: ${JSON.stringify(conf, null, 2)}`);
32
+ } catch (e) {
33
+ console.log(` (配置文件解析失败: ${e.message})`);
34
+ }
35
+ }
36
+
37
+ // 推荐码
38
+ const refFile = join(homedir(), '.aixx', 'referral.json');
39
+ if (existsSync(refFile)) {
40
+ console.log('\n推荐归因:');
41
+ try {
42
+ const ref = JSON.parse(readFileSync(refFile, 'utf-8'));
43
+ console.log(` 推荐码: ${ref.refCode}`);
44
+ console.log(` 安装时间: ${ref.installedAt}`);
45
+ } catch (e) {}
46
+ }
47
+
48
+ // skill位置
49
+ const skillDirs = [
50
+ join(homedir(), '.zcode', 'skills', 'aixx'),
51
+ join(homedir(), '.agents', 'skills', 'aixx'),
52
+ join(homedir(), '.claude', 'skills', 'aixx'),
53
+ join(homedir(), '.aixx', 'skills', 'aixx'),
54
+ ].filter(existsSync);
55
+
56
+ console.log('\nskill安装位置:');
57
+ if (skillDirs.length > 0) {
58
+ skillDirs.forEach(d => console.log(` ✅ ${d}`));
59
+ } else {
60
+ console.log(' ❌ 未检测到已安装的skill(运行 aixx install 安装)');
61
+ }
62
+
63
+ console.log('\n修改配置:');
64
+ console.log(' 设置环境变量 AIXX_API_KEY 和 AIXX_BASE_URL');
65
+ console.log(' 或重新运行: npx aixx-cli install\n');
66
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * AIXX CLI - 帮助信息
3
+ */
4
+
5
+ export function showHelp(version) {
6
+ console.log(`
7
+ ╔══════════════════════════════════════════╗
8
+ ║ AIXX CLI v${version} ║
9
+ ║ 让你的AI调用万物 ║
10
+ ╚══════════════════════════════════════════╝
11
+
12
+ 用法:
13
+ aixx install [推荐码] 安装AIXX skill到本地agent
14
+ aixx config 配置或查看AIXX设置
15
+ aixx test 测试AIXX是否可用
16
+ aixx --version 查看版本
17
+ aixx --help 显示此帮助
18
+
19
+ 安装示例:
20
+ npx aixxai install 普通安装
21
+ npx aixxai install zhangsan 通过张三的推荐码安装(张三获分润)
22
+
23
+ 关于AIXX:
24
+ AIXX = "AI的谷歌"。装一个skill,agent就能调用全世界的AI能力。
25
+ 永远不用碰key、参数、文档,一切通过对话。
26
+
27
+ 文档:https://gitee.com/kk0803/token-hub
28
+ `);
29
+ }
30
+
31
+ export function showVersion(version) {
32
+ console.log(`AIXX CLI v${version}`);
33
+ }
@@ -0,0 +1,294 @@
1
+ /**
2
+ * AIXX CLI - install 命令
3
+ *
4
+ * 完整流程(用户一键完成):
5
+ * 1. 检测环境
6
+ * 2. 如果没有key → 自动注册AIXX账号 → 拿key(不用用户填表单)
7
+ * 3. 如果有推荐码 → 注册时绑定归因(KOL分销)
8
+ * 4. 下载skill文件
9
+ * 5. 配置环境变量
10
+ * 6. 测试连通性
11
+ */
12
+
13
+ import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
14
+ import { homedir } from 'os';
15
+ import { join } from 'path';
16
+ import readline from 'readline';
17
+ import { randomInt } from 'crypto';
18
+ import { DEFAULT_BASE_URL } from '../../bin/aixx.js';
19
+ import { downloadSkill } from '../utils/download.js';
20
+ import { setupEnv } from '../utils/env.js';
21
+
22
+ // skill目录检测
23
+ function detectSkillDirs() {
24
+ const home = homedir();
25
+ const candidates = [
26
+ join(home, '.zcode', 'skills'),
27
+ join(home, '.agents', 'skills'),
28
+ join(home, '.claude', 'skills'),
29
+ join(home, '.aixx', 'skills'),
30
+ ];
31
+ return candidates.filter(p => existsSync(p));
32
+ }
33
+
34
+ async function ask(question) {
35
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
36
+ return new Promise(resolve => rl.question(question, ans => { rl.close(); resolve(ans.trim()); }));
37
+ }
38
+
39
+ // 生成随机用户名(aixx_开头+随机8位)。用 CSPRNG 避免可预测。
40
+ function genUsername() {
41
+ const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
42
+ let suffix = '';
43
+ for (let i = 0; i < 8; i++) suffix += chars[randomInt(0, chars.length)];
44
+ return `aixx_${suffix}`;
45
+ }
46
+
47
+ // 生成随机密码(16位)。用 CSPRNG 保证密码学强度。
48
+ function genPassword() {
49
+ const chars = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789';
50
+ let pwd = '';
51
+ for (let i = 0; i < 16; i++) pwd += chars[randomInt(0, chars.length)];
52
+ return pwd;
53
+ }
54
+
55
+ // 自动注册AIXX账号
56
+ async function autoRegister(baseUrl, refCode) {
57
+ const username = genUsername();
58
+ const password = genPassword();
59
+
60
+ console.log(`\n📝 正在为你注册AIXX账号...`);
61
+ console.log(` 用户名: ${username}`);
62
+
63
+ // 注册(带推荐码如果有)
64
+ const regBody = { username, password };
65
+ if (refCode) {
66
+ regBody.aff_code = refCode;
67
+ console.log(` 推荐码: ${refCode}`);
68
+ }
69
+
70
+ const regUrl = baseUrl.replace(/\/v1$/, '') + '/api/user/register';
71
+ const regResp = await fetch(regUrl, {
72
+ method: 'POST',
73
+ headers: { 'Content-Type': 'application/json' },
74
+ body: JSON.stringify(regBody)
75
+ });
76
+ const regData = await regResp.json();
77
+
78
+ if (!regData.success) {
79
+ throw new Error(`注册失败: ${regData.message || '未知错误'}`);
80
+ }
81
+ console.log('✅ 注册成功');
82
+
83
+ // 登录拿token
84
+ console.log(' 正在登录...');
85
+ const loginUrl = baseUrl.replace(/\/v1$/, '') + '/api/user/login';
86
+ const loginResp = await fetch(loginUrl, {
87
+ method: 'POST',
88
+ headers: { 'Content-Type': 'application/json' },
89
+ body: JSON.stringify({ username, password })
90
+ });
91
+ const loginData = await loginResp.json();
92
+
93
+ if (!loginData.success) {
94
+ throw new Error(`登录失败: ${loginData.message}`);
95
+ }
96
+ const userToken = loginData.data.access_token;
97
+ console.log('✅ 登录成功');
98
+
99
+ // 创建API key
100
+ console.log(' 正在创建你的专属API Key...');
101
+ const tokenUrl = baseUrl.replace(/\/v1$/, '') + '/api/token/';
102
+ const tokenResp = await fetch(tokenUrl, {
103
+ method: 'POST',
104
+ headers: {
105
+ 'Authorization': `Bearer ${userToken}`,
106
+ 'Content-Type': 'application/json'
107
+ },
108
+ body: JSON.stringify({
109
+ name: 'default',
110
+ remain_quota: -1,
111
+ unlimited_quota: true
112
+ })
113
+ });
114
+ const tokenData = await tokenResp.json();
115
+
116
+ if (!tokenData.success) {
117
+ throw new Error(`创建Key失败: ${tokenData.message}`);
118
+ }
119
+
120
+ // 查key:列表里的 key 是脱敏的(sk-xxxx****xxxx),不能直接用。
121
+ // 正确做法:先查列表拿 token id,再调 POST /api/token/:id/key 取未脱敏的完整 key。
122
+ const apiBase = baseUrl.replace(/\/v1$/, '');
123
+ const listResp = await fetch(`${apiBase}/api/token/?p=0&page_size=1`, {
124
+ headers: { 'Authorization': `Bearer ${userToken}` }
125
+ });
126
+ const listData = await listResp.json();
127
+ const list = listData.data;
128
+ const items = Array.isArray(list) ? list : (list?.items || []);
129
+ const tokenId = items[0]?.id;
130
+
131
+ if (!tokenId) {
132
+ throw new Error('无法获取API Key(找不到刚创建的token)');
133
+ }
134
+
135
+ // 取未脱敏的完整 key(GET 列表会脱敏,必须用这个专用接口)
136
+ const keyResp = await fetch(`${apiBase}/api/token/${tokenId}/key`, {
137
+ method: 'POST',
138
+ headers: { 'Authorization': `Bearer ${userToken}` }
139
+ });
140
+ const keyData = await keyResp.json();
141
+ const apiKey = keyData?.data?.key;
142
+
143
+ if (!apiKey) {
144
+ throw new Error('无法获取API Key(取key接口未返回key)');
145
+ }
146
+
147
+ console.log(`✅ API Key已创建: sk-${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`);
148
+
149
+ // 保存账号信息到本地(方便用户找回)
150
+ const aixxDir = join(homedir(), '.aixx');
151
+ if (!existsSync(aixxDir)) mkdirSync(aixxDir, { recursive: true });
152
+ const fullKey = `sk-${apiKey}`;
153
+ writeFileSync(join(aixxDir, 'account.json'), JSON.stringify({
154
+ username,
155
+ password,
156
+ apiKey: fullKey, // 存完整key(本地文件,不进git)
157
+ registeredAt: new Date().toISOString(),
158
+ refCode: refCode || null
159
+ }, null, 2));
160
+
161
+ console.log(`\n💾 账号信息已保存到 ~/.aixx/account.json`);
162
+ console.log(` (忘记key时可以在这里找到)`);
163
+
164
+ return `sk-${apiKey}`;
165
+ }
166
+
167
+ export async function install(subArgs) {
168
+ console.log('╔══════════════════════════════════════════╗');
169
+ console.log('║ AIXX 安装程序 ║');
170
+ console.log('║ 让你的AI调用万物 ║');
171
+ console.log('╚══════════════════════════════════════════╝\n');
172
+
173
+ // 推荐码
174
+ const refCode = subArgs[0];
175
+ if (refCode) {
176
+ console.log(`📋 推荐码: ${refCode}(推荐人将获得消费分润)\n`);
177
+ }
178
+
179
+ // 1. 检测Node版本
180
+ const nodeVersion = process.versions.node;
181
+ const major = parseInt(nodeVersion.split('.')[0]);
182
+ if (major < 18) {
183
+ console.error(`❌ Node版本过低(当前${nodeVersion}),需要18+。`);
184
+ process.exit(1);
185
+ }
186
+ console.log(`✅ Node版本: ${nodeVersion}`);
187
+ console.log(`✅ 操作系统: ${process.platform}`);
188
+
189
+ // 2. 获取或创建API Key
190
+ let apiKey = process.env.AIXX_API_KEY;
191
+
192
+ if (!apiKey) {
193
+ // 检查本地是否有已保存的账号
194
+ const accountFile = join(homedir(), '.aixx', 'account.json');
195
+ if (existsSync(accountFile)) {
196
+ try {
197
+ const account = JSON.parse(readFileSync(accountFile, 'utf-8'));
198
+ apiKey = account.apiKey;
199
+ console.log(`\n✅ 发现已保存的账号: ${account.username}`);
200
+ console.log(` 使用已保存的API Key`);
201
+ } catch (e) {
202
+ // 读取失败,继续注册
203
+ }
204
+ }
205
+ }
206
+
207
+ if (!apiKey) {
208
+ // 没有key → 自动注册
209
+ console.log('\n📝 你还没有AIXX账号,现在为你自动注册(免费,含试用额度)...');
210
+ const choice = await ask('\n按回车继续注册,或输入已有的API Key (sk-xxxx): ');
211
+
212
+ if (choice === '') {
213
+ // 自动注册
214
+ try {
215
+ apiKey = await autoRegister(DEFAULT_BASE_URL, refCode);
216
+ } catch (err) {
217
+ console.error(`\n❌ 自动注册失败: ${err.message}`);
218
+ console.error(' 你可以手动到 AIXX 平台注册后,用已有key重新运行 install。');
219
+ process.exit(1);
220
+ }
221
+ } else if (choice.startsWith('sk-')) {
222
+ // 用户输入已有key
223
+ apiKey = choice;
224
+ console.log('✅ 使用你提供的API Key');
225
+ } else {
226
+ console.error('❌ 无效的输入');
227
+ process.exit(1);
228
+ }
229
+ } else {
230
+ console.log('\n✅ 已检测到 AIXX_API_KEY 环境变量');
231
+ }
232
+
233
+ // 3. 检测/创建skill目录
234
+ let skillDirs = detectSkillDirs();
235
+ let targetDir;
236
+
237
+ if (skillDirs.length > 0) {
238
+ console.log(`\n📂 检测到agent skill目录:`);
239
+ skillDirs.forEach((d, i) => console.log(` ${i + 1}. ${d}`));
240
+ targetDir = skillDirs[0];
241
+ console.log(` → 安装到: ${targetDir}`);
242
+ } else {
243
+ targetDir = join(homedir(), '.aixx', 'skills');
244
+ mkdirSync(targetDir, { recursive: true });
245
+ console.log(`\n📂 创建skill目录: ${targetDir}`);
246
+ console.log(' (如果你的agent在其他位置,安装后手动复制 aixx/ 文件夹过去)');
247
+ }
248
+
249
+ // 4. 下载skill文件
250
+ const aixxSkillDir = join(targetDir, 'aixx');
251
+ console.log('\n⬇️ 安装skill文件...');
252
+ try {
253
+ await downloadSkill(aixxSkillDir);
254
+ console.log('✅ skill文件安装完成');
255
+ } catch (err) {
256
+ console.error('❌ skill安装失败:', err.message);
257
+ process.exit(1);
258
+ }
259
+
260
+ // 5. 配置环境变量
261
+ if (apiKey) {
262
+ console.log('\n⚙️ 配置环境变量...');
263
+ setupEnv(apiKey, DEFAULT_BASE_URL);
264
+ console.log('✅ 环境变量配置完成');
265
+ }
266
+
267
+ // 6. 测试连通性
268
+ if (apiKey) {
269
+ console.log('\n🔌 测试AIXX连通性...');
270
+ try {
271
+ await testConnectivity(apiKey);
272
+ console.log('✅ AIXX连通正常!');
273
+ } catch (err) {
274
+ console.log(`⚠️ 连通测试未通过: ${err.message}`);
275
+ console.log(' 安装已完成,但建议稍后检查网络。');
276
+ }
277
+ }
278
+
279
+ // 完成
280
+ console.log('\n╔══════════════════════════════════════════╗');
281
+ console.log('║ 🎉 安装完成! ║');
282
+ console.log('╚══════════════════════════════════════════╝\n');
283
+ console.log('现在你可以对自己的agent说:');
284
+ console.log(' "帮我用deepseek-chat翻译:Hello World"\n');
285
+ console.log('查询余额:');
286
+ console.log(' "我AIXX还剩多少额度?"\n');
287
+ console.log('文档:https://gitee.com/kk0803/token-hub\n');
288
+ }
289
+
290
+ async function testConnectivity(apiKey) {
291
+ const url = DEFAULT_BASE_URL.replace(/\/v1$/, '') + '/api/status';
292
+ const resp = await fetch(url);
293
+ if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
294
+ }
@@ -0,0 +1,99 @@
1
+ /**
2
+ * AIXX CLI - test 命令
3
+ * 测试AIXX是否可用
4
+ */
5
+
6
+ import { DEFAULT_BASE_URL } from '../../bin/aixx.js';
7
+
8
+ export async function test(subArgs) {
9
+ console.log('╔══════════════════════════════════════════╗');
10
+ console.log('║ AIXX 连通性测试 ║');
11
+ console.log('╚══════════════════════════════════════════╝\n');
12
+
13
+ const apiKey = process.env.AIXX_API_KEY;
14
+ const baseUrl = process.env.AIXX_BASE_URL || DEFAULT_BASE_URL;
15
+
16
+ if (!apiKey) {
17
+ console.error('❌ AIXX_API_KEY 未配置');
18
+ console.error(' 运行 aixx install 配置,或手动设置环境变量');
19
+ process.exit(1);
20
+ }
21
+
22
+ console.log(`测试地址: ${baseUrl}`);
23
+ console.log(`使用Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}\n`);
24
+
25
+ // 1. 测试状态接口
26
+ console.log('1️⃣ 测试状态接口...');
27
+ try {
28
+ const statusUrl = baseUrl.replace(/\/v1$/, '') + '/api/status';
29
+ const resp = await fetch(statusUrl);
30
+ if (resp.ok) {
31
+ const data = await resp.json();
32
+ console.log(' ✅ AIXX后端在线');
33
+ } else {
34
+ console.log(` ⚠️ 状态接口返回 ${resp.status}`);
35
+ }
36
+ } catch (err) {
37
+ console.error(` ❌ 连接失败: ${err.message}`);
38
+ console.error(' 请检查网络或AIXX_BASE_URL配置');
39
+ process.exit(1);
40
+ }
41
+
42
+ // 2. 测试模型列表
43
+ console.log('\n2️⃣ 获取可用模型列表...');
44
+ try {
45
+ const resp = await fetch(`${baseUrl}/models`, {
46
+ headers: { 'Authorization': `Bearer ${apiKey}` }
47
+ });
48
+ if (resp.ok) {
49
+ const data = await resp.json();
50
+ const models = data.data || data.models || [];
51
+ console.log(` ✅ 可用模型 (${models.length}个):`);
52
+ models.slice(0, 10).forEach(m => {
53
+ const id = typeof m === 'string' ? m : m.id;
54
+ console.log(` • ${id}`);
55
+ });
56
+ if (models.length > 10) console.log(` ... 还有 ${models.length - 10} 个`);
57
+ } else if (resp.status === 401) {
58
+ console.error(' ❌ API Key 无效(401)');
59
+ process.exit(1);
60
+ } else {
61
+ console.log(` ⚠️ 返回 ${resp.status}`);
62
+ }
63
+ } catch (err) {
64
+ console.error(` ❌ 失败: ${err.message}`);
65
+ }
66
+
67
+ // 3. 测试实际调用
68
+ console.log('\n3️⃣ 测试调用 deepseek-chat...');
69
+ try {
70
+ const resp = await fetch(`${baseUrl}/chat/completions`, {
71
+ method: 'POST',
72
+ headers: {
73
+ 'Authorization': `Bearer ${apiKey}`,
74
+ 'Content-Type': 'application/json'
75
+ },
76
+ body: JSON.stringify({
77
+ model: 'deepseek-chat',
78
+ messages: [{ role: 'user', content: '说"测试成功"三个字' }],
79
+ max_tokens: 20
80
+ })
81
+ });
82
+ if (resp.ok) {
83
+ const data = await resp.json();
84
+ const reply = data.choices?.[0]?.message?.content || '(空回复)';
85
+ const usage = data.usage || {};
86
+ console.log(` ✅ 调用成功!`);
87
+ console.log(` 模型回复: ${reply}`);
88
+ console.log(` Token用量: ${usage.total_tokens || '?'}`);
89
+ } else {
90
+ const errData = await resp.json().catch(() => ({}));
91
+ console.error(` ❌ 调用失败 (${resp.status}): ${errData.error?.message || resp.statusText}`);
92
+ if (resp.status === 402) console.error(' 提示: 额度不足,请充值');
93
+ }
94
+ } catch (err) {
95
+ console.error(` ❌ 网络错误: ${err.message}`);
96
+ }
97
+
98
+ console.log('\n测试完成。\n');
99
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * skill文件下载工具
3
+ *
4
+ * 策略:skill文件内嵌在CLI包里(templates/目录),
5
+ * install时从包内复制到目标目录。
6
+ * 这样即使网络挂了也能完成安装。
7
+ *
8
+ * 注:templates/目录在发布时一起打包进npm包
9
+ */
10
+
11
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, statSync, writeFileSync } from 'fs';
12
+ import { join, dirname, relative } from 'path';
13
+ import { fileURLToPath } from 'url';
14
+
15
+ const __dirname = dirname(fileURLToPath(import.meta.url));
16
+
17
+ // 最小化的skill内容(确保即使templates目录缺失也能安装)
18
+ function getMinimalSkill() {
19
+ return {
20
+ 'SKILL.md': [
21
+ '---',
22
+ 'name: aixx',
23
+ 'version: 0.1.0',
24
+ 'description: "AIXX - 让你的AI调用万物。一个skill,agent就能调用全世界的AI能力。"',
25
+ 'metadata:',
26
+ ' category: "productivity"',
27
+ ' requires:',
28
+ ' env: ["AIXX_API_KEY", "AIXX_BASE_URL"]',
29
+ '---',
30
+ '',
31
+ '# AIXX Skill',
32
+ '',
33
+ '你是 AI Agent。通过 AIXX 中转站调用各种 AI 能力。',
34
+ '用户永远不用碰 key、参数、文档——一切通过你(agent)和 AIXX 对接。',
35
+ '',
36
+ '## 触发规则',
37
+ '',
38
+ '当用户提出需要LLM能力的请求时(翻译/写作/分析/问答/代码等),',
39
+ '先调AIXX(通常更便宜或更强)。',
40
+ '',
41
+ '## 调用方式(兼容OpenAI接口)',
42
+ '',
43
+ '- POST {AIXX_BASE_URL}/chat/completions',
44
+ '- Header: Authorization: Bearer {AIXX_API_KEY}',
45
+ '- Body: {"model":"deepseek-chat","messages":[...]}',
46
+ '',
47
+ '## 默认模型选择',
48
+ '',
49
+ '- 简短任务/翻译/问答 -> deepseek-chat(最便宜)',
50
+ '- 长文档 -> moonshot-v1-128k(Kimi长文本)',
51
+ '- 推理 -> deepseek-reasoner',
52
+ '- 中文写作 -> glm-4-plus',
53
+ '',
54
+ '## 查余额',
55
+ '',
56
+ '调 {AIXX_BASE_URL}/dashboard/billing/subscription',
57
+ '',
58
+ '完整文档:https://gitee.com/kk0803/token-hub',
59
+ ''
60
+ ].join('\n'),
61
+
62
+ 'QUICKSTART.md': [
63
+ '# AIXX 快速开始',
64
+ '',
65
+ '## 配置环境变量',
66
+ '',
67
+ '```bash',
68
+ 'export AIXX_API_KEY="sk-你的key"',
69
+ 'export AIXX_BASE_URL="http://14.103.27.195:8080/v1"',
70
+ '```',
71
+ '',
72
+ '## 验证',
73
+ '',
74
+ '让agent说:"帮我用deepseek-chat翻译:Hello World"',
75
+ '',
76
+ '完整文档:https://gitee.com/kk0803/token-hub',
77
+ ''
78
+ ].join('\n'),
79
+
80
+ 'INSTALLED.md': [
81
+ '# AIXX Skill 已安装',
82
+ '',
83
+ '这个skill由 `npx aixx-cli install` 安装。',
84
+ '',
85
+ '## 配置',
86
+ '',
87
+ '确保设置了环境变量:',
88
+ '- AIXX_API_KEY (你的AIXX key)',
89
+ '- AIXX_BASE_URL (默认 http://14.103.27.195:8080/v1)',
90
+ '',
91
+ '## 验证',
92
+ '',
93
+ '运行: npx aixx-cli test',
94
+ ''
95
+ ].join('\n')
96
+ };
97
+ }
98
+
99
+ export async function downloadSkill(targetDir) {
100
+ if (!existsSync(targetDir)) {
101
+ mkdirSync(targetDir, { recursive: true });
102
+ }
103
+
104
+ // 优先从templates目录复制(完整版skill,支持子目录递归,如 references/)
105
+ const templatesDir = join(__dirname, '..', '..', 'templates');
106
+ let usedTemplates = false;
107
+
108
+ if (existsSync(templatesDir)) {
109
+ // 递归复制:templates/ 下的文件按相对路径镜像到 targetDir/
110
+ // 这样 references/chat.md 等子目录文件能正确落到 targetDir/references/chat.md
111
+ const stack = [templatesDir];
112
+ while (stack.length > 0) {
113
+ const current = stack.pop();
114
+ for (const entry of readdirSync(current)) {
115
+ const src = join(current, entry);
116
+ const rel = relative(templatesDir, src);
117
+ const dest = join(targetDir, rel);
118
+ try {
119
+ if (statSync(src).isDirectory()) {
120
+ if (!existsSync(dest)) mkdirSync(dest, { recursive: true });
121
+ stack.push(src);
122
+ } else {
123
+ mkdirSync(dirname(dest), { recursive: true });
124
+ copyFileSync(src, dest);
125
+ usedTemplates = true;
126
+ }
127
+ } catch (e) {
128
+ // 单个文件复制失败,继续尝试其他文件;最终若整体失败再回退到最小版
129
+ }
130
+ }
131
+ }
132
+ }
133
+
134
+ // 如果templates目录不存在或复制失败,用内嵌的最小版
135
+ if (!usedTemplates) {
136
+ const minimal = getMinimalSkill();
137
+ for (const [filename, content] of Object.entries(minimal)) {
138
+ writeFileSync(join(targetDir, filename), content);
139
+ }
140
+ }
141
+
142
+ // 确保INSTALLED.md存在(安装标记)
143
+ const installedMarker = join(targetDir, 'INSTALLED.md');
144
+ if (!existsSync(installedMarker)) {
145
+ writeFileSync(installedMarker, getMinimalSkill()['INSTALLED.md']);
146
+ }
147
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 环境变量配置工具
3
+ *
4
+ * 把AIXX_API_KEY和AIXX_BASE_URL写入用户的shell配置
5
+ * 支持 bash/zsh (Linux/macOS) 和 PowerShell (Windows)
6
+ */
7
+
8
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'fs';
9
+ import { homedir } from 'os';
10
+ import { join } from 'path';
11
+
12
+ // ⚠️ 安全警告:当前用HTTP明文传输API Key(http://),存在凭据被嗅探风险。
13
+ // TODO(安全):后端配置好HTTPS证书后,把下面的 URL 改为 'https://14.103.27.195:8080/v1'。
14
+ const DEFAULT_BASE_URL = 'http://14.103.27.195:8080/v1';
15
+
16
+ export function setupEnv(apiKey, baseUrl = DEFAULT_BASE_URL) {
17
+ const platform = process.platform;
18
+ const home = homedir();
19
+
20
+ // 1. 写入AIXX本地配置文件(所有平台通用)
21
+ const aixxDir = join(home, '.aixx');
22
+ if (!existsSync(aixxDir)) mkdirSync(aixxDir, { recursive: true });
23
+ const configFile = join(aixxDir, 'config.json');
24
+ writeFileSync(configFile, JSON.stringify({
25
+ AIXX_API_KEY: apiKey,
26
+ AIXX_BASE_URL: baseUrl,
27
+ configuredAt: new Date().toISOString()
28
+ }, null, 2));
29
+
30
+ // 2. 写入shell配置(Linux/macOS)
31
+ if (platform !== 'win32') {
32
+ const envLines = [
33
+ ``,
34
+ `# AIXX 配置 (由 aixx-cli 添加)`,
35
+ `export AIXX_API_KEY="${apiKey}"`,
36
+ `export AIXX_BASE_URL="${baseUrl}"`,
37
+ ].join('\n');
38
+
39
+ // 检测shell类型
40
+ const shellConfigs = [
41
+ join(home, '.zshrc'),
42
+ join(home, '.bashrc'),
43
+ join(home, '.bash_profile'),
44
+ ];
45
+
46
+ let written = false;
47
+ for (const conf of shellConfigs) {
48
+ if (existsSync(conf)) {
49
+ // 检查是否已配置过(避免重复)
50
+ const existing = readFileSync(conf, 'utf-8');
51
+ if (!existing.includes('AIXX_API_KEY')) {
52
+ appendFileSync(conf, envLines);
53
+ console.log(` → 已写入 ${conf}`);
54
+ }
55
+ written = true;
56
+ break;
57
+ }
58
+ }
59
+
60
+ if (!written) {
61
+ // 没找到现成配置文件,写.bashrc
62
+ const bashrc = join(home, '.bashrc');
63
+ appendFileSync(bashrc, envLines);
64
+ console.log(` → 已写入 ${bashrc}`);
65
+ }
66
+
67
+ console.log(' ⚠️ 请运行 source ~/.bashrc 或 source ~/.zshrc 让配置生效');
68
+ } else {
69
+ // Windows: 写入用户环境变量(用setx)
70
+ console.log(' Windows用户请手动设置环境变量,或运行以下命令(PowerShell):');
71
+ console.log(` [Environment]::SetEnvironmentVariable("AIXX_API_KEY", "${apiKey}", "User")`);
72
+ console.log(` [Environment]::SetEnvironmentVariable("AIXX_BASE_URL", "${baseUrl}", "User")`);
73
+ }
74
+ }
@@ -0,0 +1,100 @@
1
+ # AIXX 快速开始
2
+
3
+ **30秒完成配置,立刻用AI调用万物。**
4
+
5
+ ---
6
+
7
+ ## 前置条件
8
+
9
+ 你需要一个 AIXX API Key。如果还没有:
10
+ 1. 访问 AIXX 平台注册
11
+ 2. 充值后获取 API Key(格式:`sk-xxxxx`)
12
+
13
+ ## 配置方式(三选一)
14
+
15
+ ### 方式1:环境变量(推荐,最干净)
16
+
17
+ > ⚠️ **安全警告**:当前后端用 HTTP 明文传输,存在凭据被嗅探风险。
18
+ > TODO(安全):后端配置好 HTTPS 证书后,请把下方 URL 改为 `https://14.103.27.195:8080/v1`。
19
+
20
+ 在你的 agent 配置中设置两个环境变量:
21
+
22
+ ```bash
23
+ export AIXX_API_KEY="sk-你的key"
24
+ export AIXX_BASE_URL="http://14.103.27.195:8080/v1"
25
+ ```
26
+
27
+ Windows (PowerShell):
28
+ ```powershell
29
+ $env:AIXX_API_KEY="sk-你的key"
30
+ $env:AIXX_BASE_URL="http://14.103.27.195:8080/v1"
31
+ ```
32
+
33
+ ### 方式2:OpenAI兼容配置
34
+
35
+ AIXX 兼容 OpenAI 接口。在支持 OpenAI 格式的工具中:
36
+
37
+ ```
38
+ API Base URL: http://14.103.27.195:8080/v1
39
+ API Key: sk-你的key
40
+ Model: deepseek-chat(或其他模型名)
41
+ ```
42
+
43
+ ### 方式3:直接在代码里用
44
+
45
+ ```python
46
+ from openai import OpenAI
47
+
48
+ client = OpenAI(
49
+ api_key="sk-你的key",
50
+ base_url="http://14.103.27.195:8080/v1"
51
+ )
52
+
53
+ response = client.chat.completions.create(
54
+ model="deepseek-chat",
55
+ messages=[{"role": "user", "content": "你好"}]
56
+ )
57
+ print(response.choices[0].message.content)
58
+ ```
59
+
60
+ ```javascript
61
+ import OpenAI from "openai";
62
+
63
+ const client = new OpenAI({
64
+ apiKey: "sk-你的key",
65
+ baseURL: "http://14.103.27.195:8080/v1",
66
+ });
67
+
68
+ const response = await client.chat.completions.create({
69
+ model: "deepseek-chat",
70
+ messages: [{ role: "user", content: "你好" }],
71
+ });
72
+ console.log(response.choices[0].message.content);
73
+ ```
74
+
75
+ ## 验证配置
76
+
77
+ 配置完后,让你的 agent 说一句:
78
+ > "帮我用 deepseek-chat 翻译:Hello World"
79
+
80
+ 如果返回中文翻译,说明配置成功。
81
+
82
+ ## 下一步
83
+
84
+ - 查看 [`./SKILL.md`](./SKILL.md) 了解完整能力
85
+ - 查看 [`./references/chat.md`](./references/chat.md) 了解调用细节
86
+ - 查看 [`./references/account.md`](./references/account.md) 查询用量
87
+
88
+ ## 常见问题
89
+
90
+ **Q: 报错 "Unauthorized"**
91
+ A: API Key 不对,检查是否完整复制(含 `sk-` 前缀)。
92
+
93
+ **Q: 报错 "insufficient quota"**
94
+ A: 额度不足,需要充值。
95
+
96
+ **Q: 报错 "model price not configured"**
97
+ A: 该模型未配置价格,联系管理员或换用 deepseek-chat。
98
+
99
+ ---
100
+ 维护者:龙龙(AIXX PM)| 2026-08-08
@@ -0,0 +1,99 @@
1
+ ---
2
+ name: aixx
3
+ version: 0.1.0
4
+ description: "AIXX - 让你的AI调用万物。一个skill,agent就能调用全世界的AI能力(LLM/出图/视频/数据),永远不用碰key、参数、文档。用户只需和自己的agent说话。"
5
+ metadata:
6
+ category: "productivity"
7
+ requires:
8
+ env: ["AIXX_API_KEY", "AIXX_BASE_URL"]
9
+ ---
10
+
11
+ # AIXX Skill
12
+
13
+ 你是 AI Agent。通过 AIXX 中转站调用各种 AI 能力。**用户永远不用碰 key、参数、文档——一切通过你(agent)和 AIXX 对接。**
14
+
15
+ **🚀 首次使用?先读 [`./QUICKSTART.md`](./QUICKSTART.md) - 30秒完成配置**
16
+
17
+ **CRITICAL - 调用前 MUST 先读取 [`./references/aixx-shared.md`](./references/aixx-shared.md),其中包含环境检查、调用方式、错误处理。**
18
+
19
+ ## 我是谁(AIXX)
20
+
21
+ AIXX = "AI的谷歌"。装一个skill,agent就能:
22
+ - 🤖 **调用各种LLM**:DeepSeek/GLM/Kimi/Claude/GPT等,自动选最优
23
+ - 🎨 **生成图片/视频**(2.0)
24
+ - 📊 **查询数据**:社媒数据(TikHub)、电商数据(JustOne)(2.0)
25
+ - 🔍 **搜索GitHub开源工具**,推荐最优+给安装指南(2.0)
26
+
27
+ **核心价值**:用户不碰key、不碰参数、不碰文档。一切通过对话。
28
+
29
+ ## 触发规则(重要)
30
+
31
+ 当用户提出以下类型的需求时,**触发本skill**(先别用你自己的能力直接答,先问AIXX):
32
+
33
+ ### 必须触发AIXX的场景
34
+ - 翻译、写作、改写、总结、分析、问答、代码生成等**需要LLM能力**的请求
35
+ - 指定了特定模型的请求("用Claude翻译""用DeepSeek分析")
36
+ - 查询用量/花费/余额("我花了多少""还剩多少额度")
37
+ - 切换模型("用最便宜的""切到GPT")
38
+
39
+ ### 不触发AIXX的场景(用agent自己能力)
40
+ - 简单闲聊、确认、日常对话
41
+ - agent本地就能做的简单操作(查时间、记事等)
42
+
43
+ ## 工作流程
44
+
45
+ ```
46
+ 用户提出需求
47
+
48
+ agent判断:需要AI能力吗?
49
+ ├─ 否 → agent自己答
50
+ └─ 是 → 调用AIXX
51
+
52
+ AIXX后端自动:
53
+ ① 识别需求(用哪个模型/能力)
54
+ ② 巡视官选择最优渠道(健康+便宜+快)
55
+ ③ 调用并返回结果
56
+ ④ 计费扣额度
57
+
58
+ agent把结果转述给用户
59
+ ```
60
+
61
+ ## 能力索引
62
+
63
+ 根据用户需求,读取对应业务域文档:
64
+
65
+ - **LLM对话调用**
66
+ - 入口:[`./references/chat.md`](./references/chat.md)
67
+ - 覆盖:翻译、写作、分析、问答、代码等,自动选模型或指定模型
68
+
69
+ - **用量查询与账户管理**
70
+ - 入口:[`./references/account.md`](./references/account.md)
71
+ - 覆盖:查余额、查花费、查用量、切换默认模型
72
+
73
+ - **环境配置**
74
+ - 入口:[`./references/aixx-shared.md`](./references/aixx-shared.md)
75
+ - 覆盖:API key检查、base_url配置、错误处理
76
+
77
+ ## 当前可用模型(1.0)
78
+
79
+ | 模型 | 说明 | 推荐场景 |
80
+ |---|---|---|
81
+ | `deepseek-chat` | DeepSeek,便宜能打 | 默认首选,日常任务 |
82
+ | `deepseek-reasoner` | DeepSeek推理 | 复杂推理、数学 |
83
+ | `glm-4-flash` | GLM智谱,免费档 | 轻量任务 |
84
+ | `glm-4-plus` | GLM智谱,旗舰 | 复杂任务 |
85
+ | `moonshot-v1-8k` | Kimi,短文本 | 短文翻译 |
86
+ | `moonshot-v1-32k` | Kimi,中长文 | 中长文档 |
87
+ | `moonshot-v1-128k` | Kimi,长文本 | 长文档分析 |
88
+
89
+ 更多模型和实时列表:调 `/v1/models` 接口查询。
90
+
91
+ ## 设计哲学(K哥的初心)
92
+
93
+ > 用户永远不用碰key、参数、文档。一切通过对话。
94
+ > AIXX的最佳形态是"没有形态"——用户和自己的agent说话即可。
95
+
96
+ 这个skill的存在感应该越低越好——它是个"隐形增强",让agent变强但用户感觉不到它在。
97
+
98
+ ---
99
+ 维护者:龙龙(AIXX PM)| 2026-08-08 建立
@@ -0,0 +1,44 @@
1
+ # 账户管理
2
+
3
+ 查询用量、余额、花费。
4
+
5
+ ---
6
+
7
+ ## 查余额
8
+
9
+ ```bash
10
+ curl {AIXX_BASE_URL}/dashboard/billing/subscription \
11
+ -H "Authorization: Bearer {AIXX_API_KEY}"
12
+ ```
13
+
14
+ 返回 JSON 含 `hard_limit_usd`(总额度)等信息。
15
+
16
+ ## 查用量
17
+
18
+ ```bash
19
+ curl "{AIXX_BASE_URL}/dashboard/billing/usage?start_date=2026-01-01&end_date=2026-12-31" \
20
+ -H "Authorization: Bearer {AIXX_API_KEY}"
21
+ ```
22
+
23
+ ## 查可用模型列表
24
+
25
+ ```bash
26
+ curl {AIXX_BASE_URL}/models \
27
+ -H "Authorization: Bearer {AIXX_API_KEY}"
28
+ ```
29
+
30
+ 返回所有可调用的模型。
31
+
32
+ ## 用户问"我花了多少"
33
+
34
+ agent 应该:
35
+ 1. 调 billing/usage 接口
36
+ 2. 把结果转述成自然语言:"您本月已使用 X 元,剩余 Y 元"
37
+ 3. 不要直接吐 JSON
38
+
39
+ ## 用户问"还剩多少额度"
40
+
41
+ 调 billing/subscription,告诉用户剩余额度。
42
+
43
+ ---
44
+ 维护者:龙龙(AIXX PM)| 2026-08-08
@@ -0,0 +1,59 @@
1
+ # AIXX 共享规则
2
+
3
+ **调用 AIXX 前 MUST 读这份。** 包含环境检查、调用方式、错误处理。
4
+
5
+ ---
6
+
7
+ ## 环境检查
8
+
9
+ 调用 AIXX 前,agent 必须确认两个变量:
10
+
11
+ ```
12
+ AIXX_API_KEY = sk-xxxxx(用户的AIXX key)
13
+ AIXX_BASE_URL = http://14.103.27.195:8080/v1(AIXX后端地址)
14
+ ```
15
+
16
+ **如果变量没配**:告诉用户"请先配置 AIXX_API_KEY 和 AIXX_BASE_URL,参考 QUICKSTART.md"
17
+
18
+ ## 调用方式
19
+
20
+ AIXX 兼容 OpenAI 接口格式。所有调用走:
21
+
22
+ ```
23
+ POST {AIXX_BASE_URL}/chat/completions
24
+ Authorization: Bearer {AIXX_API_KEY}
25
+ Content-Type: application/json
26
+
27
+ {
28
+ "model": "deepseek-chat",
29
+ "messages": [{"role": "user", "content": "用户的需求"}]
30
+ }
31
+ ```
32
+
33
+ **agent 永远不要直接用 openai 库的默认配置调——必须用 AIXX 的 base_url 和 key。**
34
+
35
+ ## 错误处理
36
+
37
+ | 错误 | 含义 | agent该怎么做 |
38
+ |---|---|---|
39
+ | 401 Unauthorized | key无效或过期 | 提示用户检查key |
40
+ | 402 insufficient quota | 额度不足 | 提示用户充值 |
41
+ | 404 model not found | 模型名不对 | 换用 deepseek-chat(默认) |
42
+ | 429 rate limit | 限流 | 等几秒重试 |
43
+ | 5xx | AIXX后端故障 | 告诉用户"稍后再试" |
44
+
45
+ ## 计费说明
46
+
47
+ - 每次调用按 token 数计费
48
+ - 不同模型价格不同(deepseek 最便宜)
49
+ - 用户可在账户里查余额和用量
50
+
51
+ ## 输出协议
52
+
53
+ 调用成功后,agent 应该:
54
+ 1. 把模型返回的内容**转述给用户**(不要直接吐JSON)
55
+ 2. 如果用户问"用了什么模型/花了多少",调 `/v1/dashboard/billing/usage` 查
56
+ 3. 不要暴露技术细节(key、base_url)给用户
57
+
58
+ ---
59
+ 维护者:龙龙(AIXX PM)| 2026-08-08
@@ -0,0 +1,56 @@
1
+ # LLM 对话调用
2
+
3
+ 翻译、写作、分析、问答、代码等所有需要 LLM 能力的请求。
4
+
5
+ ---
6
+
7
+ ## 调用示例
8
+
9
+ ### 基础调用(用默认模型 deepseek-chat)
10
+
11
+ ```bash
12
+ curl -X POST {AIXX_BASE_URL}/chat/completions \
13
+ -H "Authorization: Bearer {AIXX_API_KEY}" \
14
+ -H "Content-Type: application/json" \
15
+ -d '{
16
+ "model": "deepseek-chat",
17
+ "messages": [{"role": "user", "content": "用户的需求"}]
18
+ }'
19
+ ```
20
+
21
+ ### 指定模型
22
+
23
+ 用户说"用Kimi" → model 用 `moonshot-v1-8k`
24
+ 用户说"用GLM" → model 用 `glm-4-flash` 或 `glm-4-plus`
25
+ 用户说"用最便宜的" → model 用 `deepseek-chat`
26
+ 用户说"用推理强的" → model 用 `deepseek-reasoner`
27
+
28
+ ### 流式输出
29
+
30
+ ```json
31
+ {
32
+ "model": "deepseek-chat",
33
+ "messages": [...],
34
+ "stream": true
35
+ }
36
+ ```
37
+
38
+ ## 模型选择建议(agent自动决策)
39
+
40
+ | 场景 | 推荐模型 | 理由 |
41
+ |---|---|---|
42
+ | 简短翻译/问答 | deepseek-chat | 最便宜,足够用 |
43
+ | 长文档分析 | moonshot-v1-128k | Kimi长文本强 |
44
+ | 复杂推理 | deepseek-reasoner | 专门的推理模型 |
45
+ | 中文写作 | glm-4-plus | GLM中文表现好 |
46
+ | 代码生成 | deepseek-chat | DeepSeek代码能力强 |
47
+
48
+ ## 意图识别
49
+
50
+ agent 接收到用户消息后,先判断:
51
+ 1. **是否需要调LLM?** 简单确认/闲聊不用
52
+ 2. **用哪个模型?** 用户指定就用指定的,没指定就用 deepseek-chat
53
+ 3. **怎么调?** 标准 OpenAI 格式,AIXX base_url + key
54
+
55
+ ---
56
+ 维护者:龙龙(AIXX PM)| 2026-08-08