xx-ai-cli 0.1.8 → 0.1.10
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/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +29 -13
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +10 -3
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/benchmark.d.ts +8 -0
- package/dist/commands/benchmark.d.ts.map +1 -0
- package/dist/commands/benchmark.js +480 -0
- package/dist/commands/benchmark.js.map +1 -0
- package/dist/core/search.d.ts +5 -1
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/search.js +12 -1
- package/dist/core/search.js.map +1 -1
- package/dist/core/tools.d.ts +12 -22
- package/dist/core/tools.d.ts.map +1 -1
- package/dist/core/tools.js +95 -34
- package/dist/core/tools.js.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import { config, PROVIDER_LABELS } from '../core/config.js';
|
|
6
|
+
import { chat } from '../core/stream.js';
|
|
7
|
+
import { clearToolCache, executeTool } from '../core/tools.js';
|
|
8
|
+
import { theme } from '../ui/renderer.js';
|
|
9
|
+
// ─── 测试用例素材 ─────────────────────────────────────────────
|
|
10
|
+
function makeSampleTs() {
|
|
11
|
+
return `// benchmark_sample.ts - TypeScript 工具函数示例
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
|
|
14
|
+
// 定义用户接口
|
|
15
|
+
interface User {
|
|
16
|
+
id: number;
|
|
17
|
+
name: string;
|
|
18
|
+
email: string;
|
|
19
|
+
createdAt: Date;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Line 10: 格式化用户显示名称 - 取 name 的第一个空格前的部分作为昵称
|
|
23
|
+
function formatDisplayName(user: User): string {
|
|
24
|
+
return user.name.split(' ')[0];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function calculateAge(birthYear: number): number {
|
|
28
|
+
return new Date().getFullYear() - birthYear;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function formatEmail(email: string): string {
|
|
32
|
+
const [local, domain] = email.split('@');
|
|
33
|
+
return \`\${local[0]}***@\${domain}\`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
class UserManager extends EventEmitter {
|
|
37
|
+
private users: Map<number, User> = new Map();
|
|
38
|
+
|
|
39
|
+
addUser(user: User): void {
|
|
40
|
+
this.users.set(user.id, user);
|
|
41
|
+
this.emit('userAdded', user);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
getUser(id: number): User | undefined {
|
|
45
|
+
return this.users.get(id);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
getAllUsers(): User[] {
|
|
49
|
+
return Array.from(this.users.values());
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
removeUser(id: number): boolean {
|
|
53
|
+
return this.users.delete(id);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { User, UserManager, formatDisplayName, calculateAge, formatEmail };
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
function makeBuggyTs() {
|
|
61
|
+
return `// benchmark_buggy.ts - 包含一个已知 off-by-one bug
|
|
62
|
+
function calculateTotal(items: { price: number; quantity: number }[]): number {
|
|
63
|
+
let total = 0;
|
|
64
|
+
// BUG: 循环条件应为 i < items.length,使用 <= 会导致越界访问 undefined
|
|
65
|
+
for (let i = 0; i <= items.length; i++) {
|
|
66
|
+
total += items[i].price * items[i].quantity;
|
|
67
|
+
}
|
|
68
|
+
return total;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function formatPrice(amount: number): string {
|
|
72
|
+
return \`¥\${amount.toFixed(2)}\`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export { calculateTotal, formatPrice };
|
|
76
|
+
`;
|
|
77
|
+
}
|
|
78
|
+
function makeProjectFiles(tmpDir) {
|
|
79
|
+
fs.writeFileSync(path.join(tmpDir, 'benchmark_readme.md'), '# Mini Project\n\n这是一个基准测试用的小项目。\n\n## 功能列表\n\n- 功能一:数据处理\n- 功能二:格式化输出\n');
|
|
80
|
+
fs.writeFileSync(path.join(tmpDir, 'benchmark_index.ts'), 'export const VERSION = "1.0.0";\nexport { calculateTotal } from "./benchmark_calc";\n');
|
|
81
|
+
fs.writeFileSync(path.join(tmpDir, 'benchmark_calc.ts'), 'export function calculateTotal(a: number, b: number): number { return a + b; }\n');
|
|
82
|
+
}
|
|
83
|
+
// ─── 5 个标准测试用例 ─────────────────────────────────────────
|
|
84
|
+
function getBenchmarkCases() {
|
|
85
|
+
return [
|
|
86
|
+
{
|
|
87
|
+
id: 1,
|
|
88
|
+
name: '纯对话基线',
|
|
89
|
+
category: 'zero-tool',
|
|
90
|
+
description: '无工具调用,测量工具自身固定税(System Prompt + 工具定义)',
|
|
91
|
+
input: '用一句话解释什么是 TypeScript 的泛型,尽量简洁。',
|
|
92
|
+
useTools: false,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 2,
|
|
96
|
+
name: '单文件读取',
|
|
97
|
+
category: 'file-read',
|
|
98
|
+
description: '读取一个 40 行的 TS 文件,回答关于第 10 行的问题',
|
|
99
|
+
input: '当前目录下有 benchmark_sample.ts,直接用 read_file 读取它(路径就是 benchmark_sample.ts),只用一句话告诉我第 10 行的函数做了什么。',
|
|
100
|
+
setup: (tmpDir) => {
|
|
101
|
+
fs.writeFileSync(path.join(tmpDir, 'benchmark_sample.ts'), makeSampleTs());
|
|
102
|
+
},
|
|
103
|
+
useTools: true,
|
|
104
|
+
maxSteps: 3,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: 3,
|
|
108
|
+
name: 'Bug 修复(单步编辑)',
|
|
109
|
+
category: 'file-edit',
|
|
110
|
+
description: '读取含 bug 的文件,找出并修复越界访问问题',
|
|
111
|
+
input: '当前目录下有 benchmark_buggy.ts,直接用 read_file 读取它(路径就是 benchmark_buggy.ts),找出循环条件 bug,用 replace_in_file 修复(只改这一处)。',
|
|
112
|
+
setup: (tmpDir) => {
|
|
113
|
+
fs.writeFileSync(path.join(tmpDir, 'benchmark_buggy.ts'), makeBuggyTs());
|
|
114
|
+
},
|
|
115
|
+
useTools: true,
|
|
116
|
+
maxSteps: 4,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 4,
|
|
120
|
+
name: '多步骤项目任务',
|
|
121
|
+
category: 'multi-step',
|
|
122
|
+
description: '浏览 3 个项目文件后修改 README,测试历史消息增长曲线',
|
|
123
|
+
input: '当前目录(用 "." 表示)有 benchmark_readme.md、benchmark_index.ts、benchmark_calc.ts,依次执行:1) project_tree 路径用 ".";2) read_file 读取 benchmark_readme.md;3) replace_in_file 在末尾追加 "## 贡献指南"。',
|
|
124
|
+
setup: (tmpDir) => {
|
|
125
|
+
makeProjectFiles(tmpDir);
|
|
126
|
+
},
|
|
127
|
+
useTools: true,
|
|
128
|
+
maxSteps: 5,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: 5,
|
|
132
|
+
name: '搜索 + 总结',
|
|
133
|
+
category: 'search',
|
|
134
|
+
description: '调用必应搜索(无需 Key),整合结果输出摘要',
|
|
135
|
+
input: '只调用一次 web_search 搜索 "DeepSeek API 接入方法",拿到结果后直接用三句话总结,禁止重复搜索。',
|
|
136
|
+
useTools: true,
|
|
137
|
+
maxSteps: 3,
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
}
|
|
141
|
+
// ─── Agent 轻量运行器(Benchmark 专用,自动确认)────────────
|
|
142
|
+
async function runAgentForBenchmark(input, systemPrompt, modelConfig, useTools, maxSteps, workdir) {
|
|
143
|
+
// benchmark 模式强制自动确认
|
|
144
|
+
config.set('agentAutoConfirm', true);
|
|
145
|
+
// 切换工作目录到临时目录,让工具能找到测试文件
|
|
146
|
+
const originalCwd = process.cwd();
|
|
147
|
+
process.chdir(workdir);
|
|
148
|
+
const messages = [
|
|
149
|
+
{ role: 'system', content: systemPrompt },
|
|
150
|
+
{ role: 'user', content: input },
|
|
151
|
+
];
|
|
152
|
+
const stepBreakdown = [];
|
|
153
|
+
let step = 0;
|
|
154
|
+
let errorMsg;
|
|
155
|
+
// 根据原始用户输入动态选择工具集(与 agent.ts 保持一致)
|
|
156
|
+
const { selectTools } = await import('../core/tools.js');
|
|
157
|
+
const activeTools = useTools ? selectTools(input) : undefined;
|
|
158
|
+
try {
|
|
159
|
+
while (step < maxSteps) {
|
|
160
|
+
step++;
|
|
161
|
+
// 关键优化:如果上一步已经有工具结果(tool 角色消息),
|
|
162
|
+
// 说明当前步是「消化结果」步,不需要再提供工具(只需输出文本)
|
|
163
|
+
const lastMsg = messages[messages.length - 1];
|
|
164
|
+
const isAfterToolResult = lastMsg?.role === 'tool';
|
|
165
|
+
const tools = isAfterToolResult ? undefined : activeTools;
|
|
166
|
+
const response = await chat(modelConfig, messages, {
|
|
167
|
+
stream: false,
|
|
168
|
+
tools,
|
|
169
|
+
});
|
|
170
|
+
if (response.usage) {
|
|
171
|
+
stepBreakdown.push({
|
|
172
|
+
step,
|
|
173
|
+
promptTokens: response.usage.promptTokens,
|
|
174
|
+
completionTokens: response.usage.completionTokens,
|
|
175
|
+
totalTokens: response.usage.totalTokens,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// 有工具调用则继续
|
|
179
|
+
if (response.toolCalls && response.toolCalls.length > 0) {
|
|
180
|
+
messages.push({
|
|
181
|
+
role: 'assistant',
|
|
182
|
+
content: response.content ?? '',
|
|
183
|
+
tool_calls: response.toolCalls,
|
|
184
|
+
});
|
|
185
|
+
for (const toolCall of response.toolCalls) {
|
|
186
|
+
const result = await executeTool(toolCall);
|
|
187
|
+
messages.push({
|
|
188
|
+
role: 'tool',
|
|
189
|
+
content: result.content,
|
|
190
|
+
tool_call_id: result.tool_call_id,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// 纯文字回复:任务完成
|
|
196
|
+
messages.push({ role: 'assistant', content: response.content ?? '' });
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
errorMsg = err.message;
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
process.chdir(originalCwd);
|
|
205
|
+
config.set('agentAutoConfirm', false);
|
|
206
|
+
}
|
|
207
|
+
// apiCalls = stepBreakdown 的长度,即实际成功收到响应的次数
|
|
208
|
+
return { steps: step, apiCalls: stepBreakdown.length, stepBreakdown, error: errorMsg };
|
|
209
|
+
}
|
|
210
|
+
// ─── 费用估算 ─────────────────────────────────────────────────
|
|
211
|
+
function estimateCostYuan(totalTokens) {
|
|
212
|
+
const yuan = (totalTokens / 1_000_000) * 1.5;
|
|
213
|
+
if (yuan < 0.0001)
|
|
214
|
+
return '< ¥0.0001';
|
|
215
|
+
return `¥${yuan.toFixed(4)}`;
|
|
216
|
+
}
|
|
217
|
+
// ─── 固定税分解(Case 1 专用)────────────────────────────────
|
|
218
|
+
function analyzeFixedTax(stepBreakdown, systemPrompt, userInput) {
|
|
219
|
+
if (!stepBreakdown.length)
|
|
220
|
+
return undefined;
|
|
221
|
+
// token 估算:1 token ≈ 4 字符(中英文混合取均值)
|
|
222
|
+
const systemTokens = Math.ceil(systemPrompt.length / 3.5);
|
|
223
|
+
const userTokens = Math.ceil(userInput.length / 3.5);
|
|
224
|
+
const toolTokens = stepBreakdown[0].promptTokens - systemTokens - userTokens;
|
|
225
|
+
return {
|
|
226
|
+
systemPrompt: systemTokens,
|
|
227
|
+
toolDefinitions: Math.max(toolTokens, 0),
|
|
228
|
+
userMessage: userTokens,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// ─── 渲染结果表格 ─────────────────────────────────────────────
|
|
232
|
+
function renderTable(results, model) {
|
|
233
|
+
const cols = { id: 4, name: 16, cat: 11, input: 8, output: 7, total: 8, api: 4, steps: 5, cost: 10 };
|
|
234
|
+
const line = '─'.repeat(83);
|
|
235
|
+
console.log('\n');
|
|
236
|
+
console.log(chalk.bold(' XX-AI-CLI Token Benchmark'));
|
|
237
|
+
console.log(chalk.dim(` 模型: ${model} | 时间: ${new Date().toLocaleString('zh-CN')}`));
|
|
238
|
+
console.log(' ' + line);
|
|
239
|
+
const header = [
|
|
240
|
+
'Case'.padEnd(cols.id),
|
|
241
|
+
'测试项目'.padEnd(cols.name),
|
|
242
|
+
'类型'.padEnd(cols.cat),
|
|
243
|
+
'上下文'.padStart(cols.input),
|
|
244
|
+
'输出'.padStart(cols.output),
|
|
245
|
+
'计费合计'.padStart(cols.total),
|
|
246
|
+
'API'.padStart(cols.api),
|
|
247
|
+
'步数'.padStart(cols.steps),
|
|
248
|
+
'估算费用'.padStart(cols.cost),
|
|
249
|
+
].join(' ');
|
|
250
|
+
console.log(' ' + chalk.bold(header));
|
|
251
|
+
console.log(' ' + line);
|
|
252
|
+
let totalPrompt = 0, totalCompletion = 0, totalAll = 0, totalApiCalls = 0;
|
|
253
|
+
for (const r of results) {
|
|
254
|
+
if (r.status === 'skip') {
|
|
255
|
+
console.log(' ' + [
|
|
256
|
+
String(r.id).padEnd(cols.id),
|
|
257
|
+
chalk.dim(r.name.slice(0, 14).padEnd(cols.name)),
|
|
258
|
+
chalk.dim(r.category.slice(0, 9).padEnd(cols.cat)),
|
|
259
|
+
chalk.dim(' — skip — —'.padStart(cols.input + cols.output + cols.total + cols.steps + cols.cost + 8)),
|
|
260
|
+
].join(' '));
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (r.status === 'error') {
|
|
264
|
+
console.log(' ' + [
|
|
265
|
+
String(r.id).padEnd(cols.id),
|
|
266
|
+
chalk.red(r.name.slice(0, 14).padEnd(cols.name)),
|
|
267
|
+
r.category.slice(0, 9).padEnd(cols.cat),
|
|
268
|
+
chalk.red('ERROR').padStart(cols.input + cols.output + cols.total + cols.steps + cols.cost + 8),
|
|
269
|
+
].join(' '));
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
totalPrompt += r.promptTokens;
|
|
273
|
+
totalCompletion += r.completionTokens;
|
|
274
|
+
totalAll += r.billedTokens;
|
|
275
|
+
totalApiCalls += r.apiCalls;
|
|
276
|
+
const row = [
|
|
277
|
+
chalk.cyan(String(r.id).padEnd(cols.id)),
|
|
278
|
+
r.name.slice(0, 14).padEnd(cols.name),
|
|
279
|
+
chalk.dim(r.category.slice(0, 9).padEnd(cols.cat)),
|
|
280
|
+
chalk.cyan(String(r.promptTokens).padStart(cols.input)),
|
|
281
|
+
String(r.completionTokens).padStart(cols.output),
|
|
282
|
+
chalk.bold(String(r.billedTokens).padStart(cols.total)),
|
|
283
|
+
chalk.magenta(String(r.apiCalls).padStart(cols.api)),
|
|
284
|
+
String(r.steps).padStart(cols.steps),
|
|
285
|
+
chalk.yellow(r.estimatedCost.padStart(cols.cost)),
|
|
286
|
+
].join(' ');
|
|
287
|
+
console.log(' ' + row);
|
|
288
|
+
}
|
|
289
|
+
console.log(' ' + line);
|
|
290
|
+
console.log(' ' + [
|
|
291
|
+
chalk.bold('合计'.padEnd(cols.id + cols.name + cols.cat + 4)),
|
|
292
|
+
chalk.bold(String(totalPrompt).padStart(cols.input)),
|
|
293
|
+
chalk.bold(String(totalCompletion).padStart(cols.output)),
|
|
294
|
+
chalk.bold(String(totalAll).padStart(cols.total)),
|
|
295
|
+
chalk.bold.magenta(String(totalApiCalls).padStart(cols.api)),
|
|
296
|
+
''.padStart(cols.steps),
|
|
297
|
+
chalk.bold.yellow(estimateCostYuan(totalAll).padStart(cols.cost)),
|
|
298
|
+
].join(' '));
|
|
299
|
+
console.log(' ' + line);
|
|
300
|
+
}
|
|
301
|
+
// ─── 固定税分解展示(Case 1)─────────────────────────────────
|
|
302
|
+
function renderFixedTax(result) {
|
|
303
|
+
if (!result.fixedTaxBreakdown || result.status !== 'ok')
|
|
304
|
+
return;
|
|
305
|
+
const { systemPrompt, toolDefinitions, userMessage } = result.fixedTaxBreakdown;
|
|
306
|
+
const total = systemPrompt + toolDefinitions + userMessage;
|
|
307
|
+
console.log('\n' + chalk.bold(' 📊 Case 1 固定税分解(每次调用的最低开销)'));
|
|
308
|
+
console.log(chalk.dim(' ─────────────────────────────────────────'));
|
|
309
|
+
console.log(` 系统提示词 (System Prompt): ${chalk.cyan(String(systemPrompt).padStart(5))} tokens`);
|
|
310
|
+
console.log(` 工具定义 (Tool Schema): ${chalk.cyan(String(toolDefinitions).padStart(5))} tokens`);
|
|
311
|
+
console.log(` 用户消息 (User Message): ${chalk.cyan(String(userMessage).padStart(5))} tokens`);
|
|
312
|
+
console.log(chalk.dim(' ─────────────────────────────────────────'));
|
|
313
|
+
console.log(` 固定税合计: ${chalk.bold.cyan(String(total).padStart(5))} tokens / 每次调用`);
|
|
314
|
+
// 与 Claude Code 的架构对比
|
|
315
|
+
console.log('\n' + chalk.bold(' 🔍 架构对比参考(固定税部分)'));
|
|
316
|
+
console.log(chalk.dim(' 来源:社区逆向分析 / 开源项目源码,仅供参考'));
|
|
317
|
+
console.log(chalk.dim(' ─────────────────────────────────────────'));
|
|
318
|
+
const rows = [
|
|
319
|
+
['XX-AI-CLI(本工具)', systemPrompt + toolDefinitions, '实测', true],
|
|
320
|
+
['Aider(开源对标)', 2500, '源码统计', false],
|
|
321
|
+
['Claude Code', 9000, '社区分析估算', false],
|
|
322
|
+
['Cursor Agent', 6000, '泄露 prompt 估算', false],
|
|
323
|
+
];
|
|
324
|
+
for (const [name, tokens, source, isUs] of rows) {
|
|
325
|
+
const bar = '█'.repeat(Math.min(Math.round(tokens / 200), 40));
|
|
326
|
+
const label = isUs ? chalk.green(name.padEnd(22)) : name.padEnd(22);
|
|
327
|
+
console.log(` ${label} ${chalk.dim(String(tokens).padStart(6))} tokens ${chalk.blue(bar)} ${chalk.dim(source)}`);
|
|
328
|
+
}
|
|
329
|
+
console.log(chalk.dim('\n 注:Claude Code 有 Prompt Caching(重复调用大幅减费),国内模型暂不支持此特性'));
|
|
330
|
+
}
|
|
331
|
+
// ─── 每步 token 增长曲线(Case 4)────────────────────────────
|
|
332
|
+
function renderGrowthCurve(result) {
|
|
333
|
+
if (result.category !== 'multi-step' || result.status !== 'ok')
|
|
334
|
+
return;
|
|
335
|
+
if (!result.stepBreakdown.length)
|
|
336
|
+
return;
|
|
337
|
+
console.log('\n' + chalk.bold(' 📈 Case 4 各步输入 token 增长(历史消息累积效应)'));
|
|
338
|
+
console.log(chalk.dim(' ─────────────────────────────────────────────'));
|
|
339
|
+
for (const s of result.stepBreakdown) {
|
|
340
|
+
const bar = '▓'.repeat(Math.min(Math.round(s.promptTokens / 80), 40));
|
|
341
|
+
console.log(` Step ${s.step} 输入 ${chalk.cyan(String(s.promptTokens).padStart(5))} tokens ${chalk.blue(bar)}`);
|
|
342
|
+
}
|
|
343
|
+
if (result.stepBreakdown.length >= 2) {
|
|
344
|
+
const first = result.stepBreakdown[0].promptTokens;
|
|
345
|
+
const last = result.stepBreakdown[result.stepBreakdown.length - 1].promptTokens;
|
|
346
|
+
const growth = ((last - first) / first * 100).toFixed(0);
|
|
347
|
+
console.log(chalk.dim(`\n 首步 → 末步输入增长 ${growth}%(滑动窗口限制在 20 条消息内)`));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// ─── 导出 JSON ────────────────────────────────────────────────
|
|
351
|
+
function exportResults(results, model) {
|
|
352
|
+
const outPath = path.join(process.cwd(), 'benchmark-result.json');
|
|
353
|
+
const payload = {
|
|
354
|
+
tool: 'xx-ai-cli',
|
|
355
|
+
version: 'latest',
|
|
356
|
+
model,
|
|
357
|
+
date: new Date().toISOString(),
|
|
358
|
+
cases: results,
|
|
359
|
+
summary: {
|
|
360
|
+
totalTokens: results.filter(r => r.status === 'ok').reduce((s, r) => s + r.billedTokens, 0),
|
|
361
|
+
totalCost: estimateCostYuan(results.filter(r => r.status === 'ok').reduce((s, r) => s + r.billedTokens, 0)),
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
fs.writeFileSync(outPath, JSON.stringify(payload, null, 2));
|
|
365
|
+
console.log('\n' + theme.success(`✔ 结果已导出: ${outPath}`));
|
|
366
|
+
console.log(chalk.dim(' 可发送给社区用于横向对比,或提交到 GitHub Issues'));
|
|
367
|
+
}
|
|
368
|
+
// ─── 主入口 ───────────────────────────────────────────────────
|
|
369
|
+
export async function benchmarkCommand(options = {}) {
|
|
370
|
+
const provider = options.model ?? config.get('defaultProvider');
|
|
371
|
+
const modelConfig = config.getProvider(provider);
|
|
372
|
+
const providerLabel = PROVIDER_LABELS[provider];
|
|
373
|
+
if (!modelConfig) {
|
|
374
|
+
console.log(theme.error(`未配置 ${providerLabel} 的 API Key,请先运行 xxcli init`));
|
|
375
|
+
process.exit(1);
|
|
376
|
+
}
|
|
377
|
+
const allCases = getBenchmarkCases();
|
|
378
|
+
const casesToRun = options.case
|
|
379
|
+
? allCases.filter(c => c.id === options.case)
|
|
380
|
+
: allCases;
|
|
381
|
+
if (!casesToRun.length) {
|
|
382
|
+
console.log(theme.error(`找不到 Case ${options.case}`));
|
|
383
|
+
process.exit(1);
|
|
384
|
+
}
|
|
385
|
+
// System Prompt(与 agent.ts 保持一致)
|
|
386
|
+
const systemPrompt = `你是 XX-AI Agent,运行在命令行终端。工作目录:${process.cwd()}
|
|
387
|
+
|
|
388
|
+
规则:
|
|
389
|
+
- 安装工具直接用 run_command: "xxcli install <工具名>",禁止先搜索
|
|
390
|
+
- 修改文件优先用 replace_in_file(比 write_file 省 token)
|
|
391
|
+
- 用中文简洁回复,不要重复已知信息
|
|
392
|
+
- 每步只做一件事,完成后再继续`;
|
|
393
|
+
console.log('\n' + chalk.bold('🧪 XX-AI-CLI Token Benchmark'));
|
|
394
|
+
console.log(chalk.dim(` 模型: ${providerLabel} | 共 ${casesToRun.length} 个测试用例\n`));
|
|
395
|
+
const results = [];
|
|
396
|
+
// 创建统一临时目录
|
|
397
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'xxcli-bench-'));
|
|
398
|
+
try {
|
|
399
|
+
for (const c of casesToRun) {
|
|
400
|
+
process.stdout.write(chalk.dim(` [${c.id}/${casesToRun.length}] ${c.name} ... `));
|
|
401
|
+
// 跳过需要搜索但未配置的 case
|
|
402
|
+
if (c.requiresSearch && !config.get('search')?.apiKey) {
|
|
403
|
+
process.stdout.write(chalk.yellow('skip(未配置搜索 Key)\n'));
|
|
404
|
+
results.push({
|
|
405
|
+
id: c.id, name: c.name, category: c.category,
|
|
406
|
+
promptTokens: 0, completionTokens: 0, billedTokens: 0,
|
|
407
|
+
apiCalls: 0,
|
|
408
|
+
steps: 0, stepBreakdown: [], durationMs: 0,
|
|
409
|
+
estimatedCost: '—', status: 'skip',
|
|
410
|
+
});
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
// 准备测试文件
|
|
414
|
+
if (c.setup)
|
|
415
|
+
c.setup(tmpDir);
|
|
416
|
+
clearToolCache();
|
|
417
|
+
const start = Date.now();
|
|
418
|
+
const { steps, apiCalls, stepBreakdown, error } = await runAgentForBenchmark(c.input, systemPrompt, modelConfig, c.useTools ?? false, c.maxSteps ?? 1, tmpDir);
|
|
419
|
+
const durationMs = Date.now() - start;
|
|
420
|
+
if (error && !stepBreakdown.length) {
|
|
421
|
+
process.stdout.write(chalk.red(`错误: ${error}\n`));
|
|
422
|
+
results.push({
|
|
423
|
+
id: c.id, name: c.name, category: c.category,
|
|
424
|
+
promptTokens: 0, completionTokens: 0, billedTokens: 0,
|
|
425
|
+
apiCalls: 0,
|
|
426
|
+
steps, stepBreakdown: [], durationMs,
|
|
427
|
+
estimatedCost: '—', status: 'error', error,
|
|
428
|
+
});
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
// 最终上下文大小 = 最后一步的 prompt tokens(与其他工具口径一致,不重复累加)
|
|
432
|
+
const lastPrompt = stepBreakdown[stepBreakdown.length - 1]?.promptTokens ?? 0;
|
|
433
|
+
// 实际产生的输出 tokens = 所有步骤 completion 之和
|
|
434
|
+
const totalCompletion = stepBreakdown.reduce((s, x) => s + x.completionTokens, 0);
|
|
435
|
+
// 计费总量 = 所有步骤 prompt+completion 之和(真实 API 费用)
|
|
436
|
+
const billedTokens = stepBreakdown.reduce((s, x) => s + x.totalTokens, 0);
|
|
437
|
+
process.stdout.write(chalk.green(`完成 (ctx:${lastPrompt} / billed:${billedTokens} tokens / api:${apiCalls}次, ${(durationMs / 1000).toFixed(1)}s)\n`));
|
|
438
|
+
const result = {
|
|
439
|
+
id: c.id, name: c.name, category: c.category,
|
|
440
|
+
promptTokens: lastPrompt,
|
|
441
|
+
completionTokens: totalCompletion,
|
|
442
|
+
billedTokens,
|
|
443
|
+
apiCalls,
|
|
444
|
+
steps,
|
|
445
|
+
stepBreakdown,
|
|
446
|
+
durationMs,
|
|
447
|
+
estimatedCost: estimateCostYuan(billedTokens),
|
|
448
|
+
status: 'ok',
|
|
449
|
+
};
|
|
450
|
+
// Case 1:分析固定税
|
|
451
|
+
if (c.id === 1) {
|
|
452
|
+
result.fixedTaxBreakdown = analyzeFixedTax(stepBreakdown, systemPrompt, c.input);
|
|
453
|
+
}
|
|
454
|
+
results.push(result);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
finally {
|
|
458
|
+
// 清理临时文件
|
|
459
|
+
try {
|
|
460
|
+
fs.rmSync(tmpDir, { recursive: true });
|
|
461
|
+
}
|
|
462
|
+
catch { /* ignore */ }
|
|
463
|
+
}
|
|
464
|
+
// 渲染结果
|
|
465
|
+
renderTable(results, providerLabel);
|
|
466
|
+
// 固定税分解(Case 1)
|
|
467
|
+
const case1 = results.find(r => r.id === 1);
|
|
468
|
+
if (case1)
|
|
469
|
+
renderFixedTax(case1);
|
|
470
|
+
// 增长曲线(Case 4)
|
|
471
|
+
const case4 = results.find(r => r.id === 4);
|
|
472
|
+
if (case4)
|
|
473
|
+
renderGrowthCurve(case4);
|
|
474
|
+
// 导出
|
|
475
|
+
if (options.export)
|
|
476
|
+
exportResults(results, providerLabel);
|
|
477
|
+
console.log('\n' + chalk.dim(' 提示: 用 --export 导出 JSON,可与社区共享横向对比结果'));
|
|
478
|
+
console.log(chalk.dim(' 与其他工具对比请参考: https://github.com/xxyj/xx-ai-cli#benchmark\n'));
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/commands/benchmark.ts"],"names":[],"mappings":"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"}
|
package/dist/core/search.d.ts
CHANGED
|
@@ -10,5 +10,9 @@ export interface SearchResponse {
|
|
|
10
10
|
}
|
|
11
11
|
export declare function webSearch(query: string, maxResults?: number): Promise<SearchResponse>;
|
|
12
12
|
/** 将搜索结果格式化为供 AI 读取的文本 */
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* 格式化搜索结果供模型阅读
|
|
15
|
+
* @param forModel 是否为模型输入优化(去掉 URL、压缩 snippet),默认 true
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatSearchResults(resp: SearchResponse, forModel?: boolean): string;
|
|
14
18
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8MD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC3F;AAED,0BAA0B;AAC1B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8MD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC3F;AAED,0BAA0B;AAC1B;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,UAAO,GAAG,MAAM,CAcjF"}
|
package/dist/core/search.js
CHANGED
|
@@ -209,9 +209,20 @@ export async function webSearch(query, maxResults) {
|
|
|
209
209
|
return { query, results, provider };
|
|
210
210
|
}
|
|
211
211
|
/** 将搜索结果格式化为供 AI 读取的文本 */
|
|
212
|
-
|
|
212
|
+
/**
|
|
213
|
+
* 格式化搜索结果供模型阅读
|
|
214
|
+
* @param forModel 是否为模型输入优化(去掉 URL、压缩 snippet),默认 true
|
|
215
|
+
*/
|
|
216
|
+
export function formatSearchResults(resp, forModel = true) {
|
|
213
217
|
if (!resp.results.length)
|
|
214
218
|
return `搜索 "${resp.query}" 无结果`;
|
|
219
|
+
if (forModel) {
|
|
220
|
+
// 模型输入模式:去掉 URL(节省 ~100 tokens/条),snippet 缩到 150 字符
|
|
221
|
+
return resp.results
|
|
222
|
+
.map((r, i) => `[${i + 1}] ${r.title}\n${r.snippet.slice(0, 150)}`)
|
|
223
|
+
.join('\n---\n');
|
|
224
|
+
}
|
|
225
|
+
// 用户展示模式:完整信息
|
|
215
226
|
return resp.results
|
|
216
227
|
.map((r, i) => `[${i + 1}] ${r.title}\n${r.url ? `URL: ${r.url}\n` : ''}${r.snippet}`)
|
|
217
228
|
.join('\n\n');
|
package/dist/core/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"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"}
|