streamChatCompletion method

  1. @override
Stream<ChatCompletionStreamResponse> streamChatCompletion({
  1. required List<ChatMessage> messages,
  2. required ChatCompletionRequest options,
})
override

Implementation

@override
Stream<ChatCompletionStreamResponse> streamChatCompletion({required List<ChatMessage> messages, required ChatCompletionRequest options}) async* {
  final generationConfig = _generationConfig(options);

  final systemMessage = messages.where((message) => message.role == MessageRole.system).firstOrNull?.content;
  final ai = _firebaseAI.generativeModel(
      model: options.model,
      systemInstruction: systemMessage != null ? Content.system(systemMessage) : null,
      generationConfig: generationConfig
  );

  final conversationMessages = messages.where((message) => message.role != MessageRole.system)
      .map((message) => Content(message.role == MessageRole.assistant ? 'model' : 'user', [TextPart(message.content)]))
      .toList();

  try {
    final stream = ai.generateContentStream(conversationMessages);

    await for (final response in stream) {
      if (response.candidates.isEmpty) continue;

      final candidate = response.candidates.first;
      final text = candidate.content.parts
          .whereType<TextPart>()
          .map((p) => p.text)
          .join();
      final isComplete = candidate.finishReason != null;

      if (text.isNotEmpty) {
        yield ChatCompletionStreamResponse(
          content: text,
          isComplete: isComplete,
          model: options.model,
          provider: providerName,
        );
      }

      if (isComplete) break;
    }
  } catch (e) {
    if (e is AIException) rethrow;
    throw AINetworkException(e.toString(), provider: providerName);
  }
}