universal-llm-client 3.1.0 → 4.0.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.
Files changed (41) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +177 -0
  3. package/dist/ai-model.d.ts +89 -0
  4. package/dist/ai-model.d.ts.map +1 -1
  5. package/dist/ai-model.js +96 -0
  6. package/dist/ai-model.js.map +1 -1
  7. package/dist/auditor.d.ts +5 -1
  8. package/dist/auditor.d.ts.map +1 -1
  9. package/dist/auditor.js +9 -0
  10. package/dist/auditor.js.map +1 -1
  11. package/dist/client.d.ts +14 -0
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +52 -0
  14. package/dist/client.js.map +1 -1
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +10 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/interfaces.d.ts +143 -1
  20. package/dist/interfaces.d.ts.map +1 -1
  21. package/dist/interfaces.js.map +1 -1
  22. package/dist/providers/google.d.ts.map +1 -1
  23. package/dist/providers/google.js +21 -0
  24. package/dist/providers/google.js.map +1 -1
  25. package/dist/providers/ollama.d.ts +13 -1
  26. package/dist/providers/ollama.d.ts.map +1 -1
  27. package/dist/providers/ollama.js +42 -7
  28. package/dist/providers/ollama.js.map +1 -1
  29. package/dist/providers/openai.d.ts +4 -0
  30. package/dist/providers/openai.d.ts.map +1 -1
  31. package/dist/providers/openai.js +51 -1
  32. package/dist/providers/openai.js.map +1 -1
  33. package/dist/router.d.ts +70 -0
  34. package/dist/router.d.ts.map +1 -1
  35. package/dist/router.js +343 -0
  36. package/dist/router.js.map +1 -1
  37. package/dist/structured-output.d.ts +467 -0
  38. package/dist/structured-output.d.ts.map +1 -0
  39. package/dist/structured-output.js +505 -0
  40. package/dist/structured-output.js.map +1 -0
  41. package/package.json +15 -4
package/CHANGELOG.md CHANGED
@@ -5,6 +5,45 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [4.0.0] - 2026-03-13
9
+
10
+ ### ⚠ BREAKING CHANGES
11
+
12
+ - **Zod 4 required** — `zod@^4.0.0` is now a peer dependency (upgraded from Zod 3). Consumers must install `zod@^4.0.0`.
13
+ - **Zero-dependency core** — Removed `zod-to-json-schema` from dependencies. Schema conversion now uses Zod 4's native `z.toJSONSchema()`. The library has no runtime dependencies (only peer deps).
14
+
15
+ ### Added
16
+
17
+ - **Structured Output** — First-class structured output with Zod schema validation
18
+ - `generateStructured(schema, messages, options)` — returns typed, validated output
19
+ - `tryParseStructured(schema, messages, options)` — non-throwing variant returning `Result<T>`
20
+ - `generateStructuredStream(schema, messages, options)` — streaming with partial validated objects
21
+ - `chat(messages, { output: { schema } })` — structured output via `output` parameter on `chat()`
22
+ - Custom `StructuredOutputError` with `rawOutput` and `cause` for debuggability
23
+ - **Provider Structured Output Support** — Native format negotiation per provider
24
+ - OpenAI: `response_format: { type: 'json_schema' }` with configurable `strict` mode
25
+ - Google/Vertex AI: `responseMimeType` + `responseSchema` with automatic unsupported feature stripping
26
+ - Ollama: `format` parameter with JSON Schema objects
27
+ - **Streaming JSON Parser** — `StreamingJsonParser` for progressive partial object validation
28
+ - **Audit Events** — `structured_request`, `structured_response`, `structured_validation_error` events
29
+ - **Schema Utilities** — `zodToJsonSchema()`, `normalizeJsonSchema()`, `stripUnsupportedFeatures()`, `getJsonSchema()`
30
+ - **`./structured-output` sub-path export** — Direct import of structured output utilities
31
+
32
+ ### Fixed
33
+
34
+ - Validation logic deduplicated into `BaseLLMClient` (was copy-pasted across 3 providers)
35
+ - Removed double validation (Router + Provider both validated the same response)
36
+ - Audit events no longer log `"assistant"` as the model name
37
+ - `chatStream()` now throws a clear error if `output` parameter is provided (use `generateStructuredStream()`)
38
+ - `zodToJsonSchema()` preserves `definitions`/`$defs` when `$ref` references exist in the schema tree
39
+ - OpenAI `strict` mode is now configurable via `output.strict` (defaults to `true`)
40
+
41
+ ### Deprecated
42
+
43
+ - `ChatOptions.schema`, `.jsonSchema`, `.schemaName`, `.schemaDescription` — use `output` parameter or `generateStructured()` instead
44
+
45
+ ---
46
+
8
47
  ## [3.1.0] - 2026-03-12
9
48
 
10
49
  ### Added
package/README.md CHANGED
@@ -27,6 +27,7 @@ const response = await model.chat([
27
27
 
28
28
  - 🔄 **Transparent Failover** — Priority-ordered provider chain with retries, health tracking, and cooldowns
29
29
  - 🛠️ **Tool Calling** — Register tools once, works across all providers. Autonomous multi-turn execution loop
30
+ - 📋 **Structured Output** — Zod schema validation, JSON Schema support, streaming, and type-safe responses
30
31
  - 🌊 **Streaming** — First-class async generator streaming with pluggable decoder strategies
31
32
  - 🧠 **Reasoning** — Native `<think>` tag parsing, interleaved reasoning, and model thinking support
32
33
  - 🔍 **Observability** — Built-in auditor interface for logging, cost tracking, and behavioral analysis
@@ -183,6 +184,133 @@ const vectors = await embedModel.embedArray(['Hello', 'World']);
183
184
  // [[0.006, ...], [0.012, ...]]
184
185
  ```
185
186
 
187
+ ### Structured Output
188
+
189
+ Get typed, validated JSON responses from any LLM using Zod schemas:
190
+
191
+ ```typescript
192
+ import { AIModel } from 'universal-llm-client';
193
+ import { z } from 'zod';
194
+
195
+ const model = new AIModel({
196
+ model: 'gemini-2.5-flash',
197
+ providers: [
198
+ { type: 'google', apiKey: process.env.GOOGLE_API_KEY },
199
+ { type: 'ollama' },
200
+ ],
201
+ });
202
+
203
+ // Define your schema
204
+ const UserSchema = z.object({
205
+ name: z.string(),
206
+ age: z.number(),
207
+ email: z.string().email(),
208
+ interests: z.array(z.string()),
209
+ });
210
+
211
+ // Method 1: generateStructured (throws on validation failure)
212
+ const user = await model.generateStructured(UserSchema, [
213
+ { role: 'user', content: 'Generate a user profile for a software developer' },
214
+ ]);
215
+
216
+ console.log(user.name); // TypeScript knows this is string
217
+ console.log(user.age); // TypeScript knows this is number
218
+ console.log(user.email); // TypeScript knows this is string
219
+ console.log(user.interests); // TypeScript knows this is string[]
220
+ ```
221
+
222
+ **Non-throwing variant:**
223
+
224
+ ```typescript
225
+ // Method 2: tryParseStructured (returns result object, never throws)
226
+ const result = await model.tryParseStructured(UserSchema, messages);
227
+
228
+ if (result.ok) {
229
+ console.log('User:', result.value.name);
230
+ } else {
231
+ console.log('Error:', result.error.message);
232
+ console.log('Raw LLM output:', result.rawOutput);
233
+ }
234
+ ```
235
+
236
+ **Via chat options:**
237
+
238
+ ```typescript
239
+ // Method 3: chat with output parameter
240
+ const response = await model.chat(messages, {
241
+ output: { schema: UserSchema },
242
+ });
243
+
244
+ // response.structured is typed as { name: string, age: number, ... }
245
+ if (response.structured) {
246
+ console.log(response.structured.name);
247
+ }
248
+ ```
249
+
250
+ **Streaming structured output:**
251
+
252
+ ```typescript
253
+ // Stream partial validated objects as JSON generates
254
+ for await (const partial of model.generateStructuredStream(UserSchema, messages)) {
255
+ console.log('Partial:', partial);
256
+ // Partial: { name: 'Alice' }
257
+ // Partial: { name: 'Alice', age: 30 }
258
+ // Partial: { name: 'Alice', age: 30, email: 'alice@example.com' }
259
+ }
260
+ ```
261
+
262
+ **Raw JSON Schema (without Zod):**
263
+
264
+ ```typescript
265
+ const response = await model.chat(messages, {
266
+ jsonSchema: {
267
+ type: 'object',
268
+ properties: {
269
+ name: { type: 'string' },
270
+ age: { type: 'number' },
271
+ },
272
+ required: ['name', 'age'],
273
+ },
274
+ name: 'Person', // Optional, used for LLM guidance
275
+ });
276
+ ```
277
+
278
+ **Separate module import (tree-shaking):**
279
+
280
+ ```typescript
281
+ // Import only structured output types if you don't need the full client
282
+ import {
283
+ StructuredOutputError,
284
+ type StructuredOutputResult,
285
+ type StructuredOutputOptions,
286
+ parseStructured,
287
+ tryParseStructured,
288
+ zodToJsonSchema,
289
+ } from 'universal-llm-client/structured-output';
290
+ ```
291
+
292
+ **Vision with structured output:**
293
+
294
+ ```typescript
295
+ const ImageAnalysisSchema = z.object({
296
+ objects: z.array(z.string()),
297
+ scene: z.string(),
298
+ mood: z.string(),
299
+ });
300
+
301
+ const response = await model.generateStructured(ImageAnalysisSchema, [
302
+ multimodalMessage('Analyze this image', ['https://example.com/photo.jpg']),
303
+ ]);
304
+ ```
305
+
306
+ **Provider compatibility:**
307
+
308
+ | Provider | Method | Notes |
309
+ |----------|--------|-------|
310
+ | OpenAI | `response_format.json_schema` | Strict mode enabled |
311
+ | Ollama | `format: { schema }` | Model must support grammar |
312
+ | Google | `responseMimeType + responseSchema` | Some features stripped |
313
+
186
314
  ### Observability
187
315
 
188
316
  ```typescript
@@ -308,6 +436,9 @@ new AIModel(config: AIModelConfig)
308
436
  | `chat(messages, options?)` | `Promise<LLMChatResponse>` | Send chat request |
309
437
  | `chatWithTools(messages, options?)` | `Promise<LLMChatResponse>` | Chat with autonomous tool execution |
310
438
  | `chatStream(messages, options?)` | `AsyncGenerator<DecodedEvent>` | Stream chat response |
439
+ | `generateStructured(schema, messages, options?)` | `Promise<T>` | Generate typed JSON validated against Zod schema |
440
+ | `tryParseStructured(schema, messages, options?)` | `Promise<StructuredOutputResult<T>>` | Non-throwing variant returning result object |
441
+ | `generateStructuredStream(schema, messages, options?)` | `AsyncGenerator<T, T>` | Stream partial validated objects as JSON generates |
311
442
  | `embed(text)` | `Promise<number[]>` | Generate single embedding |
312
443
  | `embedArray(texts)` | `Promise<number[][]>` | Generate batch embeddings |
313
444
  | `registerTool(name, desc, params, handler)` | `void` | Register a callable tool |
@@ -318,6 +449,52 @@ new AIModel(config: AIModelConfig)
318
449
  | `setModel(name)` | `void` | Switch model at runtime |
319
450
  | `dispose()` | `Promise<void>` | Clean shutdown |
320
451
 
452
+ ### Structured Output
453
+
454
+ ```typescript
455
+ import { z } from 'zod';
456
+
457
+ // Define your schema
458
+ const UserSchema = z.object({
459
+ name: z.string(),
460
+ age: z.number(),
461
+ email: z.string().email(),
462
+ });
463
+
464
+ // Generate typed JSON
465
+ const user = await model.generateStructured(UserSchema, messages);
466
+ // TypeScript infers: { name: string; age: number; email: string }
467
+
468
+ // Non-throwing variant
469
+ const result = await model.tryParseStructured(UserSchema, messages);
470
+ if (result.ok) {
471
+ console.log(result.value.name); // Fully typed
472
+ } else {
473
+ console.log(result.error.message);
474
+ }
475
+
476
+ // Stream partial objects
477
+ for await (const partial of model.generateStructuredStream(UserSchema, messages)) {
478
+ console.log(partial); // Partial validated objects
479
+ }
480
+ ```
481
+
482
+ **Separate module import (tree-shaking):**
483
+
484
+ ```typescript
485
+ import {
486
+ StructuredOutputError,
487
+ type StructuredOutputResult,
488
+ parseStructured,
489
+ tryParseStructured,
490
+ zodToJsonSchema,
491
+ } from 'universal-llm-client/structured-output';
492
+
493
+ // Use without importing the full client
494
+ const schema = z.object({ name: z.string() });
495
+ const jsonSchema = zodToJsonSchema(schema);
496
+ ```
497
+
321
498
  ### `ToolBuilder` / `ToolExecutor`
322
499
 
323
500
  ```typescript
@@ -9,6 +9,8 @@
9
9
  import { type AIModelConfig, type LLMChatMessage, type LLMChatResponse, type ChatOptions, type ModelMetadata, type LLMFunction, type ToolHandler } from './interfaces.js';
10
10
  import type { DecodedEvent } from './stream-decoder.js';
11
11
  import { type ProviderStatus } from './router.js';
12
+ import { type StructuredOutputResult } from './structured-output.js';
13
+ import { z } from 'zod';
12
14
  export declare class AIModel {
13
15
  private router;
14
16
  private auditor;
@@ -22,6 +24,93 @@ export declare class AIModel {
22
24
  }): Promise<LLMChatResponse>;
23
25
  /** Stream chat response with pluggable decoder strategy */
24
26
  chatStream(messages: LLMChatMessage[], options?: ChatOptions): AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown>;
27
+ /**
28
+ * Generate structured output from the LLM with automatic failover.
29
+ * Validates the response against the provided Zod schema.
30
+ * Throws StructuredOutputError on validation failure.
31
+ *
32
+ * @template T The type inferred from the Zod schema
33
+ * @param schema Zod schema for validation
34
+ * @param messages Chat messages to send
35
+ * @param options Additional options (temperature, maxTokens, etc.)
36
+ * @returns Promise resolving to validated structured output
37
+ * @throws StructuredOutputError if JSON parsing fails or schema validation fails
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const UserSchema = z.object({
42
+ * name: z.string(),
43
+ * age: z.number(),
44
+ * });
45
+ *
46
+ * const user = await model.generateStructured(UserSchema, [
47
+ * { role: 'user', content: 'Generate a user profile' },
48
+ * ]);
49
+ * // user.name: string, user.age: number
50
+ * ```
51
+ */
52
+ generateStructured<T>(schema: z.ZodType<T>, messages: LLMChatMessage[], options?: ChatOptions): Promise<T>;
53
+ /**
54
+ * Try to generate structured output, returning a result object instead of throwing.
55
+ * Same as generateStructured but returns { ok: true, value } on success
56
+ * and { ok: false, error, rawOutput } on failure.
57
+ *
58
+ * @template T The type inferred from the Zod schema
59
+ * @param schema Zod schema for validation
60
+ * @param messages Chat messages to send
61
+ * @param options Additional options (temperature, maxTokens, etc.)
62
+ * @returns StructuredOutputResult<T> - either success with value or failure with error
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const result = await model.tryParseStructured(UserSchema, messages);
67
+ *
68
+ * if (result.ok) {
69
+ * console.log('User:', result.value.name);
70
+ * } else {
71
+ * console.log('Error:', result.error.message);
72
+ * console.log('Raw output:', result.rawOutput);
73
+ * }
74
+ * ```
75
+ */
76
+ tryParseStructured<T>(schema: z.ZodType<T>, messages: LLMChatMessage[], options?: ChatOptions): Promise<StructuredOutputResult<T>>;
77
+ /**
78
+ * Stream structured output with partial validated objects.
79
+ *
80
+ * Yields partial validated objects as JSON generates, then returns the
81
+ * complete validated object on stream completion.
82
+ *
83
+ * For invalid partial JSON, no yield occurs (partial validation is best-effort).
84
+ * On stream completion, if the final JSON fails validation, throws StructuredOutputError.
85
+ *
86
+ * @template T The type inferred from the Zod schema
87
+ * @param schema Zod schema for validation
88
+ * @param messages Chat messages to send
89
+ * @param options Additional options (temperature, maxTokens, etc.)
90
+ * @yields Partial validated objects as the JSON stream progresses
91
+ * @returns Complete validated object on stream completion
92
+ * @throws StructuredOutputError if final validation fails
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const UserSchema = z.object({
97
+ * name: z.string(),
98
+ * age: z.number(),
99
+ * });
100
+ *
101
+ * const stream = model.generateStructuredStream(UserSchema, [
102
+ * { role: 'user', content: 'Generate a user' },
103
+ * ]);
104
+ *
105
+ * for await (const partial of stream) {
106
+ * console.log('Partial user:', partial);
107
+ * // Partial user: { name: 'Alice' }
108
+ * // Partial user: { name: 'Alice', age: 30 }
109
+ * }
110
+ * // Stream returns complete validated object on completion
111
+ * ```
112
+ */
113
+ generateStructuredStream<T>(schema: z.ZodType<T>, messages: LLMChatMessage[], options?: ChatOptions): AsyncGenerator<T, T, unknown>;
25
114
  /** Generate embedding for a single text */
26
115
  embed(text: string): Promise<number[]>;
27
116
  /** Generate embeddings for multiple texts */
@@ -1 +1 @@
1
- {"version":3,"file":"ai-model.d.ts","sourceRoot":"","sources":["../src/ai-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEH,KAAK,aAAa,EAGlB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAuB7E,qBAAa,OAAO;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IA6BjC,mEAAmE;IAC7D,IAAI,CACN,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,eAAe,CAAC;IAI3B,2DAA2D;IACrD,aAAa,CACf,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC,eAAe,CAAC;IAI3B,2DAA2D;IACpD,UAAU,CACb,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE,WAAW,GACtB,cAAc,CAAC,YAAY,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC;IAQhE,2CAA2C;IACrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI5C,6CAA6C;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAQtD,uEAAuE;IACvE,YAAY,CACR,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC,EACrC,OAAO,EAAE,WAAW,GACrB,IAAI;IAIP,sCAAsC;IACtC,aAAa,CACT,KAAK,EAAE,KAAK,CAAC;QACT,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;QACtC,OAAO,EAAE,WAAW,CAAC;KACxB,CAAC,GACH,IAAI;IAQP,yDAAyD;IACnD,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIpC,0EAA0E;IACpE,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC;IAI5C,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM5B,iCAAiC;IACjC,IAAI,KAAK,IAAI,MAAM,CAElB;IAMD,oDAAoD;IACpD,iBAAiB,IAAI,cAAc,EAAE;IAQrC,2DAA2D;IACrD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,aAAa;CAGxB"}
1
+ {"version":3,"file":"ai-model.d.ts","sourceRoot":"","sources":["../src/ai-model.ts"],"names":[],"mappings":"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"}
package/dist/ai-model.js CHANGED
@@ -64,6 +64,102 @@ export class AIModel {
64
64
  return yield* this.router.chatStream(messages, options);
65
65
  }
66
66
  // ========================================================================
67
+ // Structured Output
68
+ // ========================================================================
69
+ /**
70
+ * Generate structured output from the LLM with automatic failover.
71
+ * Validates the response against the provided Zod schema.
72
+ * Throws StructuredOutputError on validation failure.
73
+ *
74
+ * @template T The type inferred from the Zod schema
75
+ * @param schema Zod schema for validation
76
+ * @param messages Chat messages to send
77
+ * @param options Additional options (temperature, maxTokens, etc.)
78
+ * @returns Promise resolving to validated structured output
79
+ * @throws StructuredOutputError if JSON parsing fails or schema validation fails
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const UserSchema = z.object({
84
+ * name: z.string(),
85
+ * age: z.number(),
86
+ * });
87
+ *
88
+ * const user = await model.generateStructured(UserSchema, [
89
+ * { role: 'user', content: 'Generate a user profile' },
90
+ * ]);
91
+ * // user.name: string, user.age: number
92
+ * ```
93
+ */
94
+ async generateStructured(schema, messages, options) {
95
+ return this.router.generateStructured(schema, messages, options);
96
+ }
97
+ /**
98
+ * Try to generate structured output, returning a result object instead of throwing.
99
+ * Same as generateStructured but returns { ok: true, value } on success
100
+ * and { ok: false, error, rawOutput } on failure.
101
+ *
102
+ * @template T The type inferred from the Zod schema
103
+ * @param schema Zod schema for validation
104
+ * @param messages Chat messages to send
105
+ * @param options Additional options (temperature, maxTokens, etc.)
106
+ * @returns StructuredOutputResult<T> - either success with value or failure with error
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * const result = await model.tryParseStructured(UserSchema, messages);
111
+ *
112
+ * if (result.ok) {
113
+ * console.log('User:', result.value.name);
114
+ * } else {
115
+ * console.log('Error:', result.error.message);
116
+ * console.log('Raw output:', result.rawOutput);
117
+ * }
118
+ * ```
119
+ */
120
+ async tryParseStructured(schema, messages, options) {
121
+ return this.router.tryParseStructured(schema, messages, options);
122
+ }
123
+ /**
124
+ * Stream structured output with partial validated objects.
125
+ *
126
+ * Yields partial validated objects as JSON generates, then returns the
127
+ * complete validated object on stream completion.
128
+ *
129
+ * For invalid partial JSON, no yield occurs (partial validation is best-effort).
130
+ * On stream completion, if the final JSON fails validation, throws StructuredOutputError.
131
+ *
132
+ * @template T The type inferred from the Zod schema
133
+ * @param schema Zod schema for validation
134
+ * @param messages Chat messages to send
135
+ * @param options Additional options (temperature, maxTokens, etc.)
136
+ * @yields Partial validated objects as the JSON stream progresses
137
+ * @returns Complete validated object on stream completion
138
+ * @throws StructuredOutputError if final validation fails
139
+ *
140
+ * @example
141
+ * ```typescript
142
+ * const UserSchema = z.object({
143
+ * name: z.string(),
144
+ * age: z.number(),
145
+ * });
146
+ *
147
+ * const stream = model.generateStructuredStream(UserSchema, [
148
+ * { role: 'user', content: 'Generate a user' },
149
+ * ]);
150
+ *
151
+ * for await (const partial of stream) {
152
+ * console.log('Partial user:', partial);
153
+ * // Partial user: { name: 'Alice' }
154
+ * // Partial user: { name: 'Alice', age: 30 }
155
+ * }
156
+ * // Stream returns complete validated object on completion
157
+ * ```
158
+ */
159
+ async *generateStructuredStream(schema, messages, options) {
160
+ return yield* this.router.generateStructuredStream(schema, messages, options);
161
+ }
162
+ // ========================================================================
67
163
  // Embeddings
68
164
  // ========================================================================
69
165
  /** Generate embedding for a single text */
@@ -1 +1 @@
1
- {"version":3,"file":"ai-model.js","sourceRoot":"","sources":["../src/ai-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-model.js","sourceRoot":"","sources":["../src/ai-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,OAAO,EAAE,MAAM,EAA0C,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOrD,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,YAAY,GAA2B;IACzC,MAAM,EAAE,wBAAwB;IAChC,MAAM,EAAE,wBAAwB;IAChC,QAAQ,EAAE,uBAAuB;IACjC,oDAAoD;CACvD,CAAC;AAEF,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E,MAAM,OAAO,OAAO;IACR,MAAM,CAAS;IACf,OAAO,CAAU;IACjB,MAAM,CAAgB;IAE9B,YAAY,MAAqB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,WAAW,EAAE,CAAC;QAEnD,MAAM,YAAY,GAAiB;YAC/B,kBAAkB,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;QAEvC,gCAAgC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YACjD,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAE7D,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBACpB,EAAE;gBACF,MAAM;gBACN,QAAQ,EAAE,cAAc,CAAC,QAAQ,IAAI,CAAC;gBACtC,aAAa,EAAE,cAAc,CAAC,KAAK;aACtC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,OAAO;IACP,2EAA2E;IAE3E,mEAAmE;IACnE,KAAK,CAAC,IAAI,CACN,QAA0B,EAC1B,OAAqB;QAErB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,aAAa,CACf,QAA0B,EAC1B,OAAkD;QAElD,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,CAAC,UAAU,CACb,QAA0B,EAC1B,OAAqB;QAErB,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,2EAA2E;IAC3E,oBAAoB;IACpB,2EAA2E;IAE3E;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,kBAAkB,CACpB,MAAoB,EACpB,QAA0B,EAC1B,OAAqB;QAErB,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,KAAK,CAAC,kBAAkB,CACpB,MAAoB,EACpB,QAA0B,EAC1B,OAAqB;QAErB,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,KAAK,CAAC,CAAC,wBAAwB,CAC3B,MAAoB,EACpB,QAA0B,EAC1B,OAAqB;QAErB,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAED,2EAA2E;IAC3E,aAAa;IACb,2EAA2E;IAE3E,2CAA2C;IAC3C,KAAK,CAAC,KAAK,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,UAAU,CAAC,KAAe;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,2EAA2E;IAC3E,oBAAoB;IACpB,2EAA2E;IAE3E,uEAAuE;IACvE,YAAY,CACR,IAAY,EACZ,WAAmB,EACnB,UAAqC,EACrC,OAAoB;QAEpB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,sCAAsC;IACtC,aAAa,CACT,KAKE;QAEF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,2EAA2E;IAC3E,mBAAmB;IACnB,2EAA2E;IAE3E,yDAAyD;IACzD,KAAK,CAAC,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACnC,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;IACtC,CAAC;IAED,sDAAsD;IACtD,QAAQ,CAAC,IAAY;QACjB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACzB,2DAA2D;QAC3D,qCAAqC;IACzC,CAAC;IAED,iCAAiC;IACjC,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,2EAA2E;IAC3E,kBAAkB;IAClB,2EAA2E;IAE3E,oDAAoD;IACpD,iBAAiB;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACnC,CAAC;IAED,2EAA2E;IAC3E,YAAY;IACZ,2EAA2E;IAE3E,2DAA2D;IAC3D,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACjC,CAAC;IAED,2EAA2E;IAC3E,6BAA6B;IAC7B,2EAA2E;IAEnE,YAAY,CAAC,cAA8B;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAE5D,MAAM,aAAa,GAAqB;YACpC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,cAAc,CAAC,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;YACnD,OAAO,EAAE,IAAsB;YAC/B,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK;YACrC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC;YACjC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK;YACjC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAChD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK;YACvC,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;SACxC,CAAC;QAEF,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,QAAQ;gBACT,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzD,KAAK,QAAQ,CAAC;YACd,KAAK,UAAU;gBACX,OAAO,IAAI,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEnE,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ;gBACT,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzD;gBACI,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;CACJ"}
package/dist/auditor.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  * Auditor for dashboards, cost tracking, or behavioral scoring.
7
7
  */
8
8
  import type { TokenUsageInfo, ToolExecutionResult } from './interfaces.js';
9
- export type AuditEventType = 'request' | 'response' | 'stream_start' | 'stream_end' | 'tool_call' | 'tool_result' | 'error' | 'retry' | 'failover';
9
+ export type AuditEventType = 'request' | 'response' | 'stream_start' | 'stream_end' | 'tool_call' | 'tool_result' | 'error' | 'retry' | 'failover' | 'structured_request' | 'structured_response' | 'structured_validation_error';
10
10
  export interface AuditEvent {
11
11
  /** Unix timestamp in ms */
12
12
  timestamp: number;
@@ -26,6 +26,10 @@ export interface AuditEvent {
26
26
  error?: string;
27
27
  /** Arbitrary metadata for framework-specific data */
28
28
  metadata?: Record<string, unknown>;
29
+ /** Schema name for structured output events */
30
+ schemaName?: string;
31
+ /** Raw output snippet for validation errors */
32
+ rawOutput?: string;
29
33
  }
30
34
  /**
31
35
  * Interface for LLM observability.
@@ -1 +1 @@
1
- {"version":3,"file":"auditor.d.ts","sourceRoot":"","sources":["../src/auditor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3E,MAAM,MAAM,cAAc,GACpB,SAAS,GACT,UAAU,GACV,cAAc,GACd,YAAY,GACZ,WAAW,GACX,aAAa,GACb,OAAO,GACP,OAAO,GACP,UAAU,CAAC;AAEjB,MAAM,WAAW,UAAU;IACvB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,gEAAgE;IAChE,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAMD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACpB,4BAA4B;IAC5B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,2CAA2C;IAC3C,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAMD;;;GAGG;AACH,qBAAa,WAAY,YAAW,OAAO;IACvC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;CAGnC;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,OAAO;IAC1C,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,MAAgB;IAIpC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAkDlC;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,OAAO;IAC3C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAC,CAA0C;gBAE9C,OAAO,GAAE;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAChD;IAKN,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQ/B,8BAA8B;IAC9B,SAAS,IAAI,aAAa,CAAC,UAAU,CAAC;IAItC,mDAAmD;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,iDAAiD;IACjD,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"auditor.d.ts","sourceRoot":"","sources":["../src/auditor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAM3E,MAAM,MAAM,cAAc,GACpB,SAAS,GACT,UAAU,GACV,cAAc,GACd,YAAY,GACZ,WAAW,GACX,aAAa,GACb,OAAO,GACP,OAAO,GACP,UAAU,GACV,oBAAoB,GACpB,qBAAqB,GACrB,6BAA6B,CAAC;AAEpC,MAAM,WAAW,UAAU;IACvB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,IAAI,EAAE,cAAc,CAAC;IACrB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,gEAAgE;IAChE,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACpB,4BAA4B;IAC5B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,2CAA2C;IAC3C,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAMD;;;GAGG;AACH,qBAAa,WAAY,YAAW,OAAO;IACvC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;CAGnC;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,OAAO;IAC1C,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,MAAgB;IAIpC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAwElC;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,OAAO;IAC3C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAC,CAA0C;gBAE9C,OAAO,GAAE;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAChD;IAKN,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQ/B,8BAA8B;IAC9B,SAAS,IAAI,aAAa,CAAC,UAAU,CAAC;IAItC,mDAAmD;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,iDAAiD;IACjD,KAAK,IAAI,IAAI;CAGhB"}
package/dist/auditor.js CHANGED
@@ -61,6 +61,15 @@ export class ConsoleAuditor {
61
61
  case 'failover':
62
62
  console.warn(parts.join(' '), '→', event.metadata?.['nextProvider'] ?? '');
63
63
  break;
64
+ case 'structured_request':
65
+ console.log(parts.join(' '), `schema=${event.schemaName ?? 'unknown'}`, '→');
66
+ break;
67
+ case 'structured_response':
68
+ console.log(parts.join(' '), event.duration ? `${event.duration}ms` : '', `schema=${event.schemaName ?? 'unknown'}`);
69
+ break;
70
+ case 'structured_validation_error':
71
+ console.error(parts.join(' '), `schema=${event.schemaName ?? 'unknown'}`, event.error ?? 'Validation failed', event.rawOutput ? `raw=${event.rawOutput.slice(0, 50)}...` : '');
72
+ break;
64
73
  }
65
74
  }
66
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auditor.js","sourceRoot":"","sources":["../src/auditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auditor.js","sourceRoot":"","sources":["../src/auditor.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -5,7 +5,9 @@
5
5
  * Handles tool registration, execution, and the autonomous
6
6
  * multi-turn tool execution loop.
7
7
  */
8
+ import { z } from 'zod';
8
9
  import type { LLMClientOptions, LLMChatMessage, LLMChatResponse, LLMToolDefinition, LLMToolCall, LLMFunction, ToolRegistry, ToolHandler, ToolExecutionResult, ChatOptions, ModelMetadata } from './interfaces.js';
10
+ import { type StructuredOutputOptions } from './structured-output.js';
9
11
  import type { DecodedEvent } from './stream-decoder.js';
10
12
  import type { Auditor } from './auditor.js';
11
13
  export declare abstract class BaseLLMClient {
@@ -71,5 +73,17 @@ export declare abstract class BaseLLMClient {
71
73
  * Generate a unique ID for tool calls when the provider doesn't provide one.
72
74
  */
73
75
  protected generateToolCallId(): string;
76
+ /**
77
+ * Extract schema options from ChatOptions.
78
+ * Returns null if no schema is provided.
79
+ */
80
+ protected extractSchemaOptions(options?: ChatOptions): (StructuredOutputOptions<unknown> & {
81
+ schema: z.ZodType<unknown>;
82
+ }) | null;
83
+ /**
84
+ * Validate structured response against Zod schema.
85
+ * Throws StructuredOutputError on failure.
86
+ */
87
+ protected validateStructuredResponse(content: string, schema: z.ZodType<unknown>): void;
74
88
  }
75
89
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -5,6 +5,8 @@
5
5
  * Handles tool registration, execution, and the autonomous
6
6
  * multi-turn tool execution loop.
7
7
  */
8
+ import { z } from 'zod';
9
+ import { StructuredOutputError, } from './structured-output.js';
8
10
  import { NoopAuditor } from './auditor.js';
9
11
  // ============================================================================
10
12
  // Abstract Base Client
@@ -236,5 +238,55 @@ export class BaseLLMClient {
236
238
  generateToolCallId() {
237
239
  return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
238
240
  }
241
+ // ========================================================================
242
+ // Structured Output Helpers (shared across all providers)
243
+ // ========================================================================
244
+ /**
245
+ * Extract schema options from ChatOptions.
246
+ * Returns null if no schema is provided.
247
+ */
248
+ extractSchemaOptions(options) {
249
+ if (!options)
250
+ return null;
251
+ if (options.schema) {
252
+ return {
253
+ schema: options.schema,
254
+ name: options.schemaName,
255
+ description: options.schemaDescription,
256
+ };
257
+ }
258
+ if (options.jsonSchema) {
259
+ return {
260
+ jsonSchema: options.jsonSchema,
261
+ name: options.schemaName,
262
+ description: options.schemaDescription,
263
+ schema: z.unknown(),
264
+ };
265
+ }
266
+ return null;
267
+ }
268
+ /**
269
+ * Validate structured response against Zod schema.
270
+ * Throws StructuredOutputError on failure.
271
+ */
272
+ validateStructuredResponse(content, schema) {
273
+ if (!content) {
274
+ throw new StructuredOutputError('Empty response from LLM', { rawOutput: content });
275
+ }
276
+ let parsed;
277
+ try {
278
+ parsed = JSON.parse(content);
279
+ }
280
+ catch (error) {
281
+ const syntaxError = error instanceof SyntaxError
282
+ ? error
283
+ : new SyntaxError(String(error));
284
+ throw new StructuredOutputError(`Failed to parse JSON: ${syntaxError.message}`, { rawOutput: content, cause: syntaxError });
285
+ }
286
+ const result = schema.safeParse(parsed);
287
+ if (!result.success) {
288
+ throw new StructuredOutputError(`Validation failed: ${result.error.issues.map((e) => e.message).join(', ')}`, { rawOutput: content, cause: result.error });
289
+ }
290
+ }
239
291
  }
240
292
  //# sourceMappingURL=client.js.map