@@ -337,15 +337,15 @@ async def test_create_message_tool_result_validation():
337337 )
338338
339339 # Case 2: tool_result without previous message
340- with pytest .raises (ValueError , match = "not matching any tool_use " ):
340+ with pytest .raises (ValueError , match = "requires a previous message " ):
341341 await session .create_message (
342342 messages = [types .SamplingMessage (role = "user" , content = tool_result )],
343343 max_tokens = 100 ,
344344 tools = [tool ],
345345 )
346346
347347 # Case 3: tool_result without previous tool_use
348- with pytest .raises (ValueError , match = "not matching any tool_use" ):
348+ with pytest .raises (ValueError , match = "do not match any tool_use" ):
349349 await session .create_message (
350350 messages = [
351351 types .SamplingMessage (role = "user" , content = text ),
@@ -371,8 +371,10 @@ async def test_create_message_tool_result_validation():
371371 )
372372
373373 # Case 5: text-only message with tools (no tool_results) - passes validation
374- # This covers branch 261->266 (has_tool_results=False) and 266->272
375- # We use move_on_after since send_request will block waiting for response
374+ # Covers has_tool_results=False branch.
375+ # We use move_on_after because validation happens synchronously before
376+ # send_request, which would block indefinitely waiting for a response.
377+ # The timeout lets validation pass, then cancels the blocked send.
376378 with anyio .move_on_after (0.01 ):
377379 await session .create_message (
378380 messages = [types .SamplingMessage (role = "user" , content = text )],
@@ -381,7 +383,8 @@ async def test_create_message_tool_result_validation():
381383 )
382384
383385 # Case 6: valid matching tool_result/tool_use IDs - passes validation
384- # This covers branch 269->272 (IDs match, no error raised)
386+ # Covers tool_use_ids == tool_result_ids branch.
387+ # (see Case 5 comment for move_on_after explanation)
385388 with anyio .move_on_after (0.01 ):
386389 await session .create_message (
387390 messages = [
@@ -393,6 +396,18 @@ async def test_create_message_tool_result_validation():
393396 tools = [tool ],
394397 )
395398
399+ # Case 7: validation runs even without `tools` parameter
400+ # (tool loop continuation may omit tools while containing tool_result)
401+ with pytest .raises (ValueError , match = "do not match any tool_use" ):
402+ await session .create_message (
403+ messages = [
404+ types .SamplingMessage (role = "user" , content = text ),
405+ types .SamplingMessage (role = "user" , content = tool_result ),
406+ ],
407+ max_tokens = 100 ,
408+ # Note: no tools parameter
409+ )
410+
396411
397412@pytest .mark .anyio
398413async def test_create_message_without_tools_capability ():
0 commit comments