【异常记录Java-20250204】调用讯飞星火AI(Spark lite 版本)Api 授权错误问题处理

ops/2025/2/6 3:59:14/

问题重现

  • 依赖

    <!--讯飞开放平台sdk-->
    <dependency><groupId>io.github.briqt</groupId><artifactId>xunfei-spark4j</artifactId><version>1.3.0</version>
    </dependency>
    
  • yml配置文件

    # 讯飞Api配置
    xunfei:client:appId: "别只顾着抄,这里要写自己的"apiKey: "别只顾着抄,这里要写自己的"apiSecret: "别只顾着抄,这里要写自己的"
    
  • SparkConfig 配置类

    java">@Configuration
    @ConfigurationProperties(prefix = "xunfei.client")
    @Data
    public class SparkConfig {private String appid;private String apiKey;private String apiSecret;@Beanpublic SparkClient sparkClient() {SparkClient sparkClient = new SparkClient();sparkClient.appid = this.appid;sparkClient.apiKey = this.apiKey;sparkClient.apiSecret = this.apiSecret;return sparkClient;}
    }
    
  • SparkManager 实现类

    java">@Component
    @Slf4j
    public class SparkManager {@Resourceprivate SparkClient sparkClient;/*** AI生成问题的预设条件*/public static final  String PRECONDITION = "" +"你是一名Java程序员\n" +"给我一些软件开发方面的知识\n";public String sendHttpToSpark(final String content){// 消息列表,可以再此列表添加历史对话记录List<SparkMessage> messages = new ArrayList<>();messages.add(SparkMessage.systemContent(PRECONDITION));// 用户输入内容messages.add(SparkMessage.userContent(content));// 构造请求SparkRequest sparkRequest = SparkRequest.builder()// 指定请求版本,lite为V1_5.apiVersion(SparkApiVersion.V1_5).messages(messages)     // 消息列表.build();// 同步调用SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);String responseContent = chatResponse.getContent();log.info("spark返回内容:{}",responseContent);return responseContent;}
    }
    

    可以到讯飞星火官网免费领取不限量的免费AI

    在这里插入图片描述

完成以上步骤后,不出意外的话就能正常通过java代码调用Spark lite 的API进行 AI 对话,但遗憾的是出了意外

  • 测试代码
java">@SpringBootTest
public class SparkManagerTest {@Resourceprivate SparkManager sparkManager;private final String userInput = "如何调用api";@Testpublic void testApi(){String result = sparkManager.sendHttpToSpark(userInput);System.out.println(result);}
}
  • 报错截图

在这里插入图片描述

问题处理

一开始我怀疑的是自己的配置出了问题,但CV大法除了CV错地方外,还能怎么错呢?

刚好讯飞星火提供了免费的Spark Lite的同时,还赠送了不少Spark4.0 Uitra的token数,刚好可以拿来做验证

在这里插入图片描述

修改指定请求版本

java">public String sendHttpToSpark(final String content){List<SparkMessage> messages = new ArrayList<>();messages.add(SparkMessage.systemContent(PRECONDITION));messages.add(SparkMessage.userContent(content));SparkRequest sparkRequest = SparkRequest.builder()// 修改指定请求版本为4_0,其对应4.0Ultra.apiVersion(SparkApiVersion.V4_0).messages(messages)    .build();SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);String responseContent = chatResponse.getContent();log.info("spark返回内容:{}",responseContent);return responseContent;
}

此时再运行测试代码可正常获取返回内容

在这里插入图片描述

然后看了源码后,也算是找到 Spark Lite 授权错误的原因,API版本枚举类(SparkApiVersion.class)中lite对应的V1_5版本中的domain属性是general 而不是 lite

在这里插入图片描述

为了使用免费版本的AI(仅限学习,经济压力大,学习阶段就搞付费的承受不起),自然得想方法处理。

在这里插入图片描述

需要注意的是,SparkApiVersion类中的构造方法是私有的,无法直接设值,所以我采用的是利用反射去修改值(不推荐,但这不对外,仅是学习AI才使用该方法;如有更好的方法,烦请告知)

编写EnumReflectionUtil工具类,用于修改枚举值

java">public class EnumReflectionUtil {public static void setEnumField(Enum<?> enumConstant, String fieldName, Object newValue) throws Exception {Field field = enumConstant.getClass().getDeclaredField(fieldName);field.setAccessible(true);field.set(enumConstant, newValue);}
}

修改SparkManager类

java">@Component
@Slf4j
public class SparkManager {@Resourceprivate SparkClient sparkClient;@PostConstructpublic void init(){try {// 修改 V1_5 的版本信息EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "version", "v1.1");EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "url", "https://spark-api.xf-yun.com/v1.1/chat");EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "domain", "lite");} catch (Exception e) {log.error("尝试修改枚举字段异常:", e);}}/*** AI生成问题的预设条件*/public static final  String PRECONDITION = "" +"你是一名Java程序员\n" +"给我一些软件开发方面的知识\n";public String sendHttpToSpark(final String content){// 消息列表,可以再此列表添加历史对话记录List<SparkMessage> messages = new ArrayList<>();messages.add(SparkMessage.systemContent(PRECONDITION));// 用户输入内容messages.add(SparkMessage.userContent(content));// 构造请求SparkRequest sparkRequest = SparkRequest.builder()// 此时SparkApiVersion.V1_5的内容为修改后的内容.apiVersion(SparkApiVersion.V1_5).messages(messages)     // 消息列表.build();// 同步调用SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);String responseContent = chatResponse.getContent();log.info("spark返回内容:{}",responseContent);return responseContent;}
}

此时再运行测试代码可正常获取返回内容,且增加的是Spark Lite的token数而非Spark4.0的,说明调用的是Spark Lite 无误

在这里插入图片描述


http://www.ppmy.cn/ops/156045.html

相关文章

计算机网络笔记再战——理解几个经典的协议1

目录 前言 从协议是什么出发 关于TCP/IP协议体系 几个传输方式的分类 地址 网卡 中继器&#xff08;Repeater&#xff09; 网桥&#xff08;Bridge&#xff09; 路由器&#xff08;Router&#xff09; 网关 前言 笔者最近正在整理&#xff08;笔者开的坑不少&#xf…

第一章,信息安全概述

什么是信息&#xff1f;------信息是通过施加于数据上的某种约定而赋予这些数据的含义。 什么是信息安全&#xff1f; ISO----->数据处理系统建立和采取技术、采取技术、管理的安全保护&#xff0c;用来保护计算机硬件、软件、数据不因为偶然的或恶意的原因遭受到破环。 美…

curope python安装

目录 curope安装 测试: 报错:libc10.so: cannot open shared object file: No such file or directory 解决方法: curope安装 git clone : GitHub - Junyi42/croco at bd6f4e07d5c4f13ae5388efc052dadf142aff754 cd models/curope/ python setup.py build_ext --inplac…

电脑要使用cuda需要进行什么配置

在电脑上使用CUDA&#xff08;NVIDIA的并行计算平台和API&#xff09;&#xff0c;需要进行以下配置和准备&#xff1a; 1. 检查NVIDIA显卡支持 确保你的电脑拥有支持CUDA的NVIDIA显卡。 可以在NVIDIA官方CUDA支持显卡列表中查看显卡型号是否支持CUDA。 2. 安装NVIDIA显卡驱动…

Springboot中@Autowired和@Resource注解的区别和联系

文章目录 Springboot中Autowired和Resource注解的区别和联系一、引言二、Autowired注解1、注解来源2、工作原理3、使用示例 三、Resource注解1、注解来源2、工作原理3、使用示例 四、区别和联系1、区别2、联系 五、总结 Springboot中Autowired和Resource注解的区别和联系 一、引…

Slint的学习

Slint是什么 Slint是一个跨平台的UI工具包&#xff0c;支持windows,linux,android,ios,web&#xff0c;可以用它来构建申明式UI,后端代码支持rust,c,python,nodejs等语言。 开源地址&#xff1a;https://github.com/slint-ui/slint 镜像地址&#xff1a;https://kkgithub.com/…

UE编辑器工具

如何自己制作UE小工具提高工作效率 在虚幻编辑器用户界面中&#xff0c;可以使用各种各样的可视化工具来设置项目&#xff0c;设计和构建关卡&#xff0c;创建游戏性交互等等。但有些时候&#xff0c;当你确定了需要编辑器执行的操作后&#xff0c;可能想要通过编程方式调用它…

2 [GitHub遭遇严重供应链投毒攻击]

近日&#xff0c;有黑客针对 Discord Top.gg 的GitHub 账户发起了供应链攻击&#xff0c;此次攻击导致账户密码、凭证和其他敏感信息被盗&#xff0c;同时也影响到了大量开发人员。 Checkmarx 在一份技术报告中提到&#xff0c;黑客在这次攻击中使用了多种TTP&#xff0c;其中…