buttons;
+
+ /**
+ * 任务编号
+ *
+ * 1. midjourney proxy:关联的 task id
+ */
+ private String taskId;
+
+}
+
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDO.java
new file mode 100644
index 0000000000..e1327a50ef
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDO.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.knowledge;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * AI 知识库 DO
+ *
+ * @author xiaoxin
+ */
+@TableName(value = "ai_knowledge", autoResultMap = true)
+@KeySequence("ai_knowledge_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+public class AiKnowledgeDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 知识库名称
+ */
+ private String name;
+ /**
+ * 知识库描述
+ */
+ private String description;
+
+ /**
+ * 向量模型编号
+ *
+ * 关联 {@link AiModelDO#getId()}
+ */
+ private Long embeddingModelId;
+ /**
+ * 模型标识
+ *
+ * 冗余 {@link AiModelDO#getModel()}
+ */
+ private String embeddingModel;
+
+ /**
+ * topK
+ */
+ private Integer topK;
+ /**
+ * 相似度阈值
+ */
+ private Double similarityThreshold;
+
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDocumentDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDocumentDO.java
new file mode 100644
index 0000000000..ac014e926b
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDocumentDO.java
@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.knowledge;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * AI 知识库-文档 DO
+ *
+ * @author xiaoxin
+ */
+@TableName(value = "ai_knowledge_document")
+@KeySequence("ai_knowledge_document_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+public class AiKnowledgeDocumentDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 知识库编号
+ *
+ * 关联 {@link AiKnowledgeDO#getId()}
+ */
+ private Long knowledgeId;
+ /**
+ * 文档名称
+ */
+ private String name;
+ /**
+ * 文件 URL
+ */
+ private String url;
+ /**
+ * 内容
+ */
+ private String content;
+ /**
+ * 文档长度
+ */
+ private Integer contentLength;
+
+ /**
+ * 文档 token 数量
+ */
+ private Integer tokens;
+ /**
+ * 分片最大 Token 数
+ */
+ private Integer segmentMaxTokens;
+
+ /**
+ * 召回次数
+ */
+ private Integer retrievalCount;
+
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeSegmentDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeSegmentDO.java
new file mode 100644
index 0000000000..cccbd6846b
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeSegmentDO.java
@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.knowledge;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * AI 知识库-文档分段 DO
+ *
+ * @author xiaoxin
+ */
+@TableName(value = "ai_knowledge_segment")
+@KeySequence("ai_knowledge_segment_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+public class AiKnowledgeSegmentDO extends BaseDO {
+
+ /**
+ * 向量库的编号 - 空值
+ */
+ public static final String VECTOR_ID_EMPTY = "";
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 知识库编号
+ *
+ * 关联 {@link AiKnowledgeDO#getId()}
+ */
+ private Long knowledgeId;
+ /**
+ * 文档编号
+ *
+ * 关联 {@link AiKnowledgeDocumentDO#getId()}
+ */
+ private Long documentId;
+ /**
+ * 切片内容
+ */
+ private String content;
+ /**
+ * 切片内容长度
+ */
+ private Integer contentLength;
+
+ /**
+ * 向量库的编号
+ */
+ private String vectorId;
+ /**
+ * token 数量
+ */
+ private Integer tokens;
+
+ /**
+ * 召回次数
+ */
+ private Integer retrievalCount;
+
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/mindmap/AiMindMapDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/mindmap/AiMindMapDO.java
new file mode 100644
index 0000000000..db788b7e83
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/mindmap/AiMindMapDO.java
@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.mindmap;
+
+import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * AI 思维导图 DO
+ *
+ * @author xiaoxin
+ */
+@TableName(value = "ai_mind_map")
+@KeySequence("ai_mind_map_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+public class AiMindMapDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+
+ /**
+ * 用户编号
+ *
+ * 关联 AdminUserDO 的 userId 字段
+ */
+ private Long userId;
+
+ /**
+ * 平台
+ *
+ * 枚举 {@link AiPlatformEnum}
+ */
+ private String platform;
+ /**
+ * 模型编号
+ *
+ * 关联 {@link AiModelDO#getId()}
+ */
+ private Long modelId;
+ /**
+ * 模型
+ */
+ private String model;
+
+ /**
+ * 生成内容提示
+ */
+ private String prompt;
+
+ /**
+ * 生成的内容
+ */
+ private String generatedContent;
+
+ /**
+ * 错误信息
+ */
+ private String errorMessage;
+
+}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiApiKeyDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiApiKeyDO.java
new file mode 100644
index 0000000000..f2c683a503
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiApiKeyDO.java
@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.model;
+
+import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * AI API 秘钥 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("ai_api_key")
+@KeySequence("ai_chat_conversation_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiApiKeyDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * 密钥
+ */
+ private String apiKey;
+ /**
+ * 平台
+ *
+ * 枚举 {@link AiPlatformEnum}
+ */
+ private String platform;
+ /**
+ * API 地址
+ */
+ private String url;
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java
new file mode 100644
index 0000000000..bb6a3ca48d
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java
@@ -0,0 +1,103 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.model;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
+import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.util.List;
+
+/**
+ * AI 聊天角色 DO
+ *
+ * @author fansili
+ * @since 2024/4/24 19:39
+ */
+@TableName(value = "ai_chat_role", autoResultMap = true)
+@KeySequence("ai_chat_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiChatRoleDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 角色名称
+ */
+ private String name;
+ /**
+ * 角色头像
+ */
+ private String avatar;
+ /**
+ * 角色分类
+ */
+ private String category;
+ /**
+ * 角色描述
+ */
+ private String description;
+ /**
+ * 角色设定
+ */
+ private String systemMessage;
+
+ /**
+ * 用户编号
+ *
+ * 关联 AdminUserDO 的 userId 字段
+ */
+ private Long userId;
+
+ /**
+ * 模型编号
+ *
+ * 关联 {@link AiModelDO#getId()} 字段
+ */
+ private Long modelId;
+
+ /**
+ * 引用的知识库编号列表
+ *
+ * 关联 {@link AiKnowledgeDO#getId()} 字段
+ */
+ @TableField(typeHandler = LongListTypeHandler.class)
+ private List knowledgeIds;
+ /**
+ * 引用的工具编号列表
+ *
+ * 关联 {@link AiToolDO#getId()} 字段
+ */
+ @TableField(typeHandler = LongListTypeHandler.class)
+ private List toolIds;
+
+ /**
+ * 是否公开
+ *
+ * 1. true - 公开;由管理员在【角色管理】所创建
+ * 2. false - 私有;由个人在【我的角色】所创建
+ */
+ private Boolean publicStatus;
+
+ /**
+ * 排序值
+ */
+ private Integer sort;
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiModelDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiModelDO.java
new file mode 100644
index 0000000000..9e54f94c5a
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiModelDO.java
@@ -0,0 +1,88 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.model;
+
+import cn.iocoder.yudao.module.ai.enums.model.AiModelTypeEnum;
+import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * AI 模型 DO
+ *
+ * 默认模型:{@link #status} 为开启,并且 {@link #sort} 排序第一
+ *
+ * @author fansili
+ * @since 2024/4/24 19:39
+ */
+@TableName("ai_model")
+@KeySequence("ai_model_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiModelDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * API 秘钥编号
+ *
+ * 关联 {@link AiApiKeyDO#getId()}
+ */
+ private Long keyId;
+ /**
+ * 模型名称
+ */
+ private String name;
+ /**
+ * 模型标志
+ */
+ private String model;
+ /**
+ * 平台
+ *
+ * 枚举 {@link AiPlatformEnum}
+ */
+ private String platform;
+ /**
+ * 类型
+ *
+ * 枚举 {@link AiModelTypeEnum}
+ */
+ private Integer type;
+
+ /**
+ * 排序值
+ */
+ private Integer sort;
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+ // ========== 对话配置 ==========
+
+ /**
+ * 温度参数
+ *
+ * 用于调整生成回复的随机性和多样性程度:较低的温度值会使输出更收敛于高频词汇,较高的则增加多样性
+ */
+ private Double temperature;
+ /**
+ * 单条回复的最大 Token 数量
+ */
+ private Integer maxTokens;
+ /**
+ * 上下文的最大 Message 数量
+ */
+ private Integer maxContexts;
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiToolDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiToolDO.java
new file mode 100644
index 0000000000..7773e978cc
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiToolDO.java
@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.model;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.ai.service.model.tool.DirectoryListToolFunction;
+import cn.iocoder.yudao.module.ai.service.model.tool.WeatherQueryToolFunction;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * AI 工具 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("ai_tool")
+@KeySequence("ai_tool_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AiToolDO extends BaseDO {
+
+ /**
+ * 工具编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 工具名称
+ *
+ * 对应 Bean 的名字,例如说:
+ * 1. {@link DirectoryListToolFunction} 的 Bean 名字是 directory_list
+ * 2. {@link WeatherQueryToolFunction} 的 Bean 名字是 weather_query
+ */
+ private String name;
+ /**
+ * 工具描述
+ */
+ private String description;
+ /**
+ * 状态
+ *
+ * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
+ */
+ private Integer status;
+
+}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/music/AiMusicDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/music/AiMusicDO.java
new file mode 100644
index 0000000000..cc16133a70
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/music/AiMusicDO.java
@@ -0,0 +1,119 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.music;
+
+import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.ai.enums.music.AiMusicGenerateModeEnum;
+import cn.iocoder.yudao.module.ai.enums.music.AiMusicStatusEnum;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * AI 音乐 DO
+ *
+ * @author xiaoxin
+ */
+@TableName(value = "ai_music", autoResultMap = true)
+@KeySequence("ai_music_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+public class AiMusicDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+
+ /**
+ * 用户编号
+ *
+ * 关联 AdminUserDO 的 userId 字段
+ */
+ private Long userId;
+
+ /**
+ * 音乐名称
+ */
+ private String title;
+
+ /**
+ * 歌词
+ */
+ private String lyric;
+
+ /**
+ * 图片地址
+ */
+ private String imageUrl;
+ /**
+ * 音频地址
+ */
+ private String audioUrl;
+ /**
+ * 视频地址
+ */
+ private String videoUrl;
+
+ /**
+ * 音乐状态
+ *
+ * 枚举 {@link AiMusicStatusEnum}
+ */
+ private Integer status;
+
+ /**
+ * 生成模式
+ *
+ * 枚举 {@link AiMusicGenerateModeEnum}
+ */
+ private Integer generateMode;
+
+ /**
+ * 描述词
+ */
+ private String description;
+
+ /**
+ * 平台
+ *
+ * 枚举 {@link AiPlatformEnum}
+ */
+ private String platform;
+ // TODO @芋艿:modelId?
+ /**
+ * 模型
+ */
+ private String model;
+
+ /**
+ * 音乐风格标签
+ */
+ @TableField(typeHandler = JacksonTypeHandler.class)
+ private List tags;
+
+ /**
+ * 音乐时长
+ */
+ private Double duration;
+
+ /**
+ * 是否公开
+ */
+ private Boolean publicStatus;
+
+ /**
+ * 任务编号
+ */
+ private String taskId;
+
+ /**
+ * 错误信息
+ */
+ private String errorMessage;
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/workflow/AiWorkflowDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/workflow/AiWorkflowDO.java
new file mode 100644
index 0000000000..d844f7da2e
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/workflow/AiWorkflowDO.java
@@ -0,0 +1,51 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.workflow;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * AI 工作流 DO
+ *
+ * @author lesan
+ */
+@TableName(value = "ai_workflow", autoResultMap = true)
+@KeySequence("ai_workflow") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+public class AiWorkflowDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 工作流名称
+ */
+ private String name;
+ /**
+ * 工作流标识
+ */
+ private String code;
+
+ /**
+ * 工作流模型 JSON 数据
+ */
+ private String graph;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/write/AiWriteDO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/write/AiWriteDO.java
new file mode 100644
index 0000000000..75e1e29cef
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/write/AiWriteDO.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.ai.dal.dataobject.write;
+
+import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
+import cn.iocoder.yudao.module.ai.enums.DictTypeConstants;
+import cn.iocoder.yudao.module.ai.enums.write.AiWriteTypeEnum;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * AI 写作 DO
+ *
+ * @author xiaoxin
+ */
+@TableName("ai_write")
+@KeySequence("ai_write_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+public class AiWriteDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+
+ /**
+ * 用户编号
+ *
+ * 关联 AdminUserDO 的 userId 字段
+ */
+ private Long userId;
+
+ /**
+ * 写作类型
+ *
+ * 枚举 {@link AiWriteTypeEnum}
+ */
+ private Integer type;
+
+ /**
+ * 平台
+ *
+ * 枚举 {@link AiPlatformEnum}
+ */
+ private String platform;
+ /**
+ * 模型编号
+ *
+ * 关联 {@link AiModelDO#getId()}
+ */
+ private Long modelId;
+ /**
+ * 模型
+ */
+ private String model;
+
+ /**
+ * 生成内容提示
+ */
+ private String prompt;
+
+ /**
+ * 生成的内容
+ */
+ private String generatedContent;
+ /**
+ * 原文
+ */
+ private String originalContent;
+
+ /**
+ * 长度提示词
+ *
+ * 字典:{@link DictTypeConstants#AI_WRITE_LENGTH}
+ */
+ private Integer length;
+ /**
+ * 格式提示词
+ *
+ * 字典:{@link DictTypeConstants#AI_WRITE_FORMAT}
+ */
+ private Integer format;
+ /**
+ * 语气提示词
+ *
+ * 字典:{@link DictTypeConstants#AI_WRITE_TONE}
+ */
+ private Integer tone;
+ /**
+ * 语言提示词
+ *
+ * 字典:{@link DictTypeConstants#AI_WRITE_LANGUAGE}
+ */
+ private Integer language;
+
+ /**
+ * 错误信息
+ */
+ private String errorMessage;
+
+}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatConversationMapper.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatConversationMapper.java
new file mode 100644
index 0000000000..ce9da2f24d
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatConversationMapper.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.ai.dal.mysql.chat;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationPageReqVO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * AI 聊天对话 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AiChatConversationMapper extends BaseMapperX {
+
+ default List selectListByUserId(Long userId) {
+ return selectList(AiChatConversationDO::getUserId, userId);
+ }
+
+ default List selectListByUserIdAndPinned(Long userId, boolean pinned) {
+ return selectList(new LambdaQueryWrapperX()
+ .eq(AiChatConversationDO::getUserId, userId)
+ .eq(AiChatConversationDO::getPinned, pinned));
+ }
+
+ default PageResult selectChatConversationPage(AiChatConversationPageReqVO pageReqVO) {
+ return selectPage(pageReqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(AiChatConversationDO::getUserId, pageReqVO.getUserId())
+ .likeIfPresent(AiChatConversationDO::getTitle, pageReqVO.getTitle())
+ .betweenIfPresent(AiChatConversationDO::getCreateTime, pageReqVO.getCreateTime())
+ .orderByDesc(AiChatConversationDO::getId));
+ }
+
+}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatMessageMapper.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatMessageMapper.java
new file mode 100644
index 0000000000..5020f3944e
--- /dev/null
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/chat/AiChatMessageMapper.java
@@ -0,0 +1,59 @@
+package cn.iocoder.yudao.module.ai.dal.mysql.chat;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationPageReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessagePageReqVO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * AI 聊天对话 Mapper
+ *
+ * @author fansili
+ */
+@Mapper
+public interface AiChatMessageMapper extends BaseMapperX {
+
+ default List selectListByConversationId(Long conversationId) {
+ return selectList(new LambdaQueryWrapperX()
+ .eq(AiChatMessageDO::getConversationId, conversationId)
+ .orderByAsc(AiChatMessageDO::getId));
+ }
+
+ default Map selectCountMapByConversationId(Collection conversationIds) {
+ // SQL count 查询
+ List