1313from typing import Any
1414
1515import pytest
16- from agent_framework import Message
16+ from agent_framework import Content , Message
1717from holiday_peak_lib .agents .base_agent import AgentDependencies , BaseRetailAgent
1818from holiday_peak_lib .agents .hosted import (
1919 _extract_text_from_handle_result ,
@@ -35,14 +35,87 @@ async def handle(self, request: dict[str, Any]) -> dict[str, Any]:
3535 return self .next_response
3636
3737
38+ class _MessageLike :
39+ def __init__ (
40+ self ,
41+ * ,
42+ role : str | None = "user" ,
43+ contents : list [Any ] | None = None ,
44+ content : Any = None ,
45+ text : str | None = None ,
46+ input_value : Any = None ,
47+ ) -> None :
48+ self .role = role
49+ self .contents = contents
50+ self .content = content
51+ self .text = text
52+ self .input = input_value
53+
54+
3855def test_extract_user_text_pulls_last_text_message () -> None :
3956 msgs = [
40- Message (role = "user" , contents = ["earlier" ]),
41- Message (role = "user" , contents = ["latest input text" ]),
57+ Message (role = "user" , contents = [Content (type = "text" , text = "earlier" )]),
58+ Message (
59+ role = "user" ,
60+ contents = [Content (type = "text" , text = "latest input text" )],
61+ ),
4262 ]
4363 assert _extract_user_text (msgs ) == "latest input text"
4464
4565
66+ @pytest .mark .parametrize (
67+ ("message" , "expected" ),
68+ [
69+ (_MessageLike (content = "plain object content" ), "plain object content" ),
70+ (
71+ _MessageLike (content = [{"type" : "input_text" , "text" : "object part" }]),
72+ "object part" ,
73+ ),
74+ ({"role" : "user" , "content" : "plain dict content" }, "plain dict content" ),
75+ (
76+ {"role" : "user" , "content" : [{"type" : "input_text" , "text" : "dict part" }]},
77+ "dict part" ,
78+ ),
79+ (_MessageLike (role = None , text = "object direct text" ), "object direct text" ),
80+ ({"text" : "dict direct text" }, "dict direct text" ),
81+ ({"input" : "direct input text" }, "direct input text" ),
82+ (
83+ {
84+ "input" : [
85+ {"role" : "user" , "content" : "earlier nested input" },
86+ {
87+ "role" : "user" ,
88+ "content" : [{"type" : "input_text" , "text" : "latest nested input" }],
89+ },
90+ ]
91+ },
92+ "latest nested input" ,
93+ ),
94+ ],
95+ )
96+ def test_extract_user_text_handles_common_maf_and_openai_shapes (
97+ message : Any , expected : str
98+ ) -> None :
99+ assert _extract_user_text (message ) == expected
100+
101+
102+ def test_extract_user_text_prefers_most_recent_user_message () -> None :
103+ messages = [
104+ {"role" : "user" , "content" : "older user text" },
105+ {"role" : "assistant" , "content" : "assistant text should be ignored" },
106+ {"role" : "user" , "content" : "latest user text" },
107+ ]
108+ assert _extract_user_text (messages ) == "latest user text"
109+
110+
111+ def test_extract_user_text_skips_later_non_user_messages () -> None :
112+ messages = [
113+ {"role" : "user" , "content" : "latest user text" },
114+ {"role" : "assistant" , "content" : "assistant text should be ignored" },
115+ ]
116+ assert _extract_user_text (messages ) == "latest user text"
117+
118+
46119def test_extract_user_text_handles_empty_inputs () -> None :
47120 assert _extract_user_text (None ) == ""
48121 assert _extract_user_text ([]) == ""
0 commit comments