| 1234567891011121314151617181920212223242526272829303132 |
- """自定义 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
|