@agentv/core 0.2.3
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/LICENSE +21 -0
- package/README.md +78 -0
- package/dist/chunk-5REK5RSI.js +86 -0
- package/dist/chunk-5REK5RSI.js.map +1 -0
- package/dist/evaluation/validation/index.cjs +617 -0
- package/dist/evaluation/validation/index.cjs.map +1 -0
- package/dist/evaluation/validation/index.d.cts +56 -0
- package/dist/evaluation/validation/index.d.ts +56 -0
- package/dist/evaluation/validation/index.js +499 -0
- package/dist/evaluation/validation/index.js.map +1 -0
- package/dist/index.cjs +2204 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +406 -0
- package/dist/index.d.ts +406 -0
- package/dist/index.js +2079 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { AxChatRequest } from '@ax-llm/ax';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* JSON primitive values appearing in BbEval payloads.
|
|
5
|
+
*/
|
|
6
|
+
type JsonPrimitive = string | number | boolean | null;
|
|
7
|
+
/**
|
|
8
|
+
* Immutable JSON object representation for test fixtures.
|
|
9
|
+
*/
|
|
10
|
+
interface JsonObject {
|
|
11
|
+
readonly [key: string]: JsonValue;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Recursive JSON value supporting nested structures.
|
|
15
|
+
*/
|
|
16
|
+
type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];
|
|
17
|
+
declare const TEST_MESSAGE_ROLE_VALUES: readonly ["system", "user", "assistant", "tool"];
|
|
18
|
+
/**
|
|
19
|
+
* Immutable list of supported message roles.
|
|
20
|
+
*/
|
|
21
|
+
declare const TEST_MESSAGE_ROLES: readonly ["system", "user", "assistant", "tool"];
|
|
22
|
+
/**
|
|
23
|
+
* Role literals used by test messages.
|
|
24
|
+
*/
|
|
25
|
+
type TestMessageRole = (typeof TEST_MESSAGE_ROLE_VALUES)[number];
|
|
26
|
+
/**
|
|
27
|
+
* Text or structured payload attached to a message.
|
|
28
|
+
*/
|
|
29
|
+
type TestMessageContent = string | readonly JsonObject[];
|
|
30
|
+
/**
|
|
31
|
+
* System-authored instruction message.
|
|
32
|
+
*/
|
|
33
|
+
type SystemTestMessage = {
|
|
34
|
+
readonly role: "system";
|
|
35
|
+
readonly content: TestMessageContent;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* User-authored prompt message.
|
|
39
|
+
*/
|
|
40
|
+
type UserTestMessage = {
|
|
41
|
+
readonly role: "user";
|
|
42
|
+
readonly content: TestMessageContent;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Assistant response message.
|
|
46
|
+
*/
|
|
47
|
+
type AssistantTestMessage = {
|
|
48
|
+
readonly role: "assistant";
|
|
49
|
+
readonly content: TestMessageContent;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Tool invocation message.
|
|
53
|
+
*/
|
|
54
|
+
type ToolTestMessage = {
|
|
55
|
+
readonly role: "tool";
|
|
56
|
+
readonly content: TestMessageContent;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Conversation message union with role discrimination.
|
|
60
|
+
*/
|
|
61
|
+
type TestMessage = SystemTestMessage | UserTestMessage | AssistantTestMessage | ToolTestMessage;
|
|
62
|
+
/**
|
|
63
|
+
* Guard validating supported message roles.
|
|
64
|
+
*/
|
|
65
|
+
declare function isTestMessageRole(value: unknown): value is TestMessageRole;
|
|
66
|
+
/**
|
|
67
|
+
* Guard matching BbEval JSON objects.
|
|
68
|
+
*/
|
|
69
|
+
declare function isJsonObject(value: unknown): value is JsonObject;
|
|
70
|
+
/**
|
|
71
|
+
* Guard matching BbEval JSON values.
|
|
72
|
+
*/
|
|
73
|
+
declare function isJsonValue(value: unknown): value is JsonValue;
|
|
74
|
+
/**
|
|
75
|
+
* Guard validating raw test messages.
|
|
76
|
+
*/
|
|
77
|
+
declare function isTestMessage(value: unknown): value is TestMessage;
|
|
78
|
+
declare const GRADER_KIND_VALUES: readonly ["heuristic", "llm_judge"];
|
|
79
|
+
/**
|
|
80
|
+
* Supported grader implementations.
|
|
81
|
+
*/
|
|
82
|
+
declare const GRADER_KINDS: readonly ["heuristic", "llm_judge"];
|
|
83
|
+
/**
|
|
84
|
+
* Grader identifiers available to the pipeline.
|
|
85
|
+
*/
|
|
86
|
+
type GraderKind = (typeof GRADER_KIND_VALUES)[number];
|
|
87
|
+
/**
|
|
88
|
+
* Guard validating grader identifiers.
|
|
89
|
+
*/
|
|
90
|
+
declare function isGraderKind(value: unknown): value is GraderKind;
|
|
91
|
+
/**
|
|
92
|
+
* Test case definition sourced from BbEval specs.
|
|
93
|
+
*/
|
|
94
|
+
interface TestCase {
|
|
95
|
+
readonly id: string;
|
|
96
|
+
readonly conversation_id?: string;
|
|
97
|
+
readonly task: string;
|
|
98
|
+
readonly user_segments: readonly JsonObject[];
|
|
99
|
+
readonly expected_assistant_raw: string;
|
|
100
|
+
readonly guideline_paths: readonly string[];
|
|
101
|
+
readonly code_snippets: readonly string[];
|
|
102
|
+
readonly outcome: string;
|
|
103
|
+
readonly grader: GraderKind;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Evaluator scorecard for a single test case run.
|
|
107
|
+
*/
|
|
108
|
+
interface EvaluationResult {
|
|
109
|
+
readonly test_id: string;
|
|
110
|
+
readonly conversation_id?: string;
|
|
111
|
+
readonly score: number;
|
|
112
|
+
readonly hits: readonly string[];
|
|
113
|
+
readonly misses: readonly string[];
|
|
114
|
+
readonly model_answer: string;
|
|
115
|
+
readonly expected_aspect_count: number;
|
|
116
|
+
readonly target: string;
|
|
117
|
+
readonly timestamp: string;
|
|
118
|
+
readonly reasoning?: string;
|
|
119
|
+
readonly raw_aspects?: readonly string[];
|
|
120
|
+
readonly raw_request?: JsonObject;
|
|
121
|
+
readonly grader_raw_request?: JsonObject;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Convenience accessor matching the Python hit_count property.
|
|
125
|
+
*/
|
|
126
|
+
declare function getHitCount(result: Pick<EvaluationResult, "hits">): number;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Determine whether a path references guideline content (instructions or prompts).
|
|
130
|
+
*/
|
|
131
|
+
declare function isGuidelineFile(filePath: string): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Extract fenced code blocks from BbEval user segments.
|
|
134
|
+
*/
|
|
135
|
+
declare function extractCodeBlocks(segments: readonly JsonObject[]): readonly string[];
|
|
136
|
+
type LoadOptions = {
|
|
137
|
+
readonly verbose?: boolean;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Load test cases from a BbEval YAML specification file.
|
|
141
|
+
*/
|
|
142
|
+
declare function loadTestCases(testFilePath: string, repoRoot: URL | string, options?: LoadOptions): Promise<readonly TestCase[]>;
|
|
143
|
+
/**
|
|
144
|
+
* Build prompt inputs by consolidating user request context and guideline content.
|
|
145
|
+
*/
|
|
146
|
+
declare function buildPromptInputs(testCase: TestCase): Promise<{
|
|
147
|
+
request: string;
|
|
148
|
+
guidelines: string;
|
|
149
|
+
}>;
|
|
150
|
+
|
|
151
|
+
type ChatPrompt = AxChatRequest["chatPrompt"];
|
|
152
|
+
type ProviderKind = "azure" | "anthropic" | "gemini" | "mock" | "vscode" | "vscode-insiders";
|
|
153
|
+
interface ProviderRequest {
|
|
154
|
+
readonly prompt: string;
|
|
155
|
+
readonly guidelines?: string;
|
|
156
|
+
readonly chatPrompt?: ChatPrompt;
|
|
157
|
+
readonly attachments?: readonly string[];
|
|
158
|
+
readonly testCaseId?: string;
|
|
159
|
+
readonly attempt?: number;
|
|
160
|
+
readonly maxOutputTokens?: number;
|
|
161
|
+
readonly temperature?: number;
|
|
162
|
+
readonly metadata?: JsonObject;
|
|
163
|
+
readonly signal?: AbortSignal;
|
|
164
|
+
}
|
|
165
|
+
interface ProviderResponse {
|
|
166
|
+
readonly text: string;
|
|
167
|
+
readonly reasoning?: string;
|
|
168
|
+
readonly raw?: unknown;
|
|
169
|
+
readonly usage?: JsonObject;
|
|
170
|
+
}
|
|
171
|
+
interface Provider {
|
|
172
|
+
readonly id: string;
|
|
173
|
+
readonly kind: ProviderKind;
|
|
174
|
+
readonly targetName: string;
|
|
175
|
+
invoke(request: ProviderRequest): Promise<ProviderResponse>;
|
|
176
|
+
}
|
|
177
|
+
type EnvLookup = Readonly<Record<string, string | undefined>>;
|
|
178
|
+
interface TargetDefinition {
|
|
179
|
+
readonly name: string;
|
|
180
|
+
readonly provider: ProviderKind | string;
|
|
181
|
+
readonly settings?: Record<string, unknown> | undefined;
|
|
182
|
+
readonly judge_target?: string | undefined;
|
|
183
|
+
readonly workers?: number | undefined;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
interface AzureResolvedConfig {
|
|
187
|
+
readonly resourceName: string;
|
|
188
|
+
readonly deploymentName: string;
|
|
189
|
+
readonly apiKey: string;
|
|
190
|
+
readonly version?: string;
|
|
191
|
+
readonly temperature?: number;
|
|
192
|
+
readonly maxOutputTokens?: number;
|
|
193
|
+
}
|
|
194
|
+
interface AnthropicResolvedConfig {
|
|
195
|
+
readonly apiKey: string;
|
|
196
|
+
readonly model: string;
|
|
197
|
+
readonly temperature?: number;
|
|
198
|
+
readonly maxOutputTokens?: number;
|
|
199
|
+
readonly thinkingBudget?: number;
|
|
200
|
+
}
|
|
201
|
+
interface GeminiResolvedConfig {
|
|
202
|
+
readonly apiKey: string;
|
|
203
|
+
readonly model: string;
|
|
204
|
+
readonly temperature?: number;
|
|
205
|
+
readonly maxOutputTokens?: number;
|
|
206
|
+
}
|
|
207
|
+
interface MockResolvedConfig {
|
|
208
|
+
readonly response?: string;
|
|
209
|
+
readonly delayMs?: number;
|
|
210
|
+
readonly delayMinMs?: number;
|
|
211
|
+
readonly delayMaxMs?: number;
|
|
212
|
+
}
|
|
213
|
+
interface VSCodeResolvedConfig {
|
|
214
|
+
readonly command: string;
|
|
215
|
+
readonly waitForResponse: boolean;
|
|
216
|
+
readonly dryRun: boolean;
|
|
217
|
+
readonly subagentRoot?: string;
|
|
218
|
+
readonly workspaceTemplate?: string;
|
|
219
|
+
}
|
|
220
|
+
type ResolvedTarget = {
|
|
221
|
+
readonly kind: "azure";
|
|
222
|
+
readonly name: string;
|
|
223
|
+
readonly judgeTarget?: string;
|
|
224
|
+
readonly workers?: number;
|
|
225
|
+
readonly config: AzureResolvedConfig;
|
|
226
|
+
} | {
|
|
227
|
+
readonly kind: "anthropic";
|
|
228
|
+
readonly name: string;
|
|
229
|
+
readonly judgeTarget?: string;
|
|
230
|
+
readonly workers?: number;
|
|
231
|
+
readonly config: AnthropicResolvedConfig;
|
|
232
|
+
} | {
|
|
233
|
+
readonly kind: "gemini";
|
|
234
|
+
readonly name: string;
|
|
235
|
+
readonly judgeTarget?: string;
|
|
236
|
+
readonly workers?: number;
|
|
237
|
+
readonly config: GeminiResolvedConfig;
|
|
238
|
+
} | {
|
|
239
|
+
readonly kind: "mock";
|
|
240
|
+
readonly name: string;
|
|
241
|
+
readonly judgeTarget?: string;
|
|
242
|
+
readonly workers?: number;
|
|
243
|
+
readonly config: MockResolvedConfig;
|
|
244
|
+
} | {
|
|
245
|
+
readonly kind: "vscode" | "vscode-insiders";
|
|
246
|
+
readonly name: string;
|
|
247
|
+
readonly judgeTarget?: string;
|
|
248
|
+
readonly workers?: number;
|
|
249
|
+
readonly config: VSCodeResolvedConfig;
|
|
250
|
+
};
|
|
251
|
+
declare function resolveTargetDefinition(definition: TargetDefinition, env?: EnvLookup): ResolvedTarget;
|
|
252
|
+
|
|
253
|
+
declare function readTargetDefinitions(filePath: string): Promise<readonly TargetDefinition[]>;
|
|
254
|
+
declare function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[];
|
|
255
|
+
|
|
256
|
+
interface EnsureSubagentsOptions {
|
|
257
|
+
readonly kind: "vscode" | "vscode-insiders";
|
|
258
|
+
readonly count: number;
|
|
259
|
+
readonly verbose?: boolean;
|
|
260
|
+
}
|
|
261
|
+
interface EnsureSubagentsResult {
|
|
262
|
+
readonly provisioned: boolean;
|
|
263
|
+
readonly message?: string;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Ensures the required number of VSCode subagents are provisioned using the subagent package.
|
|
267
|
+
* This guarantees version compatibility by using the same subagent package version.
|
|
268
|
+
*
|
|
269
|
+
* @param options - Configuration for subagent provisioning
|
|
270
|
+
* @returns Information about the provisioning result
|
|
271
|
+
*/
|
|
272
|
+
declare function ensureVSCodeSubagents(options: EnsureSubagentsOptions): Promise<EnsureSubagentsResult>;
|
|
273
|
+
|
|
274
|
+
declare function createProvider(target: ResolvedTarget): Provider;
|
|
275
|
+
declare function resolveAndCreateProvider(definition: TargetDefinition, env?: EnvLookup): Provider;
|
|
276
|
+
|
|
277
|
+
interface HeuristicScore {
|
|
278
|
+
readonly score: number;
|
|
279
|
+
readonly hits: readonly string[];
|
|
280
|
+
readonly misses: readonly string[];
|
|
281
|
+
readonly hitCount: number;
|
|
282
|
+
readonly totalAspects: number;
|
|
283
|
+
readonly rawAspects: readonly string[];
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Extract individual evaluation aspects from the expected assistant response.
|
|
287
|
+
*/
|
|
288
|
+
declare function extractAspects(expectedResponse: string): readonly string[];
|
|
289
|
+
/**
|
|
290
|
+
* Determine which aspects were covered by the candidate response.
|
|
291
|
+
*/
|
|
292
|
+
declare function calculateHits(candidateResponse: string, expectedAspects: readonly string[]): readonly string[];
|
|
293
|
+
/**
|
|
294
|
+
* Determine which aspects were not satisfied by the candidate response.
|
|
295
|
+
*/
|
|
296
|
+
declare function calculateMisses(candidateResponse: string, expectedAspects: readonly string[], resolvedHits?: readonly string[]): readonly string[];
|
|
297
|
+
/**
|
|
298
|
+
* Evaluate the candidate response against the expected aspects.
|
|
299
|
+
*/
|
|
300
|
+
declare function scoreCandidateResponse(candidateResponse: string, expectedAspects: readonly string[]): HeuristicScore;
|
|
301
|
+
/**
|
|
302
|
+
* Detect common error-prefixed outputs from providers.
|
|
303
|
+
*/
|
|
304
|
+
declare function isErrorLike(text: string | undefined | null): boolean;
|
|
305
|
+
|
|
306
|
+
interface GradeContext {
|
|
307
|
+
readonly testCase: TestCase;
|
|
308
|
+
readonly candidate: string;
|
|
309
|
+
readonly target: ResolvedTarget;
|
|
310
|
+
readonly provider: Provider;
|
|
311
|
+
readonly attempt: number;
|
|
312
|
+
readonly promptInputs: {
|
|
313
|
+
readonly request: string;
|
|
314
|
+
readonly guidelines: string;
|
|
315
|
+
};
|
|
316
|
+
readonly now: Date;
|
|
317
|
+
readonly judgeProvider?: Provider;
|
|
318
|
+
}
|
|
319
|
+
interface GradeResult {
|
|
320
|
+
readonly score: number;
|
|
321
|
+
readonly hits: readonly string[];
|
|
322
|
+
readonly misses: readonly string[];
|
|
323
|
+
readonly expectedAspectCount: number;
|
|
324
|
+
readonly reasoning?: string;
|
|
325
|
+
readonly rawAspects?: readonly string[];
|
|
326
|
+
readonly graderRawRequest?: JsonObject;
|
|
327
|
+
}
|
|
328
|
+
interface Grader {
|
|
329
|
+
readonly kind: string;
|
|
330
|
+
grade(context: GradeContext): Promise<GradeResult> | GradeResult;
|
|
331
|
+
}
|
|
332
|
+
declare class HeuristicGrader implements Grader {
|
|
333
|
+
readonly kind = "heuristic";
|
|
334
|
+
grade(context: GradeContext): GradeResult;
|
|
335
|
+
}
|
|
336
|
+
type JudgeProviderResolver = (context: GradeContext) => Promise<Provider | undefined>;
|
|
337
|
+
interface QualityGraderOptions {
|
|
338
|
+
readonly resolveJudgeProvider: JudgeProviderResolver;
|
|
339
|
+
readonly maxOutputTokens?: number;
|
|
340
|
+
readonly temperature?: number;
|
|
341
|
+
}
|
|
342
|
+
declare class QualityGrader implements Grader {
|
|
343
|
+
readonly kind = "llm_judge";
|
|
344
|
+
private readonly resolveJudgeProvider;
|
|
345
|
+
private readonly maxOutputTokens?;
|
|
346
|
+
private readonly temperature?;
|
|
347
|
+
constructor(options: QualityGraderOptions);
|
|
348
|
+
grade(context: GradeContext): Promise<GradeResult>;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
352
|
+
interface EvaluationCache {
|
|
353
|
+
get(key: string): MaybePromise<ProviderResponse | undefined>;
|
|
354
|
+
set(key: string, value: ProviderResponse): MaybePromise<void>;
|
|
355
|
+
}
|
|
356
|
+
interface RunTestCaseOptions {
|
|
357
|
+
readonly testCase: TestCase;
|
|
358
|
+
readonly provider: Provider;
|
|
359
|
+
readonly target: ResolvedTarget;
|
|
360
|
+
readonly graders: Partial<Record<string, Grader>>;
|
|
361
|
+
readonly now?: () => Date;
|
|
362
|
+
readonly maxRetries?: number;
|
|
363
|
+
readonly agentTimeoutMs?: number;
|
|
364
|
+
readonly promptDumpDir?: string;
|
|
365
|
+
readonly cache?: EvaluationCache;
|
|
366
|
+
readonly useCache?: boolean;
|
|
367
|
+
readonly signal?: AbortSignal;
|
|
368
|
+
readonly judgeProvider?: Provider;
|
|
369
|
+
}
|
|
370
|
+
interface ProgressEvent {
|
|
371
|
+
readonly workerId: number;
|
|
372
|
+
readonly testId: string;
|
|
373
|
+
readonly status: "pending" | "running" | "completed" | "failed";
|
|
374
|
+
readonly startedAt?: number;
|
|
375
|
+
readonly completedAt?: number;
|
|
376
|
+
readonly error?: string;
|
|
377
|
+
}
|
|
378
|
+
interface RunEvaluationOptions {
|
|
379
|
+
readonly testFilePath: string;
|
|
380
|
+
readonly repoRoot: URL | string;
|
|
381
|
+
readonly target: ResolvedTarget;
|
|
382
|
+
readonly targets?: readonly TargetDefinition[];
|
|
383
|
+
readonly env?: EnvLookup;
|
|
384
|
+
readonly providerFactory?: (target: ResolvedTarget) => Provider;
|
|
385
|
+
readonly graders?: Partial<Record<string, Grader>>;
|
|
386
|
+
readonly maxRetries?: number;
|
|
387
|
+
readonly agentTimeoutMs?: number;
|
|
388
|
+
readonly promptDumpDir?: string;
|
|
389
|
+
readonly cache?: EvaluationCache;
|
|
390
|
+
readonly useCache?: boolean;
|
|
391
|
+
readonly now?: () => Date;
|
|
392
|
+
readonly testId?: string;
|
|
393
|
+
readonly verbose?: boolean;
|
|
394
|
+
readonly maxConcurrency?: number;
|
|
395
|
+
readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;
|
|
396
|
+
readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;
|
|
397
|
+
}
|
|
398
|
+
declare function runEvaluation(options: RunEvaluationOptions): Promise<readonly EvaluationResult[]>;
|
|
399
|
+
declare function runTestCase(options: RunTestCaseOptions): Promise<EvaluationResult>;
|
|
400
|
+
|
|
401
|
+
type AgentKernel = {
|
|
402
|
+
status: string;
|
|
403
|
+
};
|
|
404
|
+
declare function createAgentKernel(): AgentKernel;
|
|
405
|
+
|
|
406
|
+
export { type AgentKernel, type AnthropicResolvedConfig, type AssistantTestMessage, type AzureResolvedConfig, type EnsureSubagentsOptions, type EnsureSubagentsResult, type EnvLookup, type EvaluationCache, type EvaluationResult, GRADER_KINDS, type GeminiResolvedConfig, type GradeContext, type GradeResult, type Grader, type GraderKind, HeuristicGrader, type HeuristicScore, type JsonObject, type JsonPrimitive, type JsonValue, type MockResolvedConfig, type ProgressEvent, type Provider, type ProviderKind, type ProviderRequest, type ProviderResponse, QualityGrader, type QualityGraderOptions, type ResolvedTarget, type RunEvaluationOptions, type RunTestCaseOptions, type SystemTestMessage, TEST_MESSAGE_ROLES, type TargetDefinition, type TestCase, type TestMessage, type TestMessageContent, type TestMessageRole, type ToolTestMessage, type UserTestMessage, type VSCodeResolvedConfig, buildPromptInputs, calculateHits, calculateMisses, createAgentKernel, createProvider, ensureVSCodeSubagents, extractAspects, extractCodeBlocks, getHitCount, isErrorLike, isGraderKind, isGuidelineFile, isJsonObject, isJsonValue, isTestMessage, isTestMessageRole, listTargetNames, loadTestCases, readTargetDefinitions, resolveAndCreateProvider, resolveTargetDefinition, runEvaluation, runTestCase, scoreCandidateResponse };
|