嫌桌面 Agent 太重,我"自己"写了一个
- 官网和文档:https://wosledon.github.io/Hetu/
- 源码和 Issue:https://github.com/wosledon/Hetu
- 下载:https://github.com/wosledon/Hetu/releases
起因很简单:我试过的桌面 Agent 一个比一个大,装完动不动占一两个 G,而我要的功能其实只有那么几样,还分散在好几个软件里。后来就想,自己写一个吧------把我在用的这些功能挑出来,只做这些,看看能不能做一个出来。当然,现在我是一边写一边自己简单用用,还没有重度使用,应该还有不少的问题。
做完之后的实际体积:Windows 安装包 15 MB(slim)/ 60 MB(fat),Linux deb 23 MB / 67 MB。fat 和 slim 的区别只有一个:fat 自带 .NET 运行时,slim 需要系统已经装了 .NET 10。(跨平台没验证过,但是其实就是一个 web 套了一个 tauri v2 的壳子,应该没啥大问题)。
现在这个项目叫 Hetu(河图),Apache-2.0 开源,最新版本 0.3.4。下面按我写的顺序说一下里面都有什么,哪些是我想做的、哪些做得还不行。
写代码
Code 会话是我用得最多的部分。一次会话可以单独开一个工作树,也可以直接在当前分支上改。界面上有文件浏览、行级 diff、Git 暂存提交、PR 面板(按远端自动用 gh 或 glab,没装的话会给安装命令),还有一个真的终端------底层是 PTY,vim、htop 这类全屏程序能跑。
Agent 动文件之前会自动打检查点,做砸了可以整体回滚。权限有五档:计划(只调研、先出方案)、只读、写入需确认、自动执行、绕过。看板跑的时候是放开的,需要模型自己调用 askQuestion 才会阻塞。
SSH 写远程项目
项目可以是本地目录,也可以是一台 SSH 机器上的目录。远程项目下,读文件、写文件、搜代码、跑命令这些都走同一条 SSH 通道,本机不需要挂载任何东西。终端也能连过去。
整理笔记
笔记是所见即所得编辑(Milkdown)+ 源码视图(CodeMirror),可以分屏。有无限层级笔记本、标签、三秒自动保存、历史版本(能对比、能还原)、分享链接(带访问计数)、回收站。
有用的地方在于它和对话共用一套存储:笔记随时可以被索引、被语义检索、被 Agent 当上下文读;聊出来的内容也能一键整理成 Markdown 笔记,落进指定笔记本。
知识库、知识图谱和检索
笔记、文件、网址都能进知识库,做分块和向量化,向量存在本地(SQLite 用 sqlite-vec,也可以切 PostgreSQL 用 pgvector)。知识库里有个搜索测试页,能调 Top-K 看命中片段,方便验证检索质量。
知识图谱是从笔记里让模型抽实体和关系,力导向可视化,可以点实体跳回原笔记。对话里开着"知识库""记忆"开关时,模型检索的是你自己的东西,不是它训练时的通用知识。
工作流:让多个智能体按固定流程干活
多智能体协同最容易出的问题是它不按你想的顺序走。所以这里做的是工作流编排,节点类型有这些:开始、Agent、条件、循环、并行、汇聚、工具、人工审批、子工作流、结束。跑到人工审批节点会停下来等你点确认,审批提示语可以自己写。
工作流可以手动跑、可以挂到定时任务上,也可以被看板任务触发。
项目里的 Copilot 配置可以直接复用
我平时也用 VS Code 的 Copilot,它认 .github 下那套约定。Hetu 的编码会话读的就是同一批文件,所以两边共用一套配置,不用维护两份:
.github/copilot-instructions.md和.github/instructions/*.instructions.md:仓库级指令,带applyTo的按适用范围匹配.github/agents/*.agent.md、.github/chatmodes/*.chatmode.md:自定义智能体,会话里可以直接选,选中的角色完整注入.github/prompts/*.prompt.md:提示词模板,输入框里打/ 模板名触发.github/skills/**/SKILL.md:仓库技能,按名字加载
好处很直接:给 VS Code Copilot 写的那套指令、智能体、提示词模板、技能,Hetu 这边原样生效,改一处两边都对。反过来也一样,不需要搞第二份"AI 配置文件",但是更精细的控制还没有实现,比如 VS Code Copilot 是可以在 Yaml 头上指定子智能体、限制 tool_list 的,这方面没有做。
SSH 远程项目也会扫一遍。远端的 .github 经常是个软链,所以走远端 shell 扫描而不是假设本地挂载;结果有短缓存,还限制了扫描文件数(400)和单文件大小(64 KB)------不然每条消息都 ssh 一次既慢又容易抽风。指令注入也有上限,单条 3000 字符、合计 6000 字符,免得一个超长指令文件把上下文吃掉。
顺带说一句,任务看板里那个"项目智能体"就是从这套资产里来的:卡片可以直接选 .github/agents 里定义的智能体,交给后台自动执行。
任务看板:任务自己认领
看板是七列(待办池、待办、进行中、审核中、已阻塞、已完成、已归档)。卡片上指定一个智能体,或者项目 .github 里的智能体(就是上一节那套和 VS Code Copilot 共用的配置),或者一条工作流------只要指定了其中一个,任务拖进"待办"就会由后台自动接管,不用点开始。
它跑的时候:先把状态改成"进行中"并写一条系统评论,然后在该任务的项目的根目录里干活;跑完把结果写成一条评论、状态进"审核中"、同时推一条收件箱通知。中间如果它需要我拍板,会提出问题并停下来,任务变成"已阻塞",我在评论里回一句,它回到"进行中"接着做------不会自己瞎猜。执行过程中想过什么、调了哪些工具、命令输出是什么,按顺序存成一条时间线,事后能翻。
在"审核中"写评论也会让它带着这条评论继续改,等于用 code review 的方式驱动它。
这块算是个简易版吧,借鉴了 Multica,我本质上是想办法把一个一体化的产研平台接入进来,让智能体自己去认领迭代和任务,但是还没想好怎么弄。
记忆(这块我没怎么验证,纯粹是为了好看,啊哈哈哈)
记忆按类别和重要性存,有作用域(全局 / 会话 / 项目),对话里会自动召回,也能手动搜。另外做了一个定时巩固:太久没用到的记忆会衰减、合并,最后被遗忘。
老实说,功能是有的,但我自己没有长期用,效果如何不好讲。这块等用一段时间再回来写。
模型:接了 models.dev,可以自选
供应商元数据来自 models.dev:添加一个供应商基本只需要填 API Key,模型也从目录里挑,挑完自动带上下文长度、是否支持推理、推理强度档位这些配置。
模型可以按用途设默认(对话、嵌入),单个会话、技能、看板任务也都能单独指定用哪个模型,覆盖默认值。OpenAI 兼容和 Anthropic 协议都支持,Key 用 ASP.NET 的 DataProtection 加密存本地。
压缩管道:纯粹为了省钱,现在都太贵了
长会话里最烧钱的不是某条消息太长,而是同一份内容被反复重发------构建日志、目录树、重复报错。所以做了一条压缩管道,十个节点顺序执行:结构化折叠、三级去重、格式压缩、日志去重、SimHash 近似去重、数字归一化、(停用词)、关键行抽取、超长头尾保留、(LLM 摘要)。
默认只跑纯算法的那八个,LLM 摘要默认关闭;压完如果没比原文短,直接丢掉结果用原文。用量页能看到每次请求的压缩率,以及一共省了多少 token。
原来想的 LLM 摘要可以用小模型帮我省钱,但是发现现在没有什么又快又好的小模型可以干这些事情,目前还比较鸡肋。
Wiki(目前质量不行)
选中一个项目,读它的 README、目录结构和代码片段,生成一套 Wiki:一个项目总览 + 若干模块页,可以按套件重新生成。
功能是通的,但生成质量我自己不满意,结构很简单,内容也不是很详细。
代理服务
做的原因有两个:一是不想为了切模型再装个小工具;二是有些工具的 BYOK 只能填一个模型(点名 Copilot CLI),填完就没法换。其实本质上跟中转站是一个逻辑,就是请求透传,没有做协议转换,感觉那个没必要。
Hetu 起了两个兼容端点:
- OpenAI 兼容:
http://localhost:5000/v1/chat/completions - Anthropic 兼容:
http://localhost:5000/v1/anthropic/messages
外部工具只要把 Base URL 指过来,model 填一个虚拟 ModelKey,实际打到哪个供应商的哪个模型由 Hetu 这边决定。请求转发前还会过一遍压缩管道,用量也进同一份统计。注意它不做协议互转:OpenAI 端点只往 OpenAI 协议的供应商转,Anthropic 端点同理。
模型路由(很简单,没达到预期)
代理支持 route 和 shadow 两种模式:route 是按类别规则把请求分到不同目标模型,shadow 是拿另一个模型做对照。代码里还留了个分类模型的位置,想着按内容自动选模型。
真做起来才发现没那么容易,现在这套还很粗,效果也就那样。算是个半成品。
技术栈和怎么跑
后端 ASP.NET Core 10 + EF Core + SQLite(可选 PostgreSQL + pgvector),前端 React 19 + TypeScript + Vite + Tailwind,桌面壳 Tauri 2(后端作为 sidecar 自动拉起,关窗口默认缩到托盘继续跑任务)。
想试的话,桌面版直接在 Releases 里下(Windows NSIS / MSI,Linux AppImage / deb);跑源码需要 .NET SDK 10 和 Node.js 20:
bash
git clone https://github.com/wosledon/Hetu.git
cd Hetu
# Windows PowerShell
.\scripts\start.ps1
# Linux / macOS / Git Bash
./scripts/start.sh
起来之后前端在 http://localhost:5174 ,后端在 http://localhost:5000 ,接口文档在 http://localhost:5000/scalar/v1 。第一次用只要在"大模型"里加一个供应商、填 Key,再挑个默认模型就能聊了。数据默认在 %LOCALAPPDATA%\Hetu(Linux 在对应的用户数据目录)。
现在的状态
单人项目,按照个人习惯开发的,目前还没有长时间投入使用,所以有些地方粗糙、有些功能只做了骨架(记忆、Wiki、模型路由都在这个名单里)。没有协作、没有云同步、没有手机端------它就是给自己用的本地工具。
有什么想问的实现细节,或者觉得哪个模块的做法有问题,评论区说,或者直接开 Issue。