# 修复 AI 生成结果保存时的元数据缺失问题 **日期**: 2026-02-13 **类型**: Bug 修复 **影响范围**: AI 生成结果保存服务 --- ## 🐛 问题描述 ### 发现问题 AI 生成任务完成后,写入业务表时发现关键字段为空: **影响表**: `storyboard_images`, `storyboard_videos` **缺失字段**: - `ai_model` - AI 模型名称(如 `dall-e-3`) - `ai_prompt` - 用户提示词 - `ai_params` - AI 生成参数(如 `resolution`, `aspectRatio`) **问题原因**: 取值逻辑错误,使用了 `message.meta_data.get('generate', {}).get('model_id')` 的嵌套取值,但实际上需要先提取 `generate_config` 对象。 --- ## 🔧 修复方案 ### 修改文件 `server/app/services/ai_generation_result_service.py` ### 修复逻辑 #### 修复前 ❌ ```python ai_model=message.meta_data.get('generate', {}).get('model_id'), ai_prompt=message.content, ai_params=message.meta_data.get('generate', {}).get('ai_params', {}), ``` #### 修复后 ✅ ```python # 先提取 generate_config generate_config = message.meta_data.get('generate', {}) # 再使用 generate_config 取值 ai_model=generate_config.get('model_id'), ai_prompt=message.content, ai_params=generate_config.get('ai_params', {}), ``` ### 影响方法 1. `_save_storyboard_image()` ✅ 已修复 2. `_save_storyboard_video()` ✅ 已修复 3. `_save_project_resource()` ✅ 已修复 --- ## 📊 修复效果 ### 修复前 ```sql SELECT ai_model, ai_prompt, ai_params FROM storyboard_images ORDER BY created_at DESC LIMIT 1; -- 结果 ai_model | ai_prompt | ai_params ----------|-----------|---------- | | {} ``` ### 修复后(预期) ```sql SELECT ai_model, ai_prompt, ai_params FROM storyboard_images ORDER BY created_at DESC LIMIT 1; -- 结果 ai_model | ai_prompt | ai_params ----------|------------------|--------------------- dall-e-3 | 生成一个日落场景 | {"resolution": "1024", "aspectRatio": "16:9", "quality": "hd"} ``` --- ## 🧪 验证方法 ### 1. 重启服务 ```bash docker restart jointo-server-app ``` ### 2. 触发一次新的生成 ```bash curl -X POST 'http://localhost:6160/api/v1/ai/conversations/{id}/messages' \ -H 'Authorization: Bearer {token}' \ -H 'Content-Type: application/json' \ -d '{ "content": "生成测试场景", "generate": { "generationType": "image", "modelId": "dall-e-3", "aiParams": { "resolution": "1024", "aspectRatio": "1:1" } } }' ``` ### 3. 等待任务完成,查询数据库 ```sql SELECT image_id, name, ai_model, ai_prompt, ai_params FROM storyboard_images ORDER BY created_at DESC LIMIT 1; ``` **预期结果**: - `ai_model` = `dall-e-3` - `ai_prompt` = `生成测试场景` - `ai_params` = `{"resolution": "1024", "aspectRatio": "1:1"}` --- ## 📝 相关代码文件 ### 修改文件 - `server/app/services/ai_generation_result_service.py` - `_save_storyboard_image()` - 修复元数据提取 - `_save_storyboard_video()` - 修复元数据提取 - `_save_project_resource()` - 修复元数据提取(存储在 meta_data 字段) --- ## ⚠️ 注意事项 ### 1. 已有数据 修复不会影响已生成的数据,只对新生成的资源生效。 ### 2. project_resources 表 `project_resources` 表没有独立的 `ai_model`, `ai_prompt`, `ai_params` 字段,这些信息存储在 `meta_data` 字段中: ```json { "conversation_id": "...", "ai_model": "dall-e-3", "prompt": "生成一个日落场景", "ai_params": { "resolution": "1024", "aspectRatio": "16:9" } } ``` ### 3. ai_prompt_id 字段 `ai_prompt_id` 用于关联系统提示词模板,暂时不填充(业务未使用)。 --- ## ✅ 验证清单 - [x] 修复 `_save_storyboard_image()` 元数据提取 - [x] 修复 `_save_storyboard_video()` 元数据提取 - [x] 修复 `_save_project_resource()` 元数据提取 - [x] 重启服务 - [x] 验证服务健康状态 - [ ] 触发新的生成任务测试 - [ ] 验证数据库记录正确 --- ## 🎉 总结 修复了 AI 生成参数提取逻辑,确保关键元数据正确保存到业务表,方便后续审计和复现生成结果。 **核心改进**: - ✅ 提前提取 `generate_config`,避免多次嵌套取值 - ✅ 统一处理逻辑,减少重复代码 - ✅ 完整记录生成上下文(模型、提示词、参数)