judgeval 0.1.33
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.md +202 -0
- package/README.md +340 -0
- package/dist/clients.d.ts +7 -0
- package/dist/clients.js +78 -0
- package/dist/clients.js.map +1 -0
- package/dist/common/integrations/langgraph.d.ts +40 -0
- package/dist/common/integrations/langgraph.js +444 -0
- package/dist/common/integrations/langgraph.js.map +1 -0
- package/dist/common/logger-instance.d.ts +3 -0
- package/dist/common/logger-instance.js +64 -0
- package/dist/common/logger-instance.js.map +1 -0
- package/dist/common/logger.d.ts +54 -0
- package/dist/common/logger.js +221 -0
- package/dist/common/logger.js.map +1 -0
- package/dist/common/tracer.d.ts +205 -0
- package/dist/common/tracer.js +1035 -0
- package/dist/common/tracer.js.map +1 -0
- package/dist/constants.d.ts +51 -0
- package/dist/constants.js +344 -0
- package/dist/constants.js.map +1 -0
- package/dist/data/example.d.ts +70 -0
- package/dist/data/example.js +125 -0
- package/dist/data/example.js.map +1 -0
- package/dist/data/result.d.ts +51 -0
- package/dist/data/result.js +83 -0
- package/dist/data/result.js.map +1 -0
- package/dist/evaluation-run.d.ts +44 -0
- package/dist/evaluation-run.js +136 -0
- package/dist/evaluation-run.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/judgment-client.d.ts +179 -0
- package/dist/judgment-client.js +1038 -0
- package/dist/judgment-client.js.map +1 -0
- package/dist/rules.d.ts +120 -0
- package/dist/rules.js +322 -0
- package/dist/rules.js.map +1 -0
- package/dist/run-evaluation.d.ts +78 -0
- package/dist/run-evaluation.js +618 -0
- package/dist/run-evaluation.js.map +1 -0
- package/dist/scorers/api-scorer.d.ts +79 -0
- package/dist/scorers/api-scorer.js +291 -0
- package/dist/scorers/api-scorer.js.map +1 -0
- package/dist/scorers/base-scorer.d.ts +100 -0
- package/dist/scorers/base-scorer.js +190 -0
- package/dist/scorers/base-scorer.js.map +1 -0
- package/dist/scorers/exact-match-scorer.d.ts +10 -0
- package/dist/scorers/exact-match-scorer.js +84 -0
- package/dist/scorers/exact-match-scorer.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.assertTest = exports.runEval = exports.checkExamples = exports.checkMissingScorerData = exports.mergeResults = exports.logEvaluationResults = exports.hasLoggedUrl = exports.checkEvalRunNameExists = exports.executeApiEval = exports.pollEvaluationStatus = exports.checkEvaluationStatus = exports.sendToRabbitMQ = exports.validateApiResponse = exports.JudgmentAPIError = void 0;
|
|
16
|
+
const axios_1 = __importDefault(require("axios"));
|
|
17
|
+
const result_1 = require("./data/result");
|
|
18
|
+
const base_scorer_1 = require("./scorers/base-scorer");
|
|
19
|
+
const constants_1 = require("./constants");
|
|
20
|
+
const logger_1 = require("./common/logger");
|
|
21
|
+
/**
|
|
22
|
+
* Custom error for Judgment API errors
|
|
23
|
+
*/
|
|
24
|
+
class JudgmentAPIError extends Error {
|
|
25
|
+
constructor(message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = 'JudgmentAPIError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.JudgmentAPIError = JudgmentAPIError;
|
|
31
|
+
/**
|
|
32
|
+
* Validates an API response to ensure it has the expected format
|
|
33
|
+
* Throws a JudgmentAPIError if the response is invalid
|
|
34
|
+
*/
|
|
35
|
+
function validateApiResponse(response) {
|
|
36
|
+
if (!response || typeof response !== 'object') {
|
|
37
|
+
throw new JudgmentAPIError('Invalid API response format: response is not an object');
|
|
38
|
+
}
|
|
39
|
+
if (response.error) {
|
|
40
|
+
throw new JudgmentAPIError(`API error: ${response.error}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.validateApiResponse = validateApiResponse;
|
|
44
|
+
/**
|
|
45
|
+
* Sends an evaluation run to the RabbitMQ evaluation queue
|
|
46
|
+
*/
|
|
47
|
+
function sendToRabbitMQ(evaluationRun) {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
const payload = evaluationRun.toJSON();
|
|
50
|
+
try {
|
|
51
|
+
const response = yield axios_1.default.post(constants_1.JUDGMENT_ADD_TO_RUN_EVAL_QUEUE_API_URL, payload, {
|
|
52
|
+
headers: {
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
'Authorization': `Bearer ${evaluationRun.judgmentApiKey}`,
|
|
55
|
+
'X-Organization-Id': evaluationRun.organizationId
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return response.data;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (axios_1.default.isAxiosError(error) && error.response) {
|
|
62
|
+
throw new JudgmentAPIError(`Error sending to RabbitMQ: ${error.response.data.detail || error.message}`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new JudgmentAPIError(`Error sending to RabbitMQ: ${(error === null || error === void 0 ? void 0 : error.message) || String(error)}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
exports.sendToRabbitMQ = sendToRabbitMQ;
|
|
71
|
+
/**
|
|
72
|
+
* Checks the status of an async evaluation
|
|
73
|
+
* @param evaluationRun The evaluation run to check
|
|
74
|
+
* @returns The status of the evaluation
|
|
75
|
+
*/
|
|
76
|
+
function checkEvaluationStatus(evaluationRun) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
try {
|
|
79
|
+
const response = yield axios_1.default.post(`${constants_1.ROOT_API}/check-eval-status/`, {
|
|
80
|
+
eval_name: evaluationRun.evalName,
|
|
81
|
+
project_name: evaluationRun.projectName,
|
|
82
|
+
judgment_api_key: evaluationRun.judgmentApiKey,
|
|
83
|
+
}, {
|
|
84
|
+
headers: {
|
|
85
|
+
'Content-Type': 'application/json',
|
|
86
|
+
'Authorization': `Bearer ${evaluationRun.judgmentApiKey}`,
|
|
87
|
+
'X-Organization-Id': evaluationRun.organizationId
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return response.data;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (axios_1.default.isAxiosError(error) && error.response) {
|
|
94
|
+
throw new JudgmentAPIError(`Error checking evaluation status: ${error.response.data.detail || error.message}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
throw new JudgmentAPIError(`Error checking evaluation status: ${(error === null || error === void 0 ? void 0 : error.message) || String(error)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
exports.checkEvaluationStatus = checkEvaluationStatus;
|
|
103
|
+
/**
|
|
104
|
+
* Polls the status of an async evaluation until it's complete
|
|
105
|
+
* @param evaluationRun The evaluation run to poll
|
|
106
|
+
* @param intervalMs The interval between polls in milliseconds
|
|
107
|
+
* @param maxAttempts The maximum number of polling attempts
|
|
108
|
+
* @param onProgress Optional callback for progress updates
|
|
109
|
+
* @returns The evaluation results
|
|
110
|
+
*/
|
|
111
|
+
function pollEvaluationStatus(evaluationRun_1) {
|
|
112
|
+
return __awaiter(this, arguments, void 0, function* (evaluationRun, intervalMs = 2000, maxAttempts = 300, onProgress) {
|
|
113
|
+
let attempts = 0;
|
|
114
|
+
while (attempts < maxAttempts) {
|
|
115
|
+
try {
|
|
116
|
+
const status = yield checkEvaluationStatus(evaluationRun);
|
|
117
|
+
// Call progress callback if provided
|
|
118
|
+
if (onProgress) {
|
|
119
|
+
onProgress(status);
|
|
120
|
+
}
|
|
121
|
+
// Check if evaluation is complete
|
|
122
|
+
if (status.status === 'complete') {
|
|
123
|
+
(0, logger_1.log)('Async evaluation complete, fetching results');
|
|
124
|
+
// Fetch the results
|
|
125
|
+
const response = yield axios_1.default.post(constants_1.JUDGMENT_EVAL_FETCH_API_URL, {
|
|
126
|
+
eval_name: evaluationRun.evalName,
|
|
127
|
+
project_name: evaluationRun.projectName,
|
|
128
|
+
judgment_api_key: evaluationRun.judgmentApiKey,
|
|
129
|
+
}, {
|
|
130
|
+
headers: {
|
|
131
|
+
'Content-Type': 'application/json',
|
|
132
|
+
'Authorization': `Bearer ${evaluationRun.judgmentApiKey}`,
|
|
133
|
+
'X-Organization-Id': evaluationRun.organizationId
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
// Convert API results to ScoringResult objects
|
|
137
|
+
const results = response.data.map((result) => {
|
|
138
|
+
return new result_1.ScoringResult({
|
|
139
|
+
dataObject: result.data_object,
|
|
140
|
+
scorersData: result.scorers_data || [],
|
|
141
|
+
error: result.error
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
return results;
|
|
145
|
+
}
|
|
146
|
+
else if (status.status === 'failed') {
|
|
147
|
+
throw new JudgmentAPIError(`Async evaluation failed: ${status.error || 'Unknown error'}`);
|
|
148
|
+
}
|
|
149
|
+
// Log progress
|
|
150
|
+
(0, logger_1.log)(`Evaluation status: ${status.status}, progress: ${status.progress || 'unknown'}`);
|
|
151
|
+
// Wait before next poll
|
|
152
|
+
yield new Promise(resolve => setTimeout(resolve, intervalMs));
|
|
153
|
+
attempts++;
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
(0, logger_1.error)(`Error polling evaluation status: ${(error === null || error === void 0 ? void 0 : error.message) || String(error)}`);
|
|
157
|
+
throw new JudgmentAPIError(`Error polling evaluation status: ${(error === null || error === void 0 ? void 0 : error.message) || String(error)}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
throw new JudgmentAPIError(`Evaluation polling timed out after ${maxAttempts} attempts`);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
exports.pollEvaluationStatus = pollEvaluationStatus;
|
|
164
|
+
/**
|
|
165
|
+
* Executes an evaluation of a list of Examples using one or more JudgmentScorers via the Judgment API
|
|
166
|
+
* @param evaluationRun The evaluation run object containing the examples, scorers, and metadata
|
|
167
|
+
* @returns The results of the evaluation
|
|
168
|
+
*/
|
|
169
|
+
function executeApiEval(evaluationRun) {
|
|
170
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
171
|
+
var _a;
|
|
172
|
+
try {
|
|
173
|
+
// Submit API request to execute evals
|
|
174
|
+
const payload = evaluationRun.toJSON();
|
|
175
|
+
const response = yield axios_1.default.post(constants_1.JUDGMENT_EVAL_API_URL, payload, {
|
|
176
|
+
headers: {
|
|
177
|
+
'Content-Type': 'application/json',
|
|
178
|
+
'Authorization': `Bearer ${evaluationRun.judgmentApiKey}`,
|
|
179
|
+
'X-Organization-Id': evaluationRun.organizationId
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
return response.data;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
if (axios_1.default.isAxiosError(error) && error.response) {
|
|
186
|
+
const errorMessage = ((_a = error.response.data) === null || _a === void 0 ? void 0 : _a.detail) || JSON.stringify(error.response.data) || 'An unknown error occurred.';
|
|
187
|
+
(0, logger_1.error)(`Error: ${errorMessage}`);
|
|
188
|
+
throw new JudgmentAPIError(errorMessage);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
(0, logger_1.error)(`Error: ${error}`);
|
|
192
|
+
throw new JudgmentAPIError(`An error occurred while executing the Judgment API request: ${error}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
exports.executeApiEval = executeApiEval;
|
|
198
|
+
/**
|
|
199
|
+
* Checks if an evaluation run name already exists for a given project
|
|
200
|
+
*/
|
|
201
|
+
function checkEvalRunNameExists(evalName, projectName, judgmentApiKey, organizationId) {
|
|
202
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
203
|
+
try {
|
|
204
|
+
const response = yield axios_1.default.post(`${constants_1.ROOT_API}/eval-run-name-exists/`, {
|
|
205
|
+
eval_name: evalName,
|
|
206
|
+
project_name: projectName,
|
|
207
|
+
judgment_api_key: judgmentApiKey,
|
|
208
|
+
}, {
|
|
209
|
+
headers: {
|
|
210
|
+
'Content-Type': 'application/json',
|
|
211
|
+
'Authorization': `Bearer ${judgmentApiKey}`,
|
|
212
|
+
'X-Organization-Id': organizationId
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
// Check if the evaluation run name already exists
|
|
216
|
+
if (response.status === 409) {
|
|
217
|
+
throw new JudgmentAPIError(`Evaluation run name '${evalName}' already exists for project '${projectName}'.`);
|
|
218
|
+
}
|
|
219
|
+
// Check if the response status code is not 2XX
|
|
220
|
+
if (!response.status.toString().startsWith('2')) {
|
|
221
|
+
const responseData = response.data;
|
|
222
|
+
const errorMessage = responseData.detail || 'An unknown error occurred.';
|
|
223
|
+
(0, logger_1.error)(`Error checking eval run name: ${errorMessage}`);
|
|
224
|
+
throw new JudgmentAPIError(errorMessage);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
if (axios_1.default.isAxiosError(error) && error.response) {
|
|
229
|
+
if (error.response.status === 409) {
|
|
230
|
+
throw new JudgmentAPIError(`Evaluation run name '${evalName}' already exists for project '${projectName}'.`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// For connection errors or other issues, log but continue
|
|
234
|
+
(0, logger_1.error)(`Failed to check if eval run name exists: ${(error === null || error === void 0 ? void 0 : error.message) || String(error)}`);
|
|
235
|
+
// Don't throw an error here, just log it and continue
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
exports.checkEvalRunNameExists = checkEvalRunNameExists;
|
|
240
|
+
// Track whether a URL has been printed
|
|
241
|
+
exports.hasLoggedUrl = false;
|
|
242
|
+
/**
|
|
243
|
+
* Logs evaluation results to the Judgment API database.
|
|
244
|
+
* @param results The results to log
|
|
245
|
+
* @param projectName The project name
|
|
246
|
+
* @param evalName The evaluation run name
|
|
247
|
+
* @param apiKey The API key for the Judgment API
|
|
248
|
+
* @param organizationId The organization ID
|
|
249
|
+
* @returns A URL to view the results in the Judgment UI
|
|
250
|
+
*/
|
|
251
|
+
function logEvaluationResults(results_1, projectName_1, evalName_1) {
|
|
252
|
+
return __awaiter(this, arguments, void 0, function* (results, projectName, evalName, apiKey = '', organizationId) {
|
|
253
|
+
var _a;
|
|
254
|
+
try {
|
|
255
|
+
const response = yield axios_1.default.post(constants_1.JUDGMENT_EVAL_LOG_API_URL, {
|
|
256
|
+
results: results.map(result => result.toJSON()),
|
|
257
|
+
project_name: projectName,
|
|
258
|
+
eval_name: evalName,
|
|
259
|
+
}, {
|
|
260
|
+
headers: {
|
|
261
|
+
'Content-Type': 'application/json',
|
|
262
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
263
|
+
'X-Organization-Id': organizationId
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
if (response.status < 200 || response.status >= 300) {
|
|
267
|
+
const responseData = response.data;
|
|
268
|
+
const errorMessage = (responseData === null || responseData === void 0 ? void 0 : responseData.detail) || 'An unknown error occurred.';
|
|
269
|
+
(0, logger_1.error)(`Error ${response.status}: ${errorMessage}`);
|
|
270
|
+
throw new JudgmentAPIError(errorMessage);
|
|
271
|
+
}
|
|
272
|
+
if (response.data && response.data.ui_results_url) {
|
|
273
|
+
const url = response.data.ui_results_url;
|
|
274
|
+
const prettyStr = `\n \n🔍 You can view your evaluation results here: ${url}\n`;
|
|
275
|
+
console.log(prettyStr);
|
|
276
|
+
exports.hasLoggedUrl = true;
|
|
277
|
+
return url;
|
|
278
|
+
}
|
|
279
|
+
return '';
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
if (axios_1.default.isAxiosError(error) && error.response) {
|
|
283
|
+
const errorMessage = ((_a = error.response.data) === null || _a === void 0 ? void 0 : _a.detail) || JSON.stringify(error.response.data) || 'An unknown error occurred.';
|
|
284
|
+
(0, logger_1.error)(`Error: ${errorMessage}`);
|
|
285
|
+
throw new JudgmentAPIError(errorMessage);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
(0, logger_1.error)(`Error: ${error}`);
|
|
289
|
+
throw new JudgmentAPIError(`An error occurred while logging evaluation results: ${error}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
exports.logEvaluationResults = logEvaluationResults;
|
|
295
|
+
/**
|
|
296
|
+
* When executing scorers that come from both the Judgment API and local scorers, we're left with
|
|
297
|
+
* results for each type of scorer. This function merges the results from the API and local evaluations,
|
|
298
|
+
* grouped by example.
|
|
299
|
+
*/
|
|
300
|
+
function mergeResults(apiResults, localResults) {
|
|
301
|
+
// No merge required
|
|
302
|
+
if (!localResults.length && apiResults.length) {
|
|
303
|
+
return apiResults;
|
|
304
|
+
}
|
|
305
|
+
if (!apiResults.length && localResults.length) {
|
|
306
|
+
return localResults;
|
|
307
|
+
}
|
|
308
|
+
if (apiResults.length !== localResults.length) {
|
|
309
|
+
// Results should be of same length because each ScoringResult is a 1-1 mapping to an Example
|
|
310
|
+
throw new Error(`The number of API and local results do not match: ${apiResults.length} vs ${localResults.length}`);
|
|
311
|
+
}
|
|
312
|
+
// Each ScoringResult in api and local have all the same fields besides `scorersData`
|
|
313
|
+
for (let i = 0; i < apiResults.length; i++) {
|
|
314
|
+
const apiResult = apiResults[i];
|
|
315
|
+
const localResult = localResults[i];
|
|
316
|
+
if (!apiResult.dataObject || !localResult.dataObject) {
|
|
317
|
+
throw new Error('Data object is null in one of the results.');
|
|
318
|
+
}
|
|
319
|
+
// Verify the results are aligned
|
|
320
|
+
if (apiResult.dataObject.input !== localResult.dataObject.input ||
|
|
321
|
+
apiResult.dataObject.actualOutput !== localResult.dataObject.actualOutput ||
|
|
322
|
+
apiResult.dataObject.expectedOutput !== localResult.dataObject.expectedOutput) {
|
|
323
|
+
throw new Error('The API and local results are not aligned.');
|
|
324
|
+
}
|
|
325
|
+
// Merge ScorerData from the API and local scorers together
|
|
326
|
+
const apiScorerData = apiResult.scorersData;
|
|
327
|
+
const localScorerData = localResult.scorersData;
|
|
328
|
+
if (!apiScorerData && localScorerData) {
|
|
329
|
+
apiResult.scorersData = localScorerData;
|
|
330
|
+
}
|
|
331
|
+
else if (apiScorerData && localScorerData) {
|
|
332
|
+
apiResult.scorersData = [...apiScorerData, ...localScorerData];
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return apiResults;
|
|
336
|
+
}
|
|
337
|
+
exports.mergeResults = mergeResults;
|
|
338
|
+
/**
|
|
339
|
+
* Checks if any ScoringResult objects are missing scorersData
|
|
340
|
+
*/
|
|
341
|
+
function checkMissingScorerData(results) {
|
|
342
|
+
var _a;
|
|
343
|
+
for (let i = 0; i < results.length; i++) {
|
|
344
|
+
if (!results[i].scorersData || ((_a = results[i].scorersData) === null || _a === void 0 ? void 0 : _a.length) === 0) {
|
|
345
|
+
(0, logger_1.error)(`Scorer data is missing for example ${i}. ` +
|
|
346
|
+
'This is usually caused when the example does not contain ' +
|
|
347
|
+
'the fields required by the scorer. ' +
|
|
348
|
+
'Check that your example contains the fields required by the scorers.');
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return results;
|
|
352
|
+
}
|
|
353
|
+
exports.checkMissingScorerData = checkMissingScorerData;
|
|
354
|
+
/**
|
|
355
|
+
* Checks if the example contains the necessary parameters for the scorer
|
|
356
|
+
*/
|
|
357
|
+
function checkExamples(examples, scorers) {
|
|
358
|
+
for (const scorer of scorers) {
|
|
359
|
+
for (const example of examples) {
|
|
360
|
+
// Check for required fields based on scorer type
|
|
361
|
+
switch (scorer.scoreType) {
|
|
362
|
+
case 'answer_correctness':
|
|
363
|
+
case 'answer_relevancy':
|
|
364
|
+
if (!example.expectedOutput) {
|
|
365
|
+
(0, logger_1.warn)(`Scorer ${scorer.scoreType} requires expectedOutput field`);
|
|
366
|
+
}
|
|
367
|
+
break;
|
|
368
|
+
case 'contextual_precision':
|
|
369
|
+
case 'contextual_recall':
|
|
370
|
+
case 'contextual_relevancy':
|
|
371
|
+
if (!example.context || example.context.length === 0) {
|
|
372
|
+
(0, logger_1.warn)(`Scorer ${scorer.scoreType} requires context field`);
|
|
373
|
+
}
|
|
374
|
+
break;
|
|
375
|
+
case 'execution_order':
|
|
376
|
+
if (!example.expectedTools || example.expectedTools.length === 0) {
|
|
377
|
+
(0, logger_1.warn)(`Scorer ${scorer.scoreType} requires expectedTools field`);
|
|
378
|
+
}
|
|
379
|
+
break;
|
|
380
|
+
// Add more checks for other scorer types as needed
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
exports.checkExamples = checkExamples;
|
|
386
|
+
/**
|
|
387
|
+
* Executes an evaluation of Examples using one or more Scorers
|
|
388
|
+
*/
|
|
389
|
+
function runEval(evaluationRun_1) {
|
|
390
|
+
return __awaiter(this, arguments, void 0, function* (evaluationRun, override = false, ignoreErrors = true, asyncExecution = false) {
|
|
391
|
+
// Check if the evaluation run name already exists
|
|
392
|
+
// This prevents accidentally overwriting existing evaluation results
|
|
393
|
+
if (!override && evaluationRun.logResults) {
|
|
394
|
+
yield checkEvalRunNameExists(evaluationRun.evalName || '', evaluationRun.projectName || '', evaluationRun.judgmentApiKey || '', evaluationRun.organizationId || '');
|
|
395
|
+
}
|
|
396
|
+
// --- Set example IDs and timestamps if not already set ---
|
|
397
|
+
// This is important for tracking and debugging purposes
|
|
398
|
+
(0, logger_1.log)("Initializing examples with IDs and timestamps");
|
|
399
|
+
evaluationRun.examples.forEach((example, idx) => {
|
|
400
|
+
example.exampleIndex = idx; // Set numeric index
|
|
401
|
+
example.timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];
|
|
402
|
+
(0, logger_1.log)(`Initialized example ${example.exampleId} (index: ${example.exampleIndex})`);
|
|
403
|
+
(0, logger_1.log)(`Input: ${example.input}`);
|
|
404
|
+
(0, logger_1.log)(`Actual output: ${example.actualOutput || ''}`);
|
|
405
|
+
if (example.expectedOutput) {
|
|
406
|
+
(0, logger_1.log)(`Expected output: ${example.expectedOutput}`);
|
|
407
|
+
}
|
|
408
|
+
if (example.context) {
|
|
409
|
+
(0, logger_1.log)(`Context: ${example.context}`);
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
(0, logger_1.log)(`Starting evaluation run with ${evaluationRun.examples.length} examples`);
|
|
413
|
+
// --- Split scorers into API and local ---
|
|
414
|
+
// API scorers run on the Judgment API server
|
|
415
|
+
// Local scorers run in this process
|
|
416
|
+
(0, logger_1.log)("Grouping scorers by type");
|
|
417
|
+
const apiScorers = [];
|
|
418
|
+
const localScorers = [];
|
|
419
|
+
evaluationRun.scorers.forEach(scorer => {
|
|
420
|
+
if (scorer instanceof base_scorer_1.APIJudgmentScorer) {
|
|
421
|
+
apiScorers.push(scorer);
|
|
422
|
+
(0, logger_1.log)(`Added judgment scorer: ${scorer.constructor.name}`);
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
localScorers.push(scorer);
|
|
426
|
+
(0, logger_1.log)(`Added local scorer: ${scorer.constructor.name}`);
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
(0, logger_1.log)(`Found ${apiScorers.length} judgment scorers and ${localScorers.length} local scorers`);
|
|
430
|
+
let apiResults = [];
|
|
431
|
+
let localResults = [];
|
|
432
|
+
// --- Handle async execution ---
|
|
433
|
+
// This allows evaluations to run in the background without blocking
|
|
434
|
+
// Useful for large-scale evaluations that might take a long time
|
|
435
|
+
if (asyncExecution) {
|
|
436
|
+
checkExamples(evaluationRun.examples, evaluationRun.scorers);
|
|
437
|
+
(0, logger_1.log)("Starting async evaluation");
|
|
438
|
+
// Add the evaluation to the RabbitMQ queue for async processing
|
|
439
|
+
// The server will pick it up and process it in the background
|
|
440
|
+
try {
|
|
441
|
+
yield axios_1.default.post(constants_1.JUDGMENT_ADD_TO_RUN_EVAL_QUEUE_API_URL, evaluationRun.toJSON(), {
|
|
442
|
+
headers: {
|
|
443
|
+
'Content-Type': 'application/json',
|
|
444
|
+
'Authorization': `Bearer ${evaluationRun.judgmentApiKey}`,
|
|
445
|
+
'X-Organization-Id': evaluationRun.organizationId
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
(0, logger_1.info)("Successfully added evaluation to queue");
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
// Log the error but don't throw it - this matches Python SDK behavior
|
|
452
|
+
// Combine error message into the first argument
|
|
453
|
+
(0, logger_1.error)(`Error adding evaluation to queue: ${error instanceof Error ? error.message : String(error)}`);
|
|
454
|
+
// Always print success message to match Python SDK behavior
|
|
455
|
+
// This is important because the Python SDK always prints this message
|
|
456
|
+
// even when there's an error connecting to RabbitMQ
|
|
457
|
+
(0, logger_1.info)("Successfully added evaluation to queue (Note: Previous error occurred)");
|
|
458
|
+
}
|
|
459
|
+
// Return empty results for async execution
|
|
460
|
+
// The results will be available later via the UI or API
|
|
461
|
+
return [];
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
// --- Execute API scorers ---
|
|
465
|
+
// These run on the Judgment API server
|
|
466
|
+
if (apiScorers.length > 0) {
|
|
467
|
+
try {
|
|
468
|
+
(0, logger_1.log)('Executing API evaluation...');
|
|
469
|
+
const apiResponseData = yield executeApiEval(evaluationRun);
|
|
470
|
+
// Create ScoringResult objects from API response
|
|
471
|
+
// Check if the response has a results field (matching Python SDK format)
|
|
472
|
+
const resultsData = apiResponseData && typeof apiResponseData === 'object' && 'results' in apiResponseData
|
|
473
|
+
? apiResponseData.results
|
|
474
|
+
: apiResponseData;
|
|
475
|
+
apiResults = resultsData.map((result) => {
|
|
476
|
+
// If the result is already a ScoringResult, return it directly
|
|
477
|
+
if (result instanceof result_1.ScoringResult) {
|
|
478
|
+
return result;
|
|
479
|
+
}
|
|
480
|
+
// Otherwise, create a new ScoringResult from the result data
|
|
481
|
+
return new result_1.ScoringResult({
|
|
482
|
+
dataObject: result.data_object,
|
|
483
|
+
scorersData: result.scorers_data,
|
|
484
|
+
error: result.error
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
(0, logger_1.log)(`API evaluation complete with ${apiResults.length} results`);
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
(0, logger_1.error)(`Error executing API evaluation: ${error}`);
|
|
491
|
+
if (!ignoreErrors) {
|
|
492
|
+
throw error;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
// --- Execute local scorers ---
|
|
497
|
+
// These run in this process
|
|
498
|
+
if (localScorers.length > 0) {
|
|
499
|
+
(0, logger_1.log)('Starting local evaluation');
|
|
500
|
+
try {
|
|
501
|
+
// Process each example with each local scorer
|
|
502
|
+
localResults = yield Promise.all(evaluationRun.examples.map((example) => __awaiter(this, void 0, void 0, function* () {
|
|
503
|
+
const scorersData = [];
|
|
504
|
+
// Run each local scorer on the example
|
|
505
|
+
for (const scorer of localScorers) {
|
|
506
|
+
try {
|
|
507
|
+
(0, logger_1.log)(`Running local scorer ${scorer.type} on example ${example.exampleId}`);
|
|
508
|
+
const scorerData = yield scorer.scoreExample(example);
|
|
509
|
+
scorersData.push(scorerData);
|
|
510
|
+
(0, logger_1.log)(`Scorer ${scorer.type} result: score=${scorerData.score}, success=${scorerData.success}`);
|
|
511
|
+
}
|
|
512
|
+
catch (scorerError) {
|
|
513
|
+
(0, logger_1.error)(`Error running scorer ${scorer.type} on example ${example.exampleId}: ${(scorerError === null || scorerError === void 0 ? void 0 : scorerError.message) || String(scorerError)}`);
|
|
514
|
+
// Add failed scorer data
|
|
515
|
+
scorersData.push({
|
|
516
|
+
name: scorer.type,
|
|
517
|
+
threshold: scorer.threshold,
|
|
518
|
+
success: false,
|
|
519
|
+
score: 0,
|
|
520
|
+
reason: null,
|
|
521
|
+
strict_mode: null,
|
|
522
|
+
evaluation_model: null,
|
|
523
|
+
error: (scorerError === null || scorerError === void 0 ? void 0 : scorerError.message) || String(scorerError),
|
|
524
|
+
evaluation_cost: null,
|
|
525
|
+
verbose_logs: null,
|
|
526
|
+
additional_metadata: scorer.additional_metadata || {}
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
// Create a ScoringResult with all scorer data for this example
|
|
531
|
+
return new result_1.ScoringResult({
|
|
532
|
+
dataObject: example,
|
|
533
|
+
scorersData: scorersData,
|
|
534
|
+
error: undefined
|
|
535
|
+
});
|
|
536
|
+
})));
|
|
537
|
+
(0, logger_1.log)(`Local evaluation complete with ${localResults.length} results`);
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
(0, logger_1.error)(`Error executing local evaluation: ${(error === null || error === void 0 ? void 0 : error.message) || String(error)}`);
|
|
541
|
+
if (!ignoreErrors) {
|
|
542
|
+
throw error;
|
|
543
|
+
}
|
|
544
|
+
// Create empty results with errors if ignoring errors
|
|
545
|
+
localResults = evaluationRun.examples.map(example => {
|
|
546
|
+
return new result_1.ScoringResult({
|
|
547
|
+
dataObject: example,
|
|
548
|
+
scorersData: [],
|
|
549
|
+
error: error === null || error === void 0 ? void 0 : error.message
|
|
550
|
+
});
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
// --- Merge results from API and local scorers ---
|
|
555
|
+
// This combines the results from both types of scorers
|
|
556
|
+
// Align with Python - only record content and usage base
|
|
557
|
+
(0, logger_1.log)('Merging API and local results');
|
|
558
|
+
const mergedResults = mergeResults(apiResults, localResults);
|
|
559
|
+
// Check for missing scorer data
|
|
560
|
+
// This helps identify examples that couldn't be evaluated
|
|
561
|
+
const checkedResults = checkMissingScorerData(mergedResults);
|
|
562
|
+
(0, logger_1.log)(`Successfully merged ${checkedResults.length} results`);
|
|
563
|
+
// --- Log results to Judgment API if requested ---
|
|
564
|
+
// This saves the results to the database for later viewing
|
|
565
|
+
if (evaluationRun.logResults) {
|
|
566
|
+
try {
|
|
567
|
+
const url = yield logEvaluationResults(checkedResults, evaluationRun.projectName || '', evaluationRun.evalName || '', evaluationRun.judgmentApiKey || '', evaluationRun.organizationId || '');
|
|
568
|
+
(0, logger_1.log)(`Results logged to Judgment API: ${url}`);
|
|
569
|
+
}
|
|
570
|
+
catch (error) {
|
|
571
|
+
(0, logger_1.error)(`Error logging evaluation results: ${(error === null || error === void 0 ? void 0 : error.message) || String(error)}`);
|
|
572
|
+
if (!ignoreErrors) {
|
|
573
|
+
throw error;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
// --- Check for examples with no scorer data ---
|
|
578
|
+
// This helps identify examples that couldn't be evaluated
|
|
579
|
+
for (let i = 0; i < checkedResults.length; i++) {
|
|
580
|
+
const result = checkedResults[i];
|
|
581
|
+
if (!result.scorersData || result.scorersData.length === 0) {
|
|
582
|
+
(0, logger_1.log)(`None of the scorers could be executed on example ${i}. This is usually because the Example is missing the fields needed by the scorers. Try checking that the Example has the necessary fields for your scorers.`);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
return checkedResults;
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
exports.runEval = runEval;
|
|
590
|
+
/**
|
|
591
|
+
* Collects all failed scorers from the scoring results
|
|
592
|
+
* Raises exceptions for any failed test cases
|
|
593
|
+
*/
|
|
594
|
+
function assertTest(scoringResults) {
|
|
595
|
+
var _a;
|
|
596
|
+
const failedTests = [];
|
|
597
|
+
for (const result of scoringResults) {
|
|
598
|
+
if (result.error) {
|
|
599
|
+
failedTests.push(`Error in result: ${result.error}`);
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
if (!result.scorersData || ((_a = result.scorersData) === null || _a === void 0 ? void 0 : _a.length) === 0) {
|
|
603
|
+
failedTests.push('No scorer data found in result');
|
|
604
|
+
continue;
|
|
605
|
+
}
|
|
606
|
+
for (const scorerData of result.scorersData) {
|
|
607
|
+
if (!scorerData.success) {
|
|
608
|
+
failedTests.push(`Test failed: ${scorerData.name} with score ${scorerData.score} ` +
|
|
609
|
+
`(threshold: ${scorerData.threshold})`);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
if (failedTests.length > 0) {
|
|
614
|
+
throw new Error(`Test assertion failed:\n${failedTests.join('\n')}`);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
exports.assertTest = assertTest;
|
|
618
|
+
//# sourceMappingURL=run-evaluation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-evaluation.js","sourceRoot":"","sources":["../src/run-evaluation.ts"],"names":[],"mappings":"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"}
|