编写一个 VS Code 扩展:将 Copilot 支持的大模型通过 REST API 方式暴露出来

大家好,我是磊磊落落,目前我在技术上主要关注:Java、Golang、AI、架构设计、云原生和自动化测试。欢迎来我的博客(leileiluoluo.com)获取我的最近更新!

在 AI 辅助编程的时代,Copilot 已经成为众多开发者的得力助手。我们只要拥有一个 GitHub 账号,只要开通了 Copilot,即可在 VS Code 等编辑器中使用它。而且 Copilot 可选的大模型日益增多,从最初的 Codex 模型到如今支持更强大的 GPT-5 系列,模型能力不断增强。

然而,Copilot 的能力被完全释放了吗?答案是否定的。它依然被限制在 IDE 插件、特定工作流的框架内。如果我们可以将 Copilot 背后的大模型能力「解放」出来,通过简单、通用的 REST API 提供给更多开发者、工具和应用调用,将会带来哪些可能性?

今天,我们就将共同探索这个实践:如何通过编写一个 VS Code 扩展,将 Copilot 支持的大模型转化为可灵活调用的 API 服务。

1 为什么需要一个 VS Code 扩展

下面以在 VS Code 中借助 Copilot 批量生成报告为例来说明为什么需要编写一个 VS Code 扩展。

假设,我正在为一个博客聚合网站做年度报告。拥有的初始数据是一个 JSON 数组 blog-posts.json,该数组记录了聚合网站中所有博客在 2025 全年发布的文章。

格式如下:

json 复制代码
[
  {
    "blog": "leileiluoluo.com",
    "articles": [
      "提示工程需要遵循的五个原则(附实践案例)",
      "關於 2026 年即將生效的「吸毒記錄可封存」法案",
      "如何使用 Spec Kit 工具进行规范驱动开发?"
    ]
  }
  // ...
]

如果我想借助 Copilot,让其基于上述数据批量生成所有博客的年度报告 blog-summary.json(格式如下),该如何做呢?

json 复制代码
[
  {
    "blog": "leileiluoluo.com",
    "summary": "您的博客文章涵盖了技术开发、社会热点和个人生活等多个领域。在技术方面,您深入探讨了提示工程、规范驱动开发、Spring Boot 框架的应用、数据库迁移与优化等主题,展示了对前沿技术的关注与实践经验的分享;同时,您还介绍了 Markdown 编程语言的潜力、MapStruct 对象映射工具的优势,以及 MCP 在浏览器自动化中的应用等内容,体现了对技术趋势的敏锐洞察。在社会热点方面,您关注了吸毒记录封存法案、历史事件以及社会案件,表达了独到的见解。在个人生活方面,您记录了多次旅行与家庭活动,展现了对自然风光的热爱与家庭生活的温馨。这些文章内容丰富,兼具专业性与生活化,体现了广泛的兴趣与深刻的思考。"
  }
  // ...
]

要实现这个任务,我们可以先从一个博客开始,编写提示词看看效果,没问题再让 Copilot 运用到所有博客。

针对单个博客生成年度总结的提示词如下:

text 复制代码
下面是一个博客在 2025 年发布的所有文章,请以「您的博客文章涵盖了...」开始写一段 200 字以内的总结:

{
  "blog": "leileiluoluo.com",
  "articles": [
    "提示工程需要遵循的五个原则(附实践案例)",
    "關於 2026 年即將生效的「吸毒記錄可封存」法案",
    "如何使用 Spec Kit 工具进行规范驱动开发?",
    ...
  ]
}

可以看到 Copilot 完美的完成了任务。

接下来尝试编写提示词,让 Copilot 运用到所有博客。

text 复制代码
annual-report 文件夹下的 blog-posts.json 文件包含了多个博客在 2025 年的所有文章标题。

您需要针对每个博客在这一年发布的所有文章标题,以「您的博客文章涵盖了...」开始写一段 200 字以内的总结。

最后以 `blog-summary.json` 为文件名,输出一个包含所有博客总结的 JSON 数组,格式如下:

[
  {
    "blog": "leileiluoluo.com",
    "summary": "您的博客文章涵盖了技术开发、社会热点和个人生活等多个领域。在技术方面,您深入探讨了提示工程、规范驱动开发、Spring Boot 框架的应用、数据库迁移与优化等主题,展示了对前沿技术的关注与实践经验的分享;同时,您还介绍了 Markdown 编程语言的潜力、MapStruct 对象映射工具的优势,以及 MCP 在浏览器自动化中的应用等内容,体现了对技术趋势的敏锐洞察。在社会热点方面,您关注了吸毒记录封存法案、历史事件以及社会案件,表达了独到的见解。在个人生活方面,您记录了多次旅行与家庭活动,展现了对自然风光的热爱与家庭生活的温馨。这些文章内容丰富,兼具专业性与生活化,体现了广泛的兴趣与深刻的思考。"
  }
  // ...
]

上述提示词发出后,Copilot 开始编写 Python 脚本,试图用程序的方式去实现这个批量任务。

但是结果很不理想,其生成的总结非常的单薄。

究其原因,是因为 Copilot 根本没有调用大模型去生成总结,而是在程序中写了一组关键词,只要文章标题匹配了某些关键词就固定输出一个分类,生成的总结死板,没有活力。

看到这里,您不禁要问:Copilot 不知道我们想要的总结是用大模型生成吗?还是有哪些难言之隐?

下面我们尝试使用提示词强制让其使用大模型来生成总结。

提示词发出后,Copilot 修改原先的 Python 脚本,改为调用 OpenAI 来生成总结。但是要使用这个程序我们需要有 OpenAI 账号,即必须提供一个 OPENAI_API_KEY 给 Copilot。

看到这里您可能跟我一样有一些迷惑,你 Copilot Chat 中支持的那么多模型直接拿来用不就行了吗?还让我专门开通一个大模型账号?或者,你用笨一点的办法,像获取单个博客的总结一样,自己自动组装提示词发给 Chat,然后取回结果;然后再发出,再取回。帮我完成任务,不行吗?

其实,这个问题恰好触碰到了 Copilot 的难言之隐。因为 Copilot 的确没有将可使用的模型用 REST API 的方式暴露出来,所以它编写的脚本想使用模型时,必须让我们提供一个额外模型的 API_KEY

这就是我为什么要写本文的缘由。我们需要编写一个 VS Code 扩展,来将 Copilot 中模型的能力通过 REST API 释放出来,供程序去使用。

2 编写这个 VS Code 扩展

下面着手编写这个「将 Copilot 大模型暴露为 REST API」的 VS Code 扩展。

开始前,需要保证本地已安装 Node.js

2.1 准备工作

下面安装 yo 命令,该命令用于生成 VC Code 扩展工程的脚手架。

shell 复制代码
npm install --global yo generator-code

安装完成后,将 npm 的全局 bin 目录添加到系统环境变量,方便直接使用安装的命令。

shell 复制代码
echo 'export PATH="$(npm config get prefix)/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

下面使用 yo code 命令生成 VS Code 扩展工程 copilot-models-rest-api 的脚手架:

shell 复制代码
yo code

可以看到,生成的工程为一个标准的 TypeScript 工程,其调用入口为 src/extension.ts

2.2 编写核心逻辑

接下来在脚手架工程 copilot-models-rest-apisrc 目录下编写核心逻辑。

a)LanguageModelService.ts

首先,新建一个 LanguageModelService.ts 文件,用于通过 VS Code 内置的 API 获取到 Copilot 的可用大语言模型,然后封装出三个方法供别的 ts 文件调用:

  • getAvailableModels()

    获取 Copilot 支持的所有大模型名称;

  • getModelById()

    根据大模型名称获取特定大模型对象;

  • createChatCompletion()

    指定想用的大模型,然后传入一段文本,并请求大模型返回结果。

typescript 复制代码
import * as vscode from "vscode";
import { ChatRequest, ChatResponse } from "./types";
import { LanguageModelChat } from "vscode";

export class LanguageModelService {
  // ...

  public async getAvailableModels(): Promise<string[]> {
    try {
      const models = await vscode.lm.selectChatModels({
        vendor: "copilot",
      });

      if (models.length === 0) {
        console.error("No Copilot models available");
        return [];
      }

      return models.map((model) => model.id);
    } catch (error: any) {
      console.error("Error fetching models:", error);
      return [];
    }
  }

  public async getModelById(
    modelId?: string
  ): Promise<LanguageModelChat | null> {
    try {
      const models = await vscode.lm.selectChatModels({
        vendor: "copilot",
      });
      // ...

      const model = models.find((m) => m.id === modelId);
      return model || null;
    } catch (error: any) {
      console.error("Error fetching model by ID:", error);
      return null;
    }
  }

  public async createChatCompletion(req: ChatRequest): Promise<ChatResponse> {
    const model = await this.getModelById(req.model);
    // ...

    try {
      const messagePayload = req.messages.map((msg) =>
        vscode.LanguageModelChatMessage.User(msg)
      );
      const resp = await model.sendRequest(
        messagePayload,
        {},
        new vscode.CancellationTokenSource().token
      );

      let fullText: string = "";
      for await (const chunk of resp.text) {
        fullText += chunk;
      }
      return { reply: fullText, model: model.id };
    } catch (error: any) {
      console.error("Error creating chat completion:", error);
      return { error: "Error creating chat completion: " + error.message };
    }
  }
}

b)ApiServer.ts

接下来,使用 ApiServer.ts 包装上述 LanguageModelService,以 RESTful API 方式暴露用户与大模型交互的能力。

ApiServer.ts 的代码如下:

可以看到,ApiServer.ts 主要负责接收请求并返回响应。其提供了一个 POST /v1/chat/completions API 来接收用户输入信息,并调用 LanguageModelServicecreateChatCompletion() 的方法来给出回答。

typescript 复制代码
import * as http from "http";
import * as url from "url";
import { LanguageModelService } from "./languageModelService";
import { ChatRequest } from "./types";

export class ApiServer {
  private server: http.Server | null = null;
  private port: number;
  private languageModelService: LanguageModelService;

  constructor(port: number) {
    this.port = port;
    this.languageModelService = LanguageModelService.getInstance();
  }

  private async handleRequest(
    req: http.IncomingMessage,
    res: http.ServerResponse
  ): Promise<void> {
    const parsedUrl = url.parse(req.url || "", true);
    const path = parsedUrl.pathname || "";

    try {
      if (req.method === "POST") {
        await this.handlePostRequest(path, req, res);
      } else {
        this.sendResponse(res, 405, { error: "Method Not Allowed" });
      }
    } catch (error: any) {
      console.error("request failed", error);
      this.sendResponse(res, 500, { error: "Internal Server Error" });
    }
  }

  private async handlePostRequest(
    path: string,
    req: http.IncomingMessage,
    res: http.ServerResponse
  ): Promise<void> {
    if (path === "/v1/chat/completions") {
      const body = await this.readRequestBody(req);
      const chatRequest: ChatRequest = JSON.parse(body);
      const chatResponse = await this.languageModelService.createChatCompletion(
        chatRequest
      );
      this.sendResponse(res, 200, chatResponse);
    } else {
      this.sendResponse(res, 404, { error: "Not Found" });
    }
  }

  public async start(): Promise<void> {
    this.server = http.createServer((req, res) => {
      console.log(`Received request: ${req.method} ${req.url}`);
      this.handleRequest(req, res);
    });
    // ...
  }

  public async stop(): Promise<void> {
    // ...
  }
}

c)extension.ts

最后,修改 VS Code 扩展的入口文件 extension.ts,将 ApiServer 的启动和停止命令注册到 VS Code。

extension.ts 的代码如下:

typescript 复制代码
import * as vscode from "vscode";
import { ApiServer } from "./apiServer";

let apiServer: ApiServer | null = null;

export function activate(context: vscode.ExtensionContext) {
  // start API server command
  vscode.commands.registerCommand(
    "copilot-models-rest-api.startServer",
    async () => {
      const port = 3001; // You can change the port number if needed
      apiServer = new ApiServer(port);

      try {
        await apiServer.start();
        vscode.window.showInformationMessage(
          `API Server started on port ${port}`
        );
      } catch (error) {
        vscode.window.showErrorMessage("Failed to start API Server");
      }
    }
  );

  // stop API server command
  vscode.commands.registerCommand(
    "copilot-models-rest-api.stopServer",
    async () => {
      if (apiServer) {
        try {
          await apiServer.stop();
          vscode.window.showInformationMessage("API Server stopped");
        } catch (error) {
          vscode.window.showErrorMessage("Failed to stop API Server");
        }
      } else {
        vscode.window.showWarningMessage("API Server is not running");
      }
    }
  );
}

// This method is called when your extension is deactivated
export function deactivate() {
  if (apiServer) {
    apiServer.stop().catch((error: Error) => {
      console.error("Error stopping API Server:", error);
    });
  }
}

至此,我们想要的扩展的源码部分就基本实现完成了。

2.3 生成 vsix 文件

最后,使用如下 npm 命令安装依赖和打包。

shell 复制代码
npm install
npm run package

使用如下 npm 命令安装 vsce 命令,并使用 vsce 命令来将工程打包为一个 .vsix 文件。

shell 复制代码
npm install -g @vscode/vsce

vsce package

这样,有需要的朋友就可以在 VS Code 安装这个扩展,然后使用我们包装好的 API 了。

3 使用这个 VS Code 扩展

下面,我们在 VS Code 安装上面生成的 vsix 扩展,然后尝试重新编写提示词,看看其能否实现文章开头的「批量生成博客年度总结」的需求。

3.1 安装扩展

首先,点击 VS Code 左侧的 Extensions Tab,然后点击 Install from VSIX,选择上述 .vsix 文件所在位置,即可安装成功。

扩展安装成功后,在 VS Code 键入「Ctrl + Shift + P」后,点击「Start Copilot Models REST API Server」命令,即可启动 API Server。

Server 启动成功后,尝试用 Postman 调用一下和模型对话的 API,咨询模型的结果被成功返回。

3.2 使用扩展

最后,尝试将文章开头「批量生成博客年度总结」的提示词修改如下:

markdown 复制代码
annual-report 文件夹下的 blog-posts.json 文件包含了多个博客在 2025 年的所有文章标题。

您需要针对每个博客在这一年发布的所有文章标题,调用如下模型对话 API 来生成一段 200 字以内的总结。

API 地址:http://localhost:3001/v1/chat/completions

调用示例如下:

```text
POST http://localhost:3001/v1/chat/completions

Request Body:

{
    "model": "gpt-4.1",
    "messages": [
        "如下是一个博客于 2025 年发布的所有文章标题,请基于此生成一个 200 字的总结。总结以「您的博客文章涵盖了...」开始,格式为纯文本格式,若有英文或数字字符,前后请使用空格隔开。",

        "提示工程需要遵循的五个原则(附实践案例)",
        "關於 2026 年即將生效的「吸毒記錄可封存」法案",
        "如何使用 Spec Kit 工具进行规范驱动开发?",
        "Markdown 将成为 AI 时代的通用编程语言?"
    ]
}

Response Body:

{
    "reply": "您的博客文章涵盖了 2025 年技术趋势、开发实践、法律政策、旅行见闻及社会观察等多个领域。技术类内容包括 MCP、 Spring Boot 、 Spring Data 、 MapStruct 、 P6Spy 、 Playwright MCP 、 FastMCP 、 Spec Kit 、 Alibaba DataX 等工具和框架的实用教程,涉及数据库操作、对象映射、事件解耦、服务工厂设计、数据迁移及浏览器自动化等主题,并探讨了 Markdown 在 AI 时代的地位。政策与社会类文章关注「吸毒记录可封存」法案、历史事件及社会热点。生活类内容则记录了 2025 年的假期总结及多地旅行体验,展现了丰富多元的个人视角。",
    "model": "gpt-4.1"
}
```

最后以 `blog-summary.json` 为文件名,输出一个包含所有博客总结的 JSON 数组,格式如下:

```json
[
  {
    "blog": "leileiluoluo.com",
    "summary": "您的博客文章涵盖了技术开发、社会热点和个人生活等多个领域。在技术方面,您深入探讨了提示工程、规范驱动开发、Spring Boot 框架的应用、数据库迁移与优化等主题,展示了对前沿技术的关注与实践经验的分享;同时,您还介绍了 Markdown 编程语言的潜力、MapStruct 对象映射工具的优势,以及 MCP 在浏览器自动化中的应用等内容,体现了对技术趋势的敏锐洞察。在社会热点方面,您关注了吸毒记录封存法案、历史事件以及社会案件,表达了独到的见解。在个人生活方面,您记录了多次旅行与家庭活动,展现了对自然风光的热爱与家庭生活的温馨。这些文章内容丰富,兼具专业性与生活化,体现了广泛的兴趣与深刻的思考。"
  }
  // ...
]
```

最后,Copilot 生成的代码使用了我们提供的 API,并最终生成了符合预期的内容:

4 小结

综上,本文以实际使用 Copilot「批量生成博客年度总结」时,Copilot 因没有直接可用的模型 API 调用而未能按预期完成任务为由,提出了编写 VS Code 扩展暴露 Copilot 自身可用模型的想法。

经过实践,发现通过编写 VS Code 插件,可以成功获取到 Copilot 的可用模型,并成功与模型实现对话,从而将 Copilot 可用模型暴露为 REST API 变为了现实。

本文完整 VS Code 扩展工程已提交至 GitHub,欢迎关注、Fork,或获取扩展文件来使用。

参考资料

1\] Visual Studio Code Extension API: Your First Extension - [code.visualstudio.com/api/get-sta...](https://link.juejin.cn?target=https%3A%2F%2Fcode.visualstudio.com%2Fapi%2Fget-started%2Fyour-first-extension "https://code.visualstudio.com/api/get-started/your-first-extension") \[2\] Visual Studio Code Extension API: Language Model API - [code.visualstudio.com/api/extensi...](https://link.juejin.cn?target=https%3A%2F%2Fcode.visualstudio.com%2Fapi%2Fextension-guides%2Fai%2Flanguage-model "https://code.visualstudio.com/api/extension-guides/ai/language-model")

相关推荐
格林威1 小时前
多相机拼接:消除重叠区域的6个核心方法,附OpenCV+Halcon实战代码!
人工智能·数码相机·opencv·计算机视觉·机器人·视觉检测·制造
小白量化2 小时前
聚宽策略分享-1年化98国九条后中小板微盘小改
大数据·数据库·人工智能·量化·qmt
张拭心7 小时前
Cursor 又偷偷更新,这个功能太实用:Visual Editor for Cursor Browser
前端·人工智能
吴佳浩7 小时前
大模型 MoE,你明白了么?
人工智能·llm
Blossom.1189 小时前
基于Embedding+图神经网络的开源软件供应链漏洞检测:从SBOM到自动修复的完整实践
人工智能·分布式·深度学习·神经网络·copilot·开源软件·embedding
t198751289 小时前
电力系统经典节点系统潮流计算MATLAB实现
人工智能·算法·matlab
万悉科技9 小时前
比 Profound 更适合中国企业的GEO产品
大数据·人工智能
mqiqe9 小时前
vLLM(vLLM.ai)生产环境部署大模型
人工智能·vllm
V1ncent Chen9 小时前
机器是如何“洞察“世界的?:深度学习
人工智能·深度学习