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美元)**故此找了一张下面找了一张类似的