专家配专模
每个 Agent 在 agents/*.md 里声明自己的 model:,简单检索不为不需要的推理能力付费,复杂任务也不将就小模型。
每个专家 Agent 绑定适合自己的模型,父 Agent 只做编排与合成。省 token 不是靠压缩提示词,是靠边界让不该跨界的内容不跨界 —— 隔离是完全的:专家的中间过程不进父的任何一轮上下文。
名字来自苍鹭(heron):长久静立、瞬间精准出手。
$ openheron [main] config loaded: version=3f2a1b9c8d0e [main] frontend: embedded from web/dist > 帮我看看这个仓库的顶层目录 …
省 token 有三种做法,openheron 走的是第三条。
每个 Agent 在 agents/*.md 里声明自己的 model:,简单检索不为不需要的推理能力付费,复杂任务也不将就小模型。
专家 Agent 作为一个有界能力被调用:它自己的工具循环与中间推理留在自己的上下文里,父 Agent 只拿到它写的那份结构化总结。
边界让不该跨界的内容不跨界 —— 隔离是完全的:专家的中间过程不进父的任何一轮上下文。
省 token 在可分解、工具输出冗长的任务上最显著;顺序依赖强的任务,单 Agent 反而可能更快更准。
「省 41%」是 openheron 自带基准的实测口径:三类编码任务、同一张价格表下,多 Agent 拓扑花了「一个强模型直干」的 0.587 倍;同一轮它通过 6/9(基线 9/9,其中两次失败是端点超时)—— 省钱和可靠性要一起看。
「高性能」指单位 token 的有效产出,不承诺零延迟或无限并发。
专家配专模要配对才划算:出厂配置里两个 Agent 共用一个模型,配错模型比不配更浪费。
可观测性同样是完全的 —— 专家的思考与工具调用实时出现在界面上(带归属),也留在记录里。
「谁还能干什么,说不清」是多 Agent 系统最常见的翻车方式。这几条是出厂就成立的约束。
外层 policy/permissions.yaml 定全局 ask / deny,内层每个 Agent 用自己的 disabled_tools 收窄。外层的 deny 对所有 Agent 生效,子 Agent 放松不了它。
入口 Agent 是第 0 层,深度 d 的 Agent 当且仅当 d < max_depth 才能再生子 Agent;拓扑超限启动期就报错,不静默截断。
互不依赖的活并行分派;用量按 Agent 分账。
模型档案、提示词、审批策略都是能读能改的文件:要 review 就 review,要提交进版本库就提交 —— 全放本地、只你自己看。
前端嵌进单文件,跨平台静态编译,运行时没有额外依赖要一起装。
一条消息从你手里到工具箱,中间只隔几层;干完的动静再沿事件流回到浏览器。层与层之间的事你基本不用管 —— 只有「要不要点头」这一件需要你参与。
当 Agent 要调用被标记为 ask 的工具时,轮次会停住,输入框被一张审批卡取代。批准后从 checkpoint 继续;拒绝的理由写不写都行,写了会回灌给模型。
下面是审批卡的真实形态,可以直接点。
审批模型细节 →把 internal/config.go 里的端口改成 9090
先确认一下当前实现。
Agent 已暂停,等你回应。
/your/project/internal/config.go✓ 已批准 · 从 checkpoint 恢复,继续执行
端口已改为 9090,其余配置未动。
✕ 已拒绝 · 理由已回灌给模型
收到,那这个端口我不动了 —— 你说的对,它由 config.yaml 统一管理。要我改那边吗?
不是「一问一答」的聊天窗口,而是一个能被打断、能恢复、能被审批卡掐住的多轮运行时。
每个会话一条常驻运行线,随时接着聊;历史落盘,关掉浏览器再打开还在。
对话到 Agent 的阈值(默认窗口的 80%)自动压成摘要,也可以 /compact 立刻压。压的是上下文,记录仍然读得到。
同一会话同时只跑一轮;另一个窗口再发会被拒(409 session_busy),正在跑的那轮不受影响 —— 停止它才能接管。
立刻停掉当前这一轮。
写文件、执行命令等动作在执行前挂起,你批准后从 checkpoint 恢复。
一个主 Agent 把活分给子 Agent(只读检索 / 改代码 / 审阅),可并行。
把自己的语料建成索引,Agent 用 kb_search 检索并给出来源。
改 llm/ agents/ policy/ 保存即生效,不用重启。
界面里直接编辑配置文件,写入前自动校验。
/review、/explain、/fix 等开箱可用;技能可自建。
openheron init 写出 main 与 task 两个 Agent —— main 的 subagents: [task] 引用 task,少一个就是启动期硬错误,所以总是两个一起写。
| 角色 | 干什么 | 能写文件 |
|---|---|---|
main | 只做决策与委派,不自己写文件 | 否 |
task | 按任务单执行 | 能 |
# 构建(前端 + 单文件二进制)
make build
# 在你的项目里生成最小可运行配置
cd /your/project && openheron init
# 密钥只从环境变量读(出厂默认端点是 deepseek)
export DEEPSEEK_API_KEY=sk-...
# 启动,打开 http://localhost:8080
openheron十章,按需查阅。每一章都能直达小节。