预期控制台日志:
📤 准备上传文件: test.jpg, 大小: 2.5MB
📂 上传路径: ai-design-analysis/[项目ID]
上传进度: 100%
✅ 文件上传成功: https://file-cloud.fmode.cn/.../test.jpg
💾 ProjectFile记录已创建: [记录ID]
✅ 已上传1个文件
如果缺少"ProjectFile记录已创建":
console.log('项目ID:', this.projectId))操作步骤:
如果无法访问:
问题:图片URL需要身份验证或CORS限制
解决:
1. 检查OBS/存储服务的访问控制设置
2. 设置图片为公开访问
3. 配置CORS允许跨域访问
预期控制台日志:
🤖 调用豆包1.6模型...
📸 原始图片URL: ["https://file-cloud.fmode.cn/.../test.jpg"]
📸 编码后URL: ["https://file-cloud.fmode.cn/.../%E6%B5%8B%E8%AF%95.jpg"]
📸 图片数量: 1
🔍 开始测试图片URL可访问性...
✅ 图片1可访问: https://...
🚀 开始调用completionJSON进行vision分析...
检查要点:
✅ AI分析完成,原始内容长度: 2341
📝 AI返回内容预览: 一、空间定位与场景属性
这是一个现代法式风格的客餐厅一体化空间,面积约40-50平米...
特征:
❌ AI无法访问图片!
🔍 AI返回的完整内容: (注:由于未接收到实际图片内容...
🔍 图片URL列表: [...]
特征:
可能原因A:图片URL需要身份验证
✅ 解决方案:
1. 联系运维人员配置OBS/存储服务
2. 设置图片bucket为公开读取
3. 或配置签名URL(有效期24小时)
可能原因B:completionJSON不支持URL方式传图
✅ 解决方案:改用base64格式
// 在design-analysis-ai.service.ts中添加
async function urlToBase64(url: string): Promise<string> {
const response = await fetch(url);
const blob = await response.blob();
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => {
const base64 = (reader.result as string);
resolve(base64);
};
reader.onerror = reject;
reader.readAsDataURL(blob);
});
}
// 修改analyzeReferenceImages方法
const base64Images = await Promise.all(
encodedImages.map(url => urlToBase64(url))
);
const result = await completionJSON(
prompt,
'',
undefined,
2,
{
model: this.AI_MODEL,
vision: true,
images: base64Images, // 使用base64
max_tokens: 8000
}
);
可能原因C:图片上传后需要等待CDN同步
✅ 解决方案:添加延迟
// 在上传成功后等待3秒
console.log('⏳ 等待图片URL生效...');
await new Promise(resolve => setTimeout(resolve, 3000));
console.log('✅ 继续执行');
可能原因D:AI模型不支持vision
✅ 解决方案:
1. 确认fmode-1.6-cn模型支持多模态
2. 尝试其他模型(如gpt-4-vision-preview)
3. 联系fmode-ng技术支持确认
原因:存储配额已满或权限不足
✅ 解决方案:
1. 检查存储配额:联系管理员查看OBS使用情况
2. 检查项目ID:确认this.projectId有效
3. 检查权限:确认当前用户有上传权限
4. 临时方案:使用小图片测试(<1MB)
原因:上传失败,只获取到本地预览URL
✅ 解决方案:
1. 检查上传日志,查看错误信息
2. 确认文件格式支持(JPG/PNG推荐)
3. 减小文件大小(<10MB)
4. 重新上传
目的:验证vision功能基本可用
步骤:
1. 准备一张小图片(<1MB,JPG格式,纯英文文件名)
例如:test.jpg
2. 上传图片
3. 查看控制台日志
4. 点击"开始分析"
5. 等待AI返回结果
预期:
- 上传成功,创建ProjectFile记录
- 图片URL可访问性测试通过
- AI返回具体的分析内容(非模板)
如果失败:
- 记录完整的控制台日志
- 截图AI返回的内容
- 手动访问图片URL,截图结果
目的:验证URL编码是否正常
步骤:
1. 准备一张中文文件名的图片
例如:客厅设计.jpg
2. 上传并分析
3. 检查编码后的URL
预期:
- 原始URL: .../客厅设计.jpg
- 编码URL: .../%E5%AE%A2%E5%8E%85%E8%AE%BE%E8%AE%A1.jpg
- AI正常分析
目的:验证多图片同时分析
步骤:
1. 一次上传3张图片
2. 点击"开始分析"
预期:
- 所有图片URL都有效
- AI综合分析多张图片内容
目的:验证对话历史传递
步骤:
1. 上传并分析第一张图片
2. 在对话框输入问题:"能详细说明材质的选择吗?"
3. 查看AI回复
4. 继续追问
预期:
- AI能理解上下文
- 回复与之前分析相关
- 不重复分析图片
async function testImageUrl(url) {
try {
const response = await fetch(url, { method: 'HEAD' });
console.log('✅ 图片可访问,状态码:', response.status);
return true;
} catch (error) {
console.error('❌ 图片无法访问:', error);
return false;
}
}
// 使用方法
testImageUrl('https://file-cloud.fmode.cn/.../test.jpg');
import { completionJSON } from 'fmode-ng/core';
async function testVision() {
const result = await completionJSON(
'请描述这张图片的内容',
'',
undefined,
2,
{
model: 'fmode-1.6-cn',
vision: true,
images: ['https://file-cloud.fmode.cn/.../test.jpg'],
max_tokens: 1000
}
);
console.log('AI返回:', result);
}
testVision();
const query = new Parse.Query('ProjectFile');
query.equalTo('category', 'ai_design_reference');
query.descending('createdAt');
query.limit(10);
const files = await query.find();
console.log('最近上传的文件:', files.map(f => ({
id: f.id,
name: f.get('name'),
url: f.get('url'),
createdAt: f.get('createdAt')
})));
如果问题无法解决,请提供以下信息:
完整的控制台日志
图片URL测试结果
AI返回内容
环境信息
图片信息
更新日期: 2025-11-27
状态: 🔧 等待用户测试反馈