Agent 抽象

Agent 接口

ADK 的所有功能围绕 Agent 接口展开:

// github.com/cloudwego/eino/adk

type TypedAgent[M MessageType] interface {
    Name(ctx context.Context) string
    Description(ctx context.Context) string
    Run(ctx context.Context, input *TypedAgentInput[M], options ...AgentRunOption) *AsyncIterator[*TypedAgentEvent[M]]
}

// 默认类型别名(使用 *schema.Message)
type Agent = TypedAgent[*schema.Message]
方法说明
Name
Agent 名称标识
Description
职能描述,供其他 Agent 或框架了解能力
Run
核心执行方法,异步返回事件流(Future 模式)

MessageType 约束

type MessageType interface {
    *schema.Message | *schema.AgenticMessage
}

所有 ADK 泛型类型使用 [M MessageType] 参数化。*schema.Message 支持完整 ADK 特性;*schema.AgenticMessage 用于 v0.9 新增的结构化内容块模式。

类型别名速查

泛型类型默认别名
TypedAgent[*schema.Message]
Agent
TypedAgentInput[*schema.Message]
AgentInput
TypedAgentEvent[*schema.Message]
AgentEvent
TypedAgentOutput[*schema.Message]
AgentOutput
TypedMessageVariant[*schema.Message]
MessageVariant

AgentInput

type TypedAgentInput[M MessageType] struct {
    Messages       []M
    EnableStreaming bool
}
  • Messages:用户指令、对话历史、背景知识等,与 ChatModel 输入格式一致
  • EnableStreaming:建议 Agent 使用流式输出。支持流式的组件(如 ChatModel)会逐步返回;不支持的组件不受影响

AgentEvent

Agent 运行过程中产出的事件:

type TypedAgentEvent[M MessageType] struct {
    AgentName string
    RunPath   []RunStep
    Output    *TypedAgentOutput[M]
    Action    *AgentAction
    Err       error
}

AgentOutput

type TypedAgentOutput[M MessageType] struct {
    MessageOutput    *TypedMessageVariant[M]
    CustomizedOutput any
}

MessageVariant 统一处理流式与非流式消息:

type TypedMessageVariant[M MessageType] struct {
    IsStreaming   bool
    Message       M
    MessageStream *schema.StreamReader[M]
    Role          schema.RoleType       // *schema.Message 路径
    AgenticRole   schema.AgenticRoleType // *schema.AgenticMessage 路径
    ToolName      string
}
  • IsStreaming=true → 从 MessageStream 逐帧读取
  • IsStreaming=false → 从 Message 一次性获取
  • Role/ToolName:仅 *schema.Message 路径有效(Assistant 或 Tool)
  • AgenticRole:仅 *schema.AgenticMessage 路径有效

AgentAction

控制多 Agent 协作的行为信号:

type AgentAction struct {
    Exit            bool
    Interrupted     *InterruptInfo
    TransferToAgent *TransferToAgentAction  // NOT RECOMMENDED
    BreakLoop       *BreakLoopAction
    CustomizedAction any
}
  • Interrupted:中断 Runner 运行,携带自定义数据,支持后续 Resume
  • BreakLoop:中止 LoopAgent 的循环
  • Exit:立即退出多 Agent 系统
  • TransferToAgent:(不推荐)任务转让,建议使用 AgentAsTool 替代

AgentRunOption

请求维度的 Agent 配置。ADK 内置:

  • WithSessionValues(map[string]any):注入跨 Agent 共享的 KV 数据
  • WithCallbacks(...callbacks.Handler):添加回调处理器
  • WithCancel():启用 Agent Cancel 能力(详见 Cancel 与 TurnLoop

自定义 Option:

type myOptions struct {
    modelName string
}

func WithModelName(name string) adk.AgentRunOption {
    return adk.WrapImplSpecificOptFn(func(t *myOptions) {
        t.modelName = name
    })
}

// 在 Run 中读取
func (m *MyAgent) Run(ctx context.Context, input *adk.AgentInput, opts ...adk.AgentRunOption) *adk.AsyncIterator[*adk.AgentEvent] {
    o := adk.GetImplSpecificOptions(&myOptions{}, opts...)
    // 使用 o.modelName ...
}

DesignateAgent 可将 Option 限定到指定 Agent:

opt := adk.WithSessionValues(map[string]any{"key": "val"}).DesignateAgent("agent_1")

AsyncIterator

Run 返回的异步事件迭代器:

iter := agent.Run(ctx, input)
for {
    event, ok := iter.Next()
    if !ok {
        break
    }
    // 处理 event
}

Next() 阻塞直到有新事件或迭代结束。Agent 实现通常在 goroutine 中写入 Generator,立即返回 Iterator:

func (m *MyAgent) Run(ctx context.Context, input *adk.AgentInput, opts ...adk.AgentRunOption) *adk.AsyncIterator[*adk.AgentEvent] {
    iter, gen := adk.NewAsyncIteratorPair[*adk.AgentEvent]()
    go func() {
        defer gen.Close()
        // 执行逻辑,通过 gen.Send(event) 产出事件
    }()
    return iter
}

语言设置

adk.SetLanguage(adk.LanguageChinese) // 或 adk.LanguageEnglish(默认)

影响 ADK 内置提示词(FileSystem、Reduction、Skill、ChatModelAgent 等组件)。建议在程序初始化时设置。

💡 语言设置仅影响 ADK 内置提示词。自定义 Instruction 需自行处理国际化。