@wix/evalforge-evaluator 0.6.0 → 0.7.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 +90 -24
- package/build/index.js.map +2 -2
- package/build/index.mjs +90 -24
- package/build/index.mjs.map +2 -2
- package/build/types/api-client.d.ts +15 -3
- package/build/types/config.d.ts +8 -0
- package/build/types/run-scenario/claude-code/types.d.ts +4 -0
- package/package.json +3 -3
package/build/index.mjs
CHANGED
|
@@ -32,21 +32,38 @@ 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;
|
|
35
37
|
return {
|
|
36
38
|
serverUrl,
|
|
37
39
|
apiPrefix,
|
|
38
40
|
aiGatewayUrl,
|
|
39
41
|
aiGatewayHeaders,
|
|
40
|
-
evaluationsDir
|
|
42
|
+
evaluationsDir,
|
|
43
|
+
tracePushUrl,
|
|
44
|
+
routeHeader
|
|
41
45
|
};
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
// src/api-client.ts
|
|
45
|
-
function createApiClient(serverUrl,
|
|
49
|
+
function createApiClient(serverUrl, options = "") {
|
|
50
|
+
const opts = typeof options === "string" ? { apiPrefix: options } : options;
|
|
51
|
+
const apiPrefix = opts.apiPrefix ?? "";
|
|
52
|
+
const routeHeader = opts.routeHeader;
|
|
53
|
+
function buildHeaders(additionalHeaders) {
|
|
54
|
+
const headers = { ...additionalHeaders };
|
|
55
|
+
if (routeHeader) {
|
|
56
|
+
headers["x-wix-route"] = routeHeader;
|
|
57
|
+
}
|
|
58
|
+
return headers;
|
|
59
|
+
}
|
|
46
60
|
async function fetchJson(path9) {
|
|
47
61
|
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
48
62
|
console.error(`[API] GET ${url}`);
|
|
49
|
-
const
|
|
63
|
+
const headers = buildHeaders();
|
|
64
|
+
const response = await fetch(url, {
|
|
65
|
+
headers: Object.keys(headers).length > 0 ? headers : void 0
|
|
66
|
+
});
|
|
50
67
|
if (!response.ok) {
|
|
51
68
|
const errorText = await response.text();
|
|
52
69
|
throw new Error(
|
|
@@ -60,7 +77,7 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
60
77
|
console.error(`[API] POST ${url}`);
|
|
61
78
|
const response = await fetch(url, {
|
|
62
79
|
method: "POST",
|
|
63
|
-
headers: { "Content-Type": "application/json" },
|
|
80
|
+
headers: buildHeaders({ "Content-Type": "application/json" }),
|
|
64
81
|
body: JSON.stringify(body)
|
|
65
82
|
});
|
|
66
83
|
if (!response.ok) {
|
|
@@ -73,7 +90,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
73
90
|
async function deleteRequest(path9) {
|
|
74
91
|
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
75
92
|
console.error(`[API] DELETE ${url}`);
|
|
76
|
-
const
|
|
93
|
+
const headers = buildHeaders();
|
|
94
|
+
const response = await fetch(url, {
|
|
95
|
+
method: "DELETE",
|
|
96
|
+
headers: Object.keys(headers).length > 0 ? headers : void 0
|
|
97
|
+
});
|
|
77
98
|
if (!response.ok) {
|
|
78
99
|
const errorText = await response.text();
|
|
79
100
|
throw new Error(
|
|
@@ -86,7 +107,7 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
86
107
|
console.error(`[API] PUT ${url}`);
|
|
87
108
|
const response = await fetch(url, {
|
|
88
109
|
method: "PUT",
|
|
89
|
-
headers: { "Content-Type": "application/json" },
|
|
110
|
+
headers: buildHeaders({ "Content-Type": "application/json" }),
|
|
90
111
|
body: JSON.stringify(body)
|
|
91
112
|
});
|
|
92
113
|
if (!response.ok) {
|
|
@@ -6059,8 +6080,36 @@ import { randomUUID } from "crypto";
|
|
|
6059
6080
|
import { mkdir as mkdir2, writeFile } from "fs/promises";
|
|
6060
6081
|
import { join as join2 } from "path";
|
|
6061
6082
|
var DEFAULT_MODEL = "claude-sonnet-4-20250514";
|
|
6062
|
-
function emitTraceEvent(event) {
|
|
6083
|
+
function emitTraceEvent(event, tracePushUrl, routeHeader) {
|
|
6063
6084
|
console.log(`${TRACE_EVENT_PREFIX}${JSON.stringify(event)}`);
|
|
6085
|
+
if (tracePushUrl) {
|
|
6086
|
+
pushTraceEvent(tracePushUrl, event, routeHeader).catch((err) => {
|
|
6087
|
+
console.error("[Trace Push] Failed to push trace event:", err);
|
|
6088
|
+
});
|
|
6089
|
+
}
|
|
6090
|
+
}
|
|
6091
|
+
async function pushTraceEvent(url, event, routeHeader) {
|
|
6092
|
+
try {
|
|
6093
|
+
const headers = {
|
|
6094
|
+
"Content-Type": "application/json"
|
|
6095
|
+
};
|
|
6096
|
+
if (routeHeader) {
|
|
6097
|
+
headers["x-wix-route"] = routeHeader;
|
|
6098
|
+
}
|
|
6099
|
+
const response = await fetch(url, {
|
|
6100
|
+
method: "POST",
|
|
6101
|
+
headers,
|
|
6102
|
+
body: JSON.stringify(event)
|
|
6103
|
+
});
|
|
6104
|
+
if (!response.ok) {
|
|
6105
|
+
const errorText = await response.text();
|
|
6106
|
+
console.error(
|
|
6107
|
+
`[Trace Push] HTTP ${response.status}: ${errorText.slice(0, 200)}`
|
|
6108
|
+
);
|
|
6109
|
+
}
|
|
6110
|
+
} catch (err) {
|
|
6111
|
+
console.error("[Trace Push] Network error:", err);
|
|
6112
|
+
}
|
|
6064
6113
|
}
|
|
6065
6114
|
function createTraceEventFromMessage(message, context, stepNumber, isComplete) {
|
|
6066
6115
|
let type = LiveTraceEventType.COMPLETION;
|
|
@@ -6218,7 +6267,11 @@ async function executeWithClaudeCode(skill, scenario, options) {
|
|
|
6218
6267
|
false
|
|
6219
6268
|
// Not complete yet
|
|
6220
6269
|
);
|
|
6221
|
-
emitTraceEvent(
|
|
6270
|
+
emitTraceEvent(
|
|
6271
|
+
traceEvent,
|
|
6272
|
+
traceContext.tracePushUrl,
|
|
6273
|
+
traceContext.routeHeader
|
|
6274
|
+
);
|
|
6222
6275
|
}
|
|
6223
6276
|
}
|
|
6224
6277
|
console.log(
|
|
@@ -6227,18 +6280,22 @@ async function executeWithClaudeCode(skill, scenario, options) {
|
|
|
6227
6280
|
"messages"
|
|
6228
6281
|
);
|
|
6229
6282
|
if (traceContext) {
|
|
6230
|
-
emitTraceEvent(
|
|
6231
|
-
|
|
6232
|
-
|
|
6233
|
-
|
|
6234
|
-
|
|
6235
|
-
|
|
6236
|
-
|
|
6237
|
-
|
|
6238
|
-
|
|
6239
|
-
|
|
6240
|
-
|
|
6241
|
-
|
|
6283
|
+
emitTraceEvent(
|
|
6284
|
+
{
|
|
6285
|
+
evalRunId: traceContext.evalRunId,
|
|
6286
|
+
scenarioId: traceContext.scenarioId,
|
|
6287
|
+
scenarioName: traceContext.scenarioName,
|
|
6288
|
+
targetId: traceContext.targetId,
|
|
6289
|
+
targetName: traceContext.targetName,
|
|
6290
|
+
stepNumber: traceStepNumber + 1,
|
|
6291
|
+
type: LiveTraceEventType.COMPLETION,
|
|
6292
|
+
outputPreview: "Scenario execution completed",
|
|
6293
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6294
|
+
isComplete: true
|
|
6295
|
+
},
|
|
6296
|
+
traceContext.tracePushUrl,
|
|
6297
|
+
traceContext.routeHeader
|
|
6298
|
+
);
|
|
6242
6299
|
}
|
|
6243
6300
|
const endTime = /* @__PURE__ */ new Date();
|
|
6244
6301
|
const totalDurationMs = endTime.getTime() - startTime.getTime();
|
|
@@ -6456,7 +6513,9 @@ async function callSkill(config, evalRunId2, scenario, skill, agent, workDir) {
|
|
|
6456
6513
|
scenarioId: scenario.id,
|
|
6457
6514
|
scenarioName: scenario.name,
|
|
6458
6515
|
targetId: skill.id,
|
|
6459
|
-
targetName: skill.name
|
|
6516
|
+
targetName: skill.name,
|
|
6517
|
+
tracePushUrl: config.tracePushUrl,
|
|
6518
|
+
routeHeader: config.routeHeader
|
|
6460
6519
|
}
|
|
6461
6520
|
});
|
|
6462
6521
|
const completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -6569,9 +6628,13 @@ async function runEvaluation(projectId2, evalRunId2) {
|
|
|
6569
6628
|
serverUrl: config.serverUrl,
|
|
6570
6629
|
aiGatewayUrl: config.aiGatewayUrl,
|
|
6571
6630
|
evaluationsDir: config.evaluationsDir,
|
|
6572
|
-
hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0
|
|
6631
|
+
hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0,
|
|
6632
|
+
hasRouteHeader: !!config.routeHeader
|
|
6633
|
+
});
|
|
6634
|
+
const api = createApiClient(config.serverUrl, {
|
|
6635
|
+
apiPrefix: config.apiPrefix,
|
|
6636
|
+
routeHeader: config.routeHeader
|
|
6573
6637
|
});
|
|
6574
|
-
const api = createApiClient(config.serverUrl, config.apiPrefix);
|
|
6575
6638
|
console.error(
|
|
6576
6639
|
"[DEBUG-H2] fetchEvaluationData START",
|
|
6577
6640
|
JSON.stringify({ serverUrl: config.serverUrl, timestamp: Date.now() })
|
|
@@ -6655,7 +6718,10 @@ runEvaluation(projectId, evalRunId).then(() => {
|
|
|
6655
6718
|
console.error("[EVALUATOR-BOOT] runEvaluation FAILED:", err);
|
|
6656
6719
|
try {
|
|
6657
6720
|
const config = loadConfig();
|
|
6658
|
-
const api = createApiClient(config.serverUrl,
|
|
6721
|
+
const api = createApiClient(config.serverUrl, {
|
|
6722
|
+
apiPrefix: config.apiPrefix,
|
|
6723
|
+
routeHeader: config.routeHeader
|
|
6724
|
+
});
|
|
6659
6725
|
await api.updateEvalRun(projectId, evalRunId, {
|
|
6660
6726
|
status: EvalStatus.FAILED,
|
|
6661
6727
|
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|