1717use Prism \Prism \Streaming \Events \CitationEvent ;
1818use Prism \Prism \Streaming \Events \ErrorEvent ;
1919use Prism \Prism \Streaming \Events \ProviderToolEvent ;
20+ use Prism \Prism \Streaming \Events \StepFinishEvent ;
21+ use Prism \Prism \Streaming \Events \StepStartEvent ;
2022use Prism \Prism \Streaming \Events \StreamEndEvent ;
2123use Prism \Prism \Streaming \Events \StreamEvent ;
2224use Prism \Prism \Streaming \Events \StreamStartEvent ;
@@ -77,18 +79,28 @@ protected function processStream(Response $response, Request $request, int $dept
7779 $ streamEvent = $ this ->processEvent ($ event );
7880
7981 if ($ streamEvent instanceof Generator) {
80- yield from $ streamEvent ;
82+ foreach ($ streamEvent as $ event ) {
83+ yield $ event ;
84+ }
8185 } elseif ($ streamEvent instanceof StreamEvent) {
8286 yield $ streamEvent ;
8387 }
8488 }
8589
8690 if ($ this ->state ->hasToolCalls ()) {
87- yield from $ this ->handleToolCalls ($ request , $ depth );
91+ foreach ($ this ->handleToolCalls ($ request , $ depth ) as $ item ) {
92+ yield $ item ;
93+ }
8894
8995 return ;
9096 }
9197
98+ $ this ->state ->markStepFinished ();
99+ yield new StepFinishEvent (
100+ id: EventID::generate (),
101+ timestamp: time ()
102+ );
103+
92104 yield $ this ->emitStreamEndEvent ();
93105 }
94106
@@ -113,8 +125,9 @@ protected function processEvent(array $event): StreamEvent|Generator|null
113125
114126 /**
115127 * @param array<string, mixed> $event
128+ * @return Generator<StreamEvent>
116129 */
117- protected function handleMessageStart (array $ event ): ? StreamStartEvent
130+ protected function handleMessageStart (array $ event ): Generator
118131 {
119132 $ message = $ event ['message ' ] ?? [];
120133 $ this ->state ->withMessageId ($ message ['id ' ] ?? EventID::generate ());
@@ -130,18 +143,25 @@ protected function handleMessageStart(array $event): ?StreamStartEvent
130143 }
131144
132145 // Only emit StreamStartEvent once per streaming session
133- if (! $ this ->state ->shouldEmitStreamStart ()) {
134- return null ;
146+ if ($ this ->state ->shouldEmitStreamStart ()) {
147+ $ this ->state ->markStreamStarted ();
148+
149+ yield new StreamStartEvent (
150+ id: EventID::generate (),
151+ timestamp: time (),
152+ model: $ message ['model ' ] ?? 'unknown ' ,
153+ provider: 'anthropic '
154+ );
135155 }
136156
137- $ this ->state ->markStreamStarted ();
157+ if ($ this ->state ->shouldEmitStepStart ()) {
158+ $ this ->state ->markStepStarted ();
138159
139- return new StreamStartEvent (
140- id: EventID::generate (),
141- timestamp: time (),
142- model: $ message ['model ' ] ?? 'unknown ' ,
143- provider: 'anthropic '
144- );
160+ yield new StepStartEvent (
161+ id: EventID::generate (),
162+ timestamp: time ()
163+ );
164+ }
145165 }
146166
147167 /**
@@ -526,6 +546,13 @@ protected function handleToolCalls(Request $request, int $depth): Generator
526546
527547 $ request ->addMessage (new ToolResultMessage ($ toolResults ));
528548
549+ // Emit step finish after tool calls
550+ $ this ->state ->markStepFinished ();
551+ yield new StepFinishEvent (
552+ id: EventID::generate (),
553+ timestamp: time ()
554+ );
555+
529556 // Continue streaming if within step limit
530557 $ depth ++;
531558 if ($ depth < $ request ->maxSteps ()) {
0 commit comments