@@ -267,3 +267,106 @@ def test_text_content_truncation_exact_limit():
267267 # Check that text was not truncated
268268 assert len (result ) == 1
269269 assert result [0 ]["text" ] == exact_text
270+
271+
272+ def test_message_with_reasoning_content_when_enabled ():
273+ """Test that reasoning_content is included when send_reasoning_content is True."""
274+ from openhands .sdk .llm .message import Message , TextContent
275+
276+ message = Message (
277+ role = "assistant" ,
278+ content = [TextContent (text = "Final answer" )],
279+ reasoning_content = "Let me think step by step..." ,
280+ send_reasoning_content = True ,
281+ )
282+
283+ result = message .to_chat_dict ()
284+ assert result ["role" ] == "assistant"
285+ assert result ["content" ] == "Final answer"
286+ assert result ["reasoning_content" ] == "Let me think step by step..."
287+
288+
289+ def test_message_with_reasoning_content_when_disabled ():
290+ """Test that reasoning_content is NOT included when send_reasoning_content is False.""" # noqa: E501
291+ from openhands .sdk .llm .message import Message , TextContent
292+
293+ message = Message (
294+ role = "assistant" ,
295+ content = [TextContent (text = "Final answer" )],
296+ reasoning_content = "Let me think step by step..." ,
297+ send_reasoning_content = False ,
298+ )
299+
300+ result = message .to_chat_dict ()
301+ assert result ["role" ] == "assistant"
302+ assert result ["content" ] == "Final answer"
303+ assert "reasoning_content" not in result
304+
305+
306+ def test_message_with_reasoning_content_default_disabled ():
307+ """Test that reasoning_content is NOT included by default."""
308+ from openhands .sdk .llm .message import Message , TextContent
309+
310+ message = Message (
311+ role = "assistant" ,
312+ content = [TextContent (text = "Final answer" )],
313+ reasoning_content = "Let me think step by step..." ,
314+ )
315+
316+ result = message .to_chat_dict ()
317+ assert result ["role" ] == "assistant"
318+ assert result ["content" ] == "Final answer"
319+ assert "reasoning_content" not in result
320+
321+
322+ def test_message_with_reasoning_content_none ():
323+ """Test that reasoning_content is NOT included when it's None even if enabled."""
324+ from openhands .sdk .llm .message import Message , TextContent
325+
326+ message = Message (
327+ role = "assistant" ,
328+ content = [TextContent (text = "Final answer" )],
329+ reasoning_content = None ,
330+ send_reasoning_content = True ,
331+ )
332+
333+ result = message .to_chat_dict ()
334+ assert result ["role" ] == "assistant"
335+ assert result ["content" ] == "Final answer"
336+ assert "reasoning_content" not in result
337+
338+
339+ def test_message_with_reasoning_content_empty_string ():
340+ """Test that reasoning_content is NOT included when it's an empty string."""
341+ from openhands .sdk .llm .message import Message , TextContent
342+
343+ message = Message (
344+ role = "assistant" ,
345+ content = [TextContent (text = "Final answer" )],
346+ reasoning_content = "" ,
347+ send_reasoning_content = True ,
348+ )
349+
350+ result = message .to_chat_dict ()
351+ assert result ["role" ] == "assistant"
352+ assert result ["content" ] == "Final answer"
353+ assert "reasoning_content" not in result
354+
355+
356+ def test_message_with_reasoning_content_list_serializer ():
357+ """Test that reasoning_content works with list serializer."""
358+ from openhands .sdk .llm .message import Message , TextContent
359+
360+ message = Message (
361+ role = "assistant" ,
362+ content = [TextContent (text = "Final answer" )],
363+ reasoning_content = "Step by step reasoning" ,
364+ send_reasoning_content = True ,
365+ function_calling_enabled = True , # Forces list serializer
366+ )
367+
368+ result = message .to_chat_dict ()
369+ assert result ["role" ] == "assistant"
370+ assert isinstance (result ["content" ], list )
371+ assert result ["content" ][0 ]["text" ] == "Final answer"
372+ assert result ["reasoning_content" ] == "Step by step reasoning"
0 commit comments