evaliphy 1.0.1-beta.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.
@@ -0,0 +1,474 @@
1
+ import { z } from "zod";
2
+ //#region packages/core/src/config/types.d.ts
3
+ /**
4
+ * Configuration for the build-in HTTP client.
5
+ * These settings will apply to the `httpClient` fixture in all evaluations.
6
+ */
7
+ interface HttpConfig {
8
+ /** The base URL to prepend to all request paths. */
9
+ baseUrl: string;
10
+ /** Global request timeout in milliseconds. */
11
+ timeout?: number;
12
+ /**
13
+ * Global retry configuration for failed requests (5xx or network errors).
14
+ */
15
+ retry?: {
16
+ /** Number of retry attempts before giving up. */attempts: number; /** Delay between retry attempts in milliseconds. */
17
+ delay: number;
18
+ };
19
+ /** Common HTTP headers to send with every request. */
20
+ headers?: Record<string, string>;
21
+ }
22
+ interface LLMJudgeConfig {
23
+ model: string;
24
+ provider: LLMProvider;
25
+ temperature?: number;
26
+ maxTokens?: number;
27
+ timeout?: number;
28
+ promptsDir?: string;
29
+ /**
30
+ * Whether to continue test execution even if an assertion fails.
31
+ * @default true
32
+ */
33
+ continueOnFailure?: boolean;
34
+ }
35
+ type LLMProvider = DirectProvider | GatewayProvider;
36
+ interface DirectProvider {
37
+ type: 'openai' | 'anthropic' | 'google' | 'mistral' | 'groq' | 'cohere';
38
+ apiKey?: string;
39
+ }
40
+ interface GatewayProvider {
41
+ type: 'gateway';
42
+ url: string;
43
+ apiKey?: string;
44
+ name?: string;
45
+ }
46
+ /**
47
+ * Main Evaliphy configuration object.
48
+ * Define this in `evaliphy.config.ts`.
49
+ */
50
+ interface EvaliphyConfig {
51
+ /** General settings for the HTTP client fixture. */
52
+ http?: HttpConfig;
53
+ /**
54
+ * LLM as Judge Config
55
+ */
56
+ llmAsJudgeConfig?: LLMJudgeConfig;
57
+ /**
58
+ * Config file to use
59
+ */
60
+ configFile?: string;
61
+ /** Global timeout for individual test functions (ms). */
62
+ timeout?: number;
63
+ /**
64
+ * List of reporters to use for evaluation results.
65
+ * Can be a string name of a built-in reporter or a custom reporter instance.
66
+ */
67
+ reporters?: (string | any)[] | string;
68
+ /** The root directory to search for evaluation files (default: './evals'). */
69
+ evalDir?: string;
70
+ /**
71
+ * Glob patterns to match evaluation files.
72
+ * (default: ['**\/*.eval.ts', '**\/*.eval.js'])
73
+ */
74
+ testMatch?: string[];
75
+ /** Glob patterns to exclude when scanning for tests. */
76
+ testIgnore?: string[];
77
+ }
78
+ //#endregion
79
+ //#region packages/core/src/collection/types.d.ts
80
+ /**
81
+ * Represents a value that may be a promise or a direct value.
82
+ */
83
+ type Awaitable<T> = Promise<T> | T;
84
+ /**
85
+ * Performance metrics for an evaluation request.
86
+ */
87
+ interface Timings {
88
+ /** Time to first byte in milliseconds. */
89
+ ttfb: number;
90
+ /** Total request duration in milliseconds. */
91
+ total: number;
92
+ /** Time until the last chunk was received in milliseconds (streaming only). */
93
+ streamEnd?: number;
94
+ }
95
+ /**
96
+ * Represents a standard response from the evaluation HTTP client.
97
+ */
98
+ interface EvalResponse {
99
+ /** The HTTP status code (e.g., 200, 404). */
100
+ status: number;
101
+ /** The response headers. */
102
+ headers: Headers;
103
+ /** Performance timings for the request, including TTFB and total duration. */
104
+ timings: Timings;
105
+ /** Parse the response body as JSON. */
106
+ json<T = unknown>(): Promise<T>;
107
+ /** Parse the response body as raw text. */
108
+ text(): Promise<string>;
109
+ /**
110
+ * The underlying Fetch Response object.
111
+ *
112
+ * @note If you console.log this property, it may appear as an empty object `{}`
113
+ * in some environments because it is a native stream-based object.
114
+ * Use `.json()` or `.text()` to access the results.
115
+ */
116
+ raw: Response;
117
+ }
118
+ /**
119
+ * A single chunk of data from a streaming response.
120
+ */
121
+ interface StreamChunk {
122
+ /** The text content of the chunk. */
123
+ text: string;
124
+ [key: string]: any;
125
+ }
126
+ /**
127
+ * Represents a streaming response from the evaluation HTTP client.
128
+ * Supports async iteration for streaming chunks.
129
+ */
130
+ interface StreamResponse {
131
+ /** Performance timings including stream completion. */
132
+ timings: Timings;
133
+ /** Iterate over incoming chunks of data. */
134
+ [Symbol.asyncIterator](): AsyncIterator<StreamChunk>;
135
+ /** Collect all stream chunks into a single concatenated string. */
136
+ collect(): Promise<string>;
137
+ }
138
+ /**
139
+ * Options to customize a single HTTP request.
140
+ */
141
+ interface RequestOptions {
142
+ /** Optional session ID to be sent with the request (overrides global session). */
143
+ sessionId?: string;
144
+ sessionKey?: string;
145
+ /** Additional HTTP headers. */
146
+ headers?: Record<string, string>;
147
+ /** Request timeout in milliseconds. */
148
+ timeout?: number;
149
+ /** Retry configuration for the request. */
150
+ retry?: {
151
+ /** Number of retry attempts. */attempts: number; /** Delay between retries in milliseconds. */
152
+ delay: number;
153
+ };
154
+ }
155
+ /**
156
+ * Interface for the Evaliphy HTTP client provided in test fixtures.csv.
157
+ *
158
+ * This client is optimized for testing RAG applications and LLM backends.
159
+ * It automatically handles common concerns like JSON serialization, retries,
160
+ * timeouts, and session management.
161
+ */
162
+ interface IHttpClient {
163
+ /**
164
+ * Sends a POST request with a JSON payload.
165
+ *
166
+ * @example
167
+ * ```typescript
168
+ * const response = await httpClient.post('/v1/chat', { message: 'hello' });
169
+ * const data = await response.json();
170
+ * ```
171
+ */
172
+ post(url: string, payload: any, options?: RequestOptions): Promise<EvalResponse>;
173
+ /**
174
+ * Sends a GET request to the specified endpoint.
175
+ *
176
+ * @example
177
+ * ```typescript
178
+ * const response = await httpClient.get('/health');
179
+ * if (response.status === 200) { ... }
180
+ * ```
181
+ */
182
+ get(url: string, options?: RequestOptions): Promise<EvalResponse>;
183
+ /**
184
+ * Sends a PUT request with a JSON payload.
185
+ */
186
+ put(url: string, payload: any, options?: RequestOptions): Promise<EvalResponse>;
187
+ /**
188
+ * Sends a PATCH request with a JSON payload.
189
+ */
190
+ patch(url: string, payload: any, options?: RequestOptions): Promise<EvalResponse>;
191
+ /**
192
+ * Sends a DELETE request.
193
+ */
194
+ delete(url: string, options?: RequestOptions): Promise<EvalResponse>;
195
+ /**
196
+ * Initiates a streaming request, typically used for Server-Sent Events (SSE)
197
+ * or real-time LLM completions.
198
+ *
199
+ * @example
200
+ * ```typescript
201
+ * const stream = await httpClient.stream('/v1/completions', { prompt: '...' });
202
+ * for await (const chunk of stream) {
203
+ * console.log(chunk.text);
204
+ * }
205
+ * ```
206
+ */
207
+ stream(url: string, payload: any, options?: RequestOptions): Promise<StreamResponse>;
208
+ /**
209
+ * Creates a new client instance scoped to a specific session.
210
+ * All subsequent requests from the returned client will include the provided
211
+ * session header, which is essential for evaluating multi-turn conversations.
212
+ *
213
+ * @param sessionKey - The header name used for session tracking (e.g., 'X-Session-Id').
214
+ * @param sessionId - The unique identifier for the session.
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * const sessionClient = httpClient.withSession('x-eval-id', 'user-123');
219
+ * await sessionClient.post('/chat', { ... }); // Includes x-eval-id header
220
+ * ```
221
+ */
222
+ withSession(sessionKey: string, sessionId: string): IHttpClient;
223
+ }
224
+ /**
225
+ * The set of fixtures.csv available to an evaluation test function.
226
+ */
227
+ interface EvaluationFixtures {
228
+ /** The pre-configured HTTP client for interacting with RAG endpoints. */
229
+ httpClient: IHttpClient;
230
+ /** The pre-configured LLM client for generating responses and objects. */
231
+ llmClient: ILLMClient;
232
+ }
233
+ interface LLMUsage {
234
+ totalTokens: number;
235
+ model: string;
236
+ provider: string;
237
+ durationMs: number;
238
+ }
239
+ interface LLMResponse {
240
+ response: string;
241
+ llmUsages: LLMUsage;
242
+ model: string;
243
+ }
244
+ interface LLMObjectResponse<T> {
245
+ object: T;
246
+ llmUsages: LLMUsage;
247
+ model: string;
248
+ }
249
+ interface ILLMClient {
250
+ generate(prompt: string): Promise<LLMResponse>;
251
+ generateObject<T>(prompt: string, schema: z.ZodType<T>): Promise<LLMObjectResponse<T>>;
252
+ }
253
+ //#endregion
254
+ //#region packages/core/src/evaluate.d.ts
255
+ /**
256
+ * The high-level function for defining RAG evaluations.
257
+ */
258
+ interface Evaluate {
259
+ /**
260
+ * Defines a new evaluation test case for a RAG application.
261
+ */
262
+ (name: string, fn: (fixtures: EvaluationFixtures) => Awaitable<void>): void;
263
+ /**
264
+ * Override specific configuration for all tests in the current file.
265
+ *
266
+ * @param config - A partial configuration object.
267
+ *
268
+ * @example
269
+ * evaluate.use({
270
+ * timeout: 5000,
271
+ * model: 'gpt-4o'
272
+ * })
273
+ */
274
+ use(config: Partial<EvaliphyConfig>): void;
275
+ /**
276
+ * Registers a hook to run before every test case in the current evaluation file.
277
+ */
278
+ beforeEach(fn: (fixtures: EvaluationFixtures) => Awaitable<void>): void;
279
+ /**
280
+ * Registers a hook to run after every test case in the current evaluation file.
281
+ */
282
+ afterEach(fn: (fixtures: EvaluationFixtures) => Awaitable<void>): void;
283
+ }
284
+ /**
285
+ * Defines a new evaluation test case for a RAG application.
286
+ *
287
+ * @param name - The descriptive name of the test case.
288
+ * @param fn - An asynchronous function that performs the evaluation. Receives fixtures.csv as its first argument.
289
+ *
290
+ * @example
291
+ * evaluate('Simple Greetings', async ({ httpClient }) => {
292
+ * const res = await httpClient.post('/chat', { input: 'Hi!' });
293
+ * // perform assertions here
294
+ * });
295
+ *
296
+ */
297
+ declare const evaluate: Evaluate;
298
+ //#endregion
299
+ //#region packages/core/src/config/defineConfig.d.ts
300
+ /**
301
+ * Utility function to define Evaliphy configuration with IDE support.
302
+ *
303
+ * @param config - The evaluation configuration object.
304
+ * @returns The same config object, but with type safety.
305
+ *
306
+ * @example
307
+ * export default defineConfig({
308
+ * http: { baseUrl: 'https://api.my-rag-app.com' },
309
+ * testDir: './tests/eval'
310
+ * });
311
+ */
312
+ declare function defineConfig(config: EvaliphyConfig): EvaliphyConfig;
313
+ //#endregion
314
+ //#region packages/assertions/src/engine/types.d.ts
315
+ interface EvalInput {
316
+ response: string;
317
+ query?: string;
318
+ context?: string | string[];
319
+ history?: Array<{
320
+ role: string;
321
+ content: string;
322
+ }>;
323
+ metadata?: Record<string, unknown>;
324
+ [key: string]: unknown;
325
+ }
326
+ /**
327
+ * Input for answer-related evaluations.
328
+ */
329
+ interface EvaluationSample extends EvalInput {
330
+ query: string;
331
+ }
332
+ interface EvalResult {
333
+ pass: boolean;
334
+ score?: number;
335
+ reason: string;
336
+ modelResults: Array<{
337
+ model: string;
338
+ score?: number;
339
+ pass: boolean;
340
+ reason: string;
341
+ }>;
342
+ }
343
+ /**
344
+ * Configuration for assertion.
345
+ */
346
+ interface AssertionOptions {
347
+ threshold?: number;
348
+ model?: string;
349
+ debug?: boolean;
350
+ promptVersion?: string;
351
+ returnResult?: boolean;
352
+ /**
353
+ * Whether to continue test execution even if this assertion fails.
354
+ * Overrides global `llmAsJudgeConfig.continueOnFailure`.
355
+ */
356
+ continueOnFailure?: boolean;
357
+ }
358
+ interface AssertionContext {
359
+ input: EvalInput;
360
+ options: AssertionOptions;
361
+ llmClient: ILLMClient;
362
+ config: EvaliphyConfig;
363
+ }
364
+ //#endregion
365
+ //#region packages/assertions/src/expect/expect.d.ts
366
+ /**
367
+ * Chainable matcher object for Evaliphy assertions.
368
+ * Provides a fluent API for asserting LLM outputs against various criteria.
369
+ */
370
+ declare class MatcherChain<T extends EvalInput = EvalInput> {
371
+ private context;
372
+ private isNot;
373
+ constructor(context: AssertionContext, isNot?: boolean);
374
+ /**
375
+ * Negates the next assertion in the chain.
376
+ *
377
+ * @example
378
+ * await expect(response).not.toBeFaithful("What is the capital of France?");
379
+ */
380
+ get not(): MatcherChain<T>;
381
+ /**
382
+ * Asserts that the response is faithful to the provided context.
383
+ *
384
+ * Faithfulness measures whether every claim in the response is grounded
385
+ * in the retrieved context. A response is unfaithful if it introduces
386
+ * information not present in the context, even if that information is
387
+ * factually correct.
388
+ *
389
+ * Scored 0.0 – 1.0 by an LLM judge using the configured judge model.
390
+ * Passes if the score meets or exceeds the threshold.
391
+ *
392
+ * @param options - Optional overrides for this assertion.
393
+ * @param options.threshold - Minimum score to pass (0.0 – 1.0).
394
+ * Defaults to `judge.thresholds.faithfulness` in config.
395
+ *
396
+ * @example
397
+ * // default threshold from config
398
+ * await expect({
399
+ * query: "What is the return policy?",
400
+ * response: "You can return items within 30 days.",
401
+ * context: "Returns are accepted within 30 days of purchase."
402
+ * }).toBeFaithful();
403
+ *
404
+ * @example
405
+ * // override threshold for this assertion only
406
+ * await expect({
407
+ * query: "What is the return policy?",
408
+ * response: "You can return items within 30 days.",
409
+ * context: "Returns are accepted within 30 days of purchase."
410
+ * }).toBeFaithful({ threshold: 0.9 });
411
+ *
412
+ * @throws {AssertionError} When the faithfulness score is below the threshold.
413
+ * The error includes the score, threshold, and judge reasoning.
414
+ *
415
+ * @see {@link toBeRelevant} to assert the response addresses the query
416
+ * @see {@link toBeGrounded} to assert claims are supported by the context
417
+ */
418
+ toBeFaithful(options?: AssertionOptions): Promise<EvalResult | void>;
419
+ /**
420
+ * Asserts that the response directly addresses the user's query.
421
+ *
422
+ * Relevance measures whether the response directly addresses the user's prompt
423
+ * without dodging, being overly vague, or talking about unrelated topics.
424
+ *
425
+ * @param options - Optional overrides for this assertion.
426
+ */
427
+ toBeRelevant(options?: AssertionOptions): Promise<EvalResult | void>;
428
+ /**
429
+ * Asserts that the response is supported by the provided context.
430
+ *
431
+ * Groundedness measures whether the claims made in the response are supported
432
+ * by the retrieved context.
433
+ *
434
+ * @param options - Optional overrides for this assertion.
435
+ */
436
+ toBeGrounded(options?: AssertionOptions): Promise<EvalResult | void>;
437
+ /**
438
+ * Asserts that the response is logically consistent and easy to follow.
439
+ *
440
+ * @param options - Optional overrides for this assertion.
441
+ */
442
+ toBeCoherent(options?: AssertionOptions): Promise<EvalResult | void>;
443
+ /**
444
+ * Asserts that the response contains no toxic, harmful, or biased content.
445
+ *
446
+ * @param options - Optional overrides for this assertion.
447
+ */
448
+ toBeHarmless(options?: AssertionOptions): Promise<EvalResult | void>;
449
+ }
450
+ /**
451
+ * Creates an expectation for a given LLM response or evaluation input.
452
+ * This is the entry point for all Evaliphy assertions.
453
+ *
454
+ * @param input - The LLM response string or a full {@link EvalInput} object.
455
+ * @returns A {@link MatcherChain} to perform assertions.
456
+ *
457
+ * @example
458
+ * // Asserting on a simple response string
459
+ * await expect("The capital of France is Paris").toBeFaithful("What is the capital of France?");
460
+ *
461
+ * @example
462
+ * // Asserting with full evaluation input
463
+ * await expect<EvaluationSample>({
464
+ * response: "You can find your API key in the dashboard.",
465
+ * context: "API keys are located in the 'Settings > API' section of the user dashboard.",
466
+ * query: "Where is my API key?"
467
+ * }).toBeFaithful();
468
+ *
469
+ * @throws {EvaliphyError} If llmAsJudgeConfig is missing from the configuration.
470
+ */
471
+ declare function expect<T extends EvalInput = EvalInput>(input: string | T): MatcherChain<T>;
472
+ //#endregion
473
+ export { type EvalInput, type EvalResult, type EvaliphyConfig, type EvaluationSample, defineConfig, evaluate, expect };
474
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../packages/core/src/config/types.ts","../packages/core/src/collection/types.ts","../packages/core/src/evaluate.ts","../packages/core/src/config/defineConfig.ts","../packages/assertions/src/engine/types.ts","../packages/assertions/src/expect/expect.ts"],"mappings":"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"}