This commit is contained in:
van
2026-03-10 00:31:51 +08:00
parent 791a19839a
commit 2722551225
4 changed files with 95 additions and 7 deletions

View File

@@ -2,7 +2,7 @@ package cn.van.business.service;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.van.business.util.ds.DeepSeekClientUtil; import cn.van.business.util.ds.OllamaClientUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails; import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -29,7 +29,7 @@ import java.util.Map;
public class MarketingImageService { public class MarketingImageService {
@Autowired @Autowired
private DeepSeekClientUtil deepSeekClientUtil; private OllamaClientUtil ollamaClientUtil;
// 输出图片尺寸 // 输出图片尺寸
private static final int OUTPUT_WIDTH = 1080; private static final int OUTPUT_WIDTH = 1080;
@@ -191,7 +191,7 @@ public class MarketingImageService {
fullProductName fullProductName
); );
String extracted = deepSeekClientUtil.getDeepSeekResponse(prompt); String extracted = ollamaClientUtil.getResponse(prompt);
if (StrUtil.isNotBlank(extracted)) { if (StrUtil.isNotBlank(extracted)) {
// 清理可能的换行和多余空格 // 清理可能的换行和多余空格
extracted = extracted.trim().replaceAll("\\s+", ""); extracted = extracted.trim().replaceAll("\\s+", "");

View File

@@ -1,7 +1,7 @@
package cn.van.business.service; package cn.van.business.service;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.van.business.util.ds.DeepSeekClientUtil; import cn.van.business.util.ds.OllamaClientUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
@@ -23,7 +23,7 @@ import java.util.Map;
public class SocialMediaService { public class SocialMediaService {
@Autowired @Autowired
private DeepSeekClientUtil deepSeekClientUtil; private OllamaClientUtil ollamaClientUtil;
@Autowired @Autowired
private MarketingImageService marketingImageService; private MarketingImageService marketingImageService;
@@ -102,7 +102,7 @@ public class SocialMediaService {
String promptTemplate = getPromptTemplate("keywords", DEFAULT_KEYWORDS_PROMPT); String promptTemplate = getPromptTemplate("keywords", DEFAULT_KEYWORDS_PROMPT);
String prompt = String.format(promptTemplate, productName); String prompt = String.format(promptTemplate, productName);
String response = deepSeekClientUtil.getDeepSeekResponse(prompt); String response = ollamaClientUtil.getResponse(prompt);
if (StrUtil.isNotBlank(response)) { if (StrUtil.isNotBlank(response)) {
// 解析关键词 // 解析关键词
@@ -191,7 +191,7 @@ public class SocialMediaService {
String prompt = String.format(promptTemplate, productName, priceInfo.toString(), keywordsInfo); String prompt = String.format(promptTemplate, productName, priceInfo.toString(), keywordsInfo);
String content = deepSeekClientUtil.getDeepSeekResponse(prompt.toString()); String content = ollamaClientUtil.getResponse(prompt.toString());
if (StrUtil.isNotBlank(content)) { if (StrUtil.isNotBlank(content)) {
result.put("success", true); result.put("success", true);

View File

@@ -0,0 +1,84 @@
package cn.van.business.util.ds;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.Method;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* Ollama 大模型接口调用工具。
* 地址默认192.168.8.34:11434模型默认qwen3.5:9b
*/
@Component
public class OllamaClientUtil {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(OllamaClientUtil.class);
private static final ObjectMapper objectMapper = new ObjectMapper();
@Value("${jarvis.ollama.base-url:http://192.168.8.34:11434}")
private String ollamaBaseUrl;
@Value("${jarvis.ollama.model:qwen3.5:9b}")
private String ollamaModel;
/**
* 调用 Ollama /api/chat 并返回助手回复的文本内容
*
* @param inputText 用户输入的文本
* @return 模型回复的文本内容
*/
public String getResponse(String inputText) throws IOException {
if (inputText == null || inputText.trim().isEmpty()) {
throw new IllegalArgumentException("输入文本不能为空");
}
if (inputText.length() > 10000) {
throw new IllegalArgumentException("输入文本过长");
}
String url = ollamaBaseUrl.replaceAll("/$", "") + "/api/chat";
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("model", ollamaModel);
requestBody.put("messages", new Object[]{
Map.of("role", "user", "content", inputText)
});
requestBody.put("stream", false);
String jsonBody = objectMapper.writeValueAsString(requestBody);
HttpRequest request = HttpRequest.of(url)
.method(Method.POST)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.body(jsonBody)
.timeout(60000);
logger.info("请求 Ollama API: URL={}, model={}", url, ollamaModel);
HttpResponse response = request.execute();
if (response.getStatus() != 200) {
logger.error("Ollama API 调用失败!状态码={}, 响应={}", response.getStatus(), response.body());
throw new IOException("API 调用失败HTTP 状态码: " + response.getStatus());
}
JsonNode root = objectMapper.readTree(response.body());
JsonNode message = root.path("message");
if (!message.isMissingNode()) {
JsonNode content = message.path("content");
if (!content.isMissingNode()) {
return content.asText();
}
}
JsonNode responseText = root.path("response");
if (!responseText.isMissingNode()) {
return responseText.asText();
}
throw new IOException("Ollama 返回数据格式异常,未找到回复内容");
}
}

View File

@@ -63,6 +63,10 @@ jarvis:
host: 192.168.8.88 host: 192.168.8.88
rocketmq: rocketmq:
name-server: 192.168.8.88:9876 name-server: 192.168.8.88:9876
# Ollama 大模型接口(原 DS 调用已切换为此)
ollama:
base-url: http://192.168.8.34:11434
model: qwen3.5:9b
rocketmq: rocketmq:
name-server: ${jarvis.server.rocketmq.name-server:192.168.8.88:9876} # RocketMQ Name Server 地址 name-server: ${jarvis.server.rocketmq.name-server:192.168.8.88:9876} # RocketMQ Name Server 地址
producer: producer: