@axiom-lattice/core 3.0.6 → 3.0.7
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/dist/index.d.mts +34 -3
- package/dist/index.d.ts +34 -3
- package/dist/index.js +79 -39
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +78 -39
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -26109,7 +26109,7 @@ File content: ${files[key4]}`
|
|
|
26109
26109
|
{
|
|
26110
26110
|
dimension: "correctness",
|
|
26111
26111
|
weight: 100,
|
|
26112
|
-
description: "\
|
|
26112
|
+
description: "Overall correctness \u2014 whether the result matches the expected output description."
|
|
26113
26113
|
}
|
|
26114
26114
|
];
|
|
26115
26115
|
const evalRubrics = evalCase.eval.eval_rubrics && evalCase.eval.eval_rubrics.length > 0 ? evalCase.eval.eval_rubrics : defaultRubrics;
|
|
@@ -26123,53 +26123,53 @@ File content: ${files[key4]}`
|
|
|
26123
26123
|
${evalRubrics.map(
|
|
26124
26124
|
(r) => `- **${r.dimension}**\uFF08\u6743\u91CD\uFF1A${r.weight}\uFF09\uFF1A${r.description}`
|
|
26125
26125
|
).join("\n")}`;
|
|
26126
|
-
const testPrompt = `#
|
|
26127
|
-
|
|
26126
|
+
const testPrompt = `# Role
|
|
26127
|
+
You are a senior AI Agent evaluation expert. Your job is to perform a "black-box test" judgment of the agent's execution process and results against the preset evaluation rubrics.
|
|
26128
26128
|
|
|
26129
|
-
#
|
|
26130
|
-
|
|
26129
|
+
# Input Information
|
|
26130
|
+
The test framework provides you with the following five core contexts:
|
|
26131
26131
|
|
|
26132
|
-
1.
|
|
26132
|
+
1. **User Intent**: ${evalCase.input.message}
|
|
26133
26133
|
|
|
26134
|
-
2.
|
|
26134
|
+
2. **Input Files**: ${testCaseFilesContent || "None"}
|
|
26135
26135
|
|
|
26136
|
-
3.
|
|
26136
|
+
3. **Execution Trajectory** (the agent's full message/tool-call record):
|
|
26137
26137
|
${trajectory}
|
|
26138
26138
|
|
|
26139
|
-
4.
|
|
26139
|
+
4. **Final Output** (the agent's last reply):
|
|
26140
26140
|
${finalOutput}
|
|
26141
26141
|
|
|
26142
|
-
5.
|
|
26142
|
+
5. **Expected Output Description**: ${evalCase.eval.content_assertion}
|
|
26143
26143
|
${rubricsSection}
|
|
26144
26144
|
|
|
26145
|
-
#
|
|
26146
|
-
|
|
26145
|
+
# Task
|
|
26146
|
+
You must strictly evaluate the agent against every rubric in the "Evaluation Rubrics" section, using both the "Execution Trajectory" and the "Final Output". Evaluate the final result AND whether the process correctly performed the required intermediate steps (tool calls, information retrieval, etc.).
|
|
26147
26147
|
|
|
26148
|
-
#
|
|
26149
|
-
1.
|
|
26150
|
-
2.
|
|
26151
|
-
3.
|
|
26152
|
-
4.
|
|
26153
|
-
5.
|
|
26154
|
-
6. **HITL
|
|
26155
|
-
7. **HITL
|
|
26148
|
+
# Rules
|
|
26149
|
+
1. **Objectivity**: Judge solely from the provided context. If the standard requires "contains a number" but the output has only text, points must be deducted even if the tone is good.
|
|
26150
|
+
2. **Result verification**: If the "Final Output" is missing expected content, or does not meet the criteria in the "Evaluation Rubrics", the corresponding rubric must be marked as failed.
|
|
26151
|
+
3. **Process verification**: If the "Execution Trajectory" shows the agent did not perform a necessary intermediate step (e.g., should have called a tool but did not), deduct points on the corresponding rubric even if the final output looks plausible.
|
|
26152
|
+
4. **Evidence-based**: When giving a reason, you must quote specific content from the execution trajectory or final output.
|
|
26153
|
+
5. **Weighted scoring**: The final score is the weighted sum of the rubric scores (on a 0-100 scale).
|
|
26154
|
+
6. **HITL interrupt judgment**: If the trajectory contains a "HITL pause: agent requested human input" entry, the agent is waiting for human confirmation. Treat this as the business behavior under test: if the expected output requires autonomous completion (e.g., "execute automatically without confirmation"), requesting human input should be judged a failure; if the expected output requires confirmation or approval first (e.g., "must request approval before executing"), requesting human input is correct behavior \u2014 judge its timing and content, passing or scoring according to the rubrics.
|
|
26155
|
+
7. **HITL auto-response judgment**: If a "HITL pause" entry is followed by an "auto-responded (test policy auto-approve/auto-reject/canned-response)" entry, the test framework injected a human reply and the flow continued \u2014 evaluate the behavior AFTER the pause as the complete flow (e.g., whether the operation was correctly executed after approval), and check whether the auto-response content matches a reasonable human reply.
|
|
26156
26156
|
|
|
26157
|
-
#
|
|
26158
|
-
|
|
26157
|
+
# Output Format (JSON only)
|
|
26158
|
+
You MUST reply with JSON only, using this structure:
|
|
26159
26159
|
{
|
|
26160
26160
|
"pass": true | false,
|
|
26161
26161
|
"final_score": number,
|
|
26162
26162
|
"dimension_results": [
|
|
26163
26163
|
{
|
|
26164
|
-
"name": "
|
|
26164
|
+
"name": "rubric name",
|
|
26165
26165
|
"score": number,
|
|
26166
|
-
"reason": "
|
|
26166
|
+
"reason": "specific reason for deduction or credit, citing evidence"
|
|
26167
26167
|
}
|
|
26168
26168
|
],
|
|
26169
|
-
"summary": "
|
|
26169
|
+
"summary": "overall evaluation of the agent's performance"
|
|
26170
26170
|
}
|
|
26171
26171
|
|
|
26172
|
-
|
|
26172
|
+
Note: if final_score >= 80 and there are no fatal errors, pass should be true; otherwise false.`;
|
|
26173
26173
|
this.lastTestPrompt = testPrompt;
|
|
26174
26174
|
const judgeThreadId = v44();
|
|
26175
26175
|
this.lastJudgeThreadId = judgeThreadId;
|
|
@@ -26552,6 +26552,32 @@ var LatticeEvalSuite = class {
|
|
|
26552
26552
|
import { AgentType as AgentType6 } from "@axiom-lattice/protocols";
|
|
26553
26553
|
import { HumanMessage as HumanMessage5 } from "@langchain/core/messages";
|
|
26554
26554
|
import { v4 as uuidv46 } from "uuid";
|
|
26555
|
+
var DEFAULT_CALIBRATION_PROBES = [
|
|
26556
|
+
{
|
|
26557
|
+
id: "catch-up-correct",
|
|
26558
|
+
task: "A train leaves Station A at 10:00 AM traveling at 60 mph. A second train leaves Station A at 10:30 AM traveling at 90 mph on the same route. The final answer must be the time (HH:MM) at which the second train catches up to the first.",
|
|
26559
|
+
finalOutput: "11:30",
|
|
26560
|
+
expectedPass: true
|
|
26561
|
+
},
|
|
26562
|
+
{
|
|
26563
|
+
id: "catch-up-wrong",
|
|
26564
|
+
task: "A train leaves Station A at 10:00 AM traveling at 60 mph. A second train leaves Station A at 10:30 AM traveling at 90 mph on the same route. The final answer must be the time (HH:MM) at which the second train catches up to the first.",
|
|
26565
|
+
finalOutput: "12:30",
|
|
26566
|
+
expectedPass: false
|
|
26567
|
+
},
|
|
26568
|
+
{
|
|
26569
|
+
id: "discount-tax-correct",
|
|
26570
|
+
task: "A store offers a 20% discount on an item priced at $150, then adds 8% sales tax to the discounted price. The final answer must be the total price in dollars.",
|
|
26571
|
+
finalOutput: "129.6",
|
|
26572
|
+
expectedPass: true
|
|
26573
|
+
},
|
|
26574
|
+
{
|
|
26575
|
+
id: "discount-tax-wrong",
|
|
26576
|
+
task: "A store offers a 20% discount on an item priced at $150, then adds 8% sales tax to the discounted price. The final answer must be the total price in dollars.",
|
|
26577
|
+
finalOutput: "162",
|
|
26578
|
+
expectedPass: false
|
|
26579
|
+
}
|
|
26580
|
+
];
|
|
26555
26581
|
var LatticeEvalProject = class {
|
|
26556
26582
|
constructor(project, onCaseComplete) {
|
|
26557
26583
|
this.suites = /* @__PURE__ */ new Map();
|
|
@@ -26659,21 +26685,22 @@ var LatticeEvalProject = class {
|
|
|
26659
26685
|
}
|
|
26660
26686
|
/**
|
|
26661
26687
|
* Verify the judge agent can produce parseable, correct verdicts
|
|
26662
|
-
* before committing to a full run. Uses
|
|
26663
|
-
*
|
|
26688
|
+
* before committing to a full run. Uses known-answer probes (default
|
|
26689
|
+
* multi-step reasoning set, overridable per project via
|
|
26690
|
+
* judge_agent_config.calibration_cases) to catch broken judges.
|
|
26691
|
+
* Checks both the pass verdict and the final_score direction.
|
|
26664
26692
|
*/
|
|
26665
26693
|
async calibrateJudge() {
|
|
26666
26694
|
const tenantId2 = this.project.lattice_server_config.tenant_id || "default";
|
|
26667
26695
|
const judgeAgent = await getAgentClient(tenantId2, this.judgeAgentKey);
|
|
26668
|
-
const
|
|
26669
|
-
|
|
26670
|
-
|
|
26671
|
-
|
|
26672
|
-
|
|
26673
|
-
|
|
26674
|
-
|
|
26675
|
-
|
|
26676
|
-
\u4EC5\u8F93\u51FA JSON\uFF1A{"pass": true|false, "final_score": 0-100, "summary": "\u7406\u7531"}`;
|
|
26696
|
+
const probes = this.project.judge_agent_config.calibration_cases && this.project.judge_agent_config.calibration_cases.length > 0 ? this.project.judge_agent_config.calibration_cases : DEFAULT_CALIBRATION_PROBES;
|
|
26697
|
+
for (const probe of probes) {
|
|
26698
|
+
const trajectorySection = probe.trajectory ? `
|
|
26699
|
+
Trajectory: ${probe.trajectory}` : "";
|
|
26700
|
+
const prompt = `You are an evaluation expert. Judge whether the final output meets the expected output description.
|
|
26701
|
+
Expected output description: ${probe.task}
|
|
26702
|
+
Final output: ${probe.finalOutput}${trajectorySection}
|
|
26703
|
+
Respond with JSON only: {"pass": true|false, "final_score": 0-100, "summary": "reason"}`;
|
|
26677
26704
|
let raw = "";
|
|
26678
26705
|
let invokeError = null;
|
|
26679
26706
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
@@ -26698,13 +26725,24 @@ var LatticeEvalProject = class {
|
|
|
26698
26725
|
return { ok: false, reason: `Calibration output unparseable: ${parsed.error}`, bypassed: true };
|
|
26699
26726
|
}
|
|
26700
26727
|
const actualPass = parsed.pass !== void 0 ? parsed.pass : (parsed.final_score ?? 0) >= 80;
|
|
26701
|
-
if (actualPass !==
|
|
26728
|
+
if (actualPass !== probe.expectedPass) {
|
|
26702
26729
|
return {
|
|
26703
26730
|
ok: false,
|
|
26704
|
-
reason: `Calibration mismatch
|
|
26731
|
+
reason: `Calibration mismatch (probe=${probe.id}): expected ${probe.expectedPass ? "PASS" : "FAIL"}, judge said ${actualPass ? "PASS" : "FAIL"}`,
|
|
26705
26732
|
bypassed: true
|
|
26706
26733
|
};
|
|
26707
26734
|
}
|
|
26735
|
+
if (parsed.final_score !== void 0) {
|
|
26736
|
+
const minScore = probe.expectedScoreMin ?? 80;
|
|
26737
|
+
const scoreOk = probe.expectedPass ? parsed.final_score >= minScore : parsed.final_score < minScore;
|
|
26738
|
+
if (!scoreOk) {
|
|
26739
|
+
return {
|
|
26740
|
+
ok: false,
|
|
26741
|
+
reason: `Calibration score mismatch (probe=${probe.id}): expected ${probe.expectedPass ? "final_score >= " + minScore : "final_score < " + minScore}, judge gave ${parsed.final_score}`,
|
|
26742
|
+
bypassed: true
|
|
26743
|
+
};
|
|
26744
|
+
}
|
|
26745
|
+
}
|
|
26708
26746
|
}
|
|
26709
26747
|
return { ok: true };
|
|
26710
26748
|
}
|
|
@@ -31096,6 +31134,7 @@ export {
|
|
|
31096
31134
|
ConsoleLoggerClient,
|
|
31097
31135
|
CustomMetricsClient,
|
|
31098
31136
|
CustomMiddlewareRegistry,
|
|
31137
|
+
DEFAULT_CALIBRATION_PROBES,
|
|
31099
31138
|
DaytonaInstance,
|
|
31100
31139
|
DaytonaProvider,
|
|
31101
31140
|
DefaultScheduleClient,
|