stream method

  1. @override
Stream<String> stream({
  1. required String apiKey,
  2. required String model,
  3. 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;
  }
}