跳到主要内容

ToolCallback源码解析

上一节我们知道了Spring AI提供两种定义工具的方式:@Tool注解和Function Bean。那你有没有好奇过:这两种方式在底层有什么区别?Spring AI拿到你的工具定义后,内部是怎么调用的?

这一节我们就来扒一扒源码,搞清楚这些问题。

ToolCallback:工具的统一抽象

不管你用哪种方式定义工具,Spring AI最终都会把它转换成一个叫ToolCallback的东西。这是Spring AI对"可调用工具"的统一抽象。

ToolCallback 核心接口

ToolCallback 接口的两个核心方法:

  • getToolDefinition():提供工具的"说明书",让模型知道有这个工具可用
  • call():真正干活的方法,接收 JSON 格式的参数,返回执行结果

不管工具是怎么定义的,只要实现了这个接口,Spring AI 就能调用它。

先来看看这个接口长什么样:

public interface ToolCallback {

/**
* 获取工具定义,包含名称、描述、参数规范等信息
* 模型会根据这些信息来决定什么时候调用这个工具
*/
ToolDefinition getToolDefinition();

/**
* 获取工具的元数据,比如是否需要用户确认、返回值是否直接给用户等
*/
default ToolMetadata getToolMetadata() {
return ToolMetadata.builder().build();
}

/**
* 执行工具调用
* @param toolInput 模型传过来的参数,JSON格式
* @return 执行结果,会被发回给模型
*/
String call(String toolInput);

/**
* 带上下文的执行方法,可以传递额外信息
*/
default String call(String toolInput, @Nullable ToolContext toolContext) {
if (toolContext != null && !toolContext.getContext().isEmpty()) {
throw new UnsupportedOperationException("不支持工具上下文");
}
return call(toolInput);
}
}

看完接口定义,几个关键点就清楚了:

  1. getToolDefinition() — 提供工具的"说明书",让模型知道有这个工具可用
  2. call() — 真正干活的方法,接收JSON格式的参数,返回执行结果

不管工具是怎么定义的,只要实现了这个接口,Spring AI就能调用它。

付费内容提示

该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放

加入星球后,你可以获得:

  • 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
  • 讲解文档:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的详细文档
  • 讲解视频:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
  • 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
  • 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
  • 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
  • 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
  • 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
  • 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
知识星球二维码

1. 打开微信 -> 扫描左侧二维码 -> 加入「JavaUp项目实战&技术讲解」知识星球

2. 查看星球使用指导,获取完整项目讲解资料索引

👉 点击解锁全部付费内容
🎁优惠