diff --git a/pom.xml b/pom.xml
index d1933f0..511e2ce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,6 +35,7 @@
UTF-8
17
17
+ 1.0.0
UTF-8
@@ -53,6 +54,13 @@
+
+ org.springframework.ai
+ spring-ai-bom
+ ${spring-ai.version}
+ pom
+ import
+
org.mybatis.spring.boot
mybatis-spring-boot-starter
diff --git a/visual-novel-server-app/pom.xml b/visual-novel-server-app/pom.xml
index 1797b8f..8e1c22d 100644
--- a/visual-novel-server-app/pom.xml
+++ b/visual-novel-server-app/pom.xml
@@ -12,6 +12,15 @@
jar
+
+ org.springframework.ai
+ spring-ai-ollama
+
+
+
+ org.springframework.ai
+ spring-ai-starter-model-deepseek
+
org.springframework.boot
spring-boot-starter-web
diff --git a/visual-novel-server-app/src/main/resources/application-dev.yml b/visual-novel-server-app/src/main/resources/application-dev.yml
index cc20ba7..c0254c0 100644
--- a/visual-novel-server-app/src/main/resources/application-dev.yml
+++ b/visual-novel-server-app/src/main/resources/application-dev.yml
@@ -30,6 +30,15 @@ spring:
connection-test-query: SELECT 1
type: com.zaxxer.hikari.HikariDataSource
+ ai:
+ deepseek:
+ api-key: your-api-key
+ base-url: https://api.deepseek.com # DeepSeek 的请求 URL, 可不填,默认值为 api.deepseek.com
+ chat:
+ options:
+ model: deepseek-reasoner # 使用深度思考模型
+ temperature: 0.8 # 温度值
+
# MyBatis 配置【如需使用记得打开】
#mybatis:
# mapper-locations: classpath:/mybatis/mapper/*.xml
@@ -39,4 +48,5 @@ spring:
logging:
level:
root: info
- config: classpath:logback-spring.xml
\ No newline at end of file
+ config: classpath:logback-spring.xml
+
diff --git a/visual-novel-server-app/src/test/java/com/touka/test/ApiTest.java b/visual-novel-server-app/src/test/java/com/touka/test/ApiTest.java
index 8c33fcc..a11a145 100644
--- a/visual-novel-server-app/src/test/java/com/touka/test/ApiTest.java
+++ b/visual-novel-server-app/src/test/java/com/touka/test/ApiTest.java
@@ -1,19 +1,81 @@
package com.touka.test;
+import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.springframework.ai.chat.model.ChatResponse;
+
+import org.springframework.ai.chat.prompt.Prompt;
+import org.springframework.ai.chat.prompt.PromptTemplate;
+import org.springframework.ai.deepseek.DeepSeekChatModel;
+
+import org.springframework.ai.ollama.api.OllamaOptions;
+
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
+import reactor.core.publisher.Flux;
+
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApiTest {
+ @Resource
+ private DeepSeekChatModel chatModel;
+
+ /**
+ * 测试同步生成响应
+ */
@Test
- public void test() {
- log.info("测试完成");
+ public void testGenerate() {
+ String message = "Tell me a joke";
+
+ // 方式1: 直接传入字符串
+ String response1 = chatModel.call(message);
+ System.out.println("Response1: " + response1);
+
+ // 方式2: 使用 Prompt
+ ChatResponse response2 = chatModel.call(new Prompt(message));
+ System.out.println("Response2: " + response2.getResult().getOutput().getText());
+ }
+
+ /**
+ * 测试流式生成响应
+ */
+ @Test
+ public void testGenerateStream() {
+ String message = "Tell me a joke";
+
+ // 使用 PromptTemplate 构建提示词
+ Prompt prompt = new PromptTemplate(message).create();
+
+ // 流式输出
+ Flux responseFlux = chatModel.stream(prompt);
+
+ // 订阅并打印流式响应
+ responseFlux.doOnNext(response -> {
+ System.out.println("Stream Response: " + response.getResult().getOutput().getText());
+ }).blockLast(); // 在测试中阻塞等待完成
+ }
+
+ /**
+ * 测试使用特定模型选项
+ */
+ @Test
+ public void testGenerateWithModelOptions() {
+ String message = "1+1=?";
+ String model = "deepseek-r1:1.5b";
+
+ ChatResponse response = chatModel.call(new Prompt(
+ message,
+ OllamaOptions.builder()
+ .model(model)
+ .build()
+ ));
+
+ System.out.println("Response with model options: " + response.getResult().getOutput().getText());
}
}