AgentStack
SKILL verified MIT Self-run

Eino

skill-fanqingxuan-awesome-skills-eino · by fanqingxuan

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-in-the-loop patterns, or any other Eino framework development tasks. Triggers on phrases like \"Eino 开发\", \"创建 Agent\",…

No reviews yet
0 installs
9 views
0.0% view→install

Install

$ agentstack add skill-fanqingxuan-awesome-skills-eino

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access Used
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets Used
  • Dynamic code execution Used

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Eino? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

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

官方资源

  • GitHub: https://github.com/cloudwego/eino
  • 文档: https://www.cloudwego.io/docs/eino/
  • 示例: https://github.com/cloudwego/eino-examples
  • 扩展: https://github.com/cloudwego/eino-ext
  • 社区: 飞书群(见 README)

使用场景

  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/helloworld | Hello World Agent | 最简单的 Agent 示例,展示如何创建基础对话 Agent | | adk/intro/chatmodel | ChatModel Agent | ChatModelAgent 使用和 Interrupt 机制 | | adk/intro/custom | 自定义 Agent | 实现符合 ADK 定义的自定义 Agent | | adk/intro/workflow | Workflow Agents | Loop、Parallel、Sequential Agent 模式 | | adk/intro/session | Session 管理 | 通过 Session 在多个 Agent 间传递数据和状态 | | adk/intro/transfer | Agent 转移 | ChatModelAgent 的 Transfer 能力,Agent 间任务转移 | | adk/intro/http-sse-service | HTTP 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/graphtool | GraphTool | 将 Graph/Chain/Workflow 封装为 Agent 工具 |

🔗 Compose (编排)

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

🌊 Flow (流程模块)

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

🧩 Components (组件)

| 目录 | 名称 | 说明 | |------|------|------| | components/model | Model | A/B 测试路由、cURL 风格的 HTTP 传输日志 | | components/retriever | Retriever | 多查询检索、路由检索 | | components/tool | Tool | JSON Schema 工具、MCP 工具、中间件(错误移除、JSON 修复) | | components/document | Document | 自定义解析器、扩展解析器、文本解析器 | | components/prompt | Prompt | Chat Prompt 模板示例 | | components/lambda | Lambda | Lambda 函数组件示例 |

🚀 QuickStart (快速开始)

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

🛠️ DevOps (开发运维)

| 目录 | 名称 | 说明 | |------|------|------| | devops/debug | 调试工具 | Eino 调试功能,支持 Chain 和 Graph 调试 | | devops/visualize | 可视化

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.