SB-ChatClient-DeepSeekDashScopeOllamaModel 20260424
1、pom
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>3.2.0</spring-boot.version>
<spring-ai.version>1.1.2</spring-ai.version>
<spring-ai-alibaba.version>1.1.2.2</spring-ai-alibaba.version>
<spring-ai-alibaba-extensions.version>1.1.2.2</spring-ai-alibaba-extensions.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 阿里云通义千问(DashScope)starter -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
<!-- deepseek starter -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-deepseek</artifactId>
</dependency>
<!-- 新增:Ollama 的 Starter -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 统一管理Spring AI依赖版本 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>${spring-ai-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-extensions-bom</artifactId>
<version>${spring-ai-alibaba-extensions.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Spring AI 里程碑/快照仓库(必须配置,否则依赖无法下载) -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
2、yml
server:
port: 18082
spring:
ai:
dashscope:
api-key: sk-8718a83408d7443b9544cdfbXXXXX
deepseek: ## 这一行是你选择的LLM模型,如果是openai,这里就填openai, base-url就是填对应厂商的地址
api-key: "sk-199324596dbb4308afcb77d4XXXXX"
base-url: "https://api.deepseek.com"
chat:
options:
model: deepseek-chat
embedding:
enabled: false
ollama:
chat:
options:
model: gemma3:4b
#model: qwen2.5vl:3b moondream:latest qwen2.5vl:3b-q4_K_M moondream:v2
#model: qwen2:0.5b
#temperature: 0.1
# 指定默认使用的模型,也可以在代码中动态覆盖
#model: gemma3:4b
####最小的轻量多模态模型(约 1.5GB)
#model: minicpm-v:latest
base-url: http://192.168.91.164:11434
main: #允许 Bean 覆盖
allow-bean-definition-overriding: true
####api-key填写自个
3、controller
3.1
http://localhost:18082/openai/simple/chatclientdeepseek

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import reactor.core.publisher.Flux;
@RequestMapping("/openai")
@ResponseBody
@Controller
public class ChatclientDeepseekControlller {
private ChatClient chatClient;
// 构造函数注入,并构建 ChatClient
public ChatclientDeepseekControlller(@Qualifier("deepSeekChatModel") ChatModel chatModel)
{
this.chatClient = ChatClient.builder(chatModel).build();
}
@GetMapping("/simple/chatclientdeepseek")
public String chatclient () {
String content = chatClient.prompt()
.user("你好").call().content();
System.out.println(content+"【chatclientdeepseek】");
return content+"【chatclientdeepseek】";
}
@GetMapping(value = "/simple/chatclientdeepseekstream")
public void chatclientstream () {
Flux<String> content = chatClient.prompt("你好").stream().content();
content.toIterable().forEach(s -> System.out.print(s+"【chatclientdeepseekstream】"));
}
}
3.2
http://localhost:18082/openai/simple/chatclientdashscope

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import reactor.core.publisher.Flux;
@RequestMapping("/openai")
@ResponseBody
@Controller
public class ChatclientDashScopeControlller {
private ChatClient chatClient;
// 构造函数注入,并构建 ChatClient
public ChatclientDashScopeControlller(@Qualifier("dashScopeChatModel") ChatModel chatModel)
{
this.chatClient = ChatClient.builder(chatModel).build();
}
@GetMapping("/simple/chatclientdashscope")
public String chatclient () {
String content = chatClient.prompt()
.user("你好").call().content();
System.out.println(content+"【chatclientdashscope】");
return content+"【chatclientdashscope】";
}
@GetMapping(value = "/simple/chatclientdashscopestream")
public void chatclientstream () {
Flux<String> content = chatClient.prompt("你好").stream().content();
content.toIterable().forEach(s -> System.out.print(s+"【chatclientdashscopestream】"));
}
}
3.3
http://localhost:18082/openai/simple/chatclientollama
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import reactor.core.publisher.Flux;
@RequestMapping("/openai")
@ResponseBody
@Controller
public class ChatclientOllamaControlller {
private ChatClient chatClient;
// 构造函数注入,并构建 ChatClient
public ChatclientOllamaControlller(@Qualifier("ollamaChatModel") ChatModel chatModel)
{
this.chatClient = ChatClient.builder(chatModel).build();
}
@GetMapping("/simple/chatclientollama")
public String chatclient () {
String content = chatClient.prompt()
.user("你好").call().content();
System.out.println(content);
return content;
}
@GetMapping("/simple/chatclientollamastream")
public void chatclientstream () {
Flux<String> content = chatClient.prompt("你好").stream().content();
content.toIterable().forEach(s -> System.out.print(s));
}
}
浙公网安备 33010602011771号