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:
Bagatur
2024-12-18 13:54:07 -08:00
committed by GitHub
parent 43b0736a51
commit 4a531437bb
5 changed files with 96 additions and 10 deletions

View File

@@ -1097,3 +1097,16 @@ def test_o1_max_tokens() -> None:
"how are you"
)
assert isinstance(response, AIMessage)
def test_developer_message() -> None:
llm = ChatOpenAI(model="o1", max_tokens=10) # type: ignore[call-arg]
response = llm.invoke(
[
{"role": "developer", "content": "respond in all caps"},
{"role": "user", "content": "HOW ARE YOU"},
]
)
assert isinstance(response, AIMessage)
assert isinstance(response.content, str)
assert response.content.upper() == response.content

View File

@@ -100,6 +100,16 @@ def test__convert_dict_to_message_system() -> None:
assert _convert_message_to_dict(expected_output) == message
def test__convert_dict_to_message_developer() -> None:
message = {"role": "developer", "content": "foo"}
result = _convert_dict_to_message(message)
expected_output = SystemMessage(
content="foo", additional_kwargs={"__openai_role__": "developer"}
)
assert result == expected_output
assert _convert_message_to_dict(expected_output) == message
def test__convert_dict_to_message_system_with_name() -> None:
message = {"role": "system", "content": "foo", "name": "test"}
result = _convert_dict_to_message(message)
@@ -850,3 +860,25 @@ def test_nested_structured_output_strict() -> None:
self_evaluation: SelfEvaluation
llm.with_structured_output(JokeWithEvaluation, method="json_schema")
def test__get_request_payload() -> None:
llm = ChatOpenAI(model="gpt-4o-2024-08-06")
messages: list = [
SystemMessage("hello"),
SystemMessage("bye", additional_kwargs={"__openai_role__": "developer"}),
{"role": "human", "content": "how are you"},
]
expected = {
"messages": [
{"role": "system", "content": "hello"},
{"role": "developer", "content": "bye"},
{"role": "user", "content": "how are you"},
],
"model": "gpt-4o-2024-08-06",
"stream": False,
"n": 1,
"temperature": 0.7,
}
payload = llm._get_request_payload(messages)
assert payload == expected