download method

Future<bool> download({
  1. required String modelUrl,
  2. required String mmprojUrl,
  3. String? modelFilename,
  4. String? mmprojFilename,
  5. CactusProgressCallback? onProgress,
})

Implementation

Future<bool> download({
  required String modelUrl,
  required String mmprojUrl,
  String? modelFilename,
  String? mmprojFilename,
  CactusProgressCallback? onProgress,
}) async {
  try {
    final actualModelFilename = modelFilename ?? modelUrl.split('/').last;
    final actualMmprojFilename = mmprojFilename ?? mmprojUrl.split('/').last;

    if (actualModelFilename.isEmpty || actualMmprojFilename.isEmpty) {
      throw ArgumentError('Cannot determine filenames from URLs and no filenames provided');
    }

    final downloadParams = CactusInitParams(
      modelUrl: modelUrl,
      modelFilename: actualModelFilename,
      mmprojUrl: mmprojUrl,
      mmprojFilename: actualMmprojFilename,
      onInitProgress: onProgress,
    );

    try {
      final tempContext = await CactusContext.init(downloadParams);
      tempContext.release();
      _lastDownloadedModelFilename = actualModelFilename;
      _lastDownloadedMmprojFilename = actualMmprojFilename;
      return true;
    } catch (e) {
      final appDocDir = await getApplicationDocumentsDirectory();
      final modelPath = '${appDocDir.path}/$actualModelFilename';
      final mmprojPath = '${appDocDir.path}/$actualMmprojFilename';
      final modelFile = File(modelPath);
      final mmprojFile = File(mmprojPath);

      if (await modelFile.exists() && await mmprojFile.exists()) {
        _lastDownloadedModelFilename = actualModelFilename;
        _lastDownloadedMmprojFilename = actualMmprojFilename;
        return true;
      }
      rethrow;
    }
  } catch (e) {
    if (onProgress != null) {
      onProgress(null, "Download failed: ${e.toString()}", true);
    }
    return false;
  }
}