当前位置: 首页 > news >正文

【未解决】Spring AI 1.0.0-M6 使用 Tool Calling 报错,请求破解之法

1.报错

2.Java 代码

2.1 pom.xml

    <dependencyManagement><dependencies><!-- Spring AI --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M6</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- Spring Ai OpenAI 模型依赖 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency>

2.2 application.yml

spring:ai:openai:base-url: https://dashscope.aliyuncs.com/compatible-mode  # 默认使用 v1 版本号,如果添加会变成 /compatible-mode/v1/v1api-key: xxxxchat:options:model: qwen-max   # 模型名称temperature: 0.8  # 模型温度,值越大,输出结果越随机

2.3 Config-配置类

package com.dragon.springboot3vue3.config;import com.dragon.springboot3vue3.tools.LogoutTools;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class OpenAIConfig {@Autowiredprivate LogoutTools logoutTools;/*** 配置会话存储方式* @return*/@Beanpublic ChatMemory chatMemory() {return new InMemoryChatMemory(); // 将历史会话临时存储在应用内存中(重启应用后数据丢失)。生产环境需要持久化存储(如 Redis、数据库)}@Beanpublic ChatClient chatClient(OpenAiChatModel model, ChatMemory chatMemory) {return ChatClient.builder(model).defaultSystem("""你是韶君,一个温柔可爱机智的智能助手。请:1.使用自然语言回答问题2.如果涉及到数学计算,使用标准数学符号(如+、-、×、÷)回答,示例格式:"18 ÷ 6 = 3"""").defaultAdvisors(new SimpleLoggerAdvisor(),                // 配置日志 Advisor,需在 yml 开启日志级别(默认:debug)new MessageChatMemoryAdvisor(chatMemory)  // 配置会话记忆).defaultTools(logoutTools)  // Tool Calling.build();}}

2.4 Controller

package com.dragon.springboot3vue3.controller;import cn.dev33.satoken.util.SaResult;
import com.dragon.springboot3vue3.controller.dto.entityDto.ChatDto;
import com.dragon.springboot3vue3.tools.LogoutTools;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import java.util.List;@Tag(name = "Spring AI 对话接口")
@RestController
@RequestMapping("/aiConversation")
public class AiConversationController {@Autowiredprivate ChatClient chatClient;/*** 流式输出(要设置流式输出格式)*/@Operation(summary = "对话")@PostMapping(value = "/conversation",produces = "text/html;charset=utf-8")public Flux<String> chatClient(@RequestBody ChatDto chatDto) {return chatClient.prompt().user(chatDto.getPrompt()).advisors(item -> item.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, chatDto.getConversationId())) // 将会话ID,添加到AdvisorsContext上下文.stream().content();}
}

2.5 LogoutTools

package com.dragon.springboot3vue3.tools;import cn.dev33.satoken.util.SaResult;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Component;@Component
public class LogoutTools {@Tool(name = "userLogout",description = "退出当前登录")public SaResult userLogout() {System.out.println("退出ing"); // 能输出“退出ing”,但是后续报错return SaResult.ok("退出成功");}
}

 

相关文章:

  • 关于汽车辅助驾驶不同等级、技术对比、传感器差异及未来发展方向的详细分析
  • Java Spring Cloud框架使用及常见问题
  • 超融合监控 | SmartX监控解析
  • 中间件--ClickHouse-5--架构设计(分布式架构,列式压缩存储、并行计算)
  • FP3:机器人操作的3D基础策略
  • 常见的 API 设计风格
  • 列表、字符串、heapq堆对列算法
  • windows10 wsl2 安装ubuntu和docker
  • 中间件--ClickHouse-6--SQL基础(类似Mysql,存在差异)
  • 【Linux】系统入门
  • cursor AI编辑器的详细使用
  • 深度解析 Vue 项目 Webpack 分包与合包 一文读懂
  • Hadoop数据压缩教程
  • 深入理解栈数据结构:从基础概念到高级应用
  • Dify简介:从架构到部署与应用解析
  • go的json unmarshal和 k8s的deepcopy对比
  • 数据结构:最小生成树的普里姆算法和克鲁斯卡尔算法
  • 记录学习的第二十六天
  • 【ISP】AWB的基本原理介绍(基于灰度像素检测)
  • 【数据结构 · 初阶】- 带头双向循环链表
  • wordpress文章页幻灯片/企业整站优化
  • 网站注册系统用什么做/交换友情链接的意义是什么
  • 微官网和公众号的区别/奇零seo赚钱培训
  • 绵阳网站建设维护/今天合肥刚刚发生的重大新闻
  • 在大学做网站/房地产估价师考试
  • 威县做网站哪里好/小时seo加盟