【非常记载Java-20250204】调用讯飞星火AI(Spark lite 版本)Api 授权错误 ...

打印 上一主题 下一主题

主题 658|帖子 658|积分 1974

题目重现



  • 依靠
    1. <!--讯飞开放平台sdk-->
    2. <dependency>
    3.     <groupId>io.github.briqt</groupId>
    4.     <artifactId>xunfei-spark4j</artifactId>
    5.     <version>1.3.0</version>
    6. </dependency>
    复制代码
  • yml配置文件
    1. # 讯飞Api配置
    2. xunfei:
    3.   client:
    4.     appId: "别只顾着抄,这里要写自己的"
    5.     apiKey: "别只顾着抄,这里要写自己的"
    6.     apiSecret: "别只顾着抄,这里要写自己的"
    复制代码
  • SparkConfig 配置类
    1. @Configuration
    2. @ConfigurationProperties(prefix = "xunfei.client")
    3. @Data
    4. public class SparkConfig {
    5.     private String appid;
    6.     private String apiKey;
    7.     private String apiSecret;
    8.     @Bean
    9.     public SparkClient sparkClient() {
    10.         SparkClient sparkClient = new SparkClient();
    11.         sparkClient.appid = this.appid;
    12.         sparkClient.apiKey = this.apiKey;
    13.         sparkClient.apiSecret = this.apiSecret;
    14.         return sparkClient;
    15.     }
    16. }
    复制代码
  • SparkManager 实现类
    1. @Component
    2. @Slf4j
    3. public class SparkManager {
    4.     @Resource
    5.     private SparkClient sparkClient;
    6.     /**
    7.      * AI生成问题的预设条件
    8.      */
    9.     public static final  String PRECONDITION = "" +
    10.             "你是一名Java程序员\n" +
    11.             "给我一些软件开发方面的知识\n";
    12.     public String sendHttpToSpark(final String content){
    13.         // 消息列表,可以再此列表添加历史对话记录
    14.         List<SparkMessage> messages = new ArrayList<>();
    15.         messages.add(SparkMessage.systemContent(PRECONDITION));
    16.         // 用户输入内容
    17.         messages.add(SparkMessage.userContent(content));
    18.         // 构造请求
    19.         SparkRequest sparkRequest = SparkRequest.builder()
    20.                 // 指定请求版本,lite为V1_5
    21.                 .apiVersion(SparkApiVersion.V1_5)
    22.                 .messages(messages)     // 消息列表
    23.                 .build();
    24.         // 同步调用
    25.         SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
    26.         String responseContent = chatResponse.getContent();
    27.         log.info("spark返回内容:{}",responseContent);
    28.         return responseContent;
    29.     }
    30. }
    复制代码
    可以到讯飞星火官网免费领取不限量的免费AI

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


  • 测试代码
  1. @SpringBootTest
  2. public class SparkManagerTest {
  3.     @Resource
  4.     private SparkManager sparkManager;
  5.     private final String userInput = "如何调用api";
  6.     @Test
  7.     public void testApi(){
  8.         String result = sparkManager.sendHttpToSpark(userInput);
  9.         System.out.println(result);
  10.     }
  11. }
复制代码


  • 报错截图

题目处置惩罚

一开始我怀疑的是本身的配置出了题目,但CV大法除了CV错地方外,还能怎么错呢?
刚好讯飞星火提供了免费的Spark Lite的同时,还赠送了不少Spark4.0 Uitra的token数,刚好可以拿来做验证

修改指定请求版本
  1. public String sendHttpToSpark(final String content){
  2.     List<SparkMessage> messages = new ArrayList<>();
  3.     messages.add(SparkMessage.systemContent(PRECONDITION));
  4.     messages.add(SparkMessage.userContent(content));
  5.     SparkRequest sparkRequest = SparkRequest.builder()
  6.             // 修改指定请求版本为4_0,其对应4.0Ultra
  7.             .apiVersion(SparkApiVersion.V4_0)
  8.             .messages(messages)   
  9.             .build();
  10.     SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
  11.     String responseContent = chatResponse.getContent();
  12.     log.info("spark返回内容:{}",responseContent);
  13.     return responseContent;
  14. }
复制代码
此时再运行测试代码可正常获取返回内容

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

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

需要注意的是,SparkApiVersion类中的构造方法是私有的,无法直接设值,所以我采用的是使用反射去修改值(不保举,但这不对外,仅是学习AI才使用该方法;如有更好的方法,烦请告知)
编写EnumReflectionUtil工具类,用于修改枚举值
  1. public class EnumReflectionUtil {
  2.     public static void setEnumField(Enum<?> enumConstant, String fieldName, Object newValue) throws Exception {
  3.         Field field = enumConstant.getClass().getDeclaredField(fieldName);
  4.         field.setAccessible(true);
  5.         field.set(enumConstant, newValue);
  6.     }
  7. }
复制代码
修改SparkManager类
  1. @Component
  2. @Slf4j
  3. public class SparkManager {
  4.     @Resource
  5.     private SparkClient sparkClient;
  6.     @PostConstruct
  7.     public void init(){
  8.         try {
  9.             // 修改 V1_5 的版本信息
  10.             EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "version", "v1.1");
  11.             EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "url", "https://spark-api.xf-yun.com/v1.1/chat");
  12.             EnumReflectionUtil.setEnumField(SparkApiVersion.V1_5, "domain", "lite");
  13.         } catch (Exception e) {
  14.             log.error("尝试修改枚举字段异常:", e);
  15.         }
  16.     }
  17.     /**
  18.      * AI生成问题的预设条件
  19.      */
  20.     public static final  String PRECONDITION = "" +
  21.             "你是一名Java程序员\n" +
  22.             "给我一些软件开发方面的知识\n";
  23.     public String sendHttpToSpark(final String content){
  24.         // 消息列表,可以再此列表添加历史对话记录
  25.         List<SparkMessage> messages = new ArrayList<>();
  26.         messages.add(SparkMessage.systemContent(PRECONDITION));
  27.         // 用户输入内容
  28.         messages.add(SparkMessage.userContent(content));
  29.         // 构造请求
  30.         SparkRequest sparkRequest = SparkRequest.builder()
  31.                 // 此时SparkApiVersion.V1_5的内容为修改后的内容
  32.                 .apiVersion(SparkApiVersion.V1_5)
  33.                 .messages(messages)     // 消息列表
  34.                 .build();
  35.         // 同步调用
  36.         SparkSyncChatResponse chatResponse = sparkClient.chatSync(sparkRequest);
  37.         String responseContent = chatResponse.getContent();
  38.         log.info("spark返回内容:{}",responseContent);
  39.         return responseContent;
  40.     }
  41. }
复制代码
此时再运行测试代码可正常获取返回内容,且增加的是Spark Lite的token数而非Spark4.0的,说明调用的是Spark Lite 无误


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表