downloadModelWithProgress method
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}');
}