mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-03 17:27:37 +08:00
The audit of v4.1 surfaced ~70 issues across the five scripts and three
reference docs — most user-visible (silent file overwrites, status-error
misclassified as success, X-API-Key leaked to S3 on /api/view redirect,
Cloud endpoints that 404 because they were renamed). v5.0.0 fixes those
and fills the gaps that previously forced users to write their own glue
(WebSocket monitoring, batch/sweep, img2img upload helper, dep auto-fix,
log fetch, health check, example workflows).
Critical fixes
- run_workflow.py: poll_status now checks status_str==error BEFORE
completed:true, so a failed run no longer reports success
- run_workflow.py: download_output streams to disk via safe_path_join,
preserves server subfolder structure (no silent overwrites), and
retries with exponential backoff
- run_workflow.py: refuses to overwrite a link with a literal in
inject_params (would silently break wiring)
- _common.py: _StripSensitiveOnRedirectSession (subclasses
requests.Session.rebuild_auth) drops X-API-Key/Cookie on cross-host
redirects — fixes a real key-leak path through Cloud's signed-URL
download flow. Tested
- Cloud routing (verified live): /history → /history_v2,
/models/<f> → /experiment/models/<f>, plus folder aliases for the
unet ↔ diffusion_models and clip ↔ text_encoders rename
- check_deps.py: distinguishes 200/empty vs 404 folder_not_found vs
403 free-tier; emits concrete fix_command per missing dep
- extract_schema.py: prompt vs negative_prompt determined by tracing
KSampler.{positive,negative} connections (incl. through Reroute /
Primitive nodes) instead of meta-title heuristic; symmetric
duplicate-name resolution; cycle-safe trace_to_node
- hardware_check.py: multi-GPU pick-best, Apple variant detection,
Rosetta detection, WSL2, ROCm --json, disk-space check, optional
PyTorch probe; powershell preferred over deprecated wmic
- comfyui_setup.sh: prefers pipx → uvx → pip --user (with PEP-668
fallback); idempotent — skips relaunch if server already up;
configurable port/workspace; persistent log; SIGINT trap
New scripts
- run_batch.py — count or sweep (cartesian product), parallel up to
cloud tier limit
- ws_monitor.py — real-time WebSocket viewer; saves preview frames
- auto_fix_deps.py — runs comfy node install / model download for
whatever check_deps reports missing (with --dry-run)
- health_check.py — single command that runs the verification checklist
(comfy-cli + server + checkpoints + optional smoke test that cancels
itself to avoid burning compute)
- fetch_logs.py — pull traceback / status messages for a prompt_id
Coverage expansion
- Param patterns now cover Flux (BasicScheduler, BasicGuider,
RandomNoise, ModelSamplingFlux), SD3, Wan/Hunyuan/LTX video,
IPAdapter, rgthree, easy-use, AnimateDiff
- Embedding refs in CLIPTextEncode strings extracted as model deps
- ckpt_name / vae_name / lora_name / unet_name now controllable so
workflows can be retargeted per run
Examples
- workflows/{sd15,sdxl,flux_dev}_txt2img.json
- workflows/sdxl_{img2img,inpaint}.json
- workflows/upscale_4x.json
- workflows/{animatediff_video,wan_video_t2v}.json + README
Tests
- 117 tests (105 unit + 8 cloud integration + 4 cross-host security)
- Cloud tests auto-skip without COMFY_CLOUD_API_KEY; verified end-to-end
against live cloud API
Backwards compatibility
- All existing CLI flags continue to work; new behavior is opt-in
(--ws, --input-image, --randomize-seed, --flat-output, etc.)
70 lines
2.1 KiB
JSON
70 lines
2.1 KiB
JSON
{
|
|
"_comment": "Wan 2.1 text-to-video. Cloud: confirmed available. Local: download wan2.1_t2v_1.3B_fp16.safetensors → models/diffusion_models/ (or models/unet/), umt5_xxl_fp16.safetensors → models/text_encoders/ (or models/clip/), wan_2.1_vae.safetensors → models/vae/. Output: MP4. Large model — only on cloud or 24 GB+ local GPU.",
|
|
"6": {
|
|
"class_type": "CLIPTextEncode",
|
|
"_meta": {"title": "Prompt"},
|
|
"inputs": {
|
|
"text": "a graceful crane taking flight from a misty lake at dawn, slow motion, 4k",
|
|
"clip": ["38", 0]
|
|
}
|
|
},
|
|
"7": {
|
|
"class_type": "CLIPTextEncode",
|
|
"_meta": {"title": "Negative Prompt"},
|
|
"inputs": {
|
|
"text": "static, blurry, watermark, low quality",
|
|
"clip": ["38", 0]
|
|
}
|
|
},
|
|
"8": {
|
|
"class_type": "VAEDecode",
|
|
"_meta": {"title": "VAE Decode"},
|
|
"inputs": {"samples": ["3", 0], "vae": ["39", 0]}
|
|
},
|
|
"37": {
|
|
"class_type": "UNETLoader",
|
|
"_meta": {"title": "Wan UNET"},
|
|
"inputs": {"unet_name": "wan2.1_t2v_1.3B_fp16.safetensors", "weight_dtype": "default"}
|
|
},
|
|
"38": {
|
|
"class_type": "CLIPLoader",
|
|
"_meta": {"title": "Wan CLIP"},
|
|
"inputs": {"clip_name": "umt5_xxl_fp16.safetensors", "type": "wan"}
|
|
},
|
|
"39": {
|
|
"class_type": "VAELoader",
|
|
"_meta": {"title": "Wan VAE"},
|
|
"inputs": {"vae_name": "wan_2.1_vae.safetensors"}
|
|
},
|
|
"3": {
|
|
"class_type": "KSampler",
|
|
"_meta": {"title": "KSampler"},
|
|
"inputs": {
|
|
"seed": 42, "steps": 30, "cfg": 6.0,
|
|
"sampler_name": "uni_pc", "scheduler": "simple", "denoise": 1.0,
|
|
"model": ["37", 0],
|
|
"positive": ["6", 0],
|
|
"negative": ["7", 0],
|
|
"latent_image": ["40", 0]
|
|
}
|
|
},
|
|
"40": {
|
|
"class_type": "EmptyHunyuanLatentVideo",
|
|
"_meta": {"title": "Latent Video (33 frames)"},
|
|
"inputs": {"width": 832, "height": 480, "length": 33, "batch_size": 1}
|
|
},
|
|
"9": {
|
|
"class_type": "VHS_VideoCombine",
|
|
"_meta": {"title": "Video Combine"},
|
|
"inputs": {
|
|
"frame_rate": 16.0,
|
|
"loop_count": 0,
|
|
"filename_prefix": "wan_t2v",
|
|
"format": "video/h264-mp4",
|
|
"pingpong": false,
|
|
"save_output": true,
|
|
"images": ["8", 0]
|
|
}
|
|
}
|
|
}
|