我把 VS Code 里的 AI 编程助手,换成了自己写的一个

发布时间:2026/10/28 2:05:34
我把 VS Code 里的 AI 编程助手,换成了自己写的一个

HWChat 0.1.9 · 本地优先 · 不绑定模型 · 权限可解释 · MIT 开源
仓库:https://github.com/Gsaecy/DeepSeek-HWChat

过去一年多,AI 编程工具从"补全几行代码"变成了"帮你改一个仓库"。能力确实上来了,但我用着用着,心里有三个越来越明显的不舒服:

第一,模型不是我的。订阅制工具基本把你绑在它选的那一两个模型上。模型三个月一代,价格半年一变,而这些变化跟你没关系——你只能在"用"和"不用"之间选。

第二,权限是个黑箱。一个能读你整个仓库、还能执行终端命令的东西,它的边界到底在哪?大多数产品给你的是一句"我们很安全",而不是一张能读懂的表。

第三,过程是黑箱。它改了什么、为什么这么改、哪一步失败了、失败之后怎么绕过去的,事后基本翻不到。

于是我写了一个自己的:HWChat。当前版本 0.1.9,装在 VS Code 右侧辅助侧边栏里,MIT 开源。

一句话说清它是什么

一个跑在 VS Code 里的编码 Agent 扩展。你可以接 DeepSeek 官方接口,也可以接任何 OpenAI 兼容的地址——自建的、中转的、公司内部网关的,都行。

它有三种工作模式:

模式能做什么适合什么时候用
Agent读代码、搜项目、看诊断、建/改/移动/删文件、跑命令,把结果回传给模型做多轮真正要干活的时候
Plan只有只读工具,分析代码、给方案,物理上改不了工作区动手前先对齐思路
Chat不开放任何工作区工具,只聊你明确加进来的上下文问概念、写文案、看一段贴进来的代码

这里我要专门说 Plan。以前让模型"先给方案别改代码",本质上是个口头约定——它答应得好好的,下一秒照样可能开始写文件。HWChat 的 Plan 模式里根本没有写文件的工具,这不是自律,是没有能力。

一、模型是你自己的,不是插件送的

HWChat 支持多个 API 配置档,每个配置档独立保存地址、API Key、模型列表和请求头,在对话标题下面那一行就能即时切换。日常用便宜的快模型,硬骨头切到强模型,一个对话里就能换。

模型列表不是写死的。它会去读当前接口的/models,拿到真实的细分模型和展示名称,把接口自己标记为停用、过期、不可用的过滤掉,也记住你手动排除过哪些。DeepSeek 官网接口在第一次刷新之前,用deepseek-flash和deepseek-v4-pro做离线兜底。

思考深度也不是摆设。只有当/models的元数据声明这个模型支持多档调节时,选择器才会亮起来;不支持、固定思考、能力未知的模型,界面会老老实实告诉你不能调,而不是画一个能点的下拉框骗你。兼容接口如果不认这个参数,HWChat 会把它去掉再重试一次。

为什么在意这件事:工具的生命周期比模型长。今天最好的模型,明年可能连名字都改了。把工具和模型解绑,是对自己钱包和时间的基本尊重。

二、权限不是一个开关,是四档 + 三档

大多数工具的权限设置长这样:一个"自动执行"的勾。勾上就全放开,不勾就每一步都问你。这两种都不好用——前者不敢开,后者烦到关掉。

HWChat 给的是四个预设,每档的边界写死在设置页的表格里,也写在输入框下拉项的说明里:

预设读取写入只读命令正常命令危险命令敏感文件
每次询问逐次确认逐次确认逐次确认逐次确认直接拒绝禁止
风险操作询问自动允许自动允许(工作区内)自动允许自动允许逐次确认禁止
Autopilot自动允许自动允许(工作区内)自动允许自动允许自动允许禁止
完全访问自动允许自动允许(工作区内)自动允许自动允许自动允许逐次确认

命令本身也分三档:

  • 只读命令:ls、git status、grep这类没有副作用的;
  • 正常命令:装依赖、构建、提交;
  • 危险命令:提权、破坏性删除、磁盘擦写、强制推送、把网络脚本直接交给 shell 执行。

0.1.8 里有个改动我觉得挺说明问题:git push和curl/wget原来被算成"正常命令",在"风险操作询问"档下会被静默执行。但推送和下载都是不可撤销的对外动作,而 VS Code 自己在审批规则里又把它们列为不可自动批准——两套口径互相矛盾。后来统一了,都算危险。

另外几个细节:

  • .env、证书、私钥、SSH / AWS / Kubernetes 凭据按"敏感文件"策略走,默认禁止,调到「完全访问」档才逐次确认,而且弹窗里会写明要读哪个文件;
  • 未受信任的工作区里,写入和命令永远是关的;
  • 子进程的环境变量会剥掉常见的 token、secret、password、API Key;
  • 远程 API 地址必须 HTTPS,只有本机localhost/127.0.0.1/::1允许 HTTP;
  • 审批弹窗的默认按钮是拒绝。0.1.8 之前"允许一次"排在第一位,回车就选中——急着确认或者手滑,等于批准。现在回车和 Esc 都只做保守处理,真要放行得主动去点第二个按钮;
  • 无遥测。对话、Skill、Agent 审计记录默认只存在本机,设置里可以一键清空。

为什么在意这件事:权限设计的目标不是"防模型造反",而是让我敢让它自己跑。一个我能讲清楚边界的 Agent,比一个我永远只敢用 Chat 模式的 Agent 有用得多。

三、Skill:只在该用的时候加载

HWChat 会扫这些位置找本地 Skill:

  • .hwchat/skills/*.md
  • .agents/skills/**/SKILL.md
  • .claude/skills/**/SKILL.md
  • VS Code 全局存储里的用户 Skill 目录
  • ~/.copilot/skills/**/SKILL.md

关键在加载策略。默认的route模式下,Agent 和 Plan 先看到的是一张轻量路由表(名字 + 描述),任务真的匹配上了,才通过load_skill去读全文。每条回复只显示本轮真正读过的 Skill 名称和数量,不会把二十个 Skill 全塞进上下文然后告诉你"已启用"。

它和"本地 skill 快捷调用"扩展共享同一份~/.copilot/.skill-quick-launch.json:那边勾选的会成为新对话的默认选择,最近调用时间也会同步回去。但"默认启用"不等于"每轮都加载"。

为什么在意这件事:Skill 的本质是给模型补知识,但上下文是要花钱的。把所有 Skill 常驻,等于每轮都在为一个可能用不上的技能付费。

四、它在跑,你还能改主意

这一点是我自己用下来最离不开的。

Agent 干活的时候,输入框仍然可以编辑和发送。你补充的要求会分成两类处理:

  • 相关:合并进当前任务,在下一个工具边界重新规划,还没执行的冲突步骤直接跳过;
  • 无关:进入一个可见的任务树队列,当前分支做完自动接着跑。

而且运行中插进去的每个问题,都会立刻生成自己的排队回答位,答案最后显示在对应问题下面——不是把后面几个问题的答案一股脑堆到上一条回复前面。

需要拆步骤的任务,Agent 会写一份任务清单(update_todos),摆在任务树和输入框之间,按执行顺序编号:左边是这一步要做什么,右边是状态(等待执行 / 执行中 / 已完成)。它始终只让一项处于「执行中」,每完成一步更新一次,全部做完后保留整份清单作为记录。清单跟着对话存,重载窗口还在。这个工具不需要授权——它既不读也不写工作区、也不执行命令,记个待办还要弹窗只会让人以为它有副作用。

还有那个停止按钮。任务在跑的时候,发送按钮会变成红色高亮 + 呼吸光环的停止按钮,实心方块图标。系统开了"减少动态效果"就不播动画。听起来是个小细节,但它解决的是一个很实际的问题:我得一眼看出"它现在在跑",以及"点这里能停"。

五、崩了也不丢,聊完了还能接

  • 每条消息独立存储,同目录临时文件 + 原子替换 + 恢复备份;索引坏了会从磁盘重建;
  • 流式回复每 1.5 秒落盘一次,扩展异常退出后已经生成的内容还在;
  • 对话可以固定、归档、恢复、搜索、删除、流式导出;
  • 超出磁盘预算时按最久未使用淘汰,但固定、归档、执行中的对话不会被删;
  • 已完成任务的思考过程、Token 明细、工具出入参、附件正文会按保留时间瘦身,但最终回复、累计 Token、实际用过的 Skill、工具摘要、文件列表和审批结果都留着。

还有一个功能叫续接:从任意一条历史记录点"续接",或者运行命令HWChat: 在新对话中续接当前任务历史,新对话会带一份来源对话的本地只读交接摘要,Agent 还能按需去检索来源链里的旧消息,不用把已经踩过的坑再踩一遍。旧对话不会被复制也不会被修改——保存摘要本身不花 Token,真正发出去的摘要和检索片段才算输入。

跨天做一个功能的时候,这个比"往上翻 200 条消息"实在得多。

六、一些只有自己用才会去抠的细节

这些算不上功能,更像执念,但用起来差别很大:

  • 回复是真正的 Markdown 排版:标题、嵌套列表、表格(含对齐和横向滚动)、引用、分隔线,行内加粗、行内代码、删除线、链接。侧边栏只有 420px 宽,表格不加横向滚动会把正文撑破。
  • 思考过程默认折叠,标题上直接写状态:流式中显示"正在思考…“,结束后显示"N 字 · 点开查看”。不点开也知道值不值得看。
  • 每个执行步骤默认折叠,只显示结果摘要;展开后能看到工具输入、输出、审批状态、耗时和涉及文件。展开状态归你:流式输出期间列表重新渲染也不会把你点开的那一步收回去。
  • 回复里的每段"我打算做什么",后面紧跟它触发的那组步骤(做了什么、结果如何),按发生顺序交错出现,不用上下对照。
  • 每条回复显示本轮 Token 消耗,统一换算成M tokens;对话列表显示整段对话的累计。
  • 中英文界面在设置里一键切,不重载窗口;连权限对照表都是从策略值推导出来的,不是手写两份文案。
  • 多根工作区是原生支持的:列出所有根目录、浏览、读取、在编辑器里打开文件,不绕终端、不绕codeCLI。
  • 其他 VS Code 扩展暴露的语言模型工具也能调,而且走同一套路径隔离。这个之前有个洞:自己的read_file锁在工作区内,但桥接出去的readFile能读/etc/hosts——一扇门上锁、一扇门敞开。现在参数里的路径会先过检查,~、$HOME、工作区外的绝对路径、越界的..都拦掉,被拒的调用根本到不了 VS Code。

适合谁,不适合谁

适合:

  • 手里已经有 API Key,想自己决定用哪个模型、花多少钱的人;
  • 在意权限边界,希望"能自动跑"和"能解释清楚"同时成立的人;
  • 多根工作区的重度用户(十几个项目挂在一个窗口里那种);
  • 愿意读 CHANGELOG 的人——它的更新日志会写清每条改动的原因,包括"这里以前判错了"。

不适合:

  • 想要开箱即用、不想配 API 的人;
  • 想要行内自动补全的人。这是 Agent,不是补全插件,两者解决的不是一个问题;
  • 需要团队集中管控、统一计费和审计后台的团队场景。

怎么开始

要求 VS Code1.106.0或更高版本。

安装已构建的 VSIX:

code --install-extension hwchat-0.1.9.vsix

打开命令面板,执行HWChat: 打开对话面板。第一次使用进设置,新建一个 API 配置档,保存 Key。Key 只进 VS Code 的SecretStorage,不会写进settings.json、项目文件或 VSIX。

从源码构建(需要 Node.js 20+):

npminstallnpmrun checknpmtestnpmrun package

产物是根目录下的hwchat-0.1.9.vsix。

最后

HWChat 现在是 0.1.9,一个人维护。它没有大厂的产品打磨,但它有两个我很在意的东西:边界是写出来的,以及每条改动都说得出为什么。

举个 CHANGELOG 里的例子:search_files在多根工作区里搜不到东西,根因是每个根各查一遍之后,合并顺序是"根 1 全部 → 根 2 全部",而扫描预算是按文件数算的——预算在第一个根就花光了,第 17 个根根本轮不到打开。修法是把各根的结果轮流交错合并,预算就分摊了。回归测试构造了四个各 420 个文件的噪声根,把目标根放在最后。

这种问题不会出现在演示视频里,但它决定你第 30 天还想不想打开这个工具。

如果你也在用别的 AI 编程工具,不妨把它当第二意见:同一份代码,两个 Agent 各给一个方案,往往比一个 Agent 给你三个方案更有用。

仓库在这里,欢迎提 issue,也欢迎直接读源码——MIT,随便看:

https://github.com/Gsaecy/DeepSeek-HWChat