
文档教程【免费下载链接】vscode-docsPublic documentation for Visual Studio Code项目地址https://gitcode.com/gh_mirrors/vs/vscode-docs点击查看免费下载本篇技术指南基于 vscode-docs 仓库的 language-model-chat-provider.md 展开系统讲解如何通过LanguageModelChatProviderAPI 将自定义语言模型接入 Visual Studio Code 的 Chat 体验。你将掌握 Provider 的声明注册、模型元数据建模、流式响应处理与 Token 计数等完整实现路径并理解其与contributes.languageModelChatProviders贡献点、Language Model API、Chat Participant API 之间的协作关系。概览一 Provider 对应多模型LanguageModelChatProvider遵循一个 Provider 对应多个模型的关系模型。一个 Provider 可以同时对外提供多个语言模型用户在 Chat 的模型选择器中看到并挑选这些模型。注册后Provider 需要承担三项核心职责发现与准备可用的语言模型包括向用户索要 API Key 等凭据处理聊天请求为其管理的每个模型响应对话提供 Token 计数估算文本或消息所占用的 Token 数量。这与 VS Code 内置的模型供给机制例如 Copilot 提供的模型是并列关系通过该 API 接入的模型同样出现在 Chat 界面的模型选择器中供用户与扩展使用。需要注意的是如果你所在组织启用了 Copilot Business 或 Enterprise 策略管理员可以在 GitHub.com 的 Copilot 策略设置中禁用Bring Your Own Language Model Key策略从而关闭通过该 API 提供的模型请将这一点纳入你的发布与使用预期。语言模型信息建模LanguageModelChatInformation每个语言模型都必须通过LanguageModelChatInformation接口对外暴露元数据。Provider 通过provideLanguageModelChatInformation方法返回该对象的数组通知 VS Code 有哪些可用模型interface LanguageModelChatInformation { readonly id: string; // Unique identifier for the model - unique within the provider readonly name: string; // Human-readable name of the language model - shown in the model picker readonly family: string; // Model family name readonly version: string; // Version string readonly maxInputTokens: number; // Maximum number of tokens the model can accept as input readonly maxOutputTokens: number; // Maximum number of tokens the model is capable of producing readonly tooltip?: string; // Optional tooltip text when hovering the model in the UI readonly detail?: string; // Human-readable text that is rendered alongside the model readonly capabilities: { readonly imageInput?: boolean; // Supports image inputs readonly toolCalling?: boolean | number; // Supports tool calling }; }字段语义要点id只需在Provider 内部唯一并不要求全局唯一name是展示在模型选择器中的人类可读名称family用于标识模型家族可配合vscode.lm.selectChatModels按家族维度批量选择模型详见 language-model.md 中的模型选择逻辑maxInputTokens/maxOutputTokens直接决定模型上下文窗口的可用容量供上层扩展在做提示词裁剪、Token 预算管理时参考capabilities.imageInput声明是否支持图片输入capabilities.toolCalling声明是否支持工具函数调用其值为boolean | number可表达支持程度或调用次数的上限。注册 Provider1. 在 package.json 中声明贡献点在扩展的package.json中通过contributes.languageModelChatProviders注册 Provider提供唯一的vendorID 与面向用户的displayName{ contributes: { languageModelChatProviders: [ { vendor: my-provider, displayName: My Provider } ] } }2. 在激活函数中注册实现在扩展的activate函数中使用lm.registerLanguageModelChatProvider完成注册。第一个参数传入package.json中声明的vendor值第二个参数传入你的 Provider 类实例import * as vscode from vscode; import { SampleChatModelProvider } from ./provider; export function activate(_: vscode.ExtensionContext) { vscode.lm.registerLanguageModelChatProvider(my-provider, new SampleChatModelProvider()); }3.可选配置管理命令可以在contributes.languageModelChatProviders中声明managementCommand让用户通过命令管理你的 Provider例如配置 API Key。该值必须是在contributes.commands中已定义的命令 ID扩展内需通过vscode.commands.registerCommand注册该命令并实现管理逻辑{ contributes: { languageModelChatProviders: [ { vendor: my-provider, displayName: My Provider, managementCommand: my-provider.manage } ], commands: [ { command: my-provider.manage, title: Manage My Provider } ] } }贡献点属性的完整参考仓库中的 contribution-points.md 对该贡献点给出了更完整的属性定义可作为声明时的权威依据PropertyTypeRequiredDescriptionvendorstringYesProvider 的唯一标识同时作为vscode.lm.registerLanguageModelChatProvider的第一个参数。displayNamestringYes展示在模型选择器 UI 中的人类可读名称。configurationobjectNo描述 Provider 配置项如 API Key的 JSON Schema。属性可标记secret: true以安全存储是推荐的用户配置方式。managementCommandstringNo已弃用建议改用configuration。用于打开 Provider 管理界面的命令 ID必须在contributes.commands中声明。whenstringNo控制该 Provider 是否出现在 Manage Models 列表中的 when 子句。其中configuration是官方推荐的配置入口它让用户无需通过额外命令即可在设置界面完成 API Key 等敏感信息的录入。声明时可用 JSON Schema 描述配置项并对敏感字段标记secret: true使凭据以安全方式落盘存储避免以明文暴露在用户设置或日志中。实现 Provider三个核心方法实现LanguageModelChatProvider接口共包含三个核心方法provideLanguageModelChatInformation返回可用模型列表provideLanguageModelChatResponse处理聊天请求并流式返回响应provideTokenCount实现 Token 计数。准备模型信息provideLanguageModelChatInformation由 VS Code 调用用于发现可用模型。方法接收options.silent参数用于控制是否向用户弹出凭据或附加配置的提示async provideLanguageModelChatInformation( options: { silent: boolean }, token: CancellationToken ): PromiseLanguageModelChatInformation[] { if (options.silent) { return []; // Dont prompt user in silent mode } else { await this.promptForApiKey(); // Prompt user for credentials } // Fetch available models from your service const models await this.fetchAvailableModels(); // Map your models to LanguageModelChatInformation format return models.map(model ({ id: model.id, name: model.displayName, family: model.family, version: 1.0.0, maxInputTokens: model.contextWindow - model.maxOutput, maxOutputTokens: model.maxOutput, capabilities: { imageInput: model.supportsImages, toolCalling: model.supportsTools } })); }实践中需要注意的细节silent 模式当 VS Code 在后台需要静默枚举模型例如构建模型选择器列表、为提示词分配上下文时options.silent为true此时应直接返回空数组或缓存结果绝不弹窗打断用户只有用户主动触发的交互流程中才应请求凭据Token 预算推算示例中maxInputTokens用contextWindow - maxOutput计算即总上下文窗口减去最大输出 Token后剩余的可用于输入的部分这是常见的上下文预算划分策略能力透传模型是否支持图片输入、是否支持工具调用应如实映射到capabilities字段否则上层调用方可能误用模型能力。处理聊天请求provideLanguageModelChatResponse负责实际的对话请求处理。Provider 会收到一组LanguageModelChatRequestMessage格式的消息可将其转换为自有语言模型 API 所需的格式详见下文消息格式与转换。通过progress参数可流式上报响应分片响应内容可以是文本、工具调用与工具结果详见下文响应分片async provideLanguageModelChatResponse( model: LanguageModelChatInformation, messages: readonly LanguageModelChatRequestMessage[], options: ProvideLanguageModelChatResponseOptions, progress: ProgressLanguageModelResponsePart, token: CancellationToken ): Promisevoid { // TODO: Implement message conversion, processing, and response streaming // Optionally, differentiate behavior based on model ID if (model.id my-model-a) { progress.report(new LanguageModelTextPart(This is my A response.)); } else { progress.report(new LanguageModelTextPart(Unknown model.)); } }要点说明方法签名中的model参数是本次请求所使用的模型信息可通过model.id区分不同模型走不同处理分支messages为对话历史消息数组需要按目标 API 格式转换后转发给底层模型服务流式体验通过progress.report(...)多次上报LanguageModelResponsePartVS Code 会像处理原生语言模型响应一样逐段渲染保证 Chat 界面平滑输出tokenCancellationToken用于响应协作式取消例如用户中断生成或切换模型时及时停止底层请求。提供 Token 计数provideTokenCount负责估算给定文本或消息的 Token 数量。VS Code 上层如提示词长度自适应、上下文预算管理依赖该数值进行资源规划async provideTokenCount( model: LanguageModelChatInformation, text: string | LanguageModelChatRequestMessage, token: CancellationToken ): Promisenumber { // TODO: Implement token counting for your models // Example estimation for strings return Math.ceil(text.toString().length / 4); }生产实现建议示例中的Math.ceil(length / 4)只是最简单的估算占位对中文等多字节语言会明显低估 Token 数更准确的方案是复用你底层模型服务自带的 Tokenizer如与模型配套的分词器对文本与消息内容分别统计当传入的是LanguageModelChatRequestMessage时应统计其content中全部文本分片的总和必要时叠加消息格式本身的开销。消息格式与转换Provider 收到的消息统一为LanguageModelChatRequestMessage格式其内容content可以是文本分片、工具调用与工具结果的混合数组interface LanguageModelChatRequestMessage { readonly role: LanguageModelChatMessageRole; readonly content: ReadonlyArrayLanguageModelInputPart | unknown; readonly name: string | undefined; }由于各模型服务商的消息协议各不相同通常需要将其转换为目标 API 的格式。以下示例将 VS Code 消息映射为{ role, content }结构并仅提取文本分片拼接为纯文本内容private convertMessages(messages: readonly LanguageModelChatRequestMessage[]) { return messages.map(msg ({ role: msg.role vscode.LanguageModelChatMessageRole.User ? user : assistant, content: msg.content .filter(part part instanceof vscode.LanguageModelTextPart) .map(part (part as vscode.LanguageModelTextPart).value) .join() })); }转换时的注意点角色映射VS Code 消息角色目前主要是User与Assistant详见 language-model.mdLanguage Model API 当前不支持 system 消息示例中按角色映射为user/assistant分片筛选content可能混入工具调用等非文本分片示例通过instanceof vscode.LanguageModelTextPart过滤后仅保留文本并join()拼接结构化保留如果目标 API 支持多模态或工具消息建议在转换时保留图片分片与工具分片的原始结构而非一律展平为字符串以充分利用模型能力。响应分片LanguageModelResponsePartProvider 通过progress回调上报的响应内容统一归入LanguageModelResponsePart类型具体可为以下三种之一LanguageModelTextPart—— 文本内容直接渲染为响应文本LanguageModelToolCallPart—— 工具/函数调用表达模型发起的工具调用请求LanguageModelToolResultPart—— 工具结果内容承载工具执行后的返回结果。这意味着你的 Provider 不仅能输出纯文本还能参与工具调用闭环模型在生成过程中请求调用工具上层扩展执行工具后把结果以LanguageModelToolResultPart回传再交由模型继续生成。若你的模型支持工具调用务必在LanguageModelChatInformation.capabilities.toolCalling中如实声明并在响应处理中正确产出与消费这三类分片。与语言模型生态的协作位置该 API 与仓库中其他 AI 扩展文档描述的机制协同工作构成完整的模型供给-消费链条模型消费端扩展通过 Language Model API 的vscode.lm.selectChatModels按vendor/family/id/version选择模型再用model.sendRequest(...)发送请求。你的 Provider 注册后其vendor即可作为筛选条件出现在这些调用中聊天参与者Chat Participant API 的请求处理器中request.model携带用户在模型下拉框中选择的模型实例。当用户选中你提供的模型时聊天请求最终会路由到你的provideLanguageModelChatResponse错误处理消费端通过LanguageModelError区分模型不存在 / 用户未授权 / 配额超限等错误类型Provider 侧的底层请求失败也应尽量映射为可识别、可恢复的语义而不是直接抛裸异常。快速开始与后续参考官方提供了完整的示例工程chat-model-provider-sample位于 VS Code 扩展示例仓库中建议在动手实现前先运行该示例观察注册、模型枚举、流式响应的完整链路再替换为自己的模型服务接入逻辑。与本主题相关的仓库内文档可继续深入VS Code API 参考lm命名空间下注册与查询模型的相关接口Language Model API 指南模型选择、请求发送、响应流处理与错误处理的消费端实现Chat Participant API 指南将语言模型接入聊天参与者、实现工具调用闭环贡献点参考languageModelChatProviders贡献点的完整属性表与configuration配置说明AI 扩展性总览对比语言模型 Provider、工具、MCP 等不同 AI 扩展方案的适用场景。赞分享文档教程【免费下载链接】vscode-docsPublic documentation for Visual Studio Code项目地址https://gitcode.com/gh_mirrors/vs/vscode-docs点击查看免费下载相关推荐使用 Chat Context Provider 为 VS Code Chat 提供自定义文件上下文chat-context-sample 源码级解析使用 Chat Context Provider 为 VS Code Chat 提供自定义文件上下文chat context sample 源码级解析 本示例示例工程VS Code AI 扩展能力全指南Language Model 工具、MCP 工具、Chat Participant 与 Language Model API 的选择与实现VS Code AI 扩展能力全指南Language Model 工具、MCP 工具、Chat Participant 与 Language Model AP文档教程OneUptime CLI 认证与多环境上下文管理实战指南OneUptime CLI 认证与多环境上下文管理实战指南 OneUptime 作为一款开源的可观测性与监控平台其命令行工具CLI为开发者提供了在终端中直文档教程上一篇PotPlayer字幕翻译终极指南免费实现外语视频实时翻译下一篇WebRTC-Experiment 远程媒体流转发实验Attaching Remote Media Streams 的原理、演示实现与 Scalable Broadcast 演进创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考