Compare commits

...

2 Commits

Author SHA1 Message Date
openhands
352979578f Fix linting issues: Remove duplicate role key, add missing newline, apply ruff formatting 2024-11-21 01:58:23 +00:00
openhands
05ca829723 Fix KeyError when accessing content in messages with function calls
- Add test case to verify handling of messages without content
- Use dict.get() to safely access content key in messages
- Handle function call messages that don't include content
2024-11-21 01:45:48 +00:00
2 changed files with 43 additions and 4 deletions

View File

@@ -320,7 +320,8 @@ def convert_fncall_messages_to_non_fncall_messages(
converted_messages = []
first_user_message_encountered = False
for message in messages:
role, content = message['role'], message['content']
role = message['role']
content = message.get('content')
if content is None:
content = ''
@@ -573,8 +574,10 @@ def convert_non_fncall_messages_to_fncall_messages(
first_user_message_encountered = False
for message in messages:
role, content = message['role'], message['content']
content = content or '' # handle cases where content is None
role = message['role']
content = (
message.get('content') or ''
) # handle cases where content is None or missing
# For system messages, remove the added suffix
if role == 'system':
if isinstance(content, str):
@@ -759,7 +762,10 @@ def convert_from_multiple_tool_calls_to_single_tool_call_messages(
pending_tool_calls: dict[str, dict] = {}
for message in messages:
role, content = message['role'], message['content']
role = message['role']
content = message.get(
'content'
) # Don't set default here as we need to handle function calls
if role == 'assistant':
if message.get('tool_calls') and len(message['tool_calls']) > 1:
# handle multiple tool calls by breaking them into multiple messages

View File

@@ -0,0 +1,33 @@
from openhands.llm.fn_call_converter import (
convert_fncall_messages_to_non_fncall_messages,
)
def test_convert_fncall_messages_no_content():
"""Test that messages without content are handled correctly."""
messages = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': 'Hello!'},
{
'role': 'assistant',
'function_call': {'name': 'greet', 'arguments': '{}'},
'role': 'assistant',
}, # No content
]
tools = [
{
'type': 'function',
'function': {
'name': 'greet',
'description': 'Greet the user',
'parameters': {'type': 'object', 'properties': {}, 'required': []},
},
}
]
# This should not raise a KeyError
result = convert_fncall_messages_to_non_fncall_messages(
messages, tools, add_in_context_learning_example=False
)
assert isinstance(result, list)
assert len(result) == len(messages)