Tabby VS Code 扩展 Chat 功能实战指南:聊天问答与内联代码编辑
【免费下载链接】tabbySelf-hosted AI coding assistant项目地址: https://gitcode.com/GitHub_Trending/tab/tabby
Tabby 是一款自托管的 AI 编程助手,其 VS Code 扩展在代码补全之外还提供完整的 Chat 能力:你可以在侧边栏聊天视图中与 AI 对话、针对选中的代码提问,甚至让 AI 直接在编辑器里完成代码修改。本文基于仓库中的官方上手文档 clients/vscode/assets/walkthroughs/chat.md 展开,并深入对应的扩展源码,讲解从启用服务端 Chat 模型到使用内联编辑(Chat Edit)的完整链路,读完即可在自己的 VS Code 环境中跑通全部 Chat 功能。
前置条件:服务端必须启用 Chat 模型
Chat 功能并非默认可用,它依赖 Tabby 服务端加载了对应的聊天模型。官方文档明确提示:
Chat features are only available when your server supports them. You need to launch the server with the chat model option enabled, for example,
--chat-model Mistral-7B.
也就是说,启动 Tabby 服务端时必须带上--chat-model参数指定一个聊天模型,例如:
tabby serve --chat-model Mistral-7B模型名称需要与你自己下载或配置的模型 ID 对应(如 Mistral-7B、Qwen2-1.5B-Instruct 等)。如果服务端未启用 Chat 模型,扩展的聊天面板将无法加载。
服务端健康检查:chat_model 是硬性条件
从扩展源码可以确认,"服务端是否支持 Chat" 并不是靠猜测,而是由一次健康检查决定的。在 clients/vscode/src/chat/webview.ts 的checkStatusInfo方法中,扩展会读取 Tabby 服务端的 health 状态,并依次校验:
- 服务是否处于
connecting/unauthorized/disconnected等异常状态; - 服务端 health 中
webserver与chat_model两个字段是否都为真,任一缺失都会返回错误提示:
if (!health["webserver"] || !health["chat_model"]) { return "You need to launch the server with the chat model enabled; for example, use `--chat-model Qwen2-1.5B-Instruct`."; }- 服务端版本是否满足最低要求(源码中
MIN_VERSION = "0.27.0"),低于该版本会提示 "Tabby Chat requires Tabby server version 0.27.0 or later"。
只有全部校验通过,聊天面板才会真正加载。因此,如果你发现聊天视图一直显示连接中或错误页,请优先检查服务端是否以--chat-model启动、版本是否 ≥ 0.27.0。
从活动栏打开 Chat View 开始会话
满足前置条件后,在 VS Code 活动栏(Activity Bar)中找到 Tabby 图标,即可打开聊天视图并开始一个新的会话。聊天视图本质上是一个内嵌的 Webview 面板,其宿主实现位于 clients/vscode/src/chat/sidePanel.ts:
ChatSidePanelProvider实现WebviewViewProvider,负责将聊天视图挂载到侧边栏,并在视图可见性变化时同步chatSidePanelVisible上下文变量;- 内部封装了一个
ChatWebview(见 clients/vscode/src/chat/webview.ts),它通过tabby-chat-panel提供的客户端与内嵌的聊天 UI 通信。
聊天面板的加载逻辑位于checkStatusAndLoadContent():扩展会根据 LSP 客户端上报的状态与当前服务端配置(endpoint/token)决定加载聊天面板还是错误页;若配置变更,会通过reloadCount强制重载整个 Webview(见 webview.ts)。此外,源码中还有独立的createChatPanel(chatPanel.ts),对应Tabby: Create Chat Panel命令,可在一个独立的编辑器标签页中打开聊天界面。
值得一提的是,聊天 UI 与扩展宿主之间通过 clients/vscode/src/chat/createClient.ts 建立了一条基于tabby-threads的 iframe 消息通道(先以quilt.threads.ping/pong握手确认连接,再通过postMessage转发双向调用)。这套机制让聊天面板具备"选择代码提问""读取当前文件内容""跳转到符号定义""读取 Git 变更"等能力——这些能力都通过ClientApi暴露给聊天面板调用。
针对选中代码提问:Tabby: Explain This
聊天不只是自由问答,你还可以把编辑器里的代码作为上下文,让 AI 针对性地解释或处理。
操作步骤
- 在编辑器中选中一段代码;
- 打开命令面板(
Ctrl+Shift+P/Cmd+Shift+P); - 搜索并执行诸如
Tabby: Explain This的命令,即可让 AI 解释选中的代码。
更多针对选中代码的预设命令
命令面板中与选中代码相关的命令远不止 Explain 一个。在 clients/vscode/src/commands/index.ts 中可以看到一系列以chat.*CodeBlock命名的命令,它们统一采用"先聚焦聊天视图,再向聊天面板下发预设指令"的模式:
| 命令 | 预设指令 | 用途 |
|---|---|---|
Tabby: Explain This(chat.explainCodeBlock) | explain | 解释选中的代码 |
Tabby: Fix This(chat.fixCodeBlock) | fix | 修复选中代码中的问题 |
Tabby: Generate Docstring(chat.generateCodeBlockDoc) | generate-docs | 为选中代码生成文档注释 |
Tabby: Generate Tests(chat.generateCodeBlockTest) | generate-tests | 为选中代码生成测试 |
Tabby: Code Review(chat.codeReviewCodeBlock) | code-review | 对选中代码做代码评审 |
以chat.explainCodeBlock的实现为例:
"chat.explainCodeBlock": async () => { ensureHasEditorSelection(async () => { await commands.executeCommand("tabby.chatView.focus"); this.chatSidePanelProvider.chatWebview.executeCommand("explain"); }); },可以看到执行链路是:先通过ensureHasEditorSelection确保当前有代码选区,然后聚焦聊天视图,最后调用chatWebview.executeCommand("explain")把预设指令发给聊天面板。最终指令通过 webview.ts 中的executeCommand转发给tabby-chat-panel客户端(explain-terminal等终端相关指令走 0.10.0 版本的 API,其余走 0.8.0 版本)。
上下文是如何注入的
选中代码之所以能进入对话,是因为扩展把编辑器选区同步成了"相关上下文"。在 clients/vscode/src/commands/index.ts 中,Tabby: Add Selection to Chat(chat.addRelevantContext)会读取当前选区的EditorContext并调用addRelevantContext注入聊天;同时 webview.ts 监听了 VS Code 的onDidChangeActiveTextEditor与onDidChangeTextEditorSelection事件(经过防抖),自动把活动编辑器的选区变化同步给聊天面板,因此 AI 可以感知你正在编辑的文件与光标位置。
用 Chat Edit 直接在编辑器里改代码
聊天回答只能给你参考,而Tabby: Edit...能直接把 AI 的修改落进编辑器,这是 Chat 功能最"生产力"的部分。
启动编辑
- 执行命令
Tabby: Edit...(命令 ID 为tabby.chat.edit.start); - 快捷键:
Ctrl+I(Windows/Linux)/Cmd+I(macOS)。
命令注册与快捷键绑定定义在 clients/vscode/package.json 中。启动后,你可以输入自己的修改请求,也可以选择一个预设命令(例如让 AI 修复问题、补全实现等),Tabby 就会以流式方式在编辑器中生成修改草稿。
处理编辑结果
编辑完成后,编辑块顶部会显示操作入口,你可以在两种结果之间选择:
- Accept(接受):快捷键
Ctrl+Enter/Cmd+Enter,把 AI 的修改正式写入文档; - Discard(放弃):快捷键
Esc,丢弃本次修改。
此外,在编辑进行中随时按Esc可以停止(Stop)正在进行的编辑。注意:这些快捷键要求光标位于编辑块(editing block)的标题行上;启动编辑时光标默认就停在那里,所以通常不需要额外移动。
源码视角:命令与 CodeLens 的配合
接受/放弃/停止背后是对应的三个命令(clients/vscode/src/commands/index.ts):
tabby.chat.edit.stop:取消chatEditCancellationTokenSource,终止正在进行的编辑生成;tabby.chat.edit.accept:根据当前光标所在位置构造一个覆盖整行的 location,然后调用 LSP 客户端的chat.resolveEdit({ location, action: "accept" })让服务端落实修改;tabby.chat.edit.discard:同理调用chat.resolveEdit({ ..., action: "discard" })撤销修改。
编辑块上的 "Accept / Discard" 按钮其实是通过 CodeLens 渲染的,实现在 clients/vscode/src/lsp/CodeLensMiddleware.ts:它把tabby.chat.edit.accept与tabby.chat.edit.discard映射为编辑块顶部可点击的 CodeLens 命令,因此鼠标点击与快捷键走的是同一条命令链路。
编辑会话本身由InlineEditController管理(clients/vscode/src/code-action/InlineEdit.ts),它在chat.edit.start时创建,接受当前编辑器的选区范围作为默认编辑范围,并通过取消令牌支持中途停止(commands/index.ts)。
编辑内容如何写入编辑器
聊天面板生成的代码通过onApplyInEditor回传(clients/vscode/src/chat/webview.ts):扩展会根据选区首行的缩进自动推算内容缩进(支持空格与 Tab),把返回的代码块整体缩进到与选区一致后,再通过editor.edit()替换选区。如果聊天面板请求"智能应用"(smart: true),则走smartApplyInEditor,调用 LSP 的provideSmartApplyEdit,期间会在通知区域显示可取消的进度条(webview.ts)。
小结
Tabby 的 VS Code Chat 功能由三个环节构成:服务端以--chat-model启用聊天模型并通过健康检查放行(webview.ts)、侧边栏聊天视图承载对话与上下文注入(sidePanel.ts)、以及Tabby: Edit...(Ctrl/Cmd+I)驱动的内联编辑闭环。掌握"选中代码提问 + 预设命令 + 内联编辑"这套组合,你就可以在自托管的私有环境中完成从问答到改码的完整 AI 辅助开发流程。若遇到聊天面板无法加载,优先检查服务端是否带--chat-model启动、版本是否不低于 0.27.0,以及 token 与网络连通性。
【免费下载链接】tabbySelf-hosted AI coding assistant项目地址: https://gitcode.com/GitHub_Trending/tab/tabby
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考