LangGraph返回简单字典时触发TypeError: Object of type NAType is not serializable的问题排查求助
LangGraph返回简单字典时触发TypeError: Object of type NAType is not serializable的问题排查求助
大家好,我最近在使用LangGraph开发流程时遇到了一个非常奇怪的问题:即便我的节点函数返回一个完全静态的简单字典(比如{"final_return": "This works"}),依然会抛出TypeError: Object of type NAType is not serializable错误,而且这个错误是在节点执行完成、准备返回结果的阶段触发的。
我的场景说明
我有一个名为final_return_node的节点函数,核心逻辑是:
- 从LangGraph的
state对象中提取pandas DataFrame数据 - 对DataFrame做缺失值处理后,用
to_dict(orient="records")更新state字典 - 最后尝试返回一个极简响应来模拟成功流程
- 同时我启用了LangGraph的「Human-in-the-Loop」人工中断功能,允许流程执行中手动干预
我的节点函数代码
import pandas as pd import numpy as np import json from collections.abc import Mapping def sanitize_state(obj): """ 递归清理state对象,确保所有组件都可JSON序列化 """ if isinstance(obj, Mapping): return {sanitize_state(key): sanitize_state(value) for key, value in obj.items()} elif isinstance(obj, (list, tuple, set)): return [sanitize_state(item) for item in obj] elif isinstance(obj, pd.DataFrame): return sanitize_state(obj.to_dict(orient="records")) elif isinstance(obj, pd.Series): return sanitize_state(obj.tolist()) elif obj is pd.NA or (isinstance(obj, float) and np.isnan(obj)) or obj is None: return None elif isinstance(obj, (int, float, str, bool)): return obj elif isinstance(obj, (pd.Timestamp, pd.Timedelta)): return obj.isoformat() if hasattr(obj, 'isoformat') else str(obj) elif isinstance(obj, (bytes, bytearray)): import base64 return base64.b64encode(obj).decode('utf-8') else: return str(obj) def is_json_serializable(obj): """ 检查对象是否可JSON序列化 """ try: json.dumps(obj) return True except (TypeError, OverflowError): return False def sanitize_and_verify_state(state): """ 清理state对象并验证其可JSON序列化 """ sanitized = sanitize_state(state) if not is_json_serializable(sanitized): raise ValueError("Sanitized state is not JSON-serializable.") return sanitized def final_return_node(self, state): print("---MAKING FINAL RETURN---") state_dict = state.get("keys", {}) working_data = state_dict.get("working_data", []) cmm_input_8 = pd.DataFrame(working_data) sanitized_df = cmm_input_8.fillna("").replace({pd.NA: None, np.nan: None}) state["keys"].update({ "final_return": sanitized_df.to_dict(orient="records"), }) print("Completed Final Return, Sanitizing State...") state = sanitize_and_verify_state(state) print("Sanitized State Successfully.") return {"final_return": "This works"}
观察到的现象
- 节点函数内部执行完全正常,所有数据处理、state清理步骤都没有报错
- 但只要走到return语句,哪怕返回的是完全静态的字典,就会触发以下错误:
TypeError Traceback (most recent call last) ... TypeError: Object of type NAType is not serializable
我已经尝试过的解决方案(均无效)
- 返回静态字典:把函数返回值改成
{"final_return": "This works"},错误依旧 - 清理DataFrame缺失值:用
fillna("")替换空值,手动把pd.NA/np.nan换成None,没用 - 验证state序列化:通过
sanitize_and_verify_state确认处理后的state可以正常JSON序列化,但返回时还是报错 - 跳过state更新:完全不修改state,直接返回静态字典,错误仍然存在
环境信息
- Python版本:3.11
- LangGraph版本:0.2.60
- Pandas版本:1.5.3
- 操作系统:Windows 10
我的猜想
我怀疑问题和我返回的内容无关,反而可能是LangGraph的内部机制:节点返回后,LangGraph会自动序列化整个state对象,而原始state中可能还残留着未被彻底清理的pd.NA/np.nan值(比如state里的working_data字段原本就包含nan)。另外,会不会是「Human-in-the-Loop」功能在后台序列化state时,没有使用我自定义的清理逻辑?
想请教大家的问题
- 为什么返回简单字典还会触发NAType序列化错误?这是LangGraph的内部序列化机制问题,还是我的配置有疏漏?
- 我该如何确保整个state对象在LangGraph处理时完全可JSON序列化?有没有办法让LangGraph使用我自定义的sanitize逻辑来处理state?
非常感谢大家的帮助!
备注:内容来源于stack exchange,提问作者S A
相关产品推荐
相关产品推荐

