] PaperVizProcessor | [PaperVizProcessor] [ERROR] candidate=3 失败: RuntimeError: ...

2026年07月11日 16:14 43.58 秒 success

错误信息

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. 🎯 原因分析


  • 根本原因:在调用 OpenAI API 时,传递给 messages 参数中索引为1的用户消息内容包含了无效的 base64 数据

  • 错误位置:发生在 utils/generation_utils.py 文件的 call_openai_with_retry_async 函数中,具体是向 OpenAI 的 chat.completions.create 接口发起请求时

  • 上下文:该错误出现在执行批判模块(critic_agent)处理候选3的过程中,系统尝试将包含 base64 编码数据的消息发送给 OpenAI,但 base64 数据格式或完整性存在问题,导致 API 验证失败
  • 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 数据传递给 OpenAI API 前,必须进行严格的格式验证,可使用 base64.b64decode(..., validate=True) 验证有效性,避免无效数据进入 API 调用流程。

  • 日志详细记录:当 base64 数据无效时,记录原始数据内容、错误详情及修复尝试过程,方便快速定位数据生成源头的问题,便于回溯和修复数据生成逻辑。

  • 工具辅助检查:开发阶段可使用 postman 等工具模拟 API 调用,提前检查参数格式;也可集成代码静态检查工具,在编码阶段就发现可能导致 base64 格式错误的逻辑漏洞。