1 line
20 KiB
JSON
1 line
20 KiB
JSON
{"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"}}}} |