|
|
@ -2,6 +2,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import json
|
|
|
|
import logging
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import sys
|
|
|
@ -50,8 +51,10 @@ from langchain_core.messages import (
|
|
|
|
FunctionMessageChunk,
|
|
|
|
FunctionMessageChunk,
|
|
|
|
HumanMessage,
|
|
|
|
HumanMessage,
|
|
|
|
HumanMessageChunk,
|
|
|
|
HumanMessageChunk,
|
|
|
|
|
|
|
|
InvalidToolCall,
|
|
|
|
SystemMessage,
|
|
|
|
SystemMessage,
|
|
|
|
SystemMessageChunk,
|
|
|
|
SystemMessageChunk,
|
|
|
|
|
|
|
|
ToolCall,
|
|
|
|
ToolMessage,
|
|
|
|
ToolMessage,
|
|
|
|
ToolMessageChunk,
|
|
|
|
ToolMessageChunk,
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -169,20 +172,25 @@ def _convert_message_to_dict(message: BaseMessage) -> dict:
|
|
|
|
message_dict["role"] = "assistant"
|
|
|
|
message_dict["role"] = "assistant"
|
|
|
|
if "function_call" in message.additional_kwargs:
|
|
|
|
if "function_call" in message.additional_kwargs:
|
|
|
|
message_dict["function_call"] = message.additional_kwargs["function_call"]
|
|
|
|
message_dict["function_call"] = message.additional_kwargs["function_call"]
|
|
|
|
# If function call only, content is None not empty string
|
|
|
|
if message.tool_calls or message.invalid_tool_calls:
|
|
|
|
if message_dict["content"] == "":
|
|
|
|
message_dict["tool_calls"] = [
|
|
|
|
message_dict["content"] = None
|
|
|
|
_lc_tool_call_to_openai_tool_call(tc) for tc in message.tool_calls
|
|
|
|
if "tool_calls" in message.additional_kwargs:
|
|
|
|
] + [
|
|
|
|
|
|
|
|
_lc_invalid_tool_call_to_openai_tool_call(tc)
|
|
|
|
|
|
|
|
for tc in message.invalid_tool_calls
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
elif "tool_calls" in message.additional_kwargs:
|
|
|
|
message_dict["tool_calls"] = message.additional_kwargs["tool_calls"]
|
|
|
|
message_dict["tool_calls"] = message.additional_kwargs["tool_calls"]
|
|
|
|
# If tool calls only, content is None not empty string
|
|
|
|
|
|
|
|
if message_dict["content"] == "":
|
|
|
|
|
|
|
|
message_dict["content"] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tool_call_supported_props = {"id", "type", "function"}
|
|
|
|
tool_call_supported_props = {"id", "type", "function"}
|
|
|
|
message_dict["tool_calls"] = [
|
|
|
|
message_dict["tool_calls"] = [
|
|
|
|
{k: v for k, v in tool_call.items() if k in tool_call_supported_props}
|
|
|
|
{k: v for k, v in tool_call.items() if k in tool_call_supported_props}
|
|
|
|
for tool_call in message_dict["tool_calls"]
|
|
|
|
for tool_call in message_dict["tool_calls"]
|
|
|
|
]
|
|
|
|
]
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
# If tool calls present, content null value should be None not empty string.
|
|
|
|
|
|
|
|
if "function_call" in message_dict or "tool_calls" in message_dict:
|
|
|
|
|
|
|
|
message_dict["content"] = message_dict["content"] or None
|
|
|
|
elif isinstance(message, SystemMessage):
|
|
|
|
elif isinstance(message, SystemMessage):
|
|
|
|
message_dict["role"] = "system"
|
|
|
|
message_dict["role"] = "system"
|
|
|
|
elif isinstance(message, FunctionMessage):
|
|
|
|
elif isinstance(message, FunctionMessage):
|
|
|
@ -1067,3 +1075,27 @@ class ChatOpenAI(BaseChatModel):
|
|
|
|
|
|
|
|
|
|
|
|
def _is_pydantic_class(obj: Any) -> bool:
|
|
|
|
def _is_pydantic_class(obj: Any) -> bool:
|
|
|
|
return isinstance(obj, type) and issubclass(obj, BaseModel)
|
|
|
|
return isinstance(obj, type) and issubclass(obj, BaseModel)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _lc_tool_call_to_openai_tool_call(tool_call: ToolCall) -> dict:
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
|
|
"type": "function",
|
|
|
|
|
|
|
|
"id": tool_call["id"],
|
|
|
|
|
|
|
|
"function": {
|
|
|
|
|
|
|
|
"name": tool_call["name"],
|
|
|
|
|
|
|
|
"arguments": json.dumps(tool_call["args"]),
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _lc_invalid_tool_call_to_openai_tool_call(
|
|
|
|
|
|
|
|
invalid_tool_call: InvalidToolCall,
|
|
|
|
|
|
|
|
) -> dict:
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
|
|
"type": "function",
|
|
|
|
|
|
|
|
"id": invalid_tool_call["id"],
|
|
|
|
|
|
|
|
"function": {
|
|
|
|
|
|
|
|
"name": invalid_tool_call["name"],
|
|
|
|
|
|
|
|
"arguments": invalid_tool_call["args"],
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|