<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Spring AI on On My Way</title>
    <link>https://tuanzi-wow.cn/tags/spring-ai/</link>
    <description>Recent content in Spring AI on On My Way</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sat, 12 Sep 2026 00:25:38 +0800</lastBuildDate>
    <atom:link href="https://tuanzi-wow.cn/tags/spring-ai/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Spring AI Tools</title>
      <link>https://tuanzi-wow.cn/agent/spring-ai-tools/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/agent/spring-ai-tools/</guid>
      <description>Tool是agents调用来执行操作的组件,通过定义良好的输入和输出来让模型和外部世界交互……</description>
      <content:encoded><![CDATA[<h1 id="tools">Tools</h1>
<h2 id="定义">定义:</h2>
<p>Tool是agents调用来执行操作的组件,通过<strong>定义良好的输入和输出</strong>来让模型和外部世界交互</p>
<p>Tools封装了一个可调用的函数及其输入模式,允许模型决定什么时候调用Tools以及传入的参数</p>
<p>Tool主要用语言:</p>
<ul>
<li>信息检索:与外部数据源进行交互检索信息,如数据库和Web搜索引擎.主要目标是增强model的知识,使其能够回答原本无法回答的问题</li>
<li>执行操作:目标是自动化原本需要人工干预或者显式编程的任务</li>
</ul>
<p>ps:Toolc calling称为model能力但是实际上由客户端提供ToolCalling逻辑</p>
<h2 id="quick-start">Quick Start</h2>
<p>两个示例:一个信息检索,一个执行操作</p>
<h3 id="信息检索">信息检索</h3>
<p>在DataTimeTool类中实现一个Tool来获取日期和时间(此处不关心具体实现方式)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">java</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">LocalDateTime</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">annotation</span><span class="o">.</span><span class="n">Tool</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">i18n</span><span class="o">.</span><span class="n">LocaleContextHolder</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="n">DateTimeTools</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="err">@</span><span class="n">Tool</span><span class="p">(</span><span class="n">description</span> <span class="o">=</span> <span class="s2">&#34;Get the current date and time in the user&#39;s timezone&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="ne">String</span> <span class="n">getCurrentDateTime</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="n">LocalDateTime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">atZone</span><span class="p">(</span><span class="n">LocaleContextHolder</span><span class="o">.</span><span class="n">getTimeZone</span><span class="p">()</span><span class="o">.</span><span class="n">toZoneId</span><span class="p">())</span><span class="o">.</span><span class="n">toString</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如何让LLM了解到这个Tool的存在:通过调用Chatclient的tool()方法通知LLM
注意 tool(datetimetool)中的datetimetool需要实例化(也就你JAVA这么多事)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">ChatModel</span> <span class="n">chatModel</span> <span class="o">=</span> <span class="o">...</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="ne">String</span> <span class="n">response</span> <span class="o">=</span> <span class="n">ChatClient</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">chatModel</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="o">.</span><span class="n">prompt</span><span class="p">(</span><span class="s2">&#34;What day is tomorrow?&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">      <span class="o">.</span><span class="n">tools</span><span class="p">(</span><span class="n">new</span> <span class="n">DateTimeTools</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">      <span class="o">.</span><span class="n">call</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">      <span class="o">.</span><span class="n">content</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="n">response</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="o">//</span> <span class="err">输出：</span><span class="n">Tomorrow</span> <span class="n">is</span> <span class="mi">2015</span><span class="o">-</span><span class="mi">10</span><span class="o">-</span><span class="mf">21.</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="执行操作">执行操作</h3>
<p>和上面差不多自己看了</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">java</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">LocalDateTime</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">java</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">format</span><span class="o">.</span><span class="n">DateTimeFormatter</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">annotation</span><span class="o">.</span><span class="n">Tool</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">i18n</span><span class="o">.</span><span class="n">LocaleContextHolder</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="n">DateTimeTools</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="err">@</span><span class="n">Tool</span><span class="p">(</span><span class="n">description</span> <span class="o">=</span> <span class="s2">&#34;Get the current date and time in the user&#39;s timezone&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="ne">String</span> <span class="n">getCurrentDateTime</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="n">LocalDateTime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">atZone</span><span class="p">(</span><span class="n">LocaleContextHolder</span><span class="o">.</span><span class="n">getTimeZone</span><span class="p">()</span><span class="o">.</span><span class="n">toZoneId</span><span class="p">())</span><span class="o">.</span><span class="n">toString</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="err">@</span><span class="n">Tool</span><span class="p">(</span><span class="n">description</span> <span class="o">=</span> <span class="s2">&#34;Set a user alarm for the given time, provided in ISO-8601 format&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">void</span> <span class="n">setAlarm</span><span class="p">(</span><span class="ne">String</span> <span class="n">time</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">LocalDateTime</span> <span class="n">alarmTime</span> <span class="o">=</span> <span class="n">LocalDateTime</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">time</span><span class="p">,</span> <span class="n">DateTimeFormatter</span><span class="o">.</span><span class="n">ISO_DATE_TIME</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="n">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="s2">&#34;Alarm set for &#34;</span> <span class="o">+</span> <span class="n">alarmTime</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>那么有的同学就要问了:
这里只调用了datetimetool类而不是具体的工具,他是怎么知道选择哪个方法的
这就是你SpringAI叔叔的强大之处了,@Tool:会将该方法自动注册为一个tool
所以你们臭学JAVA的还不好好学Spring,Spring Boot,Spring MVC?</p>
<h3 id="概述">概述</h3>
<p><img alt="Tool Calling 主要操作序列" loading="lazy" src="https://java2ai.com/assets/images/tool-calling-01-f574ce40dfbd8203a4f5f0c08256258e.jpg"></p>
<p>1.Tool定义:名称,描述和传入参数
2.调用:Model发送带有Tool名称和参数的相应
3.通过名称选择tool并传入参数执行
4.toolcall结果由程序处理
5.结果传回Model
6.Model根据结果作为附加上下文生成最终响应</p>
<p>Tools 是 tool calling 的构建块，它们由 <code>ToolCallback</code> 接口建模。Spring AI 提供了从方法和函数指定 <code>ToolCallback</code>(s) 的内置支持，但您始终可以定义自己的 <code>ToolCallback</code> 实现以支持更多用例。</p>
<p><code>ChatModel</code> 实现透明地将 tool call 请求分派到相应的 <code>ToolCallback</code> 实现，并将 tool call 结果发送回 model，最终生成最终响应。它们使用 <code>ToolCallingManager</code> 接口来执行此操作，该接口负责管理 tool 执行生命周期。</p>
<p><code>ChatClient</code> 和 <code>ChatModel</code> 都接受 <code>ToolCallback</code> 对象列表，以使 tools 可用于 model 和最终执行它们的 <code>ToolCallingManager</code>。</p>
<p>除了直接传递 <code>ToolCallback</code> 对象外，您还可以传递 tool 名称列表，这些名称将使用 <code>ToolCallbackResolver</code> 接口动态解析。</p>
<h2 id="创建工具">创建工具</h2>
<p>Spring AI提供了两种从方法指定Tools(即ToolCallback(s))的内置支持</p>
<ul>
<li>声明式:使用@Tool注解</li>
<li>编程式:使用低级MethodToolCallback实现</li>
</ul>
<h3 id="方法作为tool">方法作为Tool</h3>
<h4 id="声明式规范-tool">声明式规范 @Tool</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class DateTimeTools {
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  @Tool(description = &#34;Get the current date and time in the user&#39;s timezone&#34;)
</span></span><span class="line"><span class="cl">  String getCurrentDateTime() {
</span></span><span class="line"><span class="cl">      return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
</span></span><span class="line"><span class="cl">  }
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">}
</span></span></code></pre></td></tr></table>
</div>
</div><p>@Tool注解允许你提供的信息:</p>
<ul>
<li>name:如果未提供,将使用方法名称</li>
<li>description:tool描述;若未提供,使用方法名称代替.但是强烈建议详细描述,对于model理解tool的用途以及when to use and how to use很重要</li>
<li>returnDirect:结果是否直接传回model;为布尔值</li>
<li>resultConverter:将toolcall的结果转化为String Object以 <code>ToolCallResultConverter</code> 实现</li>
</ul>
<p><strong>NOTE:</strong> Spring AI 为 <code>@Tool</code> 注解方法的 AOT 编译提供内置支持，只要包含方法的类是 Spring bean（例如 <code>@Component</code>）。否则，您需要向 GraalVM 编译器提供必要的配置。例如，通过用 <code>@RegisterReflection(memberCategories = MemberCategory.INVOKE_DECLARED_METHODS)</code> 注解类。</p>
<p>如果方法返回值，返回类型<strong>必须是可序列化类型</strong>，因为结果将被序列化并发送回 model。</p>
<p><code>@ToolParam</code> 注解可用于提供有关输入参数的附加信息，例如描述或参数是必需还是可选的。默认情况下，所有输入参数都被视为必需</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">java</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">LocalDateTime</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">java</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">format</span><span class="o">.</span><span class="n">DateTimeFormatter</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">annotation</span><span class="o">.</span><span class="n">Tool</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">annotation</span><span class="o">.</span><span class="n">ToolParam</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="n">DateTimeTools</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="err">@</span><span class="n">Tool</span><span class="p">(</span><span class="n">description</span> <span class="o">=</span> <span class="s2">&#34;Set a user alarm for the given time&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">void</span> <span class="n">setAlarm</span><span class="p">(</span><span class="err">@</span><span class="n">ToolParam</span><span class="p">(</span><span class="n">description</span> <span class="o">=</span> <span class="s2">&#34;Time in ISO-8601 format&#34;</span><span class="p">)</span> <span class="ne">String</span> <span class="n">time</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">LocalDateTime</span> <span class="n">alarmTime</span> <span class="o">=</span> <span class="n">LocalDateTime</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">time</span><span class="p">,</span> <span class="n">DateTimeFormatter</span><span class="o">.</span><span class="n">ISO_DATE_TIME</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="n">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="s2">&#34;Alarm set for &#34;</span> <span class="o">+</span> <span class="n">alarmTime</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>@ToolParam允许你提供的有关tool参数的关键信息:</p>
<ul>
<li><code>description</code>：参数的描述，model 可以使用它来更好地理解如何使用它。例如，参数应该是什么格式，允许什么值等。</li>
<li><code>required</code>：参数是必需还是可选的。默认情况下，所有参数都被视为必需。</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Spring AI Tool Calling 使用指南</title>
      <link>https://tuanzi-wow.cn/agent/spring-ai-tool-calling/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/agent/spring-ai-tool-calling/</guid>
      <description>ToolCalling(FunctionCalling)允许模型与一组API或者工具进行交互,增强模型的能力……</description>
      <content:encoded><![CDATA[<h1 id="spring-ai-tool-calling使用指南之我不用java好多年">Spring AI Tool Calling使用指南之我不用JAVA好多年</h1>
<h2 id="概述">概述:</h2>
<p>Tool Calling(Function Calling)允许模型与一组API或者工具进行交互,增强模型的能力</p>
<p>主要功能:</p>
<ul>
<li>信息检索:从外部数据源获取信息,比如:数据库,Web服务,例如:Web_Search</li>
<li>执行操作:在软件系统执行特定操作:例如:预定航班,生成代码</li>
</ul>
<p>Spring AI Alibaba拓展服务:</p>
<ul>
<li>搜索引擎</li>
<li>翻译服务</li>
<li>地图服务</li>
<li>数据服务</li>
<li>开发工具</li>
<li>其他工具</li>
</ul>
<h2 id="详细使用说明">详细使用说明</h2>
<h2 id="python-tool示例你个臭执行python代码的"><strong>Python Tool示例</strong>(你个臭执行Python代码的)</h2>
<p><code>PythonTool</code> 使用 GraalVM polyglot 在沙箱环境中执行 Python 代码。这个工具允许 AI 代理执行 Python 代码片段并获取结果。</p>
<h3 id="依赖配置">依赖配置:</h3>
<p>使用Maven添加依赖:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">&lt;</span><span class="n">dependency</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="n">groupId</span><span class="o">&gt;</span><span class="n">com</span><span class="o">.</span><span class="n">alibaba</span><span class="o">.</span><span class="n">cloud</span><span class="o">.</span><span class="n">ai</span><span class="o">&lt;/</span><span class="n">groupId</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="n">artifactId</span><span class="o">&gt;</span><span class="n">spring</span><span class="o">-</span><span class="n">ai</span><span class="o">-</span><span class="n">alibaba</span><span class="o">-</span><span class="n">starter</span><span class="o">-</span><span class="k">tool</span><span class="o">-</span><span class="n">calling</span><span class="o">-</span><span class="n">python</span><span class="o">&lt;/</span><span class="n">artifactId</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="o">&lt;</span><span class="n">version</span><span class="o">&gt;$</span><span class="p">{</span><span class="n">version</span><span class="p">}</span><span class="o">&lt;/</span><span class="n">version</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="o">&lt;/</span><span class="n">dependency</span><span class="o">&gt;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>注意</strong>：Python Tool 需要 GraalVM polyglot 依赖，这些依赖已作为可选依赖包含。如果需要使用，请确保 GraalVM polyglot 在 classpath 中。</p>
<h3 id="自动配置">自动配置</h3>
<p>Python Tool默认启用,会自动注册为ToolCallback并可供AI代理使用,如果需要禁用,可以在配置文件中设置</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">spring</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">	<span class="n">ai</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">alibaba</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">python</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">tool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">					<span class="n">enabled</span><span class="p">:</span> <span class="bp">false</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="基本使用">基本使用</h3>
<h4 id="示例1在chatclient中使用">示例1:在ChatClient中使用</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">com</span><span class="o">.</span><span class="n">alibaba</span><span class="o">.</span><span class="n">cloud</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">agent</span><span class="o">.</span><span class="n">python</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">PythonTool</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ChatClient</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">ChatModel</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">beans</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">annotation</span><span class="o">.</span><span class="n">Autowired</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">stereotype</span><span class="o">.</span><span class="n">Service</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">@</span><span class="n">Service</span>
</span></span><span class="line"><span class="cl"><span class="n">public</span> <span class="k">class</span> <span class="n">PythonToolService</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="err">@</span><span class="n">Autowired</span>
</span></span><span class="line"><span class="cl">    <span class="n">private</span> <span class="n">ChatModel</span> <span class="n">chatModel</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="err">@</span><span class="n">Autowired</span>
</span></span><span class="line"><span class="cl">    <span class="n">private</span> <span class="n">PythonTool</span> <span class="n">pythonTool</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">public</span> <span class="ne">String</span> <span class="n">executeCalculation</span><span class="p">(</span><span class="ne">String</span> <span class="n">question</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="o">//</span> <span class="err">创建</span> <span class="n">ChatClient</span> <span class="err">并添加</span> <span class="n">Python</span> <span class="n">Tool</span>
</span></span><span class="line"><span class="cl">        <span class="n">ChatClient</span> <span class="n">chatClient</span> <span class="o">=</span> <span class="n">ChatClient</span><span class="o">.</span><span class="n">builder</span><span class="p">(</span><span class="n">chatModel</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">tools</span><span class="p">(</span><span class="n">pythonTool</span><span class="o">.</span><span class="n">createPythonToolCallback</span><span class="p">(</span><span class="n">PythonTool</span><span class="o">.</span><span class="n">DESCRIPTION</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">build</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="o">//</span> <span class="err">使用工具进行对话</span>
</span></span><span class="line"><span class="cl">        <span class="ne">String</span> <span class="n">response</span> <span class="o">=</span> <span class="n">chatClient</span><span class="o">.</span><span class="n">prompt</span><span class="p">(</span><span class="n">question</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">call</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">content</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">response</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="示例2直接使用pythontool">示例2:直接使用PythonTool</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">com</span><span class="o">.</span><span class="n">alibaba</span><span class="o">.</span><span class="n">cloud</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">agent</span><span class="o">.</span><span class="n">python</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">PythonTool</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">ToolContext</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">public</span> <span class="k">class</span> <span class="n">DirectPythonToolUsage</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">public</span> <span class="n">void</span> <span class="n">executePythonCode</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">PythonTool</span> <span class="n">pythonTool</span> <span class="o">=</span> <span class="n">new</span> <span class="n">PythonTool</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="o">//</span> <span class="err">创建请求</span>
</span></span><span class="line"><span class="cl">        <span class="n">PythonTool</span><span class="o">.</span><span class="n">PythonRequest</span> <span class="n">request</span> <span class="o">=</span> <span class="n">new</span> <span class="n">PythonTool</span><span class="o">.</span><span class="n">PythonRequest</span><span class="p">(</span><span class="s2">&#34;2 + 2&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="o">//</span> <span class="err">执行</span> <span class="n">Python</span> <span class="err">代码</span>
</span></span><span class="line"><span class="cl">        <span class="ne">String</span> <span class="n">result</span> <span class="o">=</span> <span class="n">pythonTool</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">new</span> <span class="n">ToolContext</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="n">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="s2">&#34;Result: &#34;</span> <span class="o">+</span> <span class="n">result</span><span class="p">);</span> <span class="o">//</span> <span class="err">输出</span><span class="p">:</span> <span class="n">Result</span><span class="p">:</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="示例3执行复杂计算">示例3:执行复杂计算</h4>
<p>还是通过在client中调用PythonTool</p>
<h4 id="示例4字符串操作">示例4:字符串操作</h4>
<p>类似于示例2:创建request,调用apply(request,toolcontext)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl">  <span class="n">PythonTool</span><span class="o">.</span><span class="n">PythonRequest</span> <span class="n">request1</span> <span class="o">=</span> <span class="n">new</span> <span class="n">PythonTool</span><span class="o">.</span><span class="n">PythonRequest</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;&#39;Hello, &#39; + &#39;World&#39;&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="ne">String</span> <span class="n">result1</span> <span class="o">=</span> <span class="n">pythonTool</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">request1</span><span class="p">,</span> <span class="n">toolContext</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="示例5在spring-boot应用中使用">示例5:在Spring Boot应用中使用</h4>
<p>类似于示例1
创建client并将PythonTool写入,只是这里的1应用场景是Spring Boot</p>
<h4 id="示例6自定义toolcallback">示例6:自定义ToolCallback</h4>
<p>(来你告诉我这不是在Spring Boot里面运行吗?)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">com</span><span class="o">.</span><span class="n">alibaba</span><span class="o">.</span><span class="n">cloud</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">agent</span><span class="o">.</span><span class="n">python</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">PythonTool</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">ToolCallback</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">annotation</span><span class="o">.</span><span class="n">Bean</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">context</span><span class="o">.</span><span class="n">annotation</span><span class="o">.</span><span class="n">Configuration</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">@</span><span class="n">Configuration</span>
</span></span><span class="line"><span class="cl"><span class="n">public</span> <span class="k">class</span> <span class="n">PythonToolConfiguration</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="err">@</span><span class="n">Bean</span>
</span></span><span class="line"><span class="cl">    <span class="n">public</span> <span class="n">PythonTool</span> <span class="n">pythonTool</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">new</span> <span class="n">PythonTool</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="err">@</span><span class="n">Bean</span>
</span></span><span class="line"><span class="cl">    <span class="n">public</span> <span class="n">ToolCallback</span> <span class="n">pythonToolCallback</span><span class="p">(</span><span class="n">PythonTool</span> <span class="n">pythonTool</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">PythonTool</span><span class="o">.</span><span class="n">createPythonToolCallback</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="s2">&#34;执行 Python 代码并返回结果。支持数学计算、字符串处理、列表操作等。&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="示例7多工具组合使用">示例7:多工具组合使用</h4>
<p>PythonTool和其他Tool一起调用,看看就好,也是创建client并添加tools,这次是多个</p>
<h3 id="安全特性">安全特性:</h3>
<p>PythonTool在沙箱环境中运行,具有以下的安全限制</p>
<ul>
<li>文件I/O已禁用:无法读写文件</li>
<li>本地访问已禁用:无法访问本地系统资源</li>
<li>进程创建已禁用:无法创建新的进程</li>
<li>默认限制所有访问:所有访问受限</li>
</ul>
<p>保证了Python代码执行的安全性</p>
<h3 id="支持的数据类型">支持的数据类型</h3>
<ul>
<li>字符串:直接返回</li>
<li>数字:转化为字符串返回</li>
<li>布尔值:转化为字符串返回</li>
<li>数组/列表:转化为字符串表现形式</li>
<li>其他类型:使用toString()方法转换</li>
</ul>
<h3 id="注意事项">注意事项</h3>
<ol>
<li><strong>GraalVM 依赖</strong>：确保 GraalVM polyglot 依赖在 classpath 中</li>
<li><strong>性能考虑</strong>：每次执行都会创建新的 Context，对于频繁调用可能需要优化</li>
<li><strong>错误处理</strong>：代码执行错误会被捕获并返回错误消息</li>
<li><strong>代码限制</strong>：由于安全限制，某些 Python 功能可能不可用</li>
<li><strong>资源管理</strong>：Context 会自动关闭，无需手动管理</li>
</ol>
<h3 id="一个完整的示例ai代理使用python-tool">一个完整的示例:AI代理使用Python Tool:</h3>
<p>eee,这算哪门子示例,好吧也算</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">import</span> <span class="n">com</span><span class="o">.</span><span class="n">alibaba</span><span class="o">.</span><span class="n">cloud</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">agent</span><span class="o">.</span><span class="n">python</span><span class="o">.</span><span class="k">tool</span><span class="o">.</span><span class="n">PythonTool</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ChatClient</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">ai</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">ChatModel</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">import</span> <span class="n">org</span><span class="o">.</span><span class="n">springframework</span><span class="o">.</span><span class="n">stereotype</span><span class="o">.</span><span class="n">Service</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">@</span><span class="n">Service</span>
</span></span><span class="line"><span class="cl"><span class="n">public</span> <span class="k">class</span> <span class="n">PythonToolAgentService</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">private</span> <span class="n">final</span> <span class="n">ChatClient</span> <span class="n">chatClient</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">public</span> <span class="n">PythonToolAgentService</span><span class="p">(</span><span class="n">ChatModel</span> <span class="n">chatModel</span><span class="p">,</span> <span class="n">PythonTool</span> <span class="n">pythonTool</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">this</span><span class="o">.</span><span class="n">chatClient</span> <span class="o">=</span> <span class="n">ChatClient</span><span class="o">.</span><span class="n">builder</span><span class="p">(</span><span class="n">chatModel</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">tools</span><span class="p">(</span><span class="n">pythonTool</span><span class="o">.</span><span class="n">createPythonToolCallback</span><span class="p">(</span><span class="n">PythonTool</span><span class="o">.</span><span class="n">DESCRIPTION</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">build</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">public</span> <span class="ne">String</span> <span class="n">solveMathProblem</span><span class="p">(</span><span class="ne">String</span> <span class="n">problem</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="ne">String</span> <span class="n">prompt</span> <span class="o">=</span> <span class="ne">String</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">            请使用 Python 工具解决以下数学问题：
</span></span></span><span class="line"><span class="cl"><span class="s2">            </span><span class="si">%s</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">            
</span></span></span><span class="line"><span class="cl"><span class="s2">            请展示计算过程。
</span></span></span><span class="line"><span class="cl"><span class="s2">            &#34;&#34;&#34;</span><span class="p">,</span> <span class="n">problem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">chatClient</span><span class="o">.</span><span class="n">prompt</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">call</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">content</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">public</span> <span class="ne">String</span> <span class="n">analyzeData</span><span class="p">(</span><span class="ne">String</span> <span class="n">dataDescription</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="ne">String</span> <span class="n">prompt</span> <span class="o">=</span> <span class="ne">String</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">            请使用 Python 工具分析以下数据：
</span></span></span><span class="line"><span class="cl"><span class="s2">            </span><span class="si">%s</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">            
</span></span></span><span class="line"><span class="cl"><span class="s2">            请计算基本统计信息（平均值、中位数、标准差等）。
</span></span></span><span class="line"><span class="cl"><span class="s2">            &#34;&#34;&#34;</span><span class="p">,</span> <span class="n">dataDescription</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">chatClient</span><span class="o">.</span><span class="n">prompt</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">call</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">            <span class="o">.</span><span class="n">content</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="支持的拓展实现">支持的拓展实现:</h3>
<p><a href="https://java2ai.com/integration/toolcalls/tool-calls#%E7%9B%AE%E5%BD%95">https://java2ai.com/integration/toolcalls/tool-calls#%E7%9B%AE%E5%BD%95</a>
自己去这里看</p>
<h3 id="使用说明">使用说明</h3>
<p>所有的Tool Calling实现都遵循相同的使用模式</p>
<ol>
<li>添加依赖:在pom.xml或者build.gradle中添加相应的依赖</li>
<li>自动配置:Spring Boot的生态真实太好用了,你们知道吗?<strong>会自动注册为ToolCallback</strong></li>
<li>在Chatclient中使用:通过ChatClient.builder().tools()添加工具</li>
<li>AI模型调用:AI模型会根据会话内容自动决定是否调用工具</li>
</ol>
<h3 id="通用接口">通用接口</h3>
<p>你这么好用你不早说?</p>
<p>所有 Tool 都实现了 <code>BiFunction&lt;Request, ToolContext, String&gt;</code> 接口，并通过 <code>FunctionToolCallback</code> 包装为 <code>ToolCallback</code>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">interface</span> <span class="nc">ToolCallback</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">String</span><span class="w"> </span><span class="nf">getName</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">String</span><span class="w"> </span><span class="nf">getDescription</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">ToolResponse</span><span class="w"> </span><span class="nf">call</span><span class="p">(</span><span class="n">ToolRequest</span><span class="w"> </span><span class="n">request</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="配置说明">配置说明</h3>
<p>大多数工具都支持通过Spring Boot配置属性进行配置(又是你宝宝)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">spring</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">ai</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">alibaba</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">      <span class="k">tool</span><span class="o">-</span><span class="n">name</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">enabled</span><span class="p">:</span> <span class="bp">true</span>  <span class="c1"># 启用/禁用工具</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 其他工具特定配置</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="认证和api-key">认证和API key</h3>
<p>参考各个工具的文档</p>
<h3 id="最佳实践">最佳实践</h3>
<ol>
<li><strong>工具选择</strong>：根据实际需求选择合适的工具，避免添加不必要的工具</li>
<li><strong>错误处理</strong>：工具调用可能失败，确保有适当的错误处理机制</li>
<li><strong>性能优化</strong>：对于频繁调用的工具，考虑缓存结果</li>
<li><strong>安全性</strong>：确保 API Key 等敏感信息的安全存储</li>
<li><strong>成本控制</strong>：某些工具（如搜索、翻译）可能产生费用，注意使用量</li>
</ol>
]]></content:encoded>
    </item>
  </channel>
</rss>
