解决eino对接LM Studio时无参数工具报错问题

【免费下载链接】eino Go 语言编写的终极大型语言模型(LLM)应用开发框架,强调简洁性、可扩展性、可靠性与有效性。 【免费下载链接】eino 项目地址: https://gitcode.com/CloudWeGo/eino

问题背景

在使用CloudWeGo Eino框架对接LM Studio等本地大语言模型服务时,开发者经常会遇到一个典型问题:当定义的工具(Tool)没有参数时,在工具调用过程中会出现报错。这个问题源于Eino框架对工具参数描述的严格校验机制。

问题分析

Eino工具参数设计原理

Eino框架通过ToolInfo结构体来描述工具信息,其中ParamsOneOf字段用于定义工具的参数:

type ToolInfo struct {
    Name string
    Desc string
    *ParamsOneOf  // 参数描述,可为nil表示无参数
}

ParamsOneOf是一个联合类型,支持两种参数描述方式:

  1. 参数映射方式:使用map[string]*ParameterInfo直观描述参数
  2. OpenAPI v3规范:使用标准的OpenAPI Schema格式

问题根源

当工具不需要任何参数时,正确的做法是将ParamsOneOf设置为nil

// 正确的无参数工具定义
toolInfo := &schema.ToolInfo{
    Name: "get_current_time",
    Desc: "获取当前系统时间",
    ParamsOneOf: nil,  // 明确表示无参数
}

然而在实际开发中,开发者可能会:

  1. 忘记设置ParamsOneOf字段
  2. 错误地创建空的参数映射
  3. 未正确处理参数转换逻辑

解决方案

方案一:明确设置nil参数

对于确实不需要参数的工具,必须显式设置ParamsOneOfnil

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. 参数验证流程图

mermaid

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机制:

  1. 明确标识无参数:对于不需要参数的工具,必须显式设置ParamsOneOf: nil
  2. 参数校验:在工具执行方法中验证参数是否为空
  3. 规范使用:根据参数复杂度选择合适的参数描述方法

通过遵循这些最佳实践,可以确保Eino框架与LM Studio等大语言模型服务的顺畅对接,避免因参数描述不当导致的工具调用错误。

记住:清晰的参数描述不仅是技术实现的要求,更是确保AI应用可靠性和可维护性的关键因素。

【免费下载链接】eino Go 语言编写的终极大型语言模型(LLM)应用开发框架,强调简洁性、可扩展性、可靠性与有效性。 【免费下载链接】eino 项目地址: https://gitcode.com/CloudWeGo/eino

Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐