-
Notifications
You must be signed in to change notification settings - Fork 305
Description
以下是原示例代码,其中,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文档处理流水线执行完成!")
}