|
11 | 11 | import uuid |
12 | 12 | from unittest import mock |
13 | 13 |
|
| 14 | +import pytest |
14 | 15 | from langchain_core.messages import AIMessage, HumanMessage |
15 | 16 | from langchain_core.outputs import ChatGeneration, LLMResult |
16 | 17 |
|
|
22 | 23 | make_last_output_message, |
23 | 24 | make_output_message, |
24 | 25 | serialize, |
| 26 | + to_input_messages, |
25 | 27 | to_output_messages, |
26 | 28 | ) |
27 | 29 | from opentelemetry.util.genai.invocation import ( |
@@ -650,6 +652,64 @@ def test_messages_key_takes_priority_over_other_fields(self): |
650 | 652 | assert len(result) == 1 |
651 | 653 | assert result[0].parts[0].content == "hello" |
652 | 654 |
|
| 655 | + def test_messages_key_converts_raw_role_content_tuples(self): |
| 656 | + result = make_input_message( |
| 657 | + {"messages": [("human", "Hello"), HumanMessage(content="Hi")]} |
| 658 | + ) |
| 659 | + |
| 660 | + assert len(result) == 2 |
| 661 | + assert result[0].role == "user" |
| 662 | + assert result[0].parts[0].content == "Hello" |
| 663 | + assert result[1].parts[0].content == "Hi" |
| 664 | + |
| 665 | + def test_messages_key_converts_role_content_dicts(self): |
| 666 | + result = make_input_message( |
| 667 | + {"messages": [{"role": "user", "content": "Hello"}]} |
| 668 | + ) |
| 669 | + |
| 670 | + assert len(result) == 1 |
| 671 | + assert result[0].role == "user" |
| 672 | + assert result[0].parts[0].content == "Hello" |
| 673 | + |
| 674 | + @pytest.mark.parametrize( |
| 675 | + "bad_entry", |
| 676 | + [ |
| 677 | + ("human",), # too few items for (role, content) |
| 678 | + ("human", "hi", "extra"), # too many items |
| 679 | + ("not_a_real_role", "hi"), # unknown role string |
| 680 | + {"content": "no role key"}, # dict missing role |
| 681 | + {"role": "user"}, # dict missing content |
| 682 | + None, # not a message at all |
| 683 | + 42, # not a message at all |
| 684 | + object(), # arbitrary object |
| 685 | + ], |
| 686 | + ) |
| 687 | + def test_messages_key_malformed_entry_does_not_raise(self, bad_entry): |
| 688 | + result = make_input_message( |
| 689 | + {"messages": [bad_entry, HumanMessage(content="Hi")]} |
| 690 | + ) |
| 691 | + |
| 692 | + assert len(result) == 1 |
| 693 | + assert result[0].parts[0].content == "Hi" |
| 694 | + |
| 695 | + def test_messages_key_all_malformed_returns_empty_without_raising(self): |
| 696 | + result = make_input_message( |
| 697 | + {"messages": [("human",), None, {"content": "x"}]} |
| 698 | + ) |
| 699 | + |
| 700 | + assert result == [] |
| 701 | + |
| 702 | + def test_to_input_messages_never_raises_on_mixed_bad_input(self): |
| 703 | + result = to_input_messages( |
| 704 | + [object(), ("bad", "role", "shape"), HumanMessage(content="ok")] |
| 705 | + ) |
| 706 | + |
| 707 | + assert len(result) == 1 |
| 708 | + assert result[0].parts[0].content == "ok" |
| 709 | + |
| 710 | + def test_to_input_messages_empty_iterable_returns_empty(self): |
| 711 | + assert to_input_messages([]) == [] |
| 712 | + |
653 | 713 | def test_fallback_serializes_non_message_state_fields(self): |
654 | 714 | result = make_input_message({"user_query": "what is 2+2?"}) |
655 | 715 |
|
|
0 commit comments