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 body = _body(messages: messages, options: options)
    ..['stream'] = true;

  try {
    final request = http.Request('POST', Uri.parse('$_baseUrl/chat/completions'))
      ..headers.addAll(_headers())
      ..body = jsonEncode(body);

    final streamedResponse = await _client.send(request).timeout(config.timeout);

    if (streamedResponse.statusCode != 200) {
      final errorBody = await streamedResponse.stream.bytesToString();
      throw AIException(
        'Stream request failed: $errorBody',
        provider: providerName,
        statusCode: streamedResponse.statusCode,
      );
    }

    await for (final chunk in streamedResponse.stream.transform(utf8.decoder)) {
      for (final line in chunk.split('\n')) {
        if (line.trim().isEmpty) continue;
        final streamResponse = ChatCompletionStreamResponse.parseSseLine(
          line,
          provider: providerName,
        );
        if (streamResponse.content.isNotEmpty) {
          yield streamResponse;
        }
        if (streamResponse.isComplete) break;
      }
    }
  } on TimeoutException {
    throw AINetworkException(
      'Stream request timed out',
      provider: providerName,
    );
  } catch (e) {
    if (e is AIException) rethrow;
    throw AINetworkException(e.toString(), provider: providerName);
  }
}