@salesforce/agents 1.5.1 → 1.5.2
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/lib/agentEvalRunner.d.ts +26 -0
- package/lib/agentEvalRunner.js +102 -0
- package/lib/agentEvalRunner.js.map +1 -0
- package/lib/evalFormatter.d.ts +44 -0
- package/lib/evalFormatter.js +267 -0
- package/lib/evalFormatter.js.map +1 -0
- package/lib/evalNormalizer.d.ts +57 -0
- package/lib/evalNormalizer.js +442 -0
- package/lib/evalNormalizer.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +22 -1
- package/lib/index.js.map +1 -1
- package/lib/yamlSpecTranslator.d.ts +20 -0
- package/lib/yamlSpecTranslator.js +234 -0
- package/lib/yamlSpecTranslator.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2026, Salesforce, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.isYamlTestSpec = isYamlTestSpec;
|
|
19
|
+
exports.parseTestSpec = parseTestSpec;
|
|
20
|
+
exports.translateTestSpec = translateTestSpec;
|
|
21
|
+
exports.translateTestCase = translateTestCase;
|
|
22
|
+
/* eslint-disable camelcase */
|
|
23
|
+
const core_1 = require("@salesforce/core");
|
|
24
|
+
const yaml_1 = require("yaml");
|
|
25
|
+
// --- JSONPath mappings from org model to Eval API refs ---
|
|
26
|
+
const ACTUAL_PATH_MAP = {
|
|
27
|
+
'$.generatedData.outcome': '{sm.response}',
|
|
28
|
+
'$.generatedData.topic': '{gs.response.planner_response.lastExecution.topic}',
|
|
29
|
+
'$.generatedData.invokedActions': '{gs.response.planner_response.lastExecution.invokedActions}',
|
|
30
|
+
'$.generatedData.actionsSequence': '{gs.response.planner_response.lastExecution.invokedActions}',
|
|
31
|
+
};
|
|
32
|
+
// --- Custom evaluation name to evaluator type mapping ---
|
|
33
|
+
const CUSTOM_EVAL_TYPE_MAP = {
|
|
34
|
+
string_comparison: 'evaluator.string_assertion',
|
|
35
|
+
numeric_comparison: 'evaluator.numeric_assertion',
|
|
36
|
+
};
|
|
37
|
+
// JSONPaths that require the get_state step
|
|
38
|
+
const PLANNER_PATHS = new Set([
|
|
39
|
+
'$.generatedData.topic',
|
|
40
|
+
'$.generatedData.invokedActions',
|
|
41
|
+
'$.generatedData.actionsSequence',
|
|
42
|
+
]);
|
|
43
|
+
// --- Public API ---
|
|
44
|
+
/**
|
|
45
|
+
* Returns true if the content looks like a YAML TestSpec (has testCases + subjectName).
|
|
46
|
+
* Returns false for JSON EvalPayload, invalid content, or YAML missing required fields.
|
|
47
|
+
*/
|
|
48
|
+
function isYamlTestSpec(content) {
|
|
49
|
+
try {
|
|
50
|
+
const parsed = (0, yaml_1.parse)(content);
|
|
51
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
const obj = parsed;
|
|
55
|
+
return Array.isArray(obj.testCases) && typeof obj.subjectName === 'string';
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse a YAML string into a TestSpec.
|
|
63
|
+
* Throws if the content is not valid YAML or is missing required fields.
|
|
64
|
+
*/
|
|
65
|
+
function parseTestSpec(content) {
|
|
66
|
+
const parsed = (0, yaml_1.parse)(content);
|
|
67
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
68
|
+
throw new core_1.SfError('Invalid TestSpec: expected a YAML object');
|
|
69
|
+
}
|
|
70
|
+
const obj = parsed;
|
|
71
|
+
if (!Array.isArray(obj.testCases)) {
|
|
72
|
+
throw new core_1.SfError('Invalid TestSpec: missing testCases array');
|
|
73
|
+
}
|
|
74
|
+
if (typeof obj.subjectName !== 'string') {
|
|
75
|
+
throw new core_1.SfError('Invalid TestSpec: missing subjectName');
|
|
76
|
+
}
|
|
77
|
+
if (typeof obj.name !== 'string') {
|
|
78
|
+
throw new core_1.SfError('Invalid TestSpec: missing name');
|
|
79
|
+
}
|
|
80
|
+
return parsed;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Translate a full TestSpec into an EvalPayload.
|
|
84
|
+
*/
|
|
85
|
+
function translateTestSpec(spec) {
|
|
86
|
+
return {
|
|
87
|
+
tests: spec.testCases.map((tc, idx) => translateTestCase(tc, idx, spec.name)),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Translate a single TestCase into an EvalTest with ordered steps.
|
|
92
|
+
*/
|
|
93
|
+
function translateTestCase(testCase, index, specName) {
|
|
94
|
+
const id = specName ? `${specName}_case_${index}` : `test_case_${index}`;
|
|
95
|
+
const steps = [];
|
|
96
|
+
// 1. agent.create_session
|
|
97
|
+
const createSessionStep = {
|
|
98
|
+
type: 'agent.create_session',
|
|
99
|
+
id: 'cs',
|
|
100
|
+
use_agent_api: true,
|
|
101
|
+
};
|
|
102
|
+
if (testCase.contextVariables && testCase.contextVariables.length > 0) {
|
|
103
|
+
// Validate for duplicate names
|
|
104
|
+
const names = testCase.contextVariables.map((cv) => cv.name);
|
|
105
|
+
const duplicates = names.filter((name, idx) => names.indexOf(name) !== idx);
|
|
106
|
+
if (duplicates.length > 0) {
|
|
107
|
+
throw new core_1.SfError(`Duplicate contextVariable names found in test case ${index}: ${[...new Set(duplicates)].join(', ')}. Each contextVariable name must be unique.`);
|
|
108
|
+
}
|
|
109
|
+
createSessionStep.context_variables = Object.fromEntries(testCase.contextVariables.map((cv) => [cv.name, cv.value]));
|
|
110
|
+
}
|
|
111
|
+
steps.push(createSessionStep);
|
|
112
|
+
// 2. Conversation history — only user messages become send_message steps
|
|
113
|
+
let historyIdx = 0;
|
|
114
|
+
if (testCase.conversationHistory) {
|
|
115
|
+
for (const entry of testCase.conversationHistory) {
|
|
116
|
+
if (entry.role === 'user') {
|
|
117
|
+
steps.push({
|
|
118
|
+
type: 'agent.send_message',
|
|
119
|
+
id: `history_${historyIdx}`,
|
|
120
|
+
session_id: '{cs.session_id}',
|
|
121
|
+
utterance: entry.message,
|
|
122
|
+
});
|
|
123
|
+
historyIdx++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// 3. Test utterance
|
|
128
|
+
steps.push({
|
|
129
|
+
type: 'agent.send_message',
|
|
130
|
+
id: 'sm',
|
|
131
|
+
session_id: '{cs.session_id}',
|
|
132
|
+
utterance: testCase.utterance,
|
|
133
|
+
});
|
|
134
|
+
// 4. Determine if get_state is needed
|
|
135
|
+
const needsGetState = needsPlannerState(testCase);
|
|
136
|
+
if (needsGetState) {
|
|
137
|
+
steps.push({
|
|
138
|
+
type: 'agent.get_state',
|
|
139
|
+
id: 'gs',
|
|
140
|
+
session_id: '{cs.session_id}',
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// 5. Evaluators
|
|
144
|
+
if (testCase.expectedTopic !== undefined) {
|
|
145
|
+
steps.push({
|
|
146
|
+
type: 'evaluator.planner_topic_assertion',
|
|
147
|
+
id: 'check_topic',
|
|
148
|
+
expected: testCase.expectedTopic,
|
|
149
|
+
actual: '{gs.response.planner_response.lastExecution.topic}',
|
|
150
|
+
operator: 'contains',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (testCase.expectedActions !== undefined && testCase.expectedActions.length > 0) {
|
|
154
|
+
steps.push({
|
|
155
|
+
type: 'evaluator.planner_actions_assertion',
|
|
156
|
+
id: 'check_actions',
|
|
157
|
+
expected: testCase.expectedActions,
|
|
158
|
+
actual: '{gs.response.planner_response.lastExecution.invokedActions}',
|
|
159
|
+
operator: 'includes_items',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (testCase.expectedOutcome !== undefined) {
|
|
163
|
+
steps.push({
|
|
164
|
+
type: 'evaluator.bot_response_rating',
|
|
165
|
+
id: 'check_outcome',
|
|
166
|
+
utterance: testCase.utterance,
|
|
167
|
+
expected: testCase.expectedOutcome,
|
|
168
|
+
actual: '{sm.response}',
|
|
169
|
+
threshold: 3.0,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (testCase.customEvaluations) {
|
|
173
|
+
testCase.customEvaluations.forEach((customEval, customIdx) => {
|
|
174
|
+
const step = translateCustomEvaluation(customEval, customIdx);
|
|
175
|
+
steps.push(step);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return { id, steps };
|
|
179
|
+
}
|
|
180
|
+
// --- Internal helpers ---
|
|
181
|
+
/**
|
|
182
|
+
* Determine whether the get_state step is needed for this test case.
|
|
183
|
+
*/
|
|
184
|
+
function needsPlannerState(testCase) {
|
|
185
|
+
if (testCase.expectedTopic !== undefined)
|
|
186
|
+
return true;
|
|
187
|
+
if (testCase.expectedActions !== undefined && testCase.expectedActions.length > 0)
|
|
188
|
+
return true;
|
|
189
|
+
if (testCase.customEvaluations) {
|
|
190
|
+
for (const customEval of testCase.customEvaluations) {
|
|
191
|
+
for (const param of customEval.parameters) {
|
|
192
|
+
if (param.name === 'actual' && PLANNER_PATHS.has(param.value)) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Translate a single customEvaluation entry into an EvalStep.
|
|
202
|
+
*/
|
|
203
|
+
function translateCustomEvaluation(customEval, index) {
|
|
204
|
+
const evalType = CUSTOM_EVAL_TYPE_MAP[customEval.name] ?? `evaluator.${customEval.name}`;
|
|
205
|
+
let operator = '';
|
|
206
|
+
let actual = '';
|
|
207
|
+
let expected = '';
|
|
208
|
+
for (const param of customEval.parameters) {
|
|
209
|
+
if (param.name === 'operator') {
|
|
210
|
+
operator = param.value;
|
|
211
|
+
}
|
|
212
|
+
else if (param.name === 'actual') {
|
|
213
|
+
actual = mapActualPath(param.value);
|
|
214
|
+
}
|
|
215
|
+
else if (param.name === 'expected') {
|
|
216
|
+
expected = param.value;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
type: evalType,
|
|
221
|
+
id: `custom_${index}`,
|
|
222
|
+
operator,
|
|
223
|
+
actual,
|
|
224
|
+
expected,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Map an org-model JSONPath to the Eval API shorthand ref.
|
|
229
|
+
* Unknown paths are returned as-is.
|
|
230
|
+
*/
|
|
231
|
+
function mapActualPath(path) {
|
|
232
|
+
return ACTUAL_PATH_MAP[path] ?? path;
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=yamlSpecTranslator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yamlSpecTranslator.js","sourceRoot":"","sources":["../src/yamlSpecTranslator.ts"],"names":[],"mappings":"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"}
|