universal-llm-client 4.1.0 → 4.3.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/CHANGELOG.md +139 -103
- package/LICENSE +21 -21
- package/README.md +591 -591
- package/dist/ai-model.js.map +1 -1
- package/dist/auditor.js.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +20 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/mcp.js.map +1 -1
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +2 -0
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openai.js.map +1 -1
- package/dist/router.js.map +1 -1
- package/dist/stream-decoder.js.map +1 -1
- package/dist/structured-output.d.ts +24 -1
- package/dist/structured-output.d.ts.map +1 -1
- package/dist/structured-output.js +58 -5
- package/dist/structured-output.js.map +1 -1
- package/dist/tools.js.map +1 -1
- package/dist/zod-adapter.js.map +1 -1
- package/package.json +115 -116
- package/src/ai-model.ts +0 -350
- package/src/auditor.ts +0 -213
- package/src/client.ts +0 -402
- package/src/debug/debug-google-streaming.ts +0 -97
- package/src/debug/debug-tool-execution.ts +0 -86
- package/src/debug/test-lmstudio-tools.ts +0 -155
- package/src/demos/README.md +0 -47
- package/src/demos/basic/universal-llm-examples.ts +0 -161
- package/src/demos/mcp/astrid-memory-demo.ts +0 -295
- package/src/demos/mcp/astrid-persona-memory.ts +0 -357
- package/src/demos/mcp/mcp-mongodb-demo.ts +0 -275
- package/src/demos/mcp/simple-astrid-memory.ts +0 -148
- package/src/demos/mcp/simple-mcp-demo.ts +0 -68
- package/src/demos/mcp/working-mcp-demo.ts +0 -62
- package/src/demos/model-alias-demo.ts +0 -0
- package/src/demos/tools/RAG_MEMORY_INTEGRATION.md +0 -267
- package/src/demos/tools/astrid-memory-demo.ts +0 -270
- package/src/demos/tools/astrid-production-memory-clean.ts +0 -785
- package/src/demos/tools/astrid-production-memory.ts +0 -558
- package/src/demos/tools/basic-translation-test.ts +0 -66
- package/src/demos/tools/chromadb-similarity-tuning.ts +0 -390
- package/src/demos/tools/clean-multilingual-conversation.ts +0 -209
- package/src/demos/tools/clean-translation-test.ts +0 -119
- package/src/demos/tools/clean-universal-multilingual-test.ts +0 -131
- package/src/demos/tools/complete-rag-demo.ts +0 -369
- package/src/demos/tools/complete-tool-demo.ts +0 -132
- package/src/demos/tools/demo-tool-calling.ts +0 -124
- package/src/demos/tools/dynamic-language-switching-test.ts +0 -251
- package/src/demos/tools/hybrid-thinking-test.ts +0 -154
- package/src/demos/tools/memory-integration-test.ts +0 -420
- package/src/demos/tools/multilingual-memory-system.ts +0 -802
- package/src/demos/tools/ondemand-translation-demo.ts +0 -655
- package/src/demos/tools/production-tool-demo.ts +0 -245
- package/src/demos/tools/revolutionary-multilingual-test.ts +0 -151
- package/src/demos/tools/rigorous-language-analysis.ts +0 -218
- package/src/demos/tools/test-universal-memory-system.ts +0 -126
- package/src/demos/tools/translation-integration-guide.ts +0 -346
- package/src/demos/tools/universal-memory-system.ts +0 -560
- package/src/http.ts +0 -247
- package/src/index.ts +0 -160
- package/src/interfaces.ts +0 -657
- package/src/mcp.ts +0 -345
- package/src/providers/anthropic.ts +0 -762
- package/src/providers/google.ts +0 -620
- package/src/providers/index.ts +0 -8
- package/src/providers/ollama.ts +0 -469
- package/src/providers/openai.ts +0 -392
- package/src/router.ts +0 -780
- package/src/stream-decoder.ts +0 -361
- package/src/structured-output.ts +0 -702
- package/src/test-scripts/test-advanced-tools.ts +0 -310
- package/src/test-scripts/test-google-streaming-enhanced.ts +0 -147
- package/src/test-scripts/test-google-streaming.ts +0 -63
- package/src/test-scripts/test-google-system-prompt-comprehensive.ts +0 -189
- package/src/test-scripts/test-mcp-config.ts +0 -28
- package/src/test-scripts/test-mcp-connection.ts +0 -29
- package/src/test-scripts/test-system-message-positions.ts +0 -163
- package/src/test-scripts/test-system-prompt-improvement-demo.ts +0 -83
- package/src/test-scripts/test-tool-calling.ts +0 -231
- package/src/tests/ai-model.test.ts +0 -1614
- package/src/tests/auditor.test.ts +0 -224
- package/src/tests/http.test.ts +0 -200
- package/src/tests/interfaces.test.ts +0 -117
- package/src/tests/providers/google.test.ts +0 -660
- package/src/tests/providers/ollama.test.ts +0 -954
- package/src/tests/providers/openai.test.ts +0 -1122
- package/src/tests/router.test.ts +0 -254
- package/src/tests/stream-decoder.test.ts +0 -179
- package/src/tests/structured-output.test.ts +0 -1340
- package/src/tests/tools.test.ts +0 -175
- package/src/tools.ts +0 -246
- package/src/zod-adapter.ts +0 -72
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — Router (Internal Failover Engine)\r\n *\r\n * Manages the ordered provider chain with:\r\n * - Priority ordering\r\n * - Per-provider retries\r\n * - Health tracking with failure thresholds\r\n * - Cooldown periods for unhealthy providers\r\n * - Audit integration for every retry/failover event\r\n *\r\n * Not exposed publicly — AIModel delegates to it.\r\n */\r\n\r\nimport { BaseLLMClient } from './client.js';\r\nimport type { Auditor } from './auditor.js';\r\nimport { NoopAuditor } from './auditor.js';\r\nimport type {\r\n LLMChatMessage,\r\n LLMChatResponse,\r\n ChatOptions,\r\n ModelMetadata,\r\n OutputOptions,\r\n} from './interfaces.js';\r\nimport type { DecodedEvent } from './stream-decoder.js';\r\nimport {\r\n parseStructured,\r\n StructuredOutputError,\r\n StreamingJsonParser,\r\n getJsonSchemaFromConfig,\r\n type SchemaConfig,\r\n type StructuredOutputResult,\r\n} from './structured-output.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface ProviderEntry {\r\n /** Unique identifier for this provider entry */\r\n id: string;\r\n /** The underlying LLM client */\r\n client: BaseLLMClient;\r\n /** Priority (lower = tried first, defaults to insertion order) */\r\n priority: number;\r\n /** Override model name for this provider */\r\n modelOverride?: string;\r\n}\r\n\r\ninterface ProviderHealth {\r\n healthy: boolean;\r\n consecutiveFailures: number;\r\n lastFailure?: number;\r\n cooldownUntil?: number;\r\n}\r\n\r\nexport interface RouterConfig {\r\n /** Max retries per provider before failover (default: 2) */\r\n retriesPerProvider?: number;\r\n /** Max consecutive failures before marking unhealthy (default: 3) */\r\n maxFailures?: number;\r\n /** Cooldown period in ms for unhealthy providers (default: 30000) */\r\n cooldownMs?: number;\r\n /** Auditor for observability */\r\n auditor?: Auditor;\r\n}\r\n\r\nexport interface ProviderStatus {\r\n id: string;\r\n healthy: boolean;\r\n active: boolean;\r\n consecutiveFailures: number;\r\n cooldownUntil?: number;\r\n model: string;\r\n}\r\n\r\n// ============================================================================\r\n// Router\r\n// ============================================================================\r\n\r\nexport class Router {\r\n private providers: ProviderEntry[] = [];\r\n private health: Map<string, ProviderHealth> = new Map();\r\n private auditor: Auditor;\r\n private config: Required<Omit<RouterConfig, 'auditor'>>;\r\n\r\n constructor(config: RouterConfig = {}) {\r\n this.auditor = config.auditor ?? new NoopAuditor();\r\n this.config = {\r\n retriesPerProvider: config.retriesPerProvider ?? 2,\r\n maxFailures: config.maxFailures ?? 3,\r\n cooldownMs: config.cooldownMs ?? 30000,\r\n };\r\n }\r\n\r\n // ========================================================================\r\n // Provider Management\r\n // ========================================================================\r\n\r\n addProvider(entry: ProviderEntry): void {\r\n this.providers.push(entry);\r\n this.health.set(entry.id, {\r\n healthy: true,\r\n consecutiveFailures: 0,\r\n });\r\n // Re-sort by priority\r\n this.providers.sort((a, b) => a.priority - b.priority);\r\n }\r\n\r\n removeProvider(id: string): void {\r\n this.providers = this.providers.filter(p => p.id !== id);\r\n this.health.delete(id);\r\n }\r\n\r\n setAuditor(auditor: Auditor): void {\r\n this.auditor = auditor;\r\n }\r\n\r\n getStatus(): ProviderStatus[] {\r\n return this.providers.map(p => ({\r\n id: p.id,\r\n healthy: this.isAvailable(p.id),\r\n active: true,\r\n consecutiveFailures: this.health.get(p.id)?.consecutiveFailures ?? 0,\r\n cooldownUntil: this.health.get(p.id)?.cooldownUntil,\r\n model: p.modelOverride ?? p.client.model,\r\n }));\r\n }\r\n\r\n // ========================================================================\r\n // Execution with Failover\r\n // ========================================================================\r\n\r\n /**\r\n * Execute a function against providers with automatic failover.\r\n * Tries each available provider in priority order.\r\n */\r\n async execute<T>(\r\n fn: (client: BaseLLMClient) => Promise<T>,\r\n context: string = 'execute',\r\n ): Promise<T> {\r\n const available = this.getAvailableProviders();\r\n\r\n if (available.length === 0) {\r\n throw new Error('No available LLM providers. All providers are unhealthy or in cooldown.');\r\n }\r\n\r\n let lastError: Error | undefined;\r\n\r\n for (const provider of available) {\r\n for (let attempt = 0; attempt <= this.config.retriesPerProvider; attempt++) {\r\n try {\r\n if (attempt > 0) {\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'retry',\r\n provider: provider.id,\r\n model: provider.modelOverride ?? provider.client.model,\r\n metadata: { attempt, context },\r\n });\r\n }\r\n\r\n const result = await fn(provider.client);\r\n this.recordSuccess(provider.id);\r\n return result;\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'error',\r\n provider: provider.id,\r\n model: provider.modelOverride ?? provider.client.model,\r\n error: lastError.message,\r\n metadata: { attempt, context },\r\n });\r\n }\r\n }\r\n\r\n // All retries exhausted for this provider\r\n this.recordFailure(provider.id);\r\n\r\n // Try next provider (failover)\r\n const nextProvider = this.getNextAvailableAfter(provider.id);\r\n if (nextProvider) {\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'failover',\r\n provider: provider.id,\r\n metadata: {\r\n from: provider.id,\r\n nextProvider: nextProvider.id,\r\n context,\r\n reason: lastError?.message,\r\n },\r\n });\r\n }\r\n }\r\n\r\n throw lastError ?? new Error('All providers failed');\r\n }\r\n\r\n /**\r\n * Execute a streaming function with failover.\r\n * On failure, retries with the next provider from the beginning.\r\n */\r\n async *executeStream(\r\n fn: (client: BaseLLMClient) => AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown>,\r\n context: string = 'stream',\r\n ): AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown> {\r\n const available = this.getAvailableProviders();\r\n\r\n if (available.length === 0) {\r\n throw new Error('No available LLM providers for streaming.');\r\n }\r\n\r\n let lastError: Error | undefined;\r\n\r\n for (const provider of available) {\r\n try {\r\n const stream = fn(provider.client);\r\n let returnValue: LLMChatResponse | void;\r\n\r\n // We need to yield all values and capture the return\r\n while (true) {\r\n const result = await stream.next();\r\n if (result.done) {\r\n returnValue = result.value;\r\n break;\r\n }\r\n yield result.value;\r\n }\r\n\r\n this.recordSuccess(provider.id);\r\n return returnValue;\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n this.recordFailure(provider.id);\r\n\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'failover',\r\n provider: provider.id,\r\n error: lastError.message,\r\n metadata: { context },\r\n });\r\n\r\n // Continue to next provider\r\n }\r\n }\r\n\r\n throw lastError ?? new Error('All providers failed for streaming');\r\n }\r\n\r\n // ========================================================================\r\n // Convenience Methods\r\n // ========================================================================\r\n\r\n /**\r\n * @deprecated No longer needed — structured output and tools can now be used together.\r\n */\r\n private validateOutputAndTools(_options?: ChatOptions): void {\r\n // Structured output and tools are now allowed together.\r\n }\r\n\r\n /**\r\n * Extract schema from output options.\r\n * Returns a SchemaConfig or a bare jsonSchema object.\r\n */\r\n private getSchemaFromOutput<T>(output: OutputOptions<T>): { config: SchemaConfig<T>; name?: string; description?: string } | { jsonSchema: Record<string, unknown>; name?: string; description?: string } {\r\n if (output.schema) {\r\n return {\r\n config: output.schema,\r\n name: output.name,\r\n description: output.description,\r\n };\r\n }\r\n if (output.jsonSchema) {\r\n return {\r\n jsonSchema: output.jsonSchema as Record<string, unknown>,\r\n name: output.name,\r\n description: output.description,\r\n };\r\n }\r\n throw new Error('output must have either schema or jsonSchema');\r\n }\r\n\r\n async chat(messages: LLMChatMessage[], options?: ChatOptions): Promise<LLMChatResponse> {\r\n // Validate that output and tools are not used together (VAL-API-005)\r\n this.validateOutputAndTools(options);\r\n\r\n // If output parameter is provided, use structured output flow (VAL-API-004)\r\n if (options?.output) {\r\n // Type assertion: we know output is defined at this point\r\n return this.chatWithStructuredOutput(messages, options as ChatOptions & { output: OutputOptions });\r\n }\r\n\r\n return this.execute(\r\n client => client.chat(messages, options),\r\n 'chat',\r\n );\r\n }\r\n\r\n /**\r\n * Chat with structured output using the output parameter.\r\n * Validates response against the schema and returns structured property.\r\n */\r\n private async chatWithStructuredOutput<T>(\r\n messages: LLMChatMessage[],\r\n options: ChatOptions & { output: OutputOptions<T> },\r\n ): Promise<LLMChatResponse<T>> {\r\n const { output } = options;\r\n const schemaInfo = this.getSchemaFromOutput(output);\r\n const schemaName = schemaInfo.name ?? 'response';\r\n\r\n // Emit structured_request event\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_request',\r\n provider: 'router',\r\n schemaName,\r\n });\r\n\r\n // Build ChatOptions with schema for the provider\r\n // Keep tools if provided — structured output and tools can work together\r\n const { output: _, ...restOptions } = options;\r\n const structuredOptions: ChatOptions = {\r\n ...restOptions,\r\n // Use jsonSchema for the provider\r\n jsonSchema: 'config' in schemaInfo\r\n ? getJsonSchemaFromConfig(schemaInfo.config)\r\n : schemaInfo.jsonSchema,\r\n schemaName: schemaInfo.name,\r\n schemaDescription: schemaInfo.description,\r\n };\r\n\r\n const start = Date.now();\r\n\r\n // Get response from provider\r\n const response = await this.execute(\r\n client => client.chat(messages, structuredOptions),\r\n 'chatWithStructuredOutput',\r\n );\r\n\r\n // If the response contains tool calls, skip validation and return as-is\r\n if (response.message.tool_calls && response.message.tool_calls.length > 0) {\r\n return response as LLMChatResponse<T>;\r\n }\r\n\r\n // Extract text content from response\r\n const content = typeof response.message.content === 'string'\r\n ? response.message.content\r\n : response.message.content\r\n .filter((part): part is { type: 'text'; text: string } => part.type === 'text')\r\n .map(part => part.text)\r\n .join('');\r\n\r\n // Get the SchemaConfig for validation\r\n const schemaConfig: SchemaConfig<T> | null = 'config' in schemaInfo ? schemaInfo.config : null;\r\n\r\n if (!schemaConfig || !schemaConfig.validate) {\r\n // No validator — return parsed JSON without validation\r\n try {\r\n const structured = JSON.parse(content) as T;\r\n // Emit structured_response event on success\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_response',\r\n provider: response.provider ?? 'router',\r\n model: response.message.role,\r\n duration: Date.now() - start,\r\n schemaName,\r\n usage: response.usage,\r\n });\r\n return {\r\n ...response,\r\n structured,\r\n };\r\n } catch (error) {\r\n // JSON parse failed\r\n const rawOutput = content;\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_validation_error',\r\n provider: response.provider ?? 'router',\r\n schemaName,\r\n error: error instanceof Error ? error.message : 'JSON parse failed',\r\n rawOutput,\r\n });\r\n throw new StructuredOutputError(\r\n `Failed to parse JSON: ${rawOutput}`,\r\n { rawOutput: rawOutput, cause: error instanceof Error ? error : undefined },\r\n );\r\n }\r\n }\r\n\r\n // Parse and validate against SchemaConfig\r\n try {\r\n const validated = parseStructured(schemaConfig, content);\r\n // Emit structured_response event on success\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_response',\r\n provider: response.provider ?? 'router',\r\n duration: Date.now() - start,\r\n schemaName,\r\n usage: response.usage,\r\n });\r\n return {\r\n ...response,\r\n structured: validated,\r\n };\r\n } catch (error) {\r\n // Emit structured_validation_error event\r\n const rawOutput = content;\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_validation_error',\r\n provider: response.provider ?? 'router',\r\n schemaName,\r\n error: error instanceof Error ? error.message : 'Validation failed',\r\n rawOutput,\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n async chatWithTools(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions & { maxIterations?: number },\r\n ): Promise<LLMChatResponse> {\r\n return this.execute(\r\n client => client.chatWithTools(messages, options),\r\n 'chatWithTools',\r\n );\r\n }\r\n\r\n async *chatStream(\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): AsyncGenerator<DecodedEvent, LLMChatResponse | void, unknown> {\r\n // Structured output via output parameter is not supported on streaming\r\n // Use generateStructuredStream() instead\r\n if (options?.output) {\r\n throw new Error(\r\n 'The \"output\" parameter is not supported with chatStream(). '\r\n + 'Use generateStructuredStream() for streaming structured output.',\r\n );\r\n }\r\n\r\n return yield* this.executeStream(\r\n client => client.chatStream(messages, options),\r\n 'chatStream',\r\n );\r\n }\r\n\r\n async embed(text: string): Promise<number[]> {\r\n return this.execute(\r\n client => client.embed(text),\r\n 'embed',\r\n );\r\n }\r\n\r\n async embedArray(texts: string[]): Promise<number[][]> {\r\n return this.execute(\r\n client => client.embedArray(texts),\r\n 'embedArray',\r\n );\r\n }\r\n\r\n async getModels(): Promise<string[]> {\r\n // Aggregate models from all providers\r\n const allModels: string[] = [];\r\n for (const provider of this.providers) {\r\n try {\r\n const models = await provider.client.getModels();\r\n allModels.push(...models);\r\n } catch {\r\n // Skip unavailable providers\r\n }\r\n }\r\n return [...new Set(allModels)];\r\n }\r\n\r\n async getModelInfo(): Promise<ModelMetadata> {\r\n return this.execute(\r\n client => client.getModelInfo(),\r\n 'getModelInfo',\r\n );\r\n }\r\n\r\n // ========================================================================\r\n // Structured Output Methods\r\n // ========================================================================\r\n\r\n /**\r\n * Generate structured output from the LLM with automatic failover.\r\n * Validates the response against the provided SchemaConfig.\r\n * Throws StructuredOutputError on validation failure.\r\n *\r\n * @template T The output type\r\n * @param config Schema configuration (JSON Schema + optional validator)\r\n * @param messages Chat messages to send\r\n * @param options Additional options (temperature, maxTokens, etc.)\r\n * @returns Validated structured output\r\n * @throws StructuredOutputError if validation fails\r\n */\r\n async generateStructured<T>(\r\n config: SchemaConfig<T>,\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): Promise<T> {\r\n // Get JSON Schema from config\r\n const jsonSchema = getJsonSchemaFromConfig(config);\r\n const schemaName = options?.schemaName ?? config.name ?? 'response';\r\n\r\n // Emit structured_request event\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_request',\r\n provider: 'router',\r\n schemaName,\r\n });\r\n\r\n // Build ChatOptions with schema\r\n const structuredOptions: ChatOptions = {\r\n ...options,\r\n jsonSchema,\r\n };\r\n\r\n const start = Date.now();\r\n\r\n // Execute with failover\r\n const response = await this.execute(\r\n client => client.chat(messages, structuredOptions),\r\n 'generateStructured',\r\n );\r\n\r\n // Parse and validate the response\r\n const content = typeof response.message.content === 'string'\r\n ? response.message.content\r\n : response.message.content\r\n .filter((part): part is { type: 'text'; text: string } => part.type === 'text')\r\n .map(part => part.text)\r\n .join('');\r\n\r\n try {\r\n const result = parseStructured(config, content);\r\n // Emit structured_response event on success\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_response',\r\n provider: response.provider ?? 'router',\r\n duration: Date.now() - start,\r\n schemaName,\r\n usage: response.usage,\r\n });\r\n return result;\r\n } catch (error) {\r\n // Emit structured_validation_error event\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_validation_error',\r\n provider: response.provider ?? 'router',\r\n schemaName,\r\n error: error instanceof Error ? error.message : 'Validation failed',\r\n rawOutput: content,\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Try to generate structured output, returning a result object instead of throwing.\r\n *\r\n * @template T The output type\r\n * @param config Schema configuration (JSON Schema + optional validator)\r\n * @param messages Chat messages to send\r\n * @param options Additional options (temperature, maxTokens, etc.)\r\n * @returns StructuredOutputResult<T>\r\n */\r\n async tryParseStructured<T>(\r\n config: SchemaConfig<T>,\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): Promise<StructuredOutputResult<T>> {\r\n try {\r\n const value = await this.generateStructured(config, messages, options);\r\n return { ok: true, value };\r\n } catch (error) {\r\n // If error is already a StructuredOutputError, use it directly\r\n if (error instanceof Error && 'rawOutput' in error) {\r\n return {\r\n ok: false,\r\n error: error as unknown as import('./structured-output.js').StructuredOutputError,\r\n rawOutput: (error as unknown as { rawOutput: string }).rawOutput,\r\n };\r\n }\r\n\r\n // Unexpected error - re-throw\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Stream structured output with partial validated objects.\r\n *\r\n * @template T The output type\r\n * @param config Schema configuration (JSON Schema + optional validator)\r\n * @param messages Chat messages to send\r\n * @param options Additional options (temperature, maxTokens, etc.)\r\n * @yields Partial validated objects as the JSON stream progresses\r\n * @returns Complete validated object on stream completion\r\n * @throws StructuredOutputError if final validation fails\r\n */\r\n async *generateStructuredStream<T>(\r\n config: SchemaConfig<T>,\r\n messages: LLMChatMessage[],\r\n options?: ChatOptions,\r\n ): AsyncGenerator<T, T, unknown> {\r\n // Get JSON Schema from config\r\n const jsonSchema = getJsonSchemaFromConfig(config);\r\n const schemaName = options?.schemaName ?? config.name ?? 'response';\r\n\r\n // Emit structured_request event\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_request',\r\n provider: 'router',\r\n schemaName,\r\n });\r\n\r\n // Build ChatOptions with schema\r\n const structuredOptions: ChatOptions = {\r\n ...options,\r\n jsonSchema,\r\n };\r\n\r\n const start = Date.now();\r\n\r\n // Stream with failover\r\n const stream = this.executeStream(\r\n client => client.chatStream(messages, structuredOptions),\r\n 'generateStructuredStream',\r\n );\r\n\r\n // Accumulate text and yield partial validated objects\r\n const parser = new StreamingJsonParser<T>(config);\r\n let fullContent = '';\r\n let lastYielded: T | undefined;\r\n\r\n try {\r\n for await (const event of stream) {\r\n // Only process text events\r\n if (event.type !== 'text') continue;\r\n\r\n fullContent += event.content;\r\n\r\n // Try to parse partial JSON\r\n const result = parser.feed(event.content);\r\n\r\n // Yield if we got a valid partial and it's different from last\r\n if (result.partial !== undefined) {\r\n // Only yield if different from last (avoid duplicate yields)\r\n if (lastYielded === undefined || JSON.stringify(result.partial) !== JSON.stringify(lastYielded)) {\r\n lastYielded = result.partial;\r\n yield result.partial;\r\n }\r\n }\r\n }\r\n\r\n // Parse and validate the complete content\r\n const complete = parseStructured(config, fullContent);\r\n\r\n // Emit structured_response event on success\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_response',\r\n provider: 'router',\r\n schemaName,\r\n duration: Date.now() - start,\r\n });\r\n\r\n // Return the complete validated object\r\n return complete;\r\n } catch (error) {\r\n // Emit structured_validation_error event\r\n this.auditor.record({\r\n timestamp: Date.now(),\r\n type: 'structured_validation_error',\r\n provider: 'router',\r\n schemaName,\r\n error: error instanceof Error ? error.message : 'Validation failed',\r\n rawOutput: fullContent,\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // Tool Registration (broadcast to all providers)\r\n // ========================================================================\r\n\r\n registerTool(\r\n name: string,\r\n description: string,\r\n parameters: import('./interfaces.js').LLMFunction['parameters'],\r\n handler: import('./interfaces.js').ToolHandler,\r\n ): void {\r\n for (const provider of this.providers) {\r\n provider.client.registerTool(name, description, parameters, handler);\r\n }\r\n }\r\n\r\n registerTools(\r\n tools: Array<{\r\n name: string;\r\n description: string;\r\n parameters: import('./interfaces.js').LLMFunction['parameters'];\r\n handler: import('./interfaces.js').ToolHandler;\r\n }>,\r\n ): void {\r\n for (const provider of this.providers) {\r\n provider.client.registerTools(tools);\r\n }\r\n }\r\n\r\n // ========================================================================\r\n // Health Management\r\n // ========================================================================\r\n\r\n private isAvailable(id: string): boolean {\r\n const h = this.health.get(id);\r\n if (!h) return false;\r\n if (h.healthy) return true;\r\n // Check if cooldown has expired\r\n if (h.cooldownUntil && Date.now() >= h.cooldownUntil) {\r\n // Reset for re-testing\r\n h.healthy = true;\r\n h.consecutiveFailures = 0;\r\n h.cooldownUntil = undefined;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private getAvailableProviders(): ProviderEntry[] {\r\n return this.providers.filter(p => this.isAvailable(p.id));\r\n }\r\n\r\n private getNextAvailableAfter(currentId: string): ProviderEntry | undefined {\r\n const idx = this.providers.findIndex(p => p.id === currentId);\r\n for (let i = idx + 1; i < this.providers.length; i++) {\r\n if (this.isAvailable(this.providers[i]!.id)) {\r\n return this.providers[i];\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private recordSuccess(id: string): void {\r\n const h = this.health.get(id);\r\n if (h) {\r\n h.healthy = true;\r\n h.consecutiveFailures = 0;\r\n h.cooldownUntil = undefined;\r\n }\r\n }\r\n\r\n private recordFailure(id: string): void {\r\n const h = this.health.get(id);\r\n if (!h) return;\r\n\r\n h.consecutiveFailures++;\r\n h.lastFailure = Date.now();\r\n\r\n if (h.consecutiveFailures >= this.config.maxFailures) {\r\n h.healthy = false;\r\n h.cooldownUntil = Date.now() + this.config.cooldownMs;\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-decoder.js","sourceRoot":"","sources":["../src/stream-decoder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream-decoder.js","sourceRoot":"","sources":["../src/stream-decoder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — Stream Decoder\r\n *\r\n * Pluggable interface for decoding raw LLM token streams into typed events.\r\n * Consumers select their strategy per-call: passthrough for raw speed,\r\n * standard-chat for structured tool calls, or interleaved-reasoning\r\n * for models that emit <think>/<progress> tags.\r\n */\r\n\r\nimport type { LLMToolCall } from './interfaces.js';\r\n\r\n// ============================================================================\r\n// Decoded Event Types\r\n// ============================================================================\r\n\r\n/** Clean, typed events emitted by a stream decoder */\r\nexport type DecodedEvent =\r\n | { type: 'text'; content: string }\r\n | { type: 'thinking'; content: string }\r\n | { type: 'progress'; content: string }\r\n | { type: 'tool_call'; calls: LLMToolCall[] };\r\n\r\n/** Callback invoked by the decoder as events become available */\r\nexport type DecoderCallback = (event: DecodedEvent) => void;\r\n\r\n// ============================================================================\r\n// Decoder Interface\r\n// ============================================================================\r\n\r\n/**\r\n * Transform raw LLM tokens into clean typed events.\r\n *\r\n * Usage:\r\n * const decoder = createDecoder('standard-chat', callback);\r\n * for (const token of stream) decoder.push(token);\r\n * decoder.flush();\r\n * const clean = decoder.getCleanContent();\r\n */\r\nexport interface StreamDecoder {\r\n /** Feed a raw token from the LLM stream */\r\n push(token: string): void;\r\n /** Signal end of stream — flush any buffered state */\r\n flush(): void;\r\n /** Get the accumulated clean text (all structural tags stripped) */\r\n getCleanContent(): string;\r\n /** Get accumulated reasoning/thinking content (if any) */\r\n getReasoning(): string | undefined;\r\n}\r\n\r\n// ============================================================================\r\n// Decoder Types\r\n// ============================================================================\r\n\r\nexport type DecoderType = 'passthrough' | 'standard-chat' | 'interleaved-reasoning';\r\n\r\n// ============================================================================\r\n// Passthrough Decoder\r\n// ============================================================================\r\n\r\n/**\r\n * Bare-bones decoder for raw text completions.\r\n * No parsing, no tag awareness. All tokens → text events.\r\n */\r\nexport class PassthroughDecoder implements StreamDecoder {\r\n private content = '';\r\n private readonly callback: DecoderCallback;\r\n\r\n constructor(callback: DecoderCallback) {\r\n this.callback = callback;\r\n }\r\n\r\n push(token: string): void {\r\n this.content += token;\r\n this.callback({ type: 'text', content: token });\r\n }\r\n\r\n flush(): void {\r\n // Nothing to flush — all tokens emitted immediately\r\n }\r\n\r\n getCleanContent(): string {\r\n return this.content;\r\n }\r\n\r\n getReasoning(): string | undefined {\r\n return undefined;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Standard Chat Decoder\r\n// ============================================================================\r\n\r\n/**\r\n * Decoder for standard LLM chat patterns — text streaming with native\r\n * reasoning and structured API tool calls. No text-level tag parsing.\r\n *\r\n * Streamed tokens are clean text → emitted as `text` events.\r\n * Native reasoning tokens → accepted via `pushReasoning()`.\r\n * Structured tool calls → accepted via `pushToolCalls()`.\r\n */\r\nexport class StandardChatDecoder implements StreamDecoder {\r\n private content = '';\r\n private reasoning = '';\r\n private readonly callback: DecoderCallback;\r\n\r\n constructor(callback: DecoderCallback) {\r\n this.callback = callback;\r\n }\r\n\r\n push(token: string): void {\r\n this.content += token;\r\n this.callback({ type: 'text', content: token });\r\n }\r\n\r\n /** Feed native reasoning tokens from the provider */\r\n pushReasoning(content: string): void {\r\n this.reasoning += content;\r\n this.callback({ type: 'thinking', content });\r\n }\r\n\r\n /** Feed structured tool calls from the provider API response */\r\n pushToolCalls(calls: LLMToolCall[]): void {\r\n this.callback({ type: 'tool_call', calls });\r\n }\r\n\r\n flush(): void {\r\n // Nothing to flush — all events emitted as they arrive\r\n }\r\n\r\n getCleanContent(): string {\r\n return this.content;\r\n }\r\n\r\n getReasoning(): string | undefined {\r\n return this.reasoning || undefined;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Interleaved Reasoning Decoder\r\n// ============================================================================\r\n\r\n/**\r\n * Decoder for models that emit interleaved reasoning tags in text.\r\n * Parses <think>...</think> and <progress>...</progress> tags from the\r\n * raw token stream and emits typed events for each.\r\n *\r\n * Handles streaming where tags may be split across chunks.\r\n */\r\nexport class InterleavedReasoningDecoder implements StreamDecoder {\r\n private buffer = '';\r\n private content = '';\r\n private reasoning = '';\r\n private readonly callback: DecoderCallback;\r\n private inThink = false;\r\n private inProgress = false;\r\n\r\n constructor(callback: DecoderCallback) {\r\n this.callback = callback;\r\n }\r\n\r\n push(token: string): void {\r\n this.buffer += token;\r\n this.processBuffer();\r\n }\r\n\r\n flush(): void {\r\n // Emit any remaining buffer content as text\r\n if (this.buffer.length > 0) {\r\n if (this.inThink) {\r\n this.reasoning += this.buffer;\r\n this.callback({ type: 'thinking', content: this.buffer });\r\n } else if (this.inProgress) {\r\n this.callback({ type: 'progress', content: this.buffer });\r\n } else {\r\n this.content += this.buffer;\r\n this.callback({ type: 'text', content: this.buffer });\r\n }\r\n this.buffer = '';\r\n }\r\n }\r\n\r\n getCleanContent(): string {\r\n return this.content;\r\n }\r\n\r\n getReasoning(): string | undefined {\r\n return this.reasoning || undefined;\r\n }\r\n\r\n private processBuffer(): void {\r\n let safety = 0;\r\n while (this.buffer.length > 0 && safety++ < 200) {\r\n if (this.inThink) {\r\n const closeIdx = this.buffer.indexOf('</think>');\r\n if (closeIdx === -1) {\r\n // Might have partial closing tag at end\r\n if (this.buffer.endsWith('<') || this.buffer.endsWith('</') ||\r\n this.buffer.endsWith('</t') || this.buffer.endsWith('</th') ||\r\n this.buffer.endsWith('</thi') || this.buffer.endsWith('</thin') ||\r\n this.buffer.endsWith('</think')) {\r\n return; // Wait for more data\r\n }\r\n this.reasoning += this.buffer;\r\n this.callback({ type: 'thinking', content: this.buffer });\r\n this.buffer = '';\r\n return;\r\n }\r\n const thinkContent = this.buffer.slice(0, closeIdx);\r\n if (thinkContent) {\r\n this.reasoning += thinkContent;\r\n this.callback({ type: 'thinking', content: thinkContent });\r\n }\r\n this.buffer = this.buffer.slice(closeIdx + 8); // '</think>'.length\r\n this.inThink = false;\r\n continue;\r\n }\r\n\r\n if (this.inProgress) {\r\n const closeIdx = this.buffer.indexOf('</progress>');\r\n if (closeIdx === -1) {\r\n if (this.couldBePartialTag(this.buffer, '</progress>')) return;\r\n this.callback({ type: 'progress', content: this.buffer });\r\n this.buffer = '';\r\n return;\r\n }\r\n const progressContent = this.buffer.slice(0, closeIdx);\r\n if (progressContent) {\r\n this.callback({ type: 'progress', content: progressContent });\r\n }\r\n this.buffer = this.buffer.slice(closeIdx + 11); // '</progress>'.length\r\n this.inProgress = false;\r\n continue;\r\n }\r\n\r\n // Look for opening tags\r\n const thinkIdx = this.buffer.indexOf('<think>');\r\n const progressIdx = this.buffer.indexOf('<progress>');\r\n\r\n // Find earliest tag\r\n const nextTag = this.findEarliest(thinkIdx, progressIdx);\r\n\r\n if (nextTag === -1) {\r\n // No complete opening tags — check for partial tag at end\r\n const lastAngle = this.buffer.lastIndexOf('<');\r\n if (lastAngle >= 0 && lastAngle > this.buffer.length - 12) {\r\n // Potential partial tag — emit text before it, keep the rest\r\n const textBefore = this.buffer.slice(0, lastAngle);\r\n if (textBefore) {\r\n this.content += textBefore;\r\n this.callback({ type: 'text', content: textBefore });\r\n }\r\n this.buffer = this.buffer.slice(lastAngle);\r\n return;\r\n }\r\n // No partial tags — emit all as text\r\n this.content += this.buffer;\r\n this.callback({ type: 'text', content: this.buffer });\r\n this.buffer = '';\r\n return;\r\n }\r\n\r\n // Emit text before the tag\r\n const textBefore = this.buffer.slice(0, nextTag);\r\n if (textBefore) {\r\n this.content += textBefore;\r\n this.callback({ type: 'text', content: textBefore });\r\n }\r\n\r\n if (nextTag === thinkIdx) {\r\n this.buffer = this.buffer.slice(nextTag + 7); // '<think>'.length\r\n this.inThink = true;\r\n } else {\r\n this.buffer = this.buffer.slice(nextTag + 10); // '<progress>'.length\r\n this.inProgress = true;\r\n }\r\n }\r\n }\r\n\r\n private findEarliest(a: number, b: number): number {\r\n if (a === -1) return b;\r\n if (b === -1) return a;\r\n return Math.min(a, b);\r\n }\r\n\r\n private couldBePartialTag(buffer: string, tag: string): boolean {\r\n for (let i = 1; i < tag.length; i++) {\r\n if (buffer.endsWith(tag.slice(0, i))) return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Pluggable Decoder Registry\r\n// ============================================================================\r\n\r\nexport interface DecoderOptions {\r\n /** Known tool names for text-based tool call recovery */\r\n knownToolNames?: Set<string>;\r\n}\r\n\r\n/**\r\n * Factory function that creates a StreamDecoder instance.\r\n * External code registers these via `registerDecoder()`.\r\n */\r\nexport type DecoderFactory = (callback: DecoderCallback, options?: DecoderOptions) => StreamDecoder;\r\n\r\n/** Internal registry of decoder factories, keyed by decoder type name */\r\nconst decoderRegistry = new Map<string, DecoderFactory>();\r\n\r\n/**\r\n * Register a custom stream decoder type.\r\n * Once registered, it can be used via `createDecoder(name, ...)` or\r\n * by passing `decoderType: name` in ChatOptions.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { registerDecoder } from 'universal-llm-client';\r\n *\r\n * registerDecoder('my-decoder', (callback, options) => {\r\n * return new MyCustomDecoder(callback, options);\r\n * });\r\n * ```\r\n */\r\nexport function registerDecoder(type: string, factory: DecoderFactory): void {\r\n decoderRegistry.set(type, factory);\r\n}\r\n\r\n/**\r\n * Get all registered decoder type names.\r\n */\r\nexport function getRegisteredDecoders(): string[] {\r\n return Array.from(decoderRegistry.keys());\r\n}\r\n\r\n// Pre-register built-in decoders\r\nregisterDecoder('passthrough', (cb) => new PassthroughDecoder(cb));\r\nregisterDecoder('standard-chat', (cb) => new StandardChatDecoder(cb));\r\nregisterDecoder('interleaved-reasoning', (cb) => new InterleavedReasoningDecoder(cb));\r\n\r\n/**\r\n * Create a stream decoder by type name.\r\n * Looks up the decoder in the registry (built-in + custom).\r\n *\r\n * @throws Error if the decoder type is not registered\r\n */\r\nexport function createDecoder(\r\n type: DecoderType | string,\r\n callback: DecoderCallback,\r\n options?: DecoderOptions,\r\n): StreamDecoder {\r\n const factory = decoderRegistry.get(type);\r\n if (!factory) {\r\n const available = Array.from(decoderRegistry.keys()).join(', ');\r\n throw new Error(`Unknown decoder type: \"${type}\". Available: ${available}`);\r\n }\r\n return factory(callback, options);\r\n}\r\n\r\n"]}
|
|
@@ -285,11 +285,34 @@ export declare function stripUnsupportedFeatures(schema: JSONSchema, provider: S
|
|
|
285
285
|
* 3. Adds name/description for LLM guidance
|
|
286
286
|
*/
|
|
287
287
|
export declare function convertToProviderSchema<T>(provider: SchemaProvider, options: StructuredOutputOptions<T>): ProviderSchema;
|
|
288
|
+
/**
|
|
289
|
+
* Strip markdown code fences from raw LLM output.
|
|
290
|
+
*
|
|
291
|
+
* Some providers/models — notably Gemma variants via Ollama — wrap
|
|
292
|
+
* structured JSON output in ` ```json ... ``` ` fences even when a JSON
|
|
293
|
+
* schema is passed via the `format` field. This helper extracts the
|
|
294
|
+
* inner payload so it can be fed to `JSON.parse`.
|
|
295
|
+
*
|
|
296
|
+
* Behavior:
|
|
297
|
+
* - If the input contains no triple-backtick fences, the input is
|
|
298
|
+
* returned unchanged (zero risk of disturbing well-formed output).
|
|
299
|
+
* - Otherwise, the first fenced block is extracted and returned trimmed.
|
|
300
|
+
* Language tags (` ```json `, ` ```JSON `, etc.) are handled.
|
|
301
|
+
* - Callers should still treat the return value as untrusted — it may
|
|
302
|
+
* not be valid JSON (e.g. the model emitted prose, not JSON).
|
|
303
|
+
*
|
|
304
|
+
* This helper is idempotent: `stripJsonFences(stripJsonFences(x)) === stripJsonFences(x)`.
|
|
305
|
+
*
|
|
306
|
+
* @param rawOutput The raw LLM response text
|
|
307
|
+
* @returns Fence-stripped content if fences were present, otherwise `rawOutput` unchanged
|
|
308
|
+
*/
|
|
309
|
+
export declare function stripJsonFences(rawOutput: string): string;
|
|
288
310
|
/**
|
|
289
311
|
* Parse and validate structured output from raw LLM response text.
|
|
290
312
|
*
|
|
291
313
|
* This function:
|
|
292
|
-
* 1. Parses JSON from the raw output string
|
|
314
|
+
* 1. Parses JSON from the raw output string (with fallback fence stripping
|
|
315
|
+
* for models that wrap structured output in ` ```json ... ``` `)
|
|
293
316
|
* 2. Validates using the SchemaConfig's validate function (if provided)
|
|
294
317
|
* 3. Throws StructuredOutputError on failure
|
|
295
318
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -183,11 +183,46 @@ export function convertToProviderSchema(provider, options) {
|
|
|
183
183
|
// ============================================================================
|
|
184
184
|
// Validation Functions
|
|
185
185
|
// ============================================================================
|
|
186
|
+
/**
|
|
187
|
+
* Strip markdown code fences from raw LLM output.
|
|
188
|
+
*
|
|
189
|
+
* Some providers/models — notably Gemma variants via Ollama — wrap
|
|
190
|
+
* structured JSON output in ` ```json ... ``` ` fences even when a JSON
|
|
191
|
+
* schema is passed via the `format` field. This helper extracts the
|
|
192
|
+
* inner payload so it can be fed to `JSON.parse`.
|
|
193
|
+
*
|
|
194
|
+
* Behavior:
|
|
195
|
+
* - If the input contains no triple-backtick fences, the input is
|
|
196
|
+
* returned unchanged (zero risk of disturbing well-formed output).
|
|
197
|
+
* - Otherwise, the first fenced block is extracted and returned trimmed.
|
|
198
|
+
* Language tags (` ```json `, ` ```JSON `, etc.) are handled.
|
|
199
|
+
* - Callers should still treat the return value as untrusted — it may
|
|
200
|
+
* not be valid JSON (e.g. the model emitted prose, not JSON).
|
|
201
|
+
*
|
|
202
|
+
* This helper is idempotent: `stripJsonFences(stripJsonFences(x)) === stripJsonFences(x)`.
|
|
203
|
+
*
|
|
204
|
+
* @param rawOutput The raw LLM response text
|
|
205
|
+
* @returns Fence-stripped content if fences were present, otherwise `rawOutput` unchanged
|
|
206
|
+
*/
|
|
207
|
+
export function stripJsonFences(rawOutput) {
|
|
208
|
+
if (!rawOutput.includes('```'))
|
|
209
|
+
return rawOutput;
|
|
210
|
+
// Match the first fenced block, optionally with a language tag.
|
|
211
|
+
// The non-greedy `[\s\S]*?` keeps us from swallowing content after
|
|
212
|
+
// the first closing fence. Whitespace/newlines around the payload
|
|
213
|
+
// are tolerated so we accept both inline and multi-line fences.
|
|
214
|
+
const fenceMatch = rawOutput.match(/```(?:[a-zA-Z0-9_-]*)[ \t]*\n?([\s\S]*?)\n?[ \t]*```/);
|
|
215
|
+
if (fenceMatch && fenceMatch[1] !== undefined) {
|
|
216
|
+
return fenceMatch[1].trim();
|
|
217
|
+
}
|
|
218
|
+
return rawOutput;
|
|
219
|
+
}
|
|
186
220
|
/**
|
|
187
221
|
* Parse and validate structured output from raw LLM response text.
|
|
188
222
|
*
|
|
189
223
|
* This function:
|
|
190
|
-
* 1. Parses JSON from the raw output string
|
|
224
|
+
* 1. Parses JSON from the raw output string (with fallback fence stripping
|
|
225
|
+
* for models that wrap structured output in ` ```json ... ``` `)
|
|
191
226
|
* 2. Validates using the SchemaConfig's validate function (if provided)
|
|
192
227
|
* 3. Throws StructuredOutputError on failure
|
|
193
228
|
*
|
|
@@ -197,17 +232,35 @@ export function convertToProviderSchema(provider, options) {
|
|
|
197
232
|
* @throws StructuredOutputError if JSON parsing fails or validation fails
|
|
198
233
|
*/
|
|
199
234
|
export function parseStructured(config, rawOutput) {
|
|
200
|
-
// Step 1: Parse JSON
|
|
235
|
+
// Step 1: Parse JSON. Try the raw output first — well-behaved providers
|
|
236
|
+
// return clean JSON and we don't want to pay any cost in the fast path.
|
|
237
|
+
// If that fails, fall back to stripping markdown code fences before
|
|
238
|
+
// re-trying; some models (e.g. Gemma via Ollama) wrap structured output
|
|
239
|
+
// in ` ```json ... ``` ` even when a JSON schema is requested.
|
|
201
240
|
let parsed;
|
|
241
|
+
let parseError;
|
|
202
242
|
try {
|
|
203
243
|
parsed = JSON.parse(rawOutput);
|
|
204
244
|
}
|
|
205
245
|
catch (error) {
|
|
206
|
-
|
|
207
|
-
const syntaxError = error instanceof SyntaxError
|
|
246
|
+
parseError = error instanceof SyntaxError
|
|
208
247
|
? error
|
|
209
248
|
: new SyntaxError(String(error));
|
|
210
|
-
|
|
249
|
+
const fenceStripped = stripJsonFences(rawOutput);
|
|
250
|
+
if (fenceStripped !== rawOutput) {
|
|
251
|
+
try {
|
|
252
|
+
parsed = JSON.parse(fenceStripped);
|
|
253
|
+
parseError = undefined;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
// Fence stripping didn't help — fall through to throw the
|
|
257
|
+
// original parse error so error messages reflect what the
|
|
258
|
+
// model actually emitted, not the post-processed variant.
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (parseError) {
|
|
263
|
+
throw new StructuredOutputError(`Failed to parse JSON: ${parseError.message}`, { rawOutput, cause: parseError });
|
|
211
264
|
}
|
|
212
265
|
// Step 2: Validate if validator is provided
|
|
213
266
|
if (config.validate) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiIH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC5C,yDAAyD;IACzC,SAAS,CAAS;IAElC,oDAAoD;IAC3B,KAAK,CAAS;IAEvC,YAAY,OAAe,EAAE,OAAqC;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE3B,iFAAiF;QACjF,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC1B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;CACJ;AA2GD,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACrC,MAAiC;IAEjC,OAAO,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACrC,MAAiC;IAEjC,OAAO,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC;AAC/B,CAAC;AAED,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IAClD,yCAAyC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAe,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAI,OAAmC;IAChE,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAI,MAAuB;IAC9D,OAAO,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,2BAA2B,GAAG;IAChC,SAAS;IACT,WAAW;IACX,WAAW;IACX,SAAS;IACT,SAAS;IACT,kBAAkB;IAClB,kBAAkB;IAClB,iEAAiE;IACjE,sBAAsB;CAChB,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACpC,MAAkB,EAClB,QAAwB;IAExB,6CAA6C;IAC7C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,MAAM,MAAM,GAAe,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9D,0CAA0C;IAC1C,KAAK,MAAM,OAAO,IAAI,2BAA2B,EAAE,CAAC;QAChD,OAAQ,MAAkC,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,mCAAmC;IACnC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/C,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YACxF,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAChC,MAAkC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,IAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvI,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,OAAO,CAAC,GAAG,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAe,EAAE,QAAQ,CAAC,CAAC;QACxF,CAAC;IACL,CAAC;IAED,6BAA6B;IAC7B,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAkC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvG,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACnC,QAAwB,EACxB,OAAmC;IAEnC,sBAAsB;IACtB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAE1C,0CAA0C;IAC1C,MAAM,MAAM,GAAG,wBAAwB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE9D,sEAAsE;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,IAAI,IAAI,UAAU,CAAC;IAEtE,OAAO;QACH,MAAM;QACN,IAAI;QACJ,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,WAAW;KACxE,CAAC;AACN,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAC3B,MAAuB,EACvB,SAAiB;IAEjB,qBAAqB;IACrB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,sDAAsD;QACtD,MAAM,WAAW,GAAG,KAAK,YAAY,WAAW;YAC5C,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,qBAAqB,CAC3B,yBAAyB,WAAW,CAAC,OAAO,EAAE,EAC9C,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CACpC,CAAC;IACN,CAAC;IAED,4CAA4C;IAC5C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClB,IAAI,CAAC;YACD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,eAAe,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClF,MAAM,IAAI,qBAAqB,CAC3B,sBAAsB,eAAe,CAAC,OAAO,EAAE,EAC/C,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,CACxC,CAAC;QACN,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,OAAO,MAAW,CAAC;AACvB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAC9B,MAAuB,EACvB,SAAiB;IAEjB,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YACzC,OAAO;gBACH,EAAE,EAAE,KAAK;gBACT,KAAK;gBACL,SAAS;aACZ,CAAC;QACN,CAAC;QACD,6BAA6B;QAC7B,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CACpC,MAAuB,EACvB,IAAa,EACb,SAAkB;IAElB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClB,IAAI,CAAC;YACD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,eAAe,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClF,MAAM,IAAI,qBAAqB,CAC3B,sBAAsB,eAAe,CAAC,OAAO,EAAE,EAC/C,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CACjD,CAAC;QACN,CAAC;IACL,CAAC;IACD,OAAO,IAAS,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,OAAO,mBAAmB;IACpB,MAAM,GAAG,EAAE,CAAC;IACH,UAAU,CAAwB;IAEnD,YAAY,MAAuB;QAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAa;QACd,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QAErB,sCAAsC;QACtC,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC1C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAClD,CAAC;gBAAC,MAAM,CAAC;oBACL,uEAAuE;gBAC3E,CAAC;YACL,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACL,8BAA8B;QAClC,CAAC;QAED,kDAAkD;QAClD,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,eAAe;QACnB,qCAAqC;QACrC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAE5B,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO,GAAG,KAAK,CAAC;gBAChB,SAAS;YACb,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,OAAO,GAAG,IAAI,CAAC;gBACf,SAAS;YACb,CAAC;YAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACf,QAAQ,GAAG,CAAC,QAAQ,CAAC;gBACrB,SAAS;YACb,CAAC;YAED,IAAI,QAAQ;gBAAE,SAAS;YAEvB,IAAI,IAAI,KAAK,GAAG;gBAAE,UAAU,EAAE,CAAC;iBAC1B,IAAI,IAAI,KAAK,GAAG;gBAAE,UAAU,EAAE,CAAC;iBAC/B,IAAI,IAAI,KAAK,GAAG;gBAAE,YAAY,EAAE,CAAC;iBACjC,IAAI,IAAI,KAAK,GAAG;gBAAE,YAAY,EAAE,CAAC;QAC1C,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,OAAO,YAAY,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,GAAG,CAAC;YACf,YAAY,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,UAAU,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,GAAG,CAAC;YACf,UAAU,EAAE,CAAC;QACjB,CAAC;QAED,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACxC,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACL,2DAA2D;gBAC/D,CAAC;YACL,CAAC;YACD,OAAO,MAAW,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACL,iCAAiC;QACrC,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../src/structured-output.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Structured Output Core Types\r\n *\r\n * Core types for structured output support in universal-llm-client.\r\n * Zero-dependency — works with raw JSON Schema and optional validate functions.\r\n *\r\n * For Zod integration, use the `universal-llm-client/zod` entrypoint.\r\n *\r\n * @module structured-output\r\n */\r\n\r\n// ============================================================================\r\n// JSON Schema Types\r\n// ============================================================================\r\n\r\n/**\r\n * JSON Schema definition for structured output.\r\n * This is a subset of JSON Schema focused on what providers need.\r\n */\r\nexport interface JSONSchema {\r\n type?: string | string[];\r\n properties?: Record<string, JSONSchema>;\r\n items?: JSONSchema | JSONSchema[] | { type: string } | { type: string }[];\r\n required?: string[];\r\n additionalProperties?: boolean | JSONSchema;\r\n enum?: (string | number | boolean | null)[];\r\n const?: unknown;\r\n oneOf?: JSONSchema[];\r\n anyOf?: JSONSchema[];\r\n allOf?: JSONSchema[];\r\n not?: JSONSchema;\r\n description?: string;\r\n default?: unknown;\r\n examples?: unknown[];\r\n title?: string;\r\n format?: string;\r\n pattern?: string;\r\n minLength?: number;\r\n maxLength?: number;\r\n minimum?: number;\r\n maximum?: number;\r\n exclusiveMinimum?: number;\r\n exclusiveMaximum?: number;\r\n minItems?: number;\r\n maxItems?: number;\r\n uniqueItems?: boolean;\r\n minProperties?: number;\r\n maxProperties?: number;\r\n $ref?: string;\r\n $id?: string;\r\n $schema?: string;\r\n definitions?: Record<string, JSONSchema>;\r\n $defs?: Record<string, JSONSchema>;\r\n}\r\n\r\n// ============================================================================\r\n// SchemaConfig — The core abstraction replacing z.ZodType<T>\r\n// ============================================================================\r\n\r\n/**\r\n * Universal schema configuration for structured output.\r\n *\r\n * This is the Bring-Your-Own-Validator interface. The core library never\r\n * imports Zod — instead it accepts a JSON Schema + optional validate function.\r\n *\r\n * Use `universal-llm-client/zod` → `fromZod()` to create this from Zod schemas.\r\n *\r\n * @template T The expected output type\r\n *\r\n * @example\r\n * ```typescript\r\n * // Zero-dep usage (no Zod):\r\n * const config: SchemaConfig<{ name: string; age: number }> = {\r\n * jsonSchema: {\r\n * type: 'object',\r\n * properties: {\r\n * name: { type: 'string' },\r\n * age: { type: 'number' },\r\n * },\r\n * required: ['name', 'age'],\r\n * },\r\n * validate: (data) => data as { name: string; age: number },\r\n * };\r\n *\r\n * // With Zod (via adapter):\r\n * import { fromZod } from 'universal-llm-client/zod';\r\n * const config = fromZod(z.object({ name: z.string(), age: z.number() }));\r\n * ```\r\n */\r\nexport interface SchemaConfig<T = unknown> {\r\n /** JSON Schema sent to the LLM provider */\r\n readonly jsonSchema: JSONSchema;\r\n /**\r\n * Optional validator: parse unknown → T or throw.\r\n * If omitted, JSON.parse() result is returned as-is (unsafe cast).\r\n */\r\n readonly validate?: (data: unknown) => T;\r\n /** Schema name (for provider guidance, e.g. OpenAI strict mode) */\r\n readonly name?: string;\r\n /** Schema description (for provider guidance) */\r\n readonly description?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Provider Schema Types\r\n// ============================================================================\r\n\r\n/**\r\n * Provider identifier for schema conversion.\r\n */\r\nexport type SchemaProvider = 'openai' | 'ollama' | 'google';\r\n\r\n/**\r\n * Result of converting a schema for a specific provider.\r\n */\r\nexport interface ProviderSchema {\r\n /** The JSON Schema for the provider */\r\n schema: JSONSchema;\r\n /** Optional schema name (used by OpenAI) */\r\n name?: string;\r\n /** Optional schema description (used by OpenAI) */\r\n description?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Structured Output Error\r\n// ============================================================================\r\n\r\n/**\r\n * Error options for StructuredOutputError\r\n */\r\nexport interface StructuredOutputErrorOptions {\r\n /** The raw output from the LLM that failed validation */\r\n rawOutput: string;\r\n /** The underlying cause (e.g., validation error) */\r\n cause?: Error;\r\n}\r\n\r\n/**\r\n * Custom error class for structured output validation failures.\r\n *\r\n * Thrown when:\r\n * - JSON parsing of LLM response fails\r\n * - Schema validation fails\r\n *\r\n * Features:\r\n * - `rawOutput` property containing the original LLM response\r\n * - `cause` property for the underlying error\r\n *\r\n * @example\r\n * ```typescript\r\n * try {\r\n * const result = await model.generateStructured(schema, messages);\r\n * } catch (error) {\r\n * if (error instanceof StructuredOutputError) {\r\n * console.log('Raw LLM output:', error.rawOutput);\r\n * console.log('Cause:', error.cause);\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class StructuredOutputError extends Error {\r\n /** The raw output from the LLM that failed validation */\r\n public readonly rawOutput: string;\r\n\r\n /** The underlying cause (e.g., validation error) */\r\n public override readonly cause?: Error;\r\n\r\n constructor(message: string, options: StructuredOutputErrorOptions) {\r\n super(message);\r\n this.rawOutput = options.rawOutput;\r\n this.cause = options.cause;\r\n\r\n // Maintains proper stack trace for where error was thrown (only available in V8)\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, StructuredOutputError);\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Structured Output Options (legacy — prefer SchemaConfig)\r\n// ============================================================================\r\n\r\n/**\r\n * Options for structured output generation.\r\n *\r\n * Accepts either:\r\n * - A SchemaConfig (recommended)\r\n * - A raw JSON Schema object for flexibility\r\n *\r\n * @template T The expected output type\r\n *\r\n * @example\r\n * ```typescript\r\n * // Using SchemaConfig\r\n * const options: StructuredOutputOptions<User> = {\r\n * schemaConfig: mySchemaConfig,\r\n * };\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Using raw JSON Schema\r\n * const options: StructuredOutputOptions<User> = {\r\n * jsonSchema: {\r\n * type: 'object',\r\n * properties: {\r\n * name: { type: 'string' },\r\n * age: { type: 'number' },\r\n * },\r\n * required: ['name', 'age'],\r\n * },\r\n * };\r\n * ```\r\n */\r\nexport interface StructuredOutputOptions<T> {\r\n /**\r\n * Schema configuration for structured output.\r\n * Contains JSON Schema + optional validator.\r\n */\r\n schemaConfig?: SchemaConfig<T>;\r\n\r\n /**\r\n * Raw JSON Schema for structured output.\r\n * Use this when you have a pre-defined schema without validation.\r\n */\r\n jsonSchema?: JSONSchema;\r\n\r\n /**\r\n * Optional name for the schema.\r\n * Used by providers like OpenAI for better LLM guidance.\r\n */\r\n name?: string;\r\n\r\n /**\r\n * Optional description for the schema.\r\n * Used by providers like OpenAI for better LLM guidance.\r\n */\r\n description?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Structured Output Result\r\n// ============================================================================\r\n\r\n/**\r\n * Successful structured output result.\r\n *\r\n * @template T The output type\r\n */\r\nexport interface StructuredOutputSuccess<T> {\r\n /** Indicates success */\r\n readonly ok: true;\r\n /** The validated output value */\r\n readonly value: T;\r\n}\r\n\r\n/**\r\n * Failed structured output result.\r\n *\r\n * @template _T The expected output type (unused but kept for type alignment with StructuredOutputSuccess)\r\n */\r\nexport interface StructuredOutputFailure<_T> {\r\n /** Indicates failure */\r\n readonly ok: false;\r\n /** The error that occurred */\r\n readonly error: StructuredOutputError;\r\n /** The raw output from the LLM */\r\n readonly rawOutput: string;\r\n}\r\n\r\n/**\r\n * Result of structured output parsing.\r\n *\r\n * Discriminated union type that provides type-safe result handling:\r\n * - `ok: true` → `{ value: T }`\r\n * - `ok: false` → `{ error: StructuredOutputError, rawOutput: string }`\r\n *\r\n * @template T The output type\r\n */\r\nexport type StructuredOutputResult<T> =\r\n | StructuredOutputSuccess<T>\r\n | StructuredOutputFailure<T>;\r\n\r\n// ============================================================================\r\n// Type Guards\r\n// ============================================================================\r\n\r\n/**\r\n * Type guard to check if a structured output result is successful.\r\n */\r\nexport function isStructuredOutputSuccess<T>(\r\n result: StructuredOutputResult<T>,\r\n): result is StructuredOutputSuccess<T> {\r\n return result.ok === true;\r\n}\r\n\r\n/**\r\n * Type guard to check if a structured output result is a failure.\r\n */\r\nexport function isStructuredOutputFailure<T>(\r\n result: StructuredOutputResult<T>,\r\n): result is StructuredOutputFailure<T> {\r\n return result.ok === false;\r\n}\r\n\r\n// ============================================================================\r\n// Schema Conversion Utilities\r\n// ============================================================================\r\n\r\n/**\r\n * Normalize a raw JSON Schema.\r\n *\r\n * Currently passes through without modification.\r\n * Future versions may add normalization for provider compatibility.\r\n *\r\n * @param schema The JSON Schema to normalize\r\n * @returns Normalized JSON Schema\r\n */\r\nexport function normalizeJsonSchema(schema: JSONSchema): JSONSchema {\r\n // Deep clone to avoid mutating the input\r\n return JSON.parse(JSON.stringify(schema)) as JSONSchema;\r\n}\r\n\r\n/**\r\n * Get the JSON Schema from a SchemaConfig or StructuredOutputOptions.\r\n *\r\n * @param options The structured output options\r\n * @returns JSON Schema\r\n */\r\nexport function getJsonSchema<T>(options: StructuredOutputOptions<T>): JSONSchema {\r\n if (options.schemaConfig) {\r\n return normalizeJsonSchema(options.schemaConfig.jsonSchema);\r\n }\r\n if (options.jsonSchema) {\r\n return normalizeJsonSchema(options.jsonSchema);\r\n }\r\n throw new Error('Either schemaConfig or jsonSchema must be provided');\r\n}\r\n\r\n/**\r\n * Get the JSON Schema from a SchemaConfig directly.\r\n */\r\nexport function getJsonSchemaFromConfig<T>(config: SchemaConfig<T>): JSONSchema {\r\n return normalizeJsonSchema(config.jsonSchema);\r\n}\r\n\r\n/**\r\n * Features that some providers don't support.\r\n * These are removed when transforming schemas for those providers.\r\n */\r\nconst GOOGLE_UNSUPPORTED_FEATURES = [\r\n 'pattern',\r\n 'minLength',\r\n 'maxLength',\r\n 'minimum',\r\n 'maximum',\r\n 'exclusiveMinimum',\r\n 'exclusiveMaximum',\r\n // Google doesn't support additionalProperties in response schema\r\n 'additionalProperties',\r\n] as const;\r\n\r\n/**\r\n * Strip unsupported features from a JSON Schema for a specific provider.\r\n *\r\n * Google/Gemini doesn't support certain JSON Schema features like pattern, min/max.\r\n * This function removes those recursively.\r\n *\r\n * @param schema The JSON Schema to transform\r\n * @param provider The target provider\r\n * @returns Cleaned JSON Schema\r\n */\r\nexport function stripUnsupportedFeatures(\r\n schema: JSONSchema,\r\n provider: SchemaProvider,\r\n): JSONSchema {\r\n // Only Google needs transformation currently\r\n if (provider !== 'google') {\r\n return schema;\r\n }\r\n\r\n // Deep clone to avoid mutating input\r\n const result: JSONSchema = JSON.parse(JSON.stringify(schema));\r\n\r\n // Remove unsupported top-level properties\r\n for (const feature of GOOGLE_UNSUPPORTED_FEATURES) {\r\n delete (result as Record<string, unknown>)[feature];\r\n }\r\n\r\n // Recursively clean nested schemas\r\n if (result.properties) {\r\n for (const key of Object.keys(result.properties)) {\r\n if (result.properties[key]) {\r\n result.properties[key] = stripUnsupportedFeatures(result.properties[key], provider);\r\n }\r\n }\r\n }\r\n\r\n if (result['items']) {\r\n if (Array.isArray(result['items'])) {\r\n (result as Record<string, unknown>)['items'] = result['items'].map(item => stripUnsupportedFeatures(item as JSONSchema, provider));\r\n } else {\r\n result['items'] = stripUnsupportedFeatures(result['items'] as JSONSchema, provider);\r\n }\r\n }\r\n\r\n // Handle oneOf, anyOf, allOf\r\n for (const key of ['oneOf', 'anyOf', 'allOf'] as const) {\r\n const schemas = result[key];\r\n if (Array.isArray(schemas)) {\r\n (result as Record<string, unknown>)[key] = schemas.map(s => stripUnsupportedFeatures(s, provider));\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Convert structured output options to a provider-specific schema.\r\n *\r\n * This function:\r\n * 1. Extracts/converts the JSON Schema from options\r\n * 2. Applies provider-specific transformations (e.g., removing unsupported features for Google)\r\n * 3. Adds name/description for LLM guidance\r\n */\r\nexport function convertToProviderSchema<T>(\r\n provider: SchemaProvider,\r\n options: StructuredOutputOptions<T>,\r\n): ProviderSchema {\r\n // Get the JSON Schema\r\n const jsonSchema = getJsonSchema(options);\r\n\r\n // Apply provider-specific transformations\r\n const schema = stripUnsupportedFeatures(jsonSchema, provider);\r\n\r\n // Generate a default name if not provided (some providers require it)\r\n const name = options.name ?? options.schemaConfig?.name ?? 'response';\r\n\r\n return {\r\n schema,\r\n name,\r\n description: options.description ?? options.schemaConfig?.description,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Validation Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Strip markdown code fences from raw LLM output.\r\n *\r\n * Some providers/models — notably Gemma variants via Ollama — wrap\r\n * structured JSON output in ` ```json ... ``` ` fences even when a JSON\r\n * schema is passed via the `format` field. This helper extracts the\r\n * inner payload so it can be fed to `JSON.parse`.\r\n *\r\n * Behavior:\r\n * - If the input contains no triple-backtick fences, the input is\r\n * returned unchanged (zero risk of disturbing well-formed output).\r\n * - Otherwise, the first fenced block is extracted and returned trimmed.\r\n * Language tags (` ```json `, ` ```JSON `, etc.) are handled.\r\n * - Callers should still treat the return value as untrusted — it may\r\n * not be valid JSON (e.g. the model emitted prose, not JSON).\r\n *\r\n * This helper is idempotent: `stripJsonFences(stripJsonFences(x)) === stripJsonFences(x)`.\r\n *\r\n * @param rawOutput The raw LLM response text\r\n * @returns Fence-stripped content if fences were present, otherwise `rawOutput` unchanged\r\n */\r\nexport function stripJsonFences(rawOutput: string): string {\r\n if (!rawOutput.includes('```')) return rawOutput;\r\n\r\n // Match the first fenced block, optionally with a language tag.\r\n // The non-greedy `[\\s\\S]*?` keeps us from swallowing content after\r\n // the first closing fence. Whitespace/newlines around the payload\r\n // are tolerated so we accept both inline and multi-line fences.\r\n const fenceMatch = rawOutput.match(\r\n /```(?:[a-zA-Z0-9_-]*)[ \\t]*\\n?([\\s\\S]*?)\\n?[ \\t]*```/,\r\n );\r\n if (fenceMatch && fenceMatch[1] !== undefined) {\r\n return fenceMatch[1].trim();\r\n }\r\n return rawOutput;\r\n}\r\n\r\n/**\r\n * Parse and validate structured output from raw LLM response text.\r\n *\r\n * This function:\r\n * 1. Parses JSON from the raw output string (with fallback fence stripping\r\n * for models that wrap structured output in ` ```json ... ``` `)\r\n * 2. Validates using the SchemaConfig's validate function (if provided)\r\n * 3. Throws StructuredOutputError on failure\r\n *\r\n * @param config The schema configuration with optional validator\r\n * @param rawOutput The raw string output from the LLM\r\n * @returns The validated and typed data\r\n * @throws StructuredOutputError if JSON parsing fails or validation fails\r\n */\r\nexport function parseStructured<T>(\r\n config: SchemaConfig<T>,\r\n rawOutput: string,\r\n): T {\r\n // Step 1: Parse JSON. Try the raw output first — well-behaved providers\r\n // return clean JSON and we don't want to pay any cost in the fast path.\r\n // If that fails, fall back to stripping markdown code fences before\r\n // re-trying; some models (e.g. Gemma via Ollama) wrap structured output\r\n // in ` ```json ... ``` ` even when a JSON schema is requested.\r\n let parsed: unknown;\r\n let parseError: SyntaxError | undefined;\r\n try {\r\n parsed = JSON.parse(rawOutput);\r\n } catch (error) {\r\n parseError = error instanceof SyntaxError\r\n ? error\r\n : new SyntaxError(String(error));\r\n\r\n const fenceStripped = stripJsonFences(rawOutput);\r\n if (fenceStripped !== rawOutput) {\r\n try {\r\n parsed = JSON.parse(fenceStripped);\r\n parseError = undefined;\r\n } catch {\r\n // Fence stripping didn't help — fall through to throw the\r\n // original parse error so error messages reflect what the\r\n // model actually emitted, not the post-processed variant.\r\n }\r\n }\r\n }\r\n\r\n if (parseError) {\r\n throw new StructuredOutputError(\r\n `Failed to parse JSON: ${parseError.message}`,\r\n { rawOutput, cause: parseError },\r\n );\r\n }\r\n\r\n // Step 2: Validate if validator is provided\r\n if (config.validate) {\r\n try {\r\n return config.validate(parsed);\r\n } catch (error) {\r\n const validationError = error instanceof Error ? error : new Error(String(error));\r\n throw new StructuredOutputError(\r\n `Validation failed: ${validationError.message}`,\r\n { rawOutput, cause: validationError },\r\n );\r\n }\r\n }\r\n\r\n // No validator — return as-is (unsafe cast, user chose to skip validation)\r\n return parsed as T;\r\n}\r\n\r\n/**\r\n * Try to parse and validate structured output, returning a result object.\r\n *\r\n * This is the non-throwing variant of `parseStructured`. Instead of throwing\r\n * on validation failure, it returns a result object with `ok: false` and\r\n * the error details.\r\n *\r\n * @param config The schema configuration with optional validator\r\n * @param rawOutput The raw string output from the LLM\r\n * @returns A result object: `{ ok: true, value }` on success, `{ ok: false, error, rawOutput }` on failure\r\n */\r\nexport function tryParseStructured<T>(\r\n config: SchemaConfig<T>,\r\n rawOutput: string,\r\n): StructuredOutputResult<T> {\r\n try {\r\n const value = parseStructured(config, rawOutput);\r\n return { ok: true, value };\r\n } catch (error) {\r\n if (error instanceof StructuredOutputError) {\r\n return {\r\n ok: false,\r\n error,\r\n rawOutput,\r\n };\r\n }\r\n // Re-throw unexpected errors\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Validate already-parsed data using a SchemaConfig's validator.\r\n *\r\n * This is useful when you have already parsed JSON and need to validate it.\r\n *\r\n * @param config The schema configuration with optional validator\r\n * @param data The parsed data to validate\r\n * @param rawOutput Optional raw output string for error messages\r\n * @returns The validated and typed data\r\n * @throws StructuredOutputError if validation fails\r\n */\r\nexport function validateStructuredOutput<T>(\r\n config: SchemaConfig<T>,\r\n data: unknown,\r\n rawOutput?: string,\r\n): T {\r\n if (config.validate) {\r\n try {\r\n return config.validate(data);\r\n } catch (error) {\r\n const rawData = rawOutput ?? JSON.stringify(data);\r\n const validationError = error instanceof Error ? error : new Error(String(error));\r\n throw new StructuredOutputError(\r\n `Validation failed: ${validationError.message}`,\r\n { rawOutput: rawData, cause: validationError },\r\n );\r\n }\r\n }\r\n return data as T;\r\n}\r\n\r\n// ============================================================================\r\n// Streaming JSON Parsing\r\n// ============================================================================\r\n\r\n/**\r\n * Incremental JSON parser for streaming structured output.\r\n *\r\n * Allows parsing partial JSON as it streams in, returning validated partial\r\n * objects when possible. Useful for structured output streaming where you\r\n * want to see partial results before the complete JSON arrives.\r\n */\r\nexport class StreamingJsonParser<T> {\r\n private buffer = '';\r\n private readonly validateFn?: (data: unknown) => T;\r\n\r\n constructor(config: SchemaConfig<T>) {\r\n this.validateFn = config.validate;\r\n }\r\n\r\n /**\r\n * Feed a chunk of JSON text to the parser.\r\n * Returns a validated partial object if the current buffer can be parsed\r\n * as valid JSON that passes validation, or undefined if not yet valid.\r\n */\r\n feed(chunk: string): { partial: T | undefined; complete: boolean } {\r\n this.buffer += chunk;\r\n\r\n // Try to parse as complete JSON first\r\n try {\r\n const parsed = JSON.parse(this.buffer);\r\n if (this.validateFn) {\r\n try {\r\n const validated = this.validateFn(parsed);\r\n return { partial: validated, complete: true };\r\n } catch {\r\n // Validation failed on complete JSON — return parsed but not validated\r\n }\r\n }\r\n return { partial: parsed as T, complete: true };\r\n } catch {\r\n // Not yet valid complete JSON\r\n }\r\n\r\n // Try to create a valid partial by closing braces\r\n const partialResult = this.tryParsePartial();\r\n return { partial: partialResult, complete: false };\r\n }\r\n\r\n /**\r\n * Get the current buffer content.\r\n */\r\n getBuffer(): string {\r\n return this.buffer;\r\n }\r\n\r\n /**\r\n * Reset the parser state.\r\n */\r\n reset(): void {\r\n this.buffer = '';\r\n }\r\n\r\n /**\r\n * Attempt to parse partial JSON by adding closing brackets.\r\n */\r\n private tryParsePartial(): T | undefined {\r\n // Count unclosed brackets and braces\r\n let braceCount = 0;\r\n let bracketCount = 0;\r\n let inString = false;\r\n let escaped = false;\r\n\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n const char = this.buffer[i];\r\n\r\n if (escaped) {\r\n escaped = false;\r\n continue;\r\n }\r\n\r\n if (char === '\\\\' && inString) {\r\n escaped = true;\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n inString = !inString;\r\n continue;\r\n }\r\n\r\n if (inString) continue;\r\n\r\n if (char === '{') braceCount++;\r\n else if (char === '}') braceCount--;\r\n else if (char === '[') bracketCount++;\r\n else if (char === ']') bracketCount--;\r\n }\r\n\r\n // Build closing sequence\r\n let closing = '';\r\n while (bracketCount > 0) {\r\n closing += ']';\r\n bracketCount--;\r\n }\r\n while (braceCount > 0) {\r\n closing += '}';\r\n braceCount--;\r\n }\r\n\r\n // Try parsing with closing\r\n const candidate = this.buffer + closing;\r\n try {\r\n const parsed = JSON.parse(candidate);\r\n if (this.validateFn) {\r\n try {\r\n return this.validateFn(parsed);\r\n } catch {\r\n // Partial validation failed — that's expected for partials\r\n }\r\n }\r\n return parsed as T;\r\n } catch {\r\n // Silently fail for partial JSON\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Streaming structured output result.\r\n * Each partial yield from the generator is a validated object (possibly partial).\r\n * The final return value is the complete validated object.\r\n */\r\nexport interface StreamingStructuredResult<T> {\r\n /** Whether this is partial (incomplete) data */\r\n partial: boolean;\r\n /** The validated partial or complete object */\r\n value: T;\r\n}\r\n"]}
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,OAAO,WAAW;IACZ,IAAI,CAAS;IACb,IAAI,GAAW,EAAE,CAAC;IAClB,UAAU,GAA4B,EAAE,CAAC;IACzC,QAAQ,GAAa,EAAE,CAAC;IAEhC,YAAY,IAAY;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,IAAY;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,YAAY,CACR,IAAY,EACZ,IAAY,EACZ,WAAmB,EACnB,aAAsB,KAAK,EAC3B,KAA+B;QAE/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG;YACpB,IAAI;YACJ,WAAW;YACX,GAAG,KAAK;SACX,CAAC;QACF,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK;QACD,OAAO;YACH,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,IAAI;gBACtB,UAAU,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;iBACjE;aACJ;SACJ,CAAC;IACN,CAAC;IAED,qDAAqD;IACrD,aAAa;QACT,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC;IACjC,CAAC;CACJ;AAED,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,YAAY;IACrB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,OAAoB,EAAE,SAAiB;QACtD,OAAO,KAAK,EAAE,IAAa,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAC9B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC7B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,SAAS,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAChG;aACJ,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAClB,CAAC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,OAAoB;QAC5B,OAAO,KAAK,EAAE,IAAa,EAAE,EAAE;YAC3B,IAAI,CAAC;gBACD,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO;oBACH,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE,CAAC;YACN,CAAC;QACL,CAAC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,cAAc,CACjB,OAAoB,EACpB,cAAwB;QAExB,OAAO,KAAK,EAAE,IAAa,EAAE,EAAE;YAC3B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,GAAG,GAAG,IAA+B,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACjC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;oBAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACL,CAAC;YACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,OAAoB;QAC7B,OAAO,KAAK,EAAE,IAAa,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YACnC,OAAO;gBACH,MAAM;gBACN,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC;QACN,CAAC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO,CACV,OAAoB,EACpB,GAAG,QAAgD;QAEnD,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;CACJ;AAED,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,cAAc;IAM1B,OAAO;QACH,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,+BAA+B;QAC5C,UAAU,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACR,QAAQ,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;iBAC3E;aACJ;SACJ;QACD,OAAO,EAAE,CAAC,IAAa,EAAE,EAAE;YACvB,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAA0B,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC;gBACD,OAAO;oBACH,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE;oBACtB,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE;wBACnC,QAAQ,EAAE,QAAQ,IAAI,KAAK;wBAC3B,SAAS,EAAE,MAAM;wBACjB,SAAS,EAAE,MAAM;qBACpB,CAAC;oBACF,QAAQ,EAAE,QAAQ,IAAI,KAAK;oBAC3B,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE;iBAC3B,CAAC;YACN,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO;oBACH,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE;oBACtB,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;oBAC5B,QAAQ,EAAE,KAAK;oBACf,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE;iBAC3B,CAAC;YACN,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IAMlC,OAAO;QACH,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,yCAAyC;QACtD,UAAU,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACR,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;gBACjE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;aACtE;SACJ;QACD,OAAO,EAAE,CAAC,IAAa,EAAE,EAAE;YACvB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAmC,CAAC;YAC9E,OAAO;gBACH,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;gBACxD,GAAG;gBACH,GAAG;aACN,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Universal LLM Client v3 — Tool Utilities\r\n *\r\n * ToolBuilder: Type-safe tool definition builder with fluent API.\r\n * ToolExecutor: Execution wrappers with timeout and validation.\r\n */\r\n\r\nimport type { LLMFunction, LLMToolDefinition, ToolHandler } from './interfaces.js';\r\n\r\n// ============================================================================\r\n// ToolBuilder\r\n// ============================================================================\r\n\r\n/**\r\n * Fluent builder for LLM tool definitions.\r\n *\r\n * Usage:\r\n * const tool = new ToolBuilder('get_weather')\r\n * .description('Get current weather for a location')\r\n * .addParameter('location', 'string', 'City name', true)\r\n * .addParameter('units', 'string', 'Temperature units', false, { enum: ['celsius', 'fahrenheit'] })\r\n * .build();\r\n */\r\nexport class ToolBuilder {\r\n private name: string;\r\n private desc: string = '';\r\n private properties: Record<string, unknown> = {};\r\n private required: string[] = [];\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n }\r\n\r\n description(desc: string): this {\r\n this.desc = desc;\r\n return this;\r\n }\r\n\r\n addParameter(\r\n name: string,\r\n type: string,\r\n description: string,\r\n isRequired: boolean = false,\r\n extra?: Record<string, unknown>,\r\n ): this {\r\n this.properties[name] = {\r\n type,\r\n description,\r\n ...extra,\r\n };\r\n if (isRequired) {\r\n this.required.push(name);\r\n }\r\n return this;\r\n }\r\n\r\n build(): LLMToolDefinition {\r\n return {\r\n type: 'function',\r\n function: {\r\n name: this.name,\r\n description: this.desc,\r\n parameters: {\r\n type: 'object',\r\n properties: this.properties,\r\n required: this.required.length > 0 ? this.required : undefined,\r\n },\r\n },\r\n };\r\n }\r\n\r\n /** Build and return the function definition only */\r\n buildFunction(): LLMFunction {\r\n return this.build().function;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// ToolExecutor\r\n// ============================================================================\r\n\r\n/**\r\n * Utility wrappers for creating safe tool handlers.\r\n */\r\nexport class ToolExecutor {\r\n /**\r\n * Wrap a handler with a timeout.\r\n * Rejects if the handler doesn't complete within the specified ms.\r\n */\r\n static withTimeout(handler: ToolHandler, timeoutMs: number): ToolHandler {\r\n return async (args: unknown) => {\r\n const result = await Promise.race([\r\n Promise.resolve(handler(args)),\r\n new Promise<never>((_, reject) =>\r\n setTimeout(() => reject(new Error(`Tool execution timeout after ${timeoutMs}ms`)), timeoutMs),\r\n ),\r\n ]);\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * Wrap a handler to catch errors and return them as strings\r\n * instead of throwing.\r\n */\r\n static safe(handler: ToolHandler): ToolHandler {\r\n return async (args: unknown) => {\r\n try {\r\n return await handler(args);\r\n } catch (error) {\r\n return {\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Wrap a handler with argument validation.\r\n * Checks that required fields are present before execution.\r\n */\r\n static withValidation(\r\n handler: ToolHandler,\r\n requiredFields: string[],\r\n ): ToolHandler {\r\n return async (args: unknown) => {\r\n if (!args || typeof args !== 'object') {\r\n throw new Error('Tool arguments must be an object');\r\n }\r\n const obj = args as Record<string, unknown>;\r\n for (const field of requiredFields) {\r\n if (obj[field] === undefined || obj[field] === null) {\r\n throw new Error(`Missing required argument: ${field}`);\r\n }\r\n }\r\n return handler(args);\r\n };\r\n }\r\n\r\n /**\r\n * Create a handler that measures execution time and\r\n * returns both the result and duration.\r\n */\r\n static timed(handler: ToolHandler): ToolHandler {\r\n return async (args: unknown) => {\r\n const start = Date.now();\r\n const result = await handler(args);\r\n return {\r\n result,\r\n duration: Date.now() - start,\r\n };\r\n };\r\n }\r\n\r\n /**\r\n * Compose multiple wrappers around a handler.\r\n * Applied from right to left (innermost to outermost).\r\n */\r\n static compose(\r\n handler: ToolHandler,\r\n ...wrappers: Array<(h: ToolHandler) => ToolHandler>\r\n ): ToolHandler {\r\n return wrappers.reduceRight((h, wrapper) => wrapper(h), handler);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Common Tool Definitions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a get_current_time tool definition and handler.\r\n */\r\nexport function createTimeTool(): {\r\n name: string;\r\n description: string;\r\n parameters: LLMFunction['parameters'];\r\n handler: ToolHandler;\r\n} {\r\n return {\r\n name: 'get_current_time',\r\n description: 'Get the current date and time',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n timezone: {\r\n type: 'string',\r\n description: 'IANA timezone (e.g. \"America/New_York\"). Defaults to UTC.',\r\n },\r\n },\r\n },\r\n handler: (args: unknown) => {\r\n const { timezone } = (args ?? {}) as { timezone?: string };\r\n const now = new Date();\r\n try {\r\n return {\r\n iso: now.toISOString(),\r\n formatted: now.toLocaleString('en-US', {\r\n timeZone: timezone || 'UTC',\r\n dateStyle: 'full',\r\n timeStyle: 'long',\r\n }),\r\n timezone: timezone || 'UTC',\r\n timestamp: now.getTime(),\r\n };\r\n } catch {\r\n return {\r\n iso: now.toISOString(),\r\n formatted: now.toUTCString(),\r\n timezone: 'UTC',\r\n timestamp: now.getTime(),\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Create a random_number tool definition and handler.\r\n */\r\nexport function createRandomNumberTool(): {\r\n name: string;\r\n description: string;\r\n parameters: LLMFunction['parameters'];\r\n handler: ToolHandler;\r\n} {\r\n return {\r\n name: 'random_number',\r\n description: 'Generate a random number within a range',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n min: { type: 'number', description: 'Minimum value (default 0)' },\r\n max: { type: 'number', description: 'Maximum value (default 100)' },\r\n },\r\n },\r\n handler: (args: unknown) => {\r\n const { min = 0, max = 100 } = (args ?? {}) as { min?: number; max?: number };\r\n return {\r\n value: Math.floor(Math.random() * (max - min + 1)) + min,\r\n min,\r\n max,\r\n };\r\n },\r\n };\r\n}\r\n"]}
|
package/dist/zod-adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-adapter.js","sourceRoot":"","sources":["../src/zod-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,OAAO,CACnB,MAAoB,EACpB,OAAiD;IAEjD,gEAAgE;IAChE,MAAM,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE;QACzC,MAAM,EAAE,UAAU;QAClB,eAAe,EAAE,KAAK;KACzB,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAA6B,CAAC;IACnE,OAAO,UAAU,CAAC,OAAO,CAAC;IAE1B,OAAO;QACH,UAAU,EAAE,UAAyD;QACrE,QAAQ,EAAE,CAAC,IAAa,EAAK,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,WAAW,EAAE,OAAO,EAAE,WAAW;KACpC,CAAC;AACN,CAAC;AAED,yEAAyE;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"zod-adapter.js","sourceRoot":"","sources":["../src/zod-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,OAAO,CACnB,MAAoB,EACpB,OAAiD;IAEjD,gEAAgE;IAChE,MAAM,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE;QACzC,MAAM,EAAE,UAAU;QAClB,eAAe,EAAE,KAAK;KACzB,CAAC,CAAC;IAEH,0DAA0D;IAC1D,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAA6B,CAAC;IACnE,OAAO,UAAU,CAAC,OAAO,CAAC;IAE1B,OAAO;QACH,UAAU,EAAE,UAAyD;QACrE,QAAQ,EAAE,CAAC,IAAa,EAAK,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,WAAW,EAAE,OAAO,EAAE,WAAW;KACpC,CAAC;AACN,CAAC;AAED,yEAAyE;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC","sourcesContent":["/**\r\n * Zod Adapter for Universal LLM Client\r\n *\r\n * Optional entrypoint for projects that use Zod for schema validation.\r\n * Import from 'universal-llm-client/zod' to use.\r\n *\r\n * @module universal-llm-client/zod\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport type { SchemaConfig } from './structured-output.js';\r\n\r\n/**\r\n * Create a SchemaConfig from a Zod schema.\r\n *\r\n * This bridges Zod's type-safe schema definitions to the library's\r\n * generic SchemaConfig interface, using Zod 4's native `z.toJSONSchema()`.\r\n *\r\n * @template T The type inferred from the Zod schema\r\n * @param schema The Zod schema\r\n * @param options Optional name and description for LLM guidance\r\n * @returns SchemaConfig ready for use with generateStructured, etc.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { fromZod } from 'universal-llm-client/zod';\r\n * import { z } from 'zod';\r\n *\r\n * const UserSchema = z.object({\r\n * name: z.string(),\r\n * age: z.number(),\r\n * });\r\n *\r\n * const config = fromZod(UserSchema, { name: 'User' });\r\n *\r\n * const user = await model.generateStructured(config, messages);\r\n * // user.name: string, user.age: number (fully typed)\r\n * ```\r\n */\r\nexport function fromZod<T>(\r\n schema: z.ZodType<T>,\r\n options?: { name?: string; description?: string },\r\n): SchemaConfig<T> {\r\n // Convert Zod schema to JSON Schema using Zod 4's native method\r\n const rawJsonSchema = z.toJSONSchema(schema, {\r\n target: 'draft-07',\r\n unrepresentable: 'any',\r\n });\r\n\r\n // Clean up — remove $schema since providers don't need it\r\n const jsonSchema = { ...rawJsonSchema } as Record<string, unknown>;\r\n delete jsonSchema.$schema;\r\n\r\n return {\r\n jsonSchema: jsonSchema as import('./structured-output.js').JSONSchema,\r\n validate: (data: unknown): T => {\r\n const result = schema.safeParse(data);\r\n if (!result.success) {\r\n throw result.error;\r\n }\r\n return result.data;\r\n },\r\n name: options?.name,\r\n description: options?.description,\r\n };\r\n}\r\n\r\n// Re-export z for convenience (users importing from /zod likely want it)\r\nexport { z } from 'zod';\r\n\r\n// Re-export SchemaConfig for type usage\r\nexport type { SchemaConfig } from './structured-output.js';\r\n"]}
|