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 ;
@@ -76,15 +78,19 @@ protected function processStream(Response $response, Request $request, int $dept
7678 $ streamEvent = $ this ->processEvent ($ event );
7779
7880 if ($ streamEvent instanceof Generator) {
79- yield from $ streamEvent ;
81+ foreach ($ streamEvent as $ event ) {
82+ yield $ event ;
83+ }
8084 } elseif ($ streamEvent instanceof StreamEvent) {
8185 yield $ streamEvent ;
8286 }
8387 }
8488
8589 // Handle tool calls if present
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 }
9096
@@ -109,8 +115,9 @@ protected function processEvent(array $event): StreamEvent|Generator|null
109115
110116 /**
111117 * @param array<string, mixed> $event
118+ * @return Generator<StreamEvent>
112119 */
113- protected function handleMessageStart (array $ event ): StreamStartEvent
120+ protected function handleMessageStart (array $ event ): Generator
114121 {
115122 $ message = $ event ['message ' ] ?? [];
116123 $ this ->state ->withMessageId ($ message ['id ' ] ?? EventID::generate ());
@@ -126,12 +133,21 @@ protected function handleMessageStart(array $event): StreamStartEvent
126133 ));
127134 }
128135
129- return new StreamStartEvent (
136+ yield new StreamStartEvent (
130137 id: EventID::generate (),
131138 timestamp: time (),
132139 model: $ message ['model ' ] ?? 'unknown ' ,
133140 provider: 'anthropic '
134141 );
142+
143+ if ($ this ->state ->shouldEmitStepStart ()) {
144+ $ this ->state ->markStepStarted ();
145+
146+ yield new StepStartEvent (
147+ id: EventID::generate (),
148+ timestamp: time ()
149+ );
150+ }
135151 }
136152
137153 /**
@@ -228,10 +244,17 @@ protected function handleMessageDelta(array $event): null
228244
229245 /**
230246 * @param array<string, mixed> $event
247+ * @return Generator<StreamEvent>
231248 */
232- protected function handleMessageStop (array $ event ): StreamEndEvent
249+ protected function handleMessageStop (array $ event ): Generator
233250 {
234- return new StreamEndEvent (
251+ $ this ->state ->markStepFinished ();
252+ yield new StepFinishEvent (
253+ id: EventID::generate (),
254+ timestamp: time ()
255+ );
256+
257+ yield new StreamEndEvent (
235258 id: EventID::generate (),
236259 timestamp: time (),
237260 finishReason: FinishReason::Stop, // Default, will be updated by message_delta
@@ -492,6 +515,13 @@ protected function handleToolCalls(Request $request, int $depth): Generator
492515
493516 $ request ->addMessage (new ToolResultMessage ($ toolResults ));
494517
518+ // Emit step finish after tool calls
519+ $ this ->state ->markStepFinished ();
520+ yield new StepFinishEvent (
521+ id: EventID::generate (),
522+ timestamp: time ()
523+ );
524+
495525 // Continue streaming if within step limit
496526 $ depth ++;
497527 if ($ depth < $ request ->maxSteps ()) {
0 commit comments