{"version":3,"sources":["../../../src/llms/drivers/base.ts"],"names":["BaseDriver","Serializable","errorTemplate","constructor","llm","PromptTemplate","schema","z","object","errors","string","expected","received","template","guided","undefined","generate","input","maxRetries","options","jsonSchema","toJsonSchema","validator","createSchemaValidator","schemaString","schemaToString","messages","BaseMessage","of","role","Role","SYSTEM","text","render","Retryable","executor","raw","textResponse","getTextContent","parsed","parseResponse","error","LLMError","isFatal","isRetryable","context","message","success","JSON","stringify","push","USER","config","signal","get","createSnapshot","loadSnapshot","snapshot","Object","assign"],"mappings":"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","file":"base.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createSchemaValidator, toJsonSchema } from \"@/internals/helpers/schema.js\";\nimport { GenerateOptions, LLMError } from \"@/llms/base.js\";\nimport { ChatLLM, ChatLLMOutput } from \"@/llms/chat.js\";\nimport { BaseMessage, Role } from \"@/llms/primitives/message.js\";\nimport { Retryable } from \"@/internals/helpers/retryable.js\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { SchemaObject } from \"ajv\";\nimport { TypeOf, z, ZodTypeAny } from \"zod\";\nimport { Serializable } from \"@/internals/serializable.js\";\n\nexport interface GenerateSchemaInput<T> {\n  maxRetries?: number;\n  options?: T;\n}\n\nexport interface DriverResponse<T> {\n  raw: ChatLLMOutput;\n  parsed: T extends ZodTypeAny ? TypeOf<T> : T;\n  messages: BaseMessage[];\n}\n\nexport abstract class BaseDriver<\n  TGenerateOptions extends GenerateOptions = GenerateOptions,\n> extends Serializable<any> {\n  protected abstract template: PromptTemplate.infer<{ schema: string }>;\n  protected errorTemplate = new PromptTemplate({\n    schema: z.object({\n      errors: z.string(),\n      expected: z.string(),\n      received: z.string(),\n    }),\n    template: `Generated response does not match the expected schema!\nValidation Errors: \"{{errors}}\"`,\n  });\n\n  constructor(protected readonly llm: ChatLLM<ChatLLMOutput, TGenerateOptions>) {\n    super();\n  }\n\n  protected abstract parseResponse(textResponse: string): unknown;\n  protected abstract schemaToString(schema: SchemaObject): Promise<string> | string;\n\n  // eslint-disable-next-line unused-imports/no-unused-vars\n  protected guided(schema: SchemaObject): GenerateOptions[\"guided\"] | undefined {\n    return undefined;\n  }\n\n  async generate<T = any>(\n    schema: T extends ZodTypeAny ? T : SchemaObject,\n    input: BaseMessage[],\n    { maxRetries = 3, options }: GenerateSchemaInput<TGenerateOptions> = {},\n  ): Promise<DriverResponse<T>> {\n    const jsonSchema = toJsonSchema(schema);\n    const validator = createSchemaValidator(jsonSchema);\n    const schemaString = await this.schemaToString(jsonSchema);\n\n    const messages: BaseMessage[] = [\n      BaseMessage.of({\n        role: Role.SYSTEM,\n        text: this.template.render({ schema: schemaString }),\n      }),\n      ...input,\n    ];\n\n    return new Retryable({\n      executor: async () => {\n        const raw = await this.llm.generate(messages, {\n          guided: this.guided(jsonSchema),\n          ...options,\n        } as TGenerateOptions);\n        const textResponse = raw.getTextContent();\n        let parsed: any;\n\n        try {\n          parsed = this.parseResponse(textResponse);\n        } catch (error) {\n          throw new LLMError(`Failed to parse the generated response.`, [], {\n            isFatal: false,\n            isRetryable: true,\n            context: { error: (error as Error).message, received: textResponse },\n          });\n        }\n\n        const success = validator(parsed);\n        if (!success) {\n          const context = {\n            expected: schemaString,\n            received: textResponse,\n            errors: JSON.stringify(validator.errors ?? []),\n          };\n\n          messages.push(\n            BaseMessage.of({\n              role: Role.USER,\n              text: this.errorTemplate.render(context),\n            }),\n          );\n          throw new LLMError(\n            \"Failed to generate a structured response adhering to the provided schema.\",\n            [],\n            {\n              isFatal: false,\n              isRetryable: true,\n              context,\n            },\n          );\n        }\n        return {\n          raw: raw,\n          parsed: parsed,\n          messages,\n        };\n      },\n      config: {\n        signal: options?.signal,\n        maxRetries,\n      },\n    }).get();\n  }\n\n  createSnapshot() {\n    return {\n      template: this.template,\n      errorTemplate: this.errorTemplate,\n    };\n  }\n\n  loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n    Object.assign(this, snapshot);\n  }\n}\n"]}