mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
Dépôts Hugging Face verrouillés : dit lesquels, et pourquoi le 401
Un dépôt « gated » (orcarouter/Qwen3.8-27B-Uncensored-GGUF, vécu) laisse lire son arborescence sans rien : Loki listait donc ses seize quantifications avec leur verdict mémoire, puis échouait sur « HTTP 401 depuis la source » au premier octet. Le message ne disait ni que le dépôt était verrouillé, ni qu'il fallait accepter ses conditions, ni où poser un jeton. - Le refus est maintenant traduit à partir de X-Error-Code (GatedRepo, RepoNotFound, EntryNotFound…) et nomme le dépôt, l'action à faire et l'état du jeton : absent (il en faut un) ou présent mais sans accès. 404, 416, 429 et les pannes de la source y gagnent aussi une phrase utile. - Le verrou se voit AVANT de choisir une quantification : la recherche demande `expand[]=gated` et la fiche du dépôt est lue à l'ouverture, d'où une pastille « accès restreint » dans la liste et un avertissement en toutes lettres au-dessus des fichiers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hz1QWmvZqW3t53YC5SJBKC
This commit is contained in:
9 files changed
+362
-6
No files matched your search
@@ -1480,6 +1480,10 @@ button:hover{border-color:var(--dim);color:var(--text)}
|
||||
.hf-fit.ok{color:var(--ok);border-color:var(--ok)}
|
||||
.hf-fit.juste{color:var(--warn);border-color:var(--warn)}
|
||||
.hf-fit.trop{color:var(--err);border-color:var(--err)}
|
||||
/* Verrou d'accès : ce n'est pas un verdict mémoire, mais ça se lit au même
|
||||
endroit et ça décide autant de la suite — un dépôt gated ne se télécharge
|
||||
pas sans jeton. */
|
||||
.hf-fit.gated{color:var(--warn);border-color:var(--warn);text-transform:none}
|
||||
.hf-head{display:flex;align-items:center;gap:10px;margin-top:6px;font-size:12px}
|
||||
.hf-mm{display:flex;align-items:center;gap:6px;margin-top:8px;font-size:11.5px;
|
||||
color:var(--dim);cursor:pointer}
|
||||
@@ -5272,11 +5276,29 @@ async function hfSearch(){
|
||||
const m = document.createElement('span'); m.className = 'hf-meta';
|
||||
m.textContent = fmtCount(rep.downloads)+' ↓';
|
||||
row.append(n, m);
|
||||
// Dépôt verrouillé : il se LIT sans rien, mais chaque .gguf répond 401 au
|
||||
// transfert. La pastille le dit dès la liste — sinon on choisit un quant,
|
||||
// on lance 15 Go et l'erreur tombe à la fin de la sonde.
|
||||
if(rep.gated){
|
||||
const g = document.createElement('span');
|
||||
g.className = 'hf-fit gated';
|
||||
g.textContent = 'accès restreint';
|
||||
g.title = hfGatedHint(r.hf_token);
|
||||
row.appendChild(g);
|
||||
}
|
||||
list.appendChild(row);
|
||||
}
|
||||
o.appendChild(list);
|
||||
}
|
||||
|
||||
// Le geste à faire n'est pas le même selon qu'un jeton est configuré ou non :
|
||||
// sans jeton il en faut un, avec jeton c'est l'accès au dépôt qui manque.
|
||||
function hfGatedHint(hasToken){
|
||||
return hasToken
|
||||
? 'Dépôt à accès restreint : le jeton HF_TOKEN sera utilisé. Si le téléchargement échoue en 401, accepte les conditions du dépôt sur huggingface.co avec le compte de ce jeton.'
|
||||
: 'Dépôt à accès restreint : accepte ses conditions sur huggingface.co, puis renseigne la variable d’environnement HF_TOKEN. Sans jeton, le téléchargement échouera en 401.';
|
||||
}
|
||||
|
||||
// Millions/milliers abrégés : un dépôt à 1 945 635 téléchargements dit surtout
|
||||
// « celui-là est le plus utilisé », pas son compte exact.
|
||||
function fmtCount(n){
|
||||
@@ -5304,8 +5326,23 @@ async function hfPickRepo(repo){
|
||||
back.onclick = hfSearch;
|
||||
const title = document.createElement('span'); title.className = 'hf-name'; title.textContent = repo;
|
||||
head.append(back, title);
|
||||
if(r.gated){
|
||||
const g = document.createElement('span');
|
||||
g.className = 'hf-fit gated'; g.textContent = 'accès restreint';
|
||||
head.appendChild(g);
|
||||
}
|
||||
o.appendChild(head);
|
||||
|
||||
// Avertissement en toutes lettres : la pastille seule ne dit pas quoi faire,
|
||||
// et c'est ici que le téléchargement se déclenche.
|
||||
if(r.gated){
|
||||
const warn = document.createElement('div');
|
||||
warn.className = 'pe-note';
|
||||
warn.style.color = r.hf_token ? 'var(--warn)' : 'var(--err)';
|
||||
warn.textContent = hfGatedHint(r.hf_token);
|
||||
o.appendChild(warn);
|
||||
}
|
||||
|
||||
// Projecteur vision : proposé UNIQUEMENT s'il vient de ce dépôt. Un mmproj
|
||||
// encode dans l'espace latent de SON modèle ; en prendre un ailleurs donne un
|
||||
// moteur qui démarre et ne voit rien. Quand le dépôt n'en publie pas, on le
|
||||
|
||||
Reference in new issue
Block a user