| 25 | |
| 26 | return new ReadableStream({ |
| 27 | async start(controller) { |
| 28 | try { |
| 29 | for await (const event of anthropicStream) { |
| 30 | if (event.type === 'message_start') { |
| 31 | const startEvent = event as RawMessageStartEvent |
| 32 | const usage: Usage = startEvent.message.usage |
| 33 | inputTokens = usage.input_tokens |
| 34 | } else if (event.type === 'message_delta') { |
| 35 | const deltaEvent = event as RawMessageDeltaEvent |
| 36 | outputTokens = deltaEvent.usage.output_tokens |
| 37 | } else if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') { |
| 38 | const text = event.delta.text |
| 39 | fullContent += text |
| 40 | controller.enqueue(new TextEncoder().encode(text)) |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | if (onComplete) { |
| 45 | onComplete(fullContent, { input_tokens: inputTokens, output_tokens: outputTokens }) |
| 46 | } |
| 47 | |
| 48 | controller.close() |
| 49 | } catch (err) { |
| 50 | controller.error(err) |
| 51 | } |
| 52 | }, |
| 53 | }) |
| 54 | } |
| 55 | |