From 51d79bf1418a7153343ea8345fe95620f029c60d Mon Sep 17 00:00:00 2001 From: Muhammad Junaid Date: Wed, 12 Mar 2025 21:10:03 +0500 Subject: [PATCH 1/2] fix: support assistant role in message conversion - The _Converter.items_to_messages method was incorrectly rejecting 'assistant' as a valid role in conversation messages, causing runtime errors when processing standard chat completion message formats. - This fix enables proper handling of complete conversation contexts that include both user and assistant messages. --- src/agents/models/openai_chatcompletions.py | 7 ++++ .../test_openai_chatcompletions_converter.py | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/agents/models/openai_chatcompletions.py b/src/agents/models/openai_chatcompletions.py index a7340d05..c20f5bb9 100644 --- a/src/agents/models/openai_chatcompletions.py +++ b/src/agents/models/openai_chatcompletions.py @@ -808,6 +808,13 @@ def ensure_assistant_message() -> ChatCompletionAssistantMessageParam: "content": cls.extract_text_content(content), } result.append(msg_developer) + elif role == "assistant": + flush_assistant_message() + msg_assistant: ChatCompletionAssistantMessageParam = { + "role": "assistant", + "content": cls.extract_text_content(content), + } + result.append(msg_assistant) else: raise UserError(f"Unexpected role in easy_input_message: {role}") diff --git a/tests/test_openai_chatcompletions_converter.py b/tests/test_openai_chatcompletions_converter.py index 8cf07d7c..47bf47c2 100644 --- a/tests/test_openai_chatcompletions_converter.py +++ b/tests/test_openai_chatcompletions_converter.py @@ -393,3 +393,35 @@ def test_unknown_object_errors(): with pytest.raises(UserError, match="Unhandled item type or structure"): # Purposely ignore the type error _Converter.items_to_messages([TestObject()]) # type: ignore + + +def test_assistant_messages_in_history(): + """ + Test that assistant messages are added to the history. + """ + messages = _Converter.items_to_messages( + [ + { + "role": "user", + "content": "Hello", + }, + { + "role": "assistant", + "content": "Hello?", + }, + { + "role": "user", + "content": "What was my Name?", + }, + ] + ) + + # OUTPUT is [{'role': 'user', 'content': 'Hello'}, {'role': 'assistant', 'content': 'Hello?'}, {'role': 'user', 'content': 'What was my Name?'}] + assert messages == [{'role': 'user', 'content': 'Hello'}, {'role': 'assistant', 'content': 'Hello?'}, {'role': 'user', 'content': 'What was my Name?'}] + assert len(messages) == 3 + assert messages[0]["role"] == "user" + assert messages[0]["content"] == "Hello" + assert messages[1]["role"] == "assistant" + assert messages[1]["content"] == "Hello?" + assert messages[2]["role"] == "user" + assert messages[2]["content"] == "What was my Name?" From c09a2258af56c2421847c714a7c969727b3eeaed Mon Sep 17 00:00:00 2001 From: Muhammad Junaid Date: Thu, 13 Mar 2025 00:20:59 +0500 Subject: [PATCH 2/2] refactor: update formatting in test_assistant_messages_in_history - Enhanced the readability of the test case by reformatting the expected output and input message structures. - This change maintains the same functionality while making the test code cleaner and easier to understand. --- .../test_openai_chatcompletions_converter.py | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/tests/test_openai_chatcompletions_converter.py b/tests/test_openai_chatcompletions_converter.py index 47bf47c2..73acb8ab 100644 --- a/tests/test_openai_chatcompletions_converter.py +++ b/tests/test_openai_chatcompletions_converter.py @@ -400,24 +400,27 @@ def test_assistant_messages_in_history(): Test that assistant messages are added to the history. """ messages = _Converter.items_to_messages( - [ - { - "role": "user", - "content": "Hello", - }, - { - "role": "assistant", - "content": "Hello?", - }, - { - "role": "user", - "content": "What was my Name?", - }, - ] - ) - - # OUTPUT is [{'role': 'user', 'content': 'Hello'}, {'role': 'assistant', 'content': 'Hello?'}, {'role': 'user', 'content': 'What was my Name?'}] - assert messages == [{'role': 'user', 'content': 'Hello'}, {'role': 'assistant', 'content': 'Hello?'}, {'role': 'user', 'content': 'What was my Name?'}] + [ + { + "role": "user", + "content": "Hello", + }, + { + "role": "assistant", + "content": "Hello?", + }, + { + "role": "user", + "content": "What was my Name?", + }, + ] + ) + + assert messages == [ + {"role": "user", "content": "Hello"}, + {"role": "assistant", "content": "Hello?"}, + {"role": "user", "content": "What was my Name?"}, + ] assert len(messages) == 3 assert messages[0]["role"] == "user" assert messages[0]["content"] == "Hello"