聂文 發表於 2026-1-23 20:51:00

Spring AI学习:工具调用实践(基于和风天气api)

<h2>工具调用总体实现:</h2>
<h3>设计工具类:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Component
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> WeatherInquiryTools {

    @Autowired
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> WeatherService weatherService;

    @Tool(description </span>= "根据城市名称查询城市LocationID"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> String getLocationId(@ToolParam(description = "城市名称"<span style="color: rgba(0, 0, 0, 1)">) String cityName){
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> weatherService.getLocationId(cityName).getLocation().get(0<span style="color: rgba(0, 0, 0, 1)">).getId();
    }

    @Tool(description </span>= "根据城市LocationID查询实时温度"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> String getWeather(@ToolParam(description = "城市LocationID"<span style="color: rgba(0, 0, 0, 1)">) String locationId){
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> weatherService.getWeather(locationId).getNow().getTemp();
    }
}</span></pre>
</div>
<h3>将工具交给ai客户端:</h3>
<p><img src="https://img2024.cnblogs.com/blog/3291169/202601/3291169-20260123203112441-504854232.png"></p>
<h3>&nbsp;对话测试:</h3>
<p><img src="https://img2024.cnblogs.com/blog/3291169/202601/3291169-20260123203215345-1510381793.png"></p>
<h2>&nbsp;具体实现:</h2>
<h3>实体类:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@NoArgsConstructor
@AllArgsConstructor
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> WeatherResponse {
    @JsonProperty(</span>"code"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String code;

    @JsonProperty(</span>"updateTime"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String updateTime;

    @JsonProperty(</span>"fxLink"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String fxLink;

    @JsonProperty(</span>"now"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> NowData now;

    @JsonProperty(</span>"refer"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Refer refer;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Data
@AllArgsConstructor
@NoArgsConstructor
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> NowData {

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 观测时间</span>
    @JsonProperty("obsTime"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String obsTime;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 温度,单位:摄氏度</span>
    @JsonProperty("temp"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String temp;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 体感温度,单位:摄氏度</span>
    @JsonProperty("feelsLike"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String feelsLike;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 天气图标代码</span>
    @JsonProperty("icon"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String icon;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 天气描述</span>
    @JsonProperty("text"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String text;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 风向360角度</span>
    @JsonProperty("wind360"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String wind360;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 风向</span>
    @JsonProperty("windDir"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String windDir;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 风力等级</span>
    @JsonProperty("windScale"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String windScale;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 风速,单位:公里/小时</span>
    @JsonProperty("windSpeed"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String windSpeed;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 相对湿度,单位:%</span>
    @JsonProperty("humidity"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String humidity;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 降水量,单位:毫米</span>
    @JsonProperty("precip"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String precip;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 大气压强,单位:百帕</span>
    @JsonProperty("pressure"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String pressure;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 能见度,单位:公里</span>
    @JsonProperty("vis"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String vis;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云量,单位:%</span>
    @JsonProperty("cloud"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String cloud;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">露点温度,单位:摄氏度</span>
    @JsonProperty("dew"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String dew;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@NoArgsConstructor
@AllArgsConstructor
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> LocationResponse {

    @JsonProperty(</span>"code"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String code;

    @JsonProperty(</span>"location"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> List&lt;Location&gt;<span style="color: rgba(0, 0, 0, 1)"> location;

    @JsonProperty(</span>"refer"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Refer refer;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@AllArgsConstructor
@NoArgsConstructor
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Location {

    @JsonProperty(</span>"name"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String name;

    @JsonProperty(</span>"id"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String id;

    @JsonProperty(</span>"lat"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String lat;

    @JsonProperty(</span>"lon"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String lon;

    @JsonProperty(</span>"adm2"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String adm2;

    @JsonProperty(</span>"adm1"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String adm1;

    @JsonProperty(</span>"country"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String country;

    @JsonProperty(</span>"tz"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String timezone;

    @JsonProperty(</span>"utcOffset"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String utcOffset;

    @JsonProperty(</span>"isDst"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String isDst;

    @JsonProperty(</span>"type"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String type;

    @JsonProperty(</span>"rank"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String rank;

    @JsonProperty(</span>"fxLink"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String fxLink;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@NoArgsConstructor
@AllArgsConstructor
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Refer {

    @JsonProperty(</span>"sources"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> List&lt;String&gt;<span style="color: rgba(0, 0, 0, 1)"> sources;

    @JsonProperty(</span>"license"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> List&lt;String&gt;<span style="color: rgba(0, 0, 0, 1)"> license;
}</span></pre>
</div>
<p>以上实体类基于 <strong>和风天气api</strong> 设计。</p>
<h3>配置类:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Component
@Data
@ConfigurationProperties(prefix </span>= "frog.weather"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> WeatherProperties {

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String apiKey;

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String apiHost;
}<br></span></pre>
</div>
<p>以上配置类基于&nbsp;<strong>和风天气api</strong>&nbsp;设计。</p>
<h3><strong>序列化与反序列化工具类:</strong></h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Component
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> JasonUtils {

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">final</span> ObjectMapper mapper = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ObjectMapper()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
            .setSerializationInclusion(JsonInclude.Include.NON_NULL)
            .registerModule(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> JavaTimeModule());

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> String toJson(Object obj) {
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mapper.writeValueAsString(obj);
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (JsonProcessingException e) {
            </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> RuntimeException("序列化失败"<span style="color: rgba(0, 0, 0, 1)">, e);
      }
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> &lt;T&gt; T fromJson(String json, Class&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> clazz) {
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mapper.readValue(json, clazz);
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (JsonProcessingException e) {
            </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> RuntimeException("反序列化失败"<span style="color: rgba(0, 0, 0, 1)">, e);
      }
    }
}</span></pre>
</div>
<h3>查询功能具体实现:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Service
@Slf4j
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> WeatherServiceImpl <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> WeatherService {

    @Autowired
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> WeatherProperties weatherProperties;

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 根据城市LocationID查询实时天气状况
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> WeatherResponse getWeather(String locationId) {
      HttpClient client </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpClient.newHttpClient();
      String apiUrl </span>= weatherProperties.getApiHost() + "/v7/weather/now?location=" +<span style="color: rgba(0, 0, 0, 1)"> locationId;
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            HttpRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpRequest.newBuilder()
                  .uri(URI.create(apiUrl))
                  .header(</span>"X-QW-Api-Key"<span style="color: rgba(0, 0, 0, 1)">, weatherProperties.getApiKey())
                  .GET()
                  .build();
            HttpResponse</span>&lt;<span style="color: rgba(0, 0, 255, 1)">byte</span>[]&gt; response =<span style="color: rgba(0, 0, 0, 1)"> client.send(request, HttpResponse.BodyHandlers.ofByteArray());
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] compressedBody =<span style="color: rgba(0, 0, 0, 1)"> response.body();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 解压缩响应体</span>
            String decompressedBody =<span style="color: rgba(0, 0, 0, 1)"> GzipDecompressor.decompressToString(compressedBody);
            log.info(</span>"查询天气成功, locationId: {}"<span style="color: rgba(0, 0, 0, 1)">, locationId);
            WeatherResponse weatherResponse </span>= JasonUtils.fromJson(decompressedBody, WeatherResponse.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> weatherResponse;
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
            log.error(</span>"查询天气失败, locationId: {}"<span style="color: rgba(0, 0, 0, 1)">, locationId, e);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
   * 根据城市名称查询城市LocationID
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> LocationResponse getLocationId(String cityName) {
      HttpClient client </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpClient.newHttpClient();
      String apiUrl </span>= weatherProperties.getApiHost() + "/geo/v2/city/lookup?location=" +<span style="color: rgba(0, 0, 0, 1)"> cityName;
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            HttpRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpRequest.newBuilder()
                  .uri(URI.create(apiUrl))
                  .header(</span>"X-QW-Api-Key"<span style="color: rgba(0, 0, 0, 1)">, weatherProperties.getApiKey())
                  .GET()
                  .build();
            HttpResponse</span>&lt;<span style="color: rgba(0, 0, 255, 1)">byte</span>[]&gt; response =<span style="color: rgba(0, 0, 0, 1)"> client.send(request, HttpResponse.BodyHandlers.ofByteArray());
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] compressedBody =<span style="color: rgba(0, 0, 0, 1)"> response.body();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 解压缩响应体</span>
            String decompressedBody =<span style="color: rgba(0, 0, 0, 1)"> GzipDecompressor.decompressToString(compressedBody);
            log.info(</span>"查询城市LocationID成功, cityName: {}"<span style="color: rgba(0, 0, 0, 1)">, cityName);
            LocationResponse locationResponse </span>= JasonUtils.fromJson(decompressedBody, LocationResponse.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> locationResponse;
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
            log.error(</span>"查询城市LocationID失败, cityName: {}"<span style="color: rgba(0, 0, 0, 1)">, cityName, e);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
}</span></pre>
</div>
<p>目前实现的tool查询功能局限温度查询,但根据工具需求可拓展(service返回了所有查询所得,tool内对数据重新整理可以产生丰富功能)。</p><br><br>
来源:https://www.cnblogs.com/syf0824/p/19523990
頁: [1]
查看完整版本: Spring AI学习:工具调用实践(基于和风天气api)