解决eino对接LM Studio时无参数工具报错问题
·
解决eino对接LM Studio时无参数工具报错问题
问题背景
在使用CloudWeGo Eino框架对接LM Studio等本地大语言模型服务时,开发者经常会遇到一个典型问题:当定义的工具(Tool)没有参数时,在工具调用过程中会出现报错。这个问题源于Eino框架对工具参数描述的严格校验机制。
问题分析
Eino工具参数设计原理
Eino框架通过ToolInfo结构体来描述工具信息,其中ParamsOneOf字段用于定义工具的参数:
type ToolInfo struct {
Name string
Desc string
*ParamsOneOf // 参数描述,可为nil表示无参数
}
ParamsOneOf是一个联合类型,支持两种参数描述方式:
- 参数映射方式:使用
map[string]*ParameterInfo直观描述参数 - OpenAPI v3规范:使用标准的OpenAPI Schema格式
问题根源
当工具不需要任何参数时,正确的做法是将ParamsOneOf设置为nil:
// 正确的无参数工具定义
toolInfo := &schema.ToolInfo{
Name: "get_current_time",
Desc: "获取当前系统时间",
ParamsOneOf: nil, // 明确表示无参数
}
然而在实际开发中,开发者可能会:
- 忘记设置
ParamsOneOf字段 - 错误地创建空的参数映射
- 未正确处理参数转换逻辑
解决方案
方案一:明确设置nil参数
对于确实不需要参数的工具,必须显式设置ParamsOneOf为nil:
func (t *TimeTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: "get_current_time",
Desc: "获取当前系统时间,无需任何参数",
ParamsOneOf: nil, // 关键:明确标识无参数
}, nil
}
方案二:使用参数构造器
Eino提供了便捷的参数构造方法,确保参数描述的正确性:
import "github.com/cloudwego/eino/schema"
// 方法1:使用NewParamsOneOfByParams
func createToolWithParams() *schema.ToolInfo {
params := map[string]*schema.ParameterInfo{
"format": {
Type: schema.String,
Desc: "时间格式,如'2006-01-02 15:04:05'",
Required: false,
},
}
return &schema.ToolInfo{
Name: "format_time",
Desc: "格式化当前时间",
ParamsOneOf: schema.NewParamsOneOfByParams(params),
}
}
// 方法2:明确无参数
func createToolWithoutParams() *schema.ToolInfo {
return &schema.ToolInfo{
Name: "get_time",
Desc: "获取当前时间",
ParamsOneOf: nil, // 明确无参数
}
}
方案三:参数校验最佳实践
在工具实现中添加参数校验逻辑:
func (t *MyTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
// 对于无参数工具,验证传入参数为空
if argumentsInJSON != "" && argumentsInJSON != "{}" {
return "", fmt.Errorf("此工具不需要参数,但收到了参数: %s", argumentsInJSON)
}
// 工具具体逻辑
return t.getCurrentTime(), nil
}
完整示例代码
下面是一个完整的无参数工具实现示例:
package main
import (
"context"
"fmt"
"time"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema"
)
// TimeTool 无参数的时间工具
type TimeTool struct{}
// Info 返回工具信息,明确标识无参数
func (t *TimeTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: "get_current_time",
Desc: "获取当前系统时间,无需任何参数",
ParamsOneOf: nil, // 关键:设置为nil表示无参数
}, nil
}
// InvokableRun 工具执行方法
func (t *TimeTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
// 验证参数为空
if argumentsInJSON != "" && argumentsInJSON != "{}" {
return "", fmt.Errorf("此工具不需要参数,但收到了: %s", argumentsInJSON)
}
// 返回当前时间
return time.Now().Format("2006-01-02 15:04:05"), nil
}
// 实现BaseTool接口
func (t *TimeTool) BaseTool() {}
func main() {
timeTool := &TimeTool{}
// 测试工具信息
info, err := timeTool.Info(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("工具名称: %s\n", info.Name)
fmt.Printf("工具描述: %s\n", info.Desc)
fmt.Printf("是否有参数: %v\n", info.ParamsOneOf == nil)
// 测试工具执行
result, err := timeTool.InvokableRun(context.Background(), "")
if err != nil {
panic(err)
}
fmt.Printf("当前时间: %s\n", result)
}
调试技巧
1. 参数验证流程图
2. 常见错误排查表
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
ParamsOneOf needs to have at least one method |
未正确设置参数描述 | 明确设置nil或创建参数映射 |
| 工具调用时参数校验失败 | 参数格式不符合预期 | 检查参数JSON格式和类型 |
| LM Studio返回工具调用错误 | 参数schema不符合OpenAPI规范 | 使用NewParamsOneOfByOpenAPIV3 |
3. 参数描述选择指南
| 场景 | 推荐方法 | 优点 |
|---|---|---|
| 简单参数 | NewParamsOneOfByParams |
直观易用 |
| 复杂嵌套参数 | NewParamsOneOfByOpenAPIV3 |
符合标准规范 |
| 无参数工具 | 设置ParamsOneOf: nil |
明确标识无参数 |
总结
解决Eino对接LM Studio时无参数工具报错问题的关键在于正确理解和使用ParamsOneOf机制:
- 明确标识无参数:对于不需要参数的工具,必须显式设置
ParamsOneOf: nil - 参数校验:在工具执行方法中验证参数是否为空
- 规范使用:根据参数复杂度选择合适的参数描述方法
通过遵循这些最佳实践,可以确保Eino框架与LM Studio等大语言模型服务的顺畅对接,避免因参数描述不当导致的工具调用错误。
记住:清晰的参数描述不仅是技术实现的要求,更是确保AI应用可靠性和可维护性的关键因素。
更多推荐

所有评论(0)