@gnsx/genesys.agent.eval 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/src/adapters/anthropic-adapter.d.ts +24 -0
- package/dist/src/adapters/anthropic-adapter.d.ts.map +1 -0
- package/dist/src/adapters/anthropic-adapter.js +80 -0
- package/dist/src/adapters/anthropic-adapter.js.map +1 -0
- package/dist/src/adapters/gemini-adapter.d.ts +23 -0
- package/dist/src/adapters/gemini-adapter.d.ts.map +1 -0
- package/dist/src/adapters/gemini-adapter.js +79 -0
- package/dist/src/adapters/gemini-adapter.js.map +1 -0
- package/dist/src/adapters/ollama-adapter.d.ts +28 -0
- package/dist/src/adapters/ollama-adapter.d.ts.map +1 -0
- package/dist/src/adapters/ollama-adapter.js +54 -0
- package/dist/src/adapters/ollama-adapter.js.map +1 -0
- package/dist/src/adapters/openai-adapter.d.ts +24 -0
- package/dist/src/adapters/openai-adapter.d.ts.map +1 -0
- package/dist/src/adapters/openai-adapter.js +80 -0
- package/dist/src/adapters/openai-adapter.js.map +1 -0
- package/dist/src/adapters/pi-adapter.d.ts +27 -0
- package/dist/src/adapters/pi-adapter.d.ts.map +1 -0
- package/dist/src/adapters/pi-adapter.js +136 -0
- package/dist/src/adapters/pi-adapter.js.map +1 -0
- package/dist/src/agent-adapter.d.ts +130 -0
- package/dist/src/agent-adapter.d.ts.map +1 -0
- package/dist/src/agent-adapter.js +134 -0
- package/dist/src/agent-adapter.js.map +1 -0
- package/dist/src/args.d.ts +22 -0
- package/dist/src/args.d.ts.map +1 -0
- package/dist/src/args.js +224 -0
- package/dist/src/args.js.map +1 -0
- package/dist/src/cli-runner.d.ts +39 -0
- package/dist/src/cli-runner.d.ts.map +1 -0
- package/dist/src/cli-runner.js +105 -0
- package/dist/src/cli-runner.js.map +1 -0
- package/dist/src/embedding-judge.d.ts +93 -0
- package/dist/src/embedding-judge.d.ts.map +1 -0
- package/dist/src/embedding-judge.js +160 -0
- package/dist/src/embedding-judge.js.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/judge.d.ts +95 -0
- package/dist/src/judge.d.ts.map +1 -0
- package/dist/src/judge.js +189 -0
- package/dist/src/judge.js.map +1 -0
- package/dist/src/launcher.d.ts +9 -0
- package/dist/src/launcher.d.ts.map +1 -0
- package/dist/src/launcher.js +129 -0
- package/dist/src/launcher.js.map +1 -0
- package/dist/src/reporter.d.ts +86 -0
- package/dist/src/reporter.d.ts.map +1 -0
- package/dist/src/reporter.js +384 -0
- package/dist/src/reporter.js.map +1 -0
- package/dist/src/runner.d.ts +75 -0
- package/dist/src/runner.d.ts.map +1 -0
- package/dist/src/runner.js +165 -0
- package/dist/src/runner.js.map +1 -0
- package/dist/src/test-loader.d.ts +66 -0
- package/dist/src/test-loader.d.ts.map +1 -0
- package/dist/src/test-loader.js +140 -0
- package/dist/src/test-loader.js.map +1 -0
- package/dist/src/types.d.ts +161 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +7 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/package.d.ts +16 -0
- package/dist/src/utils/package.d.ts.map +1 -0
- package/dist/src/utils/package.js +30 -0
- package/dist/src/utils/package.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/examples/basic-tests.yaml +22 -0
- package/package.json +41 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Genesys Agent Eval CLI launcher.
|
|
4
|
+
*
|
|
5
|
+
* Entry point for the evaluation harness. Spawns pi or genesys CLI
|
|
6
|
+
* processes to run tests and evaluates the results.
|
|
7
|
+
*/
|
|
8
|
+
import { resolve } from 'node:path';
|
|
9
|
+
import { parseArgs, printHelp, printVersion } from './args.js';
|
|
10
|
+
import { EmbeddingJudge } from './embedding-judge.js';
|
|
11
|
+
import { Judge } from './judge.js';
|
|
12
|
+
import { Reporter } from './reporter.js';
|
|
13
|
+
import { runEvaluation } from './runner.js';
|
|
14
|
+
/**
|
|
15
|
+
* ANSI color codes for console output.
|
|
16
|
+
*/
|
|
17
|
+
const colors = {
|
|
18
|
+
reset: '\x1b[0m',
|
|
19
|
+
bright: '\x1b[1m',
|
|
20
|
+
dim: '\x1b[2m',
|
|
21
|
+
green: '\x1b[32m',
|
|
22
|
+
red: '\x1b[31m',
|
|
23
|
+
yellow: '\x1b[33m',
|
|
24
|
+
blue: '\x1b[34m',
|
|
25
|
+
cyan: '\x1b[36m',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Progress callback implementation for console output.
|
|
29
|
+
*/
|
|
30
|
+
function createProgressCallback(verbose) {
|
|
31
|
+
return {
|
|
32
|
+
onTestStart(testId, index, total) {
|
|
33
|
+
if (verbose) {
|
|
34
|
+
console.log(`[${index + 1}/${total}] Running: ${testId}`);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
onTestComplete(result, index, total) {
|
|
38
|
+
const status = result.passed ? 'PASS' : 'FAIL';
|
|
39
|
+
const score = `${(result.judgeScore * 100).toFixed(0)}%`;
|
|
40
|
+
const statusColor = result.passed ? colors.green : colors.red;
|
|
41
|
+
console.log(`${statusColor}${status}${colors.reset}`);
|
|
42
|
+
},
|
|
43
|
+
onTestError(testId, error, index, total) {
|
|
44
|
+
console.error(`[${index + 1}/${total}] ERROR - ${testId}: ${error}`);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Main entry point.
|
|
50
|
+
*/
|
|
51
|
+
async function main(argv) {
|
|
52
|
+
const args = parseArgs(argv);
|
|
53
|
+
if (args.version) {
|
|
54
|
+
printVersion();
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
if (args.help) {
|
|
58
|
+
printHelp();
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
const cwd = resolve(args.cwd);
|
|
62
|
+
// Build configuration
|
|
63
|
+
const config = {
|
|
64
|
+
testsPath: args.tests,
|
|
65
|
+
agent: args.agent,
|
|
66
|
+
cwd,
|
|
67
|
+
timeout: args.timeout * 1000, // Convert to milliseconds
|
|
68
|
+
outputPath: args.output,
|
|
69
|
+
format: args.format,
|
|
70
|
+
parallel: args.parallel,
|
|
71
|
+
judge: {
|
|
72
|
+
provider: args.judgeProvider,
|
|
73
|
+
model: args.judgeModel,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
console.log(`${colors.cyan}Agent:${colors.reset} ${colors.bright}${args.agent}${colors.reset}`);
|
|
77
|
+
console.log(`${colors.cyan}Judge:${colors.reset} ${args.judgeType}`);
|
|
78
|
+
console.log(`${colors.cyan}Working directory:${colors.reset} ${cwd}`);
|
|
79
|
+
console.log(`${colors.cyan}Test file:${colors.reset} ${args.tests}`);
|
|
80
|
+
console.log(`${colors.cyan}Timeout:${colors.reset} ${args.timeout}s per test`);
|
|
81
|
+
console.log(`${colors.cyan}Parallelism:${colors.reset} ${args.parallel}`);
|
|
82
|
+
console.log('');
|
|
83
|
+
// Create judge based on type
|
|
84
|
+
let judgeEvaluator;
|
|
85
|
+
if (args.judgeType === 'embedding') {
|
|
86
|
+
const judge = new EmbeddingJudge({ passThreshold: 0.6 });
|
|
87
|
+
judgeEvaluator = judge.createEvaluator();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const judge = new Judge({
|
|
91
|
+
provider: args.judgeProvider,
|
|
92
|
+
model: args.judgeModel,
|
|
93
|
+
passThreshold: 0.7,
|
|
94
|
+
});
|
|
95
|
+
judgeEvaluator = judge.createEvaluator();
|
|
96
|
+
}
|
|
97
|
+
// Run evaluation
|
|
98
|
+
const progress = createProgressCallback(args.parallel > 1 || args.format === 'console');
|
|
99
|
+
try {
|
|
100
|
+
const results = await runEvaluation(config, judgeEvaluator, progress);
|
|
101
|
+
// Report results
|
|
102
|
+
const reporter = new Reporter({
|
|
103
|
+
format: args.format,
|
|
104
|
+
outputPath: args.output,
|
|
105
|
+
});
|
|
106
|
+
await reporter.reportAndSave(results);
|
|
107
|
+
// Exit with appropriate code
|
|
108
|
+
process.exit(results.summary.failed > 0 ? 1 : 0);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error(`Evaluation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
// Provide more context for common errors
|
|
113
|
+
if (error instanceof Error) {
|
|
114
|
+
if (error.message.includes('ENOENT')) {
|
|
115
|
+
console.error(`Make sure the ${args.agent} CLI is installed and in your PATH.`);
|
|
116
|
+
}
|
|
117
|
+
if (error.message.includes('ANTHROPIC_API_KEY') || error.message.includes('OPENAI_API_KEY')) {
|
|
118
|
+
console.error('Set the appropriate API key environment variable for the LLM judge.');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Run main
|
|
125
|
+
main(process.argv.slice(2)).catch((err) => {
|
|
126
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
127
|
+
process.exit(1);
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reporter for formatting and outputting evaluation results.
|
|
3
|
+
*
|
|
4
|
+
* Supports multiple output formats:
|
|
5
|
+
* - console: Rich text table output to stdout
|
|
6
|
+
* - json: Machine-readable JSON output
|
|
7
|
+
* - html: Rich HTML report with styling
|
|
8
|
+
*
|
|
9
|
+
* @module reporter
|
|
10
|
+
*/
|
|
11
|
+
import type { EvalResults } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Output format options.
|
|
14
|
+
*/
|
|
15
|
+
export type OutputFormat = 'console' | 'json' | 'html';
|
|
16
|
+
/**
|
|
17
|
+
* Reporter configuration.
|
|
18
|
+
*/
|
|
19
|
+
export interface ReporterConfig {
|
|
20
|
+
/** Output format */
|
|
21
|
+
format: OutputFormat;
|
|
22
|
+
/** Output file path (optional, defaults to stdout) */
|
|
23
|
+
outputPath?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Reporter class for formatting evaluation results.
|
|
27
|
+
*/
|
|
28
|
+
export declare class Reporter {
|
|
29
|
+
private _config;
|
|
30
|
+
constructor(config: ReporterConfig);
|
|
31
|
+
/**
|
|
32
|
+
* Format results as a console table.
|
|
33
|
+
*
|
|
34
|
+
* @param results - Evaluation results
|
|
35
|
+
* @returns Formatted string for console output
|
|
36
|
+
*/
|
|
37
|
+
private formatConsole;
|
|
38
|
+
/**
|
|
39
|
+
* Format results as JSON.
|
|
40
|
+
*
|
|
41
|
+
* @param results - Evaluation results
|
|
42
|
+
* @returns JSON string
|
|
43
|
+
*/
|
|
44
|
+
private formatJson;
|
|
45
|
+
/**
|
|
46
|
+
* Format results as HTML.
|
|
47
|
+
*
|
|
48
|
+
* @param results - Evaluation results
|
|
49
|
+
* @returns HTML string
|
|
50
|
+
*/
|
|
51
|
+
private formatHtml;
|
|
52
|
+
/**
|
|
53
|
+
* Report evaluation results.
|
|
54
|
+
*
|
|
55
|
+
* @param results - Evaluation results
|
|
56
|
+
* @returns The formatted output string
|
|
57
|
+
*/
|
|
58
|
+
report(results: EvalResults): string;
|
|
59
|
+
/**
|
|
60
|
+
* Report results and optionally write to file.
|
|
61
|
+
*
|
|
62
|
+
* @param results - Evaluation results
|
|
63
|
+
*/
|
|
64
|
+
reportAndSave(results: EvalResults): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Get the reporter configuration.
|
|
67
|
+
*/
|
|
68
|
+
get config(): ReporterConfig;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Quick report function.
|
|
72
|
+
*
|
|
73
|
+
* @param results - Evaluation results
|
|
74
|
+
* @param format - Output format
|
|
75
|
+
* @returns Formatted string
|
|
76
|
+
*/
|
|
77
|
+
export declare function formatResults(results: EvalResults, format: OutputFormat): string;
|
|
78
|
+
/**
|
|
79
|
+
* Report and save results.
|
|
80
|
+
*
|
|
81
|
+
* @param results - Evaluation results
|
|
82
|
+
* @param format - Output format
|
|
83
|
+
* @param outputPath - Optional output file path
|
|
84
|
+
*/
|
|
85
|
+
export declare function reportResults(results: EvalResults, format: OutputFormat, outputPath?: string): Promise<void>;
|
|
86
|
+
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,MAAM,EAAE,YAAY,CAAC;IAErB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgDD;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAiB;gBAEpB,MAAM,EAAE,cAAc;IAIlC;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IA8ErB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAIlB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAkKlB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAepC;;;;OAIG;IACG,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAexD;;OAEG;IACH,IAAI,MAAM,IAAI,cAAc,CAE3B;CACF;AAcD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAGhF;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reporter for formatting and outputting evaluation results.
|
|
3
|
+
*
|
|
4
|
+
* Supports multiple output formats:
|
|
5
|
+
* - console: Rich text table output to stdout
|
|
6
|
+
* - json: Machine-readable JSON output
|
|
7
|
+
* - html: Rich HTML report with styling
|
|
8
|
+
*
|
|
9
|
+
* @module reporter
|
|
10
|
+
*/
|
|
11
|
+
import { writeFile } from 'node:fs/promises';
|
|
12
|
+
/**
|
|
13
|
+
* Format duration in milliseconds to human-readable string.
|
|
14
|
+
*/
|
|
15
|
+
function formatDuration(ms) {
|
|
16
|
+
if (ms < 1000) {
|
|
17
|
+
return `${ms}ms`;
|
|
18
|
+
}
|
|
19
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Truncate string to max length with ellipsis.
|
|
23
|
+
*/
|
|
24
|
+
function truncate(str, maxLength) {
|
|
25
|
+
if (str.length <= maxLength) {
|
|
26
|
+
return str;
|
|
27
|
+
}
|
|
28
|
+
return str.slice(0, maxLength - 3) + '...';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Format test result for console output.
|
|
32
|
+
*/
|
|
33
|
+
function formatResultForConsole(result, maxWidth) {
|
|
34
|
+
const status = result.passed ? 'PASS' : 'FAIL';
|
|
35
|
+
const score = `${(result.judgeScore * 100).toFixed(0)}%`;
|
|
36
|
+
const duration = formatDuration(result.durationMs);
|
|
37
|
+
const id = truncate(result.testId, 20);
|
|
38
|
+
return ` ${status.padEnd(4)} | ${id.padEnd(20)} | ${score.padEnd(4)} | ${duration}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* ANSI color codes for console output.
|
|
42
|
+
*/
|
|
43
|
+
const colors = {
|
|
44
|
+
reset: '\x1b[0m',
|
|
45
|
+
bright: '\x1b[1m',
|
|
46
|
+
dim: '\x1b[2m',
|
|
47
|
+
green: '\x1b[32m',
|
|
48
|
+
red: '\x1b[31m',
|
|
49
|
+
yellow: '\x1b[33m',
|
|
50
|
+
blue: '\x1b[34m',
|
|
51
|
+
cyan: '\x1b[36m',
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Reporter class for formatting evaluation results.
|
|
55
|
+
*/
|
|
56
|
+
export class Reporter {
|
|
57
|
+
_config;
|
|
58
|
+
constructor(config) {
|
|
59
|
+
this._config = config;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Format results as a console table.
|
|
63
|
+
*
|
|
64
|
+
* @param results - Evaluation results
|
|
65
|
+
* @returns Formatted string for console output
|
|
66
|
+
*/
|
|
67
|
+
formatConsole(results) {
|
|
68
|
+
const lines = [];
|
|
69
|
+
// Header
|
|
70
|
+
lines.push('');
|
|
71
|
+
lines.push(`${colors.bright}Evaluation Results${colors.reset}`);
|
|
72
|
+
lines.push(`${colors.dim}${'='.repeat(60)}${colors.reset}`);
|
|
73
|
+
lines.push('');
|
|
74
|
+
// Suite info
|
|
75
|
+
lines.push(`${colors.cyan}Suite:${colors.reset} ${results.suite.name}`);
|
|
76
|
+
if (results.suite.description) {
|
|
77
|
+
lines.push(`${colors.cyan}Description:${colors.reset} ${results.suite.description}`);
|
|
78
|
+
}
|
|
79
|
+
lines.push(`${colors.cyan}Agent:${colors.reset} ${results.agent}`);
|
|
80
|
+
lines.push(`${colors.cyan}Timestamp:${colors.reset} ${new Date(results.timestamp).toLocaleString()}`);
|
|
81
|
+
lines.push('');
|
|
82
|
+
// Summary
|
|
83
|
+
const { summary } = results;
|
|
84
|
+
const statusColor = summary.failed === 0 ? colors.green : colors.red;
|
|
85
|
+
lines.push(`${colors.bright}Summary:${colors.reset}`);
|
|
86
|
+
lines.push(` ${colors.cyan}Total:${colors.reset} ${summary.total}`);
|
|
87
|
+
lines.push(` ${colors.green}Passed:${colors.reset} ${summary.passed}`);
|
|
88
|
+
lines.push(` ${colors.red}Failed:${colors.reset} ${summary.failed}`);
|
|
89
|
+
lines.push(` ${colors.yellow}Avg Score:${colors.reset} ${(summary.avgScore * 100).toFixed(1)}%`);
|
|
90
|
+
lines.push(` ${colors.dim}Duration:${colors.reset} ${formatDuration(summary.totalDurationMs)}`);
|
|
91
|
+
lines.push('');
|
|
92
|
+
// Test results table
|
|
93
|
+
lines.push(`${colors.bright}Test Results:${colors.reset}`);
|
|
94
|
+
lines.push(` ${colors.dim}Status | ID | Score | Duration${colors.reset}`);
|
|
95
|
+
lines.push(` ${colors.dim}${'-'.repeat(55)}${colors.reset}`);
|
|
96
|
+
const failedResults = [];
|
|
97
|
+
for (const result of results.results) {
|
|
98
|
+
const color = result.passed ? colors.green : colors.red;
|
|
99
|
+
lines.push(`${color}${formatResultForConsole(result, 80)}${colors.reset}`);
|
|
100
|
+
if (!result.passed) {
|
|
101
|
+
failedResults.push(result);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
lines.push('');
|
|
105
|
+
// Show details for failed tests
|
|
106
|
+
if (failedResults.length > 0) {
|
|
107
|
+
lines.push(`${colors.bright}Failed Test Details:${colors.reset}`);
|
|
108
|
+
lines.push(`${colors.dim}${'='.repeat(60)}${colors.reset}`);
|
|
109
|
+
for (const result of failedResults) {
|
|
110
|
+
lines.push('');
|
|
111
|
+
lines.push(`${colors.red}${colors.bright}Test: ${result.testId}${colors.reset}`);
|
|
112
|
+
lines.push(`${colors.dim}Input:${colors.reset} ${result.input}`);
|
|
113
|
+
lines.push(`${colors.yellow}Expected:${colors.reset} ${result.expectedOutput}`);
|
|
114
|
+
lines.push(`${colors.cyan}Actual:${colors.reset} ${result.actualOutput}`);
|
|
115
|
+
if (result.judgeReasoning) {
|
|
116
|
+
lines.push(`${colors.dim}Reasoning: ${result.judgeReasoning}${colors.reset}`);
|
|
117
|
+
}
|
|
118
|
+
lines.push(`${colors.dim}${'-'.repeat(40)}${colors.reset}`);
|
|
119
|
+
}
|
|
120
|
+
lines.push('');
|
|
121
|
+
}
|
|
122
|
+
// Footer
|
|
123
|
+
if (summary.failed > 0) {
|
|
124
|
+
lines.push(`${colors.yellow}Some tests failed. Review the results above.${colors.reset}`);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
lines.push(`${colors.green}All tests passed!${colors.reset}`);
|
|
128
|
+
}
|
|
129
|
+
lines.push('');
|
|
130
|
+
return lines.join('\n');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Format results as JSON.
|
|
134
|
+
*
|
|
135
|
+
* @param results - Evaluation results
|
|
136
|
+
* @returns JSON string
|
|
137
|
+
*/
|
|
138
|
+
formatJson(results) {
|
|
139
|
+
return JSON.stringify(results, null, 2);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Format results as HTML.
|
|
143
|
+
*
|
|
144
|
+
* @param results - Evaluation results
|
|
145
|
+
* @returns HTML string
|
|
146
|
+
*/
|
|
147
|
+
formatHtml(results) {
|
|
148
|
+
const { summary } = results;
|
|
149
|
+
const allPassed = summary.failed === 0;
|
|
150
|
+
const testRows = results.results.map(result => `
|
|
151
|
+
<tr class="${result.passed ? 'passed' : 'failed'}">
|
|
152
|
+
<td class="status">${result.passed ? 'PASS' : 'FAIL'}</td>
|
|
153
|
+
<td class="id">${escapeHtml(result.testId)}</td>
|
|
154
|
+
<td class="score">${(result.judgeScore * 100).toFixed(0)}%</td>
|
|
155
|
+
<td class="duration">${formatDuration(result.durationMs)}</td>
|
|
156
|
+
<td class="reasoning">${escapeHtml(truncate(result.judgeReasoning, 100))}</td>
|
|
157
|
+
</tr>
|
|
158
|
+
`).join('\n');
|
|
159
|
+
return `<!DOCTYPE html>
|
|
160
|
+
<html lang="en">
|
|
161
|
+
<head>
|
|
162
|
+
<meta charset="UTF-8">
|
|
163
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
164
|
+
<title>Eval Results: ${escapeHtml(results.suite.name)}</title>
|
|
165
|
+
<style>
|
|
166
|
+
* { box-sizing: border-box; }
|
|
167
|
+
body {
|
|
168
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
169
|
+
line-height: 1.6;
|
|
170
|
+
max-width: 1200px;
|
|
171
|
+
margin: 0 auto;
|
|
172
|
+
padding: 2rem;
|
|
173
|
+
background: #f5f5f5;
|
|
174
|
+
}
|
|
175
|
+
.container {
|
|
176
|
+
background: white;
|
|
177
|
+
border-radius: 8px;
|
|
178
|
+
padding: 2rem;
|
|
179
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
180
|
+
}
|
|
181
|
+
h1 { margin-top: 0; color: #333; }
|
|
182
|
+
h2 { color: #555; border-bottom: 2px solid #eee; padding-bottom: 0.5rem; }
|
|
183
|
+
.meta {
|
|
184
|
+
display: grid;
|
|
185
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
186
|
+
gap: 1rem;
|
|
187
|
+
margin-bottom: 2rem;
|
|
188
|
+
}
|
|
189
|
+
.meta-item {
|
|
190
|
+
background: #f8f9fa;
|
|
191
|
+
padding: 1rem;
|
|
192
|
+
border-radius: 4px;
|
|
193
|
+
}
|
|
194
|
+
.meta-label { font-weight: 600; color: #666; font-size: 0.875rem; }
|
|
195
|
+
.meta-value { color: #333; }
|
|
196
|
+
.summary {
|
|
197
|
+
display: grid;
|
|
198
|
+
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
|
|
199
|
+
gap: 1rem;
|
|
200
|
+
margin: 2rem 0;
|
|
201
|
+
}
|
|
202
|
+
.summary-card {
|
|
203
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
204
|
+
color: white;
|
|
205
|
+
padding: 1.5rem;
|
|
206
|
+
border-radius: 8px;
|
|
207
|
+
text-align: center;
|
|
208
|
+
}
|
|
209
|
+
.summary-card.passed { background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%); }
|
|
210
|
+
.summary-card.failed { background: linear-gradient(135deg, #eb3349 0%, #f45c43 100%); }
|
|
211
|
+
.summary-card.warning { background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); }
|
|
212
|
+
.summary-value { font-size: 2rem; font-weight: bold; }
|
|
213
|
+
.summary-label { font-size: 0.875rem; opacity: 0.9; }
|
|
214
|
+
table {
|
|
215
|
+
width: 100%;
|
|
216
|
+
border-collapse: collapse;
|
|
217
|
+
margin-top: 1rem;
|
|
218
|
+
}
|
|
219
|
+
th, td {
|
|
220
|
+
padding: 0.75rem;
|
|
221
|
+
text-align: left;
|
|
222
|
+
border-bottom: 1px solid #eee;
|
|
223
|
+
}
|
|
224
|
+
th {
|
|
225
|
+
font-weight: 600;
|
|
226
|
+
color: #555;
|
|
227
|
+
background: #f8f9fa;
|
|
228
|
+
}
|
|
229
|
+
tr.passed .status { color: #11998e; font-weight: 600; }
|
|
230
|
+
tr.failed .status { color: #eb3349; font-weight: 600; }
|
|
231
|
+
.footer {
|
|
232
|
+
margin-top: 2rem;
|
|
233
|
+
padding-top: 1rem;
|
|
234
|
+
border-top: 1px solid #eee;
|
|
235
|
+
text-align: center;
|
|
236
|
+
color: #666;
|
|
237
|
+
}
|
|
238
|
+
</style>
|
|
239
|
+
</head>
|
|
240
|
+
<body>
|
|
241
|
+
<div class="container">
|
|
242
|
+
<h1>Evaluation Results</h1>
|
|
243
|
+
|
|
244
|
+
<div class="meta">
|
|
245
|
+
<div class="meta-item">
|
|
246
|
+
<div class="meta-label">Suite</div>
|
|
247
|
+
<div class="meta-value">${escapeHtml(results.suite.name)}</div>
|
|
248
|
+
</div>
|
|
249
|
+
<div class="meta-item">
|
|
250
|
+
<div class="meta-label">Agent</div>
|
|
251
|
+
<div class="meta-value">${escapeHtml(results.agent)}</div>
|
|
252
|
+
</div>
|
|
253
|
+
<div class="meta-item">
|
|
254
|
+
<div class="meta-label">Timestamp</div>
|
|
255
|
+
<div class="meta-value">${new Date(results.timestamp).toLocaleString()}</div>
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
|
|
259
|
+
<h2>Summary</h2>
|
|
260
|
+
<div class="summary">
|
|
261
|
+
<div class="summary-card">
|
|
262
|
+
<div class="summary-value">${summary.total}</div>
|
|
263
|
+
<div class="summary-label">Total Tests</div>
|
|
264
|
+
</div>
|
|
265
|
+
<div class="summary-card ${summary.passed === summary.total ? 'passed' : summary.passed === 0 ? 'failed' : 'warning'}">
|
|
266
|
+
<div class="summary-value">${summary.passed}</div>
|
|
267
|
+
<div class="summary-label">Passed</div>
|
|
268
|
+
</div>
|
|
269
|
+
<div class="summary-card ${summary.failed === 0 ? 'passed' : 'failed'}">
|
|
270
|
+
<div class="summary-value">${summary.failed}</div>
|
|
271
|
+
<div class="summary-label">Failed</div>
|
|
272
|
+
</div>
|
|
273
|
+
<div class="summary-card">
|
|
274
|
+
<div class="summary-value">${(summary.avgScore * 100).toFixed(1)}%</div>
|
|
275
|
+
<div class="summary-label">Avg Score</div>
|
|
276
|
+
</div>
|
|
277
|
+
<div class="summary-card">
|
|
278
|
+
<div class="summary-value">${formatDuration(summary.totalDurationMs)}</div>
|
|
279
|
+
<div class="summary-label">Duration</div>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
|
|
283
|
+
<h2>Test Results</h2>
|
|
284
|
+
<table>
|
|
285
|
+
<thead>
|
|
286
|
+
<tr>
|
|
287
|
+
<th>Status</th>
|
|
288
|
+
<th>ID</th>
|
|
289
|
+
<th>Score</th>
|
|
290
|
+
<th>Duration</th>
|
|
291
|
+
<th>Reasoning</th>
|
|
292
|
+
</tr>
|
|
293
|
+
</thead>
|
|
294
|
+
<tbody>
|
|
295
|
+
${testRows}
|
|
296
|
+
</tbody>
|
|
297
|
+
</table>
|
|
298
|
+
|
|
299
|
+
<div class="footer">
|
|
300
|
+
<p>Generated by genesys-eval</p>
|
|
301
|
+
</div>
|
|
302
|
+
</div>
|
|
303
|
+
</body>
|
|
304
|
+
</html>`;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Report evaluation results.
|
|
308
|
+
*
|
|
309
|
+
* @param results - Evaluation results
|
|
310
|
+
* @returns The formatted output string
|
|
311
|
+
*/
|
|
312
|
+
report(results) {
|
|
313
|
+
switch (this._config.format) {
|
|
314
|
+
case 'json': {
|
|
315
|
+
return this.formatJson(results);
|
|
316
|
+
}
|
|
317
|
+
case 'html': {
|
|
318
|
+
return this.formatHtml(results);
|
|
319
|
+
}
|
|
320
|
+
case 'console':
|
|
321
|
+
default: {
|
|
322
|
+
return this.formatConsole(results);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Report results and optionally write to file.
|
|
328
|
+
*
|
|
329
|
+
* @param results - Evaluation results
|
|
330
|
+
*/
|
|
331
|
+
async reportAndSave(results) {
|
|
332
|
+
const output = this.report(results);
|
|
333
|
+
if (this._config.outputPath) {
|
|
334
|
+
await writeFile(this._config.outputPath, output, 'utf-8');
|
|
335
|
+
}
|
|
336
|
+
// Always print to console if format is console, or if no output file
|
|
337
|
+
if (this._config.format === 'console' || !this._config.outputPath) {
|
|
338
|
+
console.log(output);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
console.log(`Results written to: ${this._config.outputPath}`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get the reporter configuration.
|
|
346
|
+
*/
|
|
347
|
+
get config() {
|
|
348
|
+
return this._config;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Escape HTML special characters.
|
|
353
|
+
*/
|
|
354
|
+
function escapeHtml(text) {
|
|
355
|
+
return text
|
|
356
|
+
.replace(/&/g, '&')
|
|
357
|
+
.replace(/</g, '<')
|
|
358
|
+
.replace(/>/g, '>')
|
|
359
|
+
.replace(/"/g, '"')
|
|
360
|
+
.replace(/'/g, ''');
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Quick report function.
|
|
364
|
+
*
|
|
365
|
+
* @param results - Evaluation results
|
|
366
|
+
* @param format - Output format
|
|
367
|
+
* @returns Formatted string
|
|
368
|
+
*/
|
|
369
|
+
export function formatResults(results, format) {
|
|
370
|
+
const reporter = new Reporter({ format });
|
|
371
|
+
return reporter.report(results);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Report and save results.
|
|
375
|
+
*
|
|
376
|
+
* @param results - Evaluation results
|
|
377
|
+
* @param format - Output format
|
|
378
|
+
* @param outputPath - Optional output file path
|
|
379
|
+
*/
|
|
380
|
+
export async function reportResults(results, format, outputPath) {
|
|
381
|
+
const reporter = new Reporter({ format, outputPath });
|
|
382
|
+
await reporter.reportAndSave(results);
|
|
383
|
+
}
|
|
384
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/reporter.ts"],"names":[],"mappings":"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"}
|