{"version":3,"file":"api_chain.cjs","names":["BaseChain","LLMChain","API_URL_PROMPT_TEMPLATE","API_RESPONSE_PROMPT_TEMPLATE"],"sources":["../../../src/chains/api/api_chain.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { BaseChain, ChainInputs } from \"../base.js\";\nimport { SerializedAPIChain } from \"../serde.js\";\nimport { LLMChain } from \"../llm_chain.js\";\nimport {\n  API_URL_PROMPT_TEMPLATE,\n  API_RESPONSE_PROMPT_TEMPLATE,\n} from \"./prompts.js\";\n\n/**\n * Interface that extends ChainInputs and defines additional input\n * parameters specific to an APIChain.\n */\nexport interface APIChainInput extends Omit<ChainInputs, \"memory\"> {\n  apiAnswerChain: LLMChain;\n  apiRequestChain: LLMChain;\n  apiDocs: string;\n  inputKey?: string;\n  headers?: Record<string, string>;\n  /** Key to use for output, defaults to `output` */\n  outputKey?: string;\n}\n\n/**\n * Type that defines optional configuration options for an APIChain.\n */\nexport type APIChainOptions = {\n  headers?: Record<string, string>;\n  apiUrlPrompt?: BasePromptTemplate;\n  apiResponsePrompt?: BasePromptTemplate;\n};\n\n/**\n * Class that extends BaseChain and represents a chain specifically\n * designed for making API requests and processing API responses.\n */\nexport class APIChain extends BaseChain implements APIChainInput {\n  apiAnswerChain: LLMChain;\n\n  apiRequestChain: LLMChain;\n\n  apiDocs: string;\n\n  headers = {};\n\n  inputKey = \"question\";\n\n  outputKey = \"output\";\n\n  get inputKeys() {\n    return [this.inputKey];\n  }\n\n  get outputKeys() {\n    return [this.outputKey];\n  }\n\n  constructor(fields: APIChainInput) {\n    super(fields);\n    this.apiRequestChain = fields.apiRequestChain;\n    this.apiAnswerChain = fields.apiAnswerChain;\n    this.apiDocs = fields.apiDocs;\n    this.inputKey = fields.inputKey ?? this.inputKey;\n    this.outputKey = fields.outputKey ?? this.outputKey;\n    this.headers = fields.headers ?? this.headers;\n  }\n\n  /** @ignore */\n  async _call(\n    values: ChainValues,\n    runManager?: CallbackManagerForChainRun\n  ): Promise<ChainValues> {\n    const question: string = values[this.inputKey];\n\n    const api_url = await this.apiRequestChain.predict(\n      { question, api_docs: this.apiDocs },\n      runManager?.getChild(\"request\")\n    );\n\n    const res = await fetch(api_url, { headers: this.headers });\n    const api_response = await res.text();\n\n    const answer = await this.apiAnswerChain.predict(\n      { question, api_docs: this.apiDocs, api_url, api_response },\n      runManager?.getChild(\"response\")\n    );\n\n    return { [this.outputKey]: answer };\n  }\n\n  _chainType() {\n    return \"api_chain\" as const;\n  }\n\n  static async deserialize(data: SerializedAPIChain) {\n    const { api_request_chain, api_answer_chain, api_docs } = data;\n\n    if (!api_request_chain) {\n      throw new Error(\"LLMChain must have api_request_chain\");\n    }\n    if (!api_answer_chain) {\n      throw new Error(\"LLMChain must have api_answer_chain\");\n    }\n\n    if (!api_docs) {\n      throw new Error(\"LLMChain must have api_docs\");\n    }\n\n    return new APIChain({\n      apiAnswerChain: await LLMChain.deserialize(api_answer_chain),\n      apiRequestChain: await LLMChain.deserialize(api_request_chain),\n      apiDocs: api_docs,\n    });\n  }\n\n  serialize(): SerializedAPIChain {\n    return {\n      _type: this._chainType(),\n      api_answer_chain: this.apiAnswerChain.serialize(),\n      api_request_chain: this.apiRequestChain.serialize(),\n      api_docs: this.apiDocs,\n    };\n  }\n\n  /**\n   * Static method to create a new APIChain from a BaseLanguageModel and API\n   * documentation.\n   * @param llm BaseLanguageModel instance.\n   * @param apiDocs API documentation.\n   * @param options Optional configuration options for the APIChain.\n   * @returns New APIChain instance.\n   */\n  static fromLLMAndAPIDocs(\n    llm: BaseLanguageModelInterface,\n    apiDocs: string,\n    options: APIChainOptions &\n      Omit<APIChainInput, \"apiAnswerChain\" | \"apiRequestChain\" | \"apiDocs\"> = {}\n  ): APIChain {\n    const {\n      apiUrlPrompt = API_URL_PROMPT_TEMPLATE,\n      apiResponsePrompt = API_RESPONSE_PROMPT_TEMPLATE,\n    } = options;\n    const apiRequestChain = new LLMChain({ prompt: apiUrlPrompt, llm });\n    const apiAnswerChain = new LLMChain({ prompt: apiResponsePrompt, llm });\n    return new this({\n      apiAnswerChain,\n      apiRequestChain,\n      apiDocs,\n      ...options,\n    });\n  }\n}\n"],"mappings":";;;;;;;;AAuCA,IAAa,WAAb,MAAa,iBAAiBA,aAAAA,UAAmC;CAC/D;CAEA;CAEA;CAEA,UAAU,EAAE;CAEZ,WAAW;CAEX,YAAY;CAEZ,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,SAAS;;CAGxB,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,UAAU;;CAGzB,YAAY,QAAuB;AACjC,QAAM,OAAO;AACb,OAAK,kBAAkB,OAAO;AAC9B,OAAK,iBAAiB,OAAO;AAC7B,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,OAAO,YAAY,KAAK;AACxC,OAAK,YAAY,OAAO,aAAa,KAAK;AAC1C,OAAK,UAAU,OAAO,WAAW,KAAK;;;CAIxC,MAAM,MACJ,QACA,YACsB;EACtB,MAAM,WAAmB,OAAO,KAAK;EAErC,MAAM,UAAU,MAAM,KAAK,gBAAgB,QACzC;GAAE;GAAU,UAAU,KAAK;GAAS,EACpC,YAAY,SAAS,UAAU,CAChC;EAGD,MAAM,eAAe,OADT,MAAM,MAAM,SAAS,EAAE,SAAS,KAAK,SAAS,CAAC,EAC5B,MAAM;EAErC,MAAM,SAAS,MAAM,KAAK,eAAe,QACvC;GAAE;GAAU,UAAU,KAAK;GAAS;GAAS;GAAc,EAC3D,YAAY,SAAS,WAAW,CACjC;AAED,SAAO,GAAG,KAAK,YAAY,QAAQ;;CAGrC,aAAa;AACX,SAAO;;CAGT,aAAa,YAAY,MAA0B;EACjD,MAAM,EAAE,mBAAmB,kBAAkB,aAAa;AAE1D,MAAI,CAAC,kBACH,OAAM,IAAI,MAAM,uCAAuC;AAEzD,MAAI,CAAC,iBACH,OAAM,IAAI,MAAM,sCAAsC;AAGxD,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,8BAA8B;AAGhD,SAAO,IAAI,SAAS;GAClB,gBAAgB,MAAMC,kBAAAA,SAAS,YAAY,iBAAiB;GAC5D,iBAAiB,MAAMA,kBAAAA,SAAS,YAAY,kBAAkB;GAC9D,SAAS;GACV,CAAC;;CAGJ,YAAgC;AAC9B,SAAO;GACL,OAAO,KAAK,YAAY;GACxB,kBAAkB,KAAK,eAAe,WAAW;GACjD,mBAAmB,KAAK,gBAAgB,WAAW;GACnD,UAAU,KAAK;GAChB;;;;;;;;;;CAWH,OAAO,kBACL,KACA,SACA,UAC0E,EAAE,EAClE;EACV,MAAM,EACJ,eAAeC,gBAAAA,yBACf,oBAAoBC,gBAAAA,iCAClB;EACJ,MAAM,kBAAkB,IAAIF,kBAAAA,SAAS;GAAE,QAAQ;GAAc;GAAK,CAAC;EACnE,MAAM,iBAAiB,IAAIA,kBAAAA,SAAS;GAAE,QAAQ;GAAmB;GAAK,CAAC;AACvE,SAAO,IAAI,KAAK;GACd;GACA;GACA;GACA,GAAG;GACJ,CAAC"}