RuntimeError: State persistence failed: Object of type datetime is not JSON serializable`

这个报错通常出现在使用 CrewAI 的 SQLiteFlowPersistence (或 @persist 装饰器)保存 Flow 状态时,状态模型里含有 datetime 、 UUID 、 set 等 Pydantic 非 JSON 原生类型。优先排查状态序列化环节是否使用了 JSON 模式。

快速结论:这个报错通常出现在使用 CrewAI 的 SQLiteFlowPersistence(或 @persist 装饰器)保存 Flow 状态时,状态模型里含有 datetimeUUIDset 等 Pydantic 非 JSON 原生类型。优先排查状态序列化环节是否使用了 JSON 模式。

适用环境:Issue 中确认的环境为 macOS Sonoma、Python 3.12、crewAI 1.15.20、crewAI Tools 1.15.20、Venv 虚拟环境。其他操作系统与版本未在该 Issue 中验证。

最快修复方案:Issue 中提交者验证过的方向是修改 lib/crewai/src/crewai/flow/persistence/sqlite.py:在 _to_state_dict 中把 state_data.model_dump() 改为 state_data.model_dump(mode="json"),并为 json.dumps 增加 default=str 兜底。该修复已由提交者以 PR #7376 提交。

注意事项:Issue 未提供官方发布的修复版本号,升级到包含该 PR 的版本前不要假设已修复;如果你的 Flow 状态中包含自定义类型或嵌套模型,仅改 mode="json" 可能仍不够,需要确认反序列化回原生类型时是否有数据丢失。

问题场景

用户用 CrewAI 构建了一个带结构化 Pydantic 状态模型的 Flow,状态字段包含 datetimeuuid.UUIDset[str] 等类型。通过 SQLiteFlowPersistence("test_flow.db") 配合 @persist(persistence) 装饰 flow step,然后调用 flow.kickoff()。当被持久化的方法执行完成、准备保存状态时,Flow 直接崩溃。

报错原文

Failed to persist state for method step_one: Object of type datetime is not JSON serializable
Flow Method Failed
- Method: step_one
- Status: Failed

FLOW CRASHED: RuntimeError: State persistence failed: Object of type datetime is not JSON serializable

原因分析

根据 Issue 正文定位,问题出在 lib/crewai/src/crewai/flow/persistence/sqlite.py,有两处可疑点:

  • _to_state_dict 调用 state_data.model_dump() 时没有指定 mode="json"。Pydantic v2 默认保留原生 Python 类型(datetime.datetimeuuid.UUIDset 等),不会转成 JSON 基础类型。
  • _save_state_sql(约第 142 行)和 save_pending_feedback(约第 241 行)直接调用 json.dumps(state_dict),没有 default=str 之类的序列化兜底,遇到非原生类型立即抛 TypeError

也就是说,这是状态序列化链路里“Pydantic 输出类型”与“json.dumps 输入要求”不匹配导致的,不是 Flow 业务逻辑本身的问题。

环境排查

  • 确认 crewAI 版本,Issue 中触发版本为 1.15.20;升级后需确认是否已包含对应修复。
  • 确认 Python 版本,Issue 中为 3.12。
  • 确认 Pydantic 版本,问题根因与 Pydantic v2 的 model_dump() 行为直接相关。
  • 确认 Flow 状态模型中是否含有 datetimeUUIDsetDecimalPath 等非 JSON 原生类型。
  • 确认使用的是 SQLiteFlowPersistence@persist,而非其他持久化后端。
  • 确认虚拟环境(Issue 中为 Venv),排除全局包与项目内包版本混用。

解决步骤

  1. 先确认本地 crewAI 版本是否已包含修复。Issue 中提交者已提交 PR #7376,但正文未给出已发布的修复版本号;如果当前版本仍为 1.15.20 或更早,可优先尝试升级后再复测。
  2. 如果无法立即升级,可优先尝试按 Issue 中的方案临时修改 lib/crewai/src/crewai/flow/persistence/sqlite.py:在 _to_state_dict 中把 BaseModel 分支改为 return state_data.model_dump(mode="json")
  3. 同时检查 _save_state_sqlsave_pending_feedback 中的 json.dumps 调用,可优先尝试补充 default=str,避免遗漏的类型再次触发 TypeError
  4. 保存状态后需通过 load_state 做一次完整往返验证,确认 model_validate 能把 JSON 值还原成原生 datetimeUUIDset
  5. 如果使用 pip 安装的 crewAI,直接改 site-packages 内的文件会在下次升级时被覆盖;长期方案应等待包含 PR #7376 的正式版本,或从源码安装。

验证方法

用 Issue 中的最小复现脚本重新运行:定义含 datetimeuuid.UUIDset[str] 字段的 WorkflowState,挂载 SQLiteFlowPersistence@persist,调用 flow.kickoff()。若不再出现 RuntimeError: State persistence failed: Object of type datetime is not JSON serializable,且load_state 读回后字段类型仍为原生的 datetimeUUIDset,说明修复生效。

参考来源

crewAIInc/crewAI #7358

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23809

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注