ezloop

module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 16, 2026 License: Apache-2.0

README

ezloop logo

ezloop

简单,不简陋。

一个 Loop · 两个节点 · 七个钩子 —— 用节点装饰器与流式插件组装任意智能体

Go Version Go Reference No Heavy Deps Tests

model 和 tool 管节点怎么执行,hook 管流程什么时候插入逻辑。


设计理念

大多数 Agent 框架把重试、MCP、审批、日志焊死在引擎里,能力越多,引擎越重。 ezloop 反其道而行:引擎不理解任何具体能力,它只负责流转。

flowchart LR
    subgraph 组装层
        A["NewAgent()"]
        W1["ModelWarp<br/>重试 / 降级 / 路由"]
        W2["ToolWarp<br/>卸载 / 防护 / 缓存"]
        H["Hooks ×7<br/>拦截 / 注入 / 清理"]
        A --> W1 & W2 & H
    end

    subgraph LOOP ["Loop 引擎(只负责流转)"]
        direction LR
        M["🧠 model"] -- "tool calls" --> T["🔧 tool"]
        T -- "tool results" --> M
        M -- "无 tool call" --> OUT["最终回答"]
    end

    W1 -. 包装 .-> M
    W2 -. 包装 .-> T
    H -. 插入 .-> LOOP

    LOOP --> E["Event 流<br/>OnEvent / RunAsync"]
    LOOP --> S["State<br/>可序列化 · 可恢复"]

整个框架只有三个核心概念:

概念 关注点 扩展方式
model 节点本身:模型调用 实现 provider.ModelProvider + WithModelWarp 中间件
tool 节点本身:工具执行 实现 types.Tool + WithToolWarp 中间件
hook 流的前后:生命周期与控制流 实现 hook 小接口 + WithHooks 插入

三条设计原则:

  1. 节点与流分离 —— model/tool 是循环的节点,用 Warp 装饰(怎么执行); hook 是循环的切面,按时机插入(什么时候做什么)。两者互不越界。
  2. 扩展永不入核 —— 重试是 warp,MCP 是 hook,审批是 hook,会话持久化也是 hook。 引擎零扩展依赖,不用不引入。
  3. 状态即消息 —— loop 的全部状态是 LoopState,其中 Messages 可序列化、 可恢复、可直接作为下一轮历史。没有隐藏的内存中间态。

📖 完整文档:核心理念 · Loop 引擎 · 架构全景 · 官方扩展指南 · 本地 Agent · Web Agent 内核

快速开始

go get github.com/xuanlv2002/ezloop
agent := core.NewAgent(p,
    core.WithSystemPrompt("你是一个严谨的助手"),   // agent 级系统提示词
    core.WithModelWarp(modelretry.Warp()),      // model 节点:重试
    core.WithToolWarp(safetool.Warp()),         // tool 节点:panic 防护
    core.WithHooks(mcp.NewHook(mcpCfg)),        // 流:MCP 工具接入
    core.WithStreaming(true),                   // 流式输出
)

// 同步:单轮
state, err := agent.Run(ctx, "帮我读一下 hello.txt")

// 多轮:上一轮的 Messages 直接作为历史
state, err = agent.Run(ctx, "再总结一下", core.WithHistory(state.Messages...))

// 异步:事件通道 + 取消(服务端场景)
h := agent.RunAsync(ctx, "长任务")
defer h.Cancel()
for e := range h.Events() { render(e) }   // loop 结束自动 close
state, err = h.Wait()

官方扩展

扩展 类型 说明
ext/fs 底座 FileSystem 核心(Read/Write/List)+ 可选能力 Modifier(Edit/ApplyPatch)、Searcher(Grep/Find);Local 实现全部能力(root 沙箱、补丁预检+回滚)
ext/provider/openai model OpenAI 兼容 Provider(Invoke + SSE 流式),兼容 DeepSeek/SiliconFlow/Ollama/vLLM
ext/warp/model/modelretry warp 模型重试:指数退避,流式仅在未发出 chunk 时重试
ext/warp/tool/safetool warp 工具防护:panic 恢复 + error 附加上下文
ext/warp/tool/offload warp 大结果卸载:超阈值写入 FS,上下文只留摘要+路径
ext/hook/mcp hook mcpRouter 单工具封装(schema 恒定、KV cache 友好、配置热加载),内置官方 go-sdk
ext/hook/skill hook 技能注入:代码定义或从 FS 目录加载 *.md(可选 .keywords)
ext/hook/summary hook loop 结束自动生成摘要写入 Metadata
ext/hook/approve hook 工具审批:同步阻塞式 Approver + 轮次式审批 Store
ext/hook/filetools hook 文件工具集:read_file(行分页)、write、edit、apply_patch、grep、find、bash;按 FS 能力注册,修改走 per-path 队列
ext/hook/localsession hook 会话持久化:滚动快照到 sessions/.json,Load/List 恢复续聊

包结构

框架层(只含接口与引擎,零扩展依赖)
├── types/      统一结构体 LoopState / Message / Tool + ToolWarp
├── event/      事件定义与 OnEvent 回调
├── hook/       7 个 hook 小接口 + Action 短路语义
├── provider/   ModelProvider / StreamProvider 抽象 + Warp
└── core/       NewAgent 组装 + loop 引擎

扩展层(能力实现,官方 SDK 依赖放这里,不用不引入)
├── ext/provider/openai
├── ext/warp/{model/modelretry, tool/safetool, tool/offload}
├── ext/hook/{mcp,skill,summary,approve,filetools,localsession}
└── examples/chat        # 完整 agent:集成全部能力

测试

go test ./...        # 引擎行为 / 短路语义 / 事件顺序 / MCP 全链路 / SSE 聚合
go run ./examples/chat

ezloop — 简单,但不简陋。

Directories

Path Synopsis
Package core 实现 loop 引擎:NewAgent 组装 Provider、Hook 与工具, Run 驱动 "model → tool → model" 循环直到完成或终止。
Package core 实现 loop 引擎:NewAgent 组装 Provider、Hook 与工具, Run 驱动 "model → tool → model" 循环直到完成或终止。
examples
chat command
ezloop 完整 agent 示例:集成框架全部能力。
ezloop 完整 agent 示例:集成框架全部能力。
ext
fs
Package fs 定义 ext 层共享的文件系统抽象: offload 卸载、filetools 工具、skill 加载等中间件均依赖此接口, 便于注入内存 FS(测试)或受限 Local FS(生产)。
Package fs 定义 ext 层共享的文件系统抽象: offload 卸载、filetools 工具、skill 加载等中间件均依赖此接口, 便于注入内存 FS(测试)或受限 Local FS(生产)。
hook/approve
Package approve 提供工具调用审批:每次工具执行前询问 Approver, 拒绝时按配置跳过(Skip,默认)或终止(Abort)。
Package approve 提供工具调用审批:每次工具执行前询问 Approver, 拒绝时按配置跳过(Skip,默认)或终止(Abort)。
hook/filetools
Package filetools 提供基于 FileSystem 接口的核心文件工具集与终端执行工具, 通过 StartHook 注入,工具能力由传入文件系统实现的能力接口决定:
Package filetools 提供基于 FileSystem 接口的核心文件工具集与终端执行工具, 通过 StartHook 注入,工具能力由传入文件系统实现的能力接口决定:
hook/localsession
Package localsession 将 session 以文件形式持久化到本地文件系统: EndHook 时把完整可恢复状态(消息历史、用量、停止原因)写入 sessions/<id>.json,同一 ID 每轮滚动覆盖为最新快照。
Package localsession 将 session 以文件形式持久化到本地文件系统: EndHook 时把完整可恢复状态(消息历史、用量、停止原因)写入 sessions/<id>.json,同一 ID 每轮滚动覆盖为最新快照。
hook/mcp
Package mcp 通过单一 mcp_router 工具封装全部 MCP 调用。
Package mcp 通过单一 mcp_router 工具封装全部 MCP 调用。
hook/skill
Package skill 将预定义技能指令按需注入 system prompt。
Package skill 将预定义技能指令按需注入 system prompt。
hook/summary
Package summary 在 loop 结束时调用模型对整个过程生成摘要, 结果写入 state.Metadata["summary"](失败不阻断主流程)。
Package summary 在 loop 结束时调用模型对整个过程生成摘要, 结果写入 state.Metadata["summary"](失败不阻断主流程)。
provider/openai
Package openai 实现 OpenAI 兼容协议的 Provider, 任何兼容 /chat/completions 的端点(OpenAI/DeepSeek/vLLM/Ollama 等) 只需替换 BaseURL 即可接入。
Package openai 实现 OpenAI 兼容协议的 Provider, 任何兼容 /chat/completions 的端点(OpenAI/DeepSeek/vLLM/Ollama 等) 只需替换 BaseURL 即可接入。
warp/model/modelretry
Package modelretry 是 provider 装饰器:对模型调用做指数退避重试。
Package modelretry 是 provider 装饰器:对模型调用做指数退避重试。
warp/tool/offload
Package offload 是工具节点中间件:超大工具结果卸载到文件系统, 上下文里只保留头部摘要与文件路径,防止大输出(日志、转储、目录遍历) 撑爆上下文。
Package offload 是工具节点中间件:超大工具结果卸载到文件系统, 上下文里只保留头部摘要与文件路径,防止大输出(日志、转储、目录遍历) 撑爆上下文。
warp/tool/safetool
Package safetool 是工具节点中间件:panic 恢复为 error、error 附带工具名, 单个工具的崩溃不会炸掉整个 agent loop(工具错误由引擎回传模型自纠)。
Package safetool 是工具节点中间件:panic 恢复为 error、error 附带工具名, 单个工具的崩溃不会炸掉整个 agent loop(工具错误由引擎回传模型自纠)。
Package hook 定义 loop 引擎的全部扩展点。
Package hook 定义 loop 引擎的全部扩展点。
internal
testutil
Package testutil 提供各包测试共享的 mock:脚本式 Provider、 阻塞 Provider、echo 工具与响应构造器。
Package testutil 提供各包测试共享的 mock:脚本式 Provider、 阻塞 Provider、echo 工具与响应构造器。
Package provider 抽象模型调用节点,换模型/多模型路由均通过实现本接口扩展。
Package provider 抽象模型调用节点,换模型/多模型路由均通过实现本接口扩展。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL