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

Spring AI 整合OpenAI 聊天、做图

文章目录

  • Spring AI 整合OpenAI 聊天、做图
    • 创建项目
    • 导入项目至IDEA
    • 获取OpenAI相关配置
      • 配置步骤
      • 网站配置
    • 代码实现
      • 项目pom文件核心
      • 项目配置文件
      • 系统默认响应配置
      • 应用启动类
      • Controller接口业务
    • 运行效果演示
      • 项目启动
      • 串行输出
      • 流式输出
      • 通用模型
      • 文字生成图片


Spring AI 整合OpenAI 聊天、做图

创建项目

使用 https://start.spring.io/ 快速创建项目或者使用idea创建项目

项目版本和添加依赖
创建项目

依赖配置添加Spring Web和OpenAI
核心依赖

导入项目至IDEA

在IDEA中打开项目

在这里插入图片描述

获取OpenAI相关配置

配置步骤

这里使用https://api.xty.app
1、注册:https://api.xty.app/register?aff=PuZD
2、获取 ApiKey
3、整合Spring AI & 配置 OpenAI
4、测试

网站配置

网站首页
在这里插入图片描述
创建API令牌
在这里插入图片描述

代码实现

项目pom文件核心

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.hooyach</groupId><artifactId>spring_ai_demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring_ai_demo</name><description>spring_ai_demo</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-ai.version>1.0.0-M2</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.52</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.14</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>

项目配置文件

application.yml

spring.application.name: spring_ai_demo
server:port: 8787
kele:
# 直连openai:key: ${OPAI_KEY}url: ${BASE_URL}
# 中转aicore:key: ${OPAI_KEY_MIDDLE}url: ${BASE_URL_MIDDLE}
spring:ai:openai:api-key: ${kele.aicore.key}base-url: ${kele.aicore.url}

系统默认响应配置

BuildMasterConfig.java

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** ClassName: BuildMasterConfig* Package: com.kele.spring_ai_demo.config* Description:*/
@Configuration
public class BuildMasterConfig {@BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("你是一名建筑领域的大师").build();}
}

应用启动类

SpringAiDemoApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class  SpringAiDemoApplication {public static void main(String[] args) {String proxy = "127.0.0.1";String port = "7891";System.setProperty("proxyType", "4");System.setProperty("proxyPort", port);System.setProperty("proxyHost", proxy);System.setProperty("proxySet", "true");// 设置 HTTP 代理
//        System.setProperty("http.proxyHost", "127.0.0.1");  // 代理服务器地址
//        System.setProperty("http.proxyPort", "7891");       // 代理服务器端口SpringApplication.run(SpringAiDemoApplication.class, args);System.out.println("""⣿⣿⣿⠟⠛⠛⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⢋⣩⣉⢻⣿⣿⣿⠀⣿⣶⣕⣈⠹⠿⠿⠿⠿⠟⠛⣛⢋⣰⠣⣿⣿⠀⣿⣿⣿⣿⡀⣿⣿⣿⣧⢻⣿⣶⣷⣿⣿⣿⣿⣿⣿⠿⠶⡝⠀⣿⣿⣿⣿⣷⠘⣿⣿⣿⢏⣿⣿⣋⣀⣈⣻⣿⣿⣷⣤⣤⣿⡐⢿⣿⣿⣿⣿⣆⢩⣝⣫⣾⣿⣿⣿⣿⡟⠿⠿⠦⠀⠸⠿⣻⣿⡄⢻⣿⣿⣿⣿⣿⡄⢻⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣾⣿⣿⣿⣿⠇⣼⣿⣿⣿⣿⣿⣿⡄⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣰⣿⣿⣿⣿⣿⣿⠇⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢀⣿⣿⣿⣿⣿⣿⠏⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿⣿⣿⠟⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⣿⣿⣿⣿⠋⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⣿⣿⣿⠋⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸===========启动成功===========""");}}

Controller接口业务

AiController.java


import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.openai.OpenAiImageModel;
import org.springframework.ai.openai.OpenAiImageOptions;
import org.springframework.ai.openai.api.OpenAiImageApi;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;import java.net.http.HttpClient;/*** ClassName: AiController* Package: com.kele.spring_ai_demo.controller* Description:*/
@RestController
@RequestMapping("/ai")
public class AiController {@ResourceChatClient chatClient;@ResourceChatModel chatModel;@ResourceOpenAiImageModel openaiImageModel;public AiController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}/*** 串行输出* @param msg* @return*/@GetMapping("/chat")public String chat(@RequestParam(value = "msg", defaultValue = "你好呀") String msg) {System.out.println("开始调用第三方接口");System.out.println("msg=" + msg);try {String content = chatClient.prompt().user(msg)//一次性全部返回 同步.call().content();System.out.println("API 响应: " + content);  // 打印 API 的原始响应return content;} catch (Exception e) {e.printStackTrace();return "Error occurred: " + e.getMessage();}}/*** 流式输出* @param msg* @return*/@GetMapping(value = "/stream",produces = "text/html;charset=UTF-8")public Flux<String> stream(@RequestParam(value = "msg", defaultValue = "你好呀") String msg) {System.out.println("开始调用第三方接口,用流的方式");System.out.println("msg=" + msg);return  chatClient.prompt().user(msg)//流式返回 异步.stream().content();}/*** 通用模型* @return*/@GetMapping(value = "/model/call",produces = "text/html;charset=UTF-8")public String modelCall(@RequestParam(value = "msg", defaultValue = "你好呀") String msg) {System.out.println("开始调用第三方接口");//使用默认的模型ChatResponse response = chatModel.call(new Prompt(msg,OpenAiChatOptions.builder().withModel("gpt-4").withTemperature(0.8F).build()));return response.getResult().getOutput().getContent();}@GetMapping(value = "/img")public String img(@RequestParam(value = "msg", defaultValue = "画一只小猫咪") String msg) {System.out.println("开始文字生成图片");ImageResponse response = openaiImageModel.call(new ImagePrompt(msg,OpenAiImageOptions.builder().withQuality("hd").withN(1).withHeight(1024).withWidth(1024).build()));return response.getResult().getOutput().getUrl();}@GetMapping("/test")public String test() {return "hello ai";}}

运行效果演示

项目启动

项目启动成功输出hello ai
在这里插入图片描述

串行输出

接口日志打印
在这里插入图片描述
接口访问效果
在这里插入图片描述

流式输出

接口访问效果

这里是一个个字往出来蹦那种
在这里插入图片描述

通用模型

接口访问效果
在这里插入图片描述

文字生成图片

接口访问效果
在这里插入图片描述

省略这里接口403了 查看日志**余额不足了(图像预消费配额失败,用户配额:0.093310美元,需求配额:0.160000美元)**故此找了一张下面找了一张类似的
在这里插入图片描述

http://www.dtcms.com/a/393787.html

相关文章:

  • 阿里Motionshop人物角色替换成3D虚拟形象
  • C语言自学--字符函数和字符串函数
  • spring-boot--邮箱验证码发送--spring-boot-starter-mail
  • 3ds Max 2026安装教程(附安装包)3ds Max 2026下载详细安装图文教程
  • Genie 2:Google DeepMind 推出的基础世界模型,单张图生成 1分钟可玩 3D 世界
  • LeetCode 104. 二叉树的最大深度
  • 欧拉角描述相机的运动
  • Unity2D-Spriteshape
  • 打工人日报#20250921
  • Coolmuster Android Assistant:Windows系统下的Android设备管理专家
  • Android 的多进程机制 (Android Multi-Process Model)
  • 2025研究生数学建模通用神经网络处理器下的核内调度问题草案
  • Spring Boot 4 新特性详解:5大核心更新助力企业级开发
  • 计算机网络经典问题透视:网络利用率和网络时延之间,究竟存在着怎样一种“爱恨交织”的关系?我们梦寐以求的100%网络利用率,在现实世界中真的能够实现吗
  • requests 和 lxml 库的xpath实现
  • 前端梳理体系从常问问题去完善-工程篇(webpack,vite)
  • Go语言在K8s中的核心优势
  • 旅游门票预订系统支持微信小程序+H5
  • Requests 网络请求:Python API 交互与数据获取
  • 基于Dify实现简历自动筛选过滤
  • PHP中常见数组操作函数
  • 避坑指南:鸿蒙(harmony next)APP获取公钥和证书指纹的方法
  • Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进中的深度应用(414)
  • 【场景题】如何解决大文件上传问题
  • 云原生复杂多变的环境中的安全防护方案
  • Python10-逻辑回归-决策树
  • 如何生成一个不会重复随机数?
  • 【精品资料鉴赏】155页WORD大型制造企业MES制造执行系统建设方案
  • 定时计划任务
  • 【脑电分析系列】第23篇:癫痫检测案例:从频谱特征到深度学习模型的CHB-MIT数据集实战