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 uri = Uri.parse('$_baseUrl/models/$model:streamGenerateContent')
.replace(queryParameters: {'alt': 'sse'});
final body = jsonEncode(_buildPayload(request));
final byteStream = await openSsePost(
uri: uri,
headers: {
..._authHeaders(apiKey),
'Content-Type': 'application/json',
'Accept': 'text/event-stream',
},
body: body,
providerLabel: 'Gemini',
client: _http,
);
await for (final event in decodeSseStream(byteStream)) {
if (event.data.isEmpty) continue;
final json = jsonDecode(event.data) as Map<String, Object?>;
final text = _extractText(json, allowEmpty: true);
if (text.isNotEmpty) yield text;
}
}