{"version":3,"file":"llm_chain.cjs","names":["Runnable","BaseChain","NoOpOutputParser","BaseLanguageModel","BasePromptTemplate"],"sources":["../../src/chains/llm_chain.ts"],"sourcesContent":["import {\n  BaseLanguageModel,\n  BaseLanguageModelInterface,\n  BaseLanguageModelInput,\n} from \"@langchain/core/language_models/base\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\nimport type { Generation } from \"@langchain/core/outputs\";\nimport type { BaseMessage } from \"@langchain/core/messages\";\nimport type { BasePromptValueInterface } from \"@langchain/core/prompt_values\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport {\n  BaseLLMOutputParser,\n  BaseOutputParser,\n} from \"@langchain/core/output_parsers\";\nimport {\n  CallbackManager,\n  BaseCallbackConfig,\n  CallbackManagerForChainRun,\n  Callbacks,\n} from \"@langchain/core/callbacks/manager\";\nimport { Runnable, type RunnableInterface } from \"@langchain/core/runnables\";\nimport { BaseChain, ChainInputs } from \"./base.js\";\nimport { SerializedLLMChain } from \"./serde.js\";\nimport { NoOpOutputParser } from \"../output_parsers/noop.js\";\n\ntype LLMType =\n  | BaseLanguageModelInterface\n  | Runnable<BaseLanguageModelInput, string>\n  | Runnable<BaseLanguageModelInput, BaseMessage>;\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype CallOptionsIfAvailable<T> = T extends { CallOptions: infer CO } ? CO : any;\n/**\n * Interface for the input parameters of the LLMChain class.\n */\nexport interface LLMChainInput<\n  T extends string | object = string,\n  Model extends LLMType = LLMType,\n> extends ChainInputs {\n  /** Prompt object to use */\n  prompt: BasePromptTemplate;\n  /** LLM Wrapper to use */\n  llm: Model;\n  /** Kwargs to pass to LLM */\n  llmKwargs?: CallOptionsIfAvailable<Model>;\n  /** OutputParser to use */\n  outputParser?: BaseLLMOutputParser<T>;\n  /** Key to use for output, defaults to `text` */\n  outputKey?: string;\n}\n\nfunction isBaseLanguageModel(llmLike: unknown): llmLike is BaseLanguageModel {\n  return typeof (llmLike as BaseLanguageModelInterface)._llmType === \"function\";\n}\n\nfunction _getLanguageModel(llmLike: RunnableInterface): BaseLanguageModel {\n  if (isBaseLanguageModel(llmLike)) {\n    return llmLike;\n  } else if (\"bound\" in llmLike && Runnable.isRunnable(llmLike.bound)) {\n    return _getLanguageModel(llmLike.bound);\n  } else if (\n    \"runnable\" in llmLike &&\n    \"fallbacks\" in llmLike &&\n    Runnable.isRunnable(llmLike.runnable)\n  ) {\n    return _getLanguageModel(llmLike.runnable);\n  } else if (\"default\" in llmLike && Runnable.isRunnable(llmLike.default)) {\n    return _getLanguageModel(llmLike.default);\n  } else {\n    throw new Error(\"Unable to extract BaseLanguageModel from llmLike object.\");\n  }\n}\n\n/**\n * Chain to run queries against LLMs.\n *\n * @example\n * ```ts\n * import { ChatPromptTemplate } from \"@langchain/core/prompts\";\n * import { ChatOpenAI } from \"@langchain/openai\";\n *\n * const prompt = ChatPromptTemplate.fromTemplate(\"Tell me a {adjective} joke\");\n * const llm = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n * const chain = prompt.pipe(llm);\n *\n * const response = await chain.invoke({ adjective: \"funny\" });\n * ```\n */\nexport class LLMChain<\n  T extends string | object = string,\n  Model extends LLMType = LLMType,\n>\n  extends BaseChain\n  implements LLMChainInput<T>\n{\n  static lc_name() {\n    return \"LLMChain\";\n  }\n\n  lc_serializable = true;\n\n  prompt: BasePromptTemplate;\n\n  llm: Model;\n\n  llmKwargs?: CallOptionsIfAvailable<Model>;\n\n  outputKey = \"text\";\n\n  outputParser?: BaseLLMOutputParser<T>;\n\n  get inputKeys() {\n    return this.prompt.inputVariables;\n  }\n\n  get outputKeys() {\n    return [this.outputKey];\n  }\n\n  constructor(fields: LLMChainInput<T, Model>) {\n    super(fields);\n    this.prompt = fields.prompt;\n    this.llm = fields.llm;\n    this.llmKwargs = fields.llmKwargs;\n    this.outputKey = fields.outputKey ?? this.outputKey;\n    this.outputParser =\n      fields.outputParser ?? (new NoOpOutputParser() as BaseOutputParser<T>);\n    if (this.prompt.outputParser) {\n      if (fields.outputParser) {\n        throw new Error(\"Cannot set both outputParser and prompt.outputParser\");\n      }\n      this.outputParser = this.prompt.outputParser as BaseOutputParser<T>;\n    }\n  }\n\n  private getCallKeys(): string[] {\n    const callKeys = \"callKeys\" in this.llm ? this.llm.callKeys : [];\n    return callKeys;\n  }\n\n  /** @ignore */\n  _selectMemoryInputs(values: ChainValues): ChainValues {\n    const valuesForMemory = super._selectMemoryInputs(values);\n    const callKeys = this.getCallKeys();\n    for (const key of callKeys) {\n      if (key in values) {\n        delete valuesForMemory[key];\n      }\n    }\n    return valuesForMemory;\n  }\n\n  /** @ignore */\n  async _getFinalOutput(\n    generations: Generation[],\n    promptValue: BasePromptValueInterface,\n    runManager?: CallbackManagerForChainRun\n  ): Promise<unknown> {\n    let finalCompletion: unknown;\n    if (this.outputParser) {\n      finalCompletion = await this.outputParser.parseResultWithPrompt(\n        generations,\n        promptValue,\n        runManager?.getChild()\n      );\n    } else {\n      finalCompletion = generations[0].text;\n    }\n    return finalCompletion;\n  }\n\n  /**\n   * Run the core logic of this chain and add to output if desired.\n   *\n   * Wraps _call and handles memory.\n   */\n  call(\n    values: ChainValues & CallOptionsIfAvailable<Model>,\n    config?: Callbacks | BaseCallbackConfig\n  ): Promise<ChainValues> {\n    return super.call(values, config);\n  }\n\n  /** @ignore */\n  async _call(\n    values: ChainValues & CallOptionsIfAvailable<Model>,\n    runManager?: CallbackManagerForChainRun\n  ): Promise<ChainValues> {\n    const valuesForPrompt = { ...values };\n    const valuesForLLM = {\n      ...this.llmKwargs,\n    } as CallOptionsIfAvailable<Model>;\n    const callKeys = this.getCallKeys();\n    for (const key of callKeys) {\n      if (key in values) {\n        if (valuesForLLM) {\n          valuesForLLM[key as keyof CallOptionsIfAvailable<Model>] =\n            values[key];\n          delete valuesForPrompt[key];\n        }\n      }\n    }\n    const promptValue = await this.prompt.formatPromptValue(valuesForPrompt);\n    if (\"generatePrompt\" in this.llm) {\n      const { generations } = await this.llm.generatePrompt(\n        [promptValue],\n        valuesForLLM,\n        runManager?.getChild()\n      );\n      return {\n        [this.outputKey]: await this._getFinalOutput(\n          generations[0],\n          promptValue,\n          runManager\n        ),\n      };\n    }\n\n    const modelWithParser = this.outputParser\n      ? this.llm.pipe(this.outputParser)\n      : this.llm;\n    const response = await modelWithParser.invoke(\n      promptValue,\n      runManager?.getChild()\n    );\n    return {\n      [this.outputKey]: response,\n    };\n  }\n\n  /**\n   * Format prompt with values and pass to LLM\n   *\n   * @param values - keys to pass to prompt template\n   * @param callbackManager - CallbackManager to use\n   * @returns Completion from LLM.\n   *\n   * @example\n   * ```ts\n   * llm.predict({ adjective: \"funny\" })\n   * ```\n   */\n  async predict(\n    values: ChainValues & CallOptionsIfAvailable<Model>,\n    callbackManager?: CallbackManager\n  ): Promise<T> {\n    const output = await this.call(values, callbackManager);\n    return output[this.outputKey];\n  }\n\n  _chainType() {\n    return \"llm\" as const;\n  }\n\n  static async deserialize(data: SerializedLLMChain): Promise<LLMChain> {\n    const { llm, prompt } = data;\n    if (!llm) {\n      throw new Error(\"LLMChain must have llm\");\n    }\n    if (!prompt) {\n      throw new Error(\"LLMChain must have prompt\");\n    }\n\n    return new LLMChain({\n      llm: await BaseLanguageModel.deserialize(llm),\n      prompt: await BasePromptTemplate.deserialize(prompt),\n    });\n  }\n\n  /** @deprecated */\n  serialize(): SerializedLLMChain {\n    const serialize =\n      \"serialize\" in this.llm ? this.llm.serialize() : undefined;\n    return {\n      _type: `${this._chainType()}_chain`,\n      llm: serialize,\n      prompt: this.prompt.serialize(),\n    };\n  }\n\n  _getNumTokens(text: string): Promise<number> {\n    return _getLanguageModel(this.llm).getNumTokens(text);\n  }\n}\n"],"mappings":"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"}