oh-my-knowledge 0.0.1 → 0.18.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/LICENSE +21 -0
- package/README.md +537 -332
- package/dist/src/analysis/coverage-analyzer.d.ts +57 -0
- package/dist/src/analysis/coverage-analyzer.d.ts.map +1 -0
- package/dist/src/analysis/coverage-analyzer.js +262 -0
- package/dist/src/analysis/coverage-analyzer.js.map +1 -0
- package/dist/src/analysis/gap-analyzer.d.ts +114 -0
- package/dist/src/analysis/gap-analyzer.d.ts.map +1 -0
- package/dist/src/analysis/gap-analyzer.js +439 -0
- package/dist/src/analysis/gap-analyzer.js.map +1 -0
- package/dist/src/analysis/hedging-classifier.d.ts +34 -0
- package/dist/src/analysis/hedging-classifier.d.ts.map +1 -0
- package/dist/src/analysis/hedging-classifier.js +144 -0
- package/dist/src/analysis/hedging-classifier.js.map +1 -0
- package/dist/src/analysis/report-diagnostics.d.ts +9 -0
- package/dist/src/analysis/report-diagnostics.d.ts.map +1 -0
- package/dist/src/analysis/report-diagnostics.js +631 -0
- package/dist/src/analysis/report-diagnostics.js.map +1 -0
- package/dist/src/authoring/evolver.d.ts +64 -0
- package/dist/src/authoring/evolver.d.ts.map +1 -0
- package/dist/src/authoring/evolver.js +275 -0
- package/dist/src/authoring/evolver.js.map +1 -0
- package/dist/src/authoring/generator.d.ts +13 -0
- package/dist/src/authoring/generator.d.ts.map +1 -0
- package/dist/src/authoring/generator.js +60 -0
- package/dist/src/authoring/generator.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +1004 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/eval-core/cache.d.ts +11 -0
- package/dist/src/eval-core/cache.d.ts.map +1 -0
- package/dist/src/eval-core/cache.js +53 -0
- package/dist/src/eval-core/cache.js.map +1 -0
- package/dist/src/eval-core/ci-gates.d.ts +17 -0
- package/dist/src/eval-core/ci-gates.d.ts.map +1 -0
- package/dist/src/eval-core/ci-gates.js +42 -0
- package/dist/src/eval-core/ci-gates.js.map +1 -0
- package/dist/src/eval-core/dependency-checker.d.ts +37 -0
- package/dist/src/eval-core/dependency-checker.d.ts.map +1 -0
- package/dist/src/eval-core/dependency-checker.js +280 -0
- package/dist/src/eval-core/dependency-checker.js.map +1 -0
- package/dist/src/eval-core/evaluation-execution.d.ts +26 -0
- package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -0
- package/dist/src/eval-core/evaluation-execution.js +196 -0
- package/dist/src/eval-core/evaluation-execution.js.map +1 -0
- package/dist/src/eval-core/evaluation-job.d.ts +48 -0
- package/dist/src/eval-core/evaluation-job.d.ts.map +1 -0
- package/dist/src/eval-core/evaluation-job.js +112 -0
- package/dist/src/eval-core/evaluation-job.js.map +1 -0
- package/dist/src/eval-core/evaluation-reporting.d.ts +28 -0
- package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -0
- package/dist/src/eval-core/evaluation-reporting.js +123 -0
- package/dist/src/eval-core/evaluation-reporting.js.map +1 -0
- package/dist/src/eval-core/execution-strategy.d.ts +11 -0
- package/dist/src/eval-core/execution-strategy.d.ts.map +1 -0
- package/dist/src/eval-core/execution-strategy.js +121 -0
- package/dist/src/eval-core/execution-strategy.js.map +1 -0
- package/dist/src/eval-core/fact-checker.d.ts +25 -0
- package/dist/src/eval-core/fact-checker.d.ts.map +1 -0
- package/dist/src/eval-core/fact-checker.js +66 -0
- package/dist/src/eval-core/fact-checker.js.map +1 -0
- package/dist/src/eval-core/schema.d.ts +30 -0
- package/dist/src/eval-core/schema.d.ts.map +1 -0
- package/dist/src/eval-core/schema.js +195 -0
- package/dist/src/eval-core/schema.js.map +1 -0
- package/dist/src/eval-core/statistics.d.ts +86 -0
- package/dist/src/eval-core/statistics.d.ts.map +1 -0
- package/dist/src/eval-core/statistics.js +210 -0
- package/dist/src/eval-core/statistics.js.map +1 -0
- package/dist/src/eval-core/task-planner.d.ts +4 -0
- package/dist/src/eval-core/task-planner.d.ts.map +1 -0
- package/dist/src/eval-core/task-planner.js +33 -0
- package/dist/src/eval-core/task-planner.js.map +1 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.d.ts +133 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.d.ts.map +1 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.js +169 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.js.map +1 -0
- package/dist/src/eval-workflows/evaluation-pipeline.d.ts +38 -0
- package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -0
- package/dist/src/eval-workflows/evaluation-pipeline.js +214 -0
- package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -0
- package/dist/src/eval-workflows/evaluation-preparation.d.ts +64 -0
- package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -0
- package/dist/src/eval-workflows/evaluation-preparation.js +90 -0
- package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -0
- package/dist/src/eval-workflows/run-evaluation.d.ts +105 -0
- package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -0
- package/dist/src/eval-workflows/run-evaluation.js +264 -0
- package/dist/src/eval-workflows/run-evaluation.js.map +1 -0
- package/dist/src/executors/anthropic-api.d.ts +3 -0
- package/dist/src/executors/anthropic-api.d.ts.map +1 -0
- package/dist/src/executors/anthropic-api.js +43 -0
- package/dist/src/executors/anthropic-api.js.map +1 -0
- package/dist/src/executors/claude-cli.d.ts +3 -0
- package/dist/src/executors/claude-cli.d.ts.map +1 -0
- package/dist/src/executors/claude-cli.js +103 -0
- package/dist/src/executors/claude-cli.js.map +1 -0
- package/dist/src/executors/claude-sdk-trace.d.ts +10 -0
- package/dist/src/executors/claude-sdk-trace.d.ts.map +1 -0
- package/dist/src/executors/claude-sdk-trace.js +100 -0
- package/dist/src/executors/claude-sdk-trace.js.map +1 -0
- package/dist/src/executors/claude-sdk.d.ts +3 -0
- package/dist/src/executors/claude-sdk.d.ts.map +1 -0
- package/dist/src/executors/claude-sdk.js +160 -0
- package/dist/src/executors/claude-sdk.js.map +1 -0
- package/dist/src/executors/gemini.d.ts +3 -0
- package/dist/src/executors/gemini.d.ts.map +1 -0
- package/dist/src/executors/gemini.js +78 -0
- package/dist/src/executors/gemini.js.map +1 -0
- package/dist/src/executors/index.d.ts +7 -0
- package/dist/src/executors/index.d.ts.map +1 -0
- package/dist/src/executors/index.js +22 -0
- package/dist/src/executors/index.js.map +1 -0
- package/dist/src/executors/openai-api.d.ts +3 -0
- package/dist/src/executors/openai-api.d.ts.map +1 -0
- package/dist/src/executors/openai-api.js +40 -0
- package/dist/src/executors/openai-api.js.map +1 -0
- package/dist/src/executors/openai-cli.d.ts +3 -0
- package/dist/src/executors/openai-cli.d.ts.map +1 -0
- package/dist/src/executors/openai-cli.js +60 -0
- package/dist/src/executors/openai-cli.js.map +1 -0
- package/dist/src/executors/script.d.ts +3 -0
- package/dist/src/executors/script.d.ts.map +1 -0
- package/dist/src/executors/script.js +63 -0
- package/dist/src/executors/script.js.map +1 -0
- package/dist/src/executors/shared.d.ts +117 -0
- package/dist/src/executors/shared.d.ts.map +1 -0
- package/dist/src/executors/shared.js +49 -0
- package/dist/src/executors/shared.js.map +1 -0
- package/dist/src/grading/assertions.d.ts +18 -0
- package/dist/src/grading/assertions.d.ts.map +1 -0
- package/dist/src/grading/assertions.js +239 -0
- package/dist/src/grading/assertions.js.map +1 -0
- package/dist/src/grading/index.d.ts +26 -0
- package/dist/src/grading/index.d.ts.map +1 -0
- package/dist/src/grading/index.js +98 -0
- package/dist/src/grading/index.js.map +1 -0
- package/dist/src/grading/judge.d.ts +13 -0
- package/dist/src/grading/judge.d.ts.map +1 -0
- package/dist/src/grading/judge.js +98 -0
- package/dist/src/grading/judge.js.map +1 -0
- package/dist/src/grading/layered-scores.d.ts +13 -0
- package/dist/src/grading/layered-scores.d.ts.map +1 -0
- package/dist/src/grading/layered-scores.js +62 -0
- package/dist/src/grading/layered-scores.js.map +1 -0
- package/dist/src/inputs/eval-config.d.ts +13 -0
- package/dist/src/inputs/eval-config.d.ts.map +1 -0
- package/dist/src/inputs/eval-config.js +136 -0
- package/dist/src/inputs/eval-config.js.map +1 -0
- package/dist/src/inputs/load-samples.d.ts +16 -0
- package/dist/src/inputs/load-samples.d.ts.map +1 -0
- package/dist/src/inputs/load-samples.js +51 -0
- package/dist/src/inputs/load-samples.js.map +1 -0
- package/dist/src/inputs/mcp-resolver.d.ts +50 -0
- package/dist/src/inputs/mcp-resolver.d.ts.map +1 -0
- package/dist/src/inputs/mcp-resolver.js +307 -0
- package/dist/src/inputs/mcp-resolver.js.map +1 -0
- package/dist/src/inputs/skill-loader.d.ts +18 -0
- package/dist/src/inputs/skill-loader.d.ts.map +1 -0
- package/dist/src/inputs/skill-loader.js +222 -0
- package/dist/src/inputs/skill-loader.js.map +1 -0
- package/dist/src/inputs/url-fetcher.d.ts +19 -0
- package/dist/src/inputs/url-fetcher.d.ts.map +1 -0
- package/dist/src/inputs/url-fetcher.js +241 -0
- package/dist/src/inputs/url-fetcher.js.map +1 -0
- package/dist/src/observability/production-analyzer.d.ts +61 -0
- package/dist/src/observability/production-analyzer.d.ts.map +1 -0
- package/dist/src/observability/production-analyzer.js +183 -0
- package/dist/src/observability/production-analyzer.js.map +1 -0
- package/dist/src/observability/trace-adapter.d.ts +75 -0
- package/dist/src/observability/trace-adapter.d.ts.map +1 -0
- package/dist/src/observability/trace-adapter.js +341 -0
- package/dist/src/observability/trace-adapter.js.map +1 -0
- package/dist/src/renderer/html-renderer.d.ts +9 -0
- package/dist/src/renderer/html-renderer.d.ts.map +1 -0
- package/dist/src/renderer/html-renderer.js +338 -0
- package/dist/src/renderer/html-renderer.js.map +1 -0
- package/dist/src/renderer/layout.d.ts +13 -0
- package/dist/src/renderer/layout.d.ts.map +1 -0
- package/dist/src/renderer/layout.js +476 -0
- package/dist/src/renderer/layout.js.map +1 -0
- package/dist/src/renderer/skill-health-renderer.d.ts +20 -0
- package/dist/src/renderer/skill-health-renderer.d.ts.map +1 -0
- package/dist/src/renderer/skill-health-renderer.js +218 -0
- package/dist/src/renderer/skill-health-renderer.js.map +1 -0
- package/dist/src/renderer/summary.d.ts +21 -0
- package/dist/src/renderer/summary.d.ts.map +1 -0
- package/dist/src/renderer/summary.js +1072 -0
- package/dist/src/renderer/summary.js.map +1 -0
- package/dist/src/renderer/table.d.ts +3 -0
- package/dist/src/renderer/table.d.ts.map +1 -0
- package/dist/src/renderer/table.js +134 -0
- package/dist/src/renderer/table.js.map +1 -0
- package/dist/src/renderer/trends.d.ts +6 -0
- package/dist/src/renderer/trends.d.ts.map +1 -0
- package/dist/src/renderer/trends.js +127 -0
- package/dist/src/renderer/trends.js.map +1 -0
- package/dist/src/server/job-store.d.ts +4 -0
- package/dist/src/server/job-store.d.ts.map +1 -0
- package/dist/src/server/job-store.js +68 -0
- package/dist/src/server/job-store.js.map +1 -0
- package/dist/src/server/report-server.d.ts +16 -0
- package/dist/src/server/report-server.d.ts.map +1 -0
- package/dist/src/server/report-server.js +196 -0
- package/dist/src/server/report-server.js.map +1 -0
- package/dist/src/server/report-store.d.ts +44 -0
- package/dist/src/server/report-store.d.ts.map +1 -0
- package/dist/src/server/report-store.js +190 -0
- package/dist/src/server/report-store.js.map +1 -0
- package/dist/src/types.d.ts +553 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +44 -3
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const FACTUAL_ASSERTION_TYPES = new Set([
|
|
2
|
+
'contains',
|
|
3
|
+
'not_contains',
|
|
4
|
+
'regex',
|
|
5
|
+
'json_valid',
|
|
6
|
+
'json_schema',
|
|
7
|
+
'equals',
|
|
8
|
+
'not_equals',
|
|
9
|
+
'contains_all',
|
|
10
|
+
'contains_any',
|
|
11
|
+
'semantic_similarity',
|
|
12
|
+
'tool_output_contains',
|
|
13
|
+
'tool_input_contains',
|
|
14
|
+
]);
|
|
15
|
+
const BEHAVIORAL_ASSERTION_TYPES = new Set([
|
|
16
|
+
'starts_with',
|
|
17
|
+
'ends_with',
|
|
18
|
+
'min_length',
|
|
19
|
+
'max_length',
|
|
20
|
+
'word_count_min',
|
|
21
|
+
'word_count_max',
|
|
22
|
+
'cost_max',
|
|
23
|
+
'latency_max',
|
|
24
|
+
'turns_min',
|
|
25
|
+
'turns_max',
|
|
26
|
+
'tools_called',
|
|
27
|
+
'tools_not_called',
|
|
28
|
+
'tools_count_min',
|
|
29
|
+
'tools_count_max',
|
|
30
|
+
'custom',
|
|
31
|
+
]);
|
|
32
|
+
function ratioToScore(ratio) {
|
|
33
|
+
return Number((1 + ratio * 4).toFixed(2));
|
|
34
|
+
}
|
|
35
|
+
function scoreFromDetails(details) {
|
|
36
|
+
if (details.length === 0)
|
|
37
|
+
return null;
|
|
38
|
+
const totalWeight = details.reduce((s, d) => s + d.weight, 0);
|
|
39
|
+
if (totalWeight === 0)
|
|
40
|
+
return null;
|
|
41
|
+
const passedWeight = details.filter((d) => d.passed).reduce((s, d) => s + d.weight, 0);
|
|
42
|
+
return ratioToScore(passedWeight / totalWeight);
|
|
43
|
+
}
|
|
44
|
+
export function computeLayeredScores(results) {
|
|
45
|
+
const layered = {};
|
|
46
|
+
if (results.assertions?.details) {
|
|
47
|
+
const factDetails = results.assertions.details.filter((d) => FACTUAL_ASSERTION_TYPES.has(d.type));
|
|
48
|
+
const behaviorDetails = results.assertions.details.filter((d) => BEHAVIORAL_ASSERTION_TYPES.has(d.type));
|
|
49
|
+
layered.factScore = scoreFromDetails(factDetails) ?? undefined;
|
|
50
|
+
layered.behaviorScore = scoreFromDetails(behaviorDetails) ?? undefined;
|
|
51
|
+
}
|
|
52
|
+
// 评委打 0 分是"完全不合格"的合法低分,不是缺失——保留进 composite 计算,不做 > 0 gate。
|
|
53
|
+
// 只排除 undefined(真正缺数据:没配 judge 或打分失败)。fact/behavior 通过 ratioToScore
|
|
54
|
+
// 产出的分数理论上 ≥ 1,null 判断即可。
|
|
55
|
+
if (typeof results.llmScore === 'number') {
|
|
56
|
+
layered.judgeScore = results.llmScore;
|
|
57
|
+
}
|
|
58
|
+
const scores = [layered.factScore, layered.behaviorScore, layered.judgeScore].filter((s) => s != null);
|
|
59
|
+
const compositeScore = scores.length > 0 ? Number((scores.reduce((a, b) => a + b, 0) / scores.length).toFixed(2)) : 0;
|
|
60
|
+
return { compositeScore, layeredScores: layered };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=layered-scores.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layered-scores.js","sourceRoot":"","sources":["../../../src/grading/layered-scores.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EvalConfig, EvalConfigVariant, VariantSpec } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Load and validate an eval.yaml (or .json) config file.
|
|
4
|
+
* All relative paths in the config are resolved against the config file's directory.
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadEvalConfig(configPath: string): EvalConfig;
|
|
7
|
+
/**
|
|
8
|
+
* Convert EvalConfig.variants into VariantSpec[] (the CLI-internal representation).
|
|
9
|
+
* A variant's `cwd` (if present) is merged into the expression as `artifact@cwd`
|
|
10
|
+
* so the downstream variant resolver can treat CLI and config uniformly.
|
|
11
|
+
*/
|
|
12
|
+
export declare function configVariantsToSpecs(variants: EvalConfigVariant[]): VariantSpec[];
|
|
13
|
+
//# sourceMappingURL=eval-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-config.d.ts","sourceRoot":"","sources":["../../../src/inputs/eval-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAEjB,WAAW,EACZ,MAAM,aAAa,CAAC;AAIrB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAU7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,WAAW,EAAE,CAMlF"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { resolve, dirname, isAbsolute, join } from 'node:path';
|
|
3
|
+
import { parseYaml } from './load-samples.js';
|
|
4
|
+
const VALID_ROLES = ['control', 'treatment'];
|
|
5
|
+
/**
|
|
6
|
+
* Load and validate an eval.yaml (or .json) config file.
|
|
7
|
+
* All relative paths in the config are resolved against the config file's directory.
|
|
8
|
+
*/
|
|
9
|
+
export function loadEvalConfig(configPath) {
|
|
10
|
+
const absPath = resolve(configPath);
|
|
11
|
+
if (!existsSync(absPath)) {
|
|
12
|
+
throw new Error(`--config 指定的文件不存在: ${absPath}`);
|
|
13
|
+
}
|
|
14
|
+
const raw = readFileSync(absPath, 'utf-8');
|
|
15
|
+
const isJson = absPath.endsWith('.json');
|
|
16
|
+
const parsed = isJson ? JSON.parse(raw) : parseYaml(raw);
|
|
17
|
+
const config = validateEvalConfig(parsed, configPath);
|
|
18
|
+
return resolveConfigPaths(config, dirname(absPath));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Convert EvalConfig.variants into VariantSpec[] (the CLI-internal representation).
|
|
22
|
+
* A variant's `cwd` (if present) is merged into the expression as `artifact@cwd`
|
|
23
|
+
* so the downstream variant resolver can treat CLI and config uniformly.
|
|
24
|
+
*/
|
|
25
|
+
export function configVariantsToSpecs(variants) {
|
|
26
|
+
return variants.map((v) => ({
|
|
27
|
+
name: v.name,
|
|
28
|
+
role: v.role,
|
|
29
|
+
expr: v.cwd ? `${v.artifact}@${v.cwd}` : v.artifact,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
function validateEvalConfig(parsed, configPath) {
|
|
33
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
34
|
+
throw new Error(`${configPath}: 顶层必须是对象`);
|
|
35
|
+
}
|
|
36
|
+
const obj = parsed;
|
|
37
|
+
if (typeof obj.samples !== 'string' || !obj.samples) {
|
|
38
|
+
throw new Error(`${configPath}: samples 字段必填,需为字符串`);
|
|
39
|
+
}
|
|
40
|
+
if (!Array.isArray(obj.variants) || obj.variants.length === 0) {
|
|
41
|
+
throw new Error(`${configPath}: variants 字段必填,需为非空数组`);
|
|
42
|
+
}
|
|
43
|
+
const variants = [];
|
|
44
|
+
const seen = new Set();
|
|
45
|
+
let hasAnyRole = false;
|
|
46
|
+
for (const [i, raw] of obj.variants.entries()) {
|
|
47
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
48
|
+
throw new Error(`${configPath}: variants[${i}] 必须是对象`);
|
|
49
|
+
}
|
|
50
|
+
const v = raw;
|
|
51
|
+
if (typeof v.name !== 'string' || !v.name) {
|
|
52
|
+
throw new Error(`${configPath}: variants[${i}].name 必填,需为字符串`);
|
|
53
|
+
}
|
|
54
|
+
if (typeof v.role !== 'string' || !VALID_ROLES.includes(v.role)) {
|
|
55
|
+
throw new Error(`${configPath}: variants[${i}].role 必须是 'control' 或 'treatment'(当前:${JSON.stringify(v.role)})`);
|
|
56
|
+
}
|
|
57
|
+
if (typeof v.artifact !== 'string' || !v.artifact) {
|
|
58
|
+
throw new Error(`${configPath}: variants[${i}].artifact 必填,需为字符串`);
|
|
59
|
+
}
|
|
60
|
+
if (v.cwd !== undefined && typeof v.cwd !== 'string') {
|
|
61
|
+
throw new Error(`${configPath}: variants[${i}].cwd 必须是字符串`);
|
|
62
|
+
}
|
|
63
|
+
if (seen.has(v.name)) {
|
|
64
|
+
throw new Error(`${configPath}: variants[${i}].name "${v.name}" 重复`);
|
|
65
|
+
}
|
|
66
|
+
seen.add(v.name);
|
|
67
|
+
hasAnyRole = true;
|
|
68
|
+
variants.push({
|
|
69
|
+
name: v.name,
|
|
70
|
+
role: v.role,
|
|
71
|
+
artifact: v.artifact,
|
|
72
|
+
cwd: v.cwd,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (!hasAnyRole) {
|
|
76
|
+
throw new Error(`${configPath}: variants 里至少要有一个 control 或 treatment`);
|
|
77
|
+
}
|
|
78
|
+
const assertStringOpt = (key) => {
|
|
79
|
+
if (obj[key] !== undefined && typeof obj[key] !== 'string') {
|
|
80
|
+
throw new Error(`${configPath}: ${key} 必须是字符串`);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const assertNumberOpt = (key) => {
|
|
84
|
+
if (obj[key] !== undefined && typeof obj[key] !== 'number') {
|
|
85
|
+
throw new Error(`${configPath}: ${key} 必须是数字`);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const assertBoolOpt = (key) => {
|
|
89
|
+
if (obj[key] !== undefined && typeof obj[key] !== 'boolean') {
|
|
90
|
+
throw new Error(`${configPath}: ${key} 必须是布尔值`);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
assertStringOpt('executor');
|
|
94
|
+
assertStringOpt('model');
|
|
95
|
+
if (obj.judgeModel !== undefined && obj.judgeModel !== null && typeof obj.judgeModel !== 'string') {
|
|
96
|
+
throw new Error(`${configPath}: judgeModel 必须是字符串或 null`);
|
|
97
|
+
}
|
|
98
|
+
if (obj.judgeExecutor !== undefined && obj.judgeExecutor !== null && typeof obj.judgeExecutor !== 'string') {
|
|
99
|
+
throw new Error(`${configPath}: judgeExecutor 必须是字符串或 null`);
|
|
100
|
+
}
|
|
101
|
+
assertNumberOpt('concurrency');
|
|
102
|
+
assertNumberOpt('timeoutMs');
|
|
103
|
+
assertBoolOpt('noCache');
|
|
104
|
+
assertBoolOpt('blind');
|
|
105
|
+
assertStringOpt('mcpConfig');
|
|
106
|
+
return {
|
|
107
|
+
samples: obj.samples,
|
|
108
|
+
executor: obj.executor,
|
|
109
|
+
model: obj.model,
|
|
110
|
+
judgeModel: obj.judgeModel,
|
|
111
|
+
judgeExecutor: obj.judgeExecutor,
|
|
112
|
+
concurrency: obj.concurrency,
|
|
113
|
+
timeoutMs: obj.timeoutMs,
|
|
114
|
+
noCache: obj.noCache,
|
|
115
|
+
blind: obj.blind,
|
|
116
|
+
mcpConfig: obj.mcpConfig,
|
|
117
|
+
variants,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function resolveConfigPaths(config, configDir) {
|
|
121
|
+
const resolveRel = (p) => (isAbsolute(p) ? p : join(configDir, p));
|
|
122
|
+
// Artifact expressions that are not file paths (baseline / git: / plain names) stay as-is.
|
|
123
|
+
const looksLikePath = (expr) => expr.startsWith('./') || expr.startsWith('../') || expr.startsWith('/') || /\.(md|yaml|yml|json)$/i.test(expr);
|
|
124
|
+
const isNonPathExpr = (expr) => expr === 'baseline' || expr.startsWith('git:');
|
|
125
|
+
return {
|
|
126
|
+
...config,
|
|
127
|
+
samples: resolveRel(config.samples),
|
|
128
|
+
mcpConfig: config.mcpConfig ? resolveRel(config.mcpConfig) : undefined,
|
|
129
|
+
variants: config.variants.map((v) => ({
|
|
130
|
+
...v,
|
|
131
|
+
artifact: isNonPathExpr(v.artifact) ? v.artifact : (looksLikePath(v.artifact) ? resolveRel(v.artifact) : v.artifact),
|
|
132
|
+
cwd: v.cwd ? resolveRel(v.cwd) : undefined,
|
|
133
|
+
})),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=eval-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-config.js","sourceRoot":"","sources":["../../../src/inputs/eval-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Sample } from '../types.js';
|
|
2
|
+
import type { DependencyRequirements } from '../eval-core/dependency-checker.js';
|
|
3
|
+
export declare function parseYaml(text: string): unknown;
|
|
4
|
+
export interface LoadSamplesResult {
|
|
5
|
+
samples: Sample[];
|
|
6
|
+
requires?: DependencyRequirements;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Load samples from a JSON or YAML file.
|
|
10
|
+
*
|
|
11
|
+
* Supports two formats:
|
|
12
|
+
* - Array: `[ { sample_id, prompt, ... } ]` (legacy)
|
|
13
|
+
* - Object wrapper: `{ requires?: { tools, files, env }, samples: [...] }`
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadSamples(samplesPath: string): LoadSamplesResult;
|
|
16
|
+
//# sourceMappingURL=load-samples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-samples.d.ts","sourceRoot":"","sources":["../../../src/inputs/load-samples.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAQjF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/C;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,CA8BlE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
export function parseYaml(text) {
|
|
5
|
+
try {
|
|
6
|
+
return yaml.load(text);
|
|
7
|
+
}
|
|
8
|
+
catch (err) {
|
|
9
|
+
const yamlError = (typeof err === 'object' && err !== null ? err : {});
|
|
10
|
+
const line = yamlError.mark ? ` at line ${yamlError.mark.line + 1}` : '';
|
|
11
|
+
throw new Error(`YAML parse error${line}: ${yamlError.reason || yamlError.message || 'unknown error'}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load samples from a JSON or YAML file.
|
|
16
|
+
*
|
|
17
|
+
* Supports two formats:
|
|
18
|
+
* - Array: `[ { sample_id, prompt, ... } ]` (legacy)
|
|
19
|
+
* - Object wrapper: `{ requires?: { tools, files, env }, samples: [...] }`
|
|
20
|
+
*/
|
|
21
|
+
export function loadSamples(samplesPath) {
|
|
22
|
+
const rawContent = readFileSync(resolve(samplesPath), 'utf-8');
|
|
23
|
+
const isYaml = samplesPath.endsWith('.yaml') || samplesPath.endsWith('.yml');
|
|
24
|
+
const parsed = isYaml ? parseYaml(rawContent) : JSON.parse(rawContent);
|
|
25
|
+
let samples;
|
|
26
|
+
let requires;
|
|
27
|
+
if (Array.isArray(parsed)) {
|
|
28
|
+
// Legacy array format
|
|
29
|
+
samples = parsed;
|
|
30
|
+
}
|
|
31
|
+
else if (typeof parsed === 'object' && parsed !== null && 'samples' in parsed) {
|
|
32
|
+
// Object wrapper format
|
|
33
|
+
const wrapper = parsed;
|
|
34
|
+
samples = wrapper.samples;
|
|
35
|
+
requires = wrapper.requires;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw new Error(`无效的样本文件格式: ${samplesPath}(期望数组或包含 samples 字段的对象)`);
|
|
39
|
+
}
|
|
40
|
+
if (!Array.isArray(samples) || samples.length === 0) {
|
|
41
|
+
throw new Error(`无效的样本文件: ${samplesPath}`);
|
|
42
|
+
}
|
|
43
|
+
for (const [i, sample] of samples.entries()) {
|
|
44
|
+
if (!sample.sample_id)
|
|
45
|
+
throw new Error(`samples[${i}] 缺少必填字段: sample_id`);
|
|
46
|
+
if (!sample.prompt)
|
|
47
|
+
throw new Error(`samples[${i}] (${sample.sample_id}) 缺少必填字段: prompt`);
|
|
48
|
+
}
|
|
49
|
+
return { samples, requires };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=load-samples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-samples.js","sourceRoot":"","sources":["../../../src/inputs/load-samples.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,SAAS,CAAC;AAU3B,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAkB,CAAC;QACxF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;IAC1G,CAAC;AACH,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAY,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEhF,IAAI,OAAiB,CAAC;IACtB,IAAI,QAA4C,CAAC;IAEjD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,sBAAsB;QACtB,OAAO,GAAG,MAAkB,CAAC;IAC/B,CAAC;SAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QAChF,wBAAwB;QACxB,MAAM,OAAO,GAAG,MAAkE,CAAC;QACnF,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC1B,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,cAAc,WAAW,yBAAyB,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,MAAM,CAAC,SAAS,kBAAkB,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP-based URL resolver for eval-samples.
|
|
3
|
+
*
|
|
4
|
+
* Reads a MCP config file (.mcp.json), launches configured MCP servers,
|
|
5
|
+
* and uses them to fetch URL content that cannot be reached via plain HTTP
|
|
6
|
+
* (e.g. private documentation behind SSO).
|
|
7
|
+
*
|
|
8
|
+
* Config format (.mcp.json):
|
|
9
|
+
* {
|
|
10
|
+
* "mcpServers": {
|
|
11
|
+
* "docs": {
|
|
12
|
+
* "command": "npx",
|
|
13
|
+
* "args": ["@example/docs-mcp-server"],
|
|
14
|
+
* "env": { "DOCS_API_TOKEN": "xxx" },
|
|
15
|
+
* "urlPatterns": ["docs.example.com"],
|
|
16
|
+
* "fetchTool": { "name": "get_doc", "urlParam": "url" }
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* Advanced: urlTransform + contentExtract for complex MCP tools:
|
|
22
|
+
* {
|
|
23
|
+
* "fetchTool": {
|
|
24
|
+
* "name": "fetch_doc",
|
|
25
|
+
* "urlTransform": {
|
|
26
|
+
* "regex": "docs\\.example\\.com/([^/]+/[^/]+)/([^/?#]+)",
|
|
27
|
+
* "params": { "namespace": "$1", "slug": "$2" }
|
|
28
|
+
* },
|
|
29
|
+
* "contentExtract": "data.body"
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
*/
|
|
33
|
+
import type { Sample, McpServers } from '../types.js';
|
|
34
|
+
/**
|
|
35
|
+
* Load MCP config from a JSON file.
|
|
36
|
+
* Returns only servers that declare `urlPatterns` + `fetchTool`.
|
|
37
|
+
* Returns null if file not found or no eligible servers.
|
|
38
|
+
*/
|
|
39
|
+
export declare function loadMcpConfig(configPath?: string): McpServers | null;
|
|
40
|
+
/**
|
|
41
|
+
* Resolve URLs in samples via MCP servers.
|
|
42
|
+
* Mutates samples in-place — same contract as url-fetcher's resolveUrls().
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveMcpUrls(samples: Sample[], mcpServers: McpServers | null): Promise<Set<string>>;
|
|
45
|
+
/**
|
|
46
|
+
* Close all active MCP client connections.
|
|
47
|
+
* Should be called when the evaluation run finishes.
|
|
48
|
+
*/
|
|
49
|
+
export declare function stopAllServers(): Promise<void>;
|
|
50
|
+
//# sourceMappingURL=mcp-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-resolver.d.ts","sourceRoot":"","sources":["../../../src/inputs/mcp-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAOH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAA8B,MAAM,aAAa,CAAC;AAgDlF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAwBpE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CA0F3G;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAWpD"}
|