本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

语言模型聊天提供者API

语言模型聊天提供商 API 使您能够在 Visual Studio Code 中为聊天贡献自己的语言模型。

重要

通过此 API 提供的模型目前仅对 个人 GitHub Copilot 计划的用户可用。

概述

语言模型聊天提供者接口遵循一个提供者到多个模型的关系,使提供者能够提供多个模型。每个提供者负责:

  • 发现和准备可用的语言模型
  • 处理其模型的聊天请求
  • 提供代币计数功能

语言模型信息

每个语言模型必须通过提供元数据来满足要求语言模型聊天信息接口。提供语言模型聊天信息方法返回一个这些对象的数组,以通知 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
  };
}

注册提供者

  1. 第一步是将提供者注册到你的package.json贡献语言模型聊天提供者部分。提供一个独特的供应商身份证和一个显示名称输入:.

    {
      "contributes": {
        "languageModelChatProviders": [
          {
            "vendor": "my-provider",
            "displayName": "我的提供者"
          }
        ]
      }
    }
    
  2. 接下来,在你的扩展激活函数中,使用 注册你的语言模型提供者lm注册语言模型聊天提供者方法。

    提供您在其中使用的提供者IDpackage.json以及你的提供者类的一个实例:

    导入 * vscode 'vscode';
    导入 { SampleChatModelProvider }  './provider';
    
    导出 函数 激活(_: vscode.扩展上下文) {
      vscode.lm.注册语言模型聊天提供者('my-provider', 新的 样本聊天模型提供者());
    }
    
  3. 可选地,提供一个贡献语言模型聊天提供者管理命令在你的package.json允许用户管理语言模型提供者。

    该值为管理命令属性必须是定义在中的命令贡献命令你的一部分package.json在你的扩展中,注册命令vscode.commands注册命令) 并实现管理提供者的逻辑,例如配置 API 密钥或其他设置。

    {
      "contributes": {
        "languageModelChatProviders": [
          {
            "vendor": "my-provider",
            "displayName": "我的提供者",
            "managementCommand": "my-provider.manage"
          }
        ],
        "commands": [
          {
            "command": "my-provider.manage",
            "title": "管理我的提供者"
          }
        ]
      }
    }
    

实现提供者

语言提供者必须实现语言模型聊天提供者接口,具有三个主要方法:

  • 提供语言模型聊天信息: 返回可用模型列表
  • 提供语言模型聊天响应处理聊天请求和流式响应
  • 提供代币数量: 实现了计数功能

准备语言模型信息

提供语言模型聊天信息方法被 VS Code 调用来发现可用的模型,并返回一个列表语言模型聊天信息对象。

使用选项.静音参数控制是否提示用户输入凭证或额外配置:

async provideLanguageModelChatInformation(
    options: { silent: boolean },
    token: CancellationToken
): Promise<LanguageModelChatInformation[]> {
    if (options.silent) {
        return []; // Don't 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: {
            图像输入: 模型.支持图像,
            工具调用: 模型.支持工具
        }
    }));
}

处理聊天请求

提供语言模型聊天响应方法处理实际的聊天请求。提供者接收一个消息数组语言模型聊天请求消息 格式,并且您可以选择将它们转换为您语言模型 API 所需的格式(见 消息格式和转换)。

使用进展 用于流式传输响应片段的参数。响应可以包括文本部分、工具调用和工具结果(见 响应部分)。

async provideLanguageModelChatResponse(
    model: LanguageModelChatInformation,
    messages: readonly LanguageModelChatRequestMessage[],
    options: ProvideLanguageModelChatResponseOptions,
    progress: Progress<LanguageModelResponsePart>,
    token: CancellationToken
): Promise<void> {

    // TODO: Implement message conversion, processing, and response streaming

    // 可选地,根据模型ID区分行为
    if (model.id === "my-model-a") {
        progress.report(new LanguageModelTextPart("这是我的A响应。"));
    } else {
        progress.report(new LanguageModelTextPart("未知模型。"));
    }
}

提供代币数量

提供代币数量该方法负责估算给定文本输入中的令牌数量:

异步 provideTokenCount(
    模型: 语言模型聊天信息,
    文本: 字符串 | 语言模型聊天请求消息,
    令牌: 取消令牌
): 承诺<数字> {
    // TODO: 为你的模型实现令牌计数

    // 字符串的示例估计
    return Math.ceil(text.toString().length / 4);
}

消息格式和转换

您的提供商接收消息在语言模型聊天请求消息格式,通常需要转换为您服务的API格式。消息内容可以是文本部分、工具调用和工具结果的混合。

接口 LanguageModelChat请求消息 {
  只读 角色: LanguageModelChat消息角色;
  只读 内容: 只读数组<LanguageModel输入部分 | 未知>;
  只读 名称: 字符串 | 未定义;
}

可选地,适当地将这些消息转换为您的语言模型API:

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('')
    }));
}

响应部分

您的提供商可以通过进展回调报告不同类型的响应部分语言模型响应部分类型,可以是以下之一:

  • 语言模型文本部分- 文本内容
  • 语言模型工具调用部分- 工具/函数调用
  • 语言模型工具结果部分- 工具结果内容

入门指南

你可以通过一个基本示例项目开始。