聊天参与者 API
聊天参与者是专门的助手,使用户能够扩展VS Code中的聊天与领域专家。用户通过@提及聊天参与者来调用它,然后参与者负责处理用户的自然语言提示。
在本扩展指南中,您将学习如何使用 Chat Participant API 创建聊天参与者。
VS Code 有多个内置的聊天参与者,例如@vscode,@终端,或@工作区它们被优化为回答各自领域的问题。
聊天参与者与语言模型工具不同,这些工具是在LLM(大型语言模型)协调解决用户聊天提示所需的步骤中被调用的。聊天参与者接收用户的提示,并协调他们自己需要的任务。
为什么在你的扩展中实现聊天参与者?
在您的扩展中实现聊天参与者有以下几个好处:
- 扩展聊天,结合专业领域的知识和技能。例如,内置的
@vscode参与者对 VS Code 及其扩展 API 有了解。 - 自主对话 通过管理端到端的用户聊天提示和响应。
- 深度集成到VS Code,通过使用广泛的扩展API。例如,使用调试API获取当前调试上下文并将其作为工具功能的一部分使用。
- 分发和部署 通过Visual Studio Marketplace分发聊天参与者,为用户提供可靠且无缝的体验。用户不需要单独的安装和更新过程。
如果您希望在自主、有代理的编码会话中自动调用特定领域的功能,您可能需要考虑实现语言模型工具或MCP服务器。有关不同选项的详细信息以及如何选择要使用的方法,请参阅AI扩展概述。
聊天用户体验的部分
以下截图显示了在Visual Studio Code聊天体验中,示例扩展的不同聊天概念。

- 使用
@语法调用@猫聊天参与者 - 使用
输入:/调用的语法/教命令 - 用户提供的查询,也称为用户提示
- 图标和参与者
全名这表明Copilot正在使用@猫聊天参与者 - Markdown 响应,由
@猫 - 包含在 markdown 响应中的代码片段
- 按钮包含在
@猫响应,按钮调用 VS Code 命令 - 建议的跟进问题由聊天参与者提供
- 聊天输入字段,由聊天参与者提供占位文本
描述财产
创建聊天参与者
实现聊天参与者包括以下部分:
- 定义聊天参与者
package.json您的扩展文件。 - 实现一个请求处理器来处理用户的聊天提示并返回响应。
- (可选)实现聊天斜线命令,为用户提供常见任务的简写表示。
- (可选)定义建议的后续问题。
- (可选)实现参与者检测,使 VS Code 自动将聊天请求路由到适当的聊天参与者,而无需用户明确提及。
你可以通过一个基本示例项目开始。

1. 注册聊天参与者
创建聊天扩展的第一步是将其注册到您的package.json具有以下属性:
身份证: 聊天参与者的唯一标识符,如定义的package.json文件。名字: 聊天参与者的简称,用于聊天中的@提及。全名: 聊天参与者的全名,在响应的标题区域显示。描述: 聊天参与者目的的简要描述,用作聊天输入字段中的占位符文本。是否粘性: 一个布尔值,表示聊天参与者在响应后是否在聊天输入字段中保持持久性。
"contributes": {
"chatParticipants": [
{
"id": "chat-sample.my-participant",
"name": "my-participant",
"fullName": "My Participant",
"description": "我能教您什么?",
"isSticky": true
}
]
}
我们建议使用小写字母名字并使用标题格式全名 以与现有的聊天参与者保持一致。获取有关 聊天参与者命名约定的更多信息。
一些参与者名称已被保留。如果您使用这样的保留名称,VS Code 会显示您的聊天参与者的完全限定名称(包括扩展 ID)。
2. 实现请求处理程序
通过使用聊天参与者 API来实现聊天参与者。这包括以下步骤:
-
在扩展激活时,创建参与者
vscode.chat.createChat Participant输入:.提供在您定义的ID
package.json,以及在下一步中您需要实现的请求处理程序的引用。export function activate(context: vscode.ExtensionContext) { // Register the chat participant and its request handler const cat = vscode.chat.createChatParticipant('chat-sample.my-participant', handler); // Optionally, set some properties for @cat cat.iconPath = vscode.Uri.joinPath(context.extensionUri, 'cat.jpeg'); // 在这里添加聊天请求处理程序 } -
在
激活函数,定义vscode.聊天请求处理程序请求处理程序。请求处理程序负责处理 VS Code Chat 视图中的用户聊天请求。每当用户在聊天输入字段中输入提示时,聊天请求处理程序就会被调用。
```plaintext const handler: vscode.ChatRequestHandler = async (request: vscode.ChatRequest, context: vscode.ChatContext, stream: vscode.ChatResponseStream, token: vscode.CancellationToken): Promise -
确定用户的意图
vscode.聊天请求输入:.为了确定用户请求的意图,您可以参考
vscode.聊天请求参数以访问用户的提示文本、命令和聊天位置。可选地,您可以利用语言模型来确定用户的意图,而不是使用传统逻辑。作为的一部分
请求您将获得一个用户在聊天模型下拉菜单中选择的语言模型实例。了解如何在您的扩展中使用 语言模型 API。以下代码片段展示了基本结构:首先使用命令,然后用户提示来确定用户意图:
const handler: vscode.ChatRequestHandler = async ( request: vscode.ChatRequest, context: vscode.ChatContext, stream: vscode.ChatResponseStream, token: vscode.CancellationToken ): Promise<ICatChatResult> => { // Test for the `teach` command if (request.command == 'teach') { // 在此处添加处理教学场景的逻辑 doTeaching(request.prompt, request.variables); } else { // 确定用户的意图 const intent = determineUserIntent(request.prompt, request.variables, request.model); // 在此处添加处理其他情况的逻辑 } }; -
添加逻辑来处理用户请求。
通常,聊天扩展使用
请求.模型语言模型实例来处理请求。在这种情况下,您可能需要调整语言模型提示以匹配用户的意图。或者,您可以使用传统编程逻辑调用后端服务,或结合这些选项的任意组合来实现扩展逻辑。例如,您可以调用网络搜索来收集更多信息,然后将这些信息作为上下文提供给语言模型。
在处理当前请求时,您可能需要参考之前的聊天消息。例如,如果之前的一个响应返回了一个 C# 代码片段,用户的当前请求可能是 "给 Python 代码"。了解如何使用聊天消息历史记录。
如果您希望根据聊天输入的位置(聊天视图、快速聊天、内联聊天)以不同的方式处理请求,您可以使用
位置属性vscode.聊天请求例如,如果用户从终端内联聊天发送请求,您可能会查找一个 shell 命令。而如果用户使用聊天视图,您可以返回一个更详细的响应。 -
将聊天回复返回给用户。
处理完请求后,您必须在聊天视图中向用户返回响应。您可以使用流式传输来响应用户查询。
回复可以包含不同内容类型:Markdown、图片、引用、进度、按钮和文件树。

扩展程序可以以如下方式使用响应流:
stream.progress('Picking the right topic to teach...'); stream.markdown(`\`\`\`typescript const myStack = new Stack(); myStack.push(1); // pushing a number on the stack (or let's say, adding a fish to the stack) myStack.push(2); // adding another fish (number 2) console.log(myStack.pop()); // eating the top fish, will output: 2 \`\`\` So remember, Code Kitten, in a stack, the last fish in is the first fish out - which we tech cats call LIFO (Last In, First Out).`); 流.按钮({ 命令: 'cat.meow', 标题: vscode.本地化.文本('喵!'), 参数: [] });获取有关支持的聊天响应输出类型的更多信息。
在实际操作中,扩展通常会向语言模型发送请求。一旦它们从语言模型那里收到响应,它们可能会进一步处理它,并决定是否将任何内容流式传输回用户。VS Code Chat API 是基于流的,并且与流式 语言模型 API兼容。这使得扩展可以连续报告进度和结果,目的是提供流畅的用户体验。了解如何使用 语言模型 API。
3. 注册斜线命令
聊天参与者可以贡献斜线命令,这些命令是扩展提供的特定功能的快捷方式。用户可以通过使用 来在聊天中引用斜线命令输入:/语法,例如/解释输入:.
在回答问题时,其中一个任务是确定用户意图。例如,VS Code 可以推断出创建一个带有Node.js Express Pug TypeScript的新工作区这意味着你想要一个新项目,但是@workspace / 新建 Node.js Express Pug TypeScript更明确、简洁,并且节省打字时间。如果你输入输入:/在聊天输入字段中,VS Code 提供了注册命令及其描述的列表。

聊天参与者可以通过在其中添加它们来贡献带有描述的斜线命令package.json输入:
"contributes": {
"chatParticipants": [
{
"id": "chat-sample.cat",
"name": "cat",
"fullName": "Cat",
"description": "Meow! What can I teach you?",
"isSticky": true,
"commands": [
{
"name": "teach",
"description": "随机挑选一个计算机科学概念,然后用一只猫完美的方式解释它"
},
{
"name": "玩",
"description": "做你想做的,毕竟你是一只猫"
}
]
}
]
}
获取更多关于斜线命令命名规范的信息。
4. 注册跟进请求
每次聊天请求之后,VS Code 会调用后续提供者来获取建议的后续问题以显示给用户。用户可以选择后续问题,并立即发送给聊天扩展。使用聊天跟进提供者API 用于注册类型为的后续提示聊天跟进输入:.
以下代码片段展示了如何在聊天扩展中注册后续请求:
cat.followupProvider = {
provideFollowups(result: ICatChatResult, context: vscode.ChatContext, token: vscode.CancellationToken) {
if (result.metadata.command === 'teach') {
return [{
prompt: 'let us play',
label: vscode.l10n.t('Play with the cat')
} 满足 vscode.ChatFollowup];
}
}
};
跟进应以问题或方向的形式书写,而不是仅仅使用简洁的命令。
5. 实施参与者检测
为了更容易地使用自然语言进行聊天参与者检测,您可以实现参与者检测。参与者检测是一种自动将用户问题路由到合适的参与者的机制,而无需在提示中明确提到参与者。例如,如果用户问“如何将登录页面添加到我的项目中?”,这个问题将被自动路由到@工作区参与者,因为它可以回答关于用户项目的问题。
VS Code 使用聊天参与者描述和示例来确定将聊天提示路由到哪个参与者。您可以在以下位置指定此信息消歧义扩展中的属性package.json文件。消歧义属性包含一个检测类别列表,每个类别都有描述和示例。
| 财产 | 描述 | 示例 |
|---|---|---|
类别 |
检测类别。如果参与者有不同的用途,您可以为每个用途创建一个类别。 |
|
描述 |
对适合该参与者的各类问题的详细描述。 |
|
例子 |
代表性示例问题列表。 |
|
您可以为整体聊天参与者、特定命令或两者组合定义参与者检测。
以下代码片段展示了如何在参与者级别实现参与者检测。
"贡献": {
"聊天参与者": [
{
"id": "chat-sample.cat",
"全名": "猫",
"名字": "cat",
"描述": "喵!我能教您什么?",
"disambiguation": [
{
"category": "cat",
"description": "The user wants to learn a specific computer science topic in an informal way.",
"examples": [
"Teach me C++ pointers using metaphors",
"Explain to me what is a linked list in a simple way",
"Can you explain to me what is a function in programming?"
]
}
]
}
]
}
同样,您还可以在命令级别通过添加来配置参与者检测消歧义一个或多个项目的所有权命令财产。
请按照以下指南改进您扩展程序中参与者检测的准确性:
- 具体说明:描述和示例应尽可能具体,以避免与其他参与者发生冲突。避免在参与者和命令信息中使用通用术语。
- 使用示例:示例应代表适合参与者的问题类型。使用同义词和变体来涵盖用户查询的广泛范围。
- 使用自然语言:描述和示例应使用自然语言编写,就像您在向用户解释参与者一样。
- 测试检测:使用各种示例问题测试参与者检测,并验证没有与内置聊天参与者发生冲突。
内置聊天参与者优先用于检测参与者。例如,一个操作工作区文件的聊天参与者可能会与内置的冲突。@工作区参与者。
使用聊天消息历史记录
参与者可以访问当前聊天会话的消息历史记录。参与者只能访问其中提到它的消息。历史项目要么是聊天请求轮次或一个聊天响应回合例如,使用以下代码片段来检索用户在当前聊天会话中向您的参与者发送的所有先前请求:
常量 上一条消息 = 上下文.历史记录.过滤(h => h instanceof vscode.聊天请求轮次);
历史不会自动包含在提示中,参与者决定是否在向语言模型传递消息时添加历史作为额外的上下文。
支持的聊天响应输出类型
为了对聊天请求做出回应,您使用聊天响应流参数在聊天请求处理程序输入:.
以下列表提供了聊天视图中聊天响应的输出类型。一个聊天响应可以组合多个不同的输出类型。
-
Markdown
将Markdown文本片段渲染为简单文本或图像。您可以使用CommonMark规范中的一部分任何Markdown语法。使用
ChatResponseStream.标记方法并提供Markdown文本。示例代码片段:
// 渲染Markdown文本 stream.markdown('# 这是一个标题 \n'); stream.markdown('这是一个使用_斜体_和**粗体**的格式化文本。'); stream.markdown('这是一个[链接](https://code.visualstudio.com)。\n\n'); stream.markdown(''); -
代码块
渲染一个支持IntelliSense、代码格式化和交互式控件的代码块,以将代码应用于活动编辑器。要显示代码块,请使用
ChatResponseStream.标记方法并使用Markdown语法为代码块(使用反引号)。示例代码片段:
// 渲染一个代码块,使用户能够与其互动 stream.markdown('```bash\n'); stream.markdown('```ls -l\n'); stream.markdown('```''); -
命令链接
在聊天响应中渲染一个链接,用户可以点击以调用 VS Code 命令。要显示命令链接,请使用
ChatResponseStream.标记方法并使用Markdown语法链接[链接文本](命令:命令ID)在URL中提供命令ID。例如,以下链接打开命令面板:[命令面板](command:workbench.action.showCommands)输入:.为了在从服务加载Markdown文本时防止命令注入,您必须使用
vscode.MarkdownString对象与是否可信将此属性设置为受信任的 VS Code 命令 ID 列表。此属性是启用命令链接所必需的。如果是否可信如果属性未设置或未列出命令,命令链接将无法工作。示例代码片段:
// Use command URIs to link to commands from Markdown let markdownCommandString: vscode.MarkdownString = new vscode.MarkdownString( `[Use cat names](command:${CAT_NAMES_COMMAND_ID})` ); markdownCommandString.isTrusted = { enabledCommands: [CAT_NAMES_COMMAND_ID] }; stream.markdown(markdownCommandString);如果命令有参数,你需要首先将参数JSON编码,然后将JSON字符串编码为URI组件。然后将编码后的参数作为查询字符串附加到命令链接后面。
// 编码命令参数 const encodedArgs = encodeURIComponent(JSON.stringify(args)); // 使用带参数的命令 URIs 从 Markdown 链接到命令 let markdownCommandString: vscode.MarkdownString = new vscode.MarkdownString( `[使用猫的名字](command:${CAT_NAMES_COMMAND_ID}?${encodedArgs})` ); markdownCommandString.isTrusted = { enabledCommands: [CAT_NAMES_COMMAND_ID] }; 流.标记(markdown命令字符串); -
命令按钮
渲染一个按钮,调用 VS Code 命令。该命令可以是内置命令或你在扩展中定义的命令。使用
ChatResponseStream按钮方法并提供按钮文本和命令 ID。示例代码片段:
// 渲染一个按钮以触发 VS Code 命令 stream.button({ command: 'my.command', title: vscode.l10n.t('运行我的命令') }); -
文件树
渲染一个文件树控件,允许用户预览单个文件。例如,在提出创建新工作区时显示工作区预览。使用
ChatResponseStream.文件树方法并提供文件树元素数组和文件的基位置(文件夹)。示例代码片段:
// 创建一个文件树实例 var tree: vscode.ChatResponseFileTree[] = [ { name: 'myworkspace', children: [{ name: 'README' }, { name: 'app.js' }, { name: 'package.json' }] } ]; // 在基位置渲染文件树控件 流.文件树(树, 基位置); -
进度消息
在长时间运行的操作期间显示进度消息,以向用户提供中间反馈。例如,报告多步操作中每一步的完成情况。使用
ChatResponseStream progress方法并提供消息。示例代码片段:
// 显示进度消息 流.进度('正在连接到数据库。'); -
参考
在参考文献列表中添加一个外部网址或编辑位置的参考,以表明您使用哪些信息作为上下文。使用
ChatResponseStream.参考方法并提供参考位置。示例代码片段:
const fileUri: vscode.Uri = vscode.Uri.file('/path/to/workspace/app.js'); // On Windows, the path should be in the format of 'c:\\path\\to\\workspace\\app.js' const fileRange: vscode.Range = new vscode.Range(0, 0, 3, 0); const externalUri: vscode.Uri = vscode.Uri.解析('https://code.visualstudio.com'); // 添加对整个文件的引用 流.引用(文件Uri); // 在文件中添加对特定选择的引用 stream.reference(new vscode.Location(fileUri, fileRange)); // 添加一个外部 URL 的引用 流.引用(外部Uri); -
内联引用
添加一个内联参考,引用一个URI或编辑器位置。使用
聊天响应流. 锚点方法并提供锚点位置和可选标题。要引用一个符号(例如,一个类或变量),您会使用编辑器中的一个位置。示例代码片段:
常量 符号位置:vscode.Uri = vscode.Uri.解析('位置到符号'); // 在工作区中将内联锚点渲染为符号 流.锚点(符号位置, 'MySymbol');
重要:图像和链接仅在来自信任域列表中的域时可用。获取有关 VS Code 中链接保护的更多信息。
实现工具调用
为了响应用户请求,聊天扩展可以调用语言模型工具。了解更多关于语言模型工具和工具调用流程的信息。
您可以有以下两种方式实现工具调用:
- 通过使用
@vscode/聊天扩展实用工具库 以简化在聊天扩展中调用工具的过程。 - 通过你自己实现工具调用,可以让你对工具调用过程有更多控制。例如,在将工具响应发送到LLM之前,进行额外验证或以特定方式处理工具响应。
使用聊天扩展库实现工具调用
你可以使用@vscode/聊天扩展实用工具 库 以简化在聊天扩展中调用工具的过程。
实现工具调用vscode.聊天请求处理程序 您的 聊天参与者功能。
-
确定当前聊天上下文相关的工具。您可以通过使用 来访问所有可用的工具。
vscode.lm.tools输入:.以下代码片段展示了如何筛选仅包含特定标签的工具。
常量 工具 = 请求.命令 === '全部' ? vscode.语言模型.工具 : vscode.语言模型.工具.过滤器(工具 => 工具.Tab.包含('chat-tools-sample')); -
通过使用将请求和工具定义发送到LLM
发送聊天参与者请求输入:.常量 libResult = chatUtils.sendChat ParticipantRequest( request, chatContext, { prompt: '你是一只猫!以猫的身份回答。', responseStreamOptions: { stream, references: true, responseText: true }, tools }, token );该
聊天处理程序选项对象具有以下属性:提示: (可选) 聊天参与者提示说明。模型: (可选) 要用于请求的模型。如果未指定,则使用聊天上下文中的模型。工具: (可选) 考虑为请求使用的工具列表。请求理由: (可选) 一个描述请求原因的字符串。响应流选项: (可选) 启用发送聊天参与者请求将响应流式传输回 VS Code。 选项ally,您还可以启用引用和/或响应文本。
-
返回来自LLM的结果。这可能包含错误详情或工具调用的元数据。
返回 等待 库结果.结果;
此工具调用示例的完整源代码可在VS Code扩展示例仓库中找到。
实现工具调用自身
对于更高级的场景,您也可以自行实现工具调用。您可以选择使用@vscode/prompt-tsx用于构建LLM提示的库。通过自行实现工具调用,您可以对工具调用过程拥有更多控制权。例如,在将工具响应发送到LLM之前,进行额外验证或以特定方式处理工具响应。
查看在VS Code扩展示例仓库中实现使用prompt-tsx进行工具调用的完整源代码。
衡量成功
我们建议您通过添加遥测日志来衡量您的参与者成功。无帮助用户反馈事件,以及您的参与者处理的请求数量。然后,一个初步的参与者成功指标可以定义为:无帮助反馈数 / 总请求数输入:.
const logger = vscode.env.createTelemetryLogger({
// telemetry logging implementation goes here
});
cat.onDidReceiveFeedback((feedback: vscode.ChatResultFeedback) => {
// Log chat result feedback to be able to compute the success metric of the participant
logger.logUsage('chatResultFeedback', {
kind: feedback.kind
});
});
任何其他用户与聊天响应的互动都应被视为积极的指标(例如,用户选择聊天响应中生成的按钮)。在使用AI时,使用遥测来衡量成功非常重要,因为这是一种非确定性技术。运行实验,测量并逐步改进您的参与者,以确保良好的用户体验。
指南和约定
指南
聊天参与者不应仅仅是纯粹的问答机器人。在构建聊天参与者时,要富有创意,并利用现有的 VS Code API 在 VS Code 中创建丰富的集成。用户也喜欢丰富和方便的互动,例如在您的响应中添加按钮,菜单项将用户带到聊天中的您的参与者。思考一下在现实生活中 AI 可以帮助您的用户的情景。
每个扩展都贡献一个聊天参与者没有意义。聊天中参与者过多可能会导致用户体验不佳。当你需要控制完整的提示,包括对语言模型的指令时,聊天参与者最好。你可以重用精心设计的 Copilot 系统消息,并可以为其他参与者贡献上下文。
例如,语言扩展(如C++扩展)可以以多种其他方式做出贡献:
- 贡献工具,将语言服务的智能带给用户查询。例如,C++ 扩展可以解决
#cpp将工作区带到C++状态。这为Copilot语言模型提供了正确的C++上下文,以提高Copilot对C++问题的答案质量。 - 贡献使用语言模型的智能操作,可选地与传统的语言服务知识结合,以提供出色的用户体验。例如,C++ 可能已经提供了一个“提取到方法”的智能操作,该操作使用语言模型为新方法生成合适的默认名称。
聊天扩展如果将要执行昂贵的操作或编辑或删除无法撤销的内容,应明确询问用户同意。为了提供良好的用户体验,我们建议扩展不要贡献多个聊天参与者。每个扩展最多一个聊天参与者是一个在用户界面中易于扩展的简单模型。
聊天参与者命名规范
| 财产 | 描述 | 命名指南 |
|---|---|---|
身份证 |
聊天参与者的全局唯一标识符 |
|
名字 |
聊天参与者的名称,用户通过 @符号 |
|
全名 |
(可选)参与者的全名,该名字将显示为来自该参与者的回应标签。 |
|
描述 |
(可选)聊天参与者的简短描述,显示在聊天输入字段或参与者的列表中作为占位符文本 |
|
在任何面向用户的应用元素中(如属性、聊天响应或聊天用户界面)提到聊天参与者时,建议不要使用“参与者”这个术语,因为这是API的名称。例如,@猫扩展可以被称为“Cat扩展用于GitHub Copilot”
快速命令命名规范
| 财产 | 描述 | 命名指南 |
|---|---|---|
名字 |
斜线命令的名称,用户通过引用输入:/符号 |
|
描述 |
(可选)简要描述该斜线命令的功能,在聊天输入字段或参与者和命令列表中显示为占位符文本 |
|
发布您的扩展
一旦你创建了你的AI扩展,你就可以将你的扩展发布到Visual Studio Marketplace:
- 在发布到VS市场之前,我们建议您阅读Microsoft AI工具和实践指南。这些指南提供了负责任地开发和使用AI技术的最佳实践。
- 通过发布到 VS 市场,您的扩展正在遵守 GitHub Copilot 可扩展性可接受的开发和使用政策。
- 按照 发布扩展中的说明上传到市场。
- 如果您的扩展已经提供了聊天以外的功能,我们建议您不要在扩展清单中引入对GitHub Copilot的扩展依赖。这样可以确保不使用GitHub Copilot的扩展用户可以使用非聊天功能,而无需安装GitHub Copilot。
通过 GitHub 应用程序扩展 GitHub Copilot
或者,可以通过创建一个在Chat视图中贡献聊天参与者的GitHub App来扩展GitHub Copilot。一个GitHub App由一个服务支持,并且可以在所有GitHub Copilot的表面上工作,例如github.com、Visual Studio或VS Code。另一方面,GitHub Apps无法完全访问VS Code API。要了解更多关于通过GitHub App扩展GitHub Copilot的信息,请参阅GitHub文档。
使用语言模型
聊天参与者可以以多种方式使用语言模型。一些参与者仅利用语言模型来回答自定义提示,例如 示例聊天参与者。其他参与者更先进,像自主代理一样,在语言模型的帮助下调用多个工具。一个此类先进参与者的示例是内置的 @工作区了解你的工作空间并可以回答有关它的问题。在内部,@工作区由多个工具驱动:GitHub 的知识图谱,结合语义搜索、本地代码索引和 VS Code 的语言服务。