@aipack-ai/eval 1.1.6 → 1.1.7

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/index.d.ts CHANGED
@@ -20,5 +20,10 @@ export type { CaseScore } from './src/core/scorer';
20
20
  export { validateEvalCase } from './src/core/validate';
21
21
  export { loadCases, defaultCasesDir, packageRoot, } from './src/core/loader';
22
22
  export type { LoadCasesResult } from './src/core/loader';
23
- export { runEval } from './src/core/runner';
23
+ export { runEval, skipReason } from './src/core/runner';
24
24
  export { renderMarkdown, writeReport, writeBaseline, readBaseline, reportToBaseline, compareBaseline, finalizeReport, } from './src/core/report';
25
+ export type { RenderOptions } from './src/core/report';
26
+ export { LIVE_ENV_KEYS, parseModelSpec, resolveLiveSpec, createLiveLlm, resolveLiveLlm, describeLiveLlm, assertLiveReady, } from './src/core/live';
27
+ export type { LiveLlmSpec, LiveLlm, ResolveLiveOptions } from './src/core/live';
28
+ export { appendHistory, readHistory, renderHistoryTrend, reportToHistoryEntry, sparkline, } from './src/core/history';
29
+ export type { HistoryEntry } from './src/core/history';
package/dist/index.js CHANGED
@@ -21,6 +21,10 @@ export { expectedToScorers, resolveScorers, scoreTrace, RULE_SCORER_TYPES, runRu
21
21
  export { validateEvalCase } from './src/core/validate.js';
22
22
  export { loadCases, defaultCasesDir, packageRoot, } from './src/core/loader.js';
23
23
  // ─── Runner 与报告 ────────────────────────────────────────────────
24
- export { runEval } from './src/core/runner.js';
24
+ export { runEval, skipReason } from './src/core/runner.js';
25
25
  export { renderMarkdown, writeReport, writeBaseline, readBaseline, reportToBaseline, compareBaseline, finalizeReport, } from './src/core/report.js';
26
+ // ─── live 模式(真实 LLM,M3)─────────────────────────────────────
27
+ export { LIVE_ENV_KEYS, parseModelSpec, resolveLiveSpec, createLiveLlm, resolveLiveLlm, describeLiveLlm, assertLiveReady, } from './src/core/live.js';
28
+ // ─── 历史趋势(日环比可视化,M3)───────────────────────────────────
29
+ export { appendHistory, readHistory, renderHistoryTrend, reportToHistoryEntry, sparkline, } from './src/core/history.js';
26
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA0BH,kEAAkE;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACL,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,iEAAiE;AACjE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEtE,kEAAkE;AAClE,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,mBAAmB,CAAC;AAG3B,iEAAiE;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,kEAAkE;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA0BH,kEAAkE;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EACL,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,iEAAiE;AACjE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEtE,kEAAkE;AAClE,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,mBAAmB,CAAC;AAG3B,iEAAiE;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,kEAAkE;AAClE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,mBAAmB,CAAC;AAG3B,8DAA8D;AAC9D,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAGzB,yDAAyD;AACzD,OAAO,EACL,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,SAAS,GACV,MAAM,oBAAoB,CAAC"}
package/dist/src/cli.d.ts CHANGED
@@ -3,9 +3,11 @@
3
3
  * packages/eval/src/cli.ts - aipack-eval 命令行入口
4
4
  *
5
5
  * 用法:
6
- * aipack-eval run [--suite <name>]... [--cases-dir <dir>] [--repeats <n>]
7
- * [--report-dir <dir>] [--baseline <path>]
8
- * [--update-baseline] [--threshold <0.02>]
6
+ * aipack-eval run [--suite <name>]... [--mode mock|live] [--model provider/id]
7
+ * [--api-key <key>] [--base-url <url>] [--temperature <0>]
8
+ * [--repeats <n>] [--cases-dir <dir>] [--report-dir <dir>]
9
+ * [--history <path>] [--baseline <path>] [--update-baseline]
10
+ * aipack-eval history [--path <file>] [--limit <n>] [--json]
9
11
  *
10
12
  * 退出码:0 = 全过且无回归;1 = 有失败或回归;2 = 用法错误。
11
13
  */
package/dist/src/cli.js CHANGED
@@ -3,29 +3,55 @@
3
3
  * packages/eval/src/cli.ts - aipack-eval 命令行入口
4
4
  *
5
5
  * 用法:
6
- * aipack-eval run [--suite <name>]... [--cases-dir <dir>] [--repeats <n>]
7
- * [--report-dir <dir>] [--baseline <path>]
8
- * [--update-baseline] [--threshold <0.02>]
6
+ * aipack-eval run [--suite <name>]... [--mode mock|live] [--model provider/id]
7
+ * [--api-key <key>] [--base-url <url>] [--temperature <0>]
8
+ * [--repeats <n>] [--cases-dir <dir>] [--report-dir <dir>]
9
+ * [--history <path>] [--baseline <path>] [--update-baseline]
10
+ * aipack-eval history [--path <file>] [--limit <n>] [--json]
9
11
  *
10
12
  * 退出码:0 = 全过且无回归;1 = 有失败或回归;2 = 用法错误。
11
13
  */
12
14
  import { loadCases } from './core/loader.js';
13
15
  import { runEval } from './core/runner.js';
14
16
  import { finalizeReport, renderMarkdown } from './core/report.js';
15
- const USAGE = `用法: aipack-eval run [options]
17
+ import { readHistory, renderHistoryTrend } from './core/history.js';
18
+ const USAGE = `用法: aipack-eval <run|history> [options]
16
19
 
17
- 选项:
20
+ run 选项:
18
21
  --suite <name> 只跑指定套件(可多次)
22
+ --mode <mock|live> 运行模式(缺省 mock;live = 真实 LLM)
23
+ --model <provider/id> live 模型,如 deepseek/deepseek-chat(或 AIPACK_EVAL_MODEL)
24
+ --api-key <key> live API Key(或 <PROVIDER>_API_KEY)
25
+ --base-url <url> live 端点覆盖(代理 / 兼容网关)
26
+ --temperature <x> live 采样温度(缺省 0)
27
+ --repeats <n> 每用例重复次数(live 缺省 3,pass@k 判定)
28
+ --concurrency <n> 并发用例数(缺省 8)
29
+ --timeout <ms> 单用例墙钟超时(缺省 30000)
30
+ --max-tokens <n> 全局 token 预算,超限熔断剩余用例
19
31
  --cases-dir <dir> 用例目录(缺省 <包根>/eval/cases)
20
- --report-dir <dir> 报告输出目录(缺省 ./eval-results;'none' 不写盘)
32
+ --report-dir <dir> 报告输出目录(缺省不写盘;'none' 不写盘)
33
+ --history <path> 历史趋势 JSONL(缺省 <report-dir>/history.jsonl)
21
34
  --baseline <path> baseline 文件(门禁对比)
22
35
  --update-baseline 用本次结果更新 baseline
23
36
  --threshold <x> 通过率回归阈值(缺省 0.02)
24
- --repeats <n> 每用例重复次数(缺省 1)
37
+
38
+ history 选项:
39
+ --path <file> 历史文件(缺省 ./eval-results/history.jsonl)
40
+ --limit <n> 展示最近 N 次(缺省 15)
41
+ --json 输出原始 JSONL 条目
42
+
43
+ 公共:
25
44
  -h, --help 显示帮助`;
26
- function parseArgs(argv) {
45
+ function num(raw, label) {
46
+ const v = Number(raw);
47
+ if (!Number.isFinite(v))
48
+ throw new Error(`${label} 必须为数字`);
49
+ return v;
50
+ }
51
+ function parseRunArgs(argv) {
27
52
  const args = {
28
53
  suites: [],
54
+ mode: 'mock',
29
55
  updateBaseline: false,
30
56
  threshold: 0.02,
31
57
  };
@@ -40,18 +66,65 @@ function parseArgs(argv) {
40
66
  };
41
67
  try {
42
68
  switch (a) {
43
- case 'run':
44
- args.command = 'run';
45
- break;
46
69
  case '--suite':
47
70
  args.suites.push(next());
48
71
  break;
72
+ case '--mode': {
73
+ const v = next();
74
+ if (v !== 'mock' && v !== 'live')
75
+ throw new Error('--mode 只能为 mock 或 live');
76
+ args.mode = v;
77
+ break;
78
+ }
79
+ case '--model':
80
+ args.model = next();
81
+ break;
82
+ case '--api-key':
83
+ args.apiKey = next();
84
+ break;
85
+ case '--base-url':
86
+ args.baseUrl = next();
87
+ break;
88
+ case '--temperature':
89
+ args.temperature = num(next(), '--temperature');
90
+ break;
91
+ case '--repeats': {
92
+ const v = Number(next());
93
+ if (!Number.isInteger(v) || v < 1)
94
+ throw new Error('repeats 须为正整数');
95
+ args.repeats = v;
96
+ break;
97
+ }
98
+ case '--concurrency': {
99
+ const v = Number(next());
100
+ if (!Number.isInteger(v) || v < 1)
101
+ throw new Error('concurrency 须为正整数');
102
+ args.concurrency = v;
103
+ break;
104
+ }
105
+ case '--timeout': {
106
+ const v = Number(next());
107
+ if (!Number.isFinite(v) || v <= 0)
108
+ throw new Error('timeout 须为正数(ms)');
109
+ args.timeoutMs = v;
110
+ break;
111
+ }
112
+ case '--max-tokens': {
113
+ const v = Number(next());
114
+ if (!Number.isFinite(v) || v <= 0)
115
+ throw new Error('max-tokens 须为正数');
116
+ args.maxTotalTokens = v;
117
+ break;
118
+ }
49
119
  case '--cases-dir':
50
120
  args.casesDir = next();
51
121
  break;
52
122
  case '--report-dir':
53
123
  args.reportDir = next();
54
124
  break;
125
+ case '--history':
126
+ args.historyPath = next();
127
+ break;
55
128
  case '--baseline':
56
129
  args.baselinePath = next();
57
130
  break;
@@ -65,13 +138,6 @@ function parseArgs(argv) {
65
138
  args.threshold = v;
66
139
  break;
67
140
  }
68
- case '--repeats': {
69
- const v = Number(next());
70
- if (!Number.isInteger(v) || v < 1)
71
- throw new Error('repeats 须为正整数');
72
- args.repeats = v;
73
- break;
74
- }
75
141
  case '-h':
76
142
  case '--help':
77
143
  return { error: 'HELP' };
@@ -84,12 +150,10 @@ function parseArgs(argv) {
84
150
  }
85
151
  i += 1;
86
152
  }
87
- if (args.command !== 'run')
88
- return { error: `缺少子命令 'run'\n${USAGE}` };
89
153
  return args;
90
154
  }
91
- async function main() {
92
- const parsed = parseArgs(process.argv.slice(2));
155
+ async function cmdRun(argv) {
156
+ const parsed = parseRunArgs(argv);
93
157
  if ('error' in parsed) {
94
158
  if (parsed.error === 'HELP') {
95
159
  console.log(USAGE);
@@ -109,22 +173,45 @@ async function main() {
109
173
  console.error('没有可运行的用例');
110
174
  return 1;
111
175
  }
176
+ const reportDir = parsed.reportDir === 'none' ? undefined : parsed.reportDir;
177
+ const historyPath = parsed.historyPath ?? (reportDir ? `${reportDir.replace(/\/$/, '')}/history.jsonl` : undefined);
112
178
  const config = {
113
- mode: 'mock',
179
+ mode: parsed.mode,
180
+ model: parsed.model,
181
+ apiKey: parsed.apiKey,
182
+ baseUrl: parsed.baseUrl,
183
+ temperature: parsed.temperature,
114
184
  suites: parsed.suites,
115
185
  repeats: parsed.repeats,
186
+ concurrency: parsed.concurrency,
187
+ timeoutMs: parsed.timeoutMs,
188
+ maxTotalTokens: parsed.maxTotalTokens,
116
189
  casesDir: parsed.casesDir,
117
- reportDir: parsed.reportDir === 'none' ? undefined : parsed.reportDir,
190
+ reportDir,
191
+ historyPath,
118
192
  baselinePath: parsed.baselinePath,
119
193
  updateBaseline: parsed.updateBaseline,
120
194
  regressionThreshold: parsed.threshold,
121
195
  };
122
- console.error(`加载 ${cases.length} 个用例${parsed.suites.length ? `(套件: ${parsed.suites.join(', ')})` : ''},mode=mock`);
123
- const report = await runEval(cases, config);
196
+ console.error(`加载 ${cases.length} 个用例${parsed.suites.length ? `(套件: ${parsed.suites.join(', ')})` : ''},mode=${parsed.mode}`);
197
+ let report;
198
+ try {
199
+ report = await runEval(cases, config);
200
+ }
201
+ catch (e) {
202
+ // live 装配失败(缺模型 / 缺 Key)属于使用错误
203
+ console.error(`live 模式配置错误: ${e.message}`);
204
+ return 2;
205
+ }
124
206
  const finalized = await finalizeReport(report, config);
125
- console.log(renderMarkdown(report));
207
+ console.log(renderMarkdown(report, { history: finalized.history }));
208
+ if (report.totals.cases === 0) {
209
+ console.error(`\n⚠️ 当前 mode=${parsed.mode} 下没有可运行的用例(${report.totals.skipped} 个被跳过),检查 --suite 与 --mode 是否匹配`);
210
+ }
126
211
  if (finalized.jsonPath)
127
212
  console.error(`\n报告已写入: ${finalized.jsonPath}`);
213
+ if (finalized.historyPath)
214
+ console.error(`历史已追加: ${finalized.historyPath}`);
128
215
  if (config.updateBaseline && finalized.baseline === undefined) {
129
216
  console.error(`baseline 已更新: ${config.baselinePath}`);
130
217
  }
@@ -142,6 +229,55 @@ async function main() {
142
229
  }
143
230
  return exitCode;
144
231
  }
232
+ async function cmdHistory(argv) {
233
+ let path = 'eval-results/history.jsonl';
234
+ let limit = 15;
235
+ let asJson = false;
236
+ for (let i = 0; i < argv.length; i++) {
237
+ const a = argv[i];
238
+ if (a === '--json') {
239
+ asJson = true;
240
+ }
241
+ else if (a === '--path') {
242
+ path = argv[++i] ?? path;
243
+ }
244
+ else if (a === '--limit') {
245
+ limit = Number(argv[++i] ?? limit);
246
+ }
247
+ else if (a === '-h' || a === '--help') {
248
+ console.log(USAGE);
249
+ return 0;
250
+ }
251
+ else {
252
+ console.error(`未知参数: ${a}\n${USAGE}`);
253
+ return 2;
254
+ }
255
+ }
256
+ const entries = await readHistory(path, limit);
257
+ if (entries.length === 0) {
258
+ console.error(`历史文件为空或不存在: ${path}`);
259
+ return 1;
260
+ }
261
+ if (asJson) {
262
+ console.log(entries.map((e) => JSON.stringify(e)).join('\n'));
263
+ return 0;
264
+ }
265
+ console.log(renderHistoryTrend(entries, limit));
266
+ return 0;
267
+ }
268
+ async function main() {
269
+ const [command, ...rest] = process.argv.slice(2);
270
+ if (command === undefined || command === '-h' || command === '--help') {
271
+ console.log(USAGE);
272
+ return command === undefined ? 2 : 0;
273
+ }
274
+ if (command === 'run')
275
+ return cmdRun(rest);
276
+ if (command === 'history')
277
+ return cmdHistory(rest);
278
+ console.error(`未知子命令: ${command}\n${USAGE}`);
279
+ return 2;
280
+ }
145
281
  main().then((code) => process.exit(code), (e) => {
146
282
  console.error(e);
147
283
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * packages/eval/src/core/history.ts - 历史趋势(日环比可视化)
3
+ *
4
+ * 每次运行向 JSONL 追加一行(append-only,天然按时间序),
5
+ * 读回后渲染 Markdown:趋势 sparkline + 逐次通过率 + 环比 Δ。
6
+ *
7
+ * 为什么用 JSONL 而不是单文件 JSON:cron 场景下并发/追加写更安全,
8
+ * 且 diff 友好(一行一次运行)。
9
+ */
10
+ import type { EvalReport, SuiteSummary } from './types';
11
+ /** 每次运行落一行(JSONL) */
12
+ export interface HistoryEntry {
13
+ runId: string;
14
+ /** ISO 时间 */
15
+ at: string;
16
+ mode: 'mock' | 'live';
17
+ model?: string;
18
+ cases: number;
19
+ passed: number;
20
+ skipped: number;
21
+ passRate: number;
22
+ avgScore: number;
23
+ durationMs: number;
24
+ usageTotal: number;
25
+ bySuite: Record<string, Pick<SuiteSummary, 'total' | 'passed' | 'passRate'>>;
26
+ }
27
+ /** 报告 → 历史条目 */
28
+ export declare function reportToHistoryEntry(report: EvalReport): HistoryEntry;
29
+ /** 追加一次运行记录(JSONL,一行一条) */
30
+ export declare function appendHistory(report: EvalReport, historyPath: string): Promise<string>;
31
+ /** 读取历史(最新在最后);文件不存在返回空数组 */
32
+ export declare function readHistory(historyPath: string, limit?: number): Promise<HistoryEntry[]>;
33
+ /** 0~1 序列 → sparkline 字符串 */
34
+ export declare function sparkline(values: number[], width?: number): string;
35
+ /**
36
+ * 渲染通过率趋势(Markdown)。
37
+ * 环比定义:与上一次运行对比(cron 每日跑 → 即日环比)。
38
+ */
39
+ export declare function renderHistoryTrend(entries: HistoryEntry[], limit?: number): string;
@@ -0,0 +1,134 @@
1
+ /**
2
+ * packages/eval/src/core/history.ts - 历史趋势(日环比可视化)
3
+ *
4
+ * 每次运行向 JSONL 追加一行(append-only,天然按时间序),
5
+ * 读回后渲染 Markdown:趋势 sparkline + 逐次通过率 + 环比 Δ。
6
+ *
7
+ * 为什么用 JSONL 而不是单文件 JSON:cron 场景下并发/追加写更安全,
8
+ * 且 diff 友好(一行一次运行)。
9
+ */
10
+ import { appendFile, mkdir, readFile } from 'node:fs/promises';
11
+ import { dirname, resolve } from 'node:path';
12
+ /** 报告 → 历史条目 */
13
+ export function reportToHistoryEntry(report) {
14
+ return {
15
+ runId: report.runId,
16
+ at: report.startedAt,
17
+ mode: report.mode,
18
+ model: report.model,
19
+ cases: report.totals.cases,
20
+ passed: report.totals.passed,
21
+ skipped: report.totals.skipped,
22
+ passRate: report.totals.passRate,
23
+ avgScore: report.totals.avgScore,
24
+ durationMs: report.durationMs,
25
+ usageTotal: report.totals.usageTotal,
26
+ bySuite: Object.fromEntries(Object.entries(report.bySuite).map(([k, s]) => [
27
+ k,
28
+ { total: s.total, passed: s.passed, passRate: s.passRate },
29
+ ])),
30
+ };
31
+ }
32
+ /** 追加一次运行记录(JSONL,一行一条) */
33
+ export async function appendHistory(report, historyPath) {
34
+ const path = resolve(historyPath);
35
+ await mkdir(dirname(path), { recursive: true });
36
+ await appendFile(path, `${JSON.stringify(reportToHistoryEntry(report))}\n`, 'utf-8');
37
+ return path;
38
+ }
39
+ /** 读取历史(最新在最后);文件不存在返回空数组 */
40
+ export async function readHistory(historyPath, limit = 30) {
41
+ const path = resolve(historyPath);
42
+ let raw;
43
+ try {
44
+ raw = await readFile(path, 'utf-8');
45
+ }
46
+ catch {
47
+ return [];
48
+ }
49
+ const entries = [];
50
+ for (const line of raw.split('\n')) {
51
+ const s = line.trim();
52
+ if (!s)
53
+ continue;
54
+ try {
55
+ entries.push(JSON.parse(s));
56
+ }
57
+ catch {
58
+ // 坏行跳过(不因一行损坏丢掉整份历史)
59
+ }
60
+ }
61
+ return limit > 0 ? entries.slice(-limit) : entries;
62
+ }
63
+ // ─── 可视化 ───────────────────────────────────────────────────────
64
+ const SPARK_CHARS = '▁▂▃▄▅▆▇█';
65
+ /** 0~1 序列 → sparkline 字符串 */
66
+ export function sparkline(values, width = 20) {
67
+ if (values.length === 0)
68
+ return '';
69
+ const seq = values.slice(-width);
70
+ return seq
71
+ .map((v) => {
72
+ const clamped = Math.min(1, Math.max(0, Number.isFinite(v) ? v : 0));
73
+ const idx = Math.round(clamped * (SPARK_CHARS.length - 1));
74
+ return SPARK_CHARS[idx];
75
+ })
76
+ .join('');
77
+ }
78
+ function pct(x) {
79
+ return `${(x * 100).toFixed(1)}%`;
80
+ }
81
+ function deltaCell(cur, prev) {
82
+ if (prev === undefined)
83
+ return '—';
84
+ const d = (cur - prev) * 100;
85
+ if (Math.abs(d) < 0.05)
86
+ return '±0.0%';
87
+ const sign = d > 0 ? '+' : '';
88
+ const icon = d < 0 ? '🔻' : '🔺';
89
+ return `${icon}${sign}${d.toFixed(1)}%`;
90
+ }
91
+ function shortAt(iso) {
92
+ // 2026-09-29T03:12:44.123Z → 09-29 03:12
93
+ return `${iso.slice(5, 10)} ${iso.slice(11, 16)}`;
94
+ }
95
+ /**
96
+ * 渲染通过率趋势(Markdown)。
97
+ * 环比定义:与上一次运行对比(cron 每日跑 → 即日环比)。
98
+ */
99
+ export function renderHistoryTrend(entries, limit = 15) {
100
+ if (entries.length === 0)
101
+ return '(暂无历史记录)';
102
+ const rows = entries.slice(-limit);
103
+ const lines = [];
104
+ const rates = rows.map((e) => e.passRate);
105
+ const latest = rows[rows.length - 1];
106
+ const prev = rows.length > 1 ? rows[rows.length - 2] : undefined;
107
+ lines.push(`\`${sparkline(rates)}\` 最近 ${rows.length} 次:${pct(latest.passRate)}(环比 ${deltaCell(latest.passRate, prev?.passRate)})`);
108
+ lines.push('');
109
+ lines.push(`| 时间(UTC) | 模式 | 模型 | 通过 | 通过率 | 环比 Δ | 平均分 | 耗时 |`);
110
+ lines.push(`|---|---|---|---|---|---|---|---|`);
111
+ rows.forEach((e, i) => {
112
+ lines.push(`| ${shortAt(e.at)} | ${e.mode} | ${e.model ?? '—'} | ${e.passed}/${e.cases} | ${pct(e.passRate)} | ${deltaCell(e.passRate, i > 0 ? rows[i - 1].passRate : undefined)} | ${e.avgScore.toFixed(2)} | ${(e.durationMs / 1000).toFixed(1)}s |`);
113
+ });
114
+ // 分套件环比:定位是哪一组掉了
115
+ const suiteDeltas = [];
116
+ if (prev) {
117
+ for (const [suite, cur] of Object.entries(latest.bySuite)) {
118
+ const before = prev.bySuite[suite];
119
+ if (!before)
120
+ continue;
121
+ const d = (cur.passRate - before.passRate) * 100;
122
+ if (Math.abs(d) >= 0.05) {
123
+ suiteDeltas.push(` - ${suite}: ${pct(before.passRate)} → ${pct(cur.passRate)}(${d > 0 ? '+' : ''}${d.toFixed(1)}%)`);
124
+ }
125
+ }
126
+ }
127
+ if (suiteDeltas.length > 0) {
128
+ lines.push('');
129
+ lines.push(`分套件环比:`);
130
+ lines.push(...suiteDeltas);
131
+ }
132
+ return lines.join('\n');
133
+ }
134
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/core/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * packages/eval/src/core/live.ts - live 模式(真实 LLM)装配
3
+ *
4
+ * 职责:把「provider/modelId + apiKey + baseUrl」装配成 Runtime 可直接消费的
5
+ * `{ model, streamFn }`,与 mock 模式的 fixture replay 对称。
6
+ *
7
+ * 消随机性(EVAL_PLAN.md 4.3):
8
+ * - temperature 缺省 0(provider 支持即生效)
9
+ * - 本仓库适配层不支持 seed → 靠 repeats + pass@k 消噪,见 runner.ts
10
+ *
11
+ * 装配路径:getBuiltinModel(内置目录)→ 兜底构造 custom model(代理 / 兼容网关)
12
+ * → adaptAiModel(框架 Model)+ createStreamFnFromAi(StreamFn)
13
+ */
14
+ import type { Model as AiModel } from '@aipack-ai/agent/ai';
15
+ import type { Model, StreamFn } from '@aipack-ai/agent';
16
+ export interface LiveLlmSpec {
17
+ /** 提供商 id:deepseek / openai / anthropic / ... */
18
+ provider: string;
19
+ /** 模型 id:deepseek-chat / gpt-4o-mini / ...(不在内置目录时按 custom 兜底) */
20
+ modelId: string;
21
+ /** API Key;缺省取 <PROVIDER>_API_KEY 环境变量 */
22
+ apiKey?: string;
23
+ /** 覆盖内置端点(代理 / 兼容网关) */
24
+ baseUrl?: string;
25
+ /** 缺省 0(消随机性) */
26
+ temperature?: number;
27
+ /** 单次请求超时 ms */
28
+ timeoutMs?: number;
29
+ }
30
+ export interface LiveLlm {
31
+ spec: LiveLlmSpec;
32
+ /** AI 层模型(含 api / baseUrl) */
33
+ aiModel: AiModel;
34
+ /** 框架层 Model,放进 RuntimeOptions.model */
35
+ model: Model;
36
+ /** 真实流式函数,放进 RuntimeOptions.streamFn */
37
+ streamFn: StreamFn;
38
+ }
39
+ /** env 覆盖键(优先级低于显式参数,便于 CI 用 secrets 注入) */
40
+ export declare const LIVE_ENV_KEYS: {
41
+ readonly model: "AIPACK_EVAL_MODEL";
42
+ readonly provider: "AIPACK_EVAL_PROVIDER";
43
+ readonly apiKey: "AIPACK_EVAL_API_KEY";
44
+ readonly baseUrl: "AIPACK_EVAL_BASE_URL";
45
+ readonly temperature: "AIPACK_EVAL_TEMPERATURE";
46
+ };
47
+ /**
48
+ * 解析 'provider/modelId' 或 'modelId'。
49
+ * 仅给 modelId 时:优先 AIPACK_EVAL_PROVIDER,否则探测第一个已配置 Key 的 provider。
50
+ */
51
+ export declare function parseModelSpec(spec: string): {
52
+ provider: string;
53
+ modelId: string;
54
+ };
55
+ export interface ResolveLiveOptions {
56
+ /** 'provider/modelId' 或 'modelId';缺省读 AIPACK_EVAL_MODEL */
57
+ model?: string;
58
+ apiKey?: string;
59
+ baseUrl?: string;
60
+ temperature?: number;
61
+ timeoutMs?: number;
62
+ }
63
+ /** 合并显式参数与环境变量,得到最终生效的 LiveLlmSpec */
64
+ export declare function resolveLiveSpec(opts?: ResolveLiveOptions): LiveLlmSpec;
65
+ /**
66
+ * 装配真实 LLM。不发起任何网络请求(只是闭包),可安全单测。
67
+ *
68
+ * 注意:createStreamFnFromAi 优先使用 runtime 传入的 model,
69
+ * 因此必须把返回的 model 一起交给 createRuntime,否则 api 分派会不一致。
70
+ */
71
+ export declare function createLiveLlm(spec: LiveLlmSpec): LiveLlm;
72
+ /** 从 CLI/库参数一步到位:解析 spec → 装配 LLM */
73
+ export declare function resolveLiveLlm(opts?: ResolveLiveOptions): LiveLlm;
74
+ /** 报告 / 日志用的模型标识('deepseek/deepseek-chat') */
75
+ export declare function describeLiveLlm(spec: LiveLlmSpec): string;
76
+ /** live 模式前置检查:缺 Key 时给出可操作的错误信息 */
77
+ export declare function assertLiveReady(spec: LiveLlmSpec): void;