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 messages = _prepareMessages(message, conversationHistory);

  final request = http.Request('POST', Uri.parse(baseUrl));
  request.headers.addAll({
    'Content-Type': 'application/json',
    'Authorization': 'Bearer $apiKey',
  });
  request.body = jsonEncode({
    'model': options?['model'] ?? model,
    'messages': messages,
    'temperature': options?['temperature'] ?? temperature,
    'max_tokens': options?['maxTokens'] ?? maxTokens,
    'stream': true,
  });

  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.startsWith('data: ') && line != 'data: [DONE]') {
        try {
          final data = jsonDecode(line.substring(6));
          final content = data['choices'][0]['delta']['content'];
          if (content != null) {
            fullResponse += content;
            yield content;
          }
        } catch (e) {
          // Skip invalid JSON
        }
      }
    }
  }

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