SpringBoot + 九天大模型(文生图接口)

目录

1、先到九天大模型的官网(LLM Studio)上订阅模型的推理服务,得到APIKey,后期需要使用它生成token才能调用模型的推理服务。

2、在SpringBoot项目里面的pom.xml文件中添加九天大模型的相关依赖,后面会使用到其中的一些函数。

3、 在项目中的实体类里面新建一个JiuTian.java文件,用于存储调用模型功能时必须要设置的参数。

4、 在项目的控制层中新建一个JiuTianController.java文件,编写项目的功能接口。九天大模型文生图功能有两类接口,所以我也写了两个接口。

5、 在服务层新建JiuTianService.interface文件,两个项目接口对应的两个服务接口。

6、在工具层新建JiuTianUtil.java文件,里面编写一些功能函数。

7、在服务层中的实现层中新建JiuTianServiceImpl.java文件,把上述两个接口给实现。这里参考了九天大模型官网的调用示例。

 8、在apifox接口软件中调用项目接口测试。

9、查看图片保存结果。图片挺好看的


1、先到九天大模型的官网(LLM Studio)上订阅模型的推理服务,得到APIKey,后期需要使用它生成token才能调用模型的推理服务。

2、在SpringBoot项目里面的pom.xml文件中添加九天大模型的相关依赖,后面会使用到其中的一些函数。

        <!-- 九天大模型的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt</artifactId><version>8.16</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.26</version></dependency>

3、 在项目中的实体类里面新建一个JiuTian.java文件,用于存储调用模型功能时必须要设置的参数。

public class JiuTian {//调用文生图功能时,给模型的提示语:画一条鱼private String genImgMessage;调用文生图功能时,图像保存的地址private String genImgSavePath;public String getGenImgMessage() {return genImgMessage;}public void setGenImgMessage(String genImgMessage) {this.genImgMessage = genImgMessage;}public String getGenImgSavePath() {return genImgSavePath;}public void setGenImgSavePath(String genImgSavePath) {this.genImgSavePath = genImgSavePath;}
}

4、 在项目的控制层中新建一个JiuTianController.java文件,编写项目的功能接口。九天大模型文生图功能有两类接口,所以我也写了两个接口。

import com.knowledgeBase.entity.JiuTian;
import com.knowledgeBase.permission.PassToken;
import com.knowledgeBase.service.JiuTianService;
import com.nimbusds.jose.JOSEException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/JiuTian")
public class JiuTianController {@AutowiredJiuTianService jiuTianService;@PassToken@RequestMapping(value = "/gen_img_cha", method = RequestMethod.POST)public String generate_img_Chat(@RequestBody JiuTian jiuTian) throws JOSEException {return jiuTianService.generate_img_Chat(jiuTian);}@PassToken@RequestMapping(value = "/gen_img_com", method = RequestMethod.POST)public String generate_img_Completions(@RequestBody JiuTian jiuTian) throws JOSEException {return jiuTianService.generate_img_Completions(jiuTian);}
}

5、 在服务层新建JiuTianService.interface文件,两个项目接口对应的两个服务接口。

import com.knowledgeBase.entity.JiuTian;
import com.nimbusds.jose.JOSEException;public interface JiuTianService {String generate_img_Chat(JiuTian jiuTian) throws JOSEException;String generate_img_Completions(JiuTian jiuTian) throws JOSEException;
}

6、在工具层新建JiuTianUtil.java文件,里面编写一些功能函数。

import com.alibaba.fastjson2.JSONObject;
import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;import java.time.LocalDateTime;
import java.util.Date;public class JiuTianUtils {//获取九天大模型的tokenpublic static String generateToken(String apikey,long expSeconds) throws JOSEException {String[] apikeyArr=apikey.split("\\.",2);//kid.secretDate now=new Date();JSONObject payload=new JSONObject();payload.put("api_key",apikeyArr[0]);payload.put("exp",now.getTime()/1000+expSeconds);payload.put("timestamp",now.getTime()/1000);//创建JWS对象JWSObject jwsObject = new JWSObject(new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT).build(),new Payload(payload.toJSONString()));//签名jwsObject.sign(new MACSigner(apikeyArr[1]));return jwsObject.serialize();}//获取当前时间设置成字符串public static String getNowTime(){LocalDateTime now = LocalDateTime.now();int year = now.getYear();int month = now.getMonthValue();int day = now.getDayOfMonth();int hour = now.getHour();int minute = now.getMinute();int second = now.getSecond();return year + "-" + month + "-" + day + "-" + hour + "-" + minute + "-" + second;}
}

7、在服务层中的实现层中新建JiuTianServiceImpl.java文件,把上述两个接口给实现。这里参考了九天大模型官网的调用示例。

import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.knowledgeBase.entity.JiuTian;
import com.knowledgeBase.service.JiuTianService;
import com.knowledgeBase.utils.JiuTianUtils;
import com.nimbusds.jose.JOSEException;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicReference;@Service
public class JiuTianServiceImpl implements JiuTianService {// 九天大模型的apikeyprivate static String apiKey = "到九天大模型官网订阅服务里面复制apikey";// 九天大模型的token,有效期需要设置为项目用户登录token一样的有效期private static String jwt_token = null;// 相关工具类private static JiuTianUtils jiuTianUtils = new JiuTianUtils();// 九天大模型token有效期,两天private static Integer token_time = 60 * 60 * 24 * 2;@Overridepublic String generate_img_Completions(JiuTian jiuTian) throws JOSEException {if(jwt_token == null){jwt_token = "Bearer " + jiuTianUtils.generateToken(apiKey, token_time);System.out.println("九天大模型的token已生成: " + jwt_token);}if(jiuTian.getGenImgMessage().isEmpty()){System.out.println("提示语为空!");return "提示语为空!";}if(jiuTian.getGenImgSavePath().isEmpty()){System.out.println("图片存储路径为空!");return "图片存储路径为空!";}// 构建请求体数据JSONObject obj = new JSONObject();obj.put("model", "StableDiffusion");obj.put("prompt", jiuTian.getGenImgMessage());obj.put("returnImageUrl", false);// 格式转换器ObjectMapper objectMapper = new ObjectMapper();//处理结果AtomicReference<String> dealResult = new AtomicReference<>();// 构造线程池ExecutorService nonBlockingService = Executors.newCachedThreadPool();nonBlockingService.execute(() -> {try {// 设置WebClient处理数据时的内存限制ExchangeStrategies strategies = ExchangeStrategies.builder().codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(Integer.MAX_VALUE)).build();Mono<String> mono = WebClient.builder().baseUrl("https://jiutian.10086.cn/largemodel/api/v2/completions").defaultHeader("Authorization", jwt_token).defaultHeader("Content-Type", "application/json").exchangeStrategies(strategies).build().post().bodyValue(obj)//请求体数据.retrieve()//获取响应体.bodyToMono(String.class);//响应数据类型转换mono.subscribe(result -> {System.out.println("响应报文已转成字符串!下面开始解析:");try {JsonNode responseJson = objectMapper.readTree(result);//字符串转JosnString base64_img = responseJson.get("choices").get(0).get("text").asText();//取图像base64字符串byte[] imageBytes = Base64.getDecoder().decode(base64_img);//解码InputStream in = new ByteArrayInputStream(imageBytes);//把字符数组转换成BufferedImageBufferedImage image = ImageIO.read(in);File outputfile = new File(jiuTian.getGenImgSavePath() + "\\output_img_Completions_" + jiuTianUtils.getNowTime() + ".png");//保存图像ImageIO.write(image, "PNG", outputfile);System.out.println("解析完成,生成的图像存储在" + outputfile.getAbsolutePath());dealResult.set("解析完成,生成的图像存储在" + outputfile.getAbsolutePath());} catch (JsonProcessingException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}},error -> {System.out.println("Error: "+ error);dealResult.set("Error: "+ error);},() -> {System.out.println("Completed!");dealResult.set("Completed!");});} catch (Exception e) {throw new RuntimeException(e);};});return dealResult.get();}@Overridepublic String generate_img_Chat(JiuTian jiuTian) throws JOSEException {if (jwt_token == null) {jwt_token = jiuTianUtils.generateToken(apiKey, token_time);System.out.println("九天大模型的token已生成: " + jwt_token);}if(jiuTian.getGenImgMessage().isEmpty()){System.out.println("提示语为空!");return "提示语为空!";}if(jiuTian.getGenImgSavePath().isEmpty()){System.out.println("图片存储路径为空!");return "图片存储路径为空!";}// 构建请求体数据JSONObject obj = new JSONObject();obj.put("model", "StableDiffusion");JSONObject params1 = new JSONObject();params1.put("role", "system");params1.put("content", "你是一位漫画家");JSONObject params2 = new JSONObject();params2.put("role", "user");params2.put("content", jiuTian.getGenImgMessage());List<JSONObject> messages = new ArrayList<>();messages.add(params1);messages.add(params2);obj.put("messages", messages);obj.put("returnImageUrl", false);// 格式转换器ObjectMapper objectMapper = new ObjectMapper();// 处理结果AtomicReference<String> dealResult = new AtomicReference<>();// 构造线程池ExecutorService nonBlockingService = Executors.newCachedThreadPool();nonBlockingService.execute(() -> {try {// 设置WebClient处理数据时的内存限制ExchangeStrategies strategies = ExchangeStrategies.builder().codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(Integer.MAX_VALUE)).build();Mono<String> mono = WebClient.builder().baseUrl("https://jiutian.10086.cn/largemodel/api/v2/chat/completions").defaultHeader("Authorization", "Bearer " + jwt_token).defaultHeader("Content-Type", "application/json").exchangeStrategies(strategies).build().post().bodyValue(obj)//请求体数据.retrieve()//获取响应体.bodyToMono(String.class);//响应数据类型转换mono.subscribe(result -> {System.out.println("响应报文已转成字符串!下面开始解析:");try {JsonNode responseJson = objectMapper.readTree(result);//字符串转JosnString base64_img = responseJson.get("choices").get(0).get("message").get("content").asText();//取图像base64字符串byte[] imageBytes = Base64.getDecoder().decode(base64_img);//解码InputStream in = new ByteArrayInputStream(imageBytes);//把字符数组转换成BufferedImageBufferedImage image = ImageIO.read(in);File outputfile = new File(jiuTian.getGenImgSavePath() + "\\output_img_Completions_" + jiuTianUtils.getNowTime() + ".png");//保存图像ImageIO.write(image, "PNG", outputfile);System.out.println("解析完成,生成的图像存储在" + outputfile.getAbsolutePath());dealResult.set("解析完成,生成的图像存储在" + outputfile.getAbsolutePath());} catch (JsonProcessingException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}},error -> {System.out.println("Error: "+ error);dealResult.set("Error: "+ error);},() -> {System.out.println("Completed!");dealResult.set("Completed!");});} catch (Exception e) {throw new RuntimeException(e);};});return dealResult.get();}
}

 8、在apifox接口软件中调用项目接口测试。

9、查看图片保存结果。图片挺好看的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 120. 三角形最小路径和 动态规划

原题链接&#xff1a;Leetcode 120. 三角形最小路径和 class Solution { public:int minimumTotal(vector<vector<int>>& triangle) {int n triangle.size();if (n 1)return triangle[0][0];int dp[n][n];dp[0][0] triangle[0][0];int res INT_MAX;for (in…

网络安全概论

网络安全概论--网络基础知识--防火墙技术--身份识别技术--虚拟专用网络--入侵检测技术--病毒和恶意代码 --业务连续性计划--安全管理--信息系统安全方案设计方法 一、网络安全面临的威胁 物理安全威胁、操作系统的安全缺陷、网络协议的安全缺陷、应用软件的实现缺陷、用户使…

设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析

状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类&#xff0c;通过状态对象的行为改变来避免…

某团 mtgsig1.2 | sdkVersion: 3.0.0 签名算法分析记录(2025/1/9)

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#…

(二)最长公共子序列、最长上升子序列、最大子段和、三角形最小路径和、矩阵连乘、0-1背包

最近刚考完算法设计分析课的考试&#xff0c;复习总结一下期末考试的几道算法题吧 目录 LCR 095. 最长公共子序列 300. 最长递增子序列 53. 最大子数组和 LCR 100. 三角形最小路径和 矩阵连乘问题 0-1背包 LCR 095. 最长公共子序列 给定两个字符串 text1 和 text2&#xff…

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…

通义灵码在跨领域应用拓展之物联网篇

目录 一.引言 二.通义灵码简介 三.通义灵码在物联网领域的设备端应用 1.传感器数据采集 (1).不同类型传感器的数据读取 (2).数据转换与预处理 2.设备控制指令接收和执行 (1).指令解析与处理 (2).设备动作执行 四.通义灵码在物联网领域的云端平台应用 1.数据存储和管…

DolphinScheduler自身容错导致的服务器持续崩溃重大问题的排查与解决

01 问题复现 在DolphinScheduler中有如下一个Shell任务&#xff1a; current_timestamp() { date "%Y-%m-%d %H:%M:%S" }TIMESTAMP$(current_timestamp) echo $TIMESTAMP sleep 60 在DolphinScheduler将工作流执行策略设置为并行&#xff1a; 定时周期调度设置…

CISAW-ES应急服务方向信息安全事件分级

网络安全事件事件分级 网络安全事件分为四级&#xff1a;特别重大网络安全事件、重大网络安全事大网络安全事件、一般网络安全事件。 1&#xff0e;特别重大网络安全事件 符合下列情形之一的&#xff0c;为特别重大网络安全事件。 &#xff08;1&#xff09;重要网络和信息系…

油猴支持阿里云自动登陆插件

遇到的以下问题,都已在脚本中解决: 获取到的元素赋值在页面显示,但是底层的value并没有改写,导致请求就是获取不到数据元素的加载时机不定,尤其是弱网情况下,只靠延迟还是有可能获取不到,且登陆不丝滑,通过元素发现机制,解决此问题并做到丝滑登陆根据密钥计算校验码之…

B树与B+树:数据库索引的秘密武器

想象一下&#xff0c;你正在构建一个超级大的图书馆&#xff0c;里面摆满了各种各样的书籍。B树和B树就像是两种不同的图书分类和摆放方式&#xff0c;它们都能帮助你快速找到想要的书籍&#xff0c;但各有特点。 B树就像是一个传统的图书馆摆放方式&#xff1a; 1. 书籍摆放&…

城市生命线安全综合监管平台

【落地产品&#xff0c;有需要可留言联系&#xff0c;支持项目合作或源码合作】 一、建设背景 以关于城市安全的重要论述为建设纲要&#xff0c;聚焦城市安全重点领域&#xff0c;围绕燃气爆炸、城市内涝、地下管线交互风险、第三方施工破坏、供水爆管、桥梁坍塌、道路塌陷七…

成为LabVIEW自由开发者

成为LabVIEW自由开发者的体验可以非常丰富且具有挑战性&#xff0c;同时也充满了自我成长和多样化项目的机会。 ​ 1. 高度的灵活性与自由度 工作时间与地点&#xff1a;作为自由开发者&#xff0c;你可以自由选择工作时间和地点。你可以在家工作&#xff0c;也可以选择在咖啡…

用于与多个数据库聊天的智能 SQL 代理问答和 RAG 系统(3) —— 基于 LangChain 框架的文档检索与问答功能以及RAG Tool的使用

介绍基于 LangChain 框架的文档检索与问答功能&#xff0c;目标是通过查询存储的向量数据库&#xff08;VectorDB&#xff09;&#xff0c;为用户的问题检索相关内容&#xff0c;并生成自然语言的答案。以下是代码逻辑的详细解析&#xff1a; 代码结构与功能 初始化环境与加载…

基于QT和C++的实时日期和时间显示

一、显示在右下角 1、timer.cpp #include "timer.h" #include "ui_timer.h" #include <QStatusBar> #include <QDateTime> #include <QMenuBar> Timer::Timer(QWidget *parent) :QMainWindow(parent),ui(new Ui::Timer) {ui->setup…

Elasticsearch学习(1) : 简介、索引库操作、文档操作、RestAPI、RestClient操作

目录 1.elasticsearch简介1.1.了解es1.2.倒排索引正向索引和倒排索引 1.3.es的一些概念:文档和字段&#xff1b;索引和映射&#xff1b;Mysql与ES1.4.安装es、kibana部署单点es部署kibanaIK分词器安装IK分词器与测试扩展与停用词词典总结 部署es集群 2.索引库操作2.1.mapping映…

【LeetCode Hot100 贪心算法】 买卖股票的最佳时机、跳跃游戏、划分字母区间

贪心算法 买卖股票的最佳时机买卖股票的最佳时机II跳跃游戏跳跃游戏II划分字母区间 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的…

如何在 Ubuntu 22.04 上使用 LEMP 安装 WordPress 教程

简介&#xff1a; 本教程旨在指导你如何在 Ubuntu 22.04 上使用 LEMP 栈安装 WordPress。 WordPress 是一个用 PHP 编写的开源内容管理系统。LEMP 栈是 Linux&#xff0c;NGINX&#xff0c;MySQL 和 PHP 的缩写。WordPress 非常用户友好&#xff0c;并提供了多种选项&#xff…

vue实现虚拟列表滚动

<template> <div class"cont"> //box 视图区域Y轴滚动 滚动的是box盒子 滚动条显示的也是因为box<div class"box">//itemBox。 一个空白的盒子 计算高度为所有数据的高度 固定每一条数据高度为50px<div class"itemBox" :st…

STM32小实验2

定时器实验 TIM介绍 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断…