嫌桌面 Agent 太重,我“自己”写了一个

嫌桌面 Agent 太重,我"自己"写了一个

起因很简单:我试过的桌面 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。

相关推荐
宋哥转AI2 小时前
我的创作纪念日:成为创作者的第 128 天
人工智能·ai
ajassi20003 小时前
AI语音智能体开发日记(十八)智能体服务器xiaozhi-esp32-server源码部署指南
运维·服务器·人工智能·ai·ai编程
梦想的颜色3 小时前
【编程实战】AI 时代 APP 开发全栈硬核指南:技术选型 + AI 架构 + 模型落地全维度决策
python·flutter·react native·react.js·ai·桌面应用·milvus
时空节拍AI数字人3 小时前
数字文旅补贴来了,景区申报要注意什么?
大数据·人工智能·百度·3d·ai·架构·aigc
Martina_03213 小时前
AI生成3D模型导入后只剩一个大网格?用6步完成微缩场景拆分与优化
人工智能·游戏·数学建模·3d·ai·自然语言处理·aigc
遇码4 小时前
system prompt 里拼了时间和知识大纲,每轮缓存都被击穿:静态/动态分离的提示词装配方法
人工智能·ai·大模型
俊哥V4 小时前
每日 AI 研究简报 · 2026-10-10
人工智能·ai
Hui Baby4 小时前
A2A简述
ai
xiami_world4 小时前
Xmind、Miro、博思白板AI怎么选?思维导图/流程图自动生成
人工智能·ai·信息可视化·流程图·xmind