Eino 框架开发指南
Eino 是字节跳动开源的 Golang LLM/AI 应用开发框架,专注于 Agent 开发、工作流编排、工具调用。
环境要求
- Go 版本: 1.18+
- 代码规范: golangci-lint
快速开始
安装
go get github.com/cloudwego/eino
go get github.com/cloudwego/eino-ext
项目初始化
# 创建项目
mkdir my-eino-app && cd my-eino-app
go mod init my-eino-app
# 安装依赖
go get github.com/cloudwego/eino
go get github.com/cloudwego/eino-ext/components/model/openai
核心示例
1. ChatModelAgent(基础 Agent)
最简单的对话 Agent:
package main
import (
"context"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
)
func main() {
ctx := context.Background()
// 配置 ChatModel
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: "gpt-4o",
APIKey: os.Getenv("OPENAI_API_KEY"),
})
if err != nil {
panic(err)
}
// 创建 Agent
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: chatModel,
})
if err != nil {
panic(err)
}
// 运行 Agent
runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: agent})
iter := runner.Query(ctx, "Hello, who are you?")
for {
event, ok := iter.Next()
if !ok {
break
}
fmt.Println(event.Message.Content)
}
}
2. 带工具的 Agent
添加工具调用能力:
package main
import (
"context"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/compose"
"github.com/cloudwego/eino/components/tool"
)
// 定义天气工具
type WeatherTool struct{}
func (w *WeatherTool) Info(ctx context.Context) (*tool.Info, error) {
return &tool.Info{
Name: "get_weather",
Desc: "Get current weather for a location",
ParamsOneOf: tool.NewParamsOneOfByParams(
map[string]*tool.ParameterInfo{
"location": {
Type: "string",
Desc: "City name",
Required: true,
},
},
),
}, nil
}
func (w *WeatherTool) InvokableRun(ctx context.Context, argumentsInJSON string) (string, error) {
// 实际应该调用天气 API
return fmt.Sprintf("Weather in %s: Sunny, 25°C", argumentsInJSON), nil
}
func main() {
ctx := context.Background()
chatModel, _ := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: "gpt-4o",
APIKey: os.Getenv("OPENAI_API_KEY"),
})
// 创建工具
weatherTool := &WeatherTool{}
// 创建带工具的 Agent
agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: chatModel,
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []tool.BaseTool{weatherTool},
},
},
})
runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: agent})
iter := runner.Query(ctx, "What's the weather in Beijing?")
for {
event, ok := iter.Next()
if !ok {
break
}
fmt.Println(event.Message.Content)
}
}
3. DeepAgent(复杂任务)
处理复杂多步骤任务:
package main
import (
"context"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/adk/deep"
"github.com/cloudwego/eino/compose"
"github.com/cloudwego/eino/components/tool"
)
func main() {
ctx := context.Background()
chatModel, _ := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: "gpt-4o",
APIKey: os.Getenv("OPENAI_API_KEY"),
})
// 创建子 Agent
researchAgent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: chatModel,
})
codeAgent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: chatModel,
})
// 创建 DeepAgent
deepAgent, _ := deep.New(ctx, &deep.Config{
ChatModel: chatModel,
SubAgents: []adk.Agent{researchAgent, codeAgent},
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []tool.BaseTool{
// shellTool, pythonTool, webSearchTool
},
},
},
})
runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: deepAgent})
iter := runner.Query(ctx, "Analyze the sales data and generate a report")
for {
event, ok := iter.Next()
if !ok {
break
}
// 处理事件
}
}
4. Graph 编排
精确控制执行流程:
package main
import (
"context"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/compose"
)
type Input struct {
Text string
}
type Output struct {
Result string
}
func main() {
ctx := context.Background()
chatModel, _ := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: "gpt-4o",
APIKey: os.Getenv("OPENAI_API_KEY"),
})
// 创建 Graph
graph := compose.NewGraph[*Input, *Output]()
// 添加节点
graph.AddLambdaNode("validate", func(ctx context.Context, input *Input) (*Input, error) {
// 验证逻辑
return input, nil
})
graph.AddChatModelNode("generate", chatModel)
graph.AddLambdaNode("format", func(ctx context.Context, input *Input) (*Output, error) {
// 格式化逻辑
return &Output{Result: input.Text}, nil
})
// 添加边
graph.AddEdge(compose.START, "validate")
graph.AddEdge("validate", "generate")
graph.AddEdge("generate", "format")
graph.AddEdge("format", compose.END)
// 编译并运行
runnable, _ := graph.Compile(ctx)
result, _ := runnable.Invoke(ctx, &Input{Text: "Hello"})
println(result.Result)
}
5. Graph 转工具
将工作流暴露为 Agent 工具:
package main
import (
"context"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/compose"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/components/tool/graphtool"
)
func main() {
ctx := context.Background()
chatModel, _ := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: "gpt-4o",
APIKey: os.Getenv("OPENAI_API_KEY"),
})
// 创建 Graph
graph := compose.NewGraph[*Input, *Output]()
// ... 添加节点和边
// 将 Graph 转换为工具
graphTool, _ := graphtool.NewInvokableGraphTool(
graph,
"data_pipeline",
"Process and validate data",
)
// Agent 使用该工具
agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: chatModel,
ToolsConfig: adk.ToolsConfig{
ToolsNodeConfig: compose.ToolsNodeConfig{
Tools: []tool.BaseTool{graphTool},
},
},
})
runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: agent})
iter := runner.Query(ctx, "Process the data using the pipeline")
for {
event, ok := iter.Next()
if !ok {
break
}
// 处理事件
}
}
6. 流式处理
处理流式输出:
package main
import (
"context"
"fmt"
"os"
"github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino/adk"
)
func main() {
ctx := context.Background()
chatModel, _ := openai.NewChatModel(ctx, &openai.ChatModelConfig{
Model: "gpt-4o",
APIKey: os.Getenv("OPENAI_API_KEY"),
})
agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Model: chatModel,
})
runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: agent})
// 流式查询
iter := runner.Query(ctx, "Write a long story")
for {
event, ok := iter.Next()
if !ok {
break
}
// 实时输出流式内容
if event.Message != nil && event.Message.Content != "" {
fmt.Print(event.Message.Content)
}
}
}
7. 回调处理
添加日志、追踪、指标:
packag