{"repo": "azangalan/alan", "files": {"src/main/resources/application.properties": {"40753c1cb60611ceb5ee53de861ff10e2fc39009": {"t": 1785745398.538644, "n": 357, "h": "8bf308a0717b7e0e", "c": "spring.application.group=SpringBoot\n\n# ========== 大模型配置(由 AssistantFactory 读取)==========\n# DeepSeek(OpenAI 兼容协议)\napp.llm.deepseek.api-key=${DEEPSEEK_API_KEY}\napp.llm.deepseek.model-name=deepseek-chat\napp.llm.deepseek.base-url=https://api.deepseek.com/v1\n\n# 阿里云百炼 / 通义千问\napp.llm.dashscope.api-key=${DASHSCOPE_API_KEY}\n\n#启用日志debug级别\n#logging.level.root=debug\n"}, "ac29efab1b5694eb232958e6be1c71b9c84d05c4": {"t": 1785752559.514765, "n": 423, "h": "eac05e83fec0ee32", "c": "spring.application.group=SpringBoot\n#阿里百炼平台\nlangchain4j.community.dashscope.chat-model.api-key=sk-ws-H.EDEYLMH.iGL7.MEUCIQCs8-g9feEQ__DQu9nYIW0gA_z5Ejqruy7QF8Wb78TH9QIgeNKyTN5PADwXLp4JQl-EG8HD90Z8UNJ0tG1y2q65WRE\nlangchain4j.community.dashscope.chat-model.model-name=qwen3-max\n#请求和响应日志\nlangchain4j.open-ai.chat-model.log-requests=true\nlangchain4j.open-ai.chat-model.log-responses=true\n\n#启用日志debug级别\n#logging.level.root=debug"}, "99e2bcb45febb8209f1d7bdf3db3971c0361dd2b": {"t": 1785752562.3113396, "n": 327, "h": "844c1f684831a7fa", "c": "spring.application.group=SpringBoot\n#阿里百炼平台\nlangchain4j.community.dashscope.chat-model.api-key=${DASHSCOPE_API_KEY}\nlangchain4j.community.dashscope.chat-model.model-name=qwen3-max\n#请求和响应日志\nlangchain4j.open-ai.chat-model.log-requests=true\nlangchain4j.open-ai.chat-model.log-responses=true\n\n#启用日志debug级别\n#logging.level.root=debug"}, "35d05023d0f8ec1e4ecbb890d4c1c4825f0106a5": {"t": 1785752565.7309766, "n": 312, "h": "0f103af0dde2bb0e", "c": "spring.application.group=SpringBoot\n#阿里百炼平台\nlangchain4j.community.dashscope.chat-model.api-key=\nlangchain4j.community.dashscope.chat-model.model-name=qwen3-max\n#请求和响应日志\nlangchain4j.open-ai.chat-model.log-requests=true\nlangchain4j.open-ai.chat-model.log-responses=true\n\n#启用日志debug级别\n#logging.level.root=debug"}}, "src/main/java/com/qcby/springbootmybatis/service/AssistantFactory.java": {"40753c1cb60611ceb5ee53de861ff10e2fc39009": {"t": 1786068305.893297, "n": 3664, "h": "fc9b0c3b8eadd9e1", "c": "package com.qcby.springbootmybatis.service;\n\nimport dev.langchain4j.community.model.dashscope.QwenChatModel;\nimport dev.langchain4j.community.model.dashscope.QwenStreamingChatModel;\nimport dev.langchain4j.model.chat.ChatModel;\nimport dev.langchain4j.model.chat.StreamingChatModel;\nimport dev.langchain4j.model.openai.OpenAiChatModel;\nimport dev.langchain4j.model.openai.OpenAiStreamingChatModel;\nimport dev.langchain4j.memory.chat.ChatMemoryProvider;\nimport dev.langchain4j.service.AiServices;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * 多模型工厂:根据前端传入的模型名,动态构建并缓存对应的 Assistant 实例。\n * 支持:\n * - DeepSeek(OpenAI 兼容协议,deepseek-chat)\n * - 阿里云百炼 / 通义千问(qwen-plus / qwen-max / qwen-turbo ...)\n * 记忆(chatMemoryProvider)在所有模型间共享,切换模型可无缝继续同一段对话。\n */\n@Component\npublic class AssistantFactory {\n\n @Autowired\n private ChatMemoryProvider chatMemoryProvider;\n\n @Value(\"${app.llm.deepseek.api-key:${DEEPSEEK_API_KEY:}}\")\n private String deepseekApiKey;\n @Value(\"${app.llm.deepseek.model-name:deepseek-chat}\")\n private String deepseekModelName;\n @Value(\"${app.llm.deepseek.base-url:https://api.deepseek.com/v1}\")\n private String deepseekBaseUrl;\n\n @Value(\"${app.llm.dashscope.api-key:${DASHSCOPE_API_KEY:}}\")\n private String dashscopeApiKey;\n\n // 每个模型名 -> 对应的 Assistant 实例(懒加载 + 缓存,避免重复构建)\n private final Map assistantCache = new ConcurrentHashMap<>();\n\n private static final String DEFAULT_MODEL = \"deepseek-chat\";\n\n public Assistant getAssistant(String model) {\n if (model == null || model.isBlank()) {\n model = DEFAULT_MODEL;\n }\n return assistantCache.computeIfAbsent(model, this::buildAssistant);\n }\n\n private StreamingChatModel buildStreamingChatModel(String model) {\n if (model != null && model.startsWith(\"qwen\")) {\n return QwenStreamingChatModel.builder().apiKey(dashscopeApiKey).modelName(model).build();\n }\n return OpenAiStreamingChatModel.builder()\n .apiKey(deepseekApiKey).modelName(model != null ? model : \"deepseek-chat\")\n .baseUrl(deepseekBaseUrl).build();\n }\n\n private Assistant buildAssistant(String model) {\n ChatModel chatModel = buildChatModel(model);\n return AiServices.builder(Assistant.class)\n .chatModel(chatModel)\n .chatMemoryProvider(chatMemoryProvider)\n .streamingChatModel(buildStreamingChatModel(model))\n .build();\n }\n\n private ChatModel buildChatModel(String model) {\n // 阿里云百炼(通义千问)系列:以 qwen 开头\n if (model != null && model.startsWith(\"qwen\")) {\n return QwenChatModel.builder()\n .apiKey(dashscopeApiKey)\n .modelName(model)\n .build();\n }\n // 默认 / deepseek:走 OpenAI 兼容协议\n if (model == null || model.isBlank() || \"deepseek-chat\".equals(model)) {\n return OpenAiChatModel.builder()\n .apiKey(deepseekApiKey)\n .modelName(deepseekModelName)\n .baseUrl(deepseekBaseUrl)\n .logRequests(true)\n .logResponses(true)\n .build();\n }\n // 其他未知模型也走 OpenAI 兼容配置(可改 base-url 指向别家)\n return OpenAiChatModel.builder()\n .apiKey(deepseekApiKey)\n .modelName(model)\n .baseUrl(deepseekBaseUrl)\n .build();\n\n }\n}\n "}}}}