"""自定义 OpenAI 兼容网关的请求格式适配。""" from __future__ import annotations from typing import Any from langchain_core.language_models import LanguageModelInput from langchain_openai import ChatOpenAI class GatewayChatOpenAI(ChatOpenAI): """保留工具调用信息,同时兼容不接受 assistant.content=null 的网关。""" def _get_request_payload( self, input_: LanguageModelInput, *, stop: list[str] | None = None, **kwargs: Any, ) -> dict: payload = super()._get_request_payload(input_, stop=stop, **kwargs) # LangChain 将空的工具调用消息序列化为 content=null;现场网关仅接受 # str 或 list,因此首次调用正常,回传工具结果的下一轮请求却返回 422。 # 只改发送时的字典,不修改会话消息、检查点或工具名/参数/调用 ID。 for message in payload.get("messages", []): if ( message.get("role") == "assistant" and message.get("tool_calls") and message.get("content") is None ): message["content"] = "" return payload