Appearance
语言模型Chat供应器 API
语言模型Chat供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。 API 使你能够将自己的语言模型提供给 Visual Studio Code 中的Chat功能。
NOTE
如果你是 Copilot Business 或 Enterprise 用户,管理员可在 GitHub.com 的 Copilot 策略设置中,为通过此 API 提供的模型禁用 自带语言模型密钥 策略。
概述
LanguageModelChatProvider 接口采用一个供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。对应多个模型的关系,使供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。能够提供多个模型。每个供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。负责:
- 发现并准备可用的语言模型。
- 处理其模型的Chat请求。
- 提供令牌计数功能。
语言模型信息
每个语言模型都必须通过 LanguageModelChatInformation 接口提供元数据。provideLanguageModelChatInformation 方法返回这些对象的数组,以告知 VS Code 可用的模型。
typescript
interface LanguageModelChatInformation {
readonly id: string; // 模型的唯一标识符,在供应器内唯一
readonly name: string; // 语言模型的人类可读名称,显示在模型选择器中
readonly family: string; // 模型系列名称
readonly version: string; // 版本字符串
readonly maxInputTokens: number; // 模型可接受的最大输入令牌数
readonly maxOutputTokens: number; // 模型能够生成的最大输出令牌数
readonly tooltip?: string; // 在 UI 中悬停模型时显示的可选工具提示文本
readonly detail?: string; // 与模型一起呈现的人类可读文本
readonly capabilities: {
readonly imageInput?: boolean; // 支持图像输入
readonly toolCalling?: boolean | number; // 支持工具调用
};
}注册供应器
第一步是在
package.json的contributes.languageModelChatProviders部分注册供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。。请提供唯一的vendorID 和displayName。json{ "contributes": { "languageModelChatProviders": [ { "vendor": "my-provider", "displayName": "My Provider" } ] } }接下来,在插件激活函数中使用
lm.registerLanguageModelChatProvider方法注册语言模型供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。。提供在
package.json中使用的供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。 ID 及供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。类的实例:typescriptimport * as vscode from 'vscode'; import { SampleChatModelProvider } from './provider'; export function activate(_: vscode.ExtensionContext) { vscode.lm.registerLanguageModelChatProvider('my-provider', new SampleChatModelProvider()); }还可以在
package.json中提供contributes.languageModelChatProviders.managementCommand,以允许用户管理语言模型供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。。managementCommand属性值必须是在package.json的contributes.commands部分定义的命令。在插件中注册该命令(vscode.commands.registerCommand),并实现管理供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。的逻辑,例如配置 API 密钥或其他设置。json{ "contributes": { "languageModelChatProviders": [ { "vendor": "my-provider", "displayName": "My Provider", "managementCommand": "my-provider.manage" } ], "commands": [ { "command": "my-provider.manage", "title": "Manage My Provider" } ] } }
实现供应器
语言供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。必须实现 LanguageModelChatProvider 接口,该接口有三个主要方法:
provideLanguageModelChatInformation:返回可用模型列表。provideLanguageModelChatResponse:处理Chat请求并流式传输响应。provideTokenCount:实现令牌计数功能。
准备语言模型信息
VS Code 会调用 provideLanguageModelChatInformation 方法发现可用模型,该方法返回 LanguageModelChatInformation 对象列表。
使用 options.silent 参数控制是否提示用户输入凭据或进行额外配置:
typescript
async provideLanguageModelChatInformation(
options: { silent: boolean },
token: CancellationToken
): Promise<LanguageModelChatInformation[]> {
if (options.silent) {
return []; // 静默模式下不提示用户
} else {
await this.promptForApiKey(); // 提示用户输入凭据
}
// 从服务中获取可用模型
const models = await this.fetchAvailableModels();
// 将模型映射为 LanguageModelChatInformation 格式
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
}
}));
}处理Chat请求
provideLanguageModelChatResponse 方法处理实际的Chat请求。供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。会接收 LanguageModelChatRequestMessage 格式的消息数组,你可以选择将其转换为语言模型 API 所需的格式(请参阅消息格式和转换)。
使用 progress 参数流式传输响应片段。响应可以包含文本部分、工具调用和工具结果(请参阅响应部分)。
typescript
async provideLanguageModelChatResponse(
model: LanguageModelChatInformation,
messages: readonly LanguageModelChatRequestMessage[],
options: ProvideLanguageModelChatResponseOptions,
progress: Progress<LanguageModelResponsePart>,
token: CancellationToken
): Promise<void> {
// TODO:实现消息转换、处理和响应流传输
// 可选择根据模型 ID 区分行为
if (model.id === "my-model-a") {
progress.report(new LanguageModelTextPart("This is my A response."));
} else {
progress.report(new LanguageModelTextPart("Unknown model."));
}
}提供令牌计数
provideTokenCount 方法负责估计给定文本输入的令牌数:
typescript
async provideTokenCount(
model: LanguageModelChatInformation,
text: string | LanguageModelChatRequestMessage,
token: CancellationToken
): Promise<number> {
// TODO:为模型实现令牌计数
// 字符串的示例估算方式
return Math.ceil(text.toString().length / 4);
}消息格式和转换
供应器供应器也叫提供者,一种微软主导的设计模式,类似于策略模式。主要用于服务的提供和注入,在 VS Code 插件开发中主要用于注册功能函数。接收 LanguageModelChatRequestMessage 格式的消息,通常需要将其转换为服务 API 的格式。消息内容可以混合包含文本部分、工具调用和工具结果。
typescript
interface LanguageModelChatRequestMessage {
readonly role: LanguageModelChatMessageRole;
readonly content: ReadonlyArray<LanguageModelInputPart | unknown>;
readonly name: string | undefined;
}你可以选择为语言模型 API 对这些消息进行适当转换:
typescript
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 插件开发中主要用于注册功能函数。可通过进度回调,使用 LanguageModelResponsePart 类型报告不同的响应部分,包括:
LanguageModelTextPart:文本内容。LanguageModelToolCallPart:工具或函数调用。LanguageModelToolResultPart:工具结果内容。
开始使用
你可以从基础示例项目开始。