Add persistent base-model filter to discovery categories
This commit is contained in:
+15
-3
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user