@copilotkit/runtime
Version:
<img src="https://github.com/user-attachments/assets/0a6b64d9-e193-4940-a3f6-60334ac34084" alt="banner" style="border-radius: 12px; border: 2px solid #d6d4fa;" />
1 lines • 3.98 kB
Source Map (JSON)
{"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"}