@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 +6 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/src/cli.d.ts +5 -3
- package/dist/src/cli.js +163 -27
- package/dist/src/cli.js.map +1 -1
- package/dist/src/core/history.d.ts +39 -0
- package/dist/src/core/history.js +134 -0
- package/dist/src/core/history.js.map +1 -0
- package/dist/src/core/live.d.ts +77 -0
- package/dist/src/core/live.js +142 -0
- package/dist/src/core/live.js.map +1 -0
- package/dist/src/core/report.d.ts +9 -2
- package/dist/src/core/report.js +30 -5
- package/dist/src/core/report.js.map +1 -1
- package/dist/src/core/runner.d.ts +10 -5
- package/dist/src/core/runner.js +129 -40
- package/dist/src/core/runner.js.map +1 -1
- package/dist/src/core/types.d.ts +46 -4
- package/dist/src/core/validate.js +6 -0
- package/dist/src/core/validate.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,142 @@
|
|
|
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 { BUILTIN_PROVIDERS, adaptAiModel, createStreamFnFromAi, getBuiltinModel, getEnvApiKey, } from '@aipack-ai/agent';
|
|
15
|
+
/** env 覆盖键(优先级低于显式参数,便于 CI 用 secrets 注入) */
|
|
16
|
+
export const LIVE_ENV_KEYS = {
|
|
17
|
+
model: 'AIPACK_EVAL_MODEL',
|
|
18
|
+
provider: 'AIPACK_EVAL_PROVIDER',
|
|
19
|
+
apiKey: 'AIPACK_EVAL_API_KEY',
|
|
20
|
+
baseUrl: 'AIPACK_EVAL_BASE_URL',
|
|
21
|
+
temperature: 'AIPACK_EVAL_TEMPERATURE',
|
|
22
|
+
};
|
|
23
|
+
/** 未显式指定 provider 时的探测顺序(与 CLI 默认策略一致:低成本在前) */
|
|
24
|
+
const PROBE_ORDER = [
|
|
25
|
+
'deepseek',
|
|
26
|
+
'openai',
|
|
27
|
+
'anthropic',
|
|
28
|
+
'groq',
|
|
29
|
+
'moonshot',
|
|
30
|
+
'google',
|
|
31
|
+
'openrouter',
|
|
32
|
+
'mistral',
|
|
33
|
+
'xai',
|
|
34
|
+
'cerebras',
|
|
35
|
+
'together',
|
|
36
|
+
'fireworks',
|
|
37
|
+
'nvidia',
|
|
38
|
+
];
|
|
39
|
+
// ─── 解析 ─────────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* 解析 'provider/modelId' 或 'modelId'。
|
|
42
|
+
* 仅给 modelId 时:优先 AIPACK_EVAL_PROVIDER,否则探测第一个已配置 Key 的 provider。
|
|
43
|
+
*/
|
|
44
|
+
export function parseModelSpec(spec) {
|
|
45
|
+
const trimmed = spec.trim();
|
|
46
|
+
const slash = trimmed.indexOf('/');
|
|
47
|
+
if (slash > 0) {
|
|
48
|
+
return {
|
|
49
|
+
provider: trimmed.slice(0, slash),
|
|
50
|
+
modelId: trimmed.slice(slash + 1),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const envProvider = process.env[LIVE_ENV_KEYS.provider];
|
|
54
|
+
if (envProvider)
|
|
55
|
+
return { provider: envProvider, modelId: trimmed };
|
|
56
|
+
const configured = PROBE_ORDER.find((p) => Boolean(getEnvApiKey(p)));
|
|
57
|
+
if (configured)
|
|
58
|
+
return { provider: configured, modelId: trimmed };
|
|
59
|
+
throw new Error(`无法从 '${spec}' 推断 provider:请写全 'provider/modelId',或设置 ${LIVE_ENV_KEYS.provider} / <PROVIDER>_API_KEY`);
|
|
60
|
+
}
|
|
61
|
+
/** 合并显式参数与环境变量,得到最终生效的 LiveLlmSpec */
|
|
62
|
+
export function resolveLiveSpec(opts = {}) {
|
|
63
|
+
const env = process.env;
|
|
64
|
+
const raw = opts.model ?? env[LIVE_ENV_KEYS.model];
|
|
65
|
+
if (!raw) {
|
|
66
|
+
throw new Error(`live 模式需要指定模型:--model provider/modelId 或 ${LIVE_ENV_KEYS.model}(如 deepseek/deepseek-chat)`);
|
|
67
|
+
}
|
|
68
|
+
const { provider, modelId } = parseModelSpec(raw);
|
|
69
|
+
const envTemp = env[LIVE_ENV_KEYS.temperature];
|
|
70
|
+
const temperature = opts.temperature ?? (envTemp !== undefined && envTemp !== '' ? Number(envTemp) : undefined);
|
|
71
|
+
const spec = {
|
|
72
|
+
provider,
|
|
73
|
+
modelId,
|
|
74
|
+
apiKey: opts.apiKey ?? env[LIVE_ENV_KEYS.apiKey] ?? getEnvApiKey(provider),
|
|
75
|
+
baseUrl: opts.baseUrl ?? env[LIVE_ENV_KEYS.baseUrl],
|
|
76
|
+
temperature: temperature ?? 0,
|
|
77
|
+
};
|
|
78
|
+
if (opts.timeoutMs !== undefined)
|
|
79
|
+
spec.timeoutMs = opts.timeoutMs;
|
|
80
|
+
return spec;
|
|
81
|
+
}
|
|
82
|
+
// ─── 装配 ─────────────────────────────────────────────────────────
|
|
83
|
+
/** 内置目录缺失时的兜底:按 provider 推断 api 与端点 */
|
|
84
|
+
function buildCustomModel(provider, modelId) {
|
|
85
|
+
const meta = BUILTIN_PROVIDERS.find((p) => p.id === provider);
|
|
86
|
+
const baseUrl = meta?.baseUrl;
|
|
87
|
+
if (!baseUrl) {
|
|
88
|
+
throw new Error(`未知 provider '${provider}':内置提供商为 ${BUILTIN_PROVIDERS.map((p) => p.id).join(', ')}`);
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
id: modelId,
|
|
92
|
+
name: modelId,
|
|
93
|
+
api: provider === 'anthropic' ? 'anthropic-messages' : 'openai-completions',
|
|
94
|
+
provider,
|
|
95
|
+
baseUrl,
|
|
96
|
+
reasoning: false,
|
|
97
|
+
input: ['text'],
|
|
98
|
+
contextWindow: 128_000,
|
|
99
|
+
maxTokens: 8_192,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 装配真实 LLM。不发起任何网络请求(只是闭包),可安全单测。
|
|
104
|
+
*
|
|
105
|
+
* 注意:createStreamFnFromAi 优先使用 runtime 传入的 model,
|
|
106
|
+
* 因此必须把返回的 model 一起交给 createRuntime,否则 api 分派会不一致。
|
|
107
|
+
*/
|
|
108
|
+
export function createLiveLlm(spec) {
|
|
109
|
+
const base = getBuiltinModel(spec.provider, spec.modelId);
|
|
110
|
+
const aiModel = base
|
|
111
|
+
? spec.baseUrl
|
|
112
|
+
? { ...base, baseUrl: spec.baseUrl }
|
|
113
|
+
: base
|
|
114
|
+
: buildCustomModel(spec.provider, spec.modelId);
|
|
115
|
+
const options = { temperature: spec.temperature ?? 0 };
|
|
116
|
+
if (spec.apiKey)
|
|
117
|
+
options.apiKey = spec.apiKey;
|
|
118
|
+
if (spec.timeoutMs !== undefined)
|
|
119
|
+
options.timeoutMs = spec.timeoutMs;
|
|
120
|
+
return {
|
|
121
|
+
spec,
|
|
122
|
+
aiModel,
|
|
123
|
+
model: adaptAiModel(aiModel),
|
|
124
|
+
streamFn: createStreamFnFromAi(aiModel, options),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/** 从 CLI/库参数一步到位:解析 spec → 装配 LLM */
|
|
128
|
+
export function resolveLiveLlm(opts = {}) {
|
|
129
|
+
return createLiveLlm(resolveLiveSpec(opts));
|
|
130
|
+
}
|
|
131
|
+
/** 报告 / 日志用的模型标识('deepseek/deepseek-chat') */
|
|
132
|
+
export function describeLiveLlm(spec) {
|
|
133
|
+
return `${spec.provider}/${spec.modelId}`;
|
|
134
|
+
}
|
|
135
|
+
/** live 模式前置检查:缺 Key 时给出可操作的错误信息 */
|
|
136
|
+
export function assertLiveReady(spec) {
|
|
137
|
+
if (spec.apiKey)
|
|
138
|
+
return;
|
|
139
|
+
const envName = BUILTIN_PROVIDERS.find((p) => p.id === spec.provider)?.envVar;
|
|
140
|
+
throw new Error(`provider '${spec.provider}' 未配置 API Key:--api-key <key>、${LIVE_ENV_KEYS.apiKey} 或 ${envName ?? '<PROVIDER>_API_KEY'}`);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../../src/core/live.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,14 @@
|
|
|
4
4
|
* - JSON + Markdown 双格式输出到报告目录(缺省 ./eval-results)
|
|
5
5
|
* - baseline:对比整体与分套件通过率,回归超阈值判失败
|
|
6
6
|
*/
|
|
7
|
+
import type { HistoryEntry } from './history';
|
|
7
8
|
import type { BaselineComparison, BaselineFile, EvalReport, RunConfig } from './types';
|
|
8
|
-
export
|
|
9
|
-
|
|
9
|
+
export interface RenderOptions {
|
|
10
|
+
/** 历史条目(含本次)→ 渲染通过率日环比趋势段 */
|
|
11
|
+
history?: HistoryEntry[];
|
|
12
|
+
}
|
|
13
|
+
export declare function renderMarkdown(report: EvalReport, opts?: RenderOptions): string;
|
|
14
|
+
export declare function writeReport(report: EvalReport, reportDir: string, opts?: RenderOptions): Promise<{
|
|
10
15
|
jsonPath: string;
|
|
11
16
|
mdPath: string;
|
|
12
17
|
}>;
|
|
@@ -23,4 +28,6 @@ export declare function finalizeReport(report: EvalReport, config: RunConfig): P
|
|
|
23
28
|
mdPath?: string;
|
|
24
29
|
baseline?: BaselineFile;
|
|
25
30
|
comparison?: BaselineComparison;
|
|
31
|
+
historyPath?: string;
|
|
32
|
+
history?: HistoryEntry[];
|
|
26
33
|
}>;
|
package/dist/src/core/report.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { mkdir, writeFile } from 'node:fs/promises';
|
|
8
8
|
import { dirname, join, resolve } from 'node:path';
|
|
9
|
+
import { appendHistory, readHistory, renderHistoryTrend } from './history.js';
|
|
9
10
|
// ─── Markdown 渲染 ────────────────────────────────────────────────
|
|
10
11
|
function pct(x) {
|
|
11
12
|
return `${(x * 100).toFixed(1)}%`;
|
|
@@ -20,12 +21,15 @@ function renderSummaryTable(byKey, keyHeader) {
|
|
|
20
21
|
...rows,
|
|
21
22
|
].join('\n');
|
|
22
23
|
}
|
|
23
|
-
export function renderMarkdown(report) {
|
|
24
|
+
export function renderMarkdown(report, opts = {}) {
|
|
24
25
|
const lines = [];
|
|
25
26
|
lines.push(`# aipack Eval 报告`);
|
|
26
27
|
lines.push('');
|
|
27
|
-
lines.push(`- Run: \`${report.runId}\`(mode: ${report.mode})`);
|
|
28
|
+
lines.push(`- Run: \`${report.runId}\`(mode: ${report.mode}${report.model ? `, model: ${report.model}` : ''})`);
|
|
28
29
|
lines.push(`- 总览: **${report.totals.passed}/${report.totals.cases} 通过(${pct(report.totals.passRate)})**,平均分 ${report.totals.avgScore.toFixed(2)},耗时 ${(report.durationMs / 1000).toFixed(2)}s`);
|
|
30
|
+
if (report.totals.skipped > 0) {
|
|
31
|
+
lines.push(`- 跳过: ${report.totals.skipped} 个用例(模式不匹配,不计入通过率)`);
|
|
32
|
+
}
|
|
29
33
|
lines.push('');
|
|
30
34
|
lines.push(`## 按套件`);
|
|
31
35
|
lines.push('');
|
|
@@ -35,6 +39,20 @@ export function renderMarkdown(report) {
|
|
|
35
39
|
lines.push('');
|
|
36
40
|
lines.push(renderSummaryTable(report.byOrigin, 'origin'));
|
|
37
41
|
lines.push('');
|
|
42
|
+
if (opts.history && opts.history.length > 0) {
|
|
43
|
+
lines.push(`## 通过率趋势(环比)`);
|
|
44
|
+
lines.push('');
|
|
45
|
+
lines.push(renderHistoryTrend(opts.history));
|
|
46
|
+
lines.push('');
|
|
47
|
+
}
|
|
48
|
+
const skipped = report.skipped ?? [];
|
|
49
|
+
if (skipped.length > 0) {
|
|
50
|
+
lines.push(`## 跳过用例(${skipped.length})`);
|
|
51
|
+
lines.push('');
|
|
52
|
+
for (const s of skipped)
|
|
53
|
+
lines.push(`- \`${s.caseId}\`: ${s.reason}`);
|
|
54
|
+
lines.push('');
|
|
55
|
+
}
|
|
38
56
|
const failures = report.results.filter((r) => !r.passed);
|
|
39
57
|
if (failures.length === 0) {
|
|
40
58
|
lines.push(`## 失败用例`);
|
|
@@ -59,13 +77,13 @@ export function renderMarkdown(report) {
|
|
|
59
77
|
return lines.join('\n');
|
|
60
78
|
}
|
|
61
79
|
// ─── 报告写盘 ─────────────────────────────────────────────────────
|
|
62
|
-
export async function writeReport(report, reportDir) {
|
|
80
|
+
export async function writeReport(report, reportDir, opts = {}) {
|
|
63
81
|
const dir = resolve(reportDir);
|
|
64
82
|
await mkdir(dir, { recursive: true });
|
|
65
83
|
const jsonPath = join(dir, `${report.runId}.json`);
|
|
66
84
|
const mdPath = join(dir, `${report.runId}.md`);
|
|
67
85
|
await writeFile(jsonPath, JSON.stringify(report, null, 2), 'utf-8');
|
|
68
|
-
await writeFile(mdPath, renderMarkdown(report), 'utf-8');
|
|
86
|
+
await writeFile(mdPath, renderMarkdown(report, opts), 'utf-8');
|
|
69
87
|
return { jsonPath, mdPath };
|
|
70
88
|
}
|
|
71
89
|
// ─── Baseline ─────────────────────────────────────────────────────
|
|
@@ -129,8 +147,15 @@ export async function readBaseline(baselinePath) {
|
|
|
129
147
|
// ─── 便捷:跑完即出报告 ───────────────────────────────────────────
|
|
130
148
|
export async function finalizeReport(report, config) {
|
|
131
149
|
const out = {};
|
|
150
|
+
// 先写盘再读回:趋势段包含本次运行
|
|
151
|
+
if (config.historyPath) {
|
|
152
|
+
out.historyPath = await appendHistory(report, config.historyPath);
|
|
153
|
+
out.history = await readHistory(out.historyPath);
|
|
154
|
+
}
|
|
132
155
|
if (config.reportDir) {
|
|
133
|
-
const { jsonPath, mdPath } = await writeReport(report, config.reportDir
|
|
156
|
+
const { jsonPath, mdPath } = await writeReport(report, config.reportDir, {
|
|
157
|
+
history: out.history,
|
|
158
|
+
});
|
|
134
159
|
out.jsonPath = jsonPath;
|
|
135
160
|
out.mdPath = mdPath;
|
|
136
161
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/core/report.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/core/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* packages/eval/src/core/runner.ts - Eval Runner
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 两种模式共用同一条执行链路(Runtime → 轨迹 → 评分器):
|
|
5
|
+
* mock —— fixture replay:createMockStreamFn 注入脚本化 LLM 响应
|
|
6
|
+
* live —— 真实 LLM:createLiveLlm 装配 provider streamFn(M3)
|
|
7
7
|
*
|
|
8
8
|
* 工程保障:
|
|
9
9
|
* - 用例间完全隔离(独立 runtime / 独立 fs 副本 / 独立 sessionKey)
|
|
10
10
|
* - 墙钟超时(Promise.race)
|
|
11
11
|
* - 步数上限(映射 RuntimeOptions.maxTurns)
|
|
12
|
-
* - 预算熔断(
|
|
13
|
-
* - repeats
|
|
12
|
+
* - 预算熔断(case.metadata.maxTokens + RunConfig.maxTotalTokens 全局)
|
|
13
|
+
* - repeats 消随机性:mock 1;live 默认 3 并取 pass@k(适配层不支持 seed)
|
|
14
14
|
* - 并发受控(简单队列实现)
|
|
15
15
|
*/
|
|
16
16
|
import type { EvalCase, EvalReport, RunConfig } from './types';
|
|
17
|
+
/**
|
|
18
|
+
* 模式不匹配 → 跳过(不计入通过率,避免出现"必然失败"的噪音)。
|
|
19
|
+
* 返回 undefined 表示该用例在当前模式下可跑。
|
|
20
|
+
*/
|
|
21
|
+
export declare function skipReason(c: EvalCase, mode: 'mock' | 'live'): string | undefined;
|
|
17
22
|
/** 执行一次评测 */
|
|
18
23
|
export declare function runEval(cases: EvalCase[], config: RunConfig): Promise<EvalReport>;
|
package/dist/src/core/runner.js
CHANGED
|
@@ -1,41 +1,80 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* packages/eval/src/core/runner.ts - Eval Runner
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 两种模式共用同一条执行链路(Runtime → 轨迹 → 评分器):
|
|
5
|
+
* mock —— fixture replay:createMockStreamFn 注入脚本化 LLM 响应
|
|
6
|
+
* live —— 真实 LLM:createLiveLlm 装配 provider streamFn(M3)
|
|
7
7
|
*
|
|
8
8
|
* 工程保障:
|
|
9
9
|
* - 用例间完全隔离(独立 runtime / 独立 fs 副本 / 独立 sessionKey)
|
|
10
10
|
* - 墙钟超时(Promise.race)
|
|
11
11
|
* - 步数上限(映射 RuntimeOptions.maxTurns)
|
|
12
|
-
* - 预算熔断(
|
|
13
|
-
* - repeats
|
|
12
|
+
* - 预算熔断(case.metadata.maxTokens + RunConfig.maxTotalTokens 全局)
|
|
13
|
+
* - repeats 消随机性:mock 1;live 默认 3 并取 pass@k(适配层不支持 seed)
|
|
14
14
|
* - 并发受控(简单队列实现)
|
|
15
15
|
*/
|
|
16
|
-
import { createRuntime, createRequest
|
|
16
|
+
import { createRuntime, createRequest } from '@aipack-ai/agent';
|
|
17
17
|
import { createMockStreamFn } from './mock-stream.js';
|
|
18
18
|
import { createMockTools } from './mock-tools.js';
|
|
19
19
|
import { countTurns, extractTrajectory } from './trajectory.js';
|
|
20
20
|
import { resolveScorers, scoreTrace } from './scorer/index.js';
|
|
21
|
+
import { assertLiveReady, describeLiveLlm, resolveLiveLlm, } from './live.js';
|
|
21
22
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
22
23
|
const DEFAULT_MAX_STEPS = 50;
|
|
23
24
|
const DEFAULT_CONCURRENCY = 8;
|
|
25
|
+
/** live 模式缺省 repeats:无 seed 可用,靠多次采样消噪 */
|
|
26
|
+
const LIVE_DEFAULT_REPEATS = 3;
|
|
24
27
|
/** sanitize sessionKey(用例 id 可能含 '/') */
|
|
25
28
|
function sessionKeyFor(caseId, repeat) {
|
|
26
29
|
return `eval:${caseId.replace(/[^a-zA-Z0-9_-]/g, '_')}#r${repeat}`;
|
|
27
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* 模式不匹配 → 跳过(不计入通过率,避免出现"必然失败"的噪音)。
|
|
33
|
+
* 返回 undefined 表示该用例在当前模式下可跑。
|
|
34
|
+
*/
|
|
35
|
+
export function skipReason(c, mode) {
|
|
36
|
+
if (mode === 'mock' && c.mode === 'live')
|
|
37
|
+
return 'live-only 用例(mock 模式跳过)';
|
|
38
|
+
if (mode === 'live' && c.mode === 'mock')
|
|
39
|
+
return 'mock-only 用例(live 模式跳过)';
|
|
40
|
+
if (mode === 'live' && c.input.mock)
|
|
41
|
+
return 'fixture replay 用例(live 模式跳过)';
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
/** live 模式:装配真实 LLM(缺配置直接抛错,由 CLI 转 usage 错误) */
|
|
45
|
+
function resolveRuntimeBundle(config) {
|
|
46
|
+
if (config.mode !== 'live')
|
|
47
|
+
return undefined;
|
|
48
|
+
if (config.streamFn) {
|
|
49
|
+
return { streamFn: config.streamFn, model: config.frameworkModel };
|
|
50
|
+
}
|
|
51
|
+
const llm = resolveLiveLlm({
|
|
52
|
+
model: config.model,
|
|
53
|
+
apiKey: config.apiKey,
|
|
54
|
+
baseUrl: config.baseUrl,
|
|
55
|
+
temperature: config.temperature,
|
|
56
|
+
timeoutMs: config.requestTimeoutMs,
|
|
57
|
+
});
|
|
58
|
+
assertLiveReady(llm.spec);
|
|
59
|
+
return {
|
|
60
|
+
streamFn: llm.streamFn,
|
|
61
|
+
model: llm.model,
|
|
62
|
+
label: describeLiveLlm(llm.spec),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
28
65
|
/** 单用例单次运行:返回轨迹(失败时返回 error 字符串) */
|
|
29
|
-
async function runCaseOnce(c, config, repeat) {
|
|
30
|
-
|
|
31
|
-
|
|
66
|
+
async function runCaseOnce(c, config, repeat, bundle) {
|
|
67
|
+
const isLive = config.mode === 'live';
|
|
68
|
+
if (!isLive && !c.input.mock) {
|
|
69
|
+
return { error: 'mock 模式要求 input.mock 脚本(live 模式用 --mode live)' };
|
|
32
70
|
}
|
|
33
71
|
const timeoutMs = c.metadata?.timeoutMs ?? config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
34
72
|
const maxSteps = c.metadata?.maxSteps ?? config.maxSteps ?? DEFAULT_MAX_STEPS;
|
|
35
73
|
const tools = createMockTools(c.input.fs ?? {}, c.input.tools);
|
|
36
74
|
const runtime = createRuntime({
|
|
37
75
|
systemPrompt: c.input.systemPrompt ?? '',
|
|
38
|
-
streamFn: createMockStreamFn(c.input.mock),
|
|
76
|
+
streamFn: isLive ? bundle.streamFn : createMockStreamFn(c.input.mock),
|
|
77
|
+
...(isLive && bundle?.model ? { model: bundle.model } : {}),
|
|
39
78
|
tools,
|
|
40
79
|
maxTurns: maxSteps,
|
|
41
80
|
traceIdGenerator: () => sessionKeyFor(c.id, repeat),
|
|
@@ -97,56 +136,92 @@ async function runCaseOnce(c, config, repeat) {
|
|
|
97
136
|
}
|
|
98
137
|
}
|
|
99
138
|
/** 单用例(含 repeats) */
|
|
100
|
-
async function runCase(c, config) {
|
|
101
|
-
const
|
|
139
|
+
async function runCase(c, config, bundle, budget) {
|
|
140
|
+
const isLive = config.mode === 'live';
|
|
141
|
+
const repeats = c.metadata?.repeats ?? config.repeats ?? (isLive ? LIVE_DEFAULT_REPEATS : 1);
|
|
102
142
|
const scorers = resolveScorers(c.expected, c.scorers);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
143
|
+
// 全局预算熔断:已超限时剩余用例直接判失败,不再烧钱
|
|
144
|
+
if (config.maxTotalTokens !== undefined && budget.spent > config.maxTotalTokens) {
|
|
145
|
+
return {
|
|
146
|
+
caseId: c.id,
|
|
147
|
+
suite: c.suite,
|
|
148
|
+
origin: c.origin,
|
|
149
|
+
passed: false,
|
|
150
|
+
score: 0,
|
|
151
|
+
scores: [],
|
|
152
|
+
error: `总预算熔断:累计 usage.total=${budget.spent} > maxTotalTokens=${config.maxTotalTokens}`,
|
|
153
|
+
durationMs: 0,
|
|
154
|
+
steps: 0,
|
|
155
|
+
usageTotal: 0,
|
|
156
|
+
repeats,
|
|
157
|
+
passCount: 0,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
let scoreSum = 0;
|
|
106
161
|
let scoreCount = 0;
|
|
107
|
-
|
|
162
|
+
let passCount = 0;
|
|
163
|
+
const failedScores = [];
|
|
108
164
|
let runError;
|
|
109
165
|
let steps = 0;
|
|
110
166
|
let usageTotal = 0;
|
|
111
167
|
let durationMs = 0;
|
|
168
|
+
let lastTraceUsage = 0;
|
|
112
169
|
for (let r = 0; r < repeats; r++) {
|
|
113
|
-
const
|
|
114
|
-
|
|
170
|
+
const t0 = Date.now();
|
|
171
|
+
const { trace, error } = await runCaseOnce(c, config, r, bundle);
|
|
172
|
+
durationMs += Date.now() - t0;
|
|
115
173
|
if (error || !trace) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
scoreResults.push({
|
|
119
|
-
scorer: 'success',
|
|
120
|
-
score: 0,
|
|
121
|
-
passed: false,
|
|
122
|
-
reason: `运行失败: ${error ?? '未知错误'}`,
|
|
123
|
-
});
|
|
124
|
-
break;
|
|
174
|
+
runError = runError ?? error;
|
|
175
|
+
continue;
|
|
125
176
|
}
|
|
126
177
|
steps = trace.trajectory.length;
|
|
178
|
+
lastTraceUsage = trace.usageTotal;
|
|
127
179
|
usageTotal += trace.usageTotal;
|
|
180
|
+
budget.spent += trace.usageTotal;
|
|
128
181
|
const caseScore = scoreTrace(trace, scorers);
|
|
129
|
-
|
|
130
|
-
score += caseScore.score;
|
|
182
|
+
scoreSum += caseScore.score;
|
|
131
183
|
scoreCount += 1;
|
|
132
|
-
if (
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
184
|
+
if (caseScore.passed)
|
|
185
|
+
passCount += 1;
|
|
186
|
+
else
|
|
187
|
+
failedScores.push(...caseScore.scores.filter((s) => !s.passed));
|
|
188
|
+
}
|
|
189
|
+
if (scoreCount === 0 && runError) {
|
|
190
|
+
return {
|
|
191
|
+
caseId: c.id,
|
|
192
|
+
suite: c.suite,
|
|
193
|
+
origin: c.origin,
|
|
194
|
+
passed: false,
|
|
195
|
+
score: 0,
|
|
196
|
+
scores: [
|
|
197
|
+
{ scorer: 'success', score: 0, passed: false, reason: `运行失败: ${runError}` },
|
|
198
|
+
],
|
|
199
|
+
error: runError,
|
|
200
|
+
durationMs,
|
|
201
|
+
steps,
|
|
202
|
+
usageTotal,
|
|
203
|
+
repeats,
|
|
204
|
+
passCount: 0,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
// live:pass@k(k 次里至少过一次);mock:每次都必须过
|
|
208
|
+
const passed = isLive ? passCount > 0 : passCount === scoreCount && scoreCount > 0;
|
|
209
|
+
if (scoreCount < repeats) {
|
|
210
|
+
runError = runError ?? `${repeats - scoreCount}/${repeats} 次运行异常`;
|
|
138
211
|
}
|
|
139
212
|
return {
|
|
140
213
|
caseId: c.id,
|
|
141
214
|
suite: c.suite,
|
|
142
215
|
origin: c.origin,
|
|
143
216
|
passed,
|
|
144
|
-
score: scoreCount === 0 ? 0 :
|
|
145
|
-
scores:
|
|
217
|
+
score: scoreCount === 0 ? 0 : scoreSum / scoreCount,
|
|
218
|
+
scores: passed ? [] : failedScores,
|
|
146
219
|
error: runError,
|
|
147
220
|
durationMs,
|
|
148
221
|
steps,
|
|
149
|
-
usageTotal,
|
|
222
|
+
usageTotal: usageTotal || lastTraceUsage,
|
|
223
|
+
repeats,
|
|
224
|
+
passCount,
|
|
150
225
|
};
|
|
151
226
|
}
|
|
152
227
|
/** 简单并发队列(避免引入依赖) */
|
|
@@ -185,20 +260,33 @@ function summarize(results) {
|
|
|
185
260
|
/** 执行一次评测 */
|
|
186
261
|
export async function runEval(cases, config) {
|
|
187
262
|
const startedAt = Date.now();
|
|
188
|
-
const
|
|
263
|
+
const bundle = resolveRuntimeBundle(config);
|
|
264
|
+
const bySuite = config.suites && config.suites.length > 0
|
|
189
265
|
? cases.filter((c) => config.suites.includes(c.suite))
|
|
190
266
|
: cases;
|
|
267
|
+
const skipped = [];
|
|
268
|
+
const runnable = bySuite.filter((c) => {
|
|
269
|
+
const reason = skipReason(c, config.mode);
|
|
270
|
+
if (reason) {
|
|
271
|
+
skipped.push({ caseId: c.id, suite: c.suite, reason });
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
return true;
|
|
275
|
+
});
|
|
191
276
|
const concurrency = config.concurrency ?? DEFAULT_CONCURRENCY;
|
|
192
|
-
const
|
|
277
|
+
const budget = { spent: 0 };
|
|
278
|
+
const results = await runAllConcurrent(runnable, concurrency, (c) => runCase(c, config, bundle, budget));
|
|
193
279
|
const casesPassed = results.filter((r) => r.passed).length;
|
|
194
280
|
return {
|
|
195
281
|
runId: `run_${new Date().toISOString().replace(/[:.]/g, '-')}`,
|
|
196
282
|
startedAt: new Date(startedAt).toISOString(),
|
|
197
283
|
durationMs: Date.now() - startedAt,
|
|
198
284
|
mode: config.mode,
|
|
285
|
+
model: bundle?.label ?? (config.mode === 'live' ? config.model : undefined),
|
|
199
286
|
totals: {
|
|
200
287
|
cases: results.length,
|
|
201
288
|
passed: casesPassed,
|
|
289
|
+
skipped: skipped.length,
|
|
202
290
|
passRate: results.length === 0 ? 0 : casesPassed / results.length,
|
|
203
291
|
avgScore: results.length === 0
|
|
204
292
|
? 0
|
|
@@ -208,6 +296,7 @@ export async function runEval(cases, config) {
|
|
|
208
296
|
bySuite: summarize(results),
|
|
209
297
|
byOrigin: summarize(results.map((r) => ({ ...r, suite: r.origin }))),
|
|
210
298
|
results,
|
|
299
|
+
skipped,
|
|
211
300
|
};
|
|
212
301
|
}
|
|
213
302
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/core/runner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/core/runner.ts"],"names":[],"mappings":"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"}
|