@@ -22,14 +22,17 @@ extension AnthropicClient {
2222
2323 let state = AnthropicStreamState ( )
2424
25- try await processSSEStream (
25+ let completed = try await processSSEStream (
2626 bytes: bytes,
2727 stallTimeout: retryPolicy. streamStallTimeout
2828 ) { event in
2929 try await self . handleSSEEvent (
3030 event, state: state, continuation: continuation
3131 )
3232 }
33+ guard completed else {
34+ throw AgentError . llmError ( . streamStalled)
35+ }
3336 continuation. finish ( )
3437 }
3538
@@ -54,14 +57,17 @@ extension AnthropicClient {
5457
5558 let state = AnthropicStreamState ( )
5659
57- try await processSSEStream (
60+ let completed = try await processSSEStream (
5861 bytes: bytes,
5962 stallTimeout: retryPolicy. streamStallTimeout
6063 ) { event in
6164 try await self . handleSSEEvent ( event, state: state) { delta in
6265 continuation. yield ( . delta( delta) )
6366 }
6467 }
68+ guard completed else {
69+ throw AgentError . llmError ( . streamStalled)
70+ }
6571
6672 if await state. isCompleted {
6773 let blocks = try await state. finalizedBlocks ( )
@@ -129,9 +135,10 @@ extension AnthropicClient {
129135 data: data, state: state, yield: yield
130136 )
131137 case . messageDelta:
132- try await handleMessageDelta ( data: data, state: state, yield : yield )
138+ try await handleMessageDelta ( data: data, state: state)
133139 case . messageStop:
134140 await state. markCompleted ( )
141+ await yield ( . finished( usage: state. finalUsage ( ) ) )
135142 return true
136143 case . error:
137144 try handleError ( data: data)
@@ -244,20 +251,10 @@ extension AnthropicClient {
244251
245252 private func handleMessageDelta(
246253 data: Data ,
247- state: AnthropicStreamState ,
248- yield: @Sendable ( StreamDelta ) -> Void
254+ state: AnthropicStreamState
249255 ) async throws {
250256 let event = try decodeEvent ( AnthropicMessageDeltaEvent . self, from: data)
251- let outputTokens = event. usage? . outputTokens ?? 0
252- let inputUsage = await state. inputUsage
253-
254- let usage = TokenUsage (
255- input: inputUsage? . inputTokens ?? 0 ,
256- output: outputTokens,
257- cacheRead: inputUsage? . cacheReadInputTokens,
258- cacheWrite: inputUsage? . cacheCreationInputTokens
259- )
260- yield( . finished( usage: usage) )
257+ await state. setOutputTokens ( event. usage? . outputTokens ?? 0 )
261258 }
262259
263260 private func handleError( data: Data ) throws {
0 commit comments