Pré-version / build continu : il s'agit d'un build expérimental, pas d'une version stable.
ui : Découvrir et télécharger des modèles depuis le HF Hub (#29584) * common : résolution des balises de téléchargement et listage des sidecars en cache Une balise de type Q4_0-mtp résout désormais le fichier sidecar lorsqu'aucun fichier de modèle ne lui correspond, de sorte qu'un téléchargement solo de draft ou de mmproj récupère réellement le fichier. Les fichiers sidecar en cache apparaissent comme des entrées à part entière afin que l'état survive à un redémarrage, et la suppression d'une telle balise ne supprime que le sidecar. Assisted-by: pi:zai-org/GLM-5.3 * ui : HTML brut optionnel assaini dans le markdown Ajout d'une prop allowHtml à MarkdownContent : le HTML brut trouvé dans le markdown est rendu après assainissement par DOMPurify au lieu d'être échappé en texte littéral. Par défaut, il reste échappé. Assisted-by: pi:GLM-5.3-Flash * ui : ajout des composants de découverte de modèles La surface Discover : la liste du catalogue organisé avec sa recherche et ses squelettes, le volet de détails avec son readme, ses métadonnées, ses statistiques du Hub et ses options de téléchargement, ainsi que la barre de progression de téléchargement autonome qui remplace la version simple. Le bouton de téléchargement quant dimensionne son select avec un nouveau déclencheur xs, si bien que le select gagne cette taille et l'apparence de boîte atténuée. Le store reste incomplet lorsqu'un dépôt échoue, de sorte que le montage suivant réessaie. Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash * ui : intégration de la vue Discover dans le gestionnaire de modèles Le dialog du gestionnaire gagne sa seconde vue : l'appel à l'action Discover Models fait disparaître le tableau en fondu, fait glisser le titre avec son signe compas et fait apparaître la surface Discover en fondu ; le bouton flèche ramène au tableau. Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash # Conflicts: # tools/ui/src/lib/components/ui/button/button.svelte * ui : ajout du réglage Enable Discover Models Cet indicateur conditionne la navigation et le téléchargement des modèles GGUF de HuggingFace, il est donc déclaré dans la couche discover ; la recherche de l'arborescence du dépôt dans la couche manager au-dessus le lit ici. Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash * ui : reprise des téléchargements de modèles depuis le point de pause Un téléchargement arrêté conserve son fichier partiel au lieu de le supprimer, si bien que reposter la balise reprend depuis le disque. Le premier enregistrement de progression désormais transporte l'offset de reprise, l'instantané en pause survit dans l'entrée reprise, et une pause se stabilise dès qu'elle est demandée. Assisted-by: pi * ui : faire précéder la liste Discover des téléchargements La barre latérale Discover liste les téléchargements en cours au-dessus des modèles suggérés, et s'efface tant qu'une requête est active. Un téléchargement en pause reste dans le tableau du gestionnaire, où il est repris ou supprimé. Assisted-by: pi * ui : faire fonctionner la reprise d'un téléchargement en pause Reposter la balise d'un téléchargement en pause se heurtait à la vérification « already exists » du routeur, car un téléchargement en pause gare son entrée comme DOWNLOADED jusqu'au prochain rechargement : une entrée de téléchargement qui n'est pas en cours est désormais remplacée et reprise. L'interface conserve la ligne en pause lorsque la requête échoue encore, au lieu de la supprimer et de paraître terminée. Assisted-by: pi * ui : mémoriser les téléchargements de modèles inachevés Un fichier partiel est nommé d'après le hachage de son contenu, donc rien sur le disque n'indique à quel modèle il appartient une fois le routeur redémarré. Le routeur conserve désormais les balises des téléchargements qu'il a lancés, efface une balise lorsque le téléchargement se termine ou est supprimé, et liste ce qui reste comme encore en cours de téléchargement sans rien démarrer. L'interface adopte ces balises comme en pause à chaque récupération de liste, de sorte qu'un rafraîchissement ou une ouverture fraîche montre un téléchargement incomplet et peut le reprendre à partir des fichiers déjà présents sur le disque. Assisted-by: pi * ui : afficher l'état d'un téléchargement en pause sur sa puce Une puce quant en pause affiche « en pause » au repos, comme une puce en cours montre son spinner, et propose l'action de reprise au survol. La ligne de téléchargement du sélecteur obtient une action View in Discover à côté de son annulation. Assisted-by: pi * ui : replier les options de téléchargement par défaut La commande de téléchargement copiable démarre repliée afin que les lignes d'options passent en premier ; la déplier reste à un clic. Assisted-by: pi * ui : exclure les modèles de décision des listes du hub Les modèles de décision répondent par des probabilités calibrées au lieu de texte, si bien que llama-ui ne peut pas les exécuter : la couche de données du hub les retire de le catalogue et chaque recherche, indexés par le tag du modèle de décision ou un pipeline de classification de texte. Assisted-by: pi * ui : lire les tags de téléchargement comme quant et sidecar Un tag `:-` se parse désormais en son quant et son sidecar au lieu d'un seul token de quant opaque, et ModelsService.draftSidecarsByRepo collecte les entrées réservées aux sidecars de la liste du routeur pour chaque dépôt, en remplaçant la copie en ligne dans le store des modèles. Assisted-by: pi * ui : regrouper les téléchargements de drafts sous leur modèle principal Les téléchargements suivis se regroupent par dépôt : les poids principaux mènent et les sidecars de draft voyagent dans leur élément sous forme de sous-lignes compactes, sur le sélecteur, la liste Discover et la table du gestionnaire. Les contrôles du modèle principal mettent en pause, reprennent et annulent tout le groupe, et les lignes de téléchargement du gestionnaire sélectionnent dans le panneau de configuration. Assisted-by: pi * ui : agir sur les téléchargements suivis depuis les lignes de la table La table transmet les sous-lignes de draft de ses groupes aux lignes de modèles. Les actions d'une ligne propagent pause et reprise, une ligne en cours propose Cancel download tandis qu'une en pause conserve Delete from disk, et le texte de la dialogue de confirmation suit l'état. Assisted-by: pi * ui : donner aux téléchargements un panneau de configuration qui leur est propre Sélectionner un téléchargement suivi ouvre le panneau en mode téléchargement : progression en direct avec pause, reprise et annulation, et See in Discover, au lieu des actions de métadonnées et de chargement qu'un modèle sans fichiers ne peut pas offrir. Assisted-by: pi * ui : rendre les détails de Discover auto-récupérants et responsives ModelsDiscoverDetailsContainer prend en charge les récupérations des détails, de l'arbre et du readme afin que des hôtes en dehors de la vue Discover puissent afficher le panneau, et la mise en page des détails s'adapte aux panneaux étroits avec des container queries au lieu de breakpoints de viewport. Assisted-by: pi * ui : télécharger un draft correspondant avec le modèle principal Un téléchargement de quant principal récupère désormais le draft au quant correspondant du type le plus préféré que le dépôt propose (DFlash avant MTP), en fire-and-forget, afin que le décodage spéculatif soit prêt quand le modèle principal arrive. Les puces de draft manuelles restent disponibles ; les options de la ligne se replient aussi sur une seule colonne dans les panneaux étroits. Assisted-by: pi * ui : laisser Discover désactivé par défaut et le coupler au réglage du hub Discover Models démarre décoché. L'activer active le réglage du Hugging Face Hub et le désactiver le désactive à nouveau, afin que la case à cocher ne mente jamais ; avec Discover désactivé, le réglage du hub reste disponible de lui-même pour les données d'affichage. L'état stocké et l'état de réinitialisation sont corrigés de la même façon au chargement. Assisted-by: pi * ui : ouvrir la dialogue de gestion des modèles sur la vue du gestionnaire La dialogue s'ouvre désormais sur le gestionnaire au lieu de revenir à la dernière vue, les entrées Discover atterrissent toujours sur la vue Discover tant que le réglage le permet, et les surfaces Discover suivent l'état du réglage. Assisted-by: pi * ui : donner à la recherche de Discover la place nécessaire à son anneau de focus La barre de recherche collante se détache des bords du panneau pour que l'anneau de focus reste dans le conteneur de défilement, et les lignes défilent derrière une barre opaque au lieu de passer au travers. Assisted-by: pi * common : fixer les noms de sidecars dans la liste et abandonner les partiels inachevés Un token de sidecar infixé ou final est ambigu : les têtes de draft l'utilisent (Model-MTP-BF16.gguf), tout comme les modèles complets avec têtes intégrées (Model-Q8D-MTP.gguf). Un tel nom est un sidecar uniquement à côté de poids principaux du même famille sans token, tandis que mmproj ou imatrix n'importe où dans le nom, ou un token en tête, décident à eux seuls (mmproj_f16.gguf). Un tag de quant porte toujours son nombre de bits, donc un sidecar nommé sans quant (mtp-Model-it.gguf) reçoit le tag nu : la liste, le plan et remove l'utilisent tous. Un tag imatrix se résout en un emplacement de plan qui lui est propre, téléchargé mais jamais branché dans les paramètres. remove résout le tag comme le fait un téléchargement et supprime les fichiers partiels de chaque blob planifié, si bien qu'annuler un téléchargement en cours ou abandonner un téléchargement laissé inachevé par une exécution antérieure ne laisse rien sur le disque. Le routeur passe son token et libère son verrou autour de l'appel, et enregistre les téléchargements inachevés avec une écriture atomique. llama download réussit sur un plan réservé aux sidecars et affiche ses chemins. * ui : déplacer les vues de dialogue et les états de draft dans des enums et constantes Les vues de la dialogue des modèles deviennent l'enum ModelsDialogView, les états de la sous-ligne de draft rejoignent ModelRowDownloadState, le fondu de la vue et la réinitialisation du retour de copie passent dans des constantes ui, et les marques de boussole de la dialogue proviennent de DISCOVER_ICON. Assisted-by: pi * ui : supprimer la surface Discover inutilisée Le jumeau mort openDiscoverModels, le séparateur de commandes commenté, le onClose inutilisé du panneau de détails et son bouton de fermeture d'en-tête, ainsi qu'un cast de type redondant disparaissent ; le retour de copie de la commande rejoint la constante de réinitialisation partagée. Assisted-by: pi * ui : alléger les commentaires des options de téléchargement et mettre en évidence le chat template La verbosité des commentaires que le panneau d'options et ses puces portaient se réduit au pourquoi non évident, et la dialogue du chat template s'affiche via SyntaxHighlightedCode en jinja au lieu d'un bloc pre brut. Assisted-by: pi * common : seul un fichier .gguf est un sidecar, et mmproj/imatrix comme mots entiers Un fichier non GGUF nommé comme un sidecar (quantization-mmproj-Q8_0.json) est retenu comme le mmproj, et un mot de sidecar à l'intérieur d'un mot plus long d'un nom de modèle (Phi-2-OmniMatrix.i1-Q4_K_M.gguf) fait tomber le modèle. * ui : dédupliquer les badges de sidecar de draft par quant Les badges de sidecar de draft étaient dédupliqués par type et par dépôt sans le quant, de sorte qu'avec un draft en cache à deux quants un seul badge survivait, et une suppression de l'autre quant principal ne trouvait aucun badge avec lequel retirer son sidecar. Restaure aussi la doc de getDownloadEntries perdue quand la méthode des groupes est arrivée au-dessus. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : adopter le statut de téléchargement incomplet et abandonner le registre des ids en pause Le store déduisait un téléchargement inachevé d'une entrée en cours de téléchargement pour laquelle il ne détenait aucun état local, ce qui lisait à tort un téléchargement en cours dans un autre onglet comme en pause et proposait une reprise que le serveur refuse. La liste porte désormais le statut "incomplete", donc l'adoption s'appuie directement dessus. Les ids en pause n'ont plus besoin de survivre dans localStorage : le serveur s'en souvient à travers les redémarrages, et l'instantané de progression était de toute façon obsolète après un rechargement. La clé localStorage obsolète est supprimée. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : quant-matcher les cascades de pause et d'annulation Pause, reprise et annulation se propageaient en cascade à chaque draft sidecar du dépôt alors que delete ne prenait que ceux quant-matchés, si bien qu'annuler un téléchargement Q4_0 tuait aussi un brouillon Q8_0 appartenant au main d'un autre quant. Chaque cascade agit désormais sur les drafts quant-matchés, alignant ce qu'emporte un delete. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : réduire le balisage dupliqué de la sous-ligne de draft Les branches téléchargé et en cours répétaient le même balisage identique de connecteur, libellé et badge ; un seul bloc avec une queue conditionnelle garde les deux états synchronisés. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : purger les styles positionnés du html de carte de modèle assaini L'attribut style restait autorisé pour la sortie KaTeX, ce qui permettait à une carte tierce de dessiner un overlay fixe par-dessus l'application. Le hook de sanitation supprime les valeurs position:fixed et position:absolute et laisse les styles de mise en page KaTeX intacts. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : exécuter le fetch du montage de discover une seule fois et réutiliser le helper partagé repoOf fetch() basculait son drapeau de chargement de manière synchrone dans l'effet de montage, ce qui relançait le fetch à chaque bascule et retentait sans fin les dépôts de catalogue en échec ; l'effet ne track plus l'appel désormais. La copie locale de repoOf et l'import dupliqué de services laissent place aux helpers partagés. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : restreindre la carte spec-type aux draft sidecars SPEC_TYPE portait des entrées vides pour les sidecars aux qu'il n'est jamais indexé ; la carte et le composant de commande typent désormais le badge comme un draft sidecar via un helper draftBadgeOf au lieu d'un cast. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : nommer les tags du decision-model et les clés de cache markdown Le tag hub du decision-model et le tag pipeline migrent dans les constantes huggingface à côté des autres tags de pipeline, et les préfixes de cache de transformation markdown reçoivent des noms au lieu de tokens bruts d'une seule lettre. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : lire le réglage discover via une seule vérification de véracité Trois endroits lisaient le réglage avec !== false et un avec Boolean() ; les quatre le lisent désormais de la même façon. Assisted-by: pi (zai-org/GLM-5.3-Flash) * ui : comparer la vue du dialogue des modèles à son enum Le template comparait l'état de vue au littéral 'manage' à trois endroits alors que le script utilisait l'enum. Assisted-by: pi (zai-org/GLM-5.3-Flash) * nit : retirer `+` avant le badge de draft sidecar * server : lister les téléchargements inachevés comme incomplets Un téléchargement jamais terminé était signalé comme « downloading », le même statut qu'un téléchargement actif, si bien qu'un client ne pouvait distinguer un téléchargement en cours d'un mort. Les tags mémorisés dans unfinished-downloads figurent désormais sous un statut « incomplete » dédié, sans instance. Assisted-by: pi (zai-org/GLM-5.3-Flash) * server : télécharger un modèle avec ses sidecars comme le fait -hf La résolution revient à master. POST /models prend les kinds de sidecar à tirer avec le modèle (mmproj par défaut) et l'enfant de téléchargement les reçoit comme drapeaux -hf, si bien que le serveur choisit les fichiers. /models ne liste que de vrais modèles, chacun avec les sidecars qu'il a sur disque, et les téléchargements incomplets conservent leurs sidecars à travers les redémarrages. Un téléchargement arrêté garde ses fichiers partiels pour la prochaine tentative, et DELETE les purge selon le même plan que suit le téléchargement. * ui : télécharger les sidecars comme paramètres de leur modèle Les options de téléchargement gardent leurs chips, mais une chip ne publie plus un tag de sidecar : le store le mappe vers son modèle et les kinds de sidecar à tirer, la chip de quant emporte son draft compagnon dans le même téléchargement, et les badges de draft viennent des sidecars que liste chaque modèle en cache. Le serveur ajoute les sidecars qu'un modèle en cache n'a pas quand il est de nouveau publié, et DELETE retire un seul sidecar d'un modèle en cache. * ui : refléter la recherche de sidecar du serveur dans les badges de draft Le serveur résout un sidecar par le token `-` sensible à la casse dans le même répertoire que les poids. L'UI correspondait au token de façon lâche, si bien qu'un badge pouvait offrir un draft que le serveur ne tirait jamais. Assisted-by: DeepSeek-V4.1-Flash * ui : publier les kinds de sidecar du modèle avec son téléchargement Le store garde un téléchargement par modèle : les kinds de la chip voyagent avec les sidecars propres au modèle, et une ligne de téléchargement ne se déploie plus en une ligne par sidecar. Les badges de draft ne portent encore aucun quant propre, si bien qu'un sidecar d'un modèle en cache n'est jamais étiqueté avec le quant du modèle. Assisted-by: DeepSeek-V4.1-Flash * ui : joindre le draft d'un quant à sa chip de téléchargement Une chip par quant, son draft badgé à l'intérieur et sa taille couvrant les deux fichiers. Le draft est le fichier que le serveur choisirait : le même répertoire, le quant exact, sinon la profondeur de bits la plus proche, si bien qu'un modèle 4 bits peut se pairer avec une tête 16 bits. Assisted-by: DeepSeek-V4.1-Flash * ui : retirer les lignes de téléchargement de draft du gestionnaire et du sélecteur Un téléchargement redevient une ligne par modèle : les drafts voyagent avec lui, et les lignes lisent les sidecars sur disque directement dans le listing au lieu de pairer des entrées de sidecar avec leur modèle. Pause, reprise et annulation agissent sur le téléchargement propre au modèle. Assisted-by: DeepSeek-V4.1-Flash * ui : garder la liste de téléchargement de discover à une ligne par modèle La liste commence par une ligne par modèle en cours de téléchargement, avec ses sidecars en sous-lignes. Une ligne ne badge que les kinds de draft que le serveur peut résoudre, si bien qu'un badge ne survit jamais au fichier que sa recherche choisirait. Assisted-by: DeepSeek-V4.1-Flash * ui : garder les chips de discover lisibles en mode sombre Les chips de métadonnées, le bouton de chat template et le lien View on Hugging Face portaient une bordure pâle et aucune surface sur le fond du dialogue, si bien qu'ils étaient presque invisibles. Ils prennent désormais la surface de bouton tertiaire, et leurs icônes se dimensionnent avec size-* pour que la règle de base de la variante les laisse intacts. Assisted-by: DeepSeek-V4.1-Flash * ui : porter le draft via les options de téléchargement Une puce par quant principal, son brouillon badge dessus et l'état de téléchargement de la puce couvrant les deux fichiers. Les brouillons se trouvent derrière une case à cocher opt-in avec un choix de type en ligne, et chaque ligne ouvre sa propre commande : elle épingle le quant de la ligne et ne nomme que le type de brouillon, donc -hfd disparaît. Assisted-by: DeepSeek-V4.1-Flash * ui : aligner le squelette des détails avec le volet chargé Même padding racine et même contexte de conteneur que la vue chargée, afin que les requêtes de conteneur se résolvent de la même manière. La carte des options de téléchargement applique le padding à ses blocs plutôt qu'à elle-même, le readme obtient sa carte, et une ligne de description remplace le paragraphe du catalogue. Assisted-by: DeepSeek-V4.1-Flash * common : supprimer les partiels d'un sidecar retiré Retirer seulement un sidecar laissait les fichiers .downloadInProgress des sidecars qu'un téléchargement avait prévus dans blobs/. La suppression les purge en suivant le même plan que le téléchargement, et le test couvre un brouillon terminé à côté d'un non terminé, dont le partiel disparaît tandis que le modèle garde ses fichiers. Assisted-by: DeepSeek-V4.1-Flash * server : nommer la raison d'un refus de téléchargement Un modèle déjà en cours de téléchargement, ou en cours d'exécution, répondait "already exists". Il dit désormais lequel : "is already downloading", ou "is running, unload it first", tous deux avant la vérification du reprenable. Le test du routeur couvre les deux. Assisted-by: DeepSeek-V4.1-Flash * ui : poster un téléchargement une fois par clic Deux clics rapides sur la même puce postait deux fois, et la seconde réponse était "already exists". Le store suit le modèle comme en attente, retourne tôt tant qu'il est en attente ou en vol, et le lit comme en vol avant que le serveur ne réponde, afin que la puce affiche le téléchargement immédiatement. Le nouveau test client épingle les flux : un POST par double clic, la puce lisant downloaded une fois que la liste signale le modèle, une reprise conservant ses sidecars, une annulation abandonnant tout le téléchargement, et un rechargement restaurant l'état en pause. Assisted-by: DeepSeek-V4.1-Flash * ui : garder une ligne de téléchargement simple à la hauteur des autres Le wrapper des sous-lignes d'une ligne de téléchargement était rendu même vide, si bien que son padding rendait la ligne plus haute qu'une ligne simple et la barre de progression superposée se trouvait dans cette bande vide. Il ne se rend plus qu'avec des sous-lignes, dans le sélecteur et dans la liste de découverte, et la ligne du sélecteur prend le padding téléphone de ses voisines. Assisted-by: DeepSeek-V4.1-Flash * ui : badger le brouillon d'un dépôt une seule fois Les args d'un modèle chargé et le listage d'un modèle en cache rapportent le même brouillon en des mots différents, l'un avec le quant du fichier et l'autre avec le seul type, si bien que la fusion gardait les deux et qu'une ligne de dépôt affichait le même type deux fois. Les badges fusionnent désormais par type, celui des args l'emportant car il connaît le quant, et le test épingle les deux sources d'un vrai dépôt. Assisted-by: DeepSeek-V4.1-Flash * server : rapporter les sidecars d'un preset ou d'un téléchargement en cours Un modèle que le preset nomme aussi est enregistré comme preset, si bien que ses brouillons n'étaient jamais rapportés et aucune ligne ne pouvait les badger. Un téléchargement en cours n'en rapportait aucun non plus, alors que l'enregistrement des types qu'il tire est juste là : ceux-ci l'emportent désormais sur le plan, le plan se résout via le hf-repo du preset, et un répertoire de models en reste exclu. Assisted-by: DeepSeek-V4.1-Flash * ui : badger les brouillons d'un téléchargement et ouvrir son modèle depuis la ligne Un brouillard encore en cours de téléchargement badge désormais l'id du modèle, comme le fait un brouillon arrivé, tandis qu'un brouillon sur disque garde sa sous-ligne cochée. La ligne elle-même ouvre le modèle, le créneau de statut à côté met en pause ou reprend, et le manager résout un focus sur une ligne de téléchargement afin que son panneau s'ouvre. Assisted-by: DeepSeek-V4.1-Flash * common : rapporter un sidecar retiré qui n'avait qu'un partiel Retirer seulement un sidecar perdait le résultat de la purge du partiel, si bien qu'un sidecar jamais arrivé que comme un blob .downloadInProgress répondait false et l'UI n'avait aucune raison de refetch. Le résultat de la purge est désormais intégré au retour, et le test couvre une suppression de partiel seul. Assisted-by: DeepSeek-V4.1-Flash * ui : ignorer une pause tant que le POST de téléchargement est encore en route La puce se lit comme téléchargement avant que le serveur ne réponde, si bien qu'un rapide second clic déchargeait un modèle qui n'avait pas démarré et laissait le store ni en vol ni en pause. Une pause retourne tôt tant que le POST est en attente, avant de toucher le flux ou le marqueur de pause. Le test client maintient le POST ouvert et l'épingle. Assisted-by: DeepSeek-V4.1-Flash * ui : proposer un brouillon manquant comme sa propre puce Un modèle déjà sur disque sans son brouillon n'avait aucun moyen de l'ajouter : la puce du quant portait le brouillon, donc elle se lisait comme un téléchargement des deux. La puce du quant s'en tient désormais à son propre état, son brouillon joint ne s'affiche que s'il accompagne ou est sur disque, et un quant téléchargé dont le brouillon manque reçoit une puce à lui - badge, taille, téléchargement - qui poste le modèle avec ce type, afin que le serveur garde les fichiers déjà présents et tire le brouillon. Assisted-by: DeepSeek-V4.1-Flash * server : lister un téléchargement de sidecar en pause par les fichiers sur disque Un modèle sur disque dont le téléchargement de sidecar s'arrête garde son enregistrement inachevé, et le listage rapportait les types que cet enregistrement prévoit comme s'ils étaient sur disque : l'UI cochait un brouillon jamais arrivé et n'offrait aucun moyen de l'ajouter. Les types prévus n'interviennent désormais que pendant que le téléchargement tourne. * chore: Clean up comments * server : lister les sidecars seulement pour un modèle qui se résout depuis un dépôt HF Un preset sur un fichier local n'a pas de dépôt HF, pourtant le listage résolvait son nom comme tel : le plan levait une erreur sur le format de dépôt invalide et GET /models échouait pour chaque modèle. Les sidecars proviennent désormais du dépôt qu'un preset nomme ou sous lequel un modèle en cache est listé, et un fichier local se liste sans eux. * common : corriger la régression d'annulation de téléchargement Signed-off-by: Adrien Gallouët * common : préserver les partiels du modèle lors de la suppression des sidecars Signed-off-by: Adrien Gallouët * server : une table de sidecars et une classe des téléchargements inachevés Prise en compte de la revue de @ggerganov. Les types de sidecars vivent dans une seule table dans common/download, associant chaque nom à son téléchargement fichier d'options et fichier de plan ; le serveur valide, construit ses options et liste les sidecars en cache à travers lui au lieu de ses propres listes. Les téléchargements inachevés passent dans server_unfinished_downloads, un enregistrement avec son propre mutex et une structure par entrée, et server_models les expose via unfinished_downloads_get et unfinished_downloads_remove. * common : une table de sidecars, et des suppressions qui conservent les fichiers partagés La résolution, le listing en cache et la suppression suivent une seule table de types de sidecars, de sorte qu'un type est déclaré une seule fois avec son mot-clé de fichier, qu'il s'agisse ou non d'un brouillon, son fichier d'options et son fichier de plan. Le serveur lit la même table pour les types qu'il accepte, les sidecars par défaut et les indicateurs enfants. Supprimer un tag conserve les fichiers qu'un autre tag en cache charge encore, comme un mmproj nommé d'après le quant supprimé. Un sidecar supprimé seul part pour chaque tag qui le résout. Un téléchargement inachevé enregistre les chemins exacts de ses partiels au moment où il démarre. Une suppression les efface sans interroger le hub, et conserve un partiel qu'un autre téléchargement enregistré écrit également. L'enregistrement est pris une fois le processus enfant lancé, et les fichiers passent sous le verrou models, de sorte qu'un téléchargement du même tag ne peut pas démarrer pendant leur suppression. * server : abandonner les partiels périmés et refuser un tag qui ne résout rien Réenregistrer un téléchargement supprime les partiels de l'enregistrement précédent que le nouveau plan n'écrit plus, comme ceux d'une révision plus ancienne du hub ou d'un sidecar que la nouvelle requête laisse de côté. Un tag soumis qui ne résout aucun fichier du dépôt est refusé avant que le téléchargement ne démarre. Supprimer un modèle suit un chemin unique, que le rechargement ait effacé son entrée pendant l'attente ou non. * server : corriger la course CI entre les tests de téléchargement du routeur Les workers pytest s'exécutent en parallèle sur un cache partagé, si bien qu'un test de téléchargement pouvait trouver le fichier qu'un autre test venait de récupérer et ne voir aucune progression, ou partir de l'enregistrement des téléchargements inachevés écrit par un autre test. Chaque test de téléchargement s'exécute désormais sur un cache vide qui lui est propre. * server : refuser un DELETE d'un nom inconnu et décider des téléchargements dans load() Un DELETE d'un nom qui n'est ni un modèle ni un téléchargement enregistré allait dans common_download_remove, et sans tag il effaçait tout le cache du dépôt, y compris les fichiers d'un quant chargé ou d'un téléchargement en cours. Un tel nom est désormais introuvable, comme avant. Un POST qui télécharge par-dessus une entrée existante vérifiait son état en dehors du verrou, de sorte qu'un chargement du même modèle entre-temps se faisait tuer son instance. Les vérifications s'exécutent désormais dans load(), sous le verrou, juste avant le lancement. Le faux temps de chargement des tests s'applique uniquement aux chargements de modèles, puisque un worker de téléchargement n'en charge aucun. * server : ajouter incomplete_sidecars à l'API /models Un sidecar ajouté à un modèle en cache puis mis en pause conservait son enregistrement, mais le listing ne montrait que le modèle complet, si bien qu'une UI fraîche perdait la pause. L'entrée du modèle porte désormais incomplete_sidecars, les types que son téléchargement inachevé n'a pas encore écrits ; un POST avec le type reprend l'un d'eux et un DELETE avec lui supprime son partiel. * common : supprimer un partiel conservé quand une reprise obtient 416 Maintenant que les partiels survivent entre les tentatives, un partiel ancien ou complet fait échouer chaque nouvelle tentative avec le même 416. Supprimez-le pour que la prochaine tentative puisse repartir de zéro. Signed-off-by: Adrien Gallouët * common : supprimer un partiel conservé quand une reprise obtient 200 Un serveur qui ignore la plage répond 200 à une reprise, et le partiel conservé fait alors échouer chaque tentative de la même manière qu'un 416. Supprimez-le également, pour que la prochaine tentative reparte sans plage. * server : refuser un téléchargement qui partage un partiel avec un téléchargement en cours Deux téléchargements de quants qui partagent un fichier, le mmproj ou un mtp choisi par les bits les plus proches, ajoutaient au même partiel et renommaient un fichier avec des octets entrelacés. Un téléchargement dont le plan écrit un partiel qu'un téléchargement en cours écrit également est désormais refusé jusqu'à ce que celui-ci soit terminé. * common : vérifier l'etag enregistré avant de reprendre un téléchargement partiel Avant de reprendre, comparez l'etag enregistré avec le partiel à celui que le serveur sert désormais. S'il est absent ou différent, recommencez depuis zéro, afin qu'un téléchargement repris ne mélange jamais des octets de deux versions du fichier. Signed-off-by: Adrien Gallouët --------- Signed-off-by: Adrien Gallouët Co-authored-by: Pascal Co-authored-by: Adrien GallouëtSite Web : - https://llama.app
Attestations : - https://github.com/ggml-org/llama.cpp/attestations/56975123
macOS/iOS : - macOS Apple Silicon (arm64) - macOS Apple Silicon (arm64, KleidiAI activé) DÉSACTIVÉ - macOS Intel (x64) - XCFramework iOS
Linux : - Ubuntu x64 (CPU) - Ubuntu arm64 (CPU) - Ubuntu s390x (CPU) - Ubuntu x64 (Vulkan) - Ubuntu arm64 (Vulkan) - Ubuntu x64 (CUDA 12) - Bibliothèques CUDA 12.8 - Ubuntu x64 (CUDA 13) - Bibliothèques CUDA 13.4 - Ubuntu arm64 (CUDA 13) - Bibliothèques CUDA 13.4 - Ubuntu x64 (ROCm 10.0) - Ubuntu x64 (OpenVINO) - Ubuntu x64 (SYCL FP32) - Ubuntu x64 (SYCL FP16) - Linux arm64 (Snapdragon : CPU, GPU Adreno, NPU Hexagon) - guide d'installation
Android : - Android arm64 (CPU) - Android arm64 (Snapdragon : CPU, GPU Adreno, NPU Hexagon) - guide d'installation
Windows : - Windows x64 (CPU) - Windows arm64 (CPU) - Windows arm64 (OpenCL Adreno) - Windows x64 (CUDA 12) - DLLs CUDA 12.4 - Windows x64 (CUDA 13) - DLLs CUDA 13.4 - Windows arm64 (CUDA 13) - DLLs CUDA 13.4 - Windows x64 (Vulkan) - Windows arm64 (Vulkan) - Windows x64 (OpenVINO) - Windows x64 (SYCL) - Windows x64 (ROCm 10.0)
openEuler : - DÉSACTIVÉ - openEuler x86 (310p) - openEuler x86 (910b, ACL Graph) - openEuler aarch64 (310p) - openEuler aarch64 (910b, ACL Graph)
UI : - UI