python 报错:TypeError: Object of type HumanMessage is not JSON serializable 怎么解决?

这个报错的本质是:你在把 HumanMessage(通常是 LangChain 的消息对象)直接 json.dumps() / 作为参数发给需要 JSON 的接口时,HumanMessage 不是标准可序列化类型,所以报 not JSON serializable

解决思路(常用)

1)把消息转换成“纯 JSON 字段”(推荐)

不要直接序列化 HumanMessage 对象,而是取出它的内容/role后再组装。

例如(伪代码,按你用的库微调):

from langchain_core.messages import HumanMessage

msgs = [HumanMessage(content="hi")]

payload_messages = [
    {"role": "user", "content": m.content}
    for m in msgs
]
# 再对 payload_messages 做 json 序列化/请求

如果你用的是 BaseMessage,一般也可以统一用:

  • m.content
  • m.type / m.role(不同版本字段名可能略不同)

2)改用库自带的序列化/入参格式

很多模型/链组件(比如 OpenAI Chat 系列、LangChain 的某些调用)其实已经接受 messages 对象,不需要你手动 JSON。

排查点:你是不是把 messages 放进了 requests.post(json=...)

  • 若是:确认目标接口是否期望 LangChain 的 messages 对象还是“JSON结构”。

3)如果你必须 json.dumps:实现自定义转换

临时兜底做法:

import json
from langchain_core.messages import HumanMessage

def default(o):
    if isinstance(o, HumanMessage):
        return {"role": "user", "content": o.content}
    raise TypeError

print(json.dumps(obj, default=default))

但更建议按方案 1/2 从源头改 payload。

我需要你补充2点,才能给你精确改法

  1. 你是用 requests 还是某个 SDK 发请求?把报错那行代码(尤其是构造 json 的部分)贴一下。
  2. 你的 HumanMessage 是来自哪套库(LangChain / langchain-core / 其他),以及你发给哪个接口(URL/函数名)?

把这两点发我,我可以直接给你对应的正确 payload 写法。