From c14983b38de2299b0e67e6993f520089d94c4619 Mon Sep 17 00:00:00 2001 From: IPender Date: Thu, 16 Jan 2025 22:33:05 +0800 Subject: [PATCH] feat: adjust quickstart's code (#7) --- go.mod | 11 +++--- go.sum | 14 ++++++++ quickstart/chat/main.go | 9 ++--- quickstart/todoagent/main.go | 69 ++++++++++++++++++++---------------- 4 files changed, 61 insertions(+), 42 deletions(-) diff --git a/go.mod b/go.mod index 30bf63e..ced217e 100644 --- a/go.mod +++ b/go.mod @@ -7,12 +7,12 @@ toolchain go1.22.1 replace github.com/apache/thrift => github.com/apache/thrift v0.13.0 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/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/tool/googlesearch v0.0.0-20250110031740-2b102ddbf6ee - github.com/cloudwego/eino-ext/devops v0.0.0-20250115085020-23a349d347b6 + github.com/cloudwego/eino-ext/components/tool/googlesearch v0.0.0-20250115053823-95214632f087 + github.com/cloudwego/eino-ext/devops v0.0.0-20250116071241-3f1eaaafd49c github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/getkin/kin-openapi v0.118.0 github.com/ollama/ollama v0.3.0 @@ -26,7 +26,8 @@ require ( github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // 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/dustin/go-humanize v1.0.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/go.sum b/go.sum index d1ce9f5..e527336 100644 --- a/go.sum +++ b/go.sum @@ -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/eino v0.3.5 h1:9PkAOX/phFifrGXkfl4L9rdecxOQJBJY1FtZqF4bz3c= 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/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/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/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/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/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/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/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= diff --git a/quickstart/chat/main.go b/quickstart/chat/main.go index 0e9d60b..58e5683 100644 --- a/quickstart/chat/main.go +++ b/quickstart/chat/main.go @@ -30,7 +30,6 @@ import ( func main() { openAIAPIKey := os.Getenv("OPENAI_API_KEY") - openAIBaseURL := os.Getenv("OPENAI_BASE_URL") openAIModelName := os.Getenv("OPENAI_MODEL_NAME") ctx := context.Background() @@ -72,13 +71,9 @@ func main() { // 创建 OpenAI ChatModel, 假设使用 openai 官方服务。 chatModel, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{ - BaseURL: openAIBaseURL, - Model: openAIModelName, // 使用的模型版本 - APIKey: openAIAPIKey, // OpenAI API 密钥 + Model: openAIModelName, // 使用的模型版本 + APIKey: openAIAPIKey, // OpenAI API 密钥 - // 可选的 Azure OpenAI 配置 - ByAzure: true, // 是否使用 Azure OpenAI - APIVersion: "2024-06-01", }) if err != nil { logs.Errorf("NewChatModel failed, err=%v", err) diff --git a/quickstart/todoagent/main.go b/quickstart/todoagent/main.go index 437818c..cadabef 100644 --- a/quickstart/todoagent/main.go +++ b/quickstart/todoagent/main.go @@ -18,36 +18,34 @@ package main import ( "context" - "fmt" - "log" "os" "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/utils" "github.com/cloudwego/eino/compose" "github.com/cloudwego/eino/schema" + + "github.com/cloudwego/eino-examples/internal/logs" ) func main() { - fmt.Println("Hello, World!") + openAIAPIKey := os.Getenv("OPENAI_API_KEY") + ctx := context.Background() updateTool, err := utils.InferTool("update_todo", "Update a todo item, eg: content,deadline...", UpdateTodoFunc) if err != nil { - log.Fatal(err) + logs.Errorf("InferTool failed, err=%v", err) + return } // 创建 Google Search 工具 - searchTool, err := googlesearch.NewGoogleSearchTool(ctx, &googlesearch.Config{ - APIKey: os.Getenv("GOOGLE_API_KEY"), // Google API Key - SearchEngineID: os.Getenv("GOOGLE_SEARCH_ENGINE_ID"), // 自定义搜索引擎 ID - Num: 5, // 每次返回的结果数量 - Lang: "zh-CN", // 搜索结果的语言 - }) + searchTool, err := duckduckgo.NewTool(ctx, &duckduckgo.Config{}) if err != nil { - log.Fatal(err) + logs.Errorf("NewGoogleSearchTool failed, err=%v", err) + return } // 初始化 tools @@ -61,12 +59,13 @@ func main() { // 创建并配置 ChatModel temp := float32(0.7) chatModel, err := openai.NewChatModel(context.Background(), &openai.ChatModelConfig{ - Model: "gpt-4", - APIKey: os.Getenv("OPENAI_API_KEY"), + Model: "gpt-4o", + APIKey: openAIAPIKey, Temperature: &temp, }) if err != nil { - log.Fatal(err) + logs.Errorf("NewChatModel failed, err=%v", err) + return } // 获取工具信息, 用于绑定到 ChatModel @@ -74,7 +73,8 @@ func main() { for _, tool := range todoTools { info, err := tool.Info(ctx) if err != nil { - log.Fatal(err) + logs.Infof("get ToolInfo failed, err=%v", err) + return } toolInfos = append(toolInfos, info) } @@ -82,7 +82,8 @@ func main() { // 将 tools 绑定到 ChatModel err = chatModel.BindTools(toolInfos) if err != nil { - log.Fatal(err) + logs.Errorf("BindTools failed, err=%v", err) + return } // 创建 tools 节点 @@ -90,11 +91,12 @@ func main() { Tools: todoTools, }) 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. AppendChatModel(chatModel, compose.WithNodeName("chat_model")). AppendToolsNode(todoToolsNode, compose.WithNodeName("tools")) @@ -102,20 +104,26 @@ func main() { // 编译并运行 chain agent, err := chain.Compile(ctx) if err != nil { - log.Fatal(err) + logs.Errorf("chain.Compile failed, err=%v", err) + return } // 运行示例 - resp, err := agent.Invoke(ctx, &schema.Message{ - Content: "帮我创建一个明天下午3点截止的待办事项:准备Eino项目演示文稿", + resp, err := agent.Invoke(ctx, []*schema.Message{ + { + Role: schema.User, + Content: "添加一个学习 Eino 的 TODO,同时搜索一下 cloudwego/eino 的仓库地址", + }, }) if err != nil { - log.Fatal(err) + logs.Errorf("agent.Invoke failed, err=%v", err) + return } // 输出结果 - for _, msg := range resp { - fmt.Println(msg.Content) + for idx, msg := range resp { + 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) } +// ListTodoTool // 获取列出 todo 工具 // 自行实现 InvokableTool 接口 type ListTodoTool struct{} @@ -182,19 +191,19 @@ type TodoAddParams struct { } 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 } 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) { - 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 }