mirror of
https://github.com/hwchase17/langchain.git
synced 2025-09-13 13:36:15 +00:00
core[patch], openai[patch]: Handle OpenAI developer msg (#28794)
- Convert developer openai messages to SystemMessage - store additional_kwargs={"__openai_role__": "developer"} so that the correct role can be reconstructed if needed - update ChatOpenAI to read in openai_role --------- Co-authored-by: Erick Friis <erick@langchain.dev>
This commit is contained in:
@@ -221,14 +221,14 @@ def _create_message_from_message_type(
|
||||
tool_call_id: (str) the tool call id. Default is None.
|
||||
tool_calls: (list[dict[str, Any]]) the tool calls. Default is None.
|
||||
id: (str) the id of the message. Default is None.
|
||||
**additional_kwargs: (dict[str, Any]) additional keyword arguments.
|
||||
additional_kwargs: (dict[str, Any]) additional keyword arguments.
|
||||
|
||||
Returns:
|
||||
a message of the appropriate type.
|
||||
|
||||
Raises:
|
||||
ValueError: if the message type is not one of "human", "user", "ai",
|
||||
"assistant", "system", "function", or "tool".
|
||||
"assistant", "function", "tool", "system", or "developer".
|
||||
"""
|
||||
kwargs: dict[str, Any] = {}
|
||||
if name is not None:
|
||||
@@ -261,7 +261,10 @@ def _create_message_from_message_type(
|
||||
message: BaseMessage = HumanMessage(content=content, **kwargs)
|
||||
elif message_type in ("ai", "assistant"):
|
||||
message = AIMessage(content=content, **kwargs)
|
||||
elif message_type == "system":
|
||||
elif message_type in ("system", "developer"):
|
||||
if message_type == "developer":
|
||||
kwargs["additional_kwargs"] = kwargs.get("additional_kwargs") or {}
|
||||
kwargs["additional_kwargs"]["__openai_role__"] = "developer"
|
||||
message = SystemMessage(content=content, **kwargs)
|
||||
elif message_type == "function":
|
||||
message = FunctionMessage(content=content, **kwargs)
|
||||
@@ -273,7 +276,7 @@ def _create_message_from_message_type(
|
||||
else:
|
||||
msg = (
|
||||
f"Unexpected message type: '{message_type}'. Use one of 'human',"
|
||||
f" 'user', 'ai', 'assistant', 'function', 'tool', or 'system'."
|
||||
f" 'user', 'ai', 'assistant', 'function', 'tool', 'system', or 'developer'."
|
||||
)
|
||||
msg = create_message(message=msg, error_code=ErrorCode.MESSAGE_COERCION_FAILURE)
|
||||
raise ValueError(msg)
|
||||
@@ -1385,7 +1388,7 @@ def _get_message_openai_role(message: BaseMessage) -> str:
|
||||
elif isinstance(message, ToolMessage):
|
||||
return "tool"
|
||||
elif isinstance(message, SystemMessage):
|
||||
return "system"
|
||||
return message.additional_kwargs.get("__openai_role__", "system")
|
||||
elif isinstance(message, FunctionMessage):
|
||||
return "function"
|
||||
elif isinstance(message, ChatMessage):
|
||||
|
@@ -469,6 +469,7 @@ def test_convert_to_messages() -> None:
|
||||
message_like: list = [
|
||||
# BaseMessage
|
||||
SystemMessage("1"),
|
||||
SystemMessage("1.1", additional_kwargs={"__openai_role__": "developer"}),
|
||||
HumanMessage([{"type": "image_url", "image_url": {"url": "2.1"}}], name="2.2"),
|
||||
AIMessage(
|
||||
[
|
||||
@@ -503,6 +504,7 @@ def test_convert_to_messages() -> None:
|
||||
ToolMessage("5.1", tool_call_id="5.2", name="5.3"),
|
||||
# OpenAI dict
|
||||
{"role": "system", "content": "6"},
|
||||
{"role": "developer", "content": "6.1"},
|
||||
{
|
||||
"role": "user",
|
||||
"content": [{"type": "image_url", "image_url": {"url": "7.1"}}],
|
||||
@@ -526,6 +528,7 @@ def test_convert_to_messages() -> None:
|
||||
{"role": "tool", "content": "10.1", "tool_call_id": "10.2"},
|
||||
# Tuple/List
|
||||
("system", "11.1"),
|
||||
("developer", "11.2"),
|
||||
("human", [{"type": "image_url", "image_url": {"url": "12.1"}}]),
|
||||
(
|
||||
"ai",
|
||||
@@ -551,6 +554,9 @@ def test_convert_to_messages() -> None:
|
||||
]
|
||||
expected = [
|
||||
SystemMessage(content="1"),
|
||||
SystemMessage(
|
||||
content="1.1", additional_kwargs={"__openai_role__": "developer"}
|
||||
),
|
||||
HumanMessage(
|
||||
content=[{"type": "image_url", "image_url": {"url": "2.1"}}], name="2.2"
|
||||
),
|
||||
@@ -586,6 +592,9 @@ def test_convert_to_messages() -> None:
|
||||
),
|
||||
ToolMessage(content="5.1", name="5.3", tool_call_id="5.2"),
|
||||
SystemMessage(content="6"),
|
||||
SystemMessage(
|
||||
content="6.1", additional_kwargs={"__openai_role__": "developer"}
|
||||
),
|
||||
HumanMessage(
|
||||
content=[{"type": "image_url", "image_url": {"url": "7.1"}}], name="7.2"
|
||||
),
|
||||
@@ -603,6 +612,9 @@ def test_convert_to_messages() -> None:
|
||||
),
|
||||
ToolMessage(content="10.1", tool_call_id="10.2"),
|
||||
SystemMessage(content="11.1"),
|
||||
SystemMessage(
|
||||
content="11.2", additional_kwargs={"__openai_role__": "developer"}
|
||||
),
|
||||
HumanMessage(content=[{"type": "image_url", "image_url": {"url": "12.1"}}]),
|
||||
AIMessage(
|
||||
content=[
|
||||
@@ -937,3 +949,12 @@ def test_convert_to_openai_messages_mixed_content_types() -> None:
|
||||
assert isinstance(result[0]["content"][0], dict)
|
||||
assert isinstance(result[0]["content"][1], dict)
|
||||
assert isinstance(result[0]["content"][2], dict)
|
||||
|
||||
|
||||
def test_convert_to_openai_messages_developer() -> None:
|
||||
messages: list = [
|
||||
SystemMessage("a", additional_kwargs={"__openai_role__": "developer"}),
|
||||
{"role": "developer", "content": "a"},
|
||||
]
|
||||
result = convert_to_openai_messages(messages)
|
||||
assert result == [{"role": "developer", "content": "a"}] * 2
|
||||
|
Reference in New Issue
Block a user