跳转至

cloudwego/eino

仓库:cloudwego/eino

这个项目在系统里负责哪一层

Eino 负责的是 Go 里的 AI 编排层。它解决的不是“Go 怎么调一个模型接口”,而是“当系统开始出现多步执行、工具调用、状态传递、回调观测和中断恢复时,应该怎样把这些复杂度显式组织起来”。

如果你已经发现“在 handler 里写一个大循环”开始撑不住,Eino 就值得看。它的价值不在于把功能堆多,而在于把运行时问题摆到台面上。

先抓整体结构

读这个项目时,先抓四个对象:

  • model:推理能力从哪里来。
  • tool:执行能力怎样挂进来。
  • graph:多步状态怎样编排。
  • callback:运行过程怎样被看见。

这四层一旦分开,你就不容易把 Agent 理解成“大 prompt + 多调几次函数”。Eino 的重点一直是运行时编排,而不是单次调用。

一条典型执行链

一条典型多步链路大致会这样跑:

  1. 输入进入 graph,对应到一份明确的运行状态。
  2. 某个 model 节点读取当前状态,决定是直接回答还是调用工具。
  3. tool 节点执行外部能力,并把结果写回状态。
  4. callback 记录节点执行、工具调用、错误和事件流。
  5. 如果遇到人工确认或长任务边界,运行时可以 interrupt,后续再 resume。
  6. 满足停止条件后,graph 收口并返回结果。

这里最重要的不是“节点很多”,而是状态、控制流和观测都成了正式对象。这样系统复杂之后,你还能知道自己现在在哪一步、为什么停在这里、恢复后该从哪里继续。

值得学的设计

Eino 最值得学的地方,是它把很多团队经常拖到最后才补的东西提前显式化了。MaxStep 不是装饰项,而是在回答“循环什么时候必须停”。interrupt 和 resume 不是高级玩法,而是在回答“中途让人接手或任务恢复时,状态应该怎样保住”。callback 也不是日志 sugar,而是在回答“多步链路发生了什么,怎么进入 trace 和 UI”。

这类设计放到企业系统里很实用。比如一个报销助手先查状态,再查制度,再决定是否进入催办审批。如果没有显式状态和中断点,这条链一长就会越来越难控。

适合借回自己项目的点

  • 先把运行状态做成显式对象,不要靠临时变量和隐式上下文串流程。
  • callback 和 trace 尽早进入主链,不要等排障时再补。
  • 人工介入点设计成正式节点,而不是临时分支。
  • 真的出现多步、可恢复链路时,再考虑图编排。

不要照抄的地方

  • 不要因为框架支持 graph,就把简单确定性流程也画成图。
  • 不要把所有状态都堆成一个巨型上下文对象,后面一定会失控。
  • 不要只学“怎么跑起来”,却不学 MaxStep、callback、interrupt、resume 这些真正的运行时问题。