stream method
Stream<String>
stream({
- required String apiKey,
- required String model,
- required ChatRequest request,
override
Token-streaming chat. Each event is an incremental delta — concatenating every event yields the same string chat would return. Closes the stream cleanly on end-of-message; errors are surfaced via the stream.
Implementation
@override
Stream<String> stream({
required String apiKey,
required String model,
required ChatRequest request,
}) async* {
final body = jsonEncode(_buildPayload(model, request, stream: true));
final byteStream = await openSsePost(
uri: Uri.parse('$_baseUrl/chat/completions'),
headers: {
'Authorization': 'Bearer $apiKey',
'Content-Type': 'application/json',
'Accept': 'text/event-stream',
},
body: body,
providerLabel: 'OpenAI',
client: _http,
);
await for (final event in decodeSseStream(byteStream)) {
final data = event.data;
if (data == '[DONE]') return;
if (data.isEmpty) continue;
final json = jsonDecode(data) as Map<String, Object?>;
final choices = json['choices'] as List<Object?>? ?? const [];
if (choices.isEmpty) continue;
final delta = (choices.first as Map<String, Object?>)['delta']
as Map<String, Object?>?;
final content = delta?['content'] as String?;
if (content != null && content.isNotEmpty) yield content;
}
}