vscode-chat-langchain-bridge
Version:
Create VS Code Chat participants (agents) with LangChain/LangGraph: tool-calling and streaming bridge for LanguageModelChat.
1 lines • 22.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/chat_models.ts","../src/utils.ts","../src/tools.ts"],"sourcesContent":["export { ChatVSCode } from './chat_models.js';\nexport type * from './types.js';\nexport { toVSCodeChatTool,convertVscodeHistory } from './utils.js';","import { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport { BaseLanguageModelInput } from '@langchain/core/language_models/base';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { AIMessage, AIMessageChunk, BaseMessage, ToolCall, ToolMessage } from '@langchain/core/messages';\nimport { ChatGeneration, ChatGenerationChunk, ChatResult } from '@langchain/core/outputs';\nimport { Runnable } from '@langchain/core/runnables';\nimport { CancellationToken, ChatResponseProgressPart, ChatResponseStream, LanguageModelChat, LanguageModelChatMessage, LanguageModelTextPart, LanguageModelToolCallPart } from 'vscode';\nimport { convertBaseMessage, toVSCodeChatTool } from './utils.js';\nimport { ChatVSCodeCallOptions, ChatVSCodeFields, ChatVSCodeToolType } from './types.js';\n\n\nexport class ChatVSCode extends BaseChatModel<\n ChatVSCodeCallOptions,\n AIMessageChunk\n> {\n protected model: LanguageModelChat;\n token: CancellationToken;\n responseStream: ChatResponseStream;\n constructor(fields: ChatVSCodeFields) {\n super(fields ?? {});\n this.model = fields.model;\n this.token = fields.token;\n this.responseStream = fields.responseStream;\n }\n\n static lc_name() {\n return \"ChatVSCode\";\n }\n _llmType() {\n return \"vscode\";\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n let vscodeMessages: LanguageModelChatMessage[] = messages.map(\n (message): LanguageModelChatMessage => {\n return convertBaseMessage(message);\n }\n );\n\n const lastMessage = messages.at(-1);\n\n if (messages.length > 0 && ToolMessage.isInstance(lastMessage)) {\n // If the last message is a ToolMessage, we need to handle it differently\n // because it indicates a tool result from the user side.\n // Here, we can implement any specific logic needed for tool results.\n vscodeMessages.push(LanguageModelChatMessage.User(`\n Above is the result from one or more tool calls. The user cannot see the results, so you should use this information to continue the conversation.\n `));\n }\n\n const response = await this.model.sendRequest(\n vscodeMessages,\n {\n tools: options.tools?.map((tool) => {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n };\n }),\n },\n this.token\n );\n\n let text = '';\n const toolCalls: ToolCall[] = [];\n\n for await (const part of response.stream) {\n if (part instanceof LanguageModelTextPart) {\n text += part.value;\n runManager?.handleLLMNewToken(part.value);\n } else if (part instanceof LanguageModelToolCallPart) {\n const toolCall: ToolCall = {\n id: part.callId,\n name: part.name,\n args: part.input,\n type: 'tool_call'\n };\n toolCalls.push(toolCall);\n } else {\n console.warn(`Unknown part type received from model stream:`);\n console.warn(part);\n const progressText = new ChatResponseProgressPart((part as any).value);\n this.responseStream?.push(progressText);\n }\n }\n\n let result: ChatResult = {\n generations: []\n };\n\n const message = new AIMessage(text);\n message.tool_calls = toolCalls;\n\n const generation: ChatGeneration = {\n text,\n message\n };\n\n result.generations.push(generation);\n\n return result;\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const copilotMessages = messages.map(convertBaseMessage);\n\n const response = this.model.sendRequest(copilotMessages, {\n tools: options.tools?.map((tool) => {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n };\n }),\n },\n this.token\n );\n for await (const part of (await response).stream) {\n if (this.token.isCancellationRequested) {\n break;\n }\n\n if (part instanceof LanguageModelTextPart) {\n // console.log(\"Received text part from model stream:\", part);\n const chunk = new ChatGenerationChunk({\n text: part.value,\n message: new AIMessageChunk(part.value),\n });\n runManager?.handleLLMNewToken(part.value);\n yield chunk;\n } else if (part instanceof LanguageModelToolCallPart) {\n // console.log(\"Received tool call part from model stream:\", part);\n const chunkMessage = new AIMessageChunk({\n tool_call_chunks: [\n {\n name: part.name,\n args: JSON.stringify(part.input), // Chunk the input as a JSON string\n id: part.callId,\n type: 'tool_call_chunk',\n }\n ]\n });\n const chunk = new ChatGenerationChunk({\n text: '',\n message: chunkMessage,\n });\n yield chunk;\n } else {\n console.log(\"Is ChatResponseProgressPart:\", part instanceof ChatResponseProgressPart);\n console.warn(`Unknown part type received from model stream:`);\n console.warn(part);\n }\n }\n }\n\n bindTools(\n tools: ChatVSCodeToolType[],\n kwargs?: Partial<ChatVSCodeCallOptions> | undefined\n ): Runnable<BaseLanguageModelInput, AIMessageChunk, ChatVSCodeCallOptions> {\n if (kwargs && 'strict' in kwargs) {\n delete kwargs.strict;\n }\n\n return this.withConfig({\n tools: tools.map((tool) => toVSCodeChatTool(tool)),\n ...kwargs,\n })\n }\n}","import { AIMessage, BaseMessage, ContentBlock, HumanMessage, MessageContent, SystemMessage, ToolCall, ToolMessage } from '@langchain/core/messages';\nimport { DynamicStructuredTool, StructuredTool } from '@langchain/core/tools';\nimport { ChatContext, ChatRequestTurn, ChatResponseAnchorPart, ChatResponseMarkdownPart, ChatResponseTurn, LanguageModelChatMessage, LanguageModelTextPart, LanguageModelToolCallPart, LanguageModelToolResultPart, Uri } from 'vscode';\nimport { ChatVSCodeTool } from './tools.js';\nimport { ChatVSCodeToolInput, ChatVSCodeToolType } from './types.js';\n\n/**\n * Ensures every LangChain tool is wrapped in a ChatVSCodeTool instance that\n * exposes the schema and invoke function expected by the VS Code chat bridge.\n */\nexport function toVSCodeChatTool(tool: ChatVSCodeToolType): ChatVSCodeTool {\n if (tool instanceof ChatVSCodeTool) {\n return tool as ChatVSCodeTool\n }\n if (isDynamicStructuredTool(tool)) {\n return new ChatVSCodeTool({\n name: tool.name,\n description: tool.description,\n schema: tool.schema as ChatVSCodeToolInput['schema'],\n func: (input, runManager?, config?) => {\n return tool.invoke(input, config)\n },\n })\n }\n if (isStructuredTool(tool)) {\n return new ChatVSCodeTool({\n name: tool.name,\n description: tool.description,\n schema: tool.schema as ChatVSCodeToolInput['schema'],\n func: (input, runManager?, config?) => {\n return tool.invoke(input, config);\n },\n })\n }\n throw new Error('Invalid tool type');\n}\n\n/**\n * Type guard for plain text content blocks.\n */\nexport function\n isTextContentBlock(part: ContentBlock): part is ContentBlock.Text {\n return part.type === 'text';\n}\n\n/**\n * Type guard for multimodal image content blocks.\n */\nexport function\n isImageContentBlock(part: ContentBlock): part is ContentBlock.Multimodal.Image {\n return part.type === 'image';\n}\n\n/**\n * Type guard for multimodal plain text blocks.\n */\nexport function\n isMultiModalPlainText(part: ContentBlock): part is ContentBlock.Multimodal.PlainText {\n return part.type === 'text-plain';\n}\n\n/**\n * Converts a MessageContent to an array of LanguageModelTextPart.\n * Supports plain text and image content blocks.\n * @param content The MessageContent to convert.\n * @returns The converted array of LanguageModelTextPart.\n */\nexport function\n toTextContent(content: MessageContent): Array<LanguageModelTextPart> {\n if (typeof content === 'string') {\n return [new LanguageModelTextPart(content)];\n }\n if (Array.isArray(content)) {\n return content.map((part: ContentBlock) => {\n if (isTextContentBlock(part)) {\n return new LanguageModelTextPart(part.text);\n } else if (isImageContentBlock(part)) {\n if (part.url) {\n return new LanguageModelTextPart(part.url);\n }\n\n if (part.data && part.mimeType) {\n // Some APIs require the Base64 `data:<mimeType>;base64,<data>` format.\n const base64String = typeof part.data === 'string'\n ? part.data\n : Buffer.from(part.data).toString('base64');\n\n const dataUrl = `data:${part.mimeType};base64,${base64String}`;\n\n // Send the data URL or the structured data, depending on the SDK expectations.\n return new LanguageModelTextPart(dataUrl);\n\n }\n\n // Handle the 'fileId' case if the SDK supports it directly.\n else if (part.fileId) {\n // If the model supports it, you can send the ID or throw an error.\n throw new Error(`Sending image via fileId not yet supported by this parser.`);\n } else {\n throw new Error(`message part type not supported: ${part}`);\n }\n\n } else {\n throw new Error(`message part type not supported: ${part}`);\n }\n })\n } else {\n throw new Error('Unknown message content type');\n }\n}\n\n/**\n * Converts a BaseMessage to a LanguageModelChatMessage.\n * @param message The BaseMessage to convert.\n * @returns The converted LanguageModelChatMessage.\n */\nexport function\n convertBaseMessage(message: BaseMessage): LanguageModelChatMessage {\n // if this is an AI message\n if (AIMessage.isInstance(message)) {\n if (!!message.tool_calls?.length) {\n const aiMessage = message as AIMessage & { tool_calls: ToolCall[] };\n\n const toolCallParts = aiMessage.tool_calls.map(\n (toolCall): LanguageModelToolCallPart => {\n return new LanguageModelToolCallPart(\n toolCall.id || '',\n toolCall.name,\n toolCall.args\n );\n });\n return LanguageModelChatMessage.Assistant(\n toolCallParts,\n aiMessage.name);\n }\n // if this is a text AI message\n return LanguageModelChatMessage.Assistant(\n toTextContent(message.content),\n message.name\n );\n }\n if (HumanMessage.isInstance(message)) {\n const humanMessage = message;\n return LanguageModelChatMessage.User(\n toTextContent(humanMessage.content),\n humanMessage.name\n );\n }\n\n if (ToolMessage.isInstance(message)) {\n const toolResult = new LanguageModelToolResultPart(\n message.tool_call_id,\n toTextContent(message.content)\n );\n return LanguageModelChatMessage.User(\n [toolResult],\n message.name\n );\n }\n\n if (SystemMessage.isInstance(message)) {\n return LanguageModelChatMessage.User(\n toTextContent(message.content),\n message.name\n );\n }\n\n throw new Error(`Unsupported message type: ${message}`);\n}\n\n/**\n * Utility function that converts a VS Code chat history into the LangChain\n * message format.\n */\nexport function convertVscodeHistory(chatContext: ChatContext): BaseMessage[] {\n const result = [];\n for(const message of chatContext.history) {\n if (message instanceof ChatRequestTurn) {\n result.push(new HumanMessage({\n content: message.prompt\n }));\n } else if (message instanceof ChatResponseTurn) {\n result.push(new AIMessage({\n content: chatResponseToString(message)\n }));\n }\n }\n return result;\n}\n\n/**\n * Extracts the textual representation of a ChatResponseTurn for LangChain.\n */\nexport function chatResponseToString(response: ChatResponseTurn): string {\n\treturn response.response\n\t\t.map(r => {\n\t\t\tif (r instanceof ChatResponseMarkdownPart) {\n\t\t\t\treturn r.value.value;\n\t\t\t} else if (r instanceof ChatResponseAnchorPart) {\n\t\t\t\tif (r.value instanceof Uri) {\n\t\t\t\t\treturn r.value.fsPath;\n\t\t\t\t} else {\n\t\t\t\t\treturn r.value.uri.fsPath;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t})\n\t\t.join('');\n}\n\nfunction isDynamicStructuredTool(\n tool: ChatVSCodeToolType\n): tool is DynamicStructuredTool {\n return (\n tool instanceof DynamicStructuredTool\n );\n}\n\nfunction isStructuredTool(\n tool: ChatVSCodeToolType\n): tool is StructuredTool {\n return (\n tool instanceof StructuredTool\n );\n}\n\n","import { ToolCall } from '@langchain/core/messages';\nimport { RunnableConfig } from '@langchain/core/runnables';\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport {\n CancellationToken,\n LanguageModelChatTool,\n LanguageModelTool,\n LanguageModelToolInvocationOptions,\n LanguageModelToolResult,\n ProviderResult,\n} from 'vscode';\nimport type { z } from 'zod/v3';\n\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport { ChatVSCodeToolInput, ZodObjectAny } from './types.js';\n\nexport class ChatVSCodeTool<\n T extends ZodObjectAny | Record<string, any> = ZodObjectAny\n>\n extends DynamicStructuredTool<T extends ZodObjectAny ? T : ZodObjectAny>\n implements\n LanguageModelChatTool,\n LanguageModelTool<z.infer<T extends ZodObjectAny ? T : ZodObjectAny>> {\n inputSchema?: Record<string, unknown>;\n\n constructor(fields: ChatVSCodeToolInput<T>) {\n super(fields);\n this.inputSchema = zodToJsonSchema(fields.schema);\n }\n\n static lc_name(): string {\n return 'ChatVSCodeTool';\n }\n\n invoke(\n input: string | ToolCall | { [x: string]: any },\n config?: RunnableConfig\n ): Promise<any>\n invoke(\n options: LanguageModelToolInvocationOptions<\n z.infer<T extends ZodObjectAny ? T : ZodObjectAny>\n >,\n token: CancellationToken\n ): ProviderResult<LanguageModelToolResult>\n\n invoke(\n inputOrOptions:\n | string\n | ToolCall\n | { [x: string]: any }\n | LanguageModelToolInvocationOptions<ZodObjectAny>,\n configOrToken?: RunnableConfig | CancellationToken\n ): Promise<any> | ProviderResult<LanguageModelToolResult> {\n if (\n inputOrOptions &&\n typeof inputOrOptions === 'object' &&\n 'input' in inputOrOptions\n ) {\n // Second overload - VSCode tool invocation\n const options =\n inputOrOptions as LanguageModelToolInvocationOptions<ZodObjectAny>;\n return super.invoke(options.input as any)\n } else {\n // First overload - Standard LangChain invocation\n const input = inputOrOptions as string | ToolCall | { [x: string]: any }\n const config = configOrToken as RunnableConfig\n return super.invoke(input as any, config);\n }\n }\n}\n"],"mappings":"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","names":["import_messages","import_vscode","import_tools","message"]}