Files

1 line
15 KiB
JSON

{"repo": "basui01/smart-campus", "files": {"backend/smart-campus-ai/src/main/java/com/smartcampus/ai/adapter/DeepSeekAdapter.java": {"95c69bb5dcfe943d32ab3a7e6947a29aeb140ae7": {"t": 1785745679.5085871, "n": 6379, "h": "cf947851446be8e4", "c": "package com.smartcampus.ai.adapter;\r\n\r\nimport com.smartcampus.ai.dto.AiModelInfo;\r\nimport com.smartcampus.ai.entity.AiProvider;\r\nimport lombok.extern.slf4j.Slf4j;\r\nimport org.springframework.http.*;\r\nimport org.springframework.stereotype.Component;\r\nimport org.springframework.web.client.RestTemplate;\r\nimport org.springframework.web.reactive.function.client.WebClient;\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\n\r\nimport java.time.LocalDateTime;\r\nimport java.util.*;\r\n\r\n/**\r\n * DeepSeek AI适配器实现\r\n *\r\n * <p>BaSui我实现这个DeepSeek适配器,支持深度求索AI模型的调用。\r\n * DeepSeek的模型性价比很高,特别适合代码生成和数学推理,API完全兼容OpenAI!\r\n * 现在继承了抽象基类,代码更简洁了!\r\n *\r\n * <p>支持的模型:\r\n * <ul>\r\n * <li>deepseek-chat - DeepSeek Chat通用对话模型</li>\r\n * <li>deepseek-coder - DeepSeek Coder代码生成模型</li>\r\n * </ul>\r\n *\r\n * <p>支持的功能:\r\n * <ul>\r\n * <li>强大的代码生成能力</li>\r\n * <li>优秀的数学推理</li>\r\n * <li>流式传输</li>\r\n * <li>中文理解优秀</li>\r\n * </ul>\r\n *\r\n * @author BaSui \r\n * @date 2025-10-10\r\n */\r\n@Slf4j\r\n@Component\r\npublic class DeepSeekAdapter extends AbstractAiAdapter {\r\n\r\n public DeepSeekAdapter(RestTemplate restTemplate, WebClient webClient, ObjectMapper objectMapper) {\r\n super(restTemplate, webClient, objectMapper);\r\n }\r\n\r\n @Override\r\n public List<AiModelInfo> getModels(AiProvider provider) throws Exception {\r\n if (!provider.isAvailable()) {\r\n throw new RuntimeException(\"DeepSeek服务商不可用\");\r\n }\r\n\r\n // DeepSeek不提供公共的模型列表API,返回预定义的模型\r\n return getPredefinedModels(provider);\r\n }\r\n\r\n @Override\r\n public List<String> getSupportedProviderCodes() {\r\n return Arrays.asList(\"deepseek\", \"deepseek-ai\");\r\n }\r\n\r\n @Override\r\n public String getAdapterName() {\r\n return \"DeepSeek AI Adapter\";\r\n }\r\n\r\n @Override\r\n public boolean supportsCapability(String capability) {\r\n return switch (capability) {\r\n case \"text\", \"streaming\", \"code_generation\", \"reasoning\" -> true;\r\n default -> false;\r\n };\r\n }\r\n\r\n @Override\r\n protected void setAuthenticationHeaders(HttpHeaders headers, AiProvider provider) {\r\n headers.setBearerAuth(getApiKey(provider));\r\n }\r\n \r\n @Override\r\n protected String getDefaultTestModel() {\r\n return \"deepseek-chat\";\r\n }\r\n\r\n /**\r\n * 获取API密钥\r\n */\r\n @Override\r\n protected String getApiKey(AiProvider provider) {\r\n // 这里应该从安全的配置中获取API密钥\r\n return System.getenv(\"DEEPSEEK_API_KEY\");\r\n }\r\n\r\n /**\r\n * 获取预定义的模型列表\r\n */\r\n private List<AiModelInfo> getPredefinedModels(AiProvider provider) {\r\n List<AiModelInfo> models = new ArrayList<>();\r\n\r\n models.add(createModelInfo(\"deepseek-chat\", \"DeepSeek Chat\", provider, 1));\r\n models.add(createModelInfo(\"deepseek-coder\", \"DeepSeek Coder\", provider, 2));\r\n\r\n return models;\r\n }\r\n\r\n /**\r\n * 创建模型信息\r\n */\r\n private AiModelInfo createModelInfo(String modelId, String displayName, AiProvider provider, int sortOrder) {\r\n return AiModelInfo.builder()\r\n .id(modelId)\r\n .name(displayName)\r\n .providerCode(provider.getProviderCode())\r\n .providerName(provider.getProviderName())\r\n .type(\"text\")\r\n .status(\"active\")\r\n .createdTime(LocalDateTime.now())\r\n .updatedTime(LocalDateTime.now())\r\n .capabilities(getModelCapabilities(modelId))\r\n .contextLength(getModelContextLength(modelId))\r\n .maxOutputTokens(getModelMaxTokens(modelId))\r\n .inputPrice(getModelInputPrice(modelId))\r\n .outputPrice(getModelOutputPrice(modelId))\r\n .recommended(isRecommendedModel(modelId))\r\n .tags(getModelTags(modelId))\r\n .sortOrder(sortOrder)\r\n .description(getModelDescription(modelId))\r\n .trainingDataCutoff(getModelTrainingDataCutoff(modelId))\r\n .build();\r\n }\r\n\r\n /**\r\n * 获取模型功能\r\n */\r\n private List<String> getModelCapabilities(String modelId) {\r\n List<String> capabilities = new ArrayList<>();\r\n capabilities.add(\"text\");\r\n capabilities.add(\"streaming\");\r\n capabilities.add(\"reasoning\");\r\n\r\n if (modelId.contains(\"coder\")) {\r\n capabilities.add(\"code_generation\");\r\n }\r\n\r\n return capabilities;\r\n }\r\n\r\n /**\r\n * 获取模型上下文长度\r\n */\r\n private Integer getModelContextLength(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\", \"deepseek-coder\" -> 4096;\r\n default -> 4096;\r\n };\r\n }\r\n\r\n /**\r\n * 获取模型最大输出token数\r\n */\r\n private Integer getModelMaxTokens(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\", \"deepseek-coder\" -> 4096;\r\n default -> 4096;\r\n };\r\n }\r\n\r\n /**\r\n * 获取模型输入价格\r\n */\r\n private Double getModelInputPrice(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\" -> 1.0;\r\n case \"deepseek-coder\" -> 1.0;\r\n default -> 1.0;\r\n };\r\n }\r\n\r\n /**\r\n * 获取模型输出价格\r\n */\r\n private Double getModelOutputPrice(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\" -> 2.0;\r\n case \"deepseek-coder\" -> 2.0;\r\n default -> 2.0;\r\n };\r\n }\r\n\r\n /**\r\n * 是否为推荐模型\r\n */\r\n private Boolean isRecommendedModel(String modelId) {\r\n return \"deepseek-chat\".equals(modelId);\r\n }\r\n\r\n /**\r\n * 获取模型标签\r\n */\r\n private List<String> getModelTags(String modelId) {\r\n List<String> tags = new ArrayList<>();\r\n if (isRecommendedModel(modelId)) {\r\n tags.add(\"recommended\");\r\n }\r\n if (modelId.contains(\"coder\")) {\r\n tags.add(\"code\");\r\n tags.add(\"programming\");\r\n }\r\n tags.add(\"cost_effective\");\r\n return tags;\r\n }\r\n\r\n /**\r\n * 获取模型描述\r\n */\r\n private String getModelDescription(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\" -> \"DeepSeek通用对话模型,性价比极高,适合日常对话和推理\";\r\n case \"deepseek-coder\" -> \"DeepSeek代码生成模型,支持多种编程语言,适合代码生成和解释\";\r\n default -> \"DeepSeek AI模型\";\r\n };\r\n }\r\n\r\n /**\r\n * 获取模型训练数据截止日期\r\n */\r\n private String getModelTrainingDataCutoff(String modelId) {\r\n return \"2024年初\";\r\n }\r\n}"}, "5b3f3fc6b9e726ef6b839f3fa8b8ba5b897153c2": {"t": 1785755686.0262609, "n": 6379, "h": "cf947851446be8e4", "c": "package com.smartcampus.ai.adapter;\r\n\r\nimport com.smartcampus.ai.dto.AiModelInfo;\r\nimport com.smartcampus.ai.entity.AiProvider;\r\nimport lombok.extern.slf4j.Slf4j;\r\nimport org.springframework.http.*;\r\nimport org.springframework.stereotype.Component;\r\nimport org.springframework.web.client.RestTemplate;\r\nimport org.springframework.web.reactive.function.client.WebClient;\r\nimport com.fasterxml.jackson.databind.ObjectMapper;\r\n\r\nimport java.time.LocalDateTime;\r\nimport java.util.*;\r\n\r\n/**\r\n * DeepSeek AI适配器实现\r\n *\r\n * <p>BaSui我实现这个DeepSeek适配器,支持深度求索AI模型的调用。\r\n * DeepSeek的模型性价比很高,特别适合代码生成和数学推理,API完全兼容OpenAI!\r\n * 现在继承了抽象基类,代码更简洁了!\r\n *\r\n * <p>支持的模型:\r\n * <ul>\r\n * <li>deepseek-chat - DeepSeek Chat通用对话模型</li>\r\n * <li>deepseek-coder - DeepSeek Coder代码生成模型</li>\r\n * </ul>\r\n *\r\n * <p>支持的功能:\r\n * <ul>\r\n * <li>强大的代码生成能力</li>\r\n * <li>优秀的数学推理</li>\r\n * <li>流式传输</li>\r\n * <li>中文理解优秀</li>\r\n * </ul>\r\n *\r\n * @author BaSui \r\n * @date 2025-10-10\r\n */\r\n@Slf4j\r\n@Component\r\npublic class DeepSeekAdapter extends AbstractAiAdapter {\r\n\r\n public DeepSeekAdapter(RestTemplate restTemplate, WebClient webClient, ObjectMapper objectMapper) {\r\n super(restTemplate, webClient, objectMapper);\r\n }\r\n\r\n @Override\r\n public List<AiModelInfo> getModels(AiProvider provider) throws Exception {\r\n if (!provider.isAvailable()) {\r\n throw new RuntimeException(\"DeepSeek服务商不可用\");\r\n }\r\n\r\n // DeepSeek不提供公共的模型列表API,返回预定义的模型\r\n return getPredefinedModels(provider);\r\n }\r\n\r\n @Override\r\n public List<String> getSupportedProviderCodes() {\r\n return Arrays.asList(\"deepseek\", \"deepseek-ai\");\r\n }\r\n\r\n @Override\r\n public String getAdapterName() {\r\n return \"DeepSeek AI Adapter\";\r\n }\r\n\r\n @Override\r\n public boolean supportsCapability(String capability) {\r\n return switch (capability) {\r\n case \"text\", \"streaming\", \"code_generation\", \"reasoning\" -> true;\r\n default -> false;\r\n };\r\n }\r\n\r\n @Override\r\n protected void setAuthenticationHeaders(HttpHeaders headers, AiProvider provider) {\r\n headers.setBearerAuth(getApiKey(provider));\r\n }\r\n \r\n @Override\r\n protected String getDefaultTestModel() {\r\n return \"deepseek-chat\";\r\n }\r\n\r\n /**\r\n * 获取API密钥\r\n */\r\n @Override\r\n protected String getApiKey(AiProvider provider) {\r\n // 这里应该从安全的配置中获取API密钥\r\n return System.getenv(\"DEEPSEEK_API_KEY\");\r\n }\r\n\r\n /**\r\n * 获取预定义的模型列表\r\n */\r\n private List<AiModelInfo> getPredefinedModels(AiProvider provider) {\r\n List<AiModelInfo> models = new ArrayList<>();\r\n\r\n models.add(createModelInfo(\"deepseek-chat\", \"DeepSeek Chat\", provider, 1));\r\n models.add(createModelInfo(\"deepseek-coder\", \"DeepSeek Coder\", provider, 2));\r\n\r\n return models;\r\n }\r\n\r\n /**\r\n * 创建模型信息\r\n */\r\n private AiModelInfo createModelInfo(String modelId, String displayName, AiProvider provider, int sortOrder) {\r\n return AiModelInfo.builder()\r\n .id(modelId)\r\n .name(displayName)\r\n .providerCode(provider.getProviderCode())\r\n .providerName(provider.getProviderName())\r\n .type(\"text\")\r\n .status(\"active\")\r\n .createdTime(LocalDateTime.now())\r\n .updatedTime(LocalDateTime.now())\r\n .capabilities(getModelCapabilities(modelId))\r\n .contextLength(getModelContextLength(modelId))\r\n .maxOutputTokens(getModelMaxTokens(modelId))\r\n .inputPrice(getModelInputPrice(modelId))\r\n .outputPrice(getModelOutputPrice(modelId))\r\n .recommended(isRecommendedModel(modelId))\r\n .tags(getModelTags(modelId))\r\n .sortOrder(sortOrder)\r\n .description(getModelDescription(modelId))\r\n .trainingDataCutoff(getModelTrainingDataCutoff(modelId))\r\n .build();\r\n }\r\n\r\n /**\r\n * 获取模型功能\r\n */\r\n private List<String> getModelCapabilities(String modelId) {\r\n List<String> capabilities = new ArrayList<>();\r\n capabilities.add(\"text\");\r\n capabilities.add(\"streaming\");\r\n capabilities.add(\"reasoning\");\r\n\r\n if (modelId.contains(\"coder\")) {\r\n capabilities.add(\"code_generation\");\r\n }\r\n\r\n return capabilities;\r\n }\r\n\r\n /**\r\n * 获取模型上下文长度\r\n */\r\n private Integer getModelContextLength(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\", \"deepseek-coder\" -> 4096;\r\n default -> 4096;\r\n };\r\n }\r\n\r\n /**\r\n * 获取模型最大输出token数\r\n */\r\n private Integer getModelMaxTokens(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\", \"deepseek-coder\" -> 4096;\r\n default -> 4096;\r\n };\r\n }\r\n\r\n /**\r\n * 获取模型输入价格\r\n */\r\n private Double getModelInputPrice(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\" -> 1.0;\r\n case \"deepseek-coder\" -> 1.0;\r\n default -> 1.0;\r\n };\r\n }\r\n\r\n /**\r\n * 获取模型输出价格\r\n */\r\n private Double getModelOutputPrice(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\" -> 2.0;\r\n case \"deepseek-coder\" -> 2.0;\r\n default -> 2.0;\r\n };\r\n }\r\n\r\n /**\r\n * 是否为推荐模型\r\n */\r\n private Boolean isRecommendedModel(String modelId) {\r\n return \"deepseek-chat\".equals(modelId);\r\n }\r\n\r\n /**\r\n * 获取模型标签\r\n */\r\n private List<String> getModelTags(String modelId) {\r\n List<String> tags = new ArrayList<>();\r\n if (isRecommendedModel(modelId)) {\r\n tags.add(\"recommended\");\r\n }\r\n if (modelId.contains(\"coder\")) {\r\n tags.add(\"code\");\r\n tags.add(\"programming\");\r\n }\r\n tags.add(\"cost_effective\");\r\n return tags;\r\n }\r\n\r\n /**\r\n * 获取模型描述\r\n */\r\n private String getModelDescription(String modelId) {\r\n return switch (modelId) {\r\n case \"deepseek-chat\" -> \"DeepSeek通用对话模型,性价比极高,适合日常对话和推理\";\r\n case \"deepseek-coder\" -> \"DeepSeek代码生成模型,支持多种编程语言,适合代码生成和解释\";\r\n default -> \"DeepSeek AI模型\";\r\n };\r\n }\r\n\r\n /**\r\n * 获取模型训练数据截止日期\r\n */\r\n private String getModelTrainingDataCutoff(String modelId) {\r\n return \"2024年初\";\r\n }\r\n}"}}}}