51 lines
3.4 KiB
Python
51 lines
3.4 KiB
Python
"""Small explicitly pinned validation jobs, isolated from production projects."""
|
|
import base64,json,sys,urllib.request,urllib.error,struct,subprocess
|
|
from pathlib import Path
|
|
root=Path(__file__).resolve().parent.parent
|
|
cfg=json.loads((root/'model-bridge/client.json').read_text())
|
|
file=root/'integration-work/gpu-selection-smoke.json'
|
|
data=json.loads(file.read_text()) if file.exists() else {'images':{},'hd':{}}
|
|
def save():file.write_text(json.dumps(data,indent=2),encoding='utf-8')
|
|
def request(base,path,body=None):
|
|
req=urllib.request.Request(base+path,data=json.dumps(body).encode() if body is not None else None,headers={'Content-Type':'application/json','Authorization':'Bearer '+cfg['token']})
|
|
try:
|
|
with urllib.request.urlopen(req,timeout=90) as r:return json.load(r)
|
|
except urllib.error.HTTPError as e:raise RuntimeError(e.read().decode())
|
|
base=cfg['url'].rstrip('/');hd='http://192.168.110.111:18794'
|
|
if '--submit-images' in sys.argv:
|
|
for gpu in ('gpu1','gpu2','gpu3'):
|
|
if gpu in data['images']:continue
|
|
r=request(base,'/v1/images/generations',{'model':'qwen_image_2_1','prompt':'A photorealistic blue ceramic teacup on a wooden table, soft daylight, no text.','size':'512x512','gpu':gpu})
|
|
expected='default' if gpu=='gpu2' else gpu
|
|
data['images'][gpu]={'id':r['task_id'],'provider':r.get('provider_id'),'status':'processing'};save()
|
|
assert r['provider_id']==expected,r
|
|
print('Pinned image accepted:',gpu,r['provider_id'])
|
|
if '--submit-hd' in sys.argv:
|
|
ref='data:image/jpeg;base64,'+base64.b64encode((root/'integration-work/hd-test/static/videos/task-86_poster.jpg').read_bytes()).decode()
|
|
for gpu in ('gpu1','gpu3'):
|
|
if gpu in data['hd']:continue
|
|
r=request(hd,'/v2/video_generation',{'model':'MiniMax-H3-VDN-H3','gpu':gpu,'resolution':'2K','ratio':'16:9','duration':4,'content':[{'type':'text','text':'A cinematic live-action mountain lake at sunrise, drifting mist, slow camera movement, no text, no dialogue.'},{'type':'image_url','role':'reference_image','image_url':{'url':ref}}]})
|
|
data['hd'][gpu]={'id':r['task_id'],'provider':r.get('provider_id'),'status':'processing'};save()
|
|
assert r['provider_id']==gpu,r
|
|
print('Pinned 2K accepted:',gpu,r['provider_id'])
|
|
if '--poll' in sys.argv:
|
|
for group,rows in data.items():
|
|
for gpu,item in rows.items():
|
|
if item['status']=='completed':continue
|
|
if group=='images':
|
|
r=request(base,'/v1/images/task/'+item['id']);status=r['status'];url=r.get('image_url')
|
|
else:
|
|
r=request(hd,'/v2/query/video_generation/'+item['id'])['task'];status={'succeeded':'completed'}.get(r['status'],r['status']);url=(r.get('content') or {}).get('url')
|
|
item['status']=status
|
|
if status=='completed' and url:
|
|
target=root/'integration-work'/('pinned-'+group+'-'+gpu+('.png' if group=='images' else '.mp4'))
|
|
with urllib.request.urlopen(url,timeout=90) as response:target.write_bytes(response.read())
|
|
if group=='images':
|
|
content=target.read_bytes();assert content.startswith(b'\x89PNG\r\n\x1a\n');dims=list(struct.unpack('>II',content[16:24]));assert dims==[512,512]
|
|
else:
|
|
info=json.loads(subprocess.check_output([str(root/'HuobaoDrama/resources/bin/ffprobe.exe'),'-v','error','-show_streams','-of','json',str(target)],creationflags=0x08000000));v=next(s for s in info['streams'] if s['codec_type']=='video');dims=[v['width'],v['height']];assert dims==[2560,1440]
|
|
item.update(file=str(target),dimensions=dims)
|
|
if r.get('error'):item['error']=r['error']
|
|
save()
|
|
print(json.dumps(data,ensure_ascii=False))
|