Add persistent base-model filter to discovery categories

This commit is contained in:
Mikei386
2026-09-28 19:31:55 +02:00
parent 5cc732f993
commit 8e829928c7
6 changed files with 44 additions and 8 deletions
+15 -3
View File
@@ -51,6 +51,13 @@ def file_role(filename):
role,label='configuration','Konfiguration'
return dict(role=role,role_label=label,profile_eligible=role=='model')
def is_derived_model(model):
"""Use publisher metadata, never infer lineage from a repository name."""
card=model.get('cardData') or {}
if isinstance(card,dict) and (card.get('base_model') or card.get('base_model_relation')):return True
tags=model.get('tags') or []
return any(isinstance(tag,str) and (tag.startswith('base_model:') or tag.lower() in {'lora','peft','adapter','merge','mergekit','finetune','fine-tuned','quantized','gguf','gptq','awq'}) for tag in tags)
class Catalog:
def __init__(self,root):
self.root=Path(root);self.lock=threading.RLock();self.job=None;self.cancel=threading.Event()
@@ -86,11 +93,16 @@ class Catalog:
path=self.root/ident/('model'+PurePosixPath(entry['file']).suffix)
if not path.is_file() or path.stat().st_size!=entry['size']:raise ValueError('Modelldatei fehlt oder ist unvollständig.')
return entry
def search(self,q,kind,sort="downloads"):
def search(self,q,kind,sort="downloads",base_only=False):
if kind not in KINDS or not isinstance(q,str) or len(q)>120:raise ValueError('Ungültige Suche.')
if sort not in ('downloads','name','newest'):raise ValueError('Ungültige Sortierung.')
rows=metadata('/api/models?'+urllib.parse.urlencode(dict(search=q,filter=KINDS[kind],limit=20,sort='createdAt' if sort=='newest' else 'downloads',direction=-1)))
return {'models':[dict(repo=x['id'],downloads=x.get('downloads'),gated=x.get('gated',False),created_at=x.get('createdAt')) for x in rows]}
if not isinstance(base_only,bool):raise ValueError('Ungültiger Basismodellfilter.')
query=dict(search=q,filter=KINDS[kind],limit=100 if base_only else 20,sort='createdAt' if sort=='newest' else 'downloads',direction=-1)
if base_only:query['expand']=['downloads','createdAt','gated','cardData','tags']
rows=metadata('/api/models?'+urllib.parse.urlencode(query,doseq=True))
scanned=len(rows)
if base_only:rows=[x for x in rows if not is_derived_model(x)]
return {'models':[dict(repo=x['id'],downloads=x.get('downloads'),gated=x.get('gated',False),created_at=x.get('createdAt')) for x in rows[:20]],'base_only':base_only,'scanned':scanned}
def files(self,repo):
repo=repo_id(repo)
with self.cache_lock: