Solon AI 开发学习13 - chat - Tool的输入输出架构及生成类

1、Tool输出给 llm 的描述形态

这个形态下 parameters 属性是一个 jsonSchema 规范的结构。也就是工具的"输入架构"(mcp 里的叫法)

json 复制代码
{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "获取指定城市的天气情况",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "根据用户提到的地点推测城市"
                }
            },
            "required": [
                "location"
            ],
            "additionalProperties": False
        },
        "strict": True
    }
}

2、Tool注册给 mcp 的描述形态

这个形态下多了 outputSchema (符合 jsonSchema 规范的输出架构)属性,且 parameters 属性变成了 inputSchema(可以与 outputSchema 呼应上)。

json 复制代码
{
    "name": "get_weather",
    "description": "获取指定城市的天气情况",
    "inputSchema": {
        "type": "object",
        "properties": {
            "location": {
                "type": "string",
                "description": "根据用户提到的地点推测城市"
            }
        },
        "required": [
            "location"
        ],
        "additionalProperties": False
    },
    "outputSchema": {
        "type": "string"
    }
}

3、构建Tool的 outputSchema(输出架构)定义

(v3.2.2 后支持)

使用 FunctionToolDesc 描述工具时(即手动构建),通过 returnType 声明

java 复制代码
import org.noear.solon.ai.chat.tool.FunctionToolDesc;

FunctionToolDesc toolDesc = new FunctionToolDesc("get_weather")
    .description("获取指定城市的天气情况")
    .stringParamAdd("location", "根据用户提到的地点推测城市")
    .returnType(String.class)
    .doHandle(args -> {
        return "晴,24度"; // + weatherService.get(location);
    })

使用 MethodFunctionTool 描述工具时(即 @ToolMapping 注解函数构建),通过方法返回类型自动声明

java 复制代码
import org.noear.solon.annotation.Param;
import org.noear.solon.ai.annotation.ToolMapping;
import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;

@McpServerEndpoint(sseEndpoint = "/mcp/sse")
public class Tools {
    @ToolMapping(description = "获取指定城市的天气情况")
    public String get_weather(@Param(name = "location", description = "根据用户提到的地点推测城市") String location) {
        return "晴,24度"; // + weatherService.get(location);
    }
}

如果返回的是实体结果时,还可以通过 @Param 注解增加描述

java 复制代码
import org.noear.solon.annotation.Param;
import org.noear.solon.ai.annotation.ToolMapping;
import org.noear.solon.ai.mcp.server.annotation.McpServerEndpoint;

public class UserInfo {
    @Param(description = "用户名")
    private String name;

    @Param(description = "年龄")
    private Integer age;

    @Param(description = "性别。0表示女,1表示男")
    private Integer gender;
}

@McpServerEndpoint(sseEndpoint = "/mcp/sse")
public class Tools {
    @Inject
    UserService userService;

    @ToolMapping(description = "获取用户信息")
    public UserInfo getUserInfo(@Param(description = "用户ID") Long userId) {
        return userService.getUser(userId);
    }
}

4、Tool 的 JsonSchema 生成类 ToolSchemaUtil

现有的Tool架构是由 ToolSchemaUtil 提供支持

方法 描述 备注
buildInputParams 构建 tool 的输出参数描述 支持 @Body 实体自动分解字段
buildInputSchema 构建 tool 输入架构
buildOutputSchema 构建 tool 输出架构
isIgnoreOutputSchema 检测 tool 需要乎略的输出架构 比如单值类型
createSchema 生成一个类型的 JsonSchema 通用方法
addBodyDetector 添加主体注解探测器 第三方框架使用时,可用它扩展
addParamResolver 添加参数注解分析器 同上
addNodeDescribe 添加节点描述处理 同上
相关推荐
深蓝AI1 天前
美团 LongCat-2.5 拆解:1.6T 参数只激活 3%,1M 上下文卖 0.3 美元,Agent 模型的账变了
人工智能·llm
树欲静·而风不止1 天前
许愿式编程:我把 Typability 改成了能日常顶替 Typora 的样子
ai·markdown
香蕉大香蕉(06敬畏市场)1 天前
MySQL 单点详解(07)
java·数据库·mysql·ai·博客·八股
骑着蜗牛撵大象3271 天前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
Danny转行做跨境1 天前
亚马逊选品接 MCP 到 Claude Code 的四个坑
跨境电商·mcp·sorftime
aichitang20241 天前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
遇码1 天前
2026-11-01-daw-retry-banner-body
人工智能·ai·rust·数据分析·大模型·agent
吴凡wudianmei2 天前
从 0 搭一个 AI Agent(三):SSE 流式输出,让 AI 边想边说
架构·llm·openai
rich_Chan.2 天前
【2026 实操】bl video edit 教程:已拍素材改风格换颜色全流程,含输出规格、角标自查
人工智能·ai·云计算·aigc
小七-七牛开发者2 天前
AI Agent 的安全风险,正在从 Prompt 扩展到运行环境
ai·agent·security·权限管理·cursor