Skillquality 0.46

eino

Eino LLM/AI application development framework assistant (Golang). Use when the user needs to: (1) Build AI agents, (2) Create LLM applications, (3) Implement tool calling, (4) Build multi-agent systems, (5) Create workflows with Graph/Compose, (6) Implement streaming, (7) Human-i

Price
free
Protocol
skill
Verified
no

What it does

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. 回调处理

添加日志、追踪、指标:

package main

import (
    "context"
    "fmt"
    "os"

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

// 自定义回调处理器
type LoggingHandler struct {
    callbacks.Handler
}

func (h *LoggingHandler) OnStart(ctx context.Context, info *callbacks.RunInfo, input callbacks.CallbackInput) context.Context {
    fmt.Printf("Start: %s\n", info.Name)
    return ctx
}

func (h *LoggingHandler) OnEnd(ctx context.Context, info *callbacks.RunInfo, output callbacks.CallbackOutput) context.Context {
    fmt.Printf("End: %s\n", info.Name)
    return ctx
}

func (h *LoggingHandler) OnError(ctx context.Context, info *callbacks.RunInfo, err error) context.Context {
    fmt.Printf("Error: %s - %v\n", info.Name, err)
    return ctx
}

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

    chatModel, _ := openai.NewChatModel(ctx, &openai.ChatModelConfig{
        Model:  "gpt-4o",
        APIKey: os.Getenv("OPENAI_API_KEY"),
    })

    // 添加回调处理器
    handler := &LoggingHandler{}
    ctx = callbacks.CtxWithHandlers(ctx, handler)

    agent, _ := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
        Model: chatModel,
    })

    runner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: agent})
    iter := runner.Query(ctx, "Hello")

    for {
        event, ok := iter.Next()
        if !ok {
            break
        }
        fmt.Println(event.Message.Content)
    }
}

8. 人机协作(Interrupt/Resume)

实现人工审批流程:

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, "Create a report")

    var checkpointID string
    for {
        event, ok := iter.Next()
        if !ok {
            break
        }

        // 检测到需要人工确认
        if event.NeedHumanInput {
            checkpointID = event.CheckpointID
            fmt.Println("Waiting for human approval...")
            break
        }
    }

    // 人工确认后恢复
    if checkpointID != "" {
        // 获取人工输入
        humanInput := "Approved"

        // 从检查点恢复
        iter = runner.Resume(ctx, checkpointID, humanInput)

        for {
            event, ok := iter.Next()
            if !ok {
                break
            }
            fmt.Println(event.Message.Content)
        }
    }
}

核心概念

1. Component(组件)

可复用的构建块:

  • ChatModel: 大语言模型接口
  • Tool: 工具/函数调用
  • Retriever: 检索器
  • Embedding: 向量嵌入
  • ChatTemplate: 提示词模板

2. Agent(智能体)

具有自主决策能力的实体:

  • ChatModelAgent: 基础 Agent,处理简单对话和工具调用
  • DeepAgent: 复杂任务 Agent,支持任务分解和多 Agent 协作
  • 自定义 Agent: 实现 adk.Agent 接口

3. Graph(图)

节点和边组成的执行流程:

graph := compose.NewGraph[InputType, OutputType]()
graph.AddLambdaNode("node1", func1)
graph.AddChatModelNode("node2", chatModel)
graph.AddEdge("node1", "node2")

4. Tool(工具)

Agent 可以调用的功能:

type MyTool struct{}

func (t *MyTool) Info(ctx context.Context) (*tool.Info, error) {
    return &tool.Info{
        Name: "my_tool",
        Desc: "Tool description",
        ParamsOneOf: tool.NewParamsOneOfByParams(params),
    }, nil
}

func (t *MyTool) InvokableRun(ctx context.Context, args string) (string, error) {
    // 工具逻辑
    return result, nil
}

5. Stream(流)

流式数据处理:

  • 自动处理流式传输
  • 连接、装箱、合并、复制流
  • 组件只需实现适合的流式范式

6. Callback(回调)

切面编程机制:

type MyHandler struct {
    callbacks.Handler
}

func (h *MyHandler) OnStart(ctx context.Context, info *callbacks.RunInfo, input callbacks.CallbackInput) context.Context {
    // 开始时的逻辑
    return ctx
}

7. Checkpoint(检查点)

状态持久化:

  • 保存执行状态
  • 支持中断恢复
  • 人机协作

支持的模型

ChatModel 实现

  • OpenAI: GPT-4, GPT-3.5
  • Claude: Claude 3 系列
  • Gemini: Google Gemini
  • Ark: 字节跳动火山引擎
  • Ollama: 本地模型
  • 自定义: 实现 ChatModel 接口

Embedding 实现

  • OpenAI: text-embedding-ada-002
  • Ark: 火山引擎 Embedding
  • 自定义: 实现 Embedding 接口

Retriever 实现

  • Elasticsearch: 全文检索
  • OpenSearch: 向量检索
  • 自定义: 实现 Retriever 接口

开发最佳实践

  1. 组件复用: 使用 eino-ext 提供的官方组件
  2. 错误处理: 始终检查错误返回值
  3. 上下文传递: 正确使用 context.Context
  4. 流式优先: 优先使用流式 API 提升用户体验
  5. 回调监控: 使用回调机制进行日志和监控
  6. 工具设计: 工具应该单一职责、参数清晰
  7. Graph 编排: 复杂流程使用 Graph 而非硬编码
  8. 检查点: 长时间任务使用检查点支持恢复
  9. 类型安全: 充分利用 Go 的类型系统
  10. 测试: 为 Agent 和工具编写单元测试

常用命令

# 代码检查
golangci-lint run ./...

# 格式化代码
gofmt -s -w .

# 整理导入
goimports -w .

# 运行测试
go test ./...

# 构建
go build -o app main.go

# 运行
./app

官方资源

使用场景

  1. 对话机器人: 客服、问答、知识库查询
  2. 工具调用: 天气查询、计算器、数据库操作
  3. 数据分析: 数据处理、报表生成、可视化
  4. 代码生成: 代码助手、自动化脚本
  5. 多 Agent 协作: 任务分解、专业分工
  6. 工作流自动化: 业务流程、ETL 任务
  7. 人机协作: 审批流程、交互式任务
  8. RAG 应用: 知识库检索增强生成

注意事项

  1. API Key 安全: 不要硬编码 API Key,使用环境变量
  2. 并发控制: 注意 Go 的并发特性,避免竞态条件
  3. 资源释放: 及时释放资源,避免内存泄漏
  4. 错误处理: 不要忽略错误,做好错误处理和日志
  5. 性能优化: 使用流式 API、批处理、缓存等优化性能
  6. 版本兼容: 注意 Eino 和 eino-ext 的版本兼容性
  7. 模型选择: 根据任务复杂度选择合适的模型
  8. 成本控制: 监控 API 调用次数和 Token 使用量

官方示例索引

详细示例请参考 references/docs_examples/ 目录:

📦 ADK (Agent Development Kit)

目录名称说明
adk/helloworldHello World Agent最简单的 Agent 示例,展示如何创建基础对话 Agent
adk/intro/chatmodelChatModel AgentChatModelAgent 使用和 Interrupt 机制
adk/intro/custom自定义 Agent实现符合 ADK 定义的自定义 Agent
adk/intro/workflowWorkflow AgentsLoop、Parallel、Sequential Agent 模式
adk/intro/sessionSession 管理通过 Session 在多个 Agent 间传递数据和状态
adk/intro/transferAgent 转移ChatModelAgent 的 Transfer 能力,Agent 间任务转移
adk/intro/http-sse-serviceHTTP SSE 服务将 ADK Runner 暴露为 HTTP 服务(Server-Sent Events)
adk/human-in-the-loop人机协作8 个示例:审批、审核编辑、反馈循环、追问、Supervisor
adk/multiagent多 Agent 协作Supervisor、Plan-Execute-Replan、Deep Agents、Excel Agent
adk/common/tool/graphtoolGraphTool将 Graph/Chain/Workflow 封装为 Agent 工具

🔗 Compose (编排)

目录名称说明
compose/chainChain使用 compose.Chain 进行顺序编排(Prompt + ChatModel)
compose/graphGraph图编排:状态图、工具调用 Agent、异步节点、中断机制
compose/workflowWorkflow工作流:字段映射、纯数据流、纯控制流、静态值、流式处理
compose/batchBatchNode批量处理组件,支持并发控制和中断恢复

🌊 Flow (流程模块)

目录名称说明
flow/agent/reactReAct AgentReAct Agent,包含记忆、动态选项、未知工具处理
flow/agent/multiagentMulti-AgentHost Multi-Agent(日记助手)、Plan-Execute 模式
flow/agent/manusManus Agent基于 Eino 实现的 Manus Agent(参考 OpenManus)
flow/agent/deer-goDeer-Go参考 deer-flow 的 Go 实现,支持研究团队协作

🧩 Components (组件)

目录名称说明
components/modelModelA/B 测试路由、cURL 风格的 HTTP 传输日志
components/retrieverRetriever多查询检索、路由检索
components/toolToolJSON Schema 工具、MCP 工具、中间件(错误移除、JSON 修复)
components/documentDocument自定义解析器、扩展解析器、文本解析器
components/promptPromptChat Prompt 模板示例
components/lambdaLambdaLambda 函数组件示例

🚀 QuickStart (快速开始)

目录名称说明
quickstart/chatChat 快速开始最基础的 LLM 对话示例(模板、生成、流式输出)
quickstart/eino_assistantEino 助手完整的 RAG 应用(知识索引、Agent 服务、Web 界面)
quickstart/todoagentTodo Agent简单的 Todo 管理 Agent 示例

🛠️ DevOps (开发运维)

目录名称说明
devops/debug调试工具Eino 调试功能,支持 Chain 和 Graph 调试
devops/visualize可视化工具将 Graph/Chain/Workflow 渲染为 Mermaid 图表

参考文档

详细文档请参考 references/ 目录:

Capabilities

skillsource-fanqingxuanskill-einotopic-agent-skillstopic-ai-agenttopic-claude-codetopic-claude-skillstopic-codextopic-coding-assistanttopic-developer-toolstopic-qodertopic-vercel-skills

Install

Installnpx skills add fanqingxuan/awesome-skills
Transportskills-sh
Protocolskill

Quality

0.46/ 1.00

deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 19 github stars · SKILL.md body (16,542 chars)

Provenance

Indexed fromgithub
Enriched2026-04-23 07:01:11Z · deterministic:skill-github:v1 · v1
First seen2026-04-18
Last seen2026-04-23

Agent access