Spaces:
Running on Zero
Running on Zero
File size: 13,902 Bytes
72e7212 8e0f286 72e7212 8e0f286 72e7212 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | """Bounded operator batch using IDOL Commons' pinned pipeline, schema and renderer.
Authenticated as the dataset owner via Hub; does not modify the web app's token
scope checks or impersonate an OAuth browser session. Each asset is committed
atomically with its validation, licence documents and catalogue entries.
"""
import os,sys,json,time,hashlib,uuid,shutil,subprocess,signal,copy,base64
from pathlib import Path
from datetime import datetime,timezone
from huggingface_hub import HfApi,snapshot_download,hf_hub_download,CommitOperationAdd
from huggingface_hub.utils import disable_progress_bars,HfHubHTTPError
SPACE='fffiloni/idol-commons-dev';DATASET='fffiloni/idol-community-assets'
REVISION='f9bad8e9a95a13029293a8d6e9b1af23bc7a6297'
SOURCE='2fd68f6aaa69df7c178503a788ad8deb4c7d3117'
SUBJECT='61868ce808aae0b5499a2a95';REPORT='batches/idol-examples-2026-11-01.json'
LIMIT=int(sys.argv[1]) if len(sys.argv)>1 else 94
signal.alarm(1800 if LIMIT==1 else 6600)
started=time.monotonic();token=os.environ.pop('HF_TOKEN');disable_progress_bars();api=HfApi(token=token)
def stamp():return datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
def sha(p):return hashlib.sha256(Path(p).read_bytes()).hexdigest()
def out(event,**data):print(event+' '+json.dumps(data,ensure_ascii=False),flush=True)
who=api.whoami();assert who['id']==SUBJECT and who['name']=='fffiloni'
variables=api.get_space_variables(SPACE);assert SUBJECT in variables['MODERATOR_HF_SUBJECTS'].value.split(',')
author={'hf_subject':who['id'],'hf_username':who['name'],'verified_at':stamp()}
root=Path('/tmp/idol-examples-app');snapshot_download(SPACE,repo_type='space',revision=REVISION,local_dir=root,token=token)
os.chdir(root);sys.path.insert(0,str(root))
from backend.contract import Record,Parameters,RightsDeclaration
from backend.catalogue import validate_manifest
from backend.repository import HubRepository
from backend.duplicates import example_identity,CATALOGUE
from backend.generation import load_engine,MODEL_REVISION,PIPELINE_REVISION
from backend.validation import validate_ply,normalize_input
from backend.rendering import render_preview
from backend.licensing import documents
from backend.settings import Settings
from importlib.metadata import distributions
assert SOURCE==PIPELINE_REVISION==CATALOGUE['revision']
presets=json.loads((root/'frontend/src/idol-presets.json').read_text());assert len(presets)==94
fingerprints={e['image']:e for e in CATALOGUE['examples']};assert set(fingerprints)=={p['image'] for p in presets}
assert 'license: apache-2.0' in Path(hf_hub_download('speridlabs/idol','README.md',repo_type='space',revision=SOURCE,token=False)).read_text()
cfg=Settings(state=Path('/tmp/idol-batch-state'),model_token=token,engine=False,publishing=False,app_repo=SPACE,app_revision=REVISION,
dinov3_revision=variables['DINOV3_REVISION'].value,flux_revision=variables['FLUX_VAE_REVISION'].value)
cfg.state.mkdir(parents=True,exist_ok=True)
browser=shutil.which('chromium') or shutil.which('chromium-browser');assert browser,'Chromium must be installed in the Space image'
os.environ.update(CHROMIUM_EXECUTABLE=browser,CHROMIUM_NO_SANDBOX='1',RENDER_SOFTWARE='1')
safe={k:v for k,v in os.environ.items() if k in ('PATH','HOME','LANG','SSL_CERT_FILE')}
subprocess.run(['npm','ci','--prefix','frontend','--ignore-scripts','--no-audit','--no-fund'],env=safe,check=True,timeout=180,stdout=subprocess.DEVNULL)
runtime=''.join(sorted({f'{d.metadata["Name"]}=={d.version}\n' for d in distributions() if d.metadata['Name']}))
runtime+='# IDOL Commons operator GPU batch; source '+SPACE+'@'+REVISION+'\n'
runtime_sha=hashlib.sha256(runtime.encode()).hexdigest()
repo=HubRepository(DATASET,token)
head,manifest=repo.snapshot();records=validate_manifest(manifest)
expected={(p['image'],MODEL_REVISION) for p in presets}
present={example_identity(r.provenance.model_dump()):r for r in records}
out('BATCH_PLAN',total=len(presets),already_present=sum(k in present for k in expected),limit=LIMIT,author=author,moderator_verified=True,space_revision=REVISION)
def rights(p):
url=f'https://huggingface.co/spaces/speridlabs/idol/blob/{SOURCE}/{p["image"]}'
return RightsDeclaration(basis='licensed_source',source_license='Apache-2.0',
attribution=f'Input: {p["title"]} — SperidLabs IDOL demo. {url} Generated 3D adaptation contributed by @fffiloni.',
copyright_notice='Source-image rights remain with their respective holders. 3D adaptation and contribution: fffiloni, 2026, to the extent applicable.',
notices=f'The source Space declares Apache-2.0 at revision {SOURCE}. Original image and preset credits: SperidLabs / IDOL. Modified: image-to-3D generation with the original IDOL preset; preview rendered from the resulting Gaussian splat. No trademark or personality-rights permission is implied.').model_dump()
def commit_files(parent,files,next_manifest,message,progress):
validate_manifest(next_manifest)
files={**files,'collection.json':(json.dumps(next_manifest,ensure_ascii=False,separators=(',',':'))+'\n').encode(),
'data/records.jsonl':(''.join(json.dumps(r,ensure_ascii=False,separators=(',',':'))+'\n' for r in next_manifest['records'])).encode(),
REPORT:(json.dumps(progress,ensure_ascii=False,indent=2)+'\n').encode()}
assert all(n.startswith(('assets/','runtimes/','batches/')) or n in ('collection.json','data/records.jsonl') for n in files)
return api.create_commit(DATASET,repo_type='dataset',parent_commit=parent,operations=[CommitOperationAdd(path_in_repo=n,path_or_fileobj=str(v) if isinstance(v,Path) else v) for n,v in files.items()],commit_message=message).oid
# Freeze the reviewed table once for this run; generation engines remain pinned above.
editorial_revision=api.space_info(SPACE).sha
editorial_raw=Path(hf_hub_download(SPACE,'metadata/idol-examples.json',repo_type='space',revision=editorial_revision,token=token)).read_bytes()
from backend.contract import Editorial
editorial_table=json.loads(editorial_raw)
assert editorial_table['source_revision']==SOURCE
editorials={k:Editorial.model_validate(v).model_dump() for k,v in editorial_table['examples'].items()}
assert set(editorials)==set(fingerprints)
progress={'batch':'idol-examples-2026-11-01','source_revision':SOURCE,'model_revision':MODEL_REVISION,'app_revision':REVISION,'operator':author,'editorial_revision':editorial_revision,'editorial_sha256':hashlib.sha256(editorial_raw).hexdigest(),'requested':94,'started_at':stamp(),'completed':[],'failures':[],'status':'running'}
pipeline=None;created=0
for p in presets:
if created>=LIMIT or time.monotonic()-started>6300:break
key=(p['image'],MODEL_REVISION);head,manifest=repo.snapshot();existing=next((r for r in validate_manifest(manifest) if example_identity(r.provenance.model_dump())==key),None)
if existing:
assert existing.author.hf_subject==SUBJECT,'Do not relicense another contributor'
if existing.license!='Apache-2.0' and LIMIT!=1:
for attempt in range(5):
head,manifest=repo.snapshot();old=next(r for r in manifest['records'] if r['id']==existing.id);new=copy.deepcopy(old);r=rights(p)
old_grants=old.get('license_grants') or [{'license':old['license'],'granted_at':old['created_at'],'terms_version':old['publication_terms_version'],'rights':{k:v for k,v in old['rights'].items() if k!='review_status'}}]
new.update(schema_version='1.2.0',publication_terms_version='1.2.0',license='Apache-2.0',rights={**r,'review_status':'contributor_attested_not_legally_reviewed'},license_grants=old_grants+[{'license':'Apache-2.0','granted_at':stamp(),'terms_version':'1.2.0','rights':r}])
files=documents(new);Record.model_validate(new);files[new['files']['splat']['path'].rsplit('/',1)[0]+'/metadata.json']=(json.dumps(new,ensure_ascii=False,indent=2)+'\n').encode()
next_manifest={**manifest,'records':[new if x['id']==existing.id else x for x in manifest['records']]}
try:commit=commit_files(head,files,next_manifest,'Record Apache licence and source credits for '+p['title'],progress);break
except HfHubHTTPError as e:
if e.response is None or e.response.status_code not in (409,412) or attempt==4:raise
out('EXISTING_LICENCE_UPDATED',image=p['image'],id=existing.id,commit=commit,previous_grants_retained=True)
out('EXAMPLE_EXISTS',image=p['image'],id=existing.id);progress['completed'].append({'image':p['image'],'id':existing.id,'reused':True});continue
try:
folder=cfg.state/str(uuid.uuid4());folder.mkdir()
raw=Path(hf_hub_download('speridlabs/idol',p['image'],repo_type='space',revision=SOURCE,token=False));assert sha(raw)==fingerprints[p['image']]['raw_sha256']
info=normalize_input(raw.read_bytes(),folder/'input.png');assert info['sha256']==fingerprints[p['image']]['normalized_sha256']
if pipeline is None:
import torch
assert torch.cuda.is_available();out('GPU_READY',name=torch.cuda.get_device_name(0));pipeline=load_engine(cfg);out('MODEL_LOADED')
params={'mode':p['mode'],'seed':p['seed'],'steps':p['steps'],'cfg_strength':float(p['cfg']),'rescale_t':float(p['rescale_t']),'num_gaussians':p['num_gaussians'],'randomize_requested':False,'crop_margin':1.2 if p['mode']=='synthetic' else 1.7,'dinov3_dtype':'bf16'}
Parameters.model_validate(params);t=time.monotonic()
result=pipeline(str(folder/'input.png'),**{k:params[k] for k in ('mode','seed','steps','cfg_strength','rescale_t','num_gaussians','crop_margin')})
result.gaussian.save_ply(str(folder/'model.ply'));del result
validation=validate_ply(folder/'model.ply',params['num_gaussians']);out('GENERATED',image=p['image'],seconds=round(time.monotonic()-t,2),bytes=validation['bytes'])
preview,framing=render_preview(folder,validation)
identifier=str(uuid.uuid4());prefix=f'assets/{identifier[:2]}/{identifier}/';r=rights(p);created_at=stamp()
provenance={'kind':'generated_in_app','generation_id':str(uuid.uuid4()),'app':{'repo':SPACE,'revision':REVISION},'pipeline_source':{'repo':'speridlabs/idol','revision':SOURCE},'model':{'repo':'speridlabs/idol','revision':MODEL_REVISION},'encoders':{'dinov3':{'repo':'facebook/dinov3-vith16plus-pretrain-lvd1689m','revision':cfg.dinov3_revision},'flux2_vae':{'repo':'black-forest-labs/FLUX.2-dev','revision':cfg.flux_revision}},'runtime_lock_sha256':runtime_sha,'source_image':{'kind':'uploaded','sha256':info['sha256']}}
base={'schema_version':'1.2.0','id':identifier,**editorials[p['image']],'author':author,'created_at':created_at,'license':'Apache-2.0','rights':{**r,'review_status':'contributor_attested_not_legally_reviewed'},'license_grants':[{'license':'Apache-2.0','granted_at':created_at,'terms_version':'1.2.0','rights':r}],'provenance':provenance,'generation':params,'format':'ply-3dgs','representation':{k:validation[k] for k in ('gaussian_count','header_bytes')},'files':{'splat':{'path':prefix+'model.ply','bytes':validation['bytes'],'sha256':validation['sha256'],'media_type':'application/octet-stream'}},'framing':framing,'source_image_public':False,'publication_terms_version':'1.2.0'}
base['representation'].update(encoding='binary_little_endian',property_layout='idol-sh0-v1',sh_degree=0,up_axis='y',quaternion_order='wxyz',units='unitless')
for field,name,side in [('preview','preview.png',1024),('preview_small','preview-small.png',512)]:base['files'][field]={'path':prefix+name,**preview['files'][name],'media_type':'image/png','width':side,'height':side,'alpha':True}
for attempt in range(5):
head,manifest=repo.snapshot()
duplicate=next((x for x in manifest['records'] if example_identity(x['provenance'])==key),None)
if duplicate:out('CONCURRENT_DUPLICATE_SKIPPED',image=p['image'],id=duplicate['id']);break
record={**base,'collection_sequence':manifest['next_sequence']};files={prefix+n:folder/n for n in ('model.ply','preview.png','preview-small.png')};files.update(documents(record));Record.model_validate(record)
files[prefix+'metadata.json']=(json.dumps(record,ensure_ascii=False,indent=2)+'\n').encode();files['runtimes/'+runtime_sha+'.txt']=runtime.encode()
next_manifest={**manifest,'next_sequence':manifest['next_sequence']+1,'records':[*manifest['records'],record]}
snapshot={**progress,'completed':[*progress['completed'],{'image':p['image'],'id':identifier,'reused':False}]}
try:commit=commit_files(head,files,next_manifest,'Add IDOL example: '+p['title'],snapshot);progress=snapshot;created+=1;out('EXAMPLE_PUBLISHED',image=p['image'],id=identifier,commit=commit,created=created);break
except HfHubHTTPError as e:
if e.response is None or e.response.status_code not in (409,412) or attempt==4:raise
if LIMIT==1:
image=base64.b64encode((folder/'preview-small.png').read_bytes()).decode()
for i in range(0,len(image),8000):print('PROBE_IMAGE '+str(i//8000)+' '+image[i:i+8000],flush=True)
shutil.rmtree(folder)
except Exception as e:
progress['failures'].append({'image':p['image'],'error_type':type(e).__name__,'message':str(e)[:350]});out('EXAMPLE_FAILED',image=p['image'],error_type=type(e).__name__,message=str(e)[:350])
if LIMIT==1 or len(progress['failures'])>=3:raise
head,manifest=repo.snapshot();complete=[r for r in validate_manifest(manifest) if example_identity(r.provenance.model_dump()) in expected]
progress.update(status='complete' if len(complete)==94 and all(r.license=='Apache-2.0' for r in complete) else 'probe-complete' if LIMIT==1 and created==1 else 'partial',finished_at=stamp(),public_example_count=len(complete),apache_count=sum(r.license=='Apache-2.0' for r in complete),created_this_job=created,seconds=round(time.monotonic()-started,1))
api.create_commit(DATASET,repo_type='dataset',operations=[CommitOperationAdd(path_in_repo=REPORT,path_or_fileobj=(json.dumps(progress,ensure_ascii=False,indent=2)+'\n').encode())],commit_message='Checkpoint IDOL example batch: '+progress['status'])
out('BATCH_RESULT',**{k:v for k,v in progress.items() if k not in ('completed','failures')},failures=progress['failures'])
|