feat: adjust quickstart's code (#7)

drew/english
IPender 1 year ago committed by GitHub
parent 91b80e073c
commit c14983b38d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -7,12 +7,12 @@ toolchain go1.22.1
replace github.com/apache/thrift => github.com/apache/thrift v0.13.0 replace github.com/apache/thrift => github.com/apache/thrift v0.13.0
require ( require (
github.com/cloudwego/eino v0.3.5 github.com/cloudwego/eino v0.3.7
github.com/cloudwego/eino-ext/components/model/ollama v0.0.0-20250110031740-2b102ddbf6ee github.com/cloudwego/eino-ext/components/model/ollama v0.0.0-20250110031740-2b102ddbf6ee
github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250110031740-2b102ddbf6ee github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250114173536-ca9322ed9f9a
github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250108030439-1493aa120cb1 github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250108030439-1493aa120cb1
github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250110031740-2b102ddbf6ee github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250115053823-95214632f087
github.com/cloudwego/eino-ext/devops v0.0.0-20250115085020-23a349d347b6 github.com/cloudwego/eino-ext/devops v0.0.0-20250116071241-3f1eaaafd49c
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
github.com/getkin/kin-openapi v0.118.0 github.com/getkin/kin-openapi v0.118.0
github.com/ollama/ollama v0.3.0 github.com/ollama/ollama v0.3.0
@ -26,7 +26,8 @@ require (
github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250106073650-ed838398894a // indirect github.com/cloudwego/eino-ext/components/tool/duckduckgo v0.0.0-20250116120445-4165a5358a34 // indirect
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250114173020-562b40c138d3 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect github.com/cloudwego/iasm v0.2.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect

@ -106,18 +106,32 @@ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/eino v0.3.5 h1:9PkAOX/phFifrGXkfl4L9rdecxOQJBJY1FtZqF4bz3c= github.com/cloudwego/eino v0.3.5 h1:9PkAOX/phFifrGXkfl4L9rdecxOQJBJY1FtZqF4bz3c=
github.com/cloudwego/eino v0.3.5/go.mod h1:+kmJimGEcKuSI6OKhet7kBedkm1WUZS3H1QRazxgWUo= github.com/cloudwego/eino v0.3.5/go.mod h1:+kmJimGEcKuSI6OKhet7kBedkm1WUZS3H1QRazxgWUo=
github.com/cloudwego/eino v0.3.7 h1:PE1yFaAPVenRhDl0x6N1U2rKrfZkSr1hKlcacO6P+VA=
github.com/cloudwego/eino v0.3.7/go.mod h1:+kmJimGEcKuSI6OKhet7kBedkm1WUZS3H1QRazxgWUo=
github.com/cloudwego/eino-ext/components/model/ollama v0.0.0-20250110031740-2b102ddbf6ee h1:7WmvEc53ZoqZmFNowvrgMK5+Dt0oy5TkO+hz3T5uR2k= github.com/cloudwego/eino-ext/components/model/ollama v0.0.0-20250110031740-2b102ddbf6ee h1:7WmvEc53ZoqZmFNowvrgMK5+Dt0oy5TkO+hz3T5uR2k=
github.com/cloudwego/eino-ext/components/model/ollama v0.0.0-20250110031740-2b102ddbf6ee/go.mod h1:FdY7y1FNFAKKGHivitD9biKJqqnUoKI5R3ff8Iflq8I= github.com/cloudwego/eino-ext/components/model/ollama v0.0.0-20250110031740-2b102ddbf6ee/go.mod h1:FdY7y1FNFAKKGHivitD9biKJqqnUoKI5R3ff8Iflq8I=
github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250110031740-2b102ddbf6ee h1:rEPzSwT2Pyr53QrXL0IOB7JcyQ8fR9aAa2CYBUyCRwA= github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250110031740-2b102ddbf6ee h1:rEPzSwT2Pyr53QrXL0IOB7JcyQ8fR9aAa2CYBUyCRwA=
github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250110031740-2b102ddbf6ee/go.mod h1:EaD+9KAHoQD+IVE9SeEta9CX8AjdjOJvzHESVJs/We8= github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250110031740-2b102ddbf6ee/go.mod h1:EaD+9KAHoQD+IVE9SeEta9CX8AjdjOJvzHESVJs/We8=
github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250114173536-ca9322ed9f9a h1:UMR1OGb2OO4CwoBZyaGSQxyenhcoarhWDcQanIkV8u8=
github.com/cloudwego/eino-ext/components/model/openai v0.0.0-20250114173536-ca9322ed9f9a/go.mod h1:nbk+rKz+q/tE4adZcEMP6vOBi41FrHrht7J/A0GHXBE=
github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250108030439-1493aa120cb1 h1:gDJLHr6BQ7iXJFKrnvUvrGDamauVXjTm0XeXk8GbS68= github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250108030439-1493aa120cb1 h1:gDJLHr6BQ7iXJFKrnvUvrGDamauVXjTm0XeXk8GbS68=
github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250108030439-1493aa120cb1/go.mod h1:lj6h0MYtiEGwWDVdkOd4VmZBF7JVWV5bNxv0/r2C+W0= github.com/cloudwego/eino-ext/components/retriever/volc_vikingdb v0.0.0-20250108030439-1493aa120cb1/go.mod h1:lj6h0MYtiEGwWDVdkOd4VmZBF7JVWV5bNxv0/r2C+W0=
github.com/cloudwego/eino-ext/components/tool/duckduckgo v0.0.0-20250114120706-c668ac7e6d1c h1:0AXw0NsuFR690z7912SoZCTLoCG0M8WSVWhlj8vcADI=
github.com/cloudwego/eino-ext/components/tool/duckduckgo v0.0.0-20250114120706-c668ac7e6d1c/go.mod h1:Do8C+KMH+3PiF/jYV/8oFQz+UvCTrThswB9fZWiqfgI=
github.com/cloudwego/eino-ext/components/tool/duckduckgo v0.0.0-20250116120445-4165a5358a34 h1:uiAF49aHUfOW3hT8dJzrrrCt7dTqoSlUynp18C5QKPU=
github.com/cloudwego/eino-ext/components/tool/duckduckgo v0.0.0-20250116120445-4165a5358a34/go.mod h1:Do8C+KMH+3PiF/jYV/8oFQz+UvCTrThswB9fZWiqfgI=
github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250110031740-2b102ddbf6ee h1:33+wTo0u2jM5woDnB0ioHbMrJENUGx+LzDTKmZY+nHg= github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250110031740-2b102ddbf6ee h1:33+wTo0u2jM5woDnB0ioHbMrJENUGx+LzDTKmZY+nHg=
github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250110031740-2b102ddbf6ee/go.mod h1:BEv0B0XLhsOSM5ilqxA336iCFBypaXtmYhgmwIY93m0= github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250110031740-2b102ddbf6ee/go.mod h1:BEv0B0XLhsOSM5ilqxA336iCFBypaXtmYhgmwIY93m0=
github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250115053823-95214632f087 h1:SjpmryEN3Hxqp16bkUbIDlxguFpAReBU86bTD/WGN40=
github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250115053823-95214632f087/go.mod h1:BEv0B0XLhsOSM5ilqxA336iCFBypaXtmYhgmwIY93m0=
github.com/cloudwego/eino-ext/devops v0.0.0-20250115085020-23a349d347b6 h1:nuanny1Gb9x5MHUAAM68AY7YRz+dAJ408g2ip13ft4g= github.com/cloudwego/eino-ext/devops v0.0.0-20250115085020-23a349d347b6 h1:nuanny1Gb9x5MHUAAM68AY7YRz+dAJ408g2ip13ft4g=
github.com/cloudwego/eino-ext/devops v0.0.0-20250115085020-23a349d347b6/go.mod h1:MzPGghc4J7rSevtxeZpqAejpaFbkoCNzG6AQLG93WmE= github.com/cloudwego/eino-ext/devops v0.0.0-20250115085020-23a349d347b6/go.mod h1:MzPGghc4J7rSevtxeZpqAejpaFbkoCNzG6AQLG93WmE=
github.com/cloudwego/eino-ext/devops v0.0.0-20250116071241-3f1eaaafd49c h1:WslgauCA6SisgAPn7cNlhHrmJsX5Fq/tG+87oYCTH3s=
github.com/cloudwego/eino-ext/devops v0.0.0-20250116071241-3f1eaaafd49c/go.mod h1:MzPGghc4J7rSevtxeZpqAejpaFbkoCNzG6AQLG93WmE=
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250106073650-ed838398894a h1:gHpod7vRkLDi4otZjY9pMom35Rk0/kCDbPl2smyjcK0= github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250106073650-ed838398894a h1:gHpod7vRkLDi4otZjY9pMom35Rk0/kCDbPl2smyjcK0=
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250106073650-ed838398894a/go.mod h1:uUhE8oadYHiRwU8bymmyYK58TYgc5qm794PdyXoGJlo= github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250106073650-ed838398894a/go.mod h1:uUhE8oadYHiRwU8bymmyYK58TYgc5qm794PdyXoGJlo=
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250114173020-562b40c138d3 h1:DHeeScM7IOmh8YxbLLNu5FrUMuylDfnsuZ3QLTEThq0=
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250114173020-562b40c138d3/go.mod h1:H5UK9sjotuBaZCO6CFvPRaYDBBfRz/MSFR9ZNEmwgCo=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=

@ -30,7 +30,6 @@ import (
func main() { func main() {
openAIAPIKey := os.Getenv("OPENAI_API_KEY") openAIAPIKey := os.Getenv("OPENAI_API_KEY")
openAIBaseURL := os.Getenv("OPENAI_BASE_URL")
openAIModelName := os.Getenv("OPENAI_MODEL_NAME") openAIModelName := os.Getenv("OPENAI_MODEL_NAME")
ctx := context.Background() ctx := context.Background()
@ -72,13 +71,9 @@ func main() {
// 创建 OpenAI ChatModel, 假设使用 openai 官方服务。 // 创建 OpenAI ChatModel, 假设使用 openai 官方服务。
chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{ chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{
BaseURL: openAIBaseURL, Model: openAIModelName, // 使用的模型版本
Model: openAIModelName, // 使用的模型版本 APIKey: openAIAPIKey, // OpenAI API 密钥
APIKey: openAIAPIKey, // OpenAI API 密钥
// 可选的 Azure OpenAI 配置
ByAzure: true, // 是否使用 Azure OpenAI
APIVersion: "2024-06-01",
}) })
if err != nil { if err != nil {
logs.Errorf("NewChatModel failed, err=%v", err) logs.Errorf("NewChatModel failed, err=%v", err)

@ -18,36 +18,34 @@ package main
import ( import (
"context" "context"
"fmt"
"log"
"os" "os"
"github.com/cloudwego/eino-ext/components/model/openai" "github.com/cloudwego/eino-ext/components/model/openai"
"github.com/cloudwego/eino-ext/components/tool/googlesearch" "github.com/cloudwego/eino-ext/components/tool/duckduckgo"
"github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/components/tool/utils" "github.com/cloudwego/eino/components/tool/utils"
"github.com/cloudwego/eino/compose" "github.com/cloudwego/eino/compose"
"github.com/cloudwego/eino/schema" "github.com/cloudwego/eino/schema"
"github.com/cloudwego/eino-examples/internal/logs"
) )
func main() { func main() {
fmt.Println("Hello, World!") openAIAPIKey := os.Getenv("OPENAI_API_KEY")
ctx := context.Background() ctx := context.Background()
updateTool, err := utils.InferTool("update_todo", "Update a todo item, eg: content,deadline...", UpdateTodoFunc) updateTool, err := utils.InferTool("update_todo", "Update a todo item, eg: content,deadline...", UpdateTodoFunc)
if err != nil { if err != nil {
log.Fatal(err) logs.Errorf("InferTool failed, err=%v", err)
return
} }
// 创建 Google Search 工具 // 创建 Google Search 工具
searchTool, err := googlesearch.NewGoogleSearchTool(ctx, &googlesearch.Config{ searchTool, err := duckduckgo.NewTool(ctx, &duckduckgo.Config{})
APIKey: os.Getenv("GOOGLE_API_KEY"), // Google API Key
SearchEngineID: os.Getenv("GOOGLE_SEARCH_ENGINE_ID"), // 自定义搜索引擎 ID
Num: 5, // 每次返回的结果数量
Lang: "zh-CN", // 搜索结果的语言
})
if err != nil { if err != nil {
log.Fatal(err) logs.Errorf("NewGoogleSearchTool failed, err=%v", err)
return
} }
// 初始化 tools // 初始化 tools
@ -61,12 +59,13 @@ func main() {
// 创建并配置 ChatModel // 创建并配置 ChatModel
temp := float32(0.7) temp := float32(0.7)
chatModel, err := openai.NewChatModel(context.Background(), &openai.ChatModelConfig{ chatModel, err := openai.NewChatModel(context.Background(), &openai.ChatModelConfig{
Model: "gpt-4", Model: "gpt-4o",
APIKey: os.Getenv("OPENAI_API_KEY"), APIKey: openAIAPIKey,
Temperature: &temp, Temperature: &temp,
}) })
if err != nil { if err != nil {
log.Fatal(err) logs.Errorf("NewChatModel failed, err=%v", err)
return
} }
// 获取工具信息, 用于绑定到 ChatModel // 获取工具信息, 用于绑定到 ChatModel
@ -74,7 +73,8 @@ func main() {
for _, tool := range todoTools { for _, tool := range todoTools {
info, err := tool.Info(ctx) info, err := tool.Info(ctx)
if err != nil { if err != nil {
log.Fatal(err) logs.Infof("get ToolInfo failed, err=%v", err)
return
} }
toolInfos = append(toolInfos, info) toolInfos = append(toolInfos, info)
} }
@ -82,7 +82,8 @@ func main() {
// 将 tools 绑定到 ChatModel // 将 tools 绑定到 ChatModel
err = chatModel.BindTools(toolInfos) err = chatModel.BindTools(toolInfos)
if err != nil { if err != nil {
log.Fatal(err) logs.Errorf("BindTools failed, err=%v", err)
return
} }
// 创建 tools 节点 // 创建 tools 节点
@ -90,11 +91,12 @@ func main() {
Tools: todoTools, Tools: todoTools,
}) })
if err != nil { if err != nil {
log.Fatal(err) logs.Errorf("NewToolNode failed, err=%v", err)
return
} }
// 构建完整的处理链 // 构建完整的处理链
chain := compose.NewChain[*schema.Message, []*schema.Message]() chain := compose.NewChain[[]*schema.Message, []*schema.Message]()
chain. chain.
AppendChatModel(chatModel, compose.WithNodeName("chat_model")). AppendChatModel(chatModel, compose.WithNodeName("chat_model")).
AppendToolsNode(todoToolsNode, compose.WithNodeName("tools")) AppendToolsNode(todoToolsNode, compose.WithNodeName("tools"))
@ -102,20 +104,26 @@ func main() {
// 编译并运行 chain // 编译并运行 chain
agent, err := chain.Compile(ctx) agent, err := chain.Compile(ctx)
if err != nil { if err != nil {
log.Fatal(err) logs.Errorf("chain.Compile failed, err=%v", err)
return
} }
// 运行示例 // 运行示例
resp, err := agent.Invoke(ctx, &schema.Message{ resp, err := agent.Invoke(ctx, []*schema.Message{
Content: "帮我创建一个明天下午3点截止的待办事项准备Eino项目演示文稿", {
Role: schema.User,
Content: "添加一个学习 Eino 的 TODO同时搜索一下 cloudwego/eino 的仓库地址",
},
}) })
if err != nil { if err != nil {
log.Fatal(err) logs.Errorf("agent.Invoke failed, err=%v", err)
return
} }
// 输出结果 // 输出结果
for _, msg := range resp { for idx, msg := range resp {
fmt.Println(msg.Content) logs.Infof("\n")
logs.Infof("message %d: %s: %s", idx, msg.Role, msg.Content)
} }
} }
@ -145,6 +153,7 @@ func getAddTodoTool() tool.InvokableTool {
return utils.NewTool(info, AddTodoFunc) return utils.NewTool(info, AddTodoFunc)
} }
// ListTodoTool
// 获取列出 todo 工具 // 获取列出 todo 工具
// 自行实现 InvokableTool 接口 // 自行实现 InvokableTool 接口
type ListTodoTool struct{} type ListTodoTool struct{}
@ -182,19 +191,19 @@ type TodoAddParams struct {
} }
func (lt *ListTodoTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) { func (lt *ListTodoTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
log.Printf("invoke tool list_todo: %s", argumentsInJSON) logs.Infof("invoke tool list_todo: %s", argumentsInJSON)
// 具体的调用逻辑 // 具体的调用逻辑
return `{"todos": [{"id": "1", "content": "在2024年12月10日之前完成Eino项目演示文稿的准备工作", "started_at": 1717401600, "deadline": 1717488000, "done": false}]}`, nil return `{"todos": [{"id": "1", "content": "在2024年12月10日之前完成Eino项目演示文稿的准备工作", "started_at": 1717401600, "deadline": 1717488000, "done": false}]}`, nil
} }
func AddTodoFunc(ctx context.Context, params *TodoAddParams) (string, error) { func AddTodoFunc(ctx context.Context, params *TodoAddParams) (string, error) {
log.Printf("invoke tool add_todo: %+v", params) logs.Infof("invoke tool add_todo: %+v", params)
// 具体的调用逻辑 // 具体的调用逻辑
return `{"msg": "success"}`, nil return `{"msg": "add todo success"}`, nil
} }
func UpdateTodoFunc(ctx context.Context, params *TodoUpdateParams) (string, error) { func UpdateTodoFunc(ctx context.Context, params *TodoUpdateParams) (string, error) {
log.Printf("invoke tool update_todo: %+v", params) logs.Infof("invoke tool update_todo: %+v", params)
// 具体的调用逻辑 // 具体的调用逻辑
return `{"msg": "success"}`, nil return `{"msg": "update todo success"}`, nil
} }

Loading…
Cancel
Save