diff --git a/ruoyi-modules/hwmom-ai/pom.xml b/ruoyi-modules/hwmom-ai/pom.xml
new file mode 100644
index 00000000..f1594102
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/pom.xml
@@ -0,0 +1,260 @@
+
+
+
+ org.dromara
+ ruoyi-modules
+ ${revision}
+
+ 4.0.0
+
+ hwmom-ai
+
+
+ hwmom-ai人工智能系统模块
+
+
+
+ 1.59.0
+
+
+
+
+
+ org.dromara
+ ruoyi-common-nacos
+
+
+
+ org.dromara
+ ruoyi-common-sentinel
+
+
+
+
+ org.dromara
+ ruoyi-common-log
+
+
+
+ org.dromara
+ ruoyi-common-dict
+
+
+
+ org.dromara
+ ruoyi-common-doc
+
+
+
+ org.dromara
+ ruoyi-common-web
+
+
+
+ org.dromara
+ ruoyi-common-mybatis
+
+
+
+ org.dromara
+ ruoyi-common-dubbo
+
+
+
+ org.dromara
+ ruoyi-common-seata
+
+
+
+ org.dromara
+ ruoyi-common-idempotent
+
+
+
+ org.dromara
+ ruoyi-common-tenant
+
+
+
+ org.dromara
+ ruoyi-common-security
+
+
+
+ org.dromara
+ ruoyi-common-translation
+
+
+
+ org.dromara
+ ruoyi-common-sensitive
+
+
+
+
+ org.dromara
+ ruoyi-api-resource
+
+
+
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+
+
+ org.dromara
+ hwmom-common-mom
+ 2.2.2
+ compile
+
+
+
+
+
+
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.13
+
+
+
+
+ com.theokanning.openai-gpt3-java
+ service
+ 0.18.0
+
+
+ com.theokanning.openai-gpt3-java
+ client
+ 0.18.0
+
+
+
+
+ org.tensorflow
+ tensorflow-core-platform
+ 0.5.0
+
+
+ org.deeplearning4j
+ deeplearning4j-core
+ 1.0.0-M2.1
+
+
+
+ ai.djl
+ api
+ 0.28.0
+
+
+ ai.djl
+ model-zoo
+ 0.25.0
+
+
+ ai.djl.pytorch
+ pytorch-engine
+ 0.25.0
+ runtime
+
+
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+
+ org.apache.tika
+ tika-core
+ 2.9.1
+
+
+
+
+
+
+
+
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+
+ com.tencentcloudapi
+ tencentcloud-sdk-java-common
+ LATEST
+
+
+ com.tencentcloudapi
+ tencentcloud-sdk-java
+ LATEST
+
+
+
+ com.github.jelmerk
+ hnswlib-core
+ 1.1.0
+
+
+ org.springframework.security
+ spring-security-core
+
+
+ org.springframework
+ spring-webflux
+
+
+
+
+ io.milvus
+ milvus-sdk-java
+ 2.4.1
+
+
+ org.dromara
+ ruoyi-common-encrypt
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/HwMomAiApplication.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/HwMomAiApplication.java
new file mode 100644
index 00000000..9665d8cd
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/HwMomAiApplication.java
@@ -0,0 +1,25 @@
+package org.dromara.ai;
+
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.dromara.common.properties.MesProperties;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+
+/**
+ * 系统模块
+ *
+ * @author ruoyi
+ */
+@EnableDubbo
+@SpringBootApplication
+@EnableConfigurationProperties(MesProperties.class)
+public class HwMomAiApplication {
+ public static void main(String[] args) {
+ SpringApplication application = new SpringApplication(HwMomAiApplication.class);
+ application.setApplicationStartup(new BufferingApplicationStartup(2048));
+ application.run(args);
+ System.out.println("(♥◠‿◠)ノ゙ AI模块启动成功 ლ(´ڡ`ლ)゙ ");
+ }
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiAssistantController.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiAssistantController.java
new file mode 100644
index 00000000..93d867d7
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiAssistantController.java
@@ -0,0 +1,158 @@
+package org.dromara.ai.controller;
+
+/**
+ * @Author xins
+ * @Date 2025/7/17 14:26
+ * @Description:AI助手Controller
+ */
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.ai.domain.bo.AiChatMessageBo;
+import org.dromara.ai.domain.bo.AiChatMessageTopicBo;
+import org.dromara.ai.domain.bo.AiModelBo;
+import org.dromara.ai.domain.vo.AiChatMessageVo;
+import org.dromara.ai.domain.vo.AiModelVo;
+import org.dromara.ai.knowledge.vectorization.factory.EmbeddingServiceFactory;
+import org.dromara.ai.knowledge.vectorization.process.IEmbeddingProcessor;
+import org.dromara.ai.process.dto.AIMessage;
+import org.dromara.ai.process.dto.AIRequest;
+import org.dromara.ai.process.dto.AIResponse;
+import org.dromara.ai.process.provider.processor.AIProviderProcessorFactory;
+import org.dromara.ai.process.provider.processor.IUnifiedAIProviderProcessor;
+import org.dromara.ai.service.*;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.api.model.LoginUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/assistant")
+public class AiAssistantController extends BaseController {
+
+ private final AIProviderProcessorFactory aiProviderProcessorFactory;
+
+ private final EmbeddingServiceFactory embeddingServiceFactory;
+
+ private final IAIAssistantService aiAssistantService;
+
+ private final IAiModelService aiModelService;
+
+ private final IAiChatMessageService aiChatMessageService;
+
+ private final IAiChatMessageDetailService aiChatMessageDetailService;
+
+ /**
+ * 下拉框查询AI模型列表
+ */
+ @GetMapping("/getAiModelJoinList")
+ public R> getAiModelJoinList(AiModelBo bo) {
+ List list = aiModelService.queryJoinList(bo);
+ return R.ok(list);
+ }
+
+ /**
+ * 下拉框查询AI模型列表
+ */
+ @GetMapping("/getAiChatMessageList")
+ public R> getAiChatMessageList(AiChatMessageBo bo) {
+ List list = aiChatMessageService.queryList(bo);
+ return R.ok(list);
+ }
+
+ /**
+ * 下拉框查询AI模型列表
+ */
+ @GetMapping("/getAiChatMessages/{sessionId}")
+ public R> getAiChatMessages(@PathVariable("sessionId") String sessionId) {
+ List list = aiChatMessageDetailService.getAIChatMessages(sessionId);
+ return R.ok(list);
+ }
+
+ /**
+ * 更新message topic
+ */
+ @Log(title = "会话标题", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PostMapping("/updateAiChatMessageTopic")
+ public R updateAiChatMessageTopic(@Validated(EditGroup.class) @RequestBody AiChatMessageTopicBo bo) {
+ return toAjax(aiChatMessageService.updateMessageTopic(bo));
+ }
+
+ /**
+ * 删除聊天消息
+ *
+ * @param sessionId 会话ID
+ */
+ @SaCheckPermission("ai:aiChatMessage:remove")
+ @Log(title = "聊天消息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{sessionId}")
+ public R remove(@NotEmpty(message = "会话ID不能为空")
+ @PathVariable String sessionId) {
+ return toAjax(aiChatMessageService.deleteWithValidBySessionId(sessionId, true));
+ }
+
+ /**
+ * 流式聊天接口
+ */
+ @PostMapping(value = "/chatStream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+ public Flux chatStream(
+ @RequestParam("provider") String provider, @RequestBody AIRequest request) {
+ LoginUser loginUser = LoginHelper.getLoginUser();
+ IUnifiedAIProviderProcessor processor = aiProviderProcessorFactory.getProcessor(provider);
+ return processor.chatStream(request,loginUser);
+ }
+
+ /**
+ * 非流式聊天接口
+ */
+ @PostMapping("/chat")
+ public Mono chat(
+ @RequestParam("provider") String provider, @RequestBody AIRequest request) {
+
+ IUnifiedAIProviderProcessor processor = aiProviderProcessorFactory.getProcessor(provider);
+ return processor.chat(request);
+ }
+
+
+
+ /**
+ * 向量化
+ */
+ @PostMapping("/embedding")
+ public String embedding(
+ @RequestParam("provider") String provider) {
+
+ IEmbeddingProcessor embeddingProcessor = embeddingServiceFactory.getProcessor(provider);
+ embeddingProcessor.getEmbedding("你好");
+ return "";
+ }
+
+
+
+
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiChatMessageController.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiChatMessageController.java
new file mode 100644
index 00000000..756253b4
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiChatMessageController.java
@@ -0,0 +1,117 @@
+package org.dromara.ai.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.ai.domain.vo.AiChatMessageVo;
+import org.dromara.ai.domain.bo.AiChatMessageBo;
+import org.dromara.ai.service.IAiChatMessageService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 聊天消息
+ * 前端访问路由地址为:/ai/aiChatMessage
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/aiChatMessage")
+public class AiChatMessageController extends BaseController {
+
+ private final IAiChatMessageService aiChatMessageService;
+
+ /**
+ * 查询聊天消息列表
+ */
+ @SaCheckPermission("ai:aiChatMessage:list")
+ @GetMapping("/list")
+ public TableDataInfo list(AiChatMessageBo bo, PageQuery pageQuery) {
+ return aiChatMessageService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出聊天消息列表
+ */
+ @SaCheckPermission("ai:aiChatMessage:export")
+ @Log(title = "聊天消息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(AiChatMessageBo bo, HttpServletResponse response) {
+ List list = aiChatMessageService.queryList(bo);
+ ExcelUtil.exportExcel(list, "聊天消息", AiChatMessageVo.class, response);
+ }
+
+ /**
+ * 获取聊天消息详细信息
+ *
+ * @param chatMessageId 主键
+ */
+ @SaCheckPermission("ai:aiChatMessage:query")
+ @GetMapping("/{chatMessageId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long chatMessageId) {
+ return R.ok(aiChatMessageService.queryById(chatMessageId));
+ }
+
+ /**
+ * 新增聊天消息
+ */
+ @SaCheckPermission("ai:aiChatMessage:add")
+ @Log(title = "聊天消息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody AiChatMessageBo bo) {
+ return toAjax(aiChatMessageService.insertByBo(bo));
+ }
+
+ /**
+ * 修改聊天消息
+ */
+ @SaCheckPermission("ai:aiChatMessage:edit")
+ @Log(title = "聊天消息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody AiChatMessageBo bo) {
+ return toAjax(aiChatMessageService.updateByBo(bo));
+ }
+
+ /**
+ * 删除聊天消息
+ *
+ * @param chatMessageIds 主键串
+ */
+ @SaCheckPermission("ai:aiChatMessage:remove")
+ @Log(title = "聊天消息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{chatMessageIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] chatMessageIds) {
+ return toAjax(aiChatMessageService.deleteWithValidByIds(List.of(chatMessageIds), true));
+ }
+
+
+ /**
+ * 下拉框查询聊天消息列表
+ */
+
+ @GetMapping("/getAiChatMessageList")
+ public R> getAiChatMessageList(AiChatMessageBo bo) {
+ List list = aiChatMessageService.queryList(bo);
+ return R.ok(list);
+ }
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiKnowledgeBaseTypeController.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiKnowledgeBaseTypeController.java
new file mode 100644
index 00000000..afec7ccf
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiKnowledgeBaseTypeController.java
@@ -0,0 +1,117 @@
+package org.dromara.ai.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.ai.domain.vo.AiKnowledgeBaseTypeVo;
+import org.dromara.ai.domain.bo.AiKnowledgeBaseTypeBo;
+import org.dromara.ai.service.IAiKnowledgeBaseTypeService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * AI知识库类型
+ * 前端访问路由地址为:/ai/aiKnowledgeBaseType
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/aiKnowledgeBaseType")
+public class AiKnowledgeBaseTypeController extends BaseController {
+
+ private final IAiKnowledgeBaseTypeService aiKnowledgeBaseTypeService;
+
+ /**
+ * 查询AI知识库类型列表
+ */
+ @SaCheckPermission("ai:aiKnowledgeBaseType:list")
+ @GetMapping("/list")
+ public TableDataInfo list(AiKnowledgeBaseTypeBo bo, PageQuery pageQuery) {
+ return aiKnowledgeBaseTypeService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出AI知识库类型列表
+ */
+ @SaCheckPermission("ai:aiKnowledgeBaseType:export")
+ @Log(title = "AI知识库类型", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(AiKnowledgeBaseTypeBo bo, HttpServletResponse response) {
+ List list = aiKnowledgeBaseTypeService.queryList(bo);
+ ExcelUtil.exportExcel(list, "AI知识库类型", AiKnowledgeBaseTypeVo.class, response);
+ }
+
+ /**
+ * 获取AI知识库类型详细信息
+ *
+ * @param knowledgeBaseTypeId 主键
+ */
+ @SaCheckPermission("ai:aiKnowledgeBaseType:query")
+ @GetMapping("/{knowledgeBaseTypeId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long knowledgeBaseTypeId) {
+ return R.ok(aiKnowledgeBaseTypeService.queryById(knowledgeBaseTypeId));
+ }
+
+ /**
+ * 新增AI知识库类型
+ */
+ @SaCheckPermission("ai:aiKnowledgeBaseType:add")
+ @Log(title = "AI知识库类型", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody AiKnowledgeBaseTypeBo bo) {
+ return toAjax(aiKnowledgeBaseTypeService.insertByBo(bo));
+ }
+
+ /**
+ * 修改AI知识库类型
+ */
+ @SaCheckPermission("ai:aiKnowledgeBaseType:edit")
+ @Log(title = "AI知识库类型", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody AiKnowledgeBaseTypeBo bo) {
+ return toAjax(aiKnowledgeBaseTypeService.updateByBo(bo));
+ }
+
+ /**
+ * 删除AI知识库类型
+ *
+ * @param knowledgeBaseTypeIds 主键串
+ */
+ @SaCheckPermission("ai:aiKnowledgeBaseType:remove")
+ @Log(title = "AI知识库类型", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{knowledgeBaseTypeIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] knowledgeBaseTypeIds) {
+ return toAjax(aiKnowledgeBaseTypeService.deleteWithValidByIds(List.of(knowledgeBaseTypeIds), true));
+ }
+
+
+ /**
+ * 下拉框查询AI知识库类型列表
+ */
+
+ @GetMapping("/getAiKnowledgeBaseTypeList")
+ public R> getAiKnowledgeBaseTypeList(AiKnowledgeBaseTypeBo bo) {
+ List list = aiKnowledgeBaseTypeService.queryList(bo);
+ return R.ok(list);
+ }
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiModelController.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiModelController.java
new file mode 100644
index 00000000..9dca7076
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiModelController.java
@@ -0,0 +1,181 @@
+package org.dromara.ai.controller;
+
+import java.time.Duration;
+import java.util.Collections;
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.ai.domain.bo.AiBaseModelBo;
+import org.dromara.ai.domain.bo.AiPlatformBo;
+import org.dromara.ai.domain.vo.AiBaseModelVo;
+import org.dromara.ai.domain.vo.AiPlatformVo;
+import org.dromara.ai.process.dto.AIMessage;
+import org.dromara.ai.process.dto.AIRequest;
+import org.dromara.ai.process.dto.AIResponse;
+import org.dromara.ai.process.provider.processor.AIProviderProcessorFactory;
+import org.dromara.ai.process.provider.processor.IUnifiedAIProviderProcessor;
+import org.dromara.ai.service.IAIAssistantService;
+import org.dromara.ai.service.IAiBaseModelService;
+import org.dromara.ai.service.IAiPlatformService;
+import org.dromara.common.encrypt.utils.EncryptUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.ai.domain.vo.AiModelVo;
+import org.dromara.ai.domain.bo.AiModelBo;
+import org.dromara.ai.service.IAiModelService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * AI模型
+ * 前端访问路由地址为:/ai/aiModel
+ *
+ * @author xins
+ * @date 2025-08-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/aiModel")
+public class AiModelController extends BaseController {
+
+ private final IAiModelService aiModelService;
+
+ private final IAiPlatformService aiPlatformService;
+
+ private final IAiBaseModelService baseModelService;
+
+ private final IAIAssistantService assistantService;
+
+ @Autowired
+ private AIProviderProcessorFactory aiProviderProcessorFactory;
+
+ /**
+ * 查询AI模型列表
+ */
+ @SaCheckPermission("ai:aiModel:list")
+ @GetMapping("/list")
+ public R> list(AiModelBo bo) {
+ return R.ok(aiModelService.queryJoinList(bo));
+ }
+
+ /**
+ * 导出AI模型列表
+ */
+ @SaCheckPermission("ai:aiModel:export")
+ @Log(title = "AI模型", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(AiModelBo bo, HttpServletResponse response) {
+ List list = aiModelService.queryList(bo);
+ ExcelUtil.exportExcel(list, "AI模型", AiModelVo.class, response);
+ }
+
+ /**
+ * 获取AI模型详细信息
+ *
+ * @param modelId 主键
+ */
+ @SaCheckPermission("ai:aiModel:query")
+ @GetMapping("/{modelId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long modelId) {
+ return R.ok(aiModelService.queryById(modelId));
+ }
+
+ /**
+ * 新增AI模型
+ */
+ @SaCheckPermission("ai:aiModel:add")
+ @Log(title = "AI模型", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody AiModelBo bo) {
+ return toAjax(aiModelService.insertByBo(bo));
+ }
+
+ /**
+ * 修改AI模型
+ */
+ @SaCheckPermission("ai:aiModel:edit")
+ @Log(title = "AI模型", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody AiModelBo bo) {
+ return toAjax(aiModelService.updateByBo(bo));
+ }
+
+ /**
+ * 删除AI模型
+ *
+ * @param modelIds 主键串
+ */
+ @SaCheckPermission("ai:aiModel:remove")
+ @Log(title = "AI模型", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{modelIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] modelIds) {
+ return toAjax(aiModelService.deleteWithValidByIds(List.of(modelIds), true));
+ }
+
+
+ /**
+ * 下拉框查询AI模型列表
+ */
+
+ @GetMapping("/getAiModelList")
+ public R> getAiModelList(AiModelBo bo) {
+ List list = aiModelService.queryList(bo);
+ return R.ok(list);
+ }
+
+
+ /**
+ * 测试配置是否正确
+ */
+ @PostMapping("/testAIModel")
+ public R testAIModel(@RequestParam("provider") String provider, @RequestBody AIRequest request) {
+ IUnifiedAIProviderProcessor processor = aiProviderProcessorFactory.getProcessor(provider);
+
+ String modelType = request.getModelType();
+ switch (modelType) {
+ case "LLM":
+ AIResponse aiResponse = processor.chatTest(request).block(Duration.ofSeconds(10));
+ if (aiResponse != null && aiResponse.isSuccess()) {
+ System.out.println(aiResponse.getContent());
+ System.out.println(aiResponse.getRawResponse());
+ return R.ok();
+ } else {
+ System.out.println(aiResponse.getContent());
+ System.out.println(aiResponse.getErrorMessage());
+// return R.fail(aiResponse.getErrorMessage());
+ throw new RuntimeException(aiResponse.getErrorMessage());
+ }
+ case "Embedding":
+ List embedding = processor.getEmbeddingTest(request);
+ if (embedding != null && !embedding.isEmpty()) {
+ System.out.println(embedding);
+ return R.ok();
+ } else {
+// return R.fail(aiResponse.getErrorMessage());
+ }
+ break;
+
+ }
+
+ return R.fail("模型类型错误");
+
+ }
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiPlatformController.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiPlatformController.java
new file mode 100644
index 00000000..81622a61
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/controller/AiPlatformController.java
@@ -0,0 +1,144 @@
+package org.dromara.ai.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.ai.domain.AiBaseModel;
+import org.dromara.ai.domain.bo.AiBaseModelBo;
+import org.dromara.ai.service.IAiBaseModelService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.ai.domain.vo.AiPlatformVo;
+import org.dromara.ai.domain.bo.AiPlatformBo;
+import org.dromara.ai.service.IAiPlatformService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * AI平台
+ * 前端访问路由地址为:/ai/base/aiPlatform
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/base/aiPlatform")
+public class AiPlatformController extends BaseController {
+
+ private final IAiPlatformService aiPlatformService;
+
+ private final IAiBaseModelService aiBaseModelService;
+
+// /**
+// * 查询AI平台列表
+// */
+// @SaCheckPermission("ai/base:aiPlatform:list")
+// @GetMapping("/list")
+// public TableDataInfo list(AiPlatformBo bo, PageQuery pageQuery) {
+// return aiPlatformService.queryPageList(bo, pageQuery);
+// }
+
+ /**
+ * 查询AI平台列表
+ */
+ @SaCheckPermission("ai/base:aiPlatform:list")
+ @GetMapping("/list")
+ public R> list(AiPlatformBo bo) {
+ return R.ok(aiPlatformService.queryList(bo));
+ }
+
+
+ @GetMapping("/getAiBaseModelList")
+ public R> getAiBaseModelList(AiBaseModelBo bo) {
+ List list = aiBaseModelService.queryJoinList(bo);
+ return R.ok(list);
+ }
+
+
+
+
+
+
+
+ /**
+ * 导出AI平台列表
+ */
+ @SaCheckPermission("ai/base:aiPlatform:export")
+ @Log(title = "AI平台", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(AiPlatformBo bo, HttpServletResponse response) {
+ List list = aiPlatformService.queryList(bo);
+ ExcelUtil.exportExcel(list, "AI平台", AiPlatformVo.class, response);
+ }
+
+ /**
+ * 获取AI平台详细信息
+ *
+ * @param platformId 主键
+ */
+ @SaCheckPermission("ai/base:aiPlatform:query")
+ @GetMapping("/{platformId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long platformId) {
+ return R.ok(aiPlatformService.queryById(platformId));
+ }
+
+ /**
+ * 新增AI平台
+ */
+ @SaCheckPermission("ai/base:aiPlatform:add")
+ @Log(title = "AI平台", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody AiPlatformBo bo) {
+ return toAjax(aiPlatformService.insertByBo(bo));
+ }
+
+ /**
+ * 修改AI平台
+ */
+ @SaCheckPermission("ai/base:aiPlatform:edit")
+ @Log(title = "AI平台", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody AiPlatformBo bo) {
+ return toAjax(aiPlatformService.updateByBo(bo));
+ }
+
+ /**
+ * 删除AI平台
+ *
+ * @param platformIds 主键串
+ */
+ @SaCheckPermission("ai/base:aiPlatform:remove")
+ @Log(title = "AI平台", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{platformIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] platformIds) {
+ return toAjax(aiPlatformService.deleteWithValidByIds(List.of(platformIds), true));
+ }
+
+
+ /**
+ * 下拉框查询AI平台列表
+ */
+
+ @GetMapping("/getAiPlatformList")
+ public R> getAiPlatformList(AiPlatformBo bo) {
+ List list = aiPlatformService.queryList(bo);
+ return R.ok(list);
+ }
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiApiEndpoint.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiApiEndpoint.java
new file mode 100644
index 00000000..7617e1aa
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiApiEndpoint.java
@@ -0,0 +1,65 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * API端点对象 ai_api_endpoint
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("ai_api_endpoint")
+public class AiApiEndpoint extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ private Long apiEndpointId;
+
+ /**
+ * 基础模型ID,关联ai_base_model
+ */
+ private Long baseModelId;
+
+ /**
+ * api端点名称,例如: chat/completions, embeddings
+ */
+ private String apiEndpointName;
+
+ /**
+ * api版本
+ */
+ private String apiVersion;
+
+ /**
+ * GET, POST
+ */
+ private String httpMethod;
+
+ /**
+ * api端点路径,例如: /v1/chat/completions
+ */
+ private String apiEndpointPath;
+
+ /**
+ * 默认标识(1是,0否)
+ */
+ private String defaultFlag;
+
+ /**
+ * 每分钟请求限制
+ */
+ private Long rateLimit;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java
new file mode 100644
index 00000000..c5a956b6
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiBaseModel.java
@@ -0,0 +1,82 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * 基础模型对象 ai_base_model
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@TableName("ai_base_model")
+public class AiBaseModel {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ private Long baseModelId;
+
+ /**
+ * 平台ID,关联ai_platform
+ */
+ private Long platformId;
+
+ /**
+ * 模型类型ID,关联ai_model_type
+ */
+ private Long modelTypeId;
+
+ /**
+ * 模型类型编码,同ai_model_type中的编码
+ */
+ private Long modelTypeCode;
+
+ /**
+ * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3
+ */
+ private String baseModelName;
+
+ /**
+ * 基础模型描述
+ */
+ private String baseModelDescription;
+
+ /**
+ * 上下文长度(如32k)
+ */
+ private Long contextLength;
+
+ /**
+ * 激活标识(1是,0否)
+ */
+ private String activeFlag;
+
+ /**
+ * 模型能力列表
+ */
+ @TableField(exist = false)
+ private List aiModelCapabilityList;
+
+ /**
+ * api端点列表
+ */
+ @TableField(exist = false)
+ private List aiApiEndpointList;
+
+
+ /**
+ * 模型类型名称
+ */
+ @TableField(exist = false)
+ private String modelTypeName;
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiChatMessage.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiChatMessage.java
new file mode 100644
index 00000000..53e69b65
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiChatMessage.java
@@ -0,0 +1,66 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 聊天消息对象 ai_chat_message
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("ai_chat_message")
+public class AiChatMessage extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "chat_message_id", type = IdType.AUTO)
+ private Long chatMessageId;
+
+ /**
+ * 会话ID
+ */
+ private String sessionId;
+
+ /**
+ * 聊天标题
+ */
+ private String messageTopic;
+
+ /**
+ * 扣除金额(暂时不用)
+ */
+ private Long deductCost;
+
+ /**
+ * 累计 Tokens
+ */
+ private Long totalToken;
+
+ /**
+ * 模型ID,关联ai_model
+ */
+ private Long modelId;
+
+ /**
+ * 知识库ID,关联ai_knowledge_base
+ */
+ private Long knowledgeBaseId;
+
+ /**
+ * 聊天类型(1AI问答,2知识库问答,3AI生成SQL,4AI填报)
+ */
+ private String messageType;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiChatMessageDetail.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiChatMessageDetail.java
new file mode 100644
index 00000000..d50c9562
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiChatMessageDetail.java
@@ -0,0 +1,86 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 聊天消息详情对象 ai_chat_message_detail
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("ai_chat_message_detail")
+public class AiChatMessageDetail extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "message_detail_id", type = IdType.AUTO)
+ private Long messageDetailId;
+
+ /**
+ * 聊天信息ID,关联ai_chat_message
+ */
+ private Long chatMessageId;
+
+ /**
+ * 会话ID
+ */
+ private String sessionId;
+
+ /**
+ * 提问内容
+ */
+ private String questionContent;
+
+ /**
+ * 回答内容
+ */
+ private String answerContent;
+
+ /**
+ * 提问token数量
+ */
+ private Long promptToken;
+
+ /**
+ * 回复token数量
+ */
+ private Long completionToken;
+
+ /**
+ * 累计 Token数量
+ */
+ private Long totalToken;
+
+ /**
+ * 模型ID,关联ai_model
+ */
+ private Long modelId;
+
+ /**
+ * 知识库ID,关联ai_knowledge_base
+ */
+ private Long knowledgeBaseId;
+
+ /**
+ * 是否携带历史内容(1是,0否)
+ */
+ private String takeFlag;
+
+ /**
+ * 完整标识(1是,0否),代表回复信息是否完整回复,中间可以暂停继续。
+ */
+ private String completeFlag;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiKnowledgeBaseType.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiKnowledgeBaseType.java
new file mode 100644
index 00000000..4fecce3c
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiKnowledgeBaseType.java
@@ -0,0 +1,47 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * AI知识库类型对象 ai_knowledge_base_type
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("ai_knowledge_base_type")
+public class AiKnowledgeBaseType extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "knowledge_base_type_id", type = IdType.AUTO)
+ private Long knowledgeBaseTypeId;
+
+ /**
+ * 知识库类型名称
+ */
+ private String knowledgeBaseTypeName;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModel.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModel.java
new file mode 100644
index 00000000..c1a0b074
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModel.java
@@ -0,0 +1,162 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * AI模型对象 ai_model
+ *
+ * @author xins
+ * @date 2025-08-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("ai_model")
+public class AiModel extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "model_id", type = IdType.AUTO)
+ private Long modelId;
+
+ /**
+ * 模型名称
+ */
+ private String modelName;
+
+ /**
+ * AI平台ID,关联ai_platform
+ */
+ private Long platformId;
+
+ /**
+ * 模型类型ID,关联ai_model_type
+ */
+ private Long modelTypeId;
+
+ /**
+ * 基础模型ID,关联ai_base_model
+ */
+ private Long baseModelId;
+
+ /**
+ * 计费类型(1token计费,2次数计费)
+ */
+ private String chargeType;
+
+ /**
+ * 模型价格
+ */
+ private Long modelPrice;
+
+ /**
+ * 请求地址
+ */
+ private String apiEndpoint;
+
+ /**
+ * 秘钥
+ */
+ private String apiKey;
+
+ /**
+ * 密钥
+ */
+ private String apiSecret;
+
+ /**
+ * 向量库(1milvus,2weaviate,)
+ */
+ private String vectorLibrary;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ /**
+ * 高级配置—模型温度(0-1);值越大,回复内容越赋有多样性创造性、随机性;设为0根据事实回答,希望得到精准答案应该降低该参数;日常聊天建议0.5-0.8
+ */
+ private Long modelTemperature;
+
+ /**
+ * 高级配置—词汇属性(0-1);值越小,AI生成的内容越单调也越容易理解;值越大,AI回复的词汇范围越大,越多样化
+ */
+ private Long vocabularyAttribute;
+
+ /**
+ * 高级配置—话题属性(-2.0-2.0);值越大,越能够让AI更好的控制新话题的引入,建议微调或不变
+ */
+ private Long topicAttribute;
+
+ /**
+ * 高级配置—重复属性(-2.0-2.0);值越大,越能够让AI更好的避免重复之前说过的话,建议微调或不变
+ */
+ private Long duplicateAttribute;
+
+ /**
+ * 高级配置—最大回复(1-16000);设置AI最大回复内容大小,会影响返回结果内容的长度;普通聊天建议500-800;短文生成建议800-2000;代码生成建议2000-3600;长文生成建议4000左右(或选择长回复模型)
+ */
+ private Long maxReply;
+
+ /**
+ * 默认标识(1是,0否)
+ */
+ private String defaultFlag;
+
+ /**
+ * 激活标识(1是,0否)
+ */
+ private String activeFlag;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+ /**
+ * AI平台编码
+ */
+ @TableField(exist = false)
+ private String platformCode;
+
+ /**
+ * AI平台名称
+ */
+ @TableField(exist = false)
+ private String platformName;
+
+ /**
+ * AI平台图标
+ */
+ @TableField(exist = false)
+ private String platformIcon;
+
+ /**
+ * 模型类型编码
+ */
+ @TableField(exist = false)
+ private String modelTypeCode;
+
+ /**
+ * 模型类型名称
+ */
+ @TableField(exist = false)
+ private String modelTypeName;
+
+ /**
+ * 基础模型名称
+ */
+ @TableField(exist = false)
+ private String baseModelName;
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModelCapability.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModelCapability.java
new file mode 100644
index 00000000..dd12c331
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModelCapability.java
@@ -0,0 +1,45 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 模型能力对象 ai_model_capability
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("ai_model_capability")
+public class AiModelCapability extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ private Long modelCapabilityId;
+
+ /**
+ * 基础模型ID,关联ai_base_model
+ */
+ private Long baseModelId;
+
+ /**
+ * 模型能力名称,例如: 多轮对话, 函数调用, 视觉理解
+ */
+ private String modelCapabilityName;
+
+ /**
+ * 模型能力描述
+ */
+ private String modelCapabilityDescription;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModelType.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModelType.java
new file mode 100644
index 00000000..7f526027
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiModelType.java
@@ -0,0 +1,45 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 模型类型对象 ai_model_type
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("ai_model_type")
+public class AiModelType extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ private Long modelTypeId;
+
+ /**
+ * 模型类型编码(LLM、Embedding)
+ */
+ private String modelTypeCode;
+
+ /**
+ * 模型类型名称(语言模型、向量模型)
+ */
+ private String modelTypeName;
+
+ /**
+ * 模型类型描述
+ */
+ private String modelTypeDescription;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiPlatform.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiPlatform.java
new file mode 100644
index 00000000..d959eca9
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/AiPlatform.java
@@ -0,0 +1,66 @@
+package org.dromara.ai.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * AI平台对象 ai_platform
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("ai_platform")
+public class AiPlatform extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 平台ID,主键
+ */
+ private Long platformId;
+
+ /**
+ * 平台编码,如DeepSeek, TongYi-QianWen, Tencent-LKE, WenXin-YiYan
+ */
+ private String platformCode;
+
+ /**
+ * 平台名称,如DeepSeek, 通义千问, 智普AI
+ */
+ private String platformName;
+
+ /**
+ * 平台描述
+ */
+ private String platformDescription;
+
+ /**
+ * base api url地址
+ */
+ private String baseApiUrl;
+
+ /**
+ * 平台图标
+ */
+ private String platformIcon;
+
+ /**
+ * 授权方法(1,API_KEY,2,OAUTH2),先支持API_KEY
+ */
+ private String authMethod;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java
new file mode 100644
index 00000000..65727f7f
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiBaseModelBo.java
@@ -0,0 +1,72 @@
+package org.dromara.ai.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.ai.domain.AiBaseModel;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 基础模型业务对象 ai_base_model
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@AutoMapper(target = AiBaseModel.class, reverseConvertGenerate = false)
+public class AiBaseModelBo {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long baseModelId;
+
+ /**
+ * 平台ID,关联ai_platform
+ */
+ @NotNull(message = "平台ID,关联ai_platform不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long platformId;
+
+ /**
+ * 模型类型ID,关联ai_model_type
+ */
+ @NotNull(message = "模型类型ID,关联ai_model_type不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long modelTypeId;
+
+ /**
+ * 模型类型编码,同ai_model_type中的编码
+ */
+ @NotNull(message = "模型类型编码不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long modelTypeCode;
+
+ /**
+ * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3
+ */
+ @NotBlank(message = "基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String baseModelName;
+
+ /**
+ * 基础模型描述
+ */
+ @NotBlank(message = "基础模型描述不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String baseModelDescription;
+
+ /**
+ * 上下文长度(如32k)
+ */
+ @NotNull(message = "上下文长度(如32k)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long contextLength;
+
+ /**
+ * 激活标识(1是,0否)
+ */
+ @NotBlank(message = "激活标识(1是,0否)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String activeFlag;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageBo.java
new file mode 100644
index 00000000..ff6906b9
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageBo.java
@@ -0,0 +1,73 @@
+package org.dromara.ai.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.ai.domain.AiChatMessage;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 聊天消息业务对象 ai_chat_message
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AiChatMessage.class, reverseConvertGenerate = false)
+public class AiChatMessageBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long chatMessageId;
+
+ /**
+ * 会话ID
+ */
+ @NotNull(message = "会话ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String sessionId;
+
+ /**
+ * 聊天标题
+ */
+ @NotBlank(message = "聊天标题不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String messageTopic;
+
+ /**
+ * 扣除金额(暂时不用)
+ */
+ @NotNull(message = "扣除金额(暂时不用)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long deductCost;
+
+ /**
+ * 累计 Tokens
+ */
+ @NotNull(message = "累计 Tokens不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long totalToken;
+
+ /**
+ * 模型ID,关联ai_model
+ */
+ @NotNull(message = "模型ID,关联ai_model不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long modelId;
+
+ /**
+ * 知识库ID,关联ai_knowledge_base
+ */
+ @NotNull(message = "知识库ID,关联ai_knowledge_base不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long knowledgeBaseId;
+
+ /**
+ * 聊天类型(1AI问答,2知识库问答,3AI生成SQL,4AI填报)
+ */
+ @NotBlank(message = "聊天类型(1AI问答,2知识库问答,3AI生成SQL,4AI填报)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String messageType;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageDetailBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageDetailBo.java
new file mode 100644
index 00000000..13cb0677
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageDetailBo.java
@@ -0,0 +1,96 @@
+package org.dromara.ai.domain.bo;
+
+import org.dromara.ai.domain.AiChatMessageDetail;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 聊天消息详情业务对象 ai_chat_message_detail
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AiChatMessageDetail.class, reverseConvertGenerate = false)
+public class AiChatMessageDetailBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long messageDetailId;
+
+ /**
+ * 聊天信息ID,关联ai_chat_message
+ */
+ @NotNull(message = "聊天信息ID,关联ai_chat_message不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long chatMessageId;
+
+ /**
+ * 会话ID
+ */
+ @NotNull(message = "会话ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String sessionId;
+
+ /**
+ * 提问内容
+ */
+ @NotBlank(message = "提问内容不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String questionContent;
+
+ /**
+ * 回答内容
+ */
+ @NotBlank(message = "回答内容不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String answerContent;
+
+ /**
+ * 提问token数量
+ */
+ @NotNull(message = "提问token数量不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long promptToken;
+
+ /**
+ * 回复token数量
+ */
+ @NotNull(message = "回复token数量不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long completionToken;
+
+ /**
+ * 累计 Token数量
+ */
+ @NotNull(message = "累计 Token数量不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long totalToken;
+
+ /**
+ * 模型ID,关联ai_model
+ */
+ @NotNull(message = "模型ID,关联ai_model不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long modelId;
+
+ /**
+ * 知识库ID,关联ai_knowledge_base
+ */
+ @NotNull(message = "知识库ID,关联ai_knowledge_base不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long knowledgeBaseId;
+
+ /**
+ * 是否携带历史内容(1是,0否)
+ */
+ @NotBlank(message = "是否携带历史内容(1是,0否)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String takeFlag;
+
+ /**
+ * 完整标识(1是,0否),代表回复信息是否完整回复,中间可以暂停继续。
+ */
+ @NotBlank(message = "完整标识(1是,0否),代表回复信息是否完整回复,中间可以暂停继续。不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String completeFlag;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageTopicBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageTopicBo.java
new file mode 100644
index 00000000..7dedd287
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiChatMessageTopicBo.java
@@ -0,0 +1,38 @@
+package org.dromara.ai.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.ai.domain.AiChatMessage;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 聊天消息业务对象 ai_chat_message
+ *
+ * @author xins
+ * @date 2025-08-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AiChatMessage.class, reverseConvertGenerate = false)
+public class AiChatMessageTopicBo extends BaseEntity {
+
+ /**
+ * 会话ID
+ */
+ @NotNull(message = "会话ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String sessionId;
+
+ /**
+ * 聊天标题
+ */
+ @NotBlank(message = "聊天标题不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String messageTopic;
+
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiKnowledgeBaseTypeBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiKnowledgeBaseTypeBo.java
new file mode 100644
index 00000000..bb85287e
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiKnowledgeBaseTypeBo.java
@@ -0,0 +1,41 @@
+package org.dromara.ai.domain.bo;
+
+import org.dromara.ai.domain.AiKnowledgeBaseType;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * AI知识库类型业务对象 ai_knowledge_base_type
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AiKnowledgeBaseType.class, reverseConvertGenerate = false)
+public class AiKnowledgeBaseTypeBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ private Long knowledgeBaseTypeId;
+
+ /**
+ * 知识库类型名称
+ */
+ @NotBlank(message = "知识库类型名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String knowledgeBaseTypeName;
+
+ /**
+ * 备注
+ */
+ @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiModelBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiModelBo.java
new file mode 100644
index 00000000..1faf719c
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiModelBo.java
@@ -0,0 +1,125 @@
+package org.dromara.ai.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.ai.domain.AiModel;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * AI模型业务对象 ai_model
+ *
+ * @author xins
+ * @date 2025-08-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AiModel.class, reverseConvertGenerate = false)
+public class AiModelBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ private Long modelId;
+
+ /**
+ * 模型名称
+ */
+ @NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String modelName;
+
+ /**
+ * AI平台ID,关联ai_platform
+ */
+ @NotNull(message = "AI平台ID,关联ai_platform不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long platformId;
+
+ /**
+ * 模型类型ID,关联ai_model_type
+ */
+ @NotNull(message = "模型类型ID,关联ai_model_type不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long modelTypeId;
+
+ /**
+ * 基础模型ID,关联ai_base_model
+ */
+ @NotNull(message = "基础模型ID,关联ai_base_model不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long baseModelId;
+
+ /**
+ * 计费类型(1token计费,2次数计费)
+ */
+ private String chargeType;
+
+ /**
+ * 模型价格
+ */
+ private Long modelPrice;
+
+ /**
+ * 请求地址
+ */
+ private String apiEndpoint;
+
+ /**
+ * 秘钥
+ */
+ private String apiKey;
+
+ /**
+ * 密钥
+ */
+ private String apiSecret;
+
+ /**
+ * 向量库(1milvus,2weaviate,)
+ */
+ private String vectorLibrary;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ /**
+ * 高级配置—模型温度(0-1);值越大,回复内容越赋有多样性创造性、随机性;设为0根据事实回答,希望得到精准答案应该降低该参数;日常聊天建议0.5-0.8
+ */
+ private Long modelTemperature;
+
+ /**
+ * 高级配置—词汇属性(0-1);值越小,AI生成的内容越单调也越容易理解;值越大,AI回复的词汇范围越大,越多样化
+ */
+ private Long vocabularyAttribute;
+
+ /**
+ * 高级配置—话题属性(-2.0-2.0);值越大,越能够让AI更好的控制新话题的引入,建议微调或不变
+ */
+ private Long topicAttribute;
+
+ /**
+ * 高级配置—重复属性(-2.0-2.0);值越大,越能够让AI更好的避免重复之前说过的话,建议微调或不变
+ */
+ private Long duplicateAttribute;
+
+ /**
+ * 高级配置—最大回复(1-16000);设置AI最大回复内容大小,会影响返回结果内容的长度;普通聊天建议500-800;短文生成建议800-2000;代码生成建议2000-3600;长文生成建议4000左右(或选择长回复模型)
+ */
+ private Long maxReply;
+
+ /**
+ * 默认标识(1是,0否)
+ */
+ private String defaultFlag;
+
+ /**
+ * 激活标识(1是,0否)
+ */
+// @NotBlank(message = "激活标识(1是,0否)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String activeFlag;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiModelTypeBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiModelTypeBo.java
new file mode 100644
index 00000000..b98f80d4
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiModelTypeBo.java
@@ -0,0 +1,51 @@
+package org.dromara.ai.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.ai.domain.AiModelType;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 模型类型业务对象 ai_model_type
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AiModelType.class, reverseConvertGenerate = false)
+public class AiModelTypeBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long modelTypeId;
+
+ /**
+ * 模型类型编码(LLM、Embedding)
+ */
+ @NotBlank(message = "模型类型编码不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String modelTypeCode;
+
+ /**
+ * 模型类型名称(语言模型、向量模型)
+ */
+ @NotBlank(message = "模型类型名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String modelTypeName;
+
+ /**
+ * 模型类型描述
+ */
+ @NotBlank(message = "模型类型描述不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String modelTypeDescription;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiPlatformBo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiPlatformBo.java
new file mode 100644
index 00000000..89d07eee
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/bo/AiPlatformBo.java
@@ -0,0 +1,67 @@
+package org.dromara.ai.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.ai.domain.AiPlatform;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * AI平台业务对象 ai_platform
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = AiPlatform.class, reverseConvertGenerate = false)
+public class AiPlatformBo extends BaseEntity {
+
+ /**
+ * 平台ID,主键
+ */
+ @NotNull(message = "平台ID,主键不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long platformId;
+
+ /**
+ * 平台编码,如DeepSeek, TongYi-QianWen, Tencent-LKE, WenXin-YiYan
+ */
+ @NotBlank(message = "平台编码不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String platformCode;
+
+ /**
+ * 平台名称,如DeepSeek, 通义千问, 智普AI
+ */
+ @NotBlank(message = "平台名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String platformName;
+
+ /**
+ * 平台描述
+ */
+ @NotBlank(message = "平台描述不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String platformDescription;
+
+ /**
+ * base api url地址
+ */
+ @NotBlank(message = "base api url地址不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String baseApiUrl;
+
+ /**
+ * 平台图标
+ */
+ @NotBlank(message = "平台图标不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String platformIcon;
+
+ /**
+ * 授权方法(1,API_KEY,2,OAUTH2),先支持API_KEY
+ */
+ @NotBlank(message = "授权方法(1,API_KEY,2,OAUTH2),先支持API_KEY不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String authMethod;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java
new file mode 100644
index 00000000..5d5bb357
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiBaseModelVo.java
@@ -0,0 +1,95 @@
+package org.dromara.ai.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import org.dromara.ai.domain.AiApiEndpoint;
+import org.dromara.ai.domain.AiBaseModel;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.ai.domain.AiModelCapability;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 基础模型视图对象 ai_base_model
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = AiBaseModel.class)
+public class AiBaseModelVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long baseModelId;
+
+ /**
+ * 平台ID,关联ai_platform
+ */
+ @ExcelProperty(value = "平台ID,关联ai_platform")
+ private Long platformId;
+
+ /**
+ * 模型类型ID,关联ai_model_type
+ */
+ @ExcelProperty(value = "模型类型ID,关联ai_model_type")
+ private Long modelTypeId;
+
+ /**
+ * 模型类型编码,同ai_model_type中的编码
+ */
+ @ExcelProperty(value = "模型类型编码")
+ private Long modelTypeCode;
+
+ /**
+ * 基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3
+ */
+ @ExcelProperty(value = "基础模型名称,例如: DeepSeek-V3, Qwen1.5-72B, ChatGLM3")
+ private String baseModelName;
+
+ /**
+ * 基础模型描述
+ */
+ @ExcelProperty(value = "基础模型描述")
+ private String baseModelDescription;
+
+ /**
+ * 上下文长度(如32k)
+ */
+ @ExcelProperty(value = "上下文长度(如32k)")
+ private Long contextLength;
+
+ /**
+ * 激活标识(1是,0否)
+ */
+ @ExcelProperty(value = "激活标识(1是,0否)")
+ private String activeFlag;
+
+
+ /**
+ * 模型能力列表
+ */
+ @TableField(exist = false)
+ private List aiModelCapabilityList;
+
+ /**
+ * api端点列表
+ */
+ @TableField(exist = false)
+ private List aiApiEndpointList;
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiChatMessageDetailVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiChatMessageDetailVo.java
new file mode 100644
index 00000000..19d28e43
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiChatMessageDetailVo.java
@@ -0,0 +1,105 @@
+package org.dromara.ai.domain.vo;
+
+import org.dromara.ai.domain.AiChatMessageDetail;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 聊天消息详情视图对象 ai_chat_message_detail
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = AiChatMessageDetail.class)
+public class AiChatMessageDetailVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long messageDetailId;
+
+ /**
+ * 聊天信息ID,关联ai_chat_message
+ */
+ @ExcelProperty(value = "聊天信息ID,关联ai_chat_message")
+ private Long chatMessageId;
+
+ /**
+ * 会话ID
+ */
+ @ExcelProperty(value = "会话ID")
+ private String sessionId;
+
+ /**
+ * 提问内容
+ */
+ @ExcelProperty(value = "提问内容")
+ private String questionContent;
+
+ /**
+ * 回答内容
+ */
+ @ExcelProperty(value = "回答内容")
+ private String answerContent;
+
+ /**
+ * 提问token数量
+ */
+ @ExcelProperty(value = "提问token数量")
+ private Long promptToken;
+
+ /**
+ * 回复token数量
+ */
+ @ExcelProperty(value = "回复token数量")
+ private Long completionToken;
+
+ /**
+ * 累计 Token数量
+ */
+ @ExcelProperty(value = "累计 Token数量")
+ private Long totalToken;
+
+ /**
+ * 模型ID,关联ai_model
+ */
+ @ExcelProperty(value = "模型ID,关联ai_model")
+ private Long modelId;
+
+ /**
+ * 知识库ID,关联ai_knowledge_base
+ */
+ @ExcelProperty(value = "知识库ID,关联ai_knowledge_base")
+ private Long knowledgeBaseId;
+
+ /**
+ * 是否携带历史内容(1是,0否)
+ */
+ @ExcelProperty(value = "是否携带历史内容", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "1=是,0否")
+ private String takeFlag;
+
+ /**
+ * 完整标识(1是,0否),代表回复信息是否完整回复,中间可以暂停继续。
+ */
+ @ExcelProperty(value = "完整标识(1是,0否),代表回复信息是否完整回复,中间可以暂停继续。")
+ private String completeFlag;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiChatMessageVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiChatMessageVo.java
new file mode 100644
index 00000000..12747a8d
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiChatMessageVo.java
@@ -0,0 +1,91 @@
+package org.dromara.ai.domain.vo;
+
+import org.dromara.ai.domain.AiChatMessage;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.log.annotation.Log;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 聊天消息视图对象 ai_chat_message
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = AiChatMessage.class)
+public class AiChatMessageVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long chatMessageId;
+
+ /**
+ * 会话ID
+ */
+ @ExcelProperty(value = "会话ID")
+ private String sessionId;
+
+ /**
+ * 聊天标题
+ */
+ @ExcelProperty(value = "聊天标题")
+ private String messageTopic;
+
+ /**
+ * 扣除金额(暂时不用)
+ */
+ @ExcelProperty(value = "扣除金额", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "暂=时不用")
+ private Long deductCost;
+
+ /**
+ * 累计 Tokens
+ */
+ @ExcelProperty(value = "累计 Tokens")
+ private Long totalToken;
+
+ /**
+ * 模型ID,关联ai_model
+ */
+ @ExcelProperty(value = "模型ID,关联ai_model")
+ private Long modelId;
+
+ /**
+ * 知识库ID,关联ai_knowledge_base
+ */
+ @ExcelProperty(value = "知识库ID,关联ai_knowledge_base")
+ private Long knowledgeBaseId;
+
+ /**
+ * 聊天类型(1AI问答,2知识库问答,3AI生成SQL,4AI填报)
+ */
+ @ExcelProperty(value = "聊天类型(1AI问答,2知识库问答,3AI生成SQL,4AI填报)")
+ private String messageType;
+
+ private Date createTime;
+
+ private Date updateTime;
+
+ public Long getCreatedAt() {
+ return getCreateTime() == null ? 0L : getCreateTime().getTime();
+ }
+
+ public Long getUpdatedAt() {
+ return getUpdateTime() == null ? 0L : getUpdateTime().getTime();
+ }
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiKnowledgeBaseTypeVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiKnowledgeBaseTypeVo.java
new file mode 100644
index 00000000..42397b3e
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiKnowledgeBaseTypeVo.java
@@ -0,0 +1,50 @@
+package org.dromara.ai.domain.vo;
+
+import org.dromara.ai.domain.AiKnowledgeBaseType;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * AI知识库类型视图对象 ai_knowledge_base_type
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = AiKnowledgeBaseType.class)
+public class AiKnowledgeBaseTypeVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long knowledgeBaseTypeId;
+
+ /**
+ * 知识库类型名称
+ */
+ @ExcelProperty(value = "知识库类型名称")
+ private String knowledgeBaseTypeName;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiModelTypeVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiModelTypeVo.java
new file mode 100644
index 00000000..78cddbc8
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiModelTypeVo.java
@@ -0,0 +1,58 @@
+package org.dromara.ai.domain.vo;
+
+import org.dromara.ai.domain.AiModelType;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 模型类型视图对象 ai_model_type
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = AiModelType.class)
+public class AiModelTypeVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long modelTypeId;
+
+ /**
+ * 模型类型编码(LLM、Embedding)
+ */
+ @ExcelProperty(value = "模型类型编码", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "LLM、Embedding")
+ private String modelTypeCode;
+
+ /**
+ * 模型类型名称(语言模型、向量模型)
+ */
+ @ExcelProperty(value = "模型类型名称", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "语言模型、向量模型")
+ private String modelTypeName;
+
+ /**
+ * 模型类型描述
+ */
+ @ExcelProperty(value = "模型类型描述")
+ private String modelTypeDescription;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiModelVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiModelVo.java
new file mode 100644
index 00000000..93a346c1
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiModelVo.java
@@ -0,0 +1,147 @@
+package org.dromara.ai.domain.vo;
+
+import org.dromara.ai.domain.AiModel;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * AI模型视图对象 ai_model
+ *
+ * @author xins
+ * @date 2025-08-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = AiModel.class)
+public class AiModelVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long modelId;
+
+ /**
+ * 模型名称
+ */
+ @ExcelProperty(value = "模型名称")
+ private String modelName;
+
+ /**
+ * AI平台ID,关联ai_platform
+ */
+ @ExcelProperty(value = "AI平台ID,关联ai_platform")
+ private Long platformId;
+
+ /**
+ * 模型类型ID,关联ai_model_type
+ */
+ @ExcelProperty(value = "模型类型ID,关联ai_model_type")
+ private Long modelTypeId;
+
+ /**
+ * 基础模型ID,关联ai_base_model
+ */
+ @ExcelProperty(value = "基础模型ID,关联ai_base_model")
+ private Long baseModelId;
+
+ /**
+ * 计费类型(1token计费,2次数计费)
+ */
+ @ExcelProperty(value = "计费类型(1token计费,2次数计费)")
+ private String chargeType;
+
+ /**
+ * 模型价格
+ */
+ @ExcelProperty(value = "模型价格")
+ private Long modelPrice;
+
+ /**
+ * 请求地址
+ */
+ @ExcelProperty(value = "请求地址")
+ private String apiEndpoint;
+
+ /**
+ * 秘钥
+ */
+ @ExcelProperty(value = "秘钥")
+ private String apiKey;
+
+ /**
+ * 密钥
+ */
+ @ExcelProperty(value = "密钥")
+ private String apiSecret;
+
+ /**
+ * 向量库(1milvus,2weaviate,)
+ */
+ @ExcelProperty(value = "向量库(1milvus,2weaviate,)")
+ private String vectorLibrary;
+
+ /**
+ * 描述
+ */
+ @ExcelProperty(value = "描述")
+ private String description;
+
+ /**
+ * 高级配置—模型温度(0-1);值越大,回复内容越赋有多样性创造性、随机性;设为0根据事实回答,希望得到精准答案应该降低该参数;日常聊天建议0.5-0.8
+ */
+ @ExcelProperty(value = "高级配置—模型温度(0-1);值越大,回复内容越赋有多样性创造性、随机性;设为0根据事实回答,希望得到精准答案应该降低该参数;日常聊天建议0.5-0.8")
+ private Long modelTemperature;
+
+ /**
+ * 高级配置—词汇属性(0-1);值越小,AI生成的内容越单调也越容易理解;值越大,AI回复的词汇范围越大,越多样化
+ */
+ @ExcelProperty(value = "高级配置—词汇属性(0-1);值越小,AI生成的内容越单调也越容易理解;值越大,AI回复的词汇范围越大,越多样化")
+ private Long vocabularyAttribute;
+
+ /**
+ * 高级配置—话题属性(-2.0-2.0);值越大,越能够让AI更好的控制新话题的引入,建议微调或不变
+ */
+ @ExcelProperty(value = "高级配置—话题属性(-2.0-2.0);值越大,越能够让AI更好的控制新话题的引入,建议微调或不变")
+ private Long topicAttribute;
+
+ /**
+ * 高级配置—重复属性(-2.0-2.0);值越大,越能够让AI更好的避免重复之前说过的话,建议微调或不变
+ */
+ @ExcelProperty(value = "高级配置—重复属性(-2.0-2.0);值越大,越能够让AI更好的避免重复之前说过的话,建议微调或不变")
+ private Long duplicateAttribute;
+
+ /**
+ * 高级配置—最大回复(1-16000);设置AI最大回复内容大小,会影响返回结果内容的长度;普通聊天建议500-800;短文生成建议800-2000;代码生成建议2000-3600;长文生成建议4000左右(或选择长回复模型)
+ */
+ @ExcelProperty(value = "高级配置—最大回复(1-16000);设置AI最大回复内容大小,会影响返回结果内容的长度;普通聊天建议500-800;短文生成建议800-2000;代码生成建议2000-3600;长文生成建议4000左右", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "或=选择长回复模型")
+ private Long maxReply;
+
+ /**
+ * 默认标识(1是,0否)
+ */
+ @ExcelProperty(value = "默认标识(1是,0否)")
+ private String defaultFlag;
+
+ /**
+ * 激活标识(1是,0否)
+ */
+ @ExcelProperty(value = "激活标识(1是,0否)")
+ private String activeFlag;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiPlatformVo.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiPlatformVo.java
new file mode 100644
index 00000000..402ed880
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/domain/vo/AiPlatformVo.java
@@ -0,0 +1,75 @@
+package org.dromara.ai.domain.vo;
+
+import org.dromara.ai.domain.AiPlatform;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * AI平台视图对象 ai_platform
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = AiPlatform.class)
+public class AiPlatformVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 平台ID,主键
+ */
+ @ExcelProperty(value = "平台ID,主键")
+ private Long platformId;
+
+ /**
+ * 平台编码,如DeepSeek, TongYi-QianWen, Tencent-LKE, WenXin-YiYan
+ */
+ @ExcelProperty(value = "平台编码,如DeepSeek, TongYi-QianWen, Tencent-LKE, WenXin-YiYan")
+ private String platformCode;
+
+ /**
+ * 平台名称,如DeepSeek, 通义千问, 智普AI
+ */
+ @ExcelProperty(value = "平台名称,如DeepSeek, 通义千问, 智普AI")
+ private String platformName;
+
+ /**
+ * 平台描述
+ */
+ @ExcelProperty(value = "平台描述")
+ private String platformDescription;
+
+ /**
+ * base api url地址
+ */
+ @ExcelProperty(value = "base api url地址")
+ private String baseApiUrl;
+
+ /**
+ * 平台图标
+ */
+ @ExcelProperty(value = "平台图标")
+ private String platformIcon;
+
+ /**
+ * 授权方法(1,API_KEY,2,OAUTH2),先支持API_KEY
+ */
+ @ExcelProperty(value = "授权方法", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "1=,API_KEY,2,OAUTH2")
+ private String authMethod;
+
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiBaseModelMapper.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiBaseModelMapper.java
new file mode 100644
index 00000000..153dab6b
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiBaseModelMapper.java
@@ -0,0 +1,28 @@
+package org.dromara.ai.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.dromara.ai.domain.AiBaseModel;
+import org.dromara.ai.domain.bo.AiBaseModelBo;
+import org.dromara.ai.domain.vo.AiBaseModelVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 基础模型Mapper接口
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@InterceptorIgnore(dataPermission = "true", tenantLine = "true")
+public interface AiBaseModelMapper extends BaseMapperPlus {
+
+ /**
+ * 查询基础模型信息,join apiendpoint和ai_model_capability
+ *
+ * @param aiBaseModel 基础模型
+ * @return 工序信息集合
+ */
+ public List selectAiBaseModelJoinList(AiBaseModelBo aiBaseModel);
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiChatMessageDetailMapper.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiChatMessageDetailMapper.java
new file mode 100644
index 00000000..9e4118bd
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiChatMessageDetailMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.ai.mapper;
+
+import org.dromara.ai.domain.AiChatMessageDetail;
+import org.dromara.ai.domain.vo.AiChatMessageDetailVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 聊天消息详情Mapper接口
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+public interface AiChatMessageDetailMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiChatMessageMapper.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiChatMessageMapper.java
new file mode 100644
index 00000000..12d3051d
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiChatMessageMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.ai.mapper;
+
+import org.dromara.ai.domain.AiChatMessage;
+import org.dromara.ai.domain.vo.AiChatMessageVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 聊天消息Mapper接口
+ *
+ * @author xins
+ * @date 2025-08-14
+ */
+public interface AiChatMessageMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiKnowledgeBaseTypeMapper.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiKnowledgeBaseTypeMapper.java
new file mode 100644
index 00000000..8078d69f
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiKnowledgeBaseTypeMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.ai.mapper;
+
+import org.dromara.ai.domain.AiKnowledgeBaseType;
+import org.dromara.ai.domain.vo.AiKnowledgeBaseTypeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * AI知识库类型Mapper接口
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+public interface AiKnowledgeBaseTypeMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiModelMapper.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiModelMapper.java
new file mode 100644
index 00000000..3bffcfaa
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiModelMapper.java
@@ -0,0 +1,25 @@
+package org.dromara.ai.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.ai.domain.AiBaseModel;
+import org.dromara.ai.domain.AiModel;
+import org.dromara.ai.domain.bo.AiBaseModelBo;
+import org.dromara.ai.domain.vo.AiModelVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * AI模型Mapper接口
+ *
+ * @author xins
+ * @date 2025-08-07
+ */
+public interface AiModelMapper extends BaseMapperPlus {
+
+ @InterceptorIgnore(tenantLine = "true") // leftJoin 的表不拼接租户
+ List selectJoinList(@Param(Constants.WRAPPER) MPJLambdaWrapper wrapper);
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiModelTypeMapper.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiModelTypeMapper.java
new file mode 100644
index 00000000..aa6188be
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiModelTypeMapper.java
@@ -0,0 +1,17 @@
+package org.dromara.ai.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.dromara.ai.domain.AiModelType;
+import org.dromara.ai.domain.vo.AiModelTypeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 模型类型Mapper接口
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@InterceptorIgnore(dataPermission = "true", tenantLine = "true")
+public interface AiModelTypeMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiPlatformMapper.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiPlatformMapper.java
new file mode 100644
index 00000000..d80ace64
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/AiPlatformMapper.java
@@ -0,0 +1,17 @@
+package org.dromara.ai.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.dromara.ai.domain.AiPlatform;
+import org.dromara.ai.domain.vo.AiPlatformVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * AI平台Mapper接口
+ *
+ * @author xins
+ * @date 2025-08-06
+ */
+@InterceptorIgnore(dataPermission = "true", tenantLine = "true")
+public interface AiPlatformMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/DatabaseMetaMapper.java b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/DatabaseMetaMapper.java
new file mode 100644
index 00000000..3181c3d9
--- /dev/null
+++ b/ruoyi-modules/hwmom-ai/src/main/java/org/dromara/ai/mapper/DatabaseMetaMapper.java
@@ -0,0 +1,44 @@
+package org.dromara.ai.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author xins
+ * @Date 2025/7/8 9:22
+ * @Description:
+ */
+@InterceptorIgnore(dataPermission = "true", tenantLine = "true")
+@Mapper
+public interface DatabaseMetaMapper {
+
+ /**
+ * 获取所有用户表名
+ */
+ @Select("SELECT name FROM hwmom.sys.tables where name = 'sys_user'ORDER BY name")
+ List getAllTableNames();
+
+ /**
+ * 获取指定表的结构信息
+ */
+ List