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.
8.2 KiB
8.2 KiB
数据格式迁移验证报告
日期: 2026-02-13
执行时间: 03:31:18
版本: v1.1
✅ 迁移结果
执行概况
命令: docker exec jointo-server-app python scripts/migrate_model_capabilities.py
退出码: 0(成功)
耗时: ~2.4秒
统计数据
| 模型类型 | 总数 | 已配置 capabilities | 已配置 reference | 覆盖率 |
|---|---|---|---|---|
| 文本模型 (1) | 5 | 5 | 0 | 100% |
| 图片模型 (2) | 3 | 3 | 3 | 100% |
| 视频模型 (3) | 9 | 9 | 9 | 100% |
| 音频模型 (4) | 5 | 5 | 0 | 100% |
| 总计 | 22 | 22 | 12 | 100% |
📋 迁移详情
已更新模型(12 个)
视频模型(9 个)
-
sora-2
{ "size": {"values": ["720x1280", "1280x720"], "default": "720x1280"}, "seconds": {"values": ["4", "8", "12"], "default": "4"}, "input_reference": {"supported": true, "num": 1} } -
sora-2-pro
{ "size": {"values": ["720x1280", "1280x720"], "default": "720x1280"}, "seconds": {"values": ["4", "8", "12"], "default": "4"}, "input_reference": {"supported": true, "num": 1} } -
veo-3.1-generate-preview
{ "size": {"values": ["720P", "1080P"], "default": "720P"}, "seconds": {"values": ["4", "6", "8"], "default": "8"}, "input_reference": {"supported": true, "num": 1} } -
veo-3.1-fast-generate-preview
{ "size": {"values": ["720P", "1080P"], "default": "720P"}, "seconds": {"values": ["4", "6", "8"], "default": "4"}, "input_reference": {"supported": true, "num": 1} } -
wan2.6-t2v(仅文生视频)
{ "size": {"values": ["832x480", "480x832", "624x624", "1088x832", "832x1088", "960x960", "1280x720", "720x1280", "1248x1632", "1632x1248", "1440x1440", "1080x1920", "1920x1080"], "default": "1280x720"}, "seconds": {"values": ["5", "10"], "default": "5"}, "input_reference": {"supported": false}, "video_mode": "t2v" } -
wan2.6-i2v(图生视频)
{ "size": {...}, "seconds": {"values": ["5", "10"], "default": "5"}, "input_reference": {"supported": true, "num": 1}, "video_mode": "i2v" } -
jimeng-3.0-720p
{ "size": {"values": ["1280x720", "720x1280"], "default": "1280x720"}, "seconds": {"values": ["5"], "default": "5"}, "input_reference": {"supported": true, "num": 1} } -
jimeng-3.0-1080p
{ "size": {"values": ["1920x1080", "1080x1920"], "default": "1920x1080"}, "seconds": {"values": ["5"], "default": "5"}, "input_reference": {"supported": true, "num": 1} } -
jimeng-3.0-pro
{ "size": {"values": ["1920x1080", "1080x1920", "1280x720", "720x1280"], "default": "1920x1080"}, "seconds": {"values": ["5", "10"], "default": "5"}, "input_reference": {"supported": true, "num": 1} }
图片模型(3 个)
-
dall-e-3
{ "size": {"values": ["1024x1024", "1792x1024", "1024x1792"], "default": "1024x1024"}, "quality": {"values": ["standard", "hd"], "default": "standard"}, "input_fidelity": {"values": ["high", "low"], "default": "low"}, "moderation": {"values": ["auto", "low"], "default": "auto"}, "output_format": {"values": ["png", "jpeg", "webp"], "default": "jpeg"}, "n": {"type": "integer", "min": 1, "max": 10, "default": 1}, "reference_image": {"supported": true, "num": 1} } -
gemini-2.5-flash-image
{ "size": {"values": ["1K", "2K", "4K", "auto"], "default": "auto"}, "quality": {"values": ["low", "medium", "high"], "default": "medium"}, "n": {"type": "integer", "min": 1, "max": 10, "default": 1}, "reference_image": {"supported": true, "num": 1} } -
gemini-3-pro-image-preview
{ "size": {"values": ["1K", "2K", "4K", "auto"], "default": "auto"}, "quality": {"values": ["low", "medium", "high"], "default": "high"}, "n": {"type": "integer", "min": 1, "max": 10, "default": 1}, "reference_image": {"supported": true, "num": 1} }
已跳过模型(10 个)
这些模型暂无预定义 capabilities 配置,属于正常情况:
| 模型名称 | 类型 | 原因 |
|---|---|---|
| eleven_text_to_sound_v2 | 音频 | 无配置 |
| eleven_turbo_v2 | 音频 | 无配置 |
| eleven_turbo_v2_5 | 音频 | 无配置 |
| eleven_monolingual_v1 | 音频 | 无配置 |
| eleven_multilingual_v2 | 音频 | 无配置 |
| gpt-5.1 | 文本 | 无配置 |
| gpt-5.2 | 文本 | 无配置 |
| deepseek-v3.2 | 文本 | 无配置 |
| gemini-3-flash-preview | 文本 | 无配置 |
| gemini-2.5-flash | 文本 | 无配置 |
🔍 数据验证
SQL 验证
-- 验证对象格式
SELECT model_name, model_type,
capabilities->'reference_image' as reference_image,
capabilities->'input_reference' as input_reference
FROM ai_models
WHERE capabilities->'reference_image' IS NOT NULL
OR capabilities->'input_reference' IS NOT NULL;
结果(示例):
model_name | model_type | reference_image | input_reference
---------------|------------|------------------------------|--------------------------------
dall-e-3 | 2 | {"num": 1, "supported": true}| null
sora-2 | 3 | null | {"num": 1, "supported": true}
wan2.6-t2v | 3 | null | {"supported": false}
完整性验证
SELECT
model_type,
COUNT(*) as total,
COUNT(capabilities) as with_capabilities,
COUNT(CASE WHEN capabilities->'reference_image' IS NOT NULL
OR capabilities->'input_reference' IS NOT NULL THEN 1 END) as with_reference
FROM ai_models
GROUP BY model_type
ORDER BY model_type;
结果:
model_type | total | with_capabilities | with_reference
-----------|-------|-------------------|---------------
1 | 5 | 5 | 0
2 | 3 | 3 | 3 ← 100% 覆盖
3 | 9 | 9 | 9 ← 100% 覆盖
4 | 5 | 5 | 0
📊 数据格式对比
修改前(整数格式)
{
"reference_image": 1,
"input_reference": 5
}
问题:
- ❌ 语义不清:
0是"不支持"还是"支持 0 个"? - ❌ 扩展性差:无法添加更多元数据
- ❌ 需要额外转换逻辑
修改后(对象格式)
{
"reference_image": {
"supported": true,
"num": 1
},
"input_reference": {
"supported": false
}
}
优势:
- ✅ 语义明确:
supported显式表达能力状态 - ✅ 可扩展:支持添加
max_size_mb、formats等字段 - ✅ 统一格式:数据库与 API 响应格式一致
🔧 技术细节
转换器兼容性
文件: server/app/utils/capability_transformer.py
# 同时支持新旧格式
if isinstance(ref_value, dict):
# 对象格式(推荐)
result[field] = ref_value
elif isinstance(ref_value, int) and ref_value > 0:
# 整数格式(向后兼容)
result[field] = {
"supported": True,
"num": ref_value
}
迁移脚本更新
文件: server/scripts/migrate_model_capabilities.py
变更统计:
- 修改行数: ~50 行
- 涉及模型: 31 个(迁移脚本中配置的所有模型)
- 数据库更新: 12 个活跃模型
✅ 验证通过标准
| 检查项 | 状态 | 结果 |
|---|---|---|
| 迁移脚本执行 | ✅ | 退出码 0,无错误 |
| 数据格式正确 | ✅ | 所有模型使用对象格式 |
| 数据完整性 | ✅ | 12/12 模型配置完整 |
| API 响应验证 | ✅ | transform_capabilities_to_api 输出正确 |
| 向后兼容 | ✅ | 转换器支持整数格式降级 |
📚 相关文档
验证人: Claude
执行时间: 2026-02-13 03:31:18
验证状态: ✅ 通过