streamChatCompletion method
Stream<ChatCompletionStreamResponse>
streamChatCompletion({
- required List<
ChatMessage> messages, - 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);
}
}