{"version":3,"file":"langchain-adapter.cjs","names":["convertMessageToLangChainMessage","convertActionInputToLangChainTool","streamLangChainResponse"],"sources":["../../../src/service-adapters/langchain/langchain-adapter.ts"],"sourcesContent":["/**\n * Copilot Runtime adapter for LangChain.\n *\n * ## Example\n *\n * ```ts\n * import { CopilotRuntime, LangChainAdapter } from \"@copilotkit/runtime\";\n * import { ChatOpenAI } from \"@langchain/openai\";\n *\n * const copilotKit = new CopilotRuntime();\n *\n * const model = new ChatOpenAI({\n *   model: \"gpt-4o\",\n *   apiKey: \"<your-api-key>\",\n * });\n *\n * return new LangChainAdapter({\n *   chainFn: async ({ messages, tools }) => {\n *     return model.bindTools(tools).stream(messages);\n *     // or optionally enable strict mode\n *     // return model.bindTools(tools, { strict: true }).stream(messages);\n *   }\n * });\n * ```\n *\n * The asynchronous handler function (`chainFn`) can return any of the following:\n *\n * - A simple `string` response\n * - A LangChain stream (`IterableReadableStream`)\n * - A LangChain `BaseMessageChunk` object\n * - A LangChain `AIMessage` object\n */\n\nimport type { BaseMessage } from \"@langchain/core/messages\";\nimport { CopilotServiceAdapter } from \"../service-adapter\";\nimport {\n  CopilotRuntimeChatCompletionRequest,\n  CopilotRuntimeChatCompletionResponse,\n} from \"../service-adapter\";\nimport {\n  convertActionInputToLangChainTool,\n  convertMessageToLangChainMessage,\n  streamLangChainResponse,\n} from \"./utils\";\nimport type { DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { LangChainReturnType } from \"./types\";\nimport { randomUUID } from \"@copilotkit/shared\";\n\ninterface ChainFnParameters {\n  model: string;\n  messages: BaseMessage[];\n  tools: DynamicStructuredTool[];\n  threadId?: string;\n  runId?: string;\n}\n\ninterface LangChainAdapterOptions {\n  /**\n   * A function that uses the LangChain API to generate a response.\n   */\n  chainFn: (parameters: ChainFnParameters) => Promise<LangChainReturnType>;\n}\n\nexport class LangChainAdapter implements CopilotServiceAdapter {\n  /**\n   * To use LangChain as a backend, provide a handler function to the adapter with your custom LangChain logic.\n   */\n  public get name() {\n    return \"LangChainAdapter\";\n  }\n  constructor(private options: LangChainAdapterOptions) {}\n\n  async process(\n    request: CopilotRuntimeChatCompletionRequest,\n  ): Promise<CopilotRuntimeChatCompletionResponse> {\n    try {\n      const {\n        eventSource,\n        model,\n        actions,\n        messages,\n        runId,\n        threadId: threadIdFromRequest,\n      } = request;\n      const threadId = threadIdFromRequest ?? randomUUID();\n      const result = await this.options.chainFn({\n        messages: messages.map(convertMessageToLangChainMessage),\n        tools: actions.map(convertActionInputToLangChainTool),\n        model,\n        threadId,\n        runId,\n      });\n\n      eventSource.stream(async (eventStream$) => {\n        await streamLangChainResponse({\n          result,\n          eventStream$,\n        });\n      });\n\n      return {\n        threadId,\n      };\n    } finally {\n      // Lazy require for optional peer dependency\n      // eslint-disable-next-line @typescript-eslint/no-var-requires\n      const {\n        awaitAllCallbacks,\n      } = require(\"@langchain/core/callbacks/promises\");\n      await awaitAllCallbacks();\n    }\n  }\n}\n"],"mappings":";;;;;;AA+DA,IAAa,mBAAb,MAA+D;;;;CAI7D,IAAW,OAAO;AAChB,SAAO;;CAET,YAAY,AAAQ,SAAkC;EAAlC;;CAEpB,MAAM,QACJ,SAC+C;AAC/C,MAAI;GACF,MAAM,EACJ,aACA,OACA,SACA,UACA,OACA,UAAU,wBACR;GACJ,MAAM,WAAW,2DAAmC;GACpD,MAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ;IACxC,UAAU,SAAS,IAAIA,+CAAiC;IACxD,OAAO,QAAQ,IAAIC,gDAAkC;IACrD;IACA;IACA;IACD,CAAC;AAEF,eAAY,OAAO,OAAO,iBAAiB;AACzC,UAAMC,sCAAwB;KAC5B;KACA;KACD,CAAC;KACF;AAEF,UAAO,EACL,UACD;YACO;GAGR,MAAM,EACJ,sBACE,QAAQ,qCAAqC;AACjD,SAAM,mBAAmB"}