You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时,没有使用我自定义的清理逻辑?

想请教大家的问题

  1. 为什么返回简单字典还会触发NAType序列化错误?这是LangGraph的内部序列化机制问题,还是我的配置有疏漏?
  2. 我该如何确保整个state对象在LangGraph处理时完全可JSON序列化?有没有办法让LangGraph使用我自定义的sanitize逻辑来处理state?

非常感谢大家的帮助!

备注:内容来源于stack exchange,提问作者S A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:03:11