@wix/evalforge-evaluator 0.6.0 → 0.8.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/build/index.js +108 -28
- package/build/index.js.map +2 -2
- package/build/index.mjs +108 -28
- package/build/index.mjs.map +2 -2
- package/build/types/api-client.d.ts +20 -3
- package/build/types/config.d.ts +13 -0
- package/build/types/run-scenario/claude-code/types.d.ts +6 -0
- package/package.json +3 -3
package/build/index.mjs
CHANGED
|
@@ -32,21 +32,45 @@ function loadConfig() {
|
|
|
32
32
|
aiGatewayHeaders[key] = value;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
const tracePushUrl = process.env.TRACE_PUSH_URL;
|
|
36
|
+
const routeHeader = process.env.EVAL_ROUTE_HEADER;
|
|
37
|
+
const authToken = process.env.EVAL_AUTH_TOKEN;
|
|
35
38
|
return {
|
|
36
39
|
serverUrl,
|
|
37
40
|
apiPrefix,
|
|
38
41
|
aiGatewayUrl,
|
|
39
42
|
aiGatewayHeaders,
|
|
40
|
-
evaluationsDir
|
|
43
|
+
evaluationsDir,
|
|
44
|
+
tracePushUrl,
|
|
45
|
+
routeHeader,
|
|
46
|
+
authToken
|
|
41
47
|
};
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
// src/api-client.ts
|
|
45
|
-
function createApiClient(serverUrl,
|
|
51
|
+
function createApiClient(serverUrl, options = "") {
|
|
52
|
+
const opts = typeof options === "string" ? { apiPrefix: options } : options;
|
|
53
|
+
const apiPrefix = opts.apiPrefix ?? "";
|
|
54
|
+
const routeHeader = opts.routeHeader;
|
|
55
|
+
const authToken = opts.authToken;
|
|
56
|
+
const pathPrefix = authToken ? "/public" : "";
|
|
57
|
+
function buildHeaders(additionalHeaders) {
|
|
58
|
+
const headers = { ...additionalHeaders };
|
|
59
|
+
if (authToken) {
|
|
60
|
+
headers["Authorization"] = `Bearer ${authToken}`;
|
|
61
|
+
}
|
|
62
|
+
if (routeHeader) {
|
|
63
|
+
headers["x-wix-route"] = routeHeader;
|
|
64
|
+
}
|
|
65
|
+
return headers;
|
|
66
|
+
}
|
|
46
67
|
async function fetchJson(path9) {
|
|
47
|
-
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
68
|
+
const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
|
|
48
69
|
console.error(`[API] GET ${url}`);
|
|
49
|
-
const
|
|
70
|
+
const headers = buildHeaders();
|
|
71
|
+
const response = await fetch(url, {
|
|
72
|
+
headers: Object.keys(headers).length > 0 ? headers : void 0
|
|
73
|
+
});
|
|
50
74
|
if (!response.ok) {
|
|
51
75
|
const errorText = await response.text();
|
|
52
76
|
throw new Error(
|
|
@@ -56,11 +80,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
56
80
|
return response.json();
|
|
57
81
|
}
|
|
58
82
|
async function postJson(path9, body) {
|
|
59
|
-
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
83
|
+
const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
|
|
60
84
|
console.error(`[API] POST ${url}`);
|
|
61
85
|
const response = await fetch(url, {
|
|
62
86
|
method: "POST",
|
|
63
|
-
headers: { "Content-Type": "application/json" },
|
|
87
|
+
headers: buildHeaders({ "Content-Type": "application/json" }),
|
|
64
88
|
body: JSON.stringify(body)
|
|
65
89
|
});
|
|
66
90
|
if (!response.ok) {
|
|
@@ -71,9 +95,13 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
71
95
|
}
|
|
72
96
|
}
|
|
73
97
|
async function deleteRequest(path9) {
|
|
74
|
-
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
98
|
+
const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
|
|
75
99
|
console.error(`[API] DELETE ${url}`);
|
|
76
|
-
const
|
|
100
|
+
const headers = buildHeaders();
|
|
101
|
+
const response = await fetch(url, {
|
|
102
|
+
method: "DELETE",
|
|
103
|
+
headers: Object.keys(headers).length > 0 ? headers : void 0
|
|
104
|
+
});
|
|
77
105
|
if (!response.ok) {
|
|
78
106
|
const errorText = await response.text();
|
|
79
107
|
throw new Error(
|
|
@@ -82,11 +110,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
82
110
|
}
|
|
83
111
|
}
|
|
84
112
|
async function putJson(path9, body) {
|
|
85
|
-
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
113
|
+
const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
|
|
86
114
|
console.error(`[API] PUT ${url}`);
|
|
87
115
|
const response = await fetch(url, {
|
|
88
116
|
method: "PUT",
|
|
89
|
-
headers: { "Content-Type": "application/json" },
|
|
117
|
+
headers: buildHeaders({ "Content-Type": "application/json" }),
|
|
90
118
|
body: JSON.stringify(body)
|
|
91
119
|
});
|
|
92
120
|
if (!response.ok) {
|
|
@@ -6059,8 +6087,39 @@ import { randomUUID } from "crypto";
|
|
|
6059
6087
|
import { mkdir as mkdir2, writeFile } from "fs/promises";
|
|
6060
6088
|
import { join as join2 } from "path";
|
|
6061
6089
|
var DEFAULT_MODEL = "claude-sonnet-4-20250514";
|
|
6062
|
-
function emitTraceEvent(event) {
|
|
6090
|
+
function emitTraceEvent(event, tracePushUrl, routeHeader, authToken) {
|
|
6063
6091
|
console.log(`${TRACE_EVENT_PREFIX}${JSON.stringify(event)}`);
|
|
6092
|
+
if (tracePushUrl) {
|
|
6093
|
+
pushTraceEvent(tracePushUrl, event, routeHeader, authToken).catch((err) => {
|
|
6094
|
+
console.error("[Trace Push] Failed to push trace event:", err);
|
|
6095
|
+
});
|
|
6096
|
+
}
|
|
6097
|
+
}
|
|
6098
|
+
async function pushTraceEvent(url, event, routeHeader, authToken) {
|
|
6099
|
+
try {
|
|
6100
|
+
const headers = {
|
|
6101
|
+
"Content-Type": "application/json"
|
|
6102
|
+
};
|
|
6103
|
+
if (authToken) {
|
|
6104
|
+
headers["Authorization"] = `Bearer ${authToken}`;
|
|
6105
|
+
}
|
|
6106
|
+
if (routeHeader) {
|
|
6107
|
+
headers["x-wix-route"] = routeHeader;
|
|
6108
|
+
}
|
|
6109
|
+
const response = await fetch(url, {
|
|
6110
|
+
method: "POST",
|
|
6111
|
+
headers,
|
|
6112
|
+
body: JSON.stringify(event)
|
|
6113
|
+
});
|
|
6114
|
+
if (!response.ok) {
|
|
6115
|
+
const errorText = await response.text();
|
|
6116
|
+
console.error(
|
|
6117
|
+
`[Trace Push] HTTP ${response.status}: ${errorText.slice(0, 200)}`
|
|
6118
|
+
);
|
|
6119
|
+
}
|
|
6120
|
+
} catch (err) {
|
|
6121
|
+
console.error("[Trace Push] Network error:", err);
|
|
6122
|
+
}
|
|
6064
6123
|
}
|
|
6065
6124
|
function createTraceEventFromMessage(message, context, stepNumber, isComplete) {
|
|
6066
6125
|
let type = LiveTraceEventType.COMPLETION;
|
|
@@ -6218,7 +6277,12 @@ async function executeWithClaudeCode(skill, scenario, options) {
|
|
|
6218
6277
|
false
|
|
6219
6278
|
// Not complete yet
|
|
6220
6279
|
);
|
|
6221
|
-
emitTraceEvent(
|
|
6280
|
+
emitTraceEvent(
|
|
6281
|
+
traceEvent,
|
|
6282
|
+
traceContext.tracePushUrl,
|
|
6283
|
+
traceContext.routeHeader,
|
|
6284
|
+
traceContext.authToken
|
|
6285
|
+
);
|
|
6222
6286
|
}
|
|
6223
6287
|
}
|
|
6224
6288
|
console.log(
|
|
@@ -6227,18 +6291,23 @@ async function executeWithClaudeCode(skill, scenario, options) {
|
|
|
6227
6291
|
"messages"
|
|
6228
6292
|
);
|
|
6229
6293
|
if (traceContext) {
|
|
6230
|
-
emitTraceEvent(
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
|
|
6234
|
-
|
|
6235
|
-
|
|
6236
|
-
|
|
6237
|
-
|
|
6238
|
-
|
|
6239
|
-
|
|
6240
|
-
|
|
6241
|
-
|
|
6294
|
+
emitTraceEvent(
|
|
6295
|
+
{
|
|
6296
|
+
evalRunId: traceContext.evalRunId,
|
|
6297
|
+
scenarioId: traceContext.scenarioId,
|
|
6298
|
+
scenarioName: traceContext.scenarioName,
|
|
6299
|
+
targetId: traceContext.targetId,
|
|
6300
|
+
targetName: traceContext.targetName,
|
|
6301
|
+
stepNumber: traceStepNumber + 1,
|
|
6302
|
+
type: LiveTraceEventType.COMPLETION,
|
|
6303
|
+
outputPreview: "Scenario execution completed",
|
|
6304
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6305
|
+
isComplete: true
|
|
6306
|
+
},
|
|
6307
|
+
traceContext.tracePushUrl,
|
|
6308
|
+
traceContext.routeHeader,
|
|
6309
|
+
traceContext.authToken
|
|
6310
|
+
);
|
|
6242
6311
|
}
|
|
6243
6312
|
const endTime = /* @__PURE__ */ new Date();
|
|
6244
6313
|
const totalDurationMs = endTime.getTime() - startTime.getTime();
|
|
@@ -6456,7 +6525,10 @@ async function callSkill(config, evalRunId2, scenario, skill, agent, workDir) {
|
|
|
6456
6525
|
scenarioId: scenario.id,
|
|
6457
6526
|
scenarioName: scenario.name,
|
|
6458
6527
|
targetId: skill.id,
|
|
6459
|
-
targetName: skill.name
|
|
6528
|
+
targetName: skill.name,
|
|
6529
|
+
tracePushUrl: config.tracePushUrl,
|
|
6530
|
+
routeHeader: config.routeHeader,
|
|
6531
|
+
authToken: config.authToken
|
|
6460
6532
|
}
|
|
6461
6533
|
});
|
|
6462
6534
|
const completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -6569,9 +6641,14 @@ async function runEvaluation(projectId2, evalRunId2) {
|
|
|
6569
6641
|
serverUrl: config.serverUrl,
|
|
6570
6642
|
aiGatewayUrl: config.aiGatewayUrl,
|
|
6571
6643
|
evaluationsDir: config.evaluationsDir,
|
|
6572
|
-
hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0
|
|
6644
|
+
hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0,
|
|
6645
|
+
hasRouteHeader: !!config.routeHeader
|
|
6646
|
+
});
|
|
6647
|
+
const api = createApiClient(config.serverUrl, {
|
|
6648
|
+
apiPrefix: config.apiPrefix,
|
|
6649
|
+
routeHeader: config.routeHeader,
|
|
6650
|
+
authToken: config.authToken
|
|
6573
6651
|
});
|
|
6574
|
-
const api = createApiClient(config.serverUrl, config.apiPrefix);
|
|
6575
6652
|
console.error(
|
|
6576
6653
|
"[DEBUG-H2] fetchEvaluationData START",
|
|
6577
6654
|
JSON.stringify({ serverUrl: config.serverUrl, timestamp: Date.now() })
|
|
@@ -6655,7 +6732,10 @@ runEvaluation(projectId, evalRunId).then(() => {
|
|
|
6655
6732
|
console.error("[EVALUATOR-BOOT] runEvaluation FAILED:", err);
|
|
6656
6733
|
try {
|
|
6657
6734
|
const config = loadConfig();
|
|
6658
|
-
const api = createApiClient(config.serverUrl,
|
|
6735
|
+
const api = createApiClient(config.serverUrl, {
|
|
6736
|
+
apiPrefix: config.apiPrefix,
|
|
6737
|
+
routeHeader: config.routeHeader
|
|
6738
|
+
});
|
|
6659
6739
|
await api.updateEvalRun(projectId, evalRunId, {
|
|
6660
6740
|
status: EvalStatus.FAILED,
|
|
6661
6741
|
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|