快速结论:这个报错通常出现在使用 CrewAI 的 SQLiteFlowPersistence(或 @persist 装饰器)保存 Flow 状态时,状态模型里含有 datetime、UUID、set 等 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,状态字段包含 datetime、uuid.UUID、set[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.datetime、uuid.UUID、set等),不会转成 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 状态模型中是否含有
datetime、UUID、set、Decimal、Path等非 JSON 原生类型。 - 确认使用的是
SQLiteFlowPersistence或@persist,而非其他持久化后端。 - 确认虚拟环境(Issue 中为 Venv),排除全局包与项目内包版本混用。
解决步骤
- 先确认本地 crewAI 版本是否已包含修复。Issue 中提交者已提交 PR #7376,但正文未给出已发布的修复版本号;如果当前版本仍为 1.15.20 或更早,可优先尝试升级后再复测。
- 如果无法立即升级,可优先尝试按 Issue 中的方案临时修改
lib/crewai/src/crewai/flow/persistence/sqlite.py:在_to_state_dict中把 BaseModel 分支改为return state_data.model_dump(mode="json")。 - 同时检查
_save_state_sql和save_pending_feedback中的json.dumps调用,可优先尝试补充default=str,避免遗漏的类型再次触发TypeError。 - 保存状态后需通过
load_state做一次完整往返验证,确认model_validate能把 JSON 值还原成原生datetime、UUID、set。 - 如果使用 pip 安装的 crewAI,直接改 site-packages 内的文件会在下次升级时被覆盖;长期方案应等待包含 PR #7376 的正式版本,或从源码安装。
验证方法
用 Issue 中的最小复现脚本重新运行:定义含 datetime、uuid.UUID、set[str] 字段的 WorkflowState,挂载 SQLiteFlowPersistence 和 @persist,调用 flow.kickoff()。若不再出现 RuntimeError: State persistence failed: Object of type datetime is not JSON serializable,且load_state 读回后字段类型仍为原生的 datetime、UUID、set,说明修复生效。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


