IT评测·应用市场-qidao123.com

标题: 【非常记载Java-20250204】调用讯飞星火AI(Spark lite 版本)Api 授权错误题目处置惩罚 [打印本页]

作者: 星球的眼睛    时间: 2025-3-23 21:09
标题: 【非常记载Java-20250204】调用讯飞星火AI(Spark lite 版本)Api 授权错误题目处置惩罚
题目重现


完成以上步骤后,不出意外的话就能正常通过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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4