@@ -30,7 +30,7 @@ type BaseTool interface {
3030 Info (ctx context.Context ) (*schema.ToolInfo , error )
3131}
3232
33- // 可调用的工具接口,支持同步调用
33+ // 支持同步调用的工具接口
3434type InvokableTool interface {
3535 BaseTool
3636 InvokableRun (ctx context.Context , argumentsInJSON string , opts ...Option ) (string , error )
@@ -49,7 +49,7 @@ type StreamableTool interface {
4949- 参数:
5050 - ctx:上下文对象
5151- 返回值:
52- - ` *schema.ToolInfo ` :工具的描述信息
52+ - ` *schema.ToolInfo ` :工具的描述信息,用于提供给大模型
5353 - error:获取信息过程中的错误
5454
5555#### ** InvokableRun 方法**
@@ -97,6 +97,39 @@ type ToolInfo struct {
9797
9898Tool 组件使用 ToolOption 来定义可选参数, ToolsNode 没有抽象公共的 option。每个具体的实现可以定义自己的特定 Option,通过 WrapToolImplSpecificOptFn 函数包装成统一的 ToolOption 类型。
9999
100+ ``` go
101+ package tool
102+ 103+ // Option defines call option for InvokableTool or StreamableTool component, which is part of component interface signature.
104+ // Each tool implementation could define its own options struct and option funcs within its own package,
105+ // then wrap the impl specific option funcs into this type, before passing to InvokableRun or StreamableRun.
106+ type Option struct {
107+ implSpecificOptFn any
108+ }
109+ 110+ // WrapImplSpecificOptFn wraps the impl specific option functions into Option type.
111+ // T: the type of the impl specific options struct.
112+ // Tool implementations are required to use this function to convert its own option functions into the unified Option type.
113+ // For example, if the tool defines its own options struct:
114+ //
115+ // type customOptions struct {
116+ // conf string
117+ // }
118+ //
119+ // Then the tool needs to provide an option function as such:
120+ //
121+ // func WithConf(conf string) Option {
122+ // return WrapImplSpecificOptFn(func(o *customOptions) {
123+ // o.conf = conf
124+ // }
125+ // }
126+ func WrapImplSpecificOptFn [T any](optFn func (*T)) Option {
127+ return Option {
128+ implSpecificOptFn: optFn,
129+ }
130+ }
131+ ```
132+ 100133## ** 使用方式**
101134
102135``` go
@@ -107,11 +140,16 @@ import (
107140)
108141
109142// 创建工具节点
110- toolsNode := compose.NewToolsNode ([]tool.Tool {
111- searchTool, // 搜索工具
112- weatherTool, // 天气查询工具
113- calculatorTool, // 计算器工具
143+ toolsNode , err := compose.NewToolNode (ctx, &compose.ToolsNodeConfig {
144+ Tools : []tool.BaseTool {
145+ searchTool, // 搜索工具
146+ weatherTool, // 天气查询工具
147+ calculatorTool, // 计算器工具
148+ },
114149})
150+ if err != nil {
151+ return err
152+ }
115153
116154// Mock LLM 输出作为输入
117155input := &schema.Message {
@@ -131,6 +169,8 @@ toolMessages, err := toolsNode.Invoke(ctx, input)
131169
132170ToolsNode 通常不会被单独使用,一般用于编排之中接在 ChatModel 之后。
133171
172+ 如果要和 ChatModel 共同使用,即 ChatModel 产生tool call调用指令,Eino解析tool call指令来调用 ToolsNode, 需要调用 ChatModel 的 WithTools() 函数将工具描述信息传递给大模型。
173+ 134174### ** 在编排中使用**
135175
136176``` go
@@ -140,12 +180,17 @@ import (
140180 " github.com/cloudwego/eino/schema"
141181)
142182
143- // 创建工具节点
144- toolsNode := compose.NewToolsNode ([]tool.Tool {
145- searchTool, // 搜索工具
146- weatherTool, // 天气查询工具
147- calculatorTool, // 计算器工具
183+ // 创建工具节点,一个工具节点可包含多种工具
184+ toolsNode , err := compose.NewToolNode (ctx, &compose.ToolsNodeConfig {
185+ Tools : []tool.BaseTool {
186+ searchTool, // 搜索工具
187+ weatherTool, // 天气查询工具
188+ calculatorTool, // 计算器工具
189+ },
148190})
191+ if err != nil {
192+ return err
193+ }
149194
150195// 在 Chain 中使用
151196chain := compose.NewChain [*schema.Message , []*schema.Message ]()
@@ -156,7 +201,9 @@ graph := compose.NewGraph[*schema.Message, []*schema.Message]()
156201graph.AddToolsNode (toolsNode)
157202```
158203
159- ## ** Option 机制**
204+ ## ** Option 和 Callback 使用**
205+ 206+ ### ** Option 使用示例**
160207
161208自定义 Tool 可根据自己需要实现特定的 Option:
162209
@@ -176,9 +223,38 @@ func WithTimeout(timeout time.Duration) tool.Option {
176223 o.Timeout = timeout
177224 })
178225}
226+ 227+ type MyTool struct {
228+ options MyToolOptions
229+ }
230+ 231+ func (t *MyTool ) Info (ctx context .Context ) (*schema .ToolInfo , error ) {
232+ // 省略具体实现
233+ return nil , err
234+ }
235+ func (t *MyTool ) StreamableRun (ctx context .Context , argumentsInJSON string , opts ...tool .Option ) (*schema .StreamReader [string ], error ) {
236+ // 省略具体实现
237+ return nil , err
238+ }
239+ 240+ func (t *MyTool ) InvokableRun (ctx context .Context , argument string , opts ...tool .Option ) (string , error ) {
241+ // 将执行编排时传入的自定义配置设置到MyToolOptions中
242+ tmpOptions := tool.GetImplSpecificOptions (&t.options , opts...)
243+ 244+ // 根据tmpOptions中Timeout的值处理Timeout逻辑
245+ return " " , nil
246+ }
179247```
180248
181- ## ** Option 和 Callback 使用**
249+ 执行编排时,可以使用 compose.WithToolsNodeOption() 传入 ToolsNode 相关的Option设置,ToolsNode下的所有 Tool 都能接收到
250+ ``` go
251+ streamReader , err := graph.Stream (ctx, []*schema.Message {
252+ {
253+ Role: schema.User ,
254+ Content: " hello" ,
255+ },
256+ }, compose.WithToolsNodeOption (compose.WithToolOption (WithTimeout (10 * time.Second ))))
257+ ```
182258
183259### ** Callback 使用示例**
184260
0 commit comments