Skip to content

Eino ADK: Workflow Agents #1520

@ProgressMakerX

Description

@ProgressMakerX

以下是原示例代码,其中,ExitController 是基于 ChatModelAgent 创建的,没有配置 ExitTool,ChatModelAgent 默认只能输出消息,无法生成程序化的动作,这导致最后的event.Action.Exit的检测无效,不能提前停止循环。
package main
import (
"context"
"fmt"
"log"
"os"

"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/components/model"
"github.com/cloudwego/eino/schema"

)

// 创建 ChatModel 实例
func newChatModel() model.ToolCallingChatModel {
cm, err := openai.NewChatModel(context.Background(), &openai.ChatModelConfig{
APIKey: os.Getenv("OPENAI_API_KEY"),
Model: os.Getenv("OPENAI_MODEL"),
})
if err != nil {
log.Fatal(err)
}
return cm
}

// 文档分析 Agent
func NewDocumentAnalyzerAgent() adk.Agent {
a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
Name: "DocumentAnalyzer",
Description: "分析文档内容并提取关键信息",
Instruction: "你是一个文档分析专家。请仔细分析用户提供的文档内容,提取其中的关键信息、主要观点和重要数据。",
Model: newChatModel(),
})
if err != nil {
log.Fatal(err)
}
return a
}

// 内容总结 Agent
func NewContentSummarizerAgent() adk.Agent {
a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
Name: "ContentSummarizer",
Description: "对分析结果进行总结",
Instruction: "基于前面的文档分析结果,生成一个简洁明了的总结,突出最重要的发现和结论。",
Model: newChatModel(),
})
if err != nil {
log.Fatal(err)
}
return a
}

// 报告生成 Agent
func NewReportGeneratorAgent() adk.Agent {
a, err := adk.NewChatModelAgent(context.Background(), &adk.ChatModelAgentConfig{
Name: "ReportGenerator",
Description: "生成最终的分析报告",
Instruction: "基于前面的分析和总结,生成一份结构化的分析报告,包含执行摘要、详细分析和建议。",
Model: newChatModel(),
})
if err != nil {
log.Fatal(err)
}
return a
}

func main() {
ctx := context.Background()

// 创建三个处理步骤的 Agent
analyzer := NewDocumentAnalyzerAgent()
summarizer := NewContentSummarizerAgent()
generator := NewReportGeneratorAgent()

// 创建 SequentialAgent
sequentialAgent, err := adk.NewSequentialAgent(ctx, &adk.SequentialAgentConfig{
    Name:        "DocumentProcessingPipeline",
    Description: "文档处理流水线:分析 → 总结 → 报告生成",
    SubAgents:   []adk.Agent{analyzer, summarizer, generator},
})
if err != nil {
    log.Fatal(err)
}

// 创建 Runner
runner := adk.NewRunner(ctx, adk.RunnerConfig{
    Agent: sequentialAgent,
})

// 执行文档处理流程
input := "请分析以下市场报告:2024年第三季度,公司营收增长15%,主要得益于新产品线的成功推出。但运营成本也上升了8%,需要优化效率。"

fmt.Println("开始执行文档处理流水线...")
iter := runner.Query(ctx, input)

stepCount := 1
for {
    event, ok := iter.Next()
    if !ok {
        break
    }
    
    if event.Err != nil {
        log.Fatal(event.Err)
    }
    
    if event.Output != nil && event.Output.MessageOutput != nil {
        fmt.Printf("\n=== 步骤 %d: %s ===\n", stepCount, event.AgentName)
        fmt.Printf("%s\n", event.Output.MessageOutput.Message.Content)
        stepCount++
    }
}

fmt.Println("\n文档处理流水线执行完成!")

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions