8.7 KiB
8.7 KiB
Flow2API 插件修复说明
问题诊断
根据日志:
2025-11-26 11:44:16 | INFO | 使用 AIChat 代理: socks5://38.55.107.103:53054
2025-11-26 11:44:35 | ERROR | 图像生成失败
问题: 只显示"图像生成失败",没有具体的错误信息,无法诊断问题原因。
修复方案
1. 改进错误日志 (main.py:204-209)
修改前:
except Exception as e:
logger.error(f"请求异常: {e}")
continue
修改后:
except Exception as e:
import traceback
logger.error(f"请求异常: {type(e).__name__}: {str(e)}")
logger.error(f"异常详情:\n{traceback.format_exc()}")
logger.error(f"提示词长度: {len(prompt)} 字符")
continue
改进点:
- 显示完整的异常类型和堆栈跟踪
- 记录提示词长度,便于诊断
- 不再截断错误信息
2. 增强调试信息 (main.py:108-126)
修改前:
logger.info(f"Flow2API请求: {model}, 提示词: {prompt[:50]}...")
timeout = httpx.Timeout(connect=10.0, read=api_config["timeout"], write=10.0, pool=10.0)
修改后:
logger.info(f"Flow2API请求: {model}, 提示词长度: {len(prompt)} 字符")
logger.debug(f"完整提示词: {prompt}")
logger.debug(f"请求URL: {url}")
logger.debug(f"Payload大小: {len(str(payload))} 字节")
# 设置合理的超时时间
max_timeout = min(api_config["timeout"], 600) # 增加到 10 分钟
timeout = httpx.Timeout(
connect=10.0, # 连接超时:10秒
read=max_timeout, # 读取超时:10分钟
write=10.0, # 写入超时:10秒
pool=10.0 # 连接池超时:10秒
)
logger.debug(f"超时配置: connect=10s, read={max_timeout}s")
# 添加提示词长度检查和警告
if len(prompt) > 1000:
logger.warning(f"提示词较长 ({len(prompt)} 字符),可能影响处理速度")
改进点:
- 记录提示词长度而不是截断内容
- 增加超时时间到 10 分钟
- 添加 DEBUG 级别的详细信息
- 长提示词警告
3. 改进响应处理 (main.py:133-187)
新增功能:
logger.debug(f"收到响应状态码: {response.status_code}")
# 处理流式响应
image_url = None
full_content = ""
async for line in response.aiter_lines():
logger.debug(f"收到响应行: {line[:100]}...")
# ... 解析逻辑 ...
if content:
full_content += content
logger.debug(f"累积内容: {full_content[:100]}...")
# 如果没有从流中提取到URL,尝试从完整内容中提取
if not image_url and full_content:
import re
urls = re.findall(r'https?://[^\s\)\]"\']+', full_content)
if urls:
image_url = urls[0].rstrip("'\"")
logger.info(f"从完整内容提取到图片URL: {image_url}")
else:
logger.warning(f"完整响应内容中未找到URL: {full_content}")
if not image_url:
logger.error(f"未能提取到图片URL,完整响应: {full_content}")
改进点:
- 记录每一步的处理过程
- 累积完整响应内容
- 双重 URL 提取机制
- 显示完整响应内容以便调试
4. 添加 ReadTimeout 处理 (main.py:200-203)
except httpx.ReadTimeout:
logger.warning(f"读取超时(ReadTimeout),可能是图像生成时间过长,重试中... ({attempt + 1}/{max_retry})")
logger.info(f"提示词长度: {len(prompt)} 字符,建议缩短提示词或增加超时时间")
continue
改进点:
- 单独捕获
ReadTimeout异常 - 提供友好的错误提示
- 自动重试(最多 3 次)
5. 添加下载失败重试 (main.py:184-187)
if image_path:
logger.success("成功生成图像")
return [image_path]
else:
# 下载失败,继续重试
logger.warning(f"图片下载失败,将重试 ({attempt + 1}/{max_retry})")
continue
改进点:
- 图片下载失败时自动重试
- 重新请求 API 获取新的图片 URL
常见错误及解决方案
错误 1: 未能提取到图片URL
日志示例:
ERROR | 未能提取到图片URL,完整响应: {"error": "..."}
可能原因:
- API 返回了错误而不是图片 URL
- 响应格式不符合预期
- Token 无效或过期
解决方案:
- 检查 API Token 是否正确
- 查看完整响应内容,了解 API 返回的错误信息
- 检查 API 配置(base_url)
错误 2: ReadTimeout 超时
日志示例:
WARNING | 读取超时(ReadTimeout),可能是图像生成时间过长,重试中... (1/3)
可能原因:
- 图像生成时间过长(复杂提示词)
- 网络不稳定
- API 服务器响应慢
解决方案:
- 缩短提示词长度
- 增加配置文件中的
timeout值 - 检查网络连接和代理设置
错误 3: 图片下载失败
日志示例:
ERROR | 下载图片失败: Client error '404 Not Found'
WARNING | 图片下载失败,将重试 (1/3)
可能原因:
- 图片 URL 已过期
- CDN 链接失效
- 网络问题
解决方案:
- 自动重试会重新请求 API 获取新 URL
- 检查代理设置
- 如果持续失败,联系 API 提供商
错误 4: Token 认证失败
日志示例:
ERROR | Token认证失败
解决方案:
- 检查
config.toml中的token配置 - 确认 Token 是否有效
- 联系 API 提供商获取新 Token
调试步骤
1. 启用 DEBUG 日志
修改 main_config.toml:
[Performance]
log_level_console = "DEBUG" # 改为 DEBUG
log_level_file = "DEBUG"
2. 查看详细日志
# 实时查看日志
tail -f WechatHookBot/logs/hookbot.log | grep -E "Flow2API|图像生成"
# 搜索错误
grep "Flow2API" WechatHookBot/logs/hookbot.log | grep -E "ERROR|WARNING"
3. 测试命令
# 在微信中发送
/绘画f 一只可爱的猫咪
# 或横屏
/绘画f横屏 美丽的风景
4. 检查配置
查看 plugins/Flow2API/config.toml:
[api]
base_url = "https://your-api-url.com" # 确认 URL 正确
token = "your-token" # 确认 Token 有效
timeout = 600 # 超时时间(秒)
预期日志输出
成功案例:
INFO | Flow2API请求: gemini-3.0-pro-image-portrait, 提示词长度: 15 字符
DEBUG | 完整提示词: 一只可爱的猫咪
DEBUG | 请求URL: https://api.example.com/v1/chat/completions
DEBUG | Payload大小: 234 字节
DEBUG | 超时配置: connect=10s, read=600s
INFO | 使用 AIChat 代理: socks5://127.0.0.1:7890
DEBUG | 收到响应状态码: 200
DEBUG | 收到响应行: data: {"choices":[{"delta":{"content":"https://..."}}]}
INFO | 提取到图片URL: https://cdn.example.com/image.jpg
INFO | 图片下载成功: /path/to/flow2_20251126_114435_abc123.jpg
SUCCESS | 成功生成图像
失败但重试成功:
INFO | Flow2API请求: gemini-3.0-pro-image-portrait, 提示词长度: 15 字符
DEBUG | 收到响应状态码: 200
INFO | 提取到图片URL: https://cdn.example.com/expired.jpg
ERROR | 下载图片失败: Client error '404 Not Found'
WARNING | 图片下载失败,将重试 (1/3)
INFO | Flow2API请求: gemini-3.0-pro-image-portrait, 提示词长度: 15 字符
INFO | 提取到图片URL: https://cdn.example.com/new-image.jpg
INFO | 图片下载成功: /path/to/flow2_20251126_114436_def456.jpg
SUCCESS | 成功生成图像
完全失败(显示详细错误):
INFO | Flow2API请求: gemini-3.0-pro-image-portrait, 提示词长度: 15 字符
ERROR | 请求异常: HTTPStatusError: Client error '401 Unauthorized'
ERROR | 异常详情:
Traceback (most recent call last):
File "main.py", line 131, in generate_image
async with client.stream("POST", url, json=payload, headers=headers) as response:
...
httpx.HTTPStatusError: Client error '401 Unauthorized' for url '...'
ERROR | 提示词长度: 15 字符
ERROR | 图像生成失败
配置建议
config.toml 推荐配置
[api]
base_url = "https://your-api-url.com"
token = "your-api-token"
timeout = 600 # 10分钟,适合复杂图像生成
[generation]
default_orientation = "portrait" # 默认竖屏
max_retry_attempts = 3 # 最多重试3次
[behavior]
enable_command = true
command_keywords = ["/绘画f", "/画图f"]
enable_group = true
enable_private = true
[llm_tool]
enabled = true
tool_name = "flow2_image_generation"
tool_description = "使用Flow2 AI生成图像..."
相关文件
main.py- 主要修改文件config.toml- 配置文件修复说明.md- 本文档
总结
修复后,Flow2API 插件现在会:
- ✅ 显示完整的错误堆栈跟踪
- ✅ 记录详细的请求和响应信息
- ✅ 自动处理 ReadTimeout 超时
- ✅ 图片下载失败时自动重试
- ✅ 提供友好的错误提示和调试信息
现在当遇到"图像生成失败"时,你可以在日志中看到具体的错误原因,便于快速定位和解决问题!