Skip to content

Cron 任务崩溃:'int' object has no attribute 'get'

问题

运行 cron job 时,如果底层 LLM 调用超时(例如 GPU 满载导致请求超时),cron 调度器会崩溃并报错:

ERROR cron.scheduler: Error processing job xxx: 'int' object has no attribute 'get'

错误发生在 cron/scheduler.py 第 830 行:

python
result = _cron_future.result()
final_response = result.get("final_response", "") or ""  # <-- 崩溃点

agent.run_conversation() 返回类型标注为 Dict[str, Any],但在所有 API 重试耗尽后,实际返回值变为 int,导致 .get() 调用崩溃。

复现前置条件

  1. 在 GPU 高负载时触发 cron job
  2. session_search 辅助调用因超时反复失败
  3. session 摘要在 3 次重试后失败
  4. run_conversation 返回非 dict 值

相关日志:

INFO  Auxiliary session_search: connection error on auto — falling back to local/custom
WARNING Session summarization failed after 3 attempts: Request timed out.
ERROR cron.scheduler: Error processing job ...: 'int' object has no attribute 'get'

解决方案

cron/scheduler.pyresult.get() 调用前添加类型守卫:

python
result = _cron_future.result()

# 防御 run_conversation 在错误条件下返回非 dict
if not isinstance(result, dict):
    raise RuntimeError(
        f"agent.run_conversation returned {type(result).__name__} instead of dict: {result!r}"
    )

final_response = result.get("final_response", "") or ""

这样可以将原本不明显的 AttributeError 转为清晰的错误信息,让外层 except Exception 能正确标记 job 为失败并发送错误通知。

更根本的修复:追查 run_conversation 为何在重试耗尽后返回 int——这可能是错误处理路径中的更深层 bug。

影响版本:hermes-agent v0.9.0+
Issue#9433