先把当时的情况摆出来。OpenAI Agents SDK 里给 Runner 配了 SQLiteSession,工具往上下文塞了一个 datetime 和一个自定义 dataclass,第二轮请求前保存会话报类型无法序列化,整轮对话中断。
这类报错背后常见的原因有几处,逐个排除就行。session 默认用 JSON 序列化,datetime 不在支持范围。少数情况下是自定义对象没有实现 to_dict。
少数情况下是工具把不可序列化对象直接写进了对话历史。不容易想到的是,两个协程同时写一个 session 触发文件锁。
复现并打印具体是哪个字段失败
python -c "import json,datetime;json.dumps({'t': datetime.datetime.now()})"
入历史前统一转成 ISO 字符串
python -c "from datetime import datetime;print(datetime.now().isoformat())"
给自定义对象加转换钩子再落库
python session_patch.py --hook before_save
压测两轮并发写确认不再报错
python stress_session.py --concurrency 2
怎么算真的好了,看的是同一批现象。连续多轮对话都能正常落库与恢复,历史里字段类型稳定为字符串,日志无序列化异常。
这里还有个坑。会话存储本质是文本,任何对象进历史前都要先降级成基本类型,早做比出错再补简单。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
