Files

1 line
20 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "231250047/tomatomall", "files": {"tomatoMall-backend/src/main/java/com/example/tomatomall/service/serviceImpl/DeepSeekServiceImpl.java": {"a83c1668fd972b00cc55d7199260c3052619e6c3": {"t": 1785746131.7001615, "n": 7708, "h": "a26fcd8036738cdb", "c": "package com.example.tomatomall.service.serviceImpl;\n\nimport com.example.tomatomall.service.DeepSeekService;\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport lombok.Data;\nimport lombok.RequiredArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.http.*;\nimport org.springframework.stereotype.Service;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * DeepSeek API直接调用实现\n * 不依赖Spring AI的OpenAI适配器\n */\n@Slf4j\n@Service\npublic class DeepSeekServiceImpl implements DeepSeekService {\n\n @Value(\"${spring.ai.openai.api-key}\")\n private String apiKey;\n\n private static final String API_URL = \"https://api.deepseek.com/v1/chat/completions\";\n private static final String MODEL = \"deepseek-chat\";\n\n private final RestTemplate restTemplate = new RestTemplate();\n\n // 配置ObjectMapper忽略未知字段\n private final ObjectMapper objectMapper = new ObjectMapper() {{\n configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\n }};\n\n @Override\n public String chat(String message) {\n log.info(\"╔════════════════════════════════════════════════════════════╗\");\n log.info(\"║ 💬 DeepSeek直接调用(简单对话) ║\");\n log.info(\"╚════════════════════════════════════════════════════════════╝\");\n log.info(\"📝 用户消息: {}\", message);\n log.info(\"🔗 API URL: {}\", API_URL);\n log.info(\"🤖 模型: {}\", MODEL);\n\n try {\n // 构建请求体\n ChatRequest request = new ChatRequest();\n request.model = MODEL;\n request.messages = new ArrayList<>();\n request.messages.add(new Message(\"user\", message));\n request.max_tokens = 2000;\n request.temperature = 0.7;\n\n // 发送请求\n String responseJson = sendRequest(request);\n\n // 解析响应\n ChatResponse response = objectMapper.readValue(responseJson, ChatResponse.class);\n\n if (response.choices == null || response.choices.isEmpty()) {\n throw new RuntimeException(\"DeepSeek返回空响应\");\n }\n\n String content = response.choices.get(0).message.content;\n log.info(\"✅ DeepSeek调用成功\");\n log.info(\"🤖 AI回复: {}\", content);\n log.info(\"╚════════════════════════════════════════════════════════════╝\");\n\n return content;\n\n } catch (Exception e) {\n log.error(\"╔════════════════════════════════════════════════════════════╗\");\n log.error(\"║ ❌ DeepSeek调用失败 ║\");\n log.error(\"╚════════════════════════════════════════════════════════════╝\");\n log.error(\"❌ 错误类型: {}\", e.getClass().getName());\n log.error(\"❌ 错误消息: {}\", e.getMessage());\n log.error(\"❌ 堆栈跟踪:\", e);\n throw new RuntimeException(\"DeepSeek调用失败: \" + e.getMessage(), e);\n }\n }\n\n @Override\n public String chatWithPrompt(String prompt) {\n log.info(\"╔════════════════════════════════════════════════════════════╗\");\n log.info(\"║ 💬 DeepSeek直接调用(带Prompt) ║\");\n log.info(\"╚════════════════════════════════════════════════════════════╝\");\n log.info(\"📝 Prompt长度: {} 字符\", prompt.length());\n log.info(\"🔗 API URL: {}\", API_URL);\n log.info(\"🤖 模型: {}\", MODEL);\n\n try {\n // 构建请求体\n ChatRequest request = new ChatRequest();\n request.model = MODEL;\n request.messages = new ArrayList<>();\n request.messages.add(new Message(\"user\", prompt));\n request.max_tokens = 2000;\n request.temperature = 0.7;\n\n // 发送请求\n String responseJson = sendRequest(request);\n\n // 解析响应\n ChatResponse response = objectMapper.readValue(responseJson, ChatResponse.class);\n\n if (response.choices == null || response.choices.isEmpty()) {\n throw new RuntimeException(\"DeepSeek返回空响应\");\n }\n\n String content = response.choices.get(0).message.content;\n log.info(\"✅ DeepSeek调用成功\");\n log.info(\"🤖 AI回复: {}\", content);\n log.info(\"╚════════════════════════════════════════════════════════════╝\");\n\n return content;\n\n } catch (Exception e) {\n log.error(\"╔════════════════════════════════════════════════════════════╗\");\n log.error(\"║ ❌ DeepSeek调用失败 ║\");\n log.error(\"╚════════════════════════════════════════════════════════════╝\");\n log.error(\"❌ 错误类型: {}\", e.getClass().getName());\n log.error(\"❌ 错误消息: {}\", e.getMessage());\n log.error(\"❌ 堆栈跟踪:\", e);\n throw new RuntimeException(\"DeepSeek调用失败: \" + e.getMessage(), e);\n }\n }\n\n /**\n * 发送HTTP请求到DeepSeek API\n */\n private String sendRequest(ChatRequest request) throws Exception {\n log.info(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\");\n log.info(\"📤 发送HTTP请求到DeepSeek...\");\n\n // 序列化请求\n objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);\n String requestJson = objectMapper.writeValueAsString(request);\n log.debug(\"📄 请求体: {}\", requestJson);\n\n // 设置请求头\n HttpHeaders headers = new HttpHeaders();\n headers.setContentType(MediaType.APPLICATION_JSON);\n headers.setBearerAuth(apiKey);\n\n HttpEntity<String> entity = new HttpEntity<>(requestJson, headers);\n\n log.info(\"🔗 目标URL: {}\", API_URL);\n log.info(\"🔑 API Key: {}...{}\",\n apiKey.substring(0, Math.min(8, apiKey.length())),\n apiKey.length() > 4 ? apiKey.substring(apiKey.length() - 4) : \"\");\n\n // 发送请求\n ResponseEntity<String> response = restTemplate.exchange(\n API_URL,\n HttpMethod.POST,\n entity,\n String.class\n );\n\n log.info(\"📥 HTTP状态码: {}\", response.getStatusCode());\n\n if (response.getStatusCode() == HttpStatus.OK) {\n log.debug(\"📄 响应体: {}\", response.getBody());\n return response.getBody();\n } else {\n throw new RuntimeException(\"DeepSeek API返回错误: \" + response.getStatusCode());\n }\n }\n\n // ==================== 数据模型 ====================\n\n @Data\n private static class ChatRequest {\n String model;\n List<Message> messages;\n @JsonProperty(\"max_tokens\")\n Integer max_tokens;\n Double temperature;\n }\n\n @Data\n private static class Message {\n String role;\n String content;\n\n // 默认构造函数(用于JSON反序列化)\n Message() {}\n\n Message(String role, String content) {\n this.role = role;\n this.content = content;\n }\n }\n\n @Data\n private static class ChatResponse {\n String id;\n String object;\n Long created;\n String model;\n List<Choice> choices;\n Usage usage;\n }\n\n @Data\n private static class Choice {\n Integer index;\n Message message;\n @JsonProperty(\"finish_reason\")\n String finish_reason;\n Object logprobs; // DeepSeek返回的logprobs字段(可能是null或对象)\n }\n\n @Data\n private static class Usage {\n @JsonProperty(\"prompt_tokens\")\n Integer prompt_tokens;\n @JsonProperty(\"completion_tokens\")\n Integer completion_tokens;\n @JsonProperty(\"total_tokens\")\n Integer total_tokens;\n }\n}\n"}, "af475c45f02e28190ddc26e5ee573da181f93f4c": {"t": 1785760074.158734, "n": 7708, "h": "a26fcd8036738cdb", "c": "package com.example.tomatomall.service.serviceImpl;\n\nimport com.example.tomatomall.service.DeepSeekService;\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport lombok.Data;\nimport lombok.RequiredArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.http.*;\nimport org.springframework.stereotype.Service;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * DeepSeek API直接调用实现\n * 不依赖Spring AI的OpenAI适配器\n */\n@Slf4j\n@Service\npublic class DeepSeekServiceImpl implements DeepSeekService {\n\n @Value(\"${spring.ai.openai.api-key}\")\n private String apiKey;\n\n private static final String API_URL = \"https://api.deepseek.com/v1/chat/completions\";\n private static final String MODEL = \"deepseek-chat\";\n\n private final RestTemplate restTemplate = new RestTemplate();\n\n // 配置ObjectMapper忽略未知字段\n private final ObjectMapper objectMapper = new ObjectMapper() {{\n configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\n }};\n\n @Override\n public String chat(String message) {\n log.info(\"╔════════════════════════════════════════════════════════════╗\");\n log.info(\"║ 💬 DeepSeek直接调用(简单对话) ║\");\n log.info(\"╚════════════════════════════════════════════════════════════╝\");\n log.info(\"📝 用户消息: {}\", message);\n log.info(\"🔗 API URL: {}\", API_URL);\n log.info(\"🤖 模型: {}\", MODEL);\n\n try {\n // 构建请求体\n ChatRequest request = new ChatRequest();\n request.model = MODEL;\n request.messages = new ArrayList<>();\n request.messages.add(new Message(\"user\", message));\n request.max_tokens = 2000;\n request.temperature = 0.7;\n\n // 发送请求\n String responseJson = sendRequest(request);\n\n // 解析响应\n ChatResponse response = objectMapper.readValue(responseJson, ChatResponse.class);\n\n if (response.choices == null || response.choices.isEmpty()) {\n throw new RuntimeException(\"DeepSeek返回空响应\");\n }\n\n String content = response.choices.get(0).message.content;\n log.info(\"✅ DeepSeek调用成功\");\n log.info(\"🤖 AI回复: {}\", content);\n log.info(\"╚════════════════════════════════════════════════════════════╝\");\n\n return content;\n\n } catch (Exception e) {\n log.error(\"╔════════════════════════════════════════════════════════════╗\");\n log.error(\"║ ❌ DeepSeek调用失败 ║\");\n log.error(\"╚════════════════════════════════════════════════════════════╝\");\n log.error(\"❌ 错误类型: {}\", e.getClass().getName());\n log.error(\"❌ 错误消息: {}\", e.getMessage());\n log.error(\"❌ 堆栈跟踪:\", e);\n throw new RuntimeException(\"DeepSeek调用失败: \" + e.getMessage(), e);\n }\n }\n\n @Override\n public String chatWithPrompt(String prompt) {\n log.info(\"╔════════════════════════════════════════════════════════════╗\");\n log.info(\"║ 💬 DeepSeek直接调用(带Prompt) ║\");\n log.info(\"╚════════════════════════════════════════════════════════════╝\");\n log.info(\"📝 Prompt长度: {} 字符\", prompt.length());\n log.info(\"🔗 API URL: {}\", API_URL);\n log.info(\"🤖 模型: {}\", MODEL);\n\n try {\n // 构建请求体\n ChatRequest request = new ChatRequest();\n request.model = MODEL;\n request.messages = new ArrayList<>();\n request.messages.add(new Message(\"user\", prompt));\n request.max_tokens = 2000;\n request.temperature = 0.7;\n\n // 发送请求\n String responseJson = sendRequest(request);\n\n // 解析响应\n ChatResponse response = objectMapper.readValue(responseJson, ChatResponse.class);\n\n if (response.choices == null || response.choices.isEmpty()) {\n throw new RuntimeException(\"DeepSeek返回空响应\");\n }\n\n String content = response.choices.get(0).message.content;\n log.info(\"✅ DeepSeek调用成功\");\n log.info(\"🤖 AI回复: {}\", content);\n log.info(\"╚════════════════════════════════════════════════════════════╝\");\n\n return content;\n\n } catch (Exception e) {\n log.error(\"╔════════════════════════════════════════════════════════════╗\");\n log.error(\"║ ❌ DeepSeek调用失败 ║\");\n log.error(\"╚════════════════════════════════════════════════════════════╝\");\n log.error(\"❌ 错误类型: {}\", e.getClass().getName());\n log.error(\"❌ 错误消息: {}\", e.getMessage());\n log.error(\"❌ 堆栈跟踪:\", e);\n throw new RuntimeException(\"DeepSeek调用失败: \" + e.getMessage(), e);\n }\n }\n\n /**\n * 发送HTTP请求到DeepSeek API\n */\n private String sendRequest(ChatRequest request) throws Exception {\n log.info(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\");\n log.info(\"📤 发送HTTP请求到DeepSeek...\");\n\n // 序列化请求\n objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);\n String requestJson = objectMapper.writeValueAsString(request);\n log.debug(\"📄 请求体: {}\", requestJson);\n\n // 设置请求头\n HttpHeaders headers = new HttpHeaders();\n headers.setContentType(MediaType.APPLICATION_JSON);\n headers.setBearerAuth(apiKey);\n\n HttpEntity<String> entity = new HttpEntity<>(requestJson, headers);\n\n log.info(\"🔗 目标URL: {}\", API_URL);\n log.info(\"🔑 API Key: {}...{}\",\n apiKey.substring(0, Math.min(8, apiKey.length())),\n apiKey.length() > 4 ? apiKey.substring(apiKey.length() - 4) : \"\");\n\n // 发送请求\n ResponseEntity<String> response = restTemplate.exchange(\n API_URL,\n HttpMethod.POST,\n entity,\n String.class\n );\n\n log.info(\"📥 HTTP状态码: {}\", response.getStatusCode());\n\n if (response.getStatusCode() == HttpStatus.OK) {\n log.debug(\"📄 响应体: {}\", response.getBody());\n return response.getBody();\n } else {\n throw new RuntimeException(\"DeepSeek API返回错误: \" + response.getStatusCode());\n }\n }\n\n // ==================== 数据模型 ====================\n\n @Data\n private static class ChatRequest {\n String model;\n List<Message> messages;\n @JsonProperty(\"max_tokens\")\n Integer max_tokens;\n Double temperature;\n }\n\n @Data\n private static class Message {\n String role;\n String content;\n\n // 默认构造函数(用于JSON反序列化)\n Message() {}\n\n Message(String role, String content) {\n this.role = role;\n this.content = content;\n }\n }\n\n @Data\n private static class ChatResponse {\n String id;\n String object;\n Long created;\n String model;\n List<Choice> choices;\n Usage usage;\n }\n\n @Data\n private static class Choice {\n Integer index;\n Message message;\n @JsonProperty(\"finish_reason\")\n String finish_reason;\n Object logprobs; // DeepSeek返回的logprobs字段(可能是null或对象)\n }\n\n @Data\n private static class Usage {\n @JsonProperty(\"prompt_tokens\")\n Integer prompt_tokens;\n @JsonProperty(\"completion_tokens\")\n Integer completion_tokens;\n @JsonProperty(\"total_tokens\")\n Integer total_tokens;\n }\n}\n"}}}}