大家好,我是磊磊落落,目前我在技术上主要关注: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-api 的 src 目录下编写核心逻辑。
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 来接收用户输入信息,并调用 LanguageModelService 的 createChatCompletion() 的方法来给出回答。
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")