@operor/testing 0.1.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/API_VALIDATION.md +572 -0
- package/dist/index.d.ts +414 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1608 -0
- package/dist/index.js.map +1 -0
- package/fixtures/sample-tests.csv +10 -0
- package/package.json +31 -0
- package/src/CSVLoader.ts +83 -0
- package/src/ConversationEvaluator.ts +254 -0
- package/src/ConversationRunner.ts +267 -0
- package/src/CustomerSimulator.ts +106 -0
- package/src/MockShopifySkill.ts +336 -0
- package/src/SimulationRunner.ts +425 -0
- package/src/SkillTestHarness.ts +220 -0
- package/src/TestCaseEvaluator.ts +296 -0
- package/src/TestSuiteRunner.ts +151 -0
- package/src/__tests__/CSVLoader.test.ts +122 -0
- package/src/__tests__/ConversationEvaluator.test.ts +221 -0
- package/src/__tests__/ConversationRunner.test.ts +270 -0
- package/src/__tests__/CustomerSimulator.test.ts +160 -0
- package/src/__tests__/SimulationRunner.test.ts +281 -0
- package/src/__tests__/SkillTestHarness.test.ts +181 -0
- package/src/__tests__/scenarios.test.ts +71 -0
- package/src/index.ts +32 -0
- package/src/scenarios/edge-cases.ts +52 -0
- package/src/scenarios/general.ts +37 -0
- package/src/scenarios/index.ts +32 -0
- package/src/scenarios/order-tracking.ts +56 -0
- package/src/scenarios.ts +142 -0
- package/src/types.ts +133 -0
- package/src/utils.ts +6 -0
- package/tsconfig.json +9 -0
- package/tsdown.config.ts +10 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import { LLMProvider } from "@operor/llm";
|
|
2
|
+
import { Operor, Skill, Tool } from "@operor/core";
|
|
3
|
+
|
|
4
|
+
//#region src/types.d.ts
|
|
5
|
+
interface TestCase {
|
|
6
|
+
id: string;
|
|
7
|
+
question: string;
|
|
8
|
+
expectedAnswer?: string;
|
|
9
|
+
expectedTools?: string[];
|
|
10
|
+
persona?: string;
|
|
11
|
+
tags?: string[];
|
|
12
|
+
metadata?: Record<string, any>;
|
|
13
|
+
}
|
|
14
|
+
interface TestCaseResult {
|
|
15
|
+
testCase: TestCase;
|
|
16
|
+
agentResponse: string;
|
|
17
|
+
toolsCalled: Array<{
|
|
18
|
+
name: string;
|
|
19
|
+
params: any;
|
|
20
|
+
result: any;
|
|
21
|
+
}>;
|
|
22
|
+
evaluation: {
|
|
23
|
+
passed: boolean;
|
|
24
|
+
score: number;
|
|
25
|
+
method: 'exact' | 'contains' | 'similarity' | 'llm_judge';
|
|
26
|
+
reasoning: string;
|
|
27
|
+
toolsCorrect: boolean;
|
|
28
|
+
};
|
|
29
|
+
duration: number;
|
|
30
|
+
cost: number;
|
|
31
|
+
}
|
|
32
|
+
interface TestSuiteResult {
|
|
33
|
+
total: number;
|
|
34
|
+
passed: number;
|
|
35
|
+
failed: number;
|
|
36
|
+
averageScore: number;
|
|
37
|
+
byTag: Record<string, {
|
|
38
|
+
total: number;
|
|
39
|
+
passed: number;
|
|
40
|
+
avgScore: number;
|
|
41
|
+
}>;
|
|
42
|
+
results: TestCaseResult[];
|
|
43
|
+
totalDuration: number;
|
|
44
|
+
totalCost: number;
|
|
45
|
+
}
|
|
46
|
+
interface CustomerPersona {
|
|
47
|
+
name: string;
|
|
48
|
+
style: 'polite' | 'frustrated' | 'confused' | 'terse' | 'verbose';
|
|
49
|
+
context?: string;
|
|
50
|
+
}
|
|
51
|
+
interface ConversationSuccessCriteria {
|
|
52
|
+
type: 'tool_called' | 'response_contains' | 'intent_matched' | 'turns_under' | 'custom';
|
|
53
|
+
value: string | number | ((history: ConversationTurn[]) => boolean);
|
|
54
|
+
}
|
|
55
|
+
interface ConversationScenario {
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
description: string;
|
|
59
|
+
persona: string;
|
|
60
|
+
maxTurns: number;
|
|
61
|
+
expectedTools?: string[];
|
|
62
|
+
expectedOutcome?: string;
|
|
63
|
+
successCriteria?: ConversationSuccessCriteria[];
|
|
64
|
+
scriptedResponses?: string[];
|
|
65
|
+
}
|
|
66
|
+
interface ConversationTurn {
|
|
67
|
+
role: 'customer' | 'agent';
|
|
68
|
+
message: string;
|
|
69
|
+
toolCalls?: Array<{
|
|
70
|
+
name: string;
|
|
71
|
+
params: any;
|
|
72
|
+
result: any;
|
|
73
|
+
}>;
|
|
74
|
+
}
|
|
75
|
+
interface CustomerSimulatorResponse {
|
|
76
|
+
message: string;
|
|
77
|
+
shouldContinue: boolean;
|
|
78
|
+
}
|
|
79
|
+
interface CriteriaResult {
|
|
80
|
+
criteria: ConversationSuccessCriteria;
|
|
81
|
+
passed: boolean;
|
|
82
|
+
details: string;
|
|
83
|
+
}
|
|
84
|
+
interface ConversationEvaluation {
|
|
85
|
+
overall: 'pass' | 'fail' | 'partial';
|
|
86
|
+
scores: {
|
|
87
|
+
accuracy: number;
|
|
88
|
+
toolUsage: number;
|
|
89
|
+
tone: number;
|
|
90
|
+
resolution: number;
|
|
91
|
+
};
|
|
92
|
+
feedback: string;
|
|
93
|
+
criteriaResults?: CriteriaResult[];
|
|
94
|
+
}
|
|
95
|
+
interface ConversationTestResult {
|
|
96
|
+
scenario: ConversationScenario;
|
|
97
|
+
passed: boolean;
|
|
98
|
+
turns: ConversationTurn[];
|
|
99
|
+
evaluation: ConversationEvaluation;
|
|
100
|
+
duration: number;
|
|
101
|
+
cost: number;
|
|
102
|
+
}
|
|
103
|
+
interface SimulationConfig {
|
|
104
|
+
testSuiteFiles?: string[];
|
|
105
|
+
conversationScenarios?: ConversationScenario[] | 'builtin';
|
|
106
|
+
totalConversations?: number;
|
|
107
|
+
pauseBetweenMs?: number;
|
|
108
|
+
evaluationStrategy?: 'exact' | 'similarity' | 'llm_judge';
|
|
109
|
+
integrationMode?: 'mock' | 'real' | 'dry-run';
|
|
110
|
+
allowWrites?: boolean;
|
|
111
|
+
timeout?: number;
|
|
112
|
+
parallel?: boolean;
|
|
113
|
+
}
|
|
114
|
+
interface SimulationReport {
|
|
115
|
+
timestamp: Date;
|
|
116
|
+
duration: number;
|
|
117
|
+
totalConversations: number;
|
|
118
|
+
passed: number;
|
|
119
|
+
failed: number;
|
|
120
|
+
averageScores: {
|
|
121
|
+
accuracy: number;
|
|
122
|
+
toolUsage: number;
|
|
123
|
+
tone: number;
|
|
124
|
+
resolution: number;
|
|
125
|
+
};
|
|
126
|
+
scenarioBreakdown: Array<{
|
|
127
|
+
scenario: string;
|
|
128
|
+
runs: number;
|
|
129
|
+
passRate: number;
|
|
130
|
+
avgScore: number;
|
|
131
|
+
}>;
|
|
132
|
+
toolUsageStats: Record<string, number>;
|
|
133
|
+
commonFailurePatterns: string[];
|
|
134
|
+
recommendations: string[];
|
|
135
|
+
testSuiteResults: TestSuiteResult[];
|
|
136
|
+
conversationResults: ConversationTestResult[];
|
|
137
|
+
overallPassed: boolean;
|
|
138
|
+
totalCost: number;
|
|
139
|
+
summary: {
|
|
140
|
+
totalTests: number;
|
|
141
|
+
passedTests: number;
|
|
142
|
+
failedTests: number;
|
|
143
|
+
totalConversations: number;
|
|
144
|
+
passedConversations: number;
|
|
145
|
+
failedConversations: number;
|
|
146
|
+
overallPassRate: number;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region src/CSVLoader.d.ts
|
|
151
|
+
declare class CSVLoader {
|
|
152
|
+
static fromFile(path: string): Promise<TestCase[]>;
|
|
153
|
+
static fromCSVString(csv: string): TestCase[];
|
|
154
|
+
static fromJSON(json: string): TestCase[];
|
|
155
|
+
}
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/TestCaseEvaluator.d.ts
|
|
158
|
+
interface EvaluationResult {
|
|
159
|
+
passed: boolean;
|
|
160
|
+
score: number;
|
|
161
|
+
method: 'exact' | 'contains' | 'similarity' | 'llm_judge';
|
|
162
|
+
reasoning: string;
|
|
163
|
+
toolsCorrect: boolean;
|
|
164
|
+
}
|
|
165
|
+
declare class TestCaseEvaluator {
|
|
166
|
+
private llm?;
|
|
167
|
+
constructor(llm?: LLMProvider);
|
|
168
|
+
evaluate(testCase: TestCase, agentResponse: string, toolsCalled: Array<{
|
|
169
|
+
name: string;
|
|
170
|
+
params: any;
|
|
171
|
+
result: any;
|
|
172
|
+
}>, strategy?: 'exact' | 'contains' | 'similarity' | 'semantic'): Promise<EvaluationResult>;
|
|
173
|
+
private validateTools;
|
|
174
|
+
private evaluateByExact;
|
|
175
|
+
private evaluateByContains;
|
|
176
|
+
private evaluateBySimilarity;
|
|
177
|
+
private evaluateByLLMComparison;
|
|
178
|
+
private evaluateByLLMJudge;
|
|
179
|
+
private normalizedLevenshtein;
|
|
180
|
+
}
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/TestSuiteRunner.d.ts
|
|
183
|
+
interface TestSuiteRunnerConfig {
|
|
184
|
+
agentOS: Operor;
|
|
185
|
+
llm?: LLMProvider;
|
|
186
|
+
timeout?: number;
|
|
187
|
+
strategy?: 'exact' | 'contains' | 'similarity' | 'semantic';
|
|
188
|
+
}
|
|
189
|
+
declare class TestSuiteRunner {
|
|
190
|
+
private evaluator;
|
|
191
|
+
private agentOS;
|
|
192
|
+
private timeout;
|
|
193
|
+
private strategy?;
|
|
194
|
+
constructor(config: TestSuiteRunnerConfig);
|
|
195
|
+
runSuite(testCases: TestCase[]): Promise<TestSuiteResult>;
|
|
196
|
+
private runTestCase;
|
|
197
|
+
}
|
|
198
|
+
//#endregion
|
|
199
|
+
//#region src/SkillTestHarness.d.ts
|
|
200
|
+
interface SkillTestHarnessConfig {
|
|
201
|
+
allowWrites?: boolean;
|
|
202
|
+
allowDestructive?: boolean;
|
|
203
|
+
maxOperations?: number;
|
|
204
|
+
timeoutMs?: number;
|
|
205
|
+
dryRun?: boolean;
|
|
206
|
+
}
|
|
207
|
+
interface AuditLogEntry {
|
|
208
|
+
name: string;
|
|
209
|
+
params: any;
|
|
210
|
+
result: any;
|
|
211
|
+
timestamp: number;
|
|
212
|
+
duration: number;
|
|
213
|
+
classification: 'read' | 'write' | 'destructive';
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Safety wrapper for Integration instances during testing.
|
|
217
|
+
* Provides operation limits, dry-run mode, and audit logging.
|
|
218
|
+
*/
|
|
219
|
+
declare class SkillTestHarness implements Skill {
|
|
220
|
+
readonly name: string;
|
|
221
|
+
private inner;
|
|
222
|
+
private config;
|
|
223
|
+
private auditLog;
|
|
224
|
+
private operationCount;
|
|
225
|
+
private static readonly READ_TOOLS;
|
|
226
|
+
private static readonly WRITE_TOOLS;
|
|
227
|
+
private static readonly DESTRUCTIVE_TOOLS;
|
|
228
|
+
constructor(inner: Skill, config?: SkillTestHarnessConfig);
|
|
229
|
+
initialize(): Promise<void>;
|
|
230
|
+
/** @deprecated Use initialize() instead. */
|
|
231
|
+
authenticate(): Promise<void>;
|
|
232
|
+
isReady(): boolean;
|
|
233
|
+
/** @deprecated Use isReady() instead. */
|
|
234
|
+
isAuthenticated(): boolean;
|
|
235
|
+
tools: Record<string, Tool>;
|
|
236
|
+
private wrapTools;
|
|
237
|
+
private classifyTool;
|
|
238
|
+
/**
|
|
239
|
+
* Get the audit log of all operations performed
|
|
240
|
+
*/
|
|
241
|
+
getAuditLog(): AuditLogEntry[];
|
|
242
|
+
/**
|
|
243
|
+
* Reset the audit log and operation counter
|
|
244
|
+
*/
|
|
245
|
+
resetAuditLog(): void;
|
|
246
|
+
/**
|
|
247
|
+
* Get the current operation count
|
|
248
|
+
*/
|
|
249
|
+
getOperationCount(): number;
|
|
250
|
+
}
|
|
251
|
+
//#endregion
|
|
252
|
+
//#region src/CustomerSimulator.d.ts
|
|
253
|
+
declare class CustomerSimulator {
|
|
254
|
+
private llm?;
|
|
255
|
+
constructor(options?: {
|
|
256
|
+
llmProvider?: LLMProvider;
|
|
257
|
+
});
|
|
258
|
+
generateMessage(persona: string, history: ConversationTurn[], context?: {
|
|
259
|
+
scenario?: string;
|
|
260
|
+
maxTurns?: number;
|
|
261
|
+
currentTurn?: number;
|
|
262
|
+
scriptedResponses?: string[];
|
|
263
|
+
}): Promise<CustomerSimulatorResponse>;
|
|
264
|
+
}
|
|
265
|
+
//#endregion
|
|
266
|
+
//#region src/ConversationEvaluator.d.ts
|
|
267
|
+
declare class ConversationEvaluator {
|
|
268
|
+
private llm?;
|
|
269
|
+
constructor(options?: {
|
|
270
|
+
llmProvider?: LLMProvider;
|
|
271
|
+
});
|
|
272
|
+
evaluate(config: {
|
|
273
|
+
scenario: string;
|
|
274
|
+
persona: string;
|
|
275
|
+
turns: ConversationTurn[];
|
|
276
|
+
toolsCalled: Array<{
|
|
277
|
+
name: string;
|
|
278
|
+
params: any;
|
|
279
|
+
result: any;
|
|
280
|
+
}>;
|
|
281
|
+
expectedTools?: string[];
|
|
282
|
+
expectedOutcome?: string;
|
|
283
|
+
successCriteria?: ConversationSuccessCriteria[];
|
|
284
|
+
}): Promise<ConversationEvaluation>;
|
|
285
|
+
}
|
|
286
|
+
//#endregion
|
|
287
|
+
//#region src/ConversationRunner.d.ts
|
|
288
|
+
interface ConversationRunnerConfig {
|
|
289
|
+
agentOS: Operor;
|
|
290
|
+
customerSimulator: CustomerSimulator;
|
|
291
|
+
conversationEvaluator: ConversationEvaluator;
|
|
292
|
+
timeout?: number;
|
|
293
|
+
verbose?: boolean;
|
|
294
|
+
}
|
|
295
|
+
declare class ConversationRunner {
|
|
296
|
+
private agentOS;
|
|
297
|
+
private customerSimulator;
|
|
298
|
+
private conversationEvaluator;
|
|
299
|
+
private timeout;
|
|
300
|
+
private verbose;
|
|
301
|
+
constructor(config: ConversationRunnerConfig);
|
|
302
|
+
runScenario(scenario: ConversationScenario): Promise<ConversationTestResult>;
|
|
303
|
+
runScenarios(scenarios: ConversationScenario[]): Promise<ConversationTestResult[]>;
|
|
304
|
+
private getMockProvider;
|
|
305
|
+
private waitForAgentResponse;
|
|
306
|
+
}
|
|
307
|
+
//#endregion
|
|
308
|
+
//#region src/SimulationRunner.d.ts
|
|
309
|
+
interface SimulationRunnerOptions {
|
|
310
|
+
agentOS: Operor;
|
|
311
|
+
config: SimulationConfig;
|
|
312
|
+
llm?: LLMProvider;
|
|
313
|
+
}
|
|
314
|
+
declare class SimulationRunner {
|
|
315
|
+
private agentOS;
|
|
316
|
+
private config;
|
|
317
|
+
private llm?;
|
|
318
|
+
constructor(options: SimulationRunnerOptions);
|
|
319
|
+
run(onProgress?: (completed: number, total: number, result: ConversationTestResult) => void): Promise<SimulationReport>;
|
|
320
|
+
static formatReport(report: SimulationReport): string;
|
|
321
|
+
private resolveScenarios;
|
|
322
|
+
private buildSchedule;
|
|
323
|
+
private computeAverageScores;
|
|
324
|
+
private computeScenarioBreakdown;
|
|
325
|
+
private computeToolUsageStats;
|
|
326
|
+
private analyzeFailuresWithLLM;
|
|
327
|
+
private heuristicFailurePatterns;
|
|
328
|
+
private heuristicRecommendations;
|
|
329
|
+
}
|
|
330
|
+
//#endregion
|
|
331
|
+
//#region src/scenarios.d.ts
|
|
332
|
+
declare const ECOMMERCE_SCENARIOS: ConversationScenario[];
|
|
333
|
+
//#endregion
|
|
334
|
+
//#region src/MockShopifySkill.d.ts
|
|
335
|
+
interface MockOrder {
|
|
336
|
+
id: string;
|
|
337
|
+
name: string;
|
|
338
|
+
status: string;
|
|
339
|
+
financialStatus: string;
|
|
340
|
+
createdAt: string;
|
|
341
|
+
expectedDelivery: Date;
|
|
342
|
+
actualDelivery?: Date;
|
|
343
|
+
tracking?: string;
|
|
344
|
+
trackingUrl?: string;
|
|
345
|
+
items: Array<{
|
|
346
|
+
name: string;
|
|
347
|
+
quantity: number;
|
|
348
|
+
price: string;
|
|
349
|
+
}>;
|
|
350
|
+
total: string;
|
|
351
|
+
}
|
|
352
|
+
interface MockProduct {
|
|
353
|
+
id: number;
|
|
354
|
+
title: string;
|
|
355
|
+
vendor: string;
|
|
356
|
+
type: string;
|
|
357
|
+
price: string;
|
|
358
|
+
available: boolean;
|
|
359
|
+
}
|
|
360
|
+
interface MockDiscount {
|
|
361
|
+
code: string;
|
|
362
|
+
percent: number;
|
|
363
|
+
validDays: number;
|
|
364
|
+
startsAt: string;
|
|
365
|
+
expiresAt: string;
|
|
366
|
+
priceRuleId: number;
|
|
367
|
+
createdAt: Date;
|
|
368
|
+
}
|
|
369
|
+
declare class MockShopifySkill implements Skill {
|
|
370
|
+
readonly name = "shopify";
|
|
371
|
+
private ready;
|
|
372
|
+
private mockOrders;
|
|
373
|
+
private mockProducts;
|
|
374
|
+
private mockDiscounts;
|
|
375
|
+
private nextPriceRuleId;
|
|
376
|
+
constructor();
|
|
377
|
+
initialize(): Promise<void>;
|
|
378
|
+
/** @deprecated Use initialize() instead. */
|
|
379
|
+
authenticate(): Promise<void>;
|
|
380
|
+
isReady(): boolean;
|
|
381
|
+
/** @deprecated Use isReady() instead. */
|
|
382
|
+
isAuthenticated(): boolean;
|
|
383
|
+
/**
|
|
384
|
+
* Reset all mock data to initial state (for testing)
|
|
385
|
+
*/
|
|
386
|
+
reset(): void;
|
|
387
|
+
/**
|
|
388
|
+
* Seed custom test data (for testing)
|
|
389
|
+
*/
|
|
390
|
+
seedData(config: {
|
|
391
|
+
orders?: Array<Partial<MockOrder>>;
|
|
392
|
+
products?: Array<Partial<MockProduct>>;
|
|
393
|
+
discounts?: Array<Partial<MockDiscount>>;
|
|
394
|
+
}): void;
|
|
395
|
+
private seedMockData;
|
|
396
|
+
tools: Record<string, Tool>;
|
|
397
|
+
/**
|
|
398
|
+
* Get all created discounts (for testing)
|
|
399
|
+
*/
|
|
400
|
+
getDiscounts(): MockDiscount[];
|
|
401
|
+
/**
|
|
402
|
+
* Get all orders (for testing)
|
|
403
|
+
*/
|
|
404
|
+
getOrders(): MockOrder[];
|
|
405
|
+
}
|
|
406
|
+
//#endregion
|
|
407
|
+
//#region src/utils.d.ts
|
|
408
|
+
/**
|
|
409
|
+
* Format current time as HH:MM:SS timestamp
|
|
410
|
+
*/
|
|
411
|
+
declare function formatTimestamp(): string;
|
|
412
|
+
//#endregion
|
|
413
|
+
export { type AuditLogEntry, CSVLoader, type ConversationEvaluation, ConversationEvaluator, ConversationRunner, type ConversationRunnerConfig, type ConversationScenario, type ConversationSuccessCriteria, type ConversationTestResult, type ConversationTurn, type CriteriaResult, type CustomerPersona, CustomerSimulator, type CustomerSimulatorResponse, ECOMMERCE_SCENARIOS, type EvaluationResult, type MockDiscount, type MockOrder, type MockProduct, MockShopifySkill, type SimulationConfig, type SimulationReport, SimulationRunner, type SimulationRunnerOptions, SkillTestHarness, type SkillTestHarnessConfig, type TestCase, TestCaseEvaluator, type TestCaseResult, type TestSuiteResult, TestSuiteRunner, type TestSuiteRunnerConfig, formatTimestamp };
|
|
414
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/CSVLoader.ts","../src/TestCaseEvaluator.ts","../src/TestSuiteRunner.ts","../src/SkillTestHarness.ts","../src/CustomerSimulator.ts","../src/ConversationEvaluator.ts","../src/ConversationRunner.ts","../src/SimulationRunner.ts","../src/scenarios.ts","../src/MockShopifySkill.ts","../src/utils.ts"],"mappings":"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"}
|