Skip to content

Commit a77a282

Browse files
authored
feat(marketplace): ux improvements and per-file model checksums (#51)
1 parent e3f531c commit a77a282

File tree

18 files changed

+134
-34
lines changed

18 files changed

+134
-34
lines changed

apps/skit/src/marketplace.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ pub struct ModelSpec {
264264
pub source: ModelSource,
265265
pub expected_size_bytes: Option<u64>,
266266
pub sha256: Option<String>,
267+
#[serde(default)]
268+
pub file_checksums: HashMap<String, String>,
267269
pub license: Option<String>,
268270
pub license_url: Option<String>,
269271
#[serde(default)]

apps/skit/src/marketplace_installer.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,8 +1291,6 @@ impl PluginInstaller {
12911291
.into());
12921292
}
12931293
let revision = revision.as_deref().unwrap_or("main");
1294-
let expected_sha256 =
1295-
if files.len() == 1 { model.sha256.as_deref() } else { None };
12961294
for file in files {
12971295
if cancel.is_cancelled() {
12981296
return Err(InstallError::Cancelled);
@@ -1301,6 +1299,11 @@ impl PluginInstaller {
13011299
if !is_safe_relative_path(file_path) {
13021300
return Err(anyhow!("Invalid model file path '{file}'").into());
13031301
}
1302+
let expected_sha256 = model
1303+
.file_checksums
1304+
.get(file.as_str())
1305+
.map(String::as_str)
1306+
.or(if files.len() == 1 { model.sha256.as_deref() } else { None });
13041307
let target_path = self.models_dir.join(file_path);
13051308
let display_name = file.as_str();
13061309
let url = huggingface_model_url(repo_id, revision, file)?;
@@ -1970,6 +1973,7 @@ fn now_ms() -> u128 {
19701973
mod tests {
19711974
use super::*;
19721975
use anyhow::{anyhow, bail, Context, Result};
1976+
use std::collections::HashMap;
19731977
use std::sync::Arc;
19741978

19751979
use crate::plugins::UnifiedPluginManager;
@@ -2160,6 +2164,7 @@ mod tests {
21602164
source: crate::marketplace::ModelSource::Url { url: url.clone() },
21612165
expected_size_bytes: Some(payload.len() as u64),
21622166
sha256: Some(hash),
2167+
file_checksums: HashMap::new(),
21632168
license: None,
21642169
license_url: None,
21652170
gated: false,
@@ -2256,6 +2261,7 @@ mod tests {
22562261
source: crate::marketplace::ModelSource::Url { url: url.clone() },
22572262
expected_size_bytes: Some(payload.len() as u64),
22582263
sha256: Some(hash),
2264+
file_checksums: HashMap::new(),
22592265
license: None,
22602266
license_url: None,
22612267
gated: false,
@@ -2319,6 +2325,7 @@ mod tests {
23192325
},
23202326
expected_size_bytes: None,
23212327
sha256: None,
2328+
file_checksums: HashMap::new(),
23222329
license: None,
23232330
license_url: None,
23242331
gated: true,

dist/registry/plugins/helsinki/0.1.0/manifest.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@
2424
"files": [
2525
"opus-mt-en-es.tar.bz2"
2626
],
27-
"expected_size_bytes": 284844308,
27+
"expected_size_bytes": 297199216,
2828
"license": "Apache-2.0",
29-
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-en-es"
29+
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-en-es",
30+
"sha256": "6624ec0babce458c0771f493460e62f7e7dc6d4d832e56dbde1621444d4b37cf"
3031
},
3132
{
3233
"id": "opus-mt-es-en",
@@ -38,9 +39,10 @@
3839
"files": [
3940
"opus-mt-es-en.tar.bz2"
4041
],
41-
"expected_size_bytes": 285443600,
42+
"expected_size_bytes": 296814376,
4243
"license": "Apache-2.0",
43-
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-es-en"
44+
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-es-en",
45+
"sha256": "01a0ddd203b3343d02c013539d4d8f0dfcd747585c9b26f0c3f90f7a11d7cde9"
4446
}
4547
]
4648
}

dist/registry/plugins/matcha/0.1.0/manifest.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
"matcha-icefall-en_US-ljspeech/vocos-22khz-univ.onnx"
2727
],
2828
"expected_size_bytes": 130630855,
29+
"file_checksums": {
30+
"matcha-icefall-en_US-ljspeech.tar.bz2": "f7862f5d93b956561ee7aca86bf33504f47726c1d5a559066f3cef8fab6c3e23",
31+
"matcha-icefall-en_US-ljspeech/vocos-22khz-univ.onnx": "0574a135aa1db2de6e181050db2ec528496cacd4a4701fc5d7faf9f9804c0081"
32+
},
2933
"license": "CC-BY-4.0",
3034
"license_url": "https://keithito.com/LJ-Speech-Dataset/"
3135
}

dist/registry/plugins/nllb/0.1.0/manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
],
2727
"expected_size_bytes": 1135260128,
2828
"license": "CC-BY-NC-4.0",
29-
"license_url": "https://huggingface.co/facebook/nllb-200-distilled-600M"
29+
"license_url": "https://huggingface.co/facebook/nllb-200-distilled-600M",
30+
"sha256": "6c95a9bc42239a189c71d32aeb66b3108a4fef97d194e3360f3a749671a05c35"
3031
}
3132
]
3233
}

docs/public/registry/plugins/helsinki/0.1.0/manifest.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@
2424
"files": [
2525
"opus-mt-en-es.tar.bz2"
2626
],
27-
"expected_size_bytes": 284844308,
27+
"expected_size_bytes": 297199216,
2828
"license": "Apache-2.0",
29-
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-en-es"
29+
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-en-es",
30+
"sha256": "6624ec0babce458c0771f493460e62f7e7dc6d4d832e56dbde1621444d4b37cf"
3031
},
3132
{
3233
"id": "opus-mt-es-en",
@@ -38,9 +39,10 @@
3839
"files": [
3940
"opus-mt-es-en.tar.bz2"
4041
],
41-
"expected_size_bytes": 285443600,
42+
"expected_size_bytes": 296814376,
4243
"license": "Apache-2.0",
43-
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-es-en"
44+
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-es-en",
45+
"sha256": "01a0ddd203b3343d02c013539d4d8f0dfcd747585c9b26f0c3f90f7a11d7cde9"
4446
}
4547
]
4648
}

docs/public/registry/plugins/matcha/0.1.0/manifest.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
"matcha-icefall-en_US-ljspeech/vocos-22khz-univ.onnx"
2727
],
2828
"expected_size_bytes": 130630855,
29+
"file_checksums": {
30+
"matcha-icefall-en_US-ljspeech.tar.bz2": "f7862f5d93b956561ee7aca86bf33504f47726c1d5a559066f3cef8fab6c3e23",
31+
"matcha-icefall-en_US-ljspeech/vocos-22khz-univ.onnx": "0574a135aa1db2de6e181050db2ec528496cacd4a4701fc5d7faf9f9804c0081"
32+
},
2933
"license": "CC-BY-4.0",
3034
"license_url": "https://keithito.com/LJ-Speech-Dataset/"
3135
}

docs/public/registry/plugins/nllb/0.1.0/manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
],
2727
"expected_size_bytes": 1135260128,
2828
"license": "CC-BY-NC-4.0",
29-
"license_url": "https://huggingface.co/facebook/nllb-200-distilled-600M"
29+
"license_url": "https://huggingface.co/facebook/nllb-200-distilled-600M",
30+
"sha256": "6c95a9bc42239a189c71d32aeb66b3108a4fef97d194e3360f3a749671a05c35"
3031
}
3132
]
3233
}

marketplace/official-plugins.json

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
"files": [
2222
"opus-mt-en-es.tar.bz2"
2323
],
24-
"expected_size_bytes": 284844308,
24+
"expected_size_bytes": 297199216,
2525
"license": "Apache-2.0",
26-
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-en-es"
26+
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-en-es",
27+
"sha256": "6624ec0babce458c0771f493460e62f7e7dc6d4d832e56dbde1621444d4b37cf"
2728
},
2829
{
2930
"id": "opus-mt-es-en",
@@ -35,9 +36,10 @@
3536
"files": [
3637
"opus-mt-es-en.tar.bz2"
3738
],
38-
"expected_size_bytes": 285443600,
39+
"expected_size_bytes": 296814376,
3940
"license": "Apache-2.0",
40-
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-es-en"
41+
"license_url": "https://huggingface.co/Helsinki-NLP/opus-mt-es-en",
42+
"sha256": "01a0ddd203b3343d02c013539d4d8f0dfcd747585c9b26f0c3f90f7a11d7cde9"
4143
}
4244
]
4345
},
@@ -92,6 +94,10 @@
9294
"matcha-icefall-en_US-ljspeech/vocos-22khz-univ.onnx"
9395
],
9496
"expected_size_bytes": 130630855,
97+
"file_checksums": {
98+
"matcha-icefall-en_US-ljspeech.tar.bz2": "f7862f5d93b956561ee7aca86bf33504f47726c1d5a559066f3cef8fab6c3e23",
99+
"matcha-icefall-en_US-ljspeech/vocos-22khz-univ.onnx": "0574a135aa1db2de6e181050db2ec528496cacd4a4701fc5d7faf9f9804c0081"
100+
},
95101
"license": "CC-BY-4.0",
96102
"license_url": "https://keithito.com/LJ-Speech-Dataset/"
97103
}
@@ -120,7 +126,8 @@
120126
],
121127
"expected_size_bytes": 1135260128,
122128
"license": "CC-BY-NC-4.0",
123-
"license_url": "https://huggingface.co/facebook/nllb-200-distilled-600M"
129+
"license_url": "https://huggingface.co/facebook/nllb-200-distilled-600M",
130+
"sha256": "6c95a9bc42239a189c71d32aeb66b3108a4fef97d194e3360f3a749671a05c35"
124131
}
125132
]
126133
},

plugins/native/helsinki/plugin.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ models:
1616
revision: main
1717
files:
1818
- opus-mt-en-es.tar.bz2
19-
expected_size_bytes: 284844308
19+
expected_size_bytes: 297199216
2020
license: Apache-2.0
2121
license_url: https://huggingface.co/Helsinki-NLP/opus-mt-en-es
22+
sha256: 6624ec0babce458c0771f493460e62f7e7dc6d4d832e56dbde1621444d4b37cf
2223
- id: opus-mt-es-en
2324
name: OPUS-MT es-en
2425
default: false
@@ -27,6 +28,7 @@ models:
2728
revision: main
2829
files:
2930
- opus-mt-es-en.tar.bz2
30-
expected_size_bytes: 285443600
31+
expected_size_bytes: 296814376
3132
license: Apache-2.0
3233
license_url: https://huggingface.co/Helsinki-NLP/opus-mt-es-en
34+
sha256: 01a0ddd203b3343d02c013539d4d8f0dfcd747585c9b26f0c3f90f7a11d7cde9

0 commit comments

Comments
 (0)