] PaperVizProcessor | [PaperVizProcessor] [ERROR] candidate=3 失败: RuntimeError: ...
错误信息
16:11:37 [ERROR] PaperVizProcessor | [PaperVizProcessor] [ERROR] candidate=3 失败: RuntimeError: OpenAI 文本生成在 5 次尝试后仍然失败 for critic[candidate=3,round=0]: Error code: 400 - {'error': {'code': '400', 'message': 'Param Incorrect', 'param': 'messages[1] user content: the provided base64 data is not valid', 'type': ''}}
Traceback (most recent call last):
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\utils\generation_utils.py", line 1668, in call_openai_with_retry_async
first_response = await client.chat.completions.create(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\.venv\Lib\site-packages\openai\resources\chat\completions\completions.py", line 2714, in create
return await self._post(
^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\.venv\Lib\site-packages\openai\_base_client.py", line 1884, in post
return await self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\.venv\Lib\site-packages\openai\_base_client.py", line 1669, in request
raise self._make_status_error_from_response(err.response) from None
openai.BadRequestError: Error code: 400 - {'error': {'code': '400', 'message': 'Param Incorrect', 'param': 'messages[1] user content: the provided base64 data is not valid', 'type': ''}}
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\utils\paperviz_processor.py", line 469, in process_one
result = await self.process_single_query(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\utils\paperviz_processor.py", line 421, in process_single_query
data = await self._execute_pipeline_stage(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\utils\paperviz_processor.py", line 213, in _execute_pipeline_stage
data = await self._run_critic_iterations(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\utils\paperviz_processor.py", line 315, in _run_critic_iterations
data = await self.critic_agent.process(data, source=source)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\agents\critic_agent.py", line 119, in process
response_list = await self.call_text_api(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\agents\base_agent.py", line 121, in call_text_api
return await generation_utils.call_openai_with_retry_async(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\PaperBanana-CN-main\PaperBanana-CN-main\utils\generation_utils.py", line 1723, in call_openai_with_retry_async
raise RuntimeError(failure_message) from last_exception
RuntimeError: OpenAI 文本生成在 5 次尝试后仍然失败 for critic[candidate=3,round=0]: Error code: 400 - {'error': {'code': '400', 'message': 'Param Incorrect', 'param': 'messages[1] user content: the provided base64 data is not valid', 'type': ''}}
AI 解决方案
🔧 错误分析报告
1. 🌐 错误翻译
原文:Error code: 400 - {'error': {'code': '400', 'message': 'Param Incorrect', 'param': 'messages[1] user content: the provided base64 data is not valid', 'type': ''}}
译文:错误代码:400 - {'error': {'code': '400', 'message': '参数错误', 'param': 'messages[1] 用户内容:提供的base64数据无效', 'type': ''}}
2. 🎯 原因分析
messages 参数中索引为1的用户消息内容包含了无效的 base64 数据utils/generation_utils.py 文件的 call_openai_with_retry_async 函数中,具体是向 OpenAI 的 chat.completions.create 接口发起请求时3. 💡 解决方案
需要在生成发送给 OpenAI 的消息前,验证并修复 base64 数据的有效性,确保 base64 字符串格式正确(只包含有效的 base64 字符,且长度是4的倍数)。以下是修复代码示例:
import base64
import re
def validate_and_fix_base64(content: str) -> str:
"""
验证并修复base64内容,返回有效的base64字符串,无法修复时返回原内容或抛出明确错误
"""
# 移除非base64字符(保留字母、数字、+、/和填充符=)
cleaned = re.sub(r'[^A-Za-z0-9+/=]', '', content.strip())
# 移除所有填充符=,后面统一添加正确数量的填充
cleaned = cleaned.replace('=', '')
# 计算所需填充数量(base64长度必须是4的倍数)
remainder = len(cleaned) % 4
if remainder != 0:
cleaned += '=' * (4 - remainder)
# 再次验证是否为有效base64
try:
base64.b64decode(cleaned, validate=True)
return cleaned
except Exception as e:
# 若修复后仍无效,记录详细错误并返回原内容(或根据业务需求处理)
print(f"Base64修复失败,原内容:{content},错误:{e}")
# 若业务要求严格,可抛出自定义异常,此处返回原内容避免中断流程
return content
# 在调用OpenAI接口前,对messages中的用户内容进行处理
# 假设原消息构造位置在generation_utils.py或相关调用逻辑中
# 示例:修改原消息构造代码,加入base64验证修复
# 原可能的代码:
# messages = [
# {"role": "system", "content": system_prompt},
# {"role": "user", "content": user_base64_content} # 此处content为base64字符串
# ]
# 修复后的消息构造
def build_valid_messages(system_prompt: str, user_base64_content: str) -> list:
fixed_user_content = validate_and_fix_base64(user_base64_content)
return [
{"role": "system", "content": system_prompt},
{"role": "user", "content": fixed_user_content}
]
# 调用时替换为:
# messages = build_valid_messages(system_prompt, user_base64_content)
# first_response = await client.chat.completions.create(
# model=model,
# messages=messages,
# # 其他参数...
# )
4. 🛡️ 预防措施
base64.b64decode(..., validate=True) 验证有效性,避免无效数据进入 API 调用流程。