downloadModelWithProgress method

  1. @override
Stream<DownloadProgress> downloadModelWithProgress(
  1. ModelSpec spec, {
  2. String? token,
})
override

Downloads a model with progress tracking

Implementation

@override
Stream<DownloadProgress> downloadModelWithProgress(ModelSpec spec, {String? token}) async* {
  await _ensureInitialized();

  final completer = _loadCompleters[spec.name];
  if (completer != null && !completer.isCompleted) {
    throw Exception('Model ${spec.name} is already loading');
  }

  debugPrint('WebModelManager: Starting download for ${spec.name}');

  // Set up the completer and paths
  _loadCompleters[spec.name] = Completer<bool>();

  if (spec is InferenceModelSpec) {
    _modelPaths[spec.name] = spec.modelUrl;
    if (spec.loraUrl != null) {
      _loraPaths[spec.name] = spec.loraUrl!;
    }
  } else if (spec is EmbeddingModelSpec) {
    _modelPaths[spec.name] = spec.modelUrl;
    // For embedding models, we could store tokenizer URL separately if needed
  }

  // Progressive download simulation that matches old behavior
  yield* Stream<int>.periodic(
    const Duration(milliseconds: 10),
    (count) => count + 1,
  ).take(100).map((progress) {
    if (progress == 100 && !_loadCompleters[spec.name]!.isCompleted) {
      _loadCompleters[spec.name]!.complete(true);
      _installedModels[spec.name] = true;
    }

    return DownloadProgress(
      currentFileIndex: 0,
      totalFiles: spec.files.length,
      currentFileProgress: progress,
      currentFileName: spec.files.isNotEmpty ? spec.files.first.filename : 'model.bin',
    );
  }).asBroadcastStream();

  debugPrint('WebModelManager: Download completed for ${spec.name}');
}