sendMessageStream method

  1. @override
Stream<String> sendMessageStream({
  1. required String message,
  2. List<ChatMessage> conversationHistory = const [],
  3. Map<String, dynamic>? options,
})
override

Send a message and get a streaming response

Implementation

@override
Stream<String> sendMessageStream({
  required String message,
  List<ChatMessage> conversationHistory = const [],
  Map<String, dynamic>? options,
}) async* {
  final contents = _prepareContents(message, conversationHistory);

  final request = http.Request('POST', Uri.parse(_streamUrl));
  request.headers.addAll({'Content-Type': 'application/json'});
  request.body = jsonEncode({
    'contents': contents,
    'generationConfig': {
      'temperature': options?['temperature'] ?? temperature,
      'maxOutputTokens': options?['maxTokens'] ?? maxTokens,
    },
  });

  final response = await request.send();
  final stream = response.stream.transform(utf8.decoder);

  String fullResponse = '';
  await for (var chunk in stream) {
    final lines = chunk.split('\n');
    for (var line in lines) {
      if (line.isNotEmpty && line.trim().isNotEmpty) {
        try {
          final data = jsonDecode(line);
          final content = data['candidates'][0]['content']['parts'][0]['text'];
          if (content != null) {
            fullResponse += content;
            yield content;
          }
        } catch (e) {
          // Skip invalid JSON
        }
      }
    }
  }

  _conversationHistory.add({'role': 'user', 'content': message});
  _conversationHistory.add({'role': 'model', 'content': fullResponse});
}