22
33from agentex .lib .core .harness .emitter import UnifiedEmitter
44from agentex .lib .core .harness .types import TurnUsage
5- from agentex .types .task_message_update import StreamTaskMessageStart , StreamTaskMessageDone
5+ from agentex .types .task_message import TaskMessage
6+ from agentex .types .task_message_delta import TextDelta
7+ from agentex .types .task_message_update import (
8+ StreamTaskMessageDelta ,
9+ StreamTaskMessageDone ,
10+ StreamTaskMessageStart ,
11+ )
612from agentex .types .text_content import TextContent
713
814
@@ -14,6 +20,42 @@ async def end_span(self, **kw):
1420 pass
1521
1622
23+ class _FakeCtx :
24+ """Minimal StreamingTaskMessageContext fake (see test_auto_send.py)."""
25+
26+ def __init__ (self , sink , content_type , initial_content ):
27+ self .sink = sink
28+ self .content_type = content_type
29+ self .task_message = TaskMessage (id = "msg-1" , task_id = "task1" , content = initial_content )
30+
31+ async def __aenter__ (self ):
32+ self .sink .append (("open" , self .content_type ))
33+ return self
34+
35+ async def __aexit__ (self , * a ):
36+ await self .close ()
37+ return False
38+
39+ async def close (self ):
40+ self .sink .append (("close" , self .content_type ))
41+
42+ async def stream_update (self , update ):
43+ self .sink .append (("update" , update ))
44+ return update
45+
46+
47+ class _FakeStreaming :
48+ def __init__ (self ):
49+ self .sink = []
50+
51+ def streaming_task_message_context (
52+ self , task_id , initial_content , streaming_mode = "coalesced" , created_at = None
53+ ):
54+ ctype = getattr (initial_content , "type" , None )
55+ self .sink .append (("ctx" , ctype ))
56+ return _FakeCtx (self .sink , ctype , initial_content )
57+
58+
1759class _Turn :
1860 def __init__ (self , events_list , usage ):
1961 self ._events_list = events_list
@@ -54,3 +96,21 @@ async def test_emitter_tracing_default_on_when_trace_id_present():
5496async def test_emitter_tracing_overridable_off ():
5597 emitter = UnifiedEmitter (task_id = "t" , trace_id = "trace1" , parent_span_id = "p" , tracer = False )
5698 assert emitter .tracer is None
99+
100+
101+ @pytest .mark .asyncio
102+ async def test_emitter_auto_send_turn_returns_usage ():
103+ usage = TurnUsage (model = "m" , input_tokens = 5 )
104+ events = [
105+ StreamTaskMessageStart (type = "start" , index = 0 ,
106+ content = TextContent (type = "text" , author = "agent" , content = "" )),
107+ StreamTaskMessageDelta (type = "delta" , index = 0 ,
108+ delta = TextDelta (type = "text" , text_delta = "Hello" )),
109+ StreamTaskMessageDone (type = "done" , index = 0 ),
110+ ]
111+ turn = _Turn (events , usage )
112+ fake = _FakeStreaming ()
113+ emitter = UnifiedEmitter (task_id = "t" , trace_id = None , parent_span_id = None , streaming = fake )
114+ result = await emitter .auto_send_turn (turn )
115+ assert result .usage == usage
116+ assert result .final_text == "Hello"
0 commit comments