openai_compat.py 1.2 KB

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