
1. 从零做一个能聊天的 VS Code 插件卡点到底在哪VS Code 插件开发本身门槛不高yo code一把梭就能跑起来一个 Hello World。但当你真正想给插件塞进一个「聊天窗口」让它能调用大模型 API 时问题就来了Key 放哪、怎么在extension.ts里发请求、settings.json里该写哪些字段、WebView 和主进程怎么通信、请求发出去了但返回 401 怎么查。这些环节任何一个没打通插件就只是个摆设。这篇面向的是已经会写基础 VS Code 插件、但还没把「聊天能力」接进插件的开发者。核心目标很明确用 TaoToken 的统一 Key 和 API 通道把大模型调用接进插件并给出一份可以直接复制的settings.json配置骨架最后在插件里发一次真实对话请求验证配置是否生效。TaoToken 在这里扮演的角色是「统一入口」——你不用在插件里维护一堆不同厂商的 Key 和 endpoint一个 Key、一个 base URL 就能覆盖多种模型插件配置层会干净很多。适合谁看写过extension.ts、知道package.json里contributes是干嘛的、但还没在插件里跑通过一次大模型请求的人。如果你连插件项目都还没建建议先跑一遍yo code再回来。2. TaoToken 前置准备拿到统一 Key 和 API 通道在写任何配置之前先把「钥匙」和「门牌号」准备好。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 通道地址是 https://taotoken.net/api 这个不加 UTM直接作为 base URL 用。你需要做两件事第一登录后在控制台创建一个 API Key。这个 Key 就是你插件里唯一要填的凭证格式通常是一串以sk-开头的字符串。创建入口在控制台的 API Keys 页面建议给这个 Key 起个能认出来的名字比如vscode-chat-plugin方便以后按项目区分和吊销。第二确认你要调用的模型名。TaoToken 的模型对话页面可以直观看到当前可用的模型列表选一个你打算在插件里默认使用的比如某个通用对话模型。模型名要原样记下来后面写进settings.json的model字段。注意Key 不要硬编码进extension.ts然后提交到 Git。正确做法是让插件从 VS Code 的配置系统读取用户在自己的settings.json里填。这也是下面配置骨架的设计原则。如果你打算长期在插件里做编码类 Agent 能力而不是单纯聊天可以顺带了解一下 Coding Plan它更适合高频、长上下文的编码场景只是做对话验证的话普通 API Key 就够了。3. 可复制的 settings.json 配置骨架VS Code 插件的配置分两层一层是插件在package.json里通过contributes.configuration声明「我有哪些配置项」另一层是用户在自己的settings.json里填具体值。下面这份骨架是插件侧声明 用户侧填写的完整对照。先在插件项目的package.json里加上配置声明{ contributes: { configuration: { title: Chat Plugin, properties: { chatPlugin.apiKey: { type: string, default: , description: TaoToken 统一 API Key }, chatPlugin.baseUrl: { type: string, default: https://taotoken.net/api, description: TaoToken API 通道地址 }, chatPlugin.model: { type: string, default: gpt-4o-mini, description: 默认对话模型名 }, chatPlugin.maxTokens: { type: number, default: 1024, description: 单次回复最大 token 数 } } } } }然后在用户侧的settings.jsonCtrlShiftP→ Open User Settings JSON里填{ chatPlugin.apiKey: sk-你的TaoToken密钥, chatPlugin.baseUrl: https://taotoken.net/api, chatPlugin.model: gpt-4o-mini, chatPlugin.maxTokens: 1024 }这样拆的好处是Key 永远不进代码仓库换模型只改配置不改代码团队里每个人可以用自己的 Key。插件代码里通过vscode.workspace.getConfiguration(chatPlugin)读取这些值即可。配置项作用建议值chatPlugin.apiKey身份凭证控制台创建的 KeychatPlugin.baseUrlAPI 通道https://taotoken.net/apichatPlugin.model默认模型按对话页可用列表选chatPlugin.maxTokens回复长度上限512–20484. 在 extension.ts 里发起一次真实对话请求配置写好了接下来验证它到底通不通。核心逻辑是在extension.ts里注册一个命令读取配置向 TaoToken 的 API 通道发一个标准的 chat completions 请求。import * as vscode from vscode; export function activate(context: vscode.ExtensionContext) { const disposable vscode.commands.registerCommand(chatPlugin.ask, async () { const cfg vscode.workspace.getConfiguration(chatPlugin); const apiKey cfg.getstring(apiKey); const baseUrl cfg.getstring(baseUrl); const model cfg.getstring(model); const maxTokens cfg.getnumber(maxTokens); if (!apiKey) { vscode.window.showErrorMessage(请先在 settings.json 配置 chatPlugin.apiKey); return; } const userInput await vscode.window.showInputBox({ prompt: 输入你的问题 }); if (!userInput) return; try { const res await fetch(${baseUrl}/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${apiKey} }, body: JSON.stringify({ model, max_tokens: maxTokens, messages: [{ role: user, content: userInput }] }) }); if (!res.ok) { const errText await res.text(); vscode.window.showErrorMessage(请求失败 ${res.status}: ${errText}); return; } const data await res.json(); const reply data.choices?.[0]?.message?.content ?? (空回复); vscode.window.showInformationMessage(reply); } catch (e) { vscode.window.showErrorMessage(网络异常: ${String(e)}); } }); context.subscriptions.push(disposable); }别忘了在package.json的contributes.commands里注册chatPlugin.ask并在activationEvents里加上onCommand:chatPlugin.ask。Node 18 自带fetchVS Code 新版运行时可以直接用如果你的环境较老换成https模块或axios即可。验证动作按 F5 启动扩展开发宿主窗口CtrlShiftP输入chatPlugin.ask敲一个问题。如果配置正确右下角会弹出模型回复如果 Key 或 base URL 有问题会直接弹出错误码和错误文本方便定位。5. 本篇常见错排查401 Unauthorized九成是 Key 没填对或没生效。检查settings.json里chatPlugin.apiKey是否真的写进去了注意别把 Key 写在插件项目的.vscode/settings.json里却以为改的是用户配置。改完配置后重启扩展宿主窗口再试。404 Not Foundbase URL 拼错了。正确写法是https://taotoken.net/api请求路径再拼/v1/chat/completions。如果你把 base URL 写成了带/v1的就会变成/v1/v1/...直接 404。模型名报错 model not foundchatPlugin.model填的模型名不在可用列表里。去模型对话页面确认一下当前可用的模型名原样复制注意大小写和连字符。fetch is not definedVS Code 运行时版本较老。把fetch换成axios或者用 Node 的https.request手写请求。也可以检查package.json里的engines.vscode版本适当调高。配置改了但插件读到的还是旧值getConfiguration有缓存行为。在开发调试时改完用户settings.json后重新加载窗口Developer: Reload Window最稳妥。请求发出去了但一直没返回先确认网络能正常访问 API 通道再检查maxTokens是不是设得过大导致响应慢。调试阶段建议设 512 左右快速拿到结果。6. 把配置跑通之后下一步往哪走配置骨架和验证请求跑通之后你手里其实已经有了一个最小可用的聊天插件内核。接下来可以做的把showInformationMessage换成 WebView 面板做一个真正的对话界面把多轮消息存进context.globalState实现上下文记忆把chatPlugin.ask拆成「选中代码解释」「生成注释」等多个命令每个命令走不同的 system prompt。如果你打算把这个插件往编码 Agent 方向做比如让它能读工作区文件、执行多步任务那 API Key 的调用频率和上下文长度都会上去这时候可以看看 Coding Plan 是否更适合你的用量模型。接入文档里有更完整的参数说明和错误码对照排障时对着查会快很多。Key 的管理和轮换在 API Keys 页面操作建议给插件单独建一个 Key别和别的项目混用。