@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.js
CHANGED
|
@@ -55,21 +55,45 @@ function loadConfig() {
|
|
|
55
55
|
aiGatewayHeaders[key] = value;
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
+
const tracePushUrl = process.env.TRACE_PUSH_URL;
|
|
59
|
+
const routeHeader = process.env.EVAL_ROUTE_HEADER;
|
|
60
|
+
const authToken = process.env.EVAL_AUTH_TOKEN;
|
|
58
61
|
return {
|
|
59
62
|
serverUrl,
|
|
60
63
|
apiPrefix,
|
|
61
64
|
aiGatewayUrl,
|
|
62
65
|
aiGatewayHeaders,
|
|
63
|
-
evaluationsDir
|
|
66
|
+
evaluationsDir,
|
|
67
|
+
tracePushUrl,
|
|
68
|
+
routeHeader,
|
|
69
|
+
authToken
|
|
64
70
|
};
|
|
65
71
|
}
|
|
66
72
|
|
|
67
73
|
// src/api-client.ts
|
|
68
|
-
function createApiClient(serverUrl,
|
|
74
|
+
function createApiClient(serverUrl, options = "") {
|
|
75
|
+
const opts = typeof options === "string" ? { apiPrefix: options } : options;
|
|
76
|
+
const apiPrefix = opts.apiPrefix ?? "";
|
|
77
|
+
const routeHeader = opts.routeHeader;
|
|
78
|
+
const authToken = opts.authToken;
|
|
79
|
+
const pathPrefix = authToken ? "/public" : "";
|
|
80
|
+
function buildHeaders(additionalHeaders) {
|
|
81
|
+
const headers = { ...additionalHeaders };
|
|
82
|
+
if (authToken) {
|
|
83
|
+
headers["Authorization"] = `Bearer ${authToken}`;
|
|
84
|
+
}
|
|
85
|
+
if (routeHeader) {
|
|
86
|
+
headers["x-wix-route"] = routeHeader;
|
|
87
|
+
}
|
|
88
|
+
return headers;
|
|
89
|
+
}
|
|
69
90
|
async function fetchJson(path9) {
|
|
70
|
-
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
91
|
+
const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
|
|
71
92
|
console.error(`[API] GET ${url}`);
|
|
72
|
-
const
|
|
93
|
+
const headers = buildHeaders();
|
|
94
|
+
const response = await fetch(url, {
|
|
95
|
+
headers: Object.keys(headers).length > 0 ? headers : void 0
|
|
96
|
+
});
|
|
73
97
|
if (!response.ok) {
|
|
74
98
|
const errorText = await response.text();
|
|
75
99
|
throw new Error(
|
|
@@ -79,11 +103,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
79
103
|
return response.json();
|
|
80
104
|
}
|
|
81
105
|
async function postJson(path9, body) {
|
|
82
|
-
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
106
|
+
const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
|
|
83
107
|
console.error(`[API] POST ${url}`);
|
|
84
108
|
const response = await fetch(url, {
|
|
85
109
|
method: "POST",
|
|
86
|
-
headers: { "Content-Type": "application/json" },
|
|
110
|
+
headers: buildHeaders({ "Content-Type": "application/json" }),
|
|
87
111
|
body: JSON.stringify(body)
|
|
88
112
|
});
|
|
89
113
|
if (!response.ok) {
|
|
@@ -94,9 +118,13 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
94
118
|
}
|
|
95
119
|
}
|
|
96
120
|
async function deleteRequest(path9) {
|
|
97
|
-
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
121
|
+
const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
|
|
98
122
|
console.error(`[API] DELETE ${url}`);
|
|
99
|
-
const
|
|
123
|
+
const headers = buildHeaders();
|
|
124
|
+
const response = await fetch(url, {
|
|
125
|
+
method: "DELETE",
|
|
126
|
+
headers: Object.keys(headers).length > 0 ? headers : void 0
|
|
127
|
+
});
|
|
100
128
|
if (!response.ok) {
|
|
101
129
|
const errorText = await response.text();
|
|
102
130
|
throw new Error(
|
|
@@ -105,11 +133,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
|
|
|
105
133
|
}
|
|
106
134
|
}
|
|
107
135
|
async function putJson(path9, body) {
|
|
108
|
-
const url = `${serverUrl}${apiPrefix}${path9}`;
|
|
136
|
+
const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
|
|
109
137
|
console.error(`[API] PUT ${url}`);
|
|
110
138
|
const response = await fetch(url, {
|
|
111
139
|
method: "PUT",
|
|
112
|
-
headers: { "Content-Type": "application/json" },
|
|
140
|
+
headers: buildHeaders({ "Content-Type": "application/json" }),
|
|
113
141
|
body: JSON.stringify(body)
|
|
114
142
|
});
|
|
115
143
|
if (!response.ok) {
|
|
@@ -6076,8 +6104,39 @@ var import_crypto = require("crypto");
|
|
|
6076
6104
|
var import_promises3 = require("fs/promises");
|
|
6077
6105
|
var import_path5 = require("path");
|
|
6078
6106
|
var DEFAULT_MODEL = "claude-sonnet-4-20250514";
|
|
6079
|
-
function emitTraceEvent(event) {
|
|
6107
|
+
function emitTraceEvent(event, tracePushUrl, routeHeader, authToken) {
|
|
6080
6108
|
console.log(`${import_evalforge_types.TRACE_EVENT_PREFIX}${JSON.stringify(event)}`);
|
|
6109
|
+
if (tracePushUrl) {
|
|
6110
|
+
pushTraceEvent(tracePushUrl, event, routeHeader, authToken).catch((err) => {
|
|
6111
|
+
console.error("[Trace Push] Failed to push trace event:", err);
|
|
6112
|
+
});
|
|
6113
|
+
}
|
|
6114
|
+
}
|
|
6115
|
+
async function pushTraceEvent(url, event, routeHeader, authToken) {
|
|
6116
|
+
try {
|
|
6117
|
+
const headers = {
|
|
6118
|
+
"Content-Type": "application/json"
|
|
6119
|
+
};
|
|
6120
|
+
if (authToken) {
|
|
6121
|
+
headers["Authorization"] = `Bearer ${authToken}`;
|
|
6122
|
+
}
|
|
6123
|
+
if (routeHeader) {
|
|
6124
|
+
headers["x-wix-route"] = routeHeader;
|
|
6125
|
+
}
|
|
6126
|
+
const response = await fetch(url, {
|
|
6127
|
+
method: "POST",
|
|
6128
|
+
headers,
|
|
6129
|
+
body: JSON.stringify(event)
|
|
6130
|
+
});
|
|
6131
|
+
if (!response.ok) {
|
|
6132
|
+
const errorText = await response.text();
|
|
6133
|
+
console.error(
|
|
6134
|
+
`[Trace Push] HTTP ${response.status}: ${errorText.slice(0, 200)}`
|
|
6135
|
+
);
|
|
6136
|
+
}
|
|
6137
|
+
} catch (err) {
|
|
6138
|
+
console.error("[Trace Push] Network error:", err);
|
|
6139
|
+
}
|
|
6081
6140
|
}
|
|
6082
6141
|
function createTraceEventFromMessage(message, context, stepNumber, isComplete) {
|
|
6083
6142
|
let type = import_evalforge_types.LiveTraceEventType.COMPLETION;
|
|
@@ -6235,7 +6294,12 @@ async function executeWithClaudeCode(skill, scenario, options) {
|
|
|
6235
6294
|
false
|
|
6236
6295
|
// Not complete yet
|
|
6237
6296
|
);
|
|
6238
|
-
emitTraceEvent(
|
|
6297
|
+
emitTraceEvent(
|
|
6298
|
+
traceEvent,
|
|
6299
|
+
traceContext.tracePushUrl,
|
|
6300
|
+
traceContext.routeHeader,
|
|
6301
|
+
traceContext.authToken
|
|
6302
|
+
);
|
|
6239
6303
|
}
|
|
6240
6304
|
}
|
|
6241
6305
|
console.log(
|
|
@@ -6244,18 +6308,23 @@ async function executeWithClaudeCode(skill, scenario, options) {
|
|
|
6244
6308
|
"messages"
|
|
6245
6309
|
);
|
|
6246
6310
|
if (traceContext) {
|
|
6247
|
-
emitTraceEvent(
|
|
6248
|
-
|
|
6249
|
-
|
|
6250
|
-
|
|
6251
|
-
|
|
6252
|
-
|
|
6253
|
-
|
|
6254
|
-
|
|
6255
|
-
|
|
6256
|
-
|
|
6257
|
-
|
|
6258
|
-
|
|
6311
|
+
emitTraceEvent(
|
|
6312
|
+
{
|
|
6313
|
+
evalRunId: traceContext.evalRunId,
|
|
6314
|
+
scenarioId: traceContext.scenarioId,
|
|
6315
|
+
scenarioName: traceContext.scenarioName,
|
|
6316
|
+
targetId: traceContext.targetId,
|
|
6317
|
+
targetName: traceContext.targetName,
|
|
6318
|
+
stepNumber: traceStepNumber + 1,
|
|
6319
|
+
type: import_evalforge_types.LiveTraceEventType.COMPLETION,
|
|
6320
|
+
outputPreview: "Scenario execution completed",
|
|
6321
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6322
|
+
isComplete: true
|
|
6323
|
+
},
|
|
6324
|
+
traceContext.tracePushUrl,
|
|
6325
|
+
traceContext.routeHeader,
|
|
6326
|
+
traceContext.authToken
|
|
6327
|
+
);
|
|
6259
6328
|
}
|
|
6260
6329
|
const endTime = /* @__PURE__ */ new Date();
|
|
6261
6330
|
const totalDurationMs = endTime.getTime() - startTime.getTime();
|
|
@@ -6473,7 +6542,10 @@ async function callSkill(config, evalRunId2, scenario, skill, agent, workDir) {
|
|
|
6473
6542
|
scenarioId: scenario.id,
|
|
6474
6543
|
scenarioName: scenario.name,
|
|
6475
6544
|
targetId: skill.id,
|
|
6476
|
-
targetName: skill.name
|
|
6545
|
+
targetName: skill.name,
|
|
6546
|
+
tracePushUrl: config.tracePushUrl,
|
|
6547
|
+
routeHeader: config.routeHeader,
|
|
6548
|
+
authToken: config.authToken
|
|
6477
6549
|
}
|
|
6478
6550
|
});
|
|
6479
6551
|
const completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -6586,9 +6658,14 @@ async function runEvaluation(projectId2, evalRunId2) {
|
|
|
6586
6658
|
serverUrl: config.serverUrl,
|
|
6587
6659
|
aiGatewayUrl: config.aiGatewayUrl,
|
|
6588
6660
|
evaluationsDir: config.evaluationsDir,
|
|
6589
|
-
hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0
|
|
6661
|
+
hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0,
|
|
6662
|
+
hasRouteHeader: !!config.routeHeader
|
|
6663
|
+
});
|
|
6664
|
+
const api = createApiClient(config.serverUrl, {
|
|
6665
|
+
apiPrefix: config.apiPrefix,
|
|
6666
|
+
routeHeader: config.routeHeader,
|
|
6667
|
+
authToken: config.authToken
|
|
6590
6668
|
});
|
|
6591
|
-
const api = createApiClient(config.serverUrl, config.apiPrefix);
|
|
6592
6669
|
console.error(
|
|
6593
6670
|
"[DEBUG-H2] fetchEvaluationData START",
|
|
6594
6671
|
JSON.stringify({ serverUrl: config.serverUrl, timestamp: Date.now() })
|
|
@@ -6672,7 +6749,10 @@ runEvaluation(projectId, evalRunId).then(() => {
|
|
|
6672
6749
|
console.error("[EVALUATOR-BOOT] runEvaluation FAILED:", err);
|
|
6673
6750
|
try {
|
|
6674
6751
|
const config = loadConfig();
|
|
6675
|
-
const api = createApiClient(config.serverUrl,
|
|
6752
|
+
const api = createApiClient(config.serverUrl, {
|
|
6753
|
+
apiPrefix: config.apiPrefix,
|
|
6754
|
+
routeHeader: config.routeHeader
|
|
6755
|
+
});
|
|
6676
6756
|
await api.updateEvalRun(projectId, evalRunId, {
|
|
6677
6757
|
status: import_evalforge_types3.EvalStatus.FAILED,
|
|
6678
6758
|
completedAt: (/* @__PURE__ */ new Date()).toISOString()
|