vault backup: 2026-04-29 19:05:17

This commit is contained in:
2026-04-29 19:05:17 +08:00
parent 65228f9ea8
commit c464563bcf
86 changed files with 6 additions and 9 deletions
@@ -0,0 +1,47 @@
---
Description: ""
date: "2026-03-02"
lastmod: ""
tags: []
title: v0.4.*-compose optimization
weight: 4
---
## 版本概述
v0.4.0 版本主要对 Graph 编排能力进行了优化,移除了 `GetState` 方法,并为 AllPredecessor 触发模式启用了默认的 eager execution 模式。
---
## v0.4.0
**发布日期**: 2025-07-25
### Breaking Changes
- **移除 GetState 方法**:Graph 不再支持 `GetState` 方法,状态管理需要通过其他机制实现
### 新特性
- **AllPredecessor 模式默认启用 Eager Execution**:使用 AllPredecessor 触发模式的 Graph 默认采用 eager execution 策略,提升执行效率
---
## v0.4.1 - v0.4.8 主要更新
### 功能增强
- 支持使用 JSONSchema 描述工具参数 (#402)
- `ToJSONSchema()` 兼容 OpenAPIV3 到 JSONSchema 的转换 (#418)
- React Agent 新增 `WithTools` 便捷函数 (#435)
- 支持打印推理内容 (reasoning content) (#436)
- 新增 `PromptTokenDetails` 定义 (#377)
### 问题修复
- 修复子图从父图保存状态不正确的问题 (#389)
- 修复分支输入类型为 interface 且值为 nil 的处理 (#403)
- 修复 flow_react 中 `toolCallChecker` 使用错误上下文的问题 (#373)
- 修复 edge handlers 在 successor ready 时才解析的问题 (#438)
- 修复 end node 被跳过时的错误上报 (#411)
- 优化流式包装器错误处理 (#409)
@@ -0,0 +1,72 @@
---
Description: ""
date: "2026-03-02"
lastmod: ""
tags: []
title: v0.5.*-ADK implementation
weight: 5
---
## 版本概述
v0.5.0 是一个重要的里程碑版本,引入了 **ADK (Agent Development Kit)** 框架。ADK 提供了一套完整的智能体开发工具集,支持 Agent 编排、预置 Agent、会话管理、中断恢复等核心能力。
---
## v0.5.0
**发布日期**: 2025-09-10
### 重大新特性
#### ADK 框架 (#262)
ADK 是一套面向智能体开发的完整解决方案,主要包括:
- **ChatModelAgent**:基于大语言模型的基础智能体实现
- 支持 MaxIterations 配置
- 支持工具调用
- 流式输出支持
- **Agent as Tool**:支持将 Agent 封装为工具供其他 Agent 调用
- **预置多智能体模式**:
- **Supervisor**:监督者模式,由一个主 Agent 协调多个子 Agent
- **Sequential**:顺序执行模式,Agent 按序执行并继承上下文
- **Plan-Execute-Replan**:计划-执行-重规划模式
- **会话管理**:
- Session 事件存储与管理
- Session Values 支持
- History Rewriter 历史重写能力
- **中断与恢复**:
- 支持 Agent 执行中断
- 支持从检查点恢复执行
- Deterministic Transfer 中断恢复支持
- **Agent 运行选项**:
- `WithSessionValues` 支持传入会话级别变量
- Agent CallOption 扩展
---
## v0.5.1 - v0.5.15 主要更新
### 功能增强
- **DeepAgent 预置实现** (#540):支持深度 Agent 模式
- **Agent 中间件支持** (#533):允许通过中间件扩展 Agent 行为
- **全局回调支持** (#512):内置 Agent 支持全局 Callbacks
- **MessageRewriter 配置** (#496):React Agent 支持消息重写
- **BreakLoopAction 定义** (#492):支持循环 Agent 中断
- **取消中断支持** (#425):支持取消正在进行的中断操作
- **多模态支持**:
- Message 新增多模态输出内容 (#459)
- 默认提示模板支持多模态 (#470)
- Format 函数支持 UserInputMultiContent (#516)
### 问题修复
- 修复 ChatModelAgent 的 max step 计算 (#549)
- 修复 Session 仅存储有输出的事件 (#503)
- 修复 Sequential Agent 报错时退出问题 (#484)
- 修复 Workflow 仅在最后一个事件执行 action (#463)
- 修复 ChatModelAgent return directly tool panic (#464)
- 修复 Go 1.25 编译错误 (#457)
- 修复空 slice 和空字段序列化问题 (#473)
@@ -0,0 +1,41 @@
---
Description: ""
date: "2026-03-02"
lastmod: ""
tags: []
title: v0.6.*-jsonschema optimization
weight: 6
---
## 版本概述
v0.6.0 版本专注于依赖优化,移除了 kin-openapi 依赖和 OpenAPI3.0 相关定义,简化了 JSONSchema 模块的实现。
---
## v0.6.0
**发布日期**: 2025-11-14
### Breaking Changes
- **移除 kin-openapi 依赖** (#544):
- 删除了对 `kin-openapi` 库的依赖
- 移除了 OpenAPI 3.0 相关的类型定义
- 简化了 JSONSchema 模块的实现
### 迁移指南
如果你的代码中使用了 OpenAPI 3.0 相关的类型定义,需要:
1. 检查是否有直接使用 `kin-openapi` 相关类型的代码
2. 将 OpenAPI 3.0 类型替换为标准 JSONSchema 类型
3. 使用 `schema.ToJSONSchema()` 方法获取工具参数的 JSONSchema 定义
---
## v0.6.1 主要更新
### 问题修复
- 常规 bug 修复和稳定性改进
@@ -0,0 +1,139 @@
---
Description: ""
date: "2026-03-02"
lastmod: ""
tags: []
title: v0.7.*-interrupt resume refactor
weight: 7
---
## 版本概述
v0.7.0 是 Eino 框架的一个**重要里程碑版本**,核心亮点是对 **Human in the Loop (HITL) / Interrupt-Resume 能力进行了架构级重构**,提供了更强大、更灵活的中断恢复机制。同时引入了 Skill 中间件、ChatModel 重试机制、多模态工具支持等核心能力。
---
## v0.7.0
**发布日期**: 2025-11-20
### 🔥 核心变更:Interrupt-Resume 架构重构 (#563)
v0.7.0 对中断恢复机制进行了架构级重构,代码变更量巨大(+7527/-1692 行),涉及 28 个文件的重大改动。
#### 新增核心模块
- **compose/resume.go**:提供类型安全的恢复状态获取 API
- `GetInterruptState[T]`:获取上次中断的持久化状态
- `GetResumeContext`:检查当前组件是否为恢复目标
- **internal/core/interrupt.go**:中断信号核心定义
- `InterruptSignal`:支持嵌套的中断信号结构
- `InterruptState`:支持状态和层级特定负载
- `InterruptConfig`:中断配置参数
- **internal/core/address.go**:组件地址系统
- **internal/core/resume.go**:恢复逻辑核心实现
#### 重构的核心模块
- **adk/interrupt.go**:ADK 层中断处理重构 (+238 行)
- **compose/interrupt.go**:编排层中断处理重构 (+256 行)
- **adk/workflow.go**:工作流 Agent 支持中断恢复 (+510 行重构)
- **compose/graph_run.go**:Graph 执行时中断恢复支持
- **compose/tool_node.go**:工具节点中断支持
#### 新增恢复策略
支持两种恢复策略:
1. **隐式 "Resume All"**:单一"继续"按钮恢复所有中断点
2. **显式 "Targeted Resume"**:独立恢复特定中断点(推荐)
#### Agent Tool 中断改进
- 使用 `GetInterruptState` 替代手动状态管理
- 支持 `CompositeInterrupt` 组合中断
- Agent Tool 正确传递内部中断信号
### 其他改进
- **ADK 序列化增强** (#557):修复 checkpoint 中 gob 序列化缺失类型注册
- **DeepAgent 优化** (#558):无子 Agent 时自动移除 task tool
- **ChatModelAgent 改进** (#552):无工具配置时正确应用 compose option
- **Plan-Execute 增强** (#555):无工具调用时正确报错
- **MultiAgent 修复** (#548):修复默认 summary prompt 无法使用的问题
---
## v0.7.1 - v0.7.36 主要更新
### Interrupt-Resume 持续增强
基于 v0.7.0 的架构重构,后续版本持续完善中断恢复能力:
#### 工具中断 API (#691)
- **新增工具中断 API**:支持在工具执行时触发中断
- **扩展 isResumeTarget**:支持后代目标识别
#### 嵌套 Agent 中断恢复 (#647, #672)
- **嵌套预置/工作流 Agent**:支持任意层级的 Agent 包装器中断恢复
- **Wrapped FlowAgents**:正确处理 deterministic transfer 跳过
#### Checkpoint 增强
- **节点输入持久化** (#634):checkpoint 中持久化 rerun 节点输入
- **Graph 恢复改进** (#695):恢复时 OnStart 中正确启用 ProcessState
- **序列化修复** (#608, #606):修复数组/切片反序列化 panic
#### 工具错误处理 (#583)
- 工具错误处理器不再包装 interrupt error
### 重大新特性
#### Skill 中间件 (#661)
- 将可复用能力封装为 Skill
- 中间件方式扩展 Agent 能力
- 优化 Skill 提示词 (#724)
#### ChatModel 重试机制 (#635)
- ChatModelAgent 支持调用失败自动重试
- 可配置 ModelRetryConfig (#648)
- 新增 WillRetryError 支持错误链检查 (#707)
#### 多模态工具支持 (#760)
- compose 模块增强工具接口
- 支持多模态输入输出
#### 嵌套 Graph 状态访问 (#584)
- 嵌套 Graph 可访问父 Graph 状态
### 功能增强
- **Execute Backend & Tool** (#682)
- **OutputKey 配置** (#711):存储最终答案到 SessionValues
- **嵌套 Runner 共享会话** (#645)
- **Agent 事件发送** (#620, #791)
- **ToJSONSchema 确定性输出** (#630)
- **Token 用量详情** (#629)
### 问题修复
- AfterChatModel 返回修改后消息 (#717, #792)
- 循环 Agent BreakLoopAction 中断 (#814)
- 子 Agent 报错中止循环 Agent (#813)
- 流式执行命令无输出错误 (#790)
- DeepAgent 自动指令渲染 (#726)
- Graph 重复跳过上报 (#694)
- Graph unique successors (#693)
### 文档与工程
- 重写 README 聚焦 ADK (#748, #686, #719)
- 启用 golangci-lint (#602)
- 新增代码风格指南 (#673)
@@ -0,0 +1,308 @@
---
Description: ""
date: "2026-03-10"
lastmod: ""
tags: []
title: Eino v0.8 不兼容更新
weight: 1
---
## 1. API 不兼容变更
### 1.1 filesystem Shell 接口重命名
**位置**: `adk/filesystem/backend.go` **变更描述**: Shell 相关接口被重命名,且不再嵌入 `Backend` 接口。**Before (v0.7.x)**:
```go
type ShellBackend interface {
Backend
Execute(ctx context.Context, input *ExecuteRequest) (result *ExecuteResponse, err error)
}
type StreamingShellBackend interface {
Backend
ExecuteStreaming(ctx context.Context, input *ExecuteRequest) (result *schema.StreamReader[*ExecuteResponse], err error)
}
```
**After (v0.8.0)**:
```go
type Shell interface {
Execute(ctx context.Context, input *ExecuteRequest) (result *ExecuteResponse, err error)
}
type StreamingShell interface {
ExecuteStreaming(ctx context.Context, input *ExecuteRequest) (result *schema.StreamReader[*ExecuteResponse], err error)
}
```
**影响**:
- `ShellBackend` 重命名为 `Shell`
- `StreamingShellBackend` 重命名为 `StreamingShell`
- 接口不再嵌入 `Backend`,如果你的实现依赖组合接口,需要分别实现**迁移指南**:
```go
// Before
type MyBackend struct {}
func (b *MyBackend) Execute(...) {...}
// MyBackend 实现 ShellBackend 需要同时实现 Backend 的所有方法
// After
type MyShell struct {}
func (s *MyShell) Execute(...) {...}
// MyShell 只需要实现 Shell 接口的方法
// 如果同时需要 Backend 功能,需要分别实现两个接口
```
---
### 1.2 Filesystem Backend:Read 返回值不兼容变更
- **位置** : adk/filesystem/backend.go
- **变更说明** : Backend.Read 的返回值发生不兼容调整,由原先返回 string 修改为返回 *FileContent 结构体
**Before (v0.7.x)**:
```go
type Backend interface {
...
Read(ctx context.Context, req *ReadRequest) (string, error)
...
}
```
**After (v0.8.0)**:
```go
type Backend interface {
...
Read(ctx context.Context, req *ReadRequest) (*FileContent, error)
...
}
```
**影响:**
- v0.7.x 的 Read 接口返回 `string`。`v0.8.0` 的 Read 接口返回结构体 `FileContent`,属于不兼容变更。
- 对 Backend 实现方:需要替换 Read 方法实现,从返回 String 改为返回 *FileContent。
- 对 Backend 使用方:需要升级 Backend 实现为支持 v0.8 的版本。同时需要修改 Backend.Read 的调用,改为使用新返回的 *FileContent。
## 2. 行为不兼容变更
### 2.1 AgentEvent 发送机制变更
**位置**: `adk/chatmodel.go` **变更描述**: `ChatModelAgent` 的 `AgentEvent` 发送机制从 eino callback 机制改为 Middleware 机制。**Before (v0.7.x)**:
- `AgentEvent` 通过 eino 的 callback 机制发送
- 如果用户自定义了 ChatModel 或 Tool 的 Decorator/Wrapper,且原始 ChatModel/Tool 内部埋入了 Callback 点位,则 `AgentEvent` 会在 Decorator/Wrapper 的**内部**发送
- 这对 eino-ext 实现的所有 ChatModel 适用,但对大部分用户自行实现的 Tool 以及 eino 一方提供的 Tool 可能不适用 **After (v0.8.0)**:
- `AgentEvent` 通过 Middleware 机制发送
- `AgentEvent` 会在用户自定义的 Decorator/Wrapper 的**外部**发送**影响**:
- 正常情况下用户不感知此变更
- 如果用户之前自行实现了 ChatModel 或 Tool 的 Decorator/Wrapper,事件发送的相对位置会发生变化
- 位置变化可能导致 `AgentEvent` 的内容也发生变化:之前的事件不包含 Decorator/Wrapper 做出的变更,现在的事件会包含**变更原因**:
- 正常业务场景下,希望发出的事件包含 Decorator/Wrapper 做出的变更**迁移指南**:如果你之前通过 Decorator/Wrapper 包装了 ChatModel 或 Tool,需要改为实现 `ChatModelAgentMiddleware` 接口:
```go
// Before: 通过 Decorator/Wrapper 包装 ChatModel
type MyModelWrapper struct {
inner model.BaseChatModel
}
func (w *MyModelWrapper) Generate(ctx context.Context, input []*schema.Message, opts ...model.Option) (*schema.Message, error) {
// 自定义逻辑
return w.inner.Generate(ctx, input, opts...)
}
// After: 实现 ChatModelAgentMiddleware 的 WrapModel 方法
type MyMiddleware struct{}
func (m *MyMiddleware) WrapModel(ctx context.Context, chatModel model.BaseChatModel, mc *ModelContext) (model.BaseChatModel, error) {
return &myWrappedModel{inner: chatModel}, nil
}
// 对于 Tool 的 Wrapper,改为实现 WrapInvokableToolCall / WrapStreamableToolCall 等方法
```
### 2.2 filesystem.ReadRequest.Offset 语义变更
**位置**: `adk/filesystem/backend.go` **变更描述**: `Offset` 字段从 0-based 改为 1-based。**Before (v0.7.x)**:
```go
type ReadRequest struct {
FilePath string
// Offset is the 0-based line number to start reading from.
Offset int
Limit int
}
```
**After (v0.8.0)**:
```go
type ReadRequest struct {
FilePath string
// Offset specifies the starting line number (1-based) for reading.
// Line 1 is the first line of the file.
// Values < 1 will be treated as 1.
Offset int
Limit int
}
```
**迁移指南**:
```go
// Before: 读取从第 0 行开始(即第一行)
req := &ReadRequest{Offset: 0, Limit: 100}
// After: 读取从第 1 行开始(即第一行)
req := &ReadRequest{Offset: 1, Limit: 100}
// 如果原来使用 Offset: 10 表示从第 11 行开始
// 现在需要使用 Offset: 11
```
---
### 2.3 filesystem.FileInfo.Path 语义变更
**位置**: `adk/filesystem/backend.go` **变更描述**: `FileInfo.Path` 字段不再保证是绝对路径。**Before (v0.7.x)**:
```go
type FileInfo struct {
// Path is the absolute path of the file or directory.
Path string
}
```
**After (v0.8.0)**:
```go
type FileInfo struct {
// Path is the path of the file or directory, which can be a filename,
// relative path, or absolute path.
Path string
// ...
}
```
**影响**:
- 依赖 `Path` 为绝对路径的代码可能会出现问题
- 需要检查并处理相对路径的情况
---
### 2.4 filesystem.WriteRequest 行为变更
**位置**: `adk/filesystem/backend.go` **变更描述**: `WriteRequest` 的写入行为从"文件存在则报错"变更为"文件存在则覆盖"。**Before (v0.7.x)**:
```go
// WriteRequest 注释说明:
// The file will be created if it does not exist, or error if file exists.
type WriteRequest struct {
// FilePath is the absolute path of the file to write. Must start with '/'.
// The file will be created if it does not exist, or error if file exists.
FilePath string
...
}
```
**After (v0.8.0)**:
```go
// WriteRequest 注释说明:
// Creates the file if it does not exist, overwrites if it exists.
type WriteRequest struct {
// FilePath is the path of the file to write.
FilePath string
....
}
```
**影响**:
- 原来依赖"文件存在报错"行为的代码将不再报错,而是直接覆盖
- 可能导致意外的数据丢失**迁移指南**:
- 如果需要保留原有行为,在写入前先检查文件是否存在
- 原有 FilePath 代表 绝对路径,新版本未规定 FilePath 为绝对路径,原有依赖绝对路径的场景需要做对应 FilePath 的适配
---
### 2.5 GrepRequest.Pattern 语义变更
**位置**: `adk/filesystem/backend.go` **变更描述**: `GrepRequest.Pattern` 从字面量匹配变更为正则表达式匹配。**Before (v0.7.x)**:
```go
// Pattern is the literal string to search for. This is not a regular expression.
// The search performs an exact substring match within the file's content.
```
**After (v0.8.0)**:
```go
// Pattern is the search pattern, supports full regular expression syntax.
// Uses ripgrep syntax (not grep).
```
**影响**:
- 包含正则表达式特殊字符的搜索模式行为将发生变化
- 例如,搜索 `interface{}` 现在需要转义为 `interface\{\}` **迁移指南**:
```go
// Before: 字面量搜索
req := &GrepRequest{Pattern: "interface{}"}
// After: 正则表达式搜索,需要转义特殊字符
req := &GrepRequest{Pattern: "interface\\{\\}"}
// 或者如果要搜索包含 . * + ? 等的字面量,也需要转义
// Before
req := &GrepRequest{Pattern: "config.json"}
// After
req := &GrepRequest{Pattern: "config\\.json"}
```
---
### 2.6 EditRequest.FilePath 语义变更
**位置**: `adk/filesystem/backend.go` **变更描述**: EditRequest.FilePath 注释移除注释中的强制描述绝对路径。**Before (****v0.7.x****)**:
```go
type EditRequest struct {
// FilePath is the absolute path of the file to edit. Must start with '/'.
FilePath string
....
}
}
```
**After (v0.8.0)**:
```go
type EditRequest struct {
// FilePath is the path of the file to edit.
FilePath string
}
```
**影响**:
- 旧版本中 `FilePath` 默认表示绝对路径;新版本不再保证 `FilePath` 为绝对路径。 原先依赖 `FilePath` 为绝对路径的逻辑需要相应适配 。
## 迁移建议
1. **优先处理编译错误**: 类型变更(如 Shell 接口重命名)会导致编译失败,需要首先修复
2. **关注语义变更**: `ReadRequest.Offset` 从 0-based 改为 1-based,`Pattern` 从字面量改为正则表达式,这些不会导致编译错误但会改变运行时行为
3. **检查文件操作**: `WriteRequest` 的覆盖行为变更可能导致数据丢失,需要额外检查
4. **迁移 Decorator/Wrapper**: 如有自定义的 ChatModel/Tool Decorator/Wrapper,改为实现 `ChatModelAgentMiddleware`
5. **按需升级 backend 实现**:如果使用 eino-ext 提供的 local/ark agentkit backend,升级到对应的最新 版本:[adk/backend/local/v0.2.1](https://github.com/cloudwego/eino-ext/releases/tag/adk%2Fbackend%2Flocal%2Fv0.2.1) [adk/backend/agentkit/v0.2.1](https://github.com/cloudwego/eino-ext/releases/tag/adk%2Fbackend%2Fagentkit%2Fv0.2.1)
6. **测试验证**: 迁移后进行全面的测试,特别是涉及文件操作和搜索功能的代码
@@ -0,0 +1,276 @@
---
Description: ""
date: "2026-03-24"
lastmod: ""
tags: []
title: v0.8.*-adk middlewares
weight: 8
---
本文档介绍 Eino ADK v0.8.* 版本的主要新功能和改进。
## 版本亮点
v0.8 是一个重要的功能增强版本,引入了全新的中间件接口架构,新增多个实用中间件,并提供了增强的可观测性支持。
<table><tbody><tr>
<td>
<strong>🔧 灵活的中间件架构</strong>
全新 ChatModelAgentMiddleware 接口</td><td>
<strong>📊 增强的可观测性</strong>
Agent 级别 Callback 支持</td></tr></tbody></table>
---
## 1. ChatModelAgentMiddleware 接口
> 💡
> **核心更新**: 全新的中间件接口,提供更灵活的 Agent 扩展机制
`ChatModelAgentMiddleware` 是 v0.8 最重要的架构更新,为 `ChatModelAgent` 及基于它构建的 Agent(如 `DeepAgent`)提供统一的扩展点。
**相比 AgentMiddleware 的优势**:
<table>
<tr><td>特性</td><td>AgentMiddleware</td><td>ChatModelAgentMiddleware</td></tr>
<tr><td>扩展性</td><td>封闭</td><td>开放,可实现自定义 handler</td></tr>
<tr><td>Context 传播</td><td>回调只返回 error</td><td>所有方法返回 (ctx, ..., error)</td></tr>
<tr><td>配置管理</td><td>分散在闭包中</td><td>集中在结构体字段中</td></tr>
</table>
**接口方法**:
- `BeforeAgent` - Agent 运行前修改配置
- `BeforeModelRewriteState` - 模型调用前处理状态
- `AfterModelRewriteState` - 模型调用后处理状态
- `WrapInvokableToolCall` - 包装同步工具调用
- `WrapStreamableToolCall` - 包装流式工具调用
- `WrapModel` - 包装模型调用
**使用方式**:
```go
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: model,
Handlers: []adk.ChatModelAgentMiddleware{mw1, mw2, mw3},
})
```
详见 [Eino ADK: ChatModelAgentMiddleware](/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware)
---
### 1.1 Summarization 中间件
> 💡
> **功能**: 自动对话历史摘要,防止超出模型上下文窗口限制
📚 **详细文档**: [Middleware: FileSystem](/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware/middleware_filesystem)
当对话历史的 Token 数量超过阈值时,自动调用 LLM 生成摘要,压缩上下文。
**核心能力**:
- 可配置的触发条件(Token 阈值)
- 支持保留最近的用户消息
- 支持记录完整对话历史到文件
- 提供前后处理钩子
**快速开始**:
```go
mw, err := summarization.New(ctx, &summarization.Config{
Model: chatModel,
Trigger: &summarization.TriggerCondition{
ContextTokens: 100000,
},
})
```
### 1.2 ToolReduction 中间件
> 💡
> **功能**: 工具结果压缩,优化上下文使用效率
📚 **详细文档**: [Middleware: ToolReduction](/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware/middleware_toolreduction)
提供两阶段的工具输出管理:
<table>
<tr><td>阶段</td><td>触发时机</td><td>作用</td></tr>
<tr><td>截断 (Truncation)</td><td>工具返回后</td><td>截断超长输出,保存到文件</td></tr>
<tr><td>清理 (Clear)</td><td>模型调用前</td><td>清理历史工具结果,释放 Token</td></tr>
</table>
**快速开始**:
```go
mw, err := reduction.New(ctx, &reduction.Config{
Backend: fsBackend,
MaxLengthForTrunc: 30000,
MaxTokensForClear: 50000,
})
```
### 1.3 Filesystem 中间件
> 💡
> **功能**: 文件系统操作工具集
📚 **详细文档**: [Middleware: FileSystem](/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware/middleware_filesystem)
**新增能力**:
- **Grep 功能增强**: 支持完整正则表达式语法
- **新增选项**: `CaseInsensitive`、`EnableMultiline`、`FileType` 过滤
- **自定义工具名**: 所有 filesystem 工具支持自定义名称
### 1.4 Skill 中间件
> 💡
> **功能**: 动态加载和执行 Skill
📚 **详细文档**: [Middleware: Skill](/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware/middleware_skill)
**新增能力**:
- **Context 模式**: 支持 `fork` 和 `isolate` 两种上下文模式
- **自定义配置**: 支持自定义系统提示和工具描述
- **FrontMatter 扩展**: 支持通过 FrontMatter 指定 agent 和 model
### 1.5 PlanTask 中间件
> 💡
> **功能**: 任务规划和执行工具
📚 **详细文档**: [Middleware: PlanTask](/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware/middleware_plantask)
支持 Agent 创建和管理任务计划,适用于需要分步执行的复杂任务场景。
### 1.6 ToolSearch 中间件
> 💡
> **功能**: 工具搜索,支持从大量工具中动态检索
📚 **详细文档**: [Middleware: ToolSearch](/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware/middleware_toolsearch)
当工具数量较多时,通过语义搜索动态选择最相关的工具,避免上下文过载。
### 1.7 PatchToolCalls 中间件
> 💡
> **功能**: 修补悬空的工具调用,确保消息历史完整性
📚 **详细文档**: [Middleware: PatchToolCalls](/zh/docs/eino/core_modules/eino_adk/eino_adk_chatmodelagentmiddleware/middleware_patchtoolcalls)
扫描消息历史,为缺少响应的工具调用插入占位符消息。适用于工具调用被中断或取消的场景。
**快速开始**:
```go
mw, err := patchtoolcalls.New(ctx, nil)
```
## 2. Agent Callback 支持
> 💡
> **功能**: Agent 级别的回调机制,用于观测和追踪
支持在 Agent 执行的全生命周期中注册回调,实现日志记录、追踪、监控等功能。
**核心类型**:
- `AgentCallbackInput` - 回调输入,包含 Agent 输入或恢复信息
- `AgentCallbackOutput` - 回调输出,包含 Agent 事件流
**使用方式**:
```go
agent.Run(ctx, input, adk.WithCallbacks(
callbacks.NewHandler(
callbacks.WithOnStart(func(ctx context.Context, info *callbacks.RunInfo, input callbacks.CallbackInput) context.Context {
agentInput := adk.ConvAgentCallbackInput(input)
// 处理 Agent 启动事件
return ctx
}),
callbacks.WithOnEnd(func(ctx context.Context, info *callbacks.RunInfo, output callbacks.CallbackOutput) context.Context {
agentOutput := adk.ConvAgentCallbackOutput(output)
// 处理 Agent 完成事件
return ctx
}),
),
))
```
详见 [Eino ADK: Agent Callback](/zh/docs/eino/core_modules/eino_adk/adk_agent_callback)
---
## 3. Language Setting
> 💡
> **功能**: 全局语言设置
支持全局设置 ADK 的语言偏好,影响内置提示词和消息的语言。
**使用方式**:
```go
adk.SetLanguage(adk.LanguageChinese) // 设置为中文
adk.SetLanguage(adk.LanguageEnglish) // 设置为英文(默认)
```
---
## 中间件使用建议
> 💡
> **推荐组合**: 以下中间件可组合使用,覆盖大部分长对话场景
```go
handlers := []adk.ChatModelAgentMiddleware{
patchMW, // 1. 修补悬空工具调用
reductionMW, // 2. 压缩工具输出
summarizationMW, // 3. 摘要对话历史
}
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: model,
Handlers: handlers,
})
```
---
## Breaking Changes
> 💡
> 升级到 v0.8 前,请查阅 Breaking Changes 文档了解所有不兼容变更
📚 **完整文档**: [Eino v0.8 不兼容更新](/zh/docs/eino/release_notes_and_migration/eino_v0.8._-adk_middlewares/eino_v0.8_不兼容更新)
**变更概览**:
<table>
<tr><td>类型</td><td>变更项</td></tr>
<tr><td>API 变更</td><td><pre>ShellBackend</pre> → <pre>Shell</pre> 接口重命名</td></tr>
<tr><td>行为变更</td><td><pre>AgentEvent</pre> 发送机制改为 Middleware</td></tr>
<tr><td>行为变更</td><td><pre>ReadRequest.Offset</pre> 从 0-based 改为 1-based</td></tr>
<tr><td>行为变更</td><td><pre>FileInfo.Path</pre> 不再保证为绝对路径</td></tr>
<tr><td>行为变更</td><td><pre>WriteRequest</pre> 文件存在时从报错改为覆盖</td></tr>
<tr><td>行为变更</td><td><pre>GrepRequest.Pattern</pre> 从字面量改为正则表达式</td></tr>
</table>
## 升级指南
详细的迁移步骤和代码示例请参考:[Eino v0.8 不兼容更新](/zh/docs/eino/release_notes_and_migration/eino_v0.8._-adk_middlewares/eino_v0.8_不兼容更新)
**快速检查清单**:
1. 检查是否使用了 `ShellBackend` / `StreamingShellBackend` 接口(需重命名)
2. 检查 `ReadRequest.Offset` 使用(0-based → 1-based)
3. 检查 `GrepRequest.Pattern` 使用(字面量 → 正则表达式,特殊字符需转义)
4. 检查是否依赖 `WriteRequest` 的"文件存在报错"行为
5. 检查是否依赖 `FileInfo.Path` 为绝对路径
6. 如有自定义 ChatModel/Tool Decorator/Wrapper,考虑迁移到 `ChatModelAgentMiddleware`
7. 运行测试验证功能正常
@@ -0,0 +1,65 @@
---
Description: ""
date: "2026-03-02"
lastmod: ""
tags: []
title: 发布记录 & 迁移指引
weight: 8
---
# 版本管理规范
Go SDK 项目通常遵循 [语义化版本控制](https://semver.org/lang/zh-CN/)(Semver)的规范。Semver 的版本号由三部分组成,格式为:
> 💡
> v{MAJOR}.{MINOR}.{PATCH}
- **MAJOR**:主版本号,表示有重大更新或不兼容的 API 变更。
- **MINOR**:次版本号,表示新增功能,且与之前的版本保持向后兼容。
- **PATCH**:修订号,表示向后兼容的 bug 修复。
此外,语义化版本控制也支持预发布版本和元数据标签,用于标记**预发版**、**尝鲜版**等非正式版本。其格式为:
> 💡
> v{MAJOR}.{MINOR}.{PATCH}-{PRERELEASE}+{BUILD}
- **PRERELEASE**:预发布版本标识,例如 `alpha`、`beta`、`rc`(Release Candidate)。
- **BUILD**:构建元数据(可选),通常用于标识特定的构建,例如 CI 构建号等。
**Eino 遵循以上的语义化版本版本规范,会有如下几种版本类型:**
<table>
<tr><td><strong>版本类型</strong></td><td><strong>版本号格式</strong></td><td><strong>版本说明</strong></td><td><strong>备注</strong></td></tr>
<tr><td><strong>稳定版</strong><strong>(Stable Release)</strong></td><td>格式:<li>v{MAJOR}.{MINOR}.{PATCH}</li>示例:<li>v0.1.1</li><li>v1.2.3</li></td><td><li>发布稳定版本时,确保 API 的稳定性和向后兼容性。</li><li>严格遵守语义化版本控制:只有在引入<strong>重大不兼容变化</strong>时才提升主版本号(MAJOR),新增功能时提升次版本号(MINOR),只修复 bug 时提升修订号(PATCH)。</li><li>确保在发布前进行全面的单元测试、集成测试以及性能测试。</li><li>在发布时提供详细的发布说明(Release Notes),列出重要的变更、修复、特性以及迁移指南(如有)。</li></td><td></td></tr>
<tr><td><strong>预发版</strong><strong>(Pre-release)</strong><li>Alpha</li><li>Beta</li><li>RC (Release Candidate)</li></td><td>格式:<li>v{MAJOR}.{MINOR}.{PATCH}-{alpha/beta/rc}.{num}</li>示例:<li>v0.1.1-beta.1</li><li>v1.2.3-rc.1</li><li>v1.2.3-rc.2</li></td><td><li><strong>Alpha</strong>:内部测试版,功能不一定完备,可能会有较多的 bug,不建议用于生产环境。</li><li><strong>Beta</strong>:功能基本完备,但仍可能存在 bug,适合公开测试,不建议用于生产环境。</li><li><strong>RC(Release Candidate)</strong>:候选发布版,功能完成且基本稳定,建议进行最后的全面测试。在没有严重 bug 的情况下,RC 版本会转化为稳定版。一般来说,RC 版本的最后一个版本会转换成稳定版本</li></td><td></td></tr>
<tr><td><strong>尝鲜版</strong><strong>(Canary/Experimental/Dev)</strong></td><td>格式:<li>v{MAJOR}.{MINOR}.{PATCH}-{dev}.{num}</li>示例:<li>v0.1.1-dev.1</li><li>v1.2.3-dev.2</li></td><td><li>尝鲜版是非常不稳定的版本,通常用于测试新功能或架构的早期实现。这些版本可能会包含实验性功能,甚至会在未来被移除或大幅修改。</li><li>尝鲜版一般是在仓库的实验性分支上进行</li></td><td>一般来说,在字节内部用不到此种版本类型,可能在开源社区中使用</td></tr>
</table>
# 关于 V0、V1、Vn(n>1)的一些潜在共识
<table>
<tr><td>标题</td><td>说明</td><td>备注</td></tr>
<tr><td>V0大版本内部的不稳定性</td><td><li><strong>v0.x.x</strong> 表示该库仍处于<strong>不稳定状态</strong>,可能在 MINOR 版本的迭代中,引入<strong>不兼容更改</strong>,API 发生变化,不承诺向后兼容性。</li><li>用户在使用这些版本时应该预期到 API 可能会发生变化</li><li>版本号的提升不会严格遵守语义化版本控制的规则</li><li><strong>v0.x.x</strong> 的设计目标是<strong>快速迭代</strong>,允许开发者在 API 不稳定的情况下发布库版本,并收集用户反馈。</li></td><td></td></tr>
<tr><td>V1、Vn(n>1)大版本内部的稳定性</td><td><li><strong>v1.0.0</strong> 表示该库达到了<strong>稳定状态</strong>,API 设计已经成熟,<strong>承诺向后兼容性</strong>,即未来的 <pre>v1.x.x</pre> 版本会保证不引入不兼容的更改。</li><li>严格遵循语义化版本控制</li><li><strong>不兼容的 API 变更</strong> 将需要通过<strong>主版本号</strong>(MAJOR)的提升才能发布。例如,需要将版本号提升到 <pre>v2.0.0</pre>。</li><li><strong>向后兼容的功能更新</strong> 将通过<strong>次版本号</strong>(MINOR)的提升来发布,例如 <pre>v1.1.0</pre>。</li><li><strong>向后兼容的 bug 修复</strong> 将通过<strong>修订号</strong>(PATCH)的提升来发布,例如 <pre>v1.0.1</pre>。</li></td><td></td></tr>
</table>
> 💡
> 当前因 Eino 初次发布,虽然 Eino 的 API 已初具稳态,但未经过大规模业务验证,MAJOR 版本暂时定为 V0,经过至少 50+ 业务线验证后,会提升版本至 V1
# Release Notes 文档结构
- 一个 {MAJOR}.{MINOR} 次版本单独一篇文档
- 命名格式:“Eino: v1.2.* {标题描述}”
- {MAJOR}.{MINOR} 次版本中记录这个版本下的所有 ChangeLog
- 次版本的子目录中,可选放置每个 PATCH 的详细介绍
```
.
├── v1.0.*
│   └── bug_fix_1_x.txt
├── v0.2.*
├── v0.1.*
   ├── bug_fix_1_xxx.txt
   ├── bug_fix_2_xxxxx.txt
   └── bug_fix_3_xxxxxxx.txt
```
@@ -0,0 +1,96 @@
---
Description: ""
date: "2025-01-06"
lastmod: ""
tags: []
title: v0.1.*-first release
weight: 1
---
## v0.1.6
> 发版时间:2024-11-04
### Features
- NewTool、InferTool 的泛型形参支持 struct
- 废弃 WithGraphRunOption(),新增 WithRuntimeMaxSteps 方法
- 调整 ToolsNode 的 NodeName,新增 TooCallbackInput/Output 结构体
- Flow 中新增 MultiQuery、Router 两种 Retriever
- 新增 document.Loader、document.Transformer 两种组件抽象
- Message MultiPart 中新增 file_url, audio_url, video_url 三种类型
### BugFix
- 存在 InputKey 的节点中,如果输入的 map 中,不存在 InputKey 时,报错处理
- Message Stream 合并时(ConcatMessage),调整 Name、Type、ID 的组合方式
## v0.1.5
> 发版时间:2024-10-25
### Features
- ConcatMessages 时,校验 Message 流中,是否存在 nil chunk,如果存在则报错,从而让流的生产方,不能塞入 nil message
- Message.ToolCall 中增加 Type 字段,表达 ToolType,并在 ConcatMessages 增加 ToolType 的增量合并
## v0.1.4
> 发版时间:2024-10-23
### Features
- 调整 Chain 的实现,基于 Graph[I, O] 封装 Chain
- 当上游输出节点是接口,且下游输入节点是这个接口的实现时,支持尝试把 上游输出接口断言成下游输入的实例。
- 例如新增支持如下场景: Node1[string, any] -> Node2[string, int], 这种场景下,之前直接在 Compile 时报错,当前会尝试把 any 断言成 string,如果可断言成功,则继续执行。
- schema.Message 增加 Type 字段
### BugFix
- 修正 Tool 工具执行时的 Eino Callback 的 RunInfo 信息
- 修正 RunInfo 的 Component 和 Type 字段
- ToolName 作为 RunInfo.Name
- Passthrough 节点允许设置 OutputKey
## v0.1.3
> 发版时间:2024-10-17
### BugFix
- 修复 ToolsNode 返回 Message 时额外塞入了 ToolCalls 导致模型报错
- 引入此问题是 v0.1.1 的 react agent 支持 tool return directly 时,扩展了 ToolsNode 返回的信息。本次更换了另一种方式实现 tool return directly,不会再导致此问题。
## v0.1.2
> 发版时间:2024-10-14
### Features
- StreamReader.Copy() 方法重新调整优化成 Goroutine Free 的 Copy 方式。避免业务忘记 StreamReader.Close() 导致的 Goroutine 泄漏的问题
- 校验检查:Passthrough 节点,不允许添加 InputKey/OutputKey
- Compile Callback Option 中,支持 InputKey、OutputKey 的回传
## v0.1.1
> 发版时间:2024-10-14
### Features
- React Agent 支持 Tool ReturnDirectly 的静态配置
### BugFix
- Revert Stream Copy 的新逻辑。
- 因实现 Goroutine Free 的 Stream Copy,引入了 Recv 可能出现夯死的情况。预计下个 Patch 修复此问题
## v0.1.0
> 发版时间:2024-10-12
### Features
- 支持 ChatTemplate/ChatModel/Tool/LoaderAndSplitter/Indexer/Retriever/Embedding 多种组件的抽象和实现
- 支持 Graph/Chain/StateGraph 等多种编排工具
- 根据输入、输出是否为流式,支持 4 种交互模式,并内置了 Stream 工具
- 灵活易扩展的切面设计
@@ -0,0 +1,124 @@
---
Description: ""
date: "2026-03-02"
lastmod: ""
tags: []
title: v0.2.*-second release
weight: 2
---
## v0.2.6
> 发版时间:2024-11-27
### Features
- 增加流式的 Pre、Post StateHandler
- 支持 StateChain
- 新增 MessageParser 节点,将 ChatModel 输出的 Message 转换成业务定制结构体
- Parse(ctx context.Context, m *Message) (T, error)
- 针对 Chain AppendNode 时,支持 WithNodeKey()
### BugFix
- 修复 ConcatMessage 时,由于没有深 Copy 导致的首个 Chunk 被修改的问题。
- ConcatMessage 时,FinishReason 只保留最后一个 Chunk 的有效值
## v0.2.5
> 发版时间:2024-11-21
### BugFix
- 修复 Gonja 禁用 include 等关键字导致的 panic 问题
## v0.2.4
> 发版时间:2024-11-20
### Features
- Eino Message ResponseMeta 中增加 TokenUsage 字段
- Eino Message ToolsCall 按照 index 进行排序
### BugFix
## v0.2.3
> 发版时间:2024-11-12
### Features
- Graph 调用时,支持 context 的 Timeout 和 Cancel
### BugFix
- FinishReason 可能在任意一个包中返回,不建设一定再最后一个包返回
- callbacks.HandlerBuilder 不再提供默认的 Needed() 方法, 此方法默认返回 false,在内嵌 callbacks.HandlerBuilder 场景,会导致所有的切面函数失效
## v0.2.2
> 发版时间:2024-11-12
### Features
- Message 中增加 FinishReason 字段
- 增加 GetState[T]() 方法,可在节点中获取 State 结构体
- Lazy Init Gonjia SDK
### BugFix
## v0.2.1
> 发版时间:2024-11-07
### BugFix
- Fixed the SSTI vulnerability in the Jinja chat template(langchaingo 存在 gonja 模板注入)
## v0.2.0
> 发版时间:2024-11-07
### Features
- Callback API 重构(兼容更新)
- 面向组件实现者:隐藏并废弃 callbacks.Manager,提供更简单的注入 callback 切面的工具函数。
- 面向 Handler 实现者:提供 callbacks.Handler 快速实现的模版方法,封装了组件类型判断、input/output 类型断言和转换等细节,用户只需要提供特定组件的特定 callback 方法的具体实现。
- 运行机制:针对一次运行的某个具体的 callback 切面时机,根据组件类型和 Handler 具体实现的方法,额外筛选出需要执行的具体的 handler。
- 新增 Host Multi-Agent:实现 Host 模式的 Multi-Agent,即 Host 做意图识别后跳转到各个 Specialist Agent 做具体的生成。
- React Agent API 变更(不兼容)
- 去掉 AgentCallback 定义,改为通过 BuildAgentCallback 工具函数,快速注入 ChatModel 和 Tool 的 CallbackHandlers。使用姿势:
```go
func BuildAgentCallback(modelHandler *model.CallbackHandler, toolHandler *tool.CallbackHandler) callbacks.Handler {
return template.NewHandlerHelper().ChatModel(modelHandler).Tool(toolHandler).Handler()
}
```
- 从而做到 AgentCallback 与组件的语义对齐,可以返回 ctx,可以使用扩展后的 tool.CallbackInput, tool.CallbackOutput。
- 去掉 react.Option 定义。React Agent 改为使用 Agent 通用的 agent.Option 定义,方便在 multi-agent 层面组合编排。
- 不再需要 WithAgentCallback 来注入特殊的 AgentCallback,新的使用姿势:
```
agent.WithComposeOptions(compose.WithCallbacks(xxxCallbackHandler))
```
- 新增 Document Parser 接口定义:作为 Loader 组件的依赖,负责将 io.Reader 解析为 Document,并提供了根据文件扩展名进行解析的 ExtParser 实现。
### BugFix
- 修复 embedding.GetCommonOptions 和 indexer.GetCommonOptions 未对 apply 做判空可能导致的空指针异常。
- Graph 运行时,preProcessor 和 postProcessor 使用当前 ctx。
## v0.2.0-dev.1
> 发版时间:2024-11-05
### Features
- 初步设计并支持 Checkpoint 机制,尝鲜试用
### BugFix
@@ -0,0 +1,39 @@
---
Description: ""
date: "2025-01-06"
lastmod: ""
tags: []
title: v0.3.*-tiny break change
weight: 3
---
## v0.3.1-内场封板
> 发版时间:2024-12-17
>
> 后续将只维护开源版,会提供便捷迁移脚本,帮助大家从内场版本迁移至开源版本
### Features
- 精简 Eino 对外暴露的概念
- Graph、Chain 支持 State,去除 StateGraph、StateChain
- 去除 GraphKey 的概念
- 优化流合并时的,MultiReader 的读取性能
### BugFix
- 修复 Chain 中 AddNode 时,遗漏的 Error 检查
## v0.3.0
> 发版时间:2024-12-09
### Features
- schema.ToolInfo.ParamsOneOf 修改成指针。 支持 ParamsOneOf 为 nil 的场景
- Compile Callback 中支持返回 GenStateFn
- 支持全局的 Compile Callback
### BugFix
- CallOption DesignateNode 时,不应该执行 Graph 切面,只执行指定节点的切面