161 lines
4.7 KiB
Python
161 lines
4.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Submit Z-Image-Turbo workflow using standard KSampler to ComfyUI on BC-250."""
|
|
import paramiko
|
|
import json
|
|
import time
|
|
|
|
ssh = paramiko.SSHClient()
|
|
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
ssh.connect('192.168.178.150', username='fabian', key_filename=r'C:\Users\fabia\.ssh\id_ed25519')
|
|
|
|
def run(cmd, timeout=600, desc=""):
|
|
if desc:
|
|
print(f"\n{'='*60}")
|
|
print(f" {desc}")
|
|
print(f"{'='*60}")
|
|
_, stdout, stderr = ssh.exec_command(cmd, timeout=timeout)
|
|
out = stdout.read().decode()
|
|
err = stderr.read().decode()
|
|
rc = stdout.channel.recv_exit_status()
|
|
if out.strip():
|
|
lines = out.strip().split('\n')
|
|
if len(lines) > 50:
|
|
print(f" ... ({len(lines)} lines, showing last 50)")
|
|
print('\n'.join(lines[-50:]))
|
|
else:
|
|
print(out.strip())
|
|
if err.strip():
|
|
lines = err.strip().split('\n')
|
|
show = lines[-20:] if len(lines) > 20 else lines
|
|
print(f"STDERR: {chr(10).join(show)}")
|
|
print(f" Exit code: {rc}")
|
|
return rc, out, err
|
|
|
|
# Z-Image-Turbo workflow using standard KSampler
|
|
# Turbo models: low steps (8), low/zero CFG (1.0 with cfg_pp or euler works)
|
|
workflow = {
|
|
"prompt": {
|
|
"1": {
|
|
"class_type": "UnetLoaderGGUF",
|
|
"inputs": {
|
|
"unet_name": "z_image_turbo-Q5_K_S.gguf"
|
|
}
|
|
},
|
|
"2": {
|
|
"class_type": "CLIPLoaderGGUF",
|
|
"inputs": {
|
|
"clip_name": "Qwen3-4B.i1-Q5_K_S.gguf",
|
|
"type": "qwen_image"
|
|
}
|
|
},
|
|
"3": {
|
|
"class_type": "VAELoader",
|
|
"inputs": {
|
|
"vae_name": "ae.safetensors"
|
|
}
|
|
},
|
|
"4": {
|
|
"class_type": "CLIPTextEncode",
|
|
"inputs": {
|
|
"text": "A majestic mountain landscape at sunset, golden light illuminating snow-capped peaks, crystal clear lake reflecting the sky, photorealistic",
|
|
"clip": ["2", 0]
|
|
}
|
|
},
|
|
"5": {
|
|
"class_type": "CLIPTextEncode",
|
|
"inputs": {
|
|
"text": "",
|
|
"clip": ["2", 0]
|
|
}
|
|
},
|
|
"6": {
|
|
"class_type": "EmptyLatentImage",
|
|
"inputs": {
|
|
"width": 1024,
|
|
"height": 576,
|
|
"batch_size": 1
|
|
}
|
|
},
|
|
"7": {
|
|
"class_type": "KSampler",
|
|
"inputs": {
|
|
"model": ["1", 0],
|
|
"seed": 42,
|
|
"steps": 8,
|
|
"cfg": 1.0,
|
|
"sampler_name": "euler",
|
|
"scheduler": "simple",
|
|
"positive": ["4", 0],
|
|
"negative": ["5", 0],
|
|
"latent_image": ["6", 0],
|
|
"denoise": 1.0
|
|
}
|
|
},
|
|
"8": {
|
|
"class_type": "VAEDecode",
|
|
"inputs": {
|
|
"samples": ["7", 0],
|
|
"vae": ["3", 0]
|
|
}
|
|
},
|
|
"9": {
|
|
"class_type": "SaveImage",
|
|
"inputs": {
|
|
"images": ["8", 0],
|
|
"filename_prefix": "ZImageTurbo_BC250_test"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# Write workflow
|
|
workflow_json = json.dumps(workflow)
|
|
sftp = ssh.open_sftp()
|
|
with sftp.open('/tmp/zimage_workflow2.json', 'w') as f:
|
|
f.write(workflow_json)
|
|
sftp.close()
|
|
|
|
# Submit
|
|
rc, out, _ = run("bash -c 'curl -s -X POST http://localhost:8188/prompt "
|
|
"-H \"Content-Type: application/json\" "
|
|
"-d @/tmp/zimage_workflow2.json'",
|
|
desc="Submit Z-Image-Turbo workflow")
|
|
|
|
response = {}
|
|
try:
|
|
response = json.loads(out.strip())
|
|
except:
|
|
pass
|
|
|
|
if 'error' in response:
|
|
print(f"\nERROR: {response['error']}")
|
|
if 'node_errors' in response:
|
|
for node_id, errs in response['node_errors'].items():
|
|
print(f" Node {node_id} ({errs.get('class_type','')}): {errs.get('errors','')}")
|
|
ssh.close()
|
|
exit(1)
|
|
|
|
prompt_id = response.get('prompt_id', '')
|
|
print(f"\nPrompt ID: {prompt_id}")
|
|
|
|
# Monitor progress — model loading + 8 sampling steps
|
|
for i in range(60): # up to 10 minutes
|
|
time.sleep(10)
|
|
rc, out, _ = run(f"bash -c 'tail -30 /home/fabian/comfyui.log 2>/dev/null'",
|
|
desc=f"Progress {i+1} ({(i+1)*10}s)")
|
|
|
|
if 'Prompt executed in' in out:
|
|
print("\n IMAGE GENERATION COMPLETE!")
|
|
break
|
|
if 'Exception' in out or 'Traceback' in out:
|
|
print("\n ERROR during generation!")
|
|
run("bash -c 'tail -80 /home/fabian/comfyui.log'", desc="Error details")
|
|
break
|
|
|
|
# Check output files
|
|
run("bash -c 'ls -la ~/ComfyUI/output/ 2>/dev/null'",
|
|
desc="Output directory")
|
|
|
|
ssh.close()
|
|
print("\nDone.")
|