Quick reference for exporting batch evaluation results.
The batch evaluation system supports two export formats:
| Format | Use Case | Features |
|---|---|---|
| CSV | Spreadsheet analysis, data science | Flattened structure, easy to import |
| JSON | API integration, data pipelines | Preserves structure, metadata support |
await batchEvaluator.export({
format: "csv",
destination: "./results.csv",
});Output:
rowId,rowIndex,candidateText,evaluatorName,score,success,feedback
1,0,"Hello world","quality",8.5,true,"Good quality text"
2,1,"Test","quality",6.0,true,"Acceptable quality"await batchEvaluator.export({
format: "csv",
destination: "./results.csv",
csvOptions: {
flattenResults: true, // Flatten evaluator results into columns
includeHeaders: true, // Include header row
delimiter: ",", // Use comma delimiter (or ";" for semicolon)
},
});When using multiple evaluators with flattenResults: true:
const result = await batchEvaluator.export({
format: "csv",
destination: "./multi-eval-results.csv",
csvOptions: {
flattenResults: true,
},
});Output:
rowId,eval1_evaluatorName,eval1_score,eval1_feedback,eval2_evaluatorName,eval2_score,eval2_feedback
1,"quality",8.5,"Good","tone",7.0,"Neutral tone"Keep results as JSON string in a single column:
await batchEvaluator.export({
format: "csv",
destination: "./results.csv",
csvOptions: {
flattenResults: false, // Keep results as JSON string
},
});Output:
rowId,rowIndex,candidateText,results
1,0,"Hello",[{"evaluatorName":"quality","score":8.5}]await batchEvaluator.export({
format: "json",
destination: "./results.json",
});Output:
[
{
"rowId": "1",
"rowIndex": 0,
"input": {
"candidateText": "Hello world"
},
"results": [
{
"evaluatorName": "quality",
"score": 8.5,
"feedback": "Good quality text",
"success": true
}
],
"timestamp": "2025-01-01T12:00:00Z",
"durationMs": 1234
}
]await batchEvaluator.export({
format: "json",
destination: "./results.json",
jsonOptions: {
pretty: true, // Format with indentation
},
});await batchEvaluator.export({
format: "json",
destination: "./results.json",
jsonOptions: {
pretty: true,
includeMetadata: true, // Add summary metadata
},
});Output:
{
"metadata": {
"exportedAt": "2025-01-01T12:00:00Z",
"totalResults": 100,
"successfulResults": 95,
"failedResults": 5
},
"results": [
{ "rowId": "1", "..." },
{ "rowId": "2", "..." }
]
}Use the onResult callback to handle results as they complete. This is more flexible than file-based export and works well for integrations.
const batchEvaluator = new BatchEvaluator({
evaluators: [myEvaluator],
concurrency: 5,
onResult: (result) => {
console.log(`Row ${result.rowId}: score ${result.results[0]?.score}`);
},
});
await batchEvaluator.evaluate({
filePath: "./inputs.csv",
});For fault tolerance, write each result to a file as it completes:
import { appendFileSync } from "fs";
const batchEvaluator = new BatchEvaluator({
evaluators: [myEvaluator],
concurrency: 5,
onResult: (result) => {
// Write each result as a JSON line
appendFileSync("./results.jsonl", JSON.stringify(result) + "\n");
},
});
await batchEvaluator.evaluate({
filePath: "./inputs.csv",
});const batchEvaluator = new BatchEvaluator({
evaluators: [myEvaluator],
concurrency: 5,
onResult: async (result) => {
await fetch("https://api.example.com/results", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${process.env.API_TOKEN}`,
},
body: JSON.stringify(result),
});
},
});
await batchEvaluator.evaluate({
filePath: "./inputs.csv",
});| Approach | Use Case |
|---|---|
onResult callback |
Real-time processing, webhooks, database writes, alerting |
export() method |
End-of-batch file export, CSV for spreadsheets, JSON for archives |
You can use both together: onResult for real-time needs, then export() for a clean final file.
Export only results matching a condition:
// Export only failed evaluations
await batchEvaluator.export({
format: "csv",
destination: "./failed-only.csv",
filterCondition: (result) => result.error !== undefined,
});
// Export only high scores
await batchEvaluator.export({
format: "json",
destination: "./high-scores.json",
filterCondition: (result) => {
const score = result.results[0]?.score;
return typeof score === "number" && score >= 8;
},
});
// Export only specific evaluations
await batchEvaluator.export({
format: "csv",
destination: "./quality-only.csv",
filterCondition: (result) => {
return result.results.some(r => r.evaluatorName === "quality");
},
});Export only certain fields:
await batchEvaluator.export({
format: "json",
destination: "./scores-only.json",
includeFields: ["rowId", "rowIndex", "results"],
jsonOptions: {
pretty: true,
},
});Output:
[
{
"rowId": "1",
"rowIndex": 0,
"results": [...]
}
]Export everything except certain fields:
await batchEvaluator.export({
format: "json",
destination: "./no-input-data.json",
excludeFields: ["input"], // Don't include input data
});await batchEvaluator.export({
format: "csv",
destination: "./failed-summaries.csv",
// Only failed evaluations
filterCondition: (result) => result.error !== undefined,
// Only these fields
includeFields: ["rowId", "error", "retryCount", "durationMs"],
});You can export the same results to multiple destinations:
const result = await batchEvaluator.evaluate({
filePath: "./inputs.csv",
});
// Export to CSV for analysis
await batchEvaluator.export({
format: "csv",
destination: "./analysis.csv",
csvOptions: { flattenResults: true },
});
// Export to JSON for archiving
await batchEvaluator.export({
format: "json",
destination: "./archive.json",
jsonOptions: { pretty: true, includeMetadata: true },
});
// Send failures to webhook
await batchEvaluator.export({
format: "webhook",
destination: "https://alerts.example.com/failures",
filterCondition: (result) => result.error !== undefined,
});const result = await batchEvaluator.evaluate({
filePath: "./customer-feedback.csv",
});
// Export for data science team (CSV with all details)
await batchEvaluator.export({
format: "csv",
destination: "./analysis-full.csv",
csvOptions: { flattenResults: true },
});
// Export summary for management (JSON with high-level stats)
await batchEvaluator.export({
format: "json",
destination: "./summary.json",
jsonOptions: { includeMetadata: true },
includeFields: ["rowId", "results"],
});const batchEvaluator = new BatchEvaluator({
evaluators: [sentimentEvaluator],
concurrency: 10,
// Send negative sentiment alerts in real-time
onResult: async (result) => {
const score = result.results[0]?.score;
if (score === "NEGATIVE") {
await fetch("https://alerts.example.com/negative", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(result),
});
}
},
});
const result = await batchEvaluator.evaluate({
filePath: "./social-media-posts.json",
});
// Export full results after completion
await batchEvaluator.export({
format: "csv",
destination: "./sentiment-results.csv",
});const result = await batchEvaluator.evaluate({
filePath: "./ab-test-data.csv",
});
// Export variant A results
await batchEvaluator.export({
format: "csv",
destination: "./variant-a-results.csv",
filterCondition: (result) => result.input.variant === "A",
});
// Export variant B results
await batchEvaluator.export({
format: "csv",
destination: "./variant-b-results.csv",
filterCondition: (result) => result.input.variant === "B",
});- Use onResult for large batches to write results incrementally and preserve progress
- Filter early with
filterConditionto reduce export size - Use includeFields to reduce file size for large exports
- Test with small batches before running large exports
Large CSV files slow to open:
- Use
includeFieldsto export only necessary columns - Disable
flattenResultsif you don't need flattened structure
JSON too large:
- Use
filterConditionto export only relevant results - Use
includeFieldsto reduce payload size - Consider exporting to multiple files
Missing rows in incremental output:
- Check for errors in
onProgressevents - Verify disk space available
- Make sure
onResultisn't throwing errors