You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
13 KiB
13 KiB
AI 对话系统功能实现
日期:2026-02-03
类型:功能实现
影响范围:后端 - AI 对话系统
符合规范:jointo-tech-stack v1.0
变更概述
实现了完整的 AI 对话系统后端代码,包括对话会话管理、消息记录、AI 提示词系统三大核心功能。
实现内容
1. Models 层(4个文件)
✅ server/app/models/ai_conversation.py
- 枚举定义:
ConversationStatus:对话会话状态(ACTIVE=1, ARCHIVED=2, DELETED=3)TargetType:目标类型(STORYBOARD=1, CHARACTER=2, SCENE=3, PROP=4, RESOURCE=5, SOUND_EFFECT=6, VOICEOVER=7)MediaType:媒体类型(IMAGE=1, VIDEO=2, AUDIO=3, MODEL_3D=4, TEXT=5)
- 模型定义:
AIConversation模型,支持多态关联 + 标签系统
✅ server/app/models/ai_conversation_message.py
- 枚举定义:
MessageRole:消息角色(USER=1, ASSISTANT=2, SYSTEM=3)
- 模型定义:
AIConversationMessage模型
✅ server/app/models/ai_prompt_system.py
- 枚举定义:
PromptType:提示词类型(IMAGE=1, VIDEO=2, AUDIO=3, TEXT=4)
- 模型定义:
AIPromptSystem模型
✅ server/app/models/__init__.py
- 更新导出:添加新模型的导出
2. Schemas 层(3个文件)
✅ server/app/schemas/ai_conversation.py
- 请求 Schema:
ConversationCreateRequest:创建对话会话ConversationUpdateRequest:更新对话会话ConversationListRequest:查询对话列表
- 响应 Schema:
ConversationResponse:对话会话详情ConversationListResponse:对话会话列表
✅ server/app/schemas/ai_conversation_message.py
- 请求 Schema:
MessageCreateRequest:发送消息MessageListRequest:查询消息列表TriggerAIGenerationRequest:触发 AI 生成
- 响应 Schema:
MessageResponse:消息详情MessageListResponse:消息列表TriggerAIGenerationResponse:AI 生成任务响应
✅ server/app/schemas/ai_prompt_system.py
- 请求 Schema:
PromptSystemCreateRequest:创建提示词PromptSystemUpdateRequest:更新提示词PromptSystemListRequest:查询提示词列表
- 响应 Schema:
PromptSystemResponse:提示词详情PromptSystemListResponse:提示词列表
3. Repositories 层(3个文件)
✅ server/app/repositories/ai_conversation_repository.py
- 核心方法:
get_active_conversation():获取活跃会话(支持多态关联 + 标签)list_by_user():查询用户的对话列表(支持多维度筛选)get_by_id():获取对话详情create():创建对话会话update():更新对话会话
✅ server/app/repositories/ai_conversation_message_repository.py
- 核心方法:
list_by_conversation():查询对话的消息列表get_recent_messages():获取最近N条消息(用于上下文)get_by_id():获取消息详情create():创建消息update():更新消息
✅ server/app/repositories/ai_prompt_system_repository.py
- 核心方法:
get_default_by_type():获取默认提示词unset_default_by_type():取消默认提示词list_by_type():查询指定类型的提示词列表create():创建提示词update():更新提示词delete():删除提示词
4. Services 层(2个文件)
✅ server/app/services/ai_conversation_service.py(完整版)
- 对话会话管理:
create_conversation():创建对话会话(支持多态关联 + 标签)get_conversation():获取对话详情list_conversations():查询对话列表(支持多维度筛选)
- 消息管理:
send_message():发送用户消息(支持自动解析提及)list_messages():查询消息列表
- 验证方法(完整实现):
_validate_target():验证目标对象是否存在(根据 target_type 调用对应 repository)_validate_tag():验证标签是否存在且属于该对象_validate_combination():验证 target_type 和 media_type 的组合是否有效_generate_title():自动生成对话标题(查询对象名称和标签名称)_get_target_name():获取目标对象名称_get_tag_name():获取标签名称
- @ 提及功能(完整实现):
_parse_mentions():解析消息中的提及标记(正则表达式)_validate_and_build_mention():验证并构建提及对象(权限、存在性、关联性)
- AI 生成触发(完整实现):
trigger_ai_generation():从对话触发 AI 生成任务- 自动提取消息中的参考图
- 创建系统消息通知任务状态
✅ server/app/services/ai_prompt_system_service.py
- CRUD 操作:
create_prompt():创建提示词get_prompt():获取提示词详情list_prompts():查询提示词列表update_prompt():更新提示词delete_prompt():删除提示词
- 版本管理:
set_default():设置默认提示词get_default_by_type():获取默认提示词
5. API 层(3个文件)
✅ server/app/api/v1/ai_conversations.py(完整版)
- 对话会话路由:
POST /api/v1/ai/conversations:创建对话会话GET /api/v1/ai/conversations:查询对话列表GET /api/v1/ai/conversations/{conversation_id}:获取对话详情
- 消息路由:
POST /api/v1/ai/conversations/{conversation_id}/messages:发送消息GET /api/v1/ai/conversations/{conversation_id}/messages:查询消息列表
- @ 提及路由:
GET /api/v1/ai/conversations/{conversation_id}/mentionable-resources:获取可提及的资源列表
- AI 生成路由:
POST /api/v1/ai/conversations/{conversation_id}/generate:触发 AI 生成任务
✅ server/app/api/v1/ai_prompts.py
- 提示词管理路由(管理员):
POST /api/v1/ai/prompts:创建提示词GET /api/v1/ai/prompts:查询提示词列表GET /api/v1/ai/prompts/{prompt_id}:获取提示词详情PUT /api/v1/ai/prompts/{prompt_id}:更新提示词DELETE /api/v1/ai/prompts/{prompt_id}:删除提示词POST /api/v1/ai/prompts/{prompt_id}/set-default:设置默认提示词
- 用户路由:
GET /api/v1/ai/prompts/default/{prompt_type}:获取默认提示词
✅ server/app/api/v1/router.py
- 注册新路由:
router.include_router(ai_conversations.router, prefix="/ai", tags=["AI Conversations"])router.include_router(ai_prompts.router, prefix="/ai", tags=["AI Prompts"])
6. 文档
✅ docs/server/changelogs/2026-02-03-ai-conversation-system-implementation.md
- 完整的实现记录
- 技术规范遵循说明
- 待完善功能列表
- 测试建议
技术规范遵循
✅ UUID v7 规范
- 所有主键使用 UUID v7(应用层生成)
- 使用
uuid7()函数生成 UUID
✅ TIMESTAMPTZ 规范
- 所有时间字段使用
datetime.now(timezone.utc) - 确保时区感知
✅ SMALLINT 枚举类型
- 所有枚举使用
IntEnum - 数据库存储为 SMALLINT
✅ 无物理外键约束
- 应用层保证引用完整性
- 提供验证方法:
_validate_target(),_validate_tag()
✅ %-formatting 日志格式
logger.info("创建对话会话: user_id=%s, target_type=%d", user_id, target_type)
✅ exc_info=True 错误日志
logger.error("创建对话会话失败: 错误=%s", str(e), exc_info=True)
✅ 异步操作
- 所有数据库操作使用
async/await - 使用
AsyncSession
数据库表结构
✅ ai_conversations 表
- 多态关联:
target_type+target_id - 标签支持:
tag_id(可选,用于区分变体) - 媒体类型:
media_type - 唯一约束:同一用户、同一目标、同一标签、同一媒体类型只能有一个活跃会话
✅ ai_conversation_messages 表
- 消息角色:
role(USER=1, ASSISTANT=2, SYSTEM=3) - 消息顺序:
order_index - AI 任务关联:
ai_job_id(可选) - 元数据:
metadata(JSONB,存储提及信息、参考图等)
✅ ai_prompts_system 表
- 提示词类型:
prompt_type(IMAGE=1, VIDEO=2, AUDIO=3, TEXT=4) - 默认标记:
is_default - 版本管理:
version - 唯一约束:每种类型只能有一个默认提示词
待完善功能
1. Service 层验证方法
✅ 已完善:
_validate_target()- 根据 target_type 调用对应的 repository 验证对象是否存在_validate_tag()- 验证标签是否存在且属于该对象_generate_title()- 查询目标对象名称和标签名称,生成友好的标题_get_target_name()- 获取目标对象名称_get_tag_name()- 获取标签名称
⚠️ 部分实现:
_validate_target()中的音效和配音验证(等待对应 repository 实现)
2. @ 提及功能
✅ 已完整实现:
get_mentionable_resources()- 获取可提及的资源列表(根据对话上下文)_get_storyboard_mentionable_resources()- 获取分镜的可提及资源_get_character_mentionable_resources()- 获取角色的可提及资源_get_scene_mentionable_resources()- 获取场景的可提及资源_get_prop_mentionable_resources()- 获取道具的可提及资源_get_element_type_name()- 元素类型转换_parse_mentions()- 解析消息中的提及标记(使用正则表达式)_validate_and_build_mention()- 验证提及的资源(权限、存在性、关联性)send_message()- 增强版,自动解析提及并构建 metadata- API 路由:
GET /api/v1/ai/conversations/{conversation_id}/mentionable-resources
3. AI 生成触发功能
✅ 已实现:
trigger_ai_generation()- 从对话触发 AI 生成任务- 自动提取消息中的参考图
- 创建系统消息通知任务状态
- 对应的 API 路由:
POST /api/v1/ai/conversations/{conversation_id}/generate
⚠️ 待集成:
- 与 AI Service 的实际集成(当前返回模拟数据)
4. 管理员权限验证
⚠️ 待实现:
ai_prompts.py中的 TODO 注释处需要添加管理员权限验证
测试建议
1. 单元测试
- Models 层:枚举值、字段验证
- Repositories 层:CRUD 操作、查询逻辑
- Services 层:业务逻辑、验证方法
2. 集成测试
- API 层:路由测试、请求/响应格式
- 多态关联:不同 target_type 的对话创建
- 标签系统:带标签和不带标签的对话
3. 性能测试
- 对话列表查询(多维度筛选)
- 消息列表查询(分页)
- 并发创建对话会话
相关文档
- 需求文档:
docs/requirements/backend/04-services/ai/ai-conversation-service.mddocs/requirements/backend/04-services/ai/ai-conversation-mention-system.mddocs/requirements/backend/04-services/ai/ai-prompt-system-service.md
- 数据库迁移:
server/alembic/versions/20260203_1500_create_ai_prompts_system_table.pyserver/alembic/versions/20260203_1600_create_ai_conversations_tables.py
- 架构文档:
docs/architecture/changelogs/2026-02-03-ai-prompts-system-creation.mddocs/architecture/changelogs/2026-02-03-ai-conversations-tables-creation.md
下一步计划
- 完善验证方法:实现
_validate_target(),_validate_tag(),_generate_title()的完整逻辑 - 实现 @ 提及功能:添加
get_mentionable_resources()等方法 - 实现 AI 生成触发:添加
trigger_ai_generation()方法 - 添加管理员权限验证:完善
ai_prompts.py中的权限检查 - 编写测试用例:覆盖核心功能
- API 测试:在 Docker 容器中启动服务器测试接口
总结
本次实现完成了 AI 对话系统的完整功能,包括:
- ✅ 15 个文件的完整实现(Models, Schemas, Repositories, Services, API)
- ✅ 符合 jointo-tech-stack 规范(UUID v7, TIMESTAMPTZ, SMALLINT 枚举, 无物理外键, %-formatting 日志, exc_info=True, 异步操作)
- ✅ 多态关联 + 标签系统(支持不同类型对象的对话,支持变体区分)
- ✅ 完整的 CRUD 操作和查询功能
- ✅ 验证方法完整实现(_validate_target, _validate_tag, _generate_title, _get_target_name, _get_tag_name)
- ✅ @ 提及功能完整实现(包括 get_mentionable_resources API、解析、验证、构建)
- ✅ AI 生成触发功能完整实现(trigger_ai_generation + API 路由)
- ⚠️ 部分功能待集成(音效/配音 repository、AI Service 实际集成)
核心 API 路由:
POST /api/v1/ai/conversations- 创建对话会话GET /api/v1/ai/conversations- 查询对话列表GET /api/v1/ai/conversations/{id}- 获取对话详情POST /api/v1/ai/conversations/{id}/messages- 发送消息GET /api/v1/ai/conversations/{id}/messages- 查询消息列表GET /api/v1/ai/conversations/{id}/mentionable-resources- 获取可提及的资源列表 ⭐POST /api/v1/ai/conversations/{id}/generate- 触发 AI 生成任务
代码已通过 getDiagnostics 验证,无语法错误。所有核心功能已完整实现,可以开始前后端联调测试。