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.
 

4.3 KiB

修复 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

修复逻辑

修复前

ai_model=message.meta_data.get('generate', {}).get('model_id'),
ai_prompt=message.content,
ai_params=message.meta_data.get('generate', {}).get('ai_params', {}),

修复后

# 先提取 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() 已修复

📊 修复效果

修复前

SELECT ai_model, ai_prompt, ai_params 
FROM storyboard_images 
ORDER BY created_at DESC LIMIT 1;

-- 结果
ai_model  | ai_prompt | ai_params 
----------|-----------|----------
          |           | {}

修复后(预期)

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. 重启服务

docker restart jointo-server-app

2. 触发一次新的生成

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. 等待任务完成,查询数据库

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 字段中:

{
  "conversation_id": "...",
  "ai_model": "dall-e-3",
  "prompt": "生成一个日落场景",
  "ai_params": {
    "resolution": "1024",
    "aspectRatio": "16:9"
  }
}

3. ai_prompt_id 字段

ai_prompt_id 用于关联系统提示词模板,暂时不填充(业务未使用)。


验证清单

  • 修复 _save_storyboard_image() 元数据提取
  • 修复 _save_storyboard_video() 元数据提取
  • 修复 _save_project_resource() 元数据提取
  • 重启服务
  • 验证服务健康状态
  • 触发新的生成任务测试
  • 验证数据库记录正确

🎉 总结

修复了 AI 生成参数提取逻辑,确保关键元数据正确保存到业务表,方便后续审计和复现生成结果。

核心改进:

  • 提前提取 generate_config,避免多次嵌套取值
  • 统一处理逻辑,减少重复代码
  • 完整记录生成上下文(模型、提示词、参数)