1. 从零搭一个 VSCode 插件,为什么我建议用 yo generator-code
如果你写过 VSCode 插件,大概经历过这种折腾:手动建目录、猜package.json里contributes怎么写、activationEvents到底填什么、main指向哪个文件、TypeScript 编译配置怎么配。光是让插件在 F5 之后弹出一句提示,就能耗掉半小时。yo加generator-code这套官方脚手架,就是来解决这个问题的——它把插件工程的标准结构一次性生成好,你只需要在骨架上填业务逻辑。
这篇要做的,是在脚手架生成的插件里,接入 TaoToken 的统一 Key 和 API 通道。TaoToken 是一个面向开发者的模型调用入口,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite ,它提供统一的 API Key 和兼容常见接口协议的调用地址,适合把「调用大模型」这件事收口到一个 Key 上。插件里如果到处散落不同的 Key 和地址,维护起来很痛苦;统一到一个通道后,配置、切换、排障都简单很多。
适合谁看:会一点 JavaScript 或 TypeScript、装过 Node.js、想在 VSCode 里做个小工具(比如选中代码让模型解释、生成注释、做代码审查)的开发者。全程不需要你从零理解 VSCode 的 API 体系,跟着命令走,最后能跑通一次真实请求就算成功。
我试过把 Key 硬编码在插件源码里,结果一提交就泄露,后来改成读配置,才算踏实。下面这套骨架就是按「配置与代码分离」的思路来的。
2. 前置准备:Node、yo、generator-code 与 TaoToken Key
先把环境铺好。VSCode 插件本质是一个 Node 包,所以 Node.js 是硬前提。建议 Node 18 或以上,用node -v确认。npm 随 Node 一起装好,npm -v能看到版本即可。
接着装两个全局工具。yo是 Yeoman 的命令行入口,generator-code是 VSCode 官方维护的生成器:
npm install -g yo generator-code装完可以用yo --version和npm ls -g generator-code确认。如果提示权限错误,Windows 下用管理员终端,macOS/Linux 下别直接sudo npm -g,更稳的做法是配置 npm 的全局目录到用户目录,避免污染系统路径。
然后是 TaoToken 的 Key。打开 https://taotoken.net/api 这个 API 入口,按文档说明在控制台里创建 API Key。创建后你会拿到一串以特定前缀开头的密钥,复制保存好——它通常只完整显示一次。同时记下文档里给出的调用基地址(base URL),后面配置里要用。
这里有个关键认知:插件里不要把 Key 写进源码。源码会进 Git、会被打包、会被别人看到。正确做法是让插件从 VSCode 的配置项里读 Key,用户在自己机器上填。这样你的插件发布出去,别人用自己的 Key,互不影响。
注意:Key 属于敏感凭据,任何情况下都不要提交到代码仓库,也不要在截图、日志里明文打印。调试时如果必须看,用掩码方式只显示前几位。
3. 用 yo code 生成插件工程骨架
环境好了,开始生成。在你想放项目的目录下执行:
yo code脚手架会交互式问你几个问题。第一次做,按下面选:
- 类型选
New Extension (TypeScript),TypeScript 有类型提示,写 VSCode API 时不容易拼错。 - 插件名填一个英文标识,比如
taotoken-helper。 - identifier 一般自动生成,保持默认。
- description 随便写一句,比如
A VSCode extension using TaoToken unified key。 - 是否初始化 Git 仓库,选是。
- 包管理器选 npm。
生成完成后进入目录,用 VSCode 打开:
cd taotoken-helper code .此时目录结构大致是这样:src/extension.ts是入口,package.json描述插件元信息和贡献点,.vscode/launch.json定义了 F5 调试配置,tsconfig.json管编译。脚手架已经帮你把「按 F5 启动一个扩展开发宿主窗口」这条链路配好了,这是它最省事的地方。
先别急着改逻辑,按 F5 跑一次原始版本。会弹出一个新窗口,标题带[Extension Development Host]。在新窗口里按Ctrl+Shift+P(macOS 是Cmd+Shift+P),输入Hello World,回车,右下角应该弹出提示。这一步通了,说明脚手架、编译、调试链路全部正常,后面出问题就只可能是我们自己的代码。
4. 在 package.json 里声明配置项与命令
现在往骨架里加 TaoToken 相关的东西。第一步是改package.json,声明两个配置项(Key 和 base URL)以及一个触发命令。找到contributes字段,改成下面这样:
{ "contributes": { "commands": [ { "command": "taotokenHelper.askModel", "title": "TaoToken: Ask Model" } ], "configuration": { "title": "TaoToken Helper", "properties": { "taotokenHelper.apiKey": { "type": "string", "default": "", "description": "TaoToken 统一 API Key", "markdownDescription": "在 [TaoToken 控制台](https://taotoken.net/api) 创建,仅保存在本机设置中。" }, "taotokenHelper.baseUrl": { "type": "string", "default": "https://taotoken.net/api", "description": "TaoToken API 基地址" }, "taotokenHelper.model": { "type": "string", "default": "gpt-4o-mini", "description": "默认调用的模型名称" } } } } }同时确认activationEvents里有对应命令的激活事件。新版脚手架可能用onCommand自动推导,如果没有,手动加上:
{ "activationEvents": [ "onCommand:taotokenHelper.askModel" ] }这里的设计意图:apiKey默认空字符串,用户必须自己填;baseUrl给一个默认值,指向 TaoToken 的 API 入口;model也留默认,方便快速验证。三个配置项都挂在taotokenHelper命名空间下,读取时用taotokenHelper.apiKey这样的完整键名。
改完package.json,VSCode 可能会提示重新加载窗口,照做即可。此时在设置界面搜索TaoToken,应该能看到这三个配置项。
5. 读取统一 Key 并发出第一个请求
接下来写核心逻辑。打开src/extension.ts,把内容替换成下面这份。它做了三件事:注册命令、从配置读 Key、用 Node 内置的fetch发请求。
import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { const disposable = vscode.commands.registerCommand( 'taotokenHelper.askModel', async () => { const config = vscode.workspace.getConfiguration('taotokenHelper'); const apiKey = config.get<string>('apiKey'); const baseUrl = config.get<string>('baseUrl'); const model = config.get<string>('model'); if (!apiKey) { vscode.window.showErrorMessage( '未配置 TaoToken API Key,请在设置中填写 taotokenHelper.apiKey' ); return; } const editor = vscode.window.activeTextEditor; const selected = editor ? editor.document.getText(editor.selection) : ''; const prompt = selected || '用一句话解释什么是 VSCode 插件'; try { const resp = await fetch(`${baseUrl}/v1/chat/completions`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey}` }, body: JSON.stringify({ model, messages: [{ role: 'user', content: prompt }] }) }); if (!resp.ok) { const text = await resp.text(); vscode.window.showErrorMessage(`请求失败 ${resp.status}: ${text}`); return; } const data: any = await resp.json(); const content = data?.choices?.[0]?.message?.content ?? '(空响应)'; vscode.window.showInformationMessage(content.slice(0, 200)); } catch (err: any) { vscode.window.showErrorMessage(`调用异常: ${err.message}`); } } ); context.subscriptions.push(disposable); } export function deactivate() {}几个要点。getConfiguration('taotokenHelper')拿到的是命名空间,再get('apiKey')取具体项,这是 VSCode 配置读取的标准姿势。请求头里Authorization: Bearer <key>是常见的鉴权格式,具体以 TaoToken 文档为准。fetch在 Node 18 以上是全局可用的,不用额外装依赖;如果你的 Node 版本偏低,可以引入node-fetch。
选中代码再执行命令时,prompt就是选中的内容,相当于「选中即提问」;没选中就用一句默认问题,方便空跑验证。
6. 启动调试并验证请求是否走通
代码写完,按 F5 启动调试。新窗口打开后,先配置 Key:在新窗口里按Ctrl+,打开设置,搜索TaoToken,把taotokenHelper.apiKey填成你创建的那串 Key。base URL 和 model 保持默认即可。
然后按Ctrl+Shift+P,输入TaoToken: Ask Model,回车。如果一切正常,右下角会弹出模型返回的内容(截取前 200 字)。想更直观,可以在编辑器里选中一段代码再执行,返回的就是针对这段代码的回答。
验证请求真的走通了,可以看两个地方。一是 VSCode 的「输出」面板,如果你在代码里加了日志,能看到请求前后的打印;二是 TaoToken 控制台的调用记录,通常会有请求时间、模型、消耗等条目。两边对得上,说明链路完整。
如果返回的是错误信息,先看状态码。401 一般是 Key 不对或没填;404 多半是 base URL 或路径拼错;429 是频率或额度问题。把错误原文读一遍,比盲目改代码有效得多。
7. 本篇常见报错与排查清单
F5 之后没有新窗口,或提示找不到扩展。多半是编译没过。打开「终端」跑npm run compile,看 TypeScript 报什么错。常见的是类型不匹配或漏了分号,按提示改。
命令面板里搜不到TaoToken: Ask Model。检查package.json的commands里命令名是否和registerCommand里的字符串完全一致,大小写、点号都不能差。改完package.json要重新加载窗口。
提示「未配置 TaoToken API Key」。说明配置读取到了空值。确认你是在扩展开发宿主窗口里填的设置,而不是原窗口。两个窗口的设置是独立的。
请求返回 401。Key 复制时可能带了空格或换行,重新粘贴一次。也确认请求头格式是Bearer加一个空格再加 Key。
请求返回 404。检查baseUrl末尾有没有多余的斜杠,以及拼接的路径/v1/chat/completions是否和 TaoToken 文档一致。不同通道的路径可能不同,以文档为准。
fetch is not defined。Node 版本低于 18。升级 Node,或改用node-fetch并import fetch from 'node-fetch'。
改了代码但行为没变。调试窗口不会自动热重载,改完要重新按 F5,或者用Ctrl+Shift+F5重启调试会话。
8. 把 Key 收口之后,下一步往哪走
到这里,你已经有了一个能跑通真实请求的 VSCode 插件骨架:脚手架负责工程结构,package.json负责声明配置和命令,extension.ts负责读统一 Key 并发请求。这套结构的好处是,以后你想加功能——比如右键菜单、代码补全、侧边栏面板——都只是往contributes和registerCommand里加东西,Key 和地址始终只有一处配置。
如果你打算把这个插件长期用下去,或者做成团队内部工具,建议把调用逻辑抽成单独的模块,再配合 Coding Plan 这类长期编码场景的通道来管理额度与模型切换,入口在 https://taotoken.net/api 的文档里能找到对应说明。调试阶段想快速对比不同模型的返回效果,可以直接用模型对话页面手动试几次,确认提示词和参数没问题,再固化到插件里。
最后留一个实用习惯:把taotokenHelper.apiKey这类敏感配置写进工作区的.vscode/settings.json时,记得把该文件加进.gitignore,或者改用用户级设置。插件发布前,全局搜一遍源码里有没有残留的 Key 字符串,这一步能帮你避开大多数凭据泄露的坑。