completion method

Future<CactusCompletionResult> completion(
  1. CactusCompletionParams params, {
  2. List<String> mediaPaths = const [],
})

Implementation

Future<CactusCompletionResult> completion(CactusCompletionParams params, {List<String> mediaPaths = const []}) async {
  _checkDisposed();
  final replyPort = ReceivePort();
  final completer = Completer<CactusCompletionResult>();

  final startTime = DateTime.now();
  DateTime? firstTokenTime;

  replyPort.listen((message) {
    if (message is String && params.onNewToken != null) {
      firstTokenTime ??= DateTime.now();
      params.onNewToken!(message);
    } else if (message is Map) {
      message['error'] != null ? completer.completeError(message['error']) : completer.complete(message['result']);
      replyPort.close();
    }
  });

  _isolateSendPort!.send(['completion', _SendableCompletionParams.fromOriginal(params), mediaPaths, replyPort.sendPort]);
  try{
    final result = await completer.future;
    final endTime = DateTime.now();
    final totalTime = endTime.difference(startTime).inMilliseconds;
    final tokPerSec = totalTime > 0 ? (result.tokensPredicted * 1000.0) / totalTime : null;
    final ttft = firstTokenTime?.difference(startTime).inMilliseconds;
    CactusTelemetry.track({
      'event': 'completion',
      'tok_per_sec': tokPerSec,
      'toks_generated': result.tokensPredicted,
      'ttft': ttft,
      'num_images': mediaPaths.length,
    }, initParams);
    return result;
  } catch (e) {
    CactusTelemetry.error(e, initParams);
    rethrow;
  }
}