diffusers-workflow 0.10.0__tar.gz → 0.11.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {diffusers_workflow-0.10.0/diffusers_workflow.egg-info → diffusers_workflow-0.11.0}/PKG-INFO +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0/diffusers_workflow.egg-info}/PKG-INFO +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/SOURCES.txt +40 -29
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/__init__.py +18 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/adapter_compatibility.py +8 -24
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/audio_qc.py +3 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/content_types.py +5 -17
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/dissolve_frame_errors.py +6 -18
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/ACCELERATION.md +4 -3
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/ARCHITECTURE.md +10 -6
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/MCP.md +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/RELEASING.md +76 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/SERVER.md +7 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/TASKS.md +41 -5
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/WORKFLOW_GUIDE.md +37 -13
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/dsp.py +29 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/elision.py +65 -9
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/events.py +3 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/for_each.py +60 -18
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/guides.py +59 -73
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/hold_audio.py +7 -35
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/hub_cache.py +58 -47
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/introspection.py +4 -18
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/kernel_availability.py +4 -19
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/locations.py +66 -53
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/media.py +33 -21
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/chain.py +61 -42
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/components.py +47 -32
- diffusers_workflow-0.11.0/dw/pipeline_processors/h3_guide_steps.py +542 -0
- diffusers_workflow-0.11.0/dw/pipeline_processors/h3_guides.py +305 -0
- diffusers_workflow-0.11.0/dw/pipeline_processors/h3_hold.py +227 -0
- diffusers_workflow-0.11.0/dw/pipeline_processors/h3_hold_steps.py +397 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/pipeline.py +62 -55
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/plan.py +46 -7
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/previous_results.py +6 -16
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/reference_limits.py +5 -17
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/reference_names.py +4 -15
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/references.py +46 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/scalar_result_validation.py +5 -19
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/script_lines.py +2 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/admission.py +57 -45
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/api_models.py +18 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/app.py +1 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/assess.py +24 -6
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/deps.py +82 -15
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/job_record.py +13 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/assets.py +30 -3
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/jobs.py +26 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/codicon-Brq4_Ui5.ttf → diffusers_workflow-0.11.0/dw/server/ui/assets/codicon-DF1abBS2.ttf +0 -0
- diffusers_workflow-0.10.0/dw/server/ui/assets/css.worker-B3ciXF_0.js → diffusers_workflow-0.11.0/dw/server/ui/assets/css.worker-C6lDtRpF.js +38 -35
- diffusers_workflow-0.10.0/dw/server/ui/assets/cssMode-wXe774OW.js → diffusers_workflow-0.11.0/dw/server/ui/assets/cssMode-ukxfz-ce.js +1 -1
- diffusers_workflow-0.11.0/dw/server/ui/assets/editor-DjpsE8to.css +1 -0
- diffusers_workflow-0.11.0/dw/server/ui/assets/editor.api-Bkt_tsj1.js +908 -0
- diffusers_workflow-0.11.0/dw/server/ui/assets/editor.worker-BmdWdrHZ.js +33 -0
- diffusers_workflow-0.10.0/dw/server/ui/assets/freemarker2-DR8uhCda.js → diffusers_workflow-0.11.0/dw/server/ui/assets/freemarker2-DbXygLvH.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/handlebars-D1n_Fhy1.js → diffusers_workflow-0.11.0/dw/server/ui/assets/handlebars-BdhZGoSz.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/html-BVJM2HQM.js → diffusers_workflow-0.11.0/dw/server/ui/assets/html-Chhg10Tp.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/html.worker-C93Ht9o9.js → diffusers_workflow-0.11.0/dw/server/ui/assets/html.worker-C5yZDBHz.js +29 -26
- diffusers_workflow-0.10.0/dw/server/ui/assets/htmlMode-Cb3bisrD.js → diffusers_workflow-0.11.0/dw/server/ui/assets/htmlMode-cC3JW4lx.js +1 -1
- diffusers_workflow-0.11.0/dw/server/ui/assets/index-BYEwBCrU.css +1 -0
- diffusers_workflow-0.11.0/dw/server/ui/assets/index-CkD0GJG0.js +46 -0
- diffusers_workflow-0.10.0/dw/server/ui/assets/javascript-DhyRtgFn.js → diffusers_workflow-0.11.0/dw/server/ui/assets/javascript-BWWLMkof.js +1 -1
- diffusers_workflow-0.11.0/dw/server/ui/assets/json.worker-DdeUAmHa.js +65 -0
- diffusers_workflow-0.10.0/dw/server/ui/assets/jsonMode-IURul1-R.js → diffusers_workflow-0.11.0/dw/server/ui/assets/jsonMode-DrC8C29V.js +2 -2
- diffusers_workflow-0.10.0/dw/server/ui/assets/liquid-CdeVzoDf.js → diffusers_workflow-0.11.0/dw/server/ui/assets/liquid-CXdQfmUT.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/lspLanguageFeatures-C7DVi-2z.js → diffusers_workflow-0.11.0/dw/server/ui/assets/lspLanguageFeatures-BgAhb71w.js +2 -2
- diffusers_workflow-0.10.0/dw/server/ui/assets/mdx-BDSAHpOx.js → diffusers_workflow-0.11.0/dw/server/ui/assets/mdx-CQS0lFaZ.js +1 -1
- diffusers_workflow-0.11.0/dw/server/ui/assets/monaco-Z_sI-RLU.js +58 -0
- diffusers_workflow-0.11.0/dw/server/ui/assets/monaco-n7clI0si.css +1 -0
- diffusers_workflow-0.10.0/dw/server/ui/assets/python-C6JhntrO.js → diffusers_workflow-0.11.0/dw/server/ui/assets/python-C9MtI630.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/razor-DUoZWg4e.js → diffusers_workflow-0.11.0/dw/server/ui/assets/razor-DPO5mHyR.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/ts.worker-D7T1-Ig5.js → diffusers_workflow-0.11.0/dw/server/ui/assets/ts.worker-DGGa2mF8.js +217 -214
- diffusers_workflow-0.10.0/dw/server/ui/assets/tsMode-CxKbOt5l.js → diffusers_workflow-0.11.0/dw/server/ui/assets/tsMode-D8vGBTVc.js +5 -5
- diffusers_workflow-0.10.0/dw/server/ui/assets/typescript-BYnQ0RjU.js → diffusers_workflow-0.11.0/dw/server/ui/assets/typescript-DyoEkQLT.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/workers-CqfSFzdX.js → diffusers_workflow-0.11.0/dw/server/ui/assets/workers-Bdewp_DS.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/xml-BTej-yKG.js → diffusers_workflow-0.11.0/dw/server/ui/assets/xml-DmmKOVWo.js +1 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/yaml-DLu_25Zn.js → diffusers_workflow-0.11.0/dw/server/ui/assets/yaml-C4jCTuer.js +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/index.html +2 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/shot_span_preflight.py +6 -18
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/slice_preflight.py +6 -18
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/step.py +52 -24
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/step_cache.py +23 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/step_value_checks.py +60 -93
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/subfolders.py +4 -18
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/task_domains.py +16 -626
- diffusers_workflow-0.11.0/dw/task_problems.py +631 -0
- diffusers_workflow-0.11.0/dw/tasks/audio_handlers.py +291 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/beats.py +3 -5
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/concat_videos.py +16 -17
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/cuts.py +375 -160
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/face_track.py +1 -1
- diffusers_workflow-0.11.0/dw/tasks/finish_handlers.py +207 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/image_utils.py +2 -3
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/joins.py +3 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/lut.py +2 -2
- diffusers_workflow-0.11.0/dw/tasks/measure_sync.py +198 -0
- diffusers_workflow-0.11.0/dw/tasks/model_handlers.py +319 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/registry.py +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/script_check.py +96 -61
- diffusers_workflow-0.11.0/dw/tasks/task.py +367 -0
- diffusers_workflow-0.11.0/dw/tasks/video_handlers.py +383 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/type_references.py +7 -32
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/validation.py +5 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/video_extensions.py +61 -16
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/video_size_errors.py +6 -18
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/vram_inheritance.py +45 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/window_count_errors.py +6 -18
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflow_run.py +4 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflow_schema.json +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/assets.py +30 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/diagnose.py +10 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/media.py +39 -31
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/prompts.py +4 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/tools_authoring.py +7 -7
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/tools_jobs.py +6 -8
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/tools_media.py +25 -15
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/pyproject.toml +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_analyze_beats.py +2 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_catalog_structure.py +5 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_elision.py +63 -3
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_face_track.py +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_finish.py +2 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_for_each.py +79 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_guides.py +33 -43
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_hold_audio.py +42 -8
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_refine.py +4 -2
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_rules.py +16 -4
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_schedule.py +28 -0
- diffusers_workflow-0.11.0/tests/test_inductor_cache_default.py +58 -0
- diffusers_workflow-0.11.0/tests/test_inherited_cost.py +195 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_job_progress.py +37 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_assets.py +24 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_prompts.py +23 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_twins.py +1 -0
- diffusers_workflow-0.11.0/tests/test_measure_sync.py +120 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_plan.py +41 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_plan_cuts.py +8 -7
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_plugin_skills.py +5 -3
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_references.py +33 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_restore_faces_video.py +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_result.py +2 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_script_check.py +2 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_assess.py +22 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_library_path.py +17 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_speech_generation.py +1 -1
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_step_cache.py +66 -13
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_domains.py +7 -7
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_registry_rules.py +12 -10
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_video_extensions.py +79 -0
- diffusers_workflow-0.10.0/dw/pipeline_processors/h3_guides.py +0 -790
- diffusers_workflow-0.10.0/dw/pipeline_processors/h3_hold.py +0 -609
- diffusers_workflow-0.10.0/dw/server/ui/assets/editor-jjEx9u7D.css +0 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/editor.api-DqvgVCmU.js +0 -847
- diffusers_workflow-0.10.0/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -30
- diffusers_workflow-0.10.0/dw/server/ui/assets/index-BxCxre0j.css +0 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/index-Bxcur2S3.js +0 -45
- diffusers_workflow-0.10.0/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -62
- diffusers_workflow-0.10.0/dw/server/ui/assets/monaco--ixms01u.css +0 -1
- diffusers_workflow-0.10.0/dw/server/ui/assets/monaco-B8zQveVO.js +0 -56
- diffusers_workflow-0.10.0/dw/tasks/task.py +0 -1471
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/LICENSE +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/MANIFEST.in +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/README.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/requires.txt +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/argument_media.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/argument_warnings.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/arguments.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/assessment_rules.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/assets.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/cache_blocks.json +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/cache_blocks.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/community_pipelines/pipeline_ltx2_refine.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/devices.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/AGENT_LOOP.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/DEPENDENCIES.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/IP_ADAPTER.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/LORAS.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/QUANTIZATION.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/RECIPES_24GB.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/REMOTE.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/SECURITY.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/TESTING.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/WORKER_GUIDE.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/WORKSPACES.md +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/download_watch.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/host_memory.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/host_memory_projection.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/library.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/log_setup.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/lora_catalog.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/lora_catalog_schema.json +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/lora_hub.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/media_frames.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/media_types.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/outbound.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/output_extraction.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/path_redaction.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_ownership.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/adapters.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/config_objects.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/h3_rules.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/placement.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/progress.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/remote.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/probe_paths.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/prompt_schema.json +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/prompt_weighting.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/prompts.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/realize.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/result.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/run.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/runs.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/schema.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/security.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/serve.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/__init__.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/catalog.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/catalog_shape.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/enhancers.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/exports.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/guides.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/http_security.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/inline_media.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/job_history.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/job_results.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/jobs.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/mcp_mount.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/netinfo.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/observed_cost.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/outputs.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/pool.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/__init__.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/files.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/gallery.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/library.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/loras.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/media.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/system.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/sysinfo.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/updater.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/worker_memory.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/settings.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/shots.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/assess.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/audio_dynamics.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/audio_transcription.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/audio_utils.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/background_remover.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/borders.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/compose_text.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/depth_estimator.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/diffusion_upscale.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/dissolve_videos.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/finish.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/fit.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/format_messages.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/gather.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/grade.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/h3_latent_upscale.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/h3_latent_upscaler_model.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/image_ops.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/image_to_text.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/interpolate_frames.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/join_into_song.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/judge.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/loop_bed.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/model_cache.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/pair_audio.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/qr_code.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/restore_faces.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/rife_model.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/segment.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/select.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/speech_generation.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/stabilize.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/tensor_image.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/text_generation.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/text_sections.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/trim.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/upscale.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/video_utils.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/voice_attribution.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/windows.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/zoe_depth.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/test.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/trust.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/type_helpers.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/validate.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/variable_constraints.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/variables.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/vram_estimate.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/worker.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/worker_manager.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/worker_protocol.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflow.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflows/h3_context_ir.json +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflows/test.json +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workspace.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/writers.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/__init__.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/__main__.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/authoring.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/catalog.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/client.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/confine.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/exports.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/guides.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/loras.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/models.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/server.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/tools_catalog.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/workspaces.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/setup.cfg +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_admission.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_admission_capacity.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_api_contract.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_arch_metrics.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_arch_report.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_architecture_map.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_argument_updates.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_arguments.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_assess.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_assessment_rules.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_assets.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_attention_slicing.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_audio_utils.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_best_of_n_template.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_borders.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_cache_blocks.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_catalog_shape.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_chain.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ci_config.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_cli.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_component_name_errors.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_component_pruning.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_component_type_errors.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_compose_text.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_concat_videos.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_config_objects.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_configuration_schema.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_content_types.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_depth_estimator.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_device.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_device_helpers.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_device_portability.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_dialogue_short_voices.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_diffusion_upscale.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_dissolve_videos.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_docs_links.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_download_watch.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_dsp.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_events.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_examples.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_find_loop_bed.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_fit_templates.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_fit_to_model.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_gather.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_grade.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_guide_chain_validation.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_guides_validation.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_adapters.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_context_ir.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_latent_upscale.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_upscaler_source.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_vram_ceiling.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_hf_placement.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_host_memory.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_host_memory_projection.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_hub_cache.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_image_ops.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_image_to_text.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_image_utils.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ingredients_grid.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_integration.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_interpolate_frames.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_introspection.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_job_history_device.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_job_history_wal.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_job_warnings.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_jobs_listing.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_jobs_reused.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_join_into_song.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_join_windows.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_judge.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_kernel_availability.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_library_path.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_library_sources.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_list_images.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_locations.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_alpha.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_catalog.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_disable.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_hub.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_library.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx2_diffusion_decode.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx2_extend_clip.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx2_ic_loras.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx2_refine_pipeline.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx_prompt_library.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lut.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_authoring.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_catalog.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_client.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_confine.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_diagnose.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_exports.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_guides.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_loras.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_main.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_media.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_models.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_server.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_workspaces.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_media_audio.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_media_frames.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_media_info.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_media_layering.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mix_audio.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_model_cache.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_modular_output_properties.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_modular_pipeline.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_modular_progress.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mps_fallback_warning.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mps_rope_precision.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_null_media.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_numeric_coercion.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_observed_cost.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_offload_placement.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_outbound.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_output_references.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_pair_audio.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_pair_audio_fit.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_parallel_loading_default.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_path_redaction.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_phase_events.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_pipeline_caching.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_pipeline_components.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prepare_pipeline.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_previous_result_walker_parity.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_previous_results.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompt_library.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompt_parser.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompt_references.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompt_weighting.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompts.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_read_frame_range.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_real_models.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_realize.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_recenter_crop.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_reference_limits.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_reference_names.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_reference_skip_sets.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_rerun_new_seed.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_resize_bucket.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_result_fps.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_result_output_naming.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_rule_parity.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_runs.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_scalar_result_validation.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_scheduler_config.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_schema.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_auth.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_decoder_bombs.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_input_caps.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_ssrf.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_symlinks.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_trust_gate.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_web_headers.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_segment.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_select.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_select_validation.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_separate_stems.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_serve_main.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_downloads.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_exports.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_gallery_image.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_guides.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_info.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_jobs.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_loras.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_mcp.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_workspaces.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_shaping_logs.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_shot_span_preflight.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_shots.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_slice_preflight.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_stabilize.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_step.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_strip_exif_and_watermark.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_sub_workflow_resolver.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_subfolders.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_discovery.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_public_imports.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_signature_errors.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_template_defaults.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_template_subfolders.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_tensor_image.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_text_generation.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_text_sections.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_transcribe_audio.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_trim_video.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_type_helpers.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_type_helpers_concurrency.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ui_twins.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_updater.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_validate_arguments.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_validation.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_variable_constraints.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_variables.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_video_size_errors.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_video_utils.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_voice_attribution.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_vram_estimate.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_vram_guides.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_vram_inheritance.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_window_count_errors.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_window_video.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_execute.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_job_peak_rss.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_manager.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_messages.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_pool.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workflow.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workflow_snapshot.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workflow_step_cache.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workflow_trust.py +0 -0
- {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workspace.py +0 -0
{diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/SOURCES.txt
RENAMED
|
@@ -73,6 +73,7 @@ dw/step_cache.py
|
|
|
73
73
|
dw/step_value_checks.py
|
|
74
74
|
dw/subfolders.py
|
|
75
75
|
dw/task_domains.py
|
|
76
|
+
dw/task_problems.py
|
|
76
77
|
dw/test.py
|
|
77
78
|
dw/trust.py
|
|
78
79
|
dw/type_helpers.py
|
|
@@ -120,8 +121,10 @@ dw/pipeline_processors/adapters.py
|
|
|
120
121
|
dw/pipeline_processors/chain.py
|
|
121
122
|
dw/pipeline_processors/components.py
|
|
122
123
|
dw/pipeline_processors/config_objects.py
|
|
124
|
+
dw/pipeline_processors/h3_guide_steps.py
|
|
123
125
|
dw/pipeline_processors/h3_guides.py
|
|
124
126
|
dw/pipeline_processors/h3_hold.py
|
|
127
|
+
dw/pipeline_processors/h3_hold_steps.py
|
|
125
128
|
dw/pipeline_processors/h3_rules.py
|
|
126
129
|
dw/pipeline_processors/pipeline.py
|
|
127
130
|
dw/pipeline_processors/placement.py
|
|
@@ -169,52 +172,52 @@ dw/server/ui/assets/bat-i0X4ZdIN.js
|
|
|
169
172
|
dw/server/ui/assets/bicep-B5-_aFwp.js
|
|
170
173
|
dw/server/ui/assets/cameligo-DMUM7wLl.js
|
|
171
174
|
dw/server/ui/assets/clojure-Cm7r79vr.js
|
|
172
|
-
dw/server/ui/assets/codicon-
|
|
175
|
+
dw/server/ui/assets/codicon-DF1abBS2.ttf
|
|
173
176
|
dw/server/ui/assets/coffee-Ba7i2nA0.js
|
|
174
177
|
dw/server/ui/assets/cpp-C7h46wYY.js
|
|
175
178
|
dw/server/ui/assets/csharp-BKxtCVv1.js
|
|
176
179
|
dw/server/ui/assets/csp-bTuwJoIa.js
|
|
177
180
|
dw/server/ui/assets/css-DIMkf-bt.js
|
|
178
|
-
dw/server/ui/assets/css.worker-
|
|
179
|
-
dw/server/ui/assets/cssMode-
|
|
181
|
+
dw/server/ui/assets/css.worker-C6lDtRpF.js
|
|
182
|
+
dw/server/ui/assets/cssMode-ukxfz-ce.js
|
|
180
183
|
dw/server/ui/assets/cypher-CVaqCwHa.js
|
|
181
184
|
dw/server/ui/assets/dart-onAF5SnQ.js
|
|
182
185
|
dw/server/ui/assets/dockerfile-DZFCIeNp.js
|
|
183
186
|
dw/server/ui/assets/ecl-D05T4iGw.js
|
|
184
|
-
dw/server/ui/assets/editor-
|
|
185
|
-
dw/server/ui/assets/editor.api-
|
|
186
|
-
dw/server/ui/assets/editor.worker-
|
|
187
|
+
dw/server/ui/assets/editor-DjpsE8to.css
|
|
188
|
+
dw/server/ui/assets/editor.api-Bkt_tsj1.js
|
|
189
|
+
dw/server/ui/assets/editor.worker-BmdWdrHZ.js
|
|
187
190
|
dw/server/ui/assets/elixir-6RTg0lbw.js
|
|
188
191
|
dw/server/ui/assets/flow9-C5_-GSwl.js
|
|
189
|
-
dw/server/ui/assets/freemarker2-
|
|
192
|
+
dw/server/ui/assets/freemarker2-DbXygLvH.js
|
|
190
193
|
dw/server/ui/assets/fsharp-C8Ef5oNN.js
|
|
191
194
|
dw/server/ui/assets/go-C-y9NEjX.js
|
|
192
195
|
dw/server/ui/assets/graphql-fmXr3nnJ.js
|
|
193
|
-
dw/server/ui/assets/handlebars-
|
|
196
|
+
dw/server/ui/assets/handlebars-BdhZGoSz.js
|
|
194
197
|
dw/server/ui/assets/hcl-CpzslTdj.js
|
|
195
|
-
dw/server/ui/assets/html-
|
|
196
|
-
dw/server/ui/assets/html.worker-
|
|
197
|
-
dw/server/ui/assets/htmlMode-
|
|
198
|
-
dw/server/ui/assets/index-
|
|
199
|
-
dw/server/ui/assets/index-
|
|
198
|
+
dw/server/ui/assets/html-Chhg10Tp.js
|
|
199
|
+
dw/server/ui/assets/html.worker-C5yZDBHz.js
|
|
200
|
+
dw/server/ui/assets/htmlMode-cC3JW4lx.js
|
|
201
|
+
dw/server/ui/assets/index-BYEwBCrU.css
|
|
202
|
+
dw/server/ui/assets/index-CkD0GJG0.js
|
|
200
203
|
dw/server/ui/assets/ini-sBoK_t0W.js
|
|
201
204
|
dw/server/ui/assets/java-BEtHBSE6.js
|
|
202
|
-
dw/server/ui/assets/javascript-
|
|
203
|
-
dw/server/ui/assets/json.worker-
|
|
204
|
-
dw/server/ui/assets/jsonMode-
|
|
205
|
+
dw/server/ui/assets/javascript-BWWLMkof.js
|
|
206
|
+
dw/server/ui/assets/json.worker-DdeUAmHa.js
|
|
207
|
+
dw/server/ui/assets/jsonMode-DrC8C29V.js
|
|
205
208
|
dw/server/ui/assets/julia-Bri6UV-V.js
|
|
206
209
|
dw/server/ui/assets/kotlin-BOotOW0E.js
|
|
207
210
|
dw/server/ui/assets/less-B9JPFI3C.js
|
|
208
211
|
dw/server/ui/assets/lexon-CfSJPG6W.js
|
|
209
|
-
dw/server/ui/assets/liquid-
|
|
210
|
-
dw/server/ui/assets/lspLanguageFeatures-
|
|
212
|
+
dw/server/ui/assets/liquid-CXdQfmUT.js
|
|
213
|
+
dw/server/ui/assets/lspLanguageFeatures-BgAhb71w.js
|
|
211
214
|
dw/server/ui/assets/lua-CsQS60Ue.js
|
|
212
215
|
dw/server/ui/assets/m3-D-oSqn_W.js
|
|
213
216
|
dw/server/ui/assets/markdown-Cimd5fb3.js
|
|
214
|
-
dw/server/ui/assets/mdx-
|
|
217
|
+
dw/server/ui/assets/mdx-CQS0lFaZ.js
|
|
215
218
|
dw/server/ui/assets/mips-CIPQ_RoX.js
|
|
216
|
-
dw/server/ui/assets/monaco
|
|
217
|
-
dw/server/ui/assets/monaco-
|
|
219
|
+
dw/server/ui/assets/monaco-Z_sI-RLU.js
|
|
220
|
+
dw/server/ui/assets/monaco-n7clI0si.css
|
|
218
221
|
dw/server/ui/assets/msdax-DauUninz.js
|
|
219
222
|
dw/server/ui/assets/mysql-SOo6toE5.js
|
|
220
223
|
dw/server/ui/assets/objective-c-FvmIjYaQ.js
|
|
@@ -229,10 +232,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
|
|
|
229
232
|
dw/server/ui/assets/powershell-DmHpPYUd.js
|
|
230
233
|
dw/server/ui/assets/protobuf-C531GsRP.js
|
|
231
234
|
dw/server/ui/assets/pug-Z5eAx3Zn.js
|
|
232
|
-
dw/server/ui/assets/python-
|
|
235
|
+
dw/server/ui/assets/python-C9MtI630.js
|
|
233
236
|
dw/server/ui/assets/qsharp-DkqhCAOL.js
|
|
234
237
|
dw/server/ui/assets/r-BwWrilGY.js
|
|
235
|
-
dw/server/ui/assets/razor-
|
|
238
|
+
dw/server/ui/assets/razor-DPO5mHyR.js
|
|
236
239
|
dw/server/ui/assets/redis-ClamHrr6.js
|
|
237
240
|
dw/server/ui/assets/redshift-DT7zqm-g.js
|
|
238
241
|
dw/server/ui/assets/restructuredtext-BYgofb2h.js
|
|
@@ -251,18 +254,19 @@ dw/server/ui/assets/st-DbInun42.js
|
|
|
251
254
|
dw/server/ui/assets/swift-Bxkupp3x.js
|
|
252
255
|
dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
|
|
253
256
|
dw/server/ui/assets/tcl-DISqw1ZD.js
|
|
254
|
-
dw/server/ui/assets/ts.worker-
|
|
255
|
-
dw/server/ui/assets/tsMode-
|
|
257
|
+
dw/server/ui/assets/ts.worker-DGGa2mF8.js
|
|
258
|
+
dw/server/ui/assets/tsMode-D8vGBTVc.js
|
|
256
259
|
dw/server/ui/assets/twig-De2hgUGE.js
|
|
257
|
-
dw/server/ui/assets/typescript-
|
|
260
|
+
dw/server/ui/assets/typescript-DyoEkQLT.js
|
|
258
261
|
dw/server/ui/assets/typespec-B8J7ngcE.js
|
|
259
262
|
dw/server/ui/assets/vb-DV3o63ZY.js
|
|
260
263
|
dw/server/ui/assets/wgsl-DpFanUEy.js
|
|
261
|
-
dw/server/ui/assets/workers-
|
|
262
|
-
dw/server/ui/assets/xml-
|
|
263
|
-
dw/server/ui/assets/yaml-
|
|
264
|
+
dw/server/ui/assets/workers-Bdewp_DS.js
|
|
265
|
+
dw/server/ui/assets/xml-DmmKOVWo.js
|
|
266
|
+
dw/server/ui/assets/yaml-C4jCTuer.js
|
|
264
267
|
dw/tasks/assess.py
|
|
265
268
|
dw/tasks/audio_dynamics.py
|
|
269
|
+
dw/tasks/audio_handlers.py
|
|
266
270
|
dw/tasks/audio_transcription.py
|
|
267
271
|
dw/tasks/audio_utils.py
|
|
268
272
|
dw/tasks/background_remover.py
|
|
@@ -276,6 +280,7 @@ dw/tasks/diffusion_upscale.py
|
|
|
276
280
|
dw/tasks/dissolve_videos.py
|
|
277
281
|
dw/tasks/face_track.py
|
|
278
282
|
dw/tasks/finish.py
|
|
283
|
+
dw/tasks/finish_handlers.py
|
|
279
284
|
dw/tasks/fit.py
|
|
280
285
|
dw/tasks/format_messages.py
|
|
281
286
|
dw/tasks/gather.py
|
|
@@ -291,7 +296,9 @@ dw/tasks/joins.py
|
|
|
291
296
|
dw/tasks/judge.py
|
|
292
297
|
dw/tasks/loop_bed.py
|
|
293
298
|
dw/tasks/lut.py
|
|
299
|
+
dw/tasks/measure_sync.py
|
|
294
300
|
dw/tasks/model_cache.py
|
|
301
|
+
dw/tasks/model_handlers.py
|
|
295
302
|
dw/tasks/pair_audio.py
|
|
296
303
|
dw/tasks/qr_code.py
|
|
297
304
|
dw/tasks/registry.py
|
|
@@ -308,6 +315,7 @@ dw/tasks/text_generation.py
|
|
|
308
315
|
dw/tasks/text_sections.py
|
|
309
316
|
dw/tasks/trim.py
|
|
310
317
|
dw/tasks/upscale.py
|
|
318
|
+
dw/tasks/video_handlers.py
|
|
311
319
|
dw/tasks/video_utils.py
|
|
312
320
|
dw/tasks/voice_attribution.py
|
|
313
321
|
dw/tasks/windows.py
|
|
@@ -406,7 +414,9 @@ tests/test_hub_cache.py
|
|
|
406
414
|
tests/test_image_ops.py
|
|
407
415
|
tests/test_image_to_text.py
|
|
408
416
|
tests/test_image_utils.py
|
|
417
|
+
tests/test_inductor_cache_default.py
|
|
409
418
|
tests/test_ingredients_grid.py
|
|
419
|
+
tests/test_inherited_cost.py
|
|
410
420
|
tests/test_integration.py
|
|
411
421
|
tests/test_interpolate_frames.py
|
|
412
422
|
tests/test_introspection.py
|
|
@@ -451,6 +461,7 @@ tests/test_mcp_prompts.py
|
|
|
451
461
|
tests/test_mcp_server.py
|
|
452
462
|
tests/test_mcp_twins.py
|
|
453
463
|
tests/test_mcp_workspaces.py
|
|
464
|
+
tests/test_measure_sync.py
|
|
454
465
|
tests/test_media_audio.py
|
|
455
466
|
tests/test_media_frames.py
|
|
456
467
|
tests/test_media_info.py
|
|
@@ -48,6 +48,24 @@ def _parallel_loading_default(platform):
|
|
|
48
48
|
if "HF_ENABLE_PARALLEL_LOADING" not in os.environ:
|
|
49
49
|
os.environ["HF_ENABLE_PARALLEL_LOADING"] = _parallel_loading_default(sys.platform)
|
|
50
50
|
|
|
51
|
+
|
|
52
|
+
def _inductor_cache_dir_default(environ):
|
|
53
|
+
"""Where torch.compile keeps its on-disk cache.
|
|
54
|
+
|
|
55
|
+
Inductor's own default is /tmp/torchinductor_<user>, which a reboot wipes.
|
|
56
|
+
A fresh worker always retraces, but a cache hit skips codegen and kernel
|
|
57
|
+
builds - most of a cold compile, about 90s of MiniMax-H3's first step on a
|
|
58
|
+
3090 - so the user's cache directory keeps that paid once per shape rather
|
|
59
|
+
than once per boot. An empty XDG_CACHE_HOME counts as unset, per the spec."""
|
|
60
|
+
base = environ.get("XDG_CACHE_HOME") or os.path.join(
|
|
61
|
+
os.path.expanduser("~"), ".cache"
|
|
62
|
+
)
|
|
63
|
+
return os.path.join(base, "dw", "torchinductor")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if "TORCHINDUCTOR_CACHE_DIR" not in os.environ:
|
|
67
|
+
os.environ["TORCHINDUCTOR_CACHE_DIR"] = _inductor_cache_dir_default(os.environ)
|
|
68
|
+
|
|
51
69
|
# Suppress all common library warnings before any imports
|
|
52
70
|
warnings.filterwarnings("ignore", category=FutureWarning)
|
|
53
71
|
warnings.filterwarnings("ignore", category=UserWarning)
|
|
@@ -30,7 +30,7 @@ names and the partition each one denoises against are diffusers' own, and
|
|
|
30
30
|
import logging
|
|
31
31
|
|
|
32
32
|
from . import references
|
|
33
|
-
from .references import
|
|
33
|
+
from .references import render_path
|
|
34
34
|
|
|
35
35
|
logger = logging.getLogger("dw")
|
|
36
36
|
|
|
@@ -109,13 +109,9 @@ def _lora_problems(steps, source_indices, written=None, supplied=()):
|
|
|
109
109
|
"""
|
|
110
110
|
written_steps = (written or {}).get("steps")
|
|
111
111
|
found = []
|
|
112
|
-
for
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
pipeline = step.get("pipeline")
|
|
116
|
-
if not isinstance(pipeline, dict):
|
|
117
|
-
continue
|
|
118
|
-
source = references.author_index(source_indices, index)
|
|
112
|
+
for _, _, pipeline, source, where in references.iter_steps(
|
|
113
|
+
steps, source_indices, "pipeline"
|
|
114
|
+
):
|
|
119
115
|
from_pretrained = pipeline.get(FROM_PRETRAINED_KEY)
|
|
120
116
|
workflow = (
|
|
121
117
|
from_pretrained.get(WORKFLOW_KEY)
|
|
@@ -127,12 +123,6 @@ def _lora_problems(steps, source_indices, written=None, supplied=()):
|
|
|
127
123
|
loras = pipeline.get(LORAS_KEY)
|
|
128
124
|
if not isinstance(loras, list):
|
|
129
125
|
continue
|
|
130
|
-
name = step.get("name")
|
|
131
|
-
where = (
|
|
132
|
-
f" in member '{name}'"
|
|
133
|
-
if isinstance(name, str) and MEMBER_SEPARATOR in name
|
|
134
|
-
else ""
|
|
135
|
-
)
|
|
136
126
|
for position, lora in enumerate(loras):
|
|
137
127
|
if not isinstance(lora, dict):
|
|
138
128
|
continue
|
|
@@ -212,18 +202,12 @@ def _disabled_loras(steps, source_indices, written=None, supplied=()):
|
|
|
212
202
|
engine's, and so is saying that it was used."""
|
|
213
203
|
written_steps = (written or {}).get("steps")
|
|
214
204
|
found = []
|
|
215
|
-
for
|
|
216
|
-
|
|
217
|
-
|
|
205
|
+
for _, _, pipeline, source, where in references.iter_steps(
|
|
206
|
+
steps, source_indices, "pipeline"
|
|
207
|
+
):
|
|
208
|
+
loras = pipeline.get(LORAS_KEY)
|
|
218
209
|
if not isinstance(loras, list):
|
|
219
210
|
continue
|
|
220
|
-
source = references.author_index(source_indices, index)
|
|
221
|
-
name = step.get("name")
|
|
222
|
-
where = (
|
|
223
|
-
f" in member '{name}'"
|
|
224
|
-
if isinstance(name, str) and MEMBER_SEPARATOR in name
|
|
225
|
-
else ""
|
|
226
|
-
)
|
|
227
211
|
for position, lora in enumerate(loras):
|
|
228
212
|
if not isinstance(lora, dict) or lora.get(MODEL_NAME_KEY) is not None:
|
|
229
213
|
continue
|
|
@@ -174,7 +174,9 @@ def warn_if_written_above_full_scale(
|
|
|
174
174
|
f"the file is written: a 'normalize_audio' step at 'peak_dbfs: -3' "
|
|
175
175
|
f"ahead of the step that saves it (a template's intermediate shot has "
|
|
176
176
|
f"no such step to edit: set the join's 'match_levels' instead). A "
|
|
177
|
-
f"mux into a video needs more of it than an audio file does."
|
|
177
|
+
f"mux into a video needs more of it than an audio file does. For a "
|
|
178
|
+
f"file already written, the 'relevel-clip' template re-levels it "
|
|
179
|
+
f"without a re-render.",
|
|
178
180
|
kind="audio_clipped",
|
|
179
181
|
file=name,
|
|
180
182
|
peak_dbfs=round(peak, 2),
|
|
@@ -29,7 +29,7 @@ import logging
|
|
|
29
29
|
import mimetypes
|
|
30
30
|
|
|
31
31
|
from . import references
|
|
32
|
-
from .references import
|
|
32
|
+
from .references import render_path
|
|
33
33
|
from .security import InvalidInputError, validate_content_type
|
|
34
34
|
|
|
35
35
|
logger = logging.getLogger("dw")
|
|
@@ -126,29 +126,17 @@ def content_type_errors(workflow_definition, source_indices=None):
|
|
|
126
126
|
several, and the path an error carries has to be one the author can
|
|
127
127
|
find in the file they wrote; the member is named in the message.
|
|
128
128
|
"""
|
|
129
|
-
steps = workflow_definition.get("steps")
|
|
130
|
-
if not isinstance(steps, list):
|
|
131
|
-
return []
|
|
132
|
-
|
|
133
129
|
errors = []
|
|
134
|
-
for
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if not isinstance(result, dict) or CONTENT_TYPE_KEY not in result:
|
|
130
|
+
for _, _, result, source, where in references.iter_steps(
|
|
131
|
+
workflow_definition.get("steps"), source_indices, "result"
|
|
132
|
+
):
|
|
133
|
+
if CONTENT_TYPE_KEY not in result:
|
|
139
134
|
continue
|
|
140
135
|
value = result[CONTENT_TYPE_KEY]
|
|
141
136
|
# A prefix substitution resolves before this pass: one still spelled
|
|
142
137
|
# out is the undeclared-variable pass's complaint, not a shape error
|
|
143
138
|
if references.is_ref(references.SUBSTITUTED, value):
|
|
144
139
|
continue
|
|
145
|
-
source = references.author_index(source_indices, index)
|
|
146
|
-
name = step.get("name")
|
|
147
|
-
where = (
|
|
148
|
-
f" in member '{name}'"
|
|
149
|
-
if isinstance(name, str) and MEMBER_SEPARATOR in name
|
|
150
|
-
else ""
|
|
151
|
-
)
|
|
152
140
|
fault = content_type_fault(value)
|
|
153
141
|
if fault is not None:
|
|
154
142
|
errors.append(
|
|
@@ -31,10 +31,10 @@ its window to the shortest side (`crossfade_concat`) - a different, and
|
|
|
31
31
|
already silent, shape of problem with no run-time error to move earlier.
|
|
32
32
|
"""
|
|
33
33
|
|
|
34
|
-
from .for_each import
|
|
34
|
+
from .for_each import render_path
|
|
35
35
|
from .media import probe_metadata
|
|
36
36
|
from .probe_paths import resolve_probe_path
|
|
37
|
-
from .references import
|
|
37
|
+
from .references import iter_steps
|
|
38
38
|
from .task_domains import dissolve_shortfalls
|
|
39
39
|
|
|
40
40
|
|
|
@@ -63,16 +63,11 @@ def dissolve_frame_errors(
|
|
|
63
63
|
a memoizing wrapper so a file referenced by more than one check is
|
|
64
64
|
probed once per validation rather than once per check.
|
|
65
65
|
"""
|
|
66
|
-
steps = workflow_definition.get("steps")
|
|
67
|
-
if not isinstance(steps, list):
|
|
68
|
-
return []
|
|
69
|
-
|
|
70
66
|
errors = []
|
|
71
|
-
for
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
task
|
|
75
|
-
if not isinstance(task, dict) or task.get("command") != "dissolve_videos":
|
|
67
|
+
for _, _, task, source, where in iter_steps(
|
|
68
|
+
workflow_definition.get("steps"), source_indices, "task"
|
|
69
|
+
):
|
|
70
|
+
if task.get("command") != "dissolve_videos":
|
|
76
71
|
continue
|
|
77
72
|
arguments = task.get("arguments")
|
|
78
73
|
if not isinstance(arguments, dict):
|
|
@@ -96,13 +91,6 @@ def dissolve_frame_errors(
|
|
|
96
91
|
if not problems:
|
|
97
92
|
continue
|
|
98
93
|
|
|
99
|
-
source = author_index(source_indices, index)
|
|
100
|
-
name = step.get("name")
|
|
101
|
-
where = (
|
|
102
|
-
f" in member '{name}'"
|
|
103
|
-
if isinstance(name, str) and MEMBER_SEPARATOR in name
|
|
104
|
-
else ""
|
|
105
|
-
)
|
|
106
94
|
errors.append(
|
|
107
95
|
{
|
|
108
96
|
"path": render_path(
|
|
@@ -134,7 +134,7 @@ Select the attention implementation diffusers uses for the duration of each pipe
|
|
|
134
134
|
}
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
Common values: `"flash"`, `"flash_hub"`, `"sage"`, `"sage_hub"`, `"native"`, `"flex"`. The full set is diffusers' `AttentionBackendName` enum - availability depends on what's installed (`flash-attn`, `sageattention`, etc.) and the platform. `_hub`-suffixed backends are fetched from the Hugging Face Hub kernel registry on first use, which needs the `kernels` package installed (`pip install kernels`) - it is not a dw dependency, and no bundled workflow sets a backend, so each runs on a plain install.
|
|
137
|
+
Common values: `"flash"`, `"flash_hub"`, `"sage"`, `"sage_hub"`, `"native"`, `"flex"`. The full set is diffusers' `AttentionBackendName` enum - availability depends on what's installed (`flash-attn`, `sageattention`, etc.) and the platform. `_hub`-suffixed backends are fetched from the Hugging Face Hub kernel registry on first use, which needs the `kernels` package installed (`pip install kernels`) - it is not a dw dependency, and no bundled workflow sets a backend, so each runs on a plain install. diffusers also refuses a Hub kernel whose publisher it does not list as trusted - `sage_hub` among them, since SageAttention 2 comes from `SageAttention/sage-attention` - until `DIFFUSERS_TRUST_REMOTE_KERNELS=true`, which allows remote code from any such publisher. On an RTX 3090 `sage_hub` measured about 30% faster per MiniMax-H3 step (13.8 s against 19.2 s at 960x544x124, 54.7 s against 81.2 s at 345 frames); the local `sage` backend needs `sageattention>=2.1.1`, which PyPI does not carry.
|
|
138
138
|
|
|
139
139
|
A component can also pin its backend persistently instead, via `set_attention_backend`:
|
|
140
140
|
|
|
@@ -186,7 +186,7 @@ Compile a component once it is fully configured - the graph captures final dtype
|
|
|
186
186
|
|
|
187
187
|
Typical gains are 1.3-1.5x on diffusion transformers, and compilation stacks with the caches above. Notes:
|
|
188
188
|
|
|
189
|
-
- **First run pays the compile cost.** The [server](SERVER.md)'s persistent worker keeps compiled pipelines loaded between runs, so the cost is paid once per session rather than once per generation.
|
|
189
|
+
- **First run pays the compile cost.** The [server](SERVER.md)'s persistent worker keeps compiled pipelines loaded between runs, so the cost is paid once per session rather than once per generation. A new session still retraces, but the kernels it built come back from the on-disk cache, which dw keeps across reboots (`TORCHINDUCTOR_CACHE_DIR`, see [Environment Defaults](#environment-defaults)).
|
|
190
190
|
- **Pin the attention backend** on a compiled component (`"attention_backend"` in the same `components` entry) rather than using the pipeline-level per-call context manager, which forces recompiles.
|
|
191
191
|
- **Composes with offloading**: apply `group_offload` and `compile` on the same component and the offload hooks are installed first, as required. Skipped with a warning on MPS.
|
|
192
192
|
- **Don't combine `fullgraph` with a `cache`**: the cache hooks decide skip-or-compute per step, a data-dependent branch diffusers wraps in `torch.compiler.disable` - it needs the graph break that `fullgraph: true` forbids. Compile with the default (partial) graph mode when a cache is active.
|
|
@@ -272,13 +272,14 @@ Device-level settings, read once at startup from `~/.diffusers_helper/settings.j
|
|
|
272
272
|
|
|
273
273
|
## Environment Defaults
|
|
274
274
|
|
|
275
|
-
Set automatically at import unless already present in the environment (export your own value to override):
|
|
275
|
+
Set automatically at import unless already present in the environment (export your own value to override, or put it in a `.env` file in the directory dw starts from - [.env.example](../.env.example) lists these and the other knobs worth knowing: the Hub, diffusers, transformers and SDNQ):
|
|
276
276
|
|
|
277
277
|
| Variable | Default | Effect |
|
|
278
278
|
| -------- | ------- | ------ |
|
|
279
279
|
| `PYTORCH_CUDA_ALLOC_CONF` | `expandable_segments:True` | Lets the CUDA allocator grow segments instead of fragmenting fixed-size ones. Multi-step workflows churn differently-shaped allocations (generate, upscale, interpolate); fragmentation is what OOMs a card that nominally has room. |
|
|
280
280
|
| `HF_ENABLE_PARALLEL_LOADING` | `true` | Loads sharded checkpoints in parallel - faster cold starts. |
|
|
281
281
|
| `PYTORCH_MPS_HIGH_WATERMARK_RATIO` | `0.0` | MPS only - use all available unified memory. |
|
|
282
|
+
| `TORCHINDUCTOR_CACHE_DIR` | `$XDG_CACHE_HOME/dw/torchinductor` (`~/.cache/dw/torchinductor`) | Keeps `torch.compile`'s on-disk cache across reboots - Inductor's own default is under `/tmp`. A new worker still retraces, but a cache hit skips codegen and kernel builds, the bulk of a cold compile. Entries are per shape, so a new size or frame count compiles once more. |
|
|
282
283
|
|
|
283
284
|
For faster model downloads, optionally `pip install hf_transfer` and set `HF_HUB_ENABLE_HF_TRANSFER=1`. Not enabled automatically - it bypasses the Python HTTP stack and breaks some proxy setups.
|
|
284
285
|
|
|
@@ -31,11 +31,12 @@ one to open.
|
|
|
31
31
|
| LoRAs | `dw/pipeline_processors/adapters.py`: `active_loras`, `load_loras` | A `loras` entry whose `model_name` is null is switched off. | `tests/test_lora_disable.py::TestLoadLoras::test_an_all_null_entry_loads_nothing` |
|
|
32
32
|
| Step progress | `dw/pipeline_processors/progress.py`: `reported_progress_bars` | A pipeline with no step callback reports its denoise steps through its progress bars. | `tests/test_modular_progress.py::test_every_advance_of_the_bar_is_reported` |
|
|
33
33
|
| Community pipelines | `dw/community_pipelines/` (e.g. `pipeline_ltx2_refine.py`: `LTX2RefinePipeline`), `dw/introspection.py`: `community_pipelines`, `load_allowed_class` | A pipeline dw ships is named by its dotted path (`dw.community_pipelines.<module>.<Class>`), loads untrusted because it is under `dw`, and is listed by `list_pipelines` and resolved by `get_pipeline_signature` - only the modules in that directory, never a caller-chosen import. `LTX2RefinePipeline` VAE-encodes `video` at `width` x `height` and passes it unnormalized as `latents`, because `LTX2Pipeline.prepare_latents` normalizes 5-D latents itself. | `tests/test_ltx2_refine_pipeline.py::TestIntrospection::test_only_the_shipped_modules_resolve`, `tests/test_ltx2_refine_pipeline.py::TestEncode::test_the_latents_are_left_unnormalized_for_the_parent` |
|
|
34
|
-
| Adding a task | `dw/tasks/registry.py`: `register_command`, `RegistryTable` | A task is a function registered with `@register_command`, and the signature of its implementation is its argument schema. Its validate-time rules are declared on the same decorator - `domains`, `choices`, `static_check`, `whole_numbers` and `media_arguments` - and `TASK_ARGUMENT_DOMAINS`, `TASK_ARGUMENT_CHOICES`, `TASK_STATIC_CHECKS`, `TASK_WHOLE_NUMBER_ARGUMENTS` and `TASK_MEDIA_ARGUMENTS` are read-only views derived from them, so there is no second table to forget (#692). The registry lives in `dw/tasks/registry.py`; `dw/tasks/task.py` re-exports it, and a task module may register its own handler, as `dw/tasks/beats.py` does, provided `dw/tasks/task.py` imports it (`docs/TASKS.md` *Adding a task*). | `tests/test_task_discovery.py::TestDescribeTask::test_signature_becomes_the_schema`, `tests/test_task_registry_rules.py::test_every_derived_table_is_the_registrys_view`, `tests/test_task_registry_rules.py::test_every_static_check_is_registered_to_exactly_one_command`, `tests/test_task_registry_rules.py::test_every_media_argument_is_a_parameter_of_its_command` |
|
|
35
|
-
| Task argument domains | `dw/task_domains.py`: `check_arguments`, `task_argument_errors` | A numeric domain that a signature cannot express is declared on the command's `@register_command(domains=...)`, and it is checked at validation and again at run time. A numeric argument is read by `whole_number` or `real_number`, the only numeric coercion in `dw/tasks/`, and validation applies the same rule (`number_problem`), so a value is refused at both or at neither: `"3.0"` is a whole number, `"3.5"` for one of `whole_numbers` is not, and `true` is no number (#774). `Task.run` coerces every declared argument through `coerce_arguments` before dispatch, so a handler sees a number, and an argument that has no range besides being a number declares `finite`. A command's cross-argument rules are its registered `static_check`, which `task_argument_errors` runs at validation (`attribute_voices`' `voices_argument_errors`, kept in `dw/tasks/voice_attribution.py`, among them). A literal enum choice (`choice_errors`)
|
|
34
|
+
| Adding a task | `dw/tasks/registry.py`: `register_command`, `RegistryTable` | A task is a function registered with `@register_command`, and the signature of its implementation is its argument schema. Its validate-time rules are declared on the same decorator - `domains`, `choices`, `static_check`, `whole_numbers` and `media_arguments` - and `TASK_ARGUMENT_DOMAINS`, `TASK_ARGUMENT_CHOICES`, `TASK_STATIC_CHECKS`, `TASK_WHOLE_NUMBER_ARGUMENTS` and `TASK_MEDIA_ARGUMENTS` are read-only views derived from them, so there is no second table to forget (#692). The registry lives in `dw/tasks/registry.py`; `dw/tasks/task.py` re-exports it, and a task module may register its own handler, as `dw/tasks/beats.py` does, provided `dw/tasks/task.py` imports it (`docs/TASKS.md` *Adding a task*). The built-in handlers are grouped by family the same way - `dw/tasks/audio_handlers.py`, `dw/tasks/video_handlers.py`, `dw/tasks/finish_handlers.py` and `dw/tasks/model_handlers.py` (#790) - and `dw/tasks/task.py` keeps the general-purpose commands, the processor dispatch and `Task`. | `tests/test_task_discovery.py::TestDescribeTask::test_signature_becomes_the_schema`, `tests/test_task_registry_rules.py::test_every_derived_table_is_the_registrys_view`, `tests/test_task_registry_rules.py::test_every_static_check_is_registered_to_exactly_one_command`, `tests/test_task_registry_rules.py::test_every_media_argument_is_a_parameter_of_its_command` |
|
|
35
|
+
| Task argument domains | `dw/task_domains.py`: `check_arguments`, `task_argument_errors`; `dw/task_problems.py`: `face_track_errors`, `beats_errors`, `cuts_errors`, `lut_errors` | A numeric domain that a signature cannot express is declared on the command's `@register_command(domains=...)`, and it is checked at validation and again at run time. A numeric argument is read by `whole_number` or `real_number`, the only numeric coercion in `dw/tasks/`, and validation applies the same rule (`number_problem`), so a value is refused at both or at neither: `"3.0"` is a whole number, `"3.5"` for one of `whole_numbers` is not, and `true` is no number (#774). `Task.run` coerces every declared argument through `coerce_arguments` before dispatch, so a handler sees a number, and an argument that has no range besides being a number declares `finite`. A command's cross-argument rules are its registered `static_check`, which `task_argument_errors` runs at validation (`attribute_voices`' `voices_argument_errors`, kept in `dw/tasks/voice_attribution.py`, among them). A literal enum choice (`choice_errors`) is refused at validation by the same module. The per-family rules past a single domain live in `dw/task_problems.py`, which reads `task_domains`' helpers and is never imported by it (`task_argument_errors` reaches them only through the registered `static_check`, so `import_cycles` stays 0; #790): the `ingredients_grid` image count against `max_images` (`ingredients_grid_errors`), and `crop_face_track`'s cross-argument rules (`face_track_problems`, `face_track_errors`: crop size a multiple of the step's `multiple` (32 by default), `remainder` below `modulus`, `gate_zero` above `gate_full`, padding and confidence limits), which the task checks again at run time, as `analyze_beats`' are too (`beats_problems`, `beats_errors`: `min_bpm` below `max_bpm`, and anchors that are one kind per list, ascending, with whole beat indexes; `tests/test_analyze_beats.py`), and `plan_cuts`' (`cuts_problems`, `cuts_errors`: a bare-string transcript (`transcript_problem`, which `plan_cuts` also calls at run time), `min_scene_s` above `max_scene_s`, `segment_by: "beat"` without beats), and `apply_lut`'s (`lut_source_problem`, `palette_problem`, `lut_errors`: exactly one of `lut` or `palette`, and a palette of 2..16 `#rrggbb` colours, re-checked at run time by `check_lut_source`), and `check_face_detector_source` vets its Hub repo and `.onnx` file before any download. `select`'s index stays in `task_domains` with the other media-timing rules (`select_index_problem`, `select_rule_problems`: a whole number, at least 0, and below the candidate count when the count is known, i.e. at run time or when `candidates` is a written list). | `tests/test_task_domains.py::TestTheStaticPass::test_a_negative_frame_count_is_refused_at_its_path`, `tests/test_numeric_coercion.py::TestGradeExposure::test_a_string_number_grades_like_the_number`, `tests/test_task_domains.py::TestAtRunTime::test_slice_audio_refuses_a_negative_count`, `tests/test_ingredients_grid.py::TestStaticValidation::test_bad_layout_and_fit`, `tests/test_face_track.py::TestStaticValidation::test_bad_literal_is_an_error_at_its_argument`, `tests/test_face_track.py::TestCropFaceTrack::test_bad_arguments_are_refused_at_run_time`, `tests/test_face_track.py::TestStaticValidation::test_a_declared_grid_is_accepted`, `tests/test_face_track.py::TestDetectorSource::test_traversing_repo_is_refused`, `tests/test_select_validation.py::TestSelectErrors::test_an_out_of_range_literal_index_names_both_ends`, `tests/test_lut.py::TestPaletteAtValidate::test_both_refuse_naming_the_two`, `tests/test_lut.py::TestPalette::test_a_bad_palette_refuses_naming_the_entry` |
|
|
36
36
|
| Variables | `dw/variables.py`: `set_variables`, `argument_errors`, `resolve_variable_values` | `argument_errors` folds a caller's arguments in exactly as `set_variables` does when a run starts, so a bad name or value is refused before anything is queued. | `tests/test_variables.py::test_argument_errors_reports_a_dict_passed_for_a_string_variable` |
|
|
37
37
|
| List variables from the CLI | `dw/run.py`, `dw/variables.py`: `get_value` | A `name=value` string given for a list variable is split on commas, so a list of objects can only be passed as JSON over the API or MCP. | `tests/test_variables.py::test_set_variables_list_default_splits_on_comma` |
|
|
38
38
|
| `for_each` expansion | `dw/for_each.py`: `expand_for_each` | Each entry becomes an ordinary step named `<step>@<entry>`, after substitution and before the reference check. | `tests/test_for_each.py::TestNaming::test_member_name_joins_with_at` |
|
|
39
|
+
| Optional entry field | `dw/for_each.py`: `_optional_item`, `_item_fields` | `{"item": "field", "default": X}` reads an entry field with a fallback; without `default` it is the plain required read, and `list_fields` / `entry_field_warnings` count the field as one entries take. The editor's string scan needs no twin code, only the shared case file. | `tests/test_for_each.py::TestOptionalItem::test_a_present_field_wins_and_an_absent_one_takes_the_default`, `tests/test_ui_twins.py::test_the_engine_decides_each_shared_reference_case` |
|
|
39
40
|
| Previous results | `dw/previous_results.py`: `get_iterations`, `previous_result_reference_errors` | Several `previous_result:` references in one step multiply into a cartesian product. | `tests/test_previous_results.py::TestGetIterations::test_multiple_references_create_cartesian_product` |
|
|
40
41
|
| Previous-result check | `dw/previous_results.py`: `previous_result_reference_errors` | A literal reference to a step that is not earlier in the workflow is a validation error. | `tests/test_previous_results.py::TestStaticReferenceChecking::test_a_step_cannot_reference_itself_or_a_later_one` |
|
|
41
42
|
| Type conversion | `dw/arguments.py`: `realize_args`, `dw/type_helpers.py`: `get_type` | A key ending `_type` or `_dtype` loads a Python object at realize time. The other spellings, and `{}` escaping, are in `docs/WORKFLOW_GUIDE.md`. | `tests/test_type_helpers.py::TestGetType::test_get_type_from_diffusers`, `tests/test_arguments.py::TestRealizeArgs::test_realize_escaped_type_reference` |
|
|
@@ -76,6 +77,7 @@ one to open.
|
|
|
76
77
|
| Fit to a model and restore | `dw/tasks/fit.py`: `fit_to_model`, `restore_to_source` | fit_to_model's record is the whole of what restore_to_source needs: the scale is inferred from the output's size and must be uniform, and restore returns the source's size times that scale and at most its frame count. | `tests/test_fit_to_model.py` |
|
|
77
78
|
| Shared image ops | `dw/tasks/image_ops.py`: `LUMA_WEIGHTS`, `luma`, `split_alpha`, `join_alpha`, `per_frame` | `grade`, `finish` and `lut` take luma (float64 Rec. 709 weights, cast to the input's dtype) and alpha handling from `image_ops`, never from each other, so an RGBA input comes back RGBA with its alpha untouched; `lut.LUMA_WEIGHTS` is a re-export. An image command runs over a video or frame list only through `per_frame`. A media file is read by `task._load_media` with `fetch_image(keep_alpha=True)`, so a file with transparency arrives RGBA; a pipeline input still flattens to RGB. | `tests/test_image_ops.py::TestLuma::test_lut_re_exports_the_one_float64_weights`, `tests/test_image_ops.py::TestAlpha::test_rgba_round_trip_keeps_the_alpha_bytes`, `tests/test_image_ops.py::TestOutputsAreByteIdentical::test_every_command_matches_the_pre_refactor_bytes`, `tests/test_image_ops.py::TestPerFrame::test_a_video_comes_back_as_a_video_with_the_same_frames_and_audio`, `tests/test_finish.py::TestRgbaFileKeepsAlpha::test_a_file_path_comes_back_rgba_with_its_alpha` |
|
|
78
79
|
| Audio level of a deliverable | `dw/audio_qc.py`: `warn_without_headroom`, `warn_if_written_above_full_scale` | A muxed video keeps the pre-encode headroom prediction and falls back to it only when the post-write probe cannot measure the file. A result a later step resets the level of (`consumed_by_normalizer`, `dw/step_cache.py`) draws neither the post-write warning nor the fallback. | `tests/test_result.py::TestNoHeadroom::test_a_clean_video_mux_drops_the_stale_prediction`, `tests/test_result.py::TestNoHeadroom::test_an_unprobeable_video_mux_falls_back_to_the_prediction`, `tests/test_result.py::TestNoHeadroom::test_a_video_a_join_level_matches_draws_no_headroom_warning`, `tests/test_result.py::TestTheWrittenLevel::test_a_file_that_decodes_above_full_scale_warns` |
|
|
80
|
+
| Level-spread warning on a replaced track | `dw/step_cache.py`: `audio_replaced_downstream`, `dw/tasks/joins.py`: `warn_on_level_spread` | A join whose track a later `pair_audio` takes as its `video` draws no `level_spread` warning; being that step's `audio` argument doesn't count. | `tests/test_step_cache.py::test_level_spread_warning_suppressed_when_audio_replaced`, `tests/test_step_cache.py::test_audio_replaced_downstream_false_when_it_is_the_audio_or_unread` |
|
|
79
81
|
| Template audio-level placement | `workflows/templates/minimax/music-video.json`, `workflows/templates/minimax/music.json` | `normalize_audio` (-3 dBFS) acts only on the track that goes into the final file, so the slices that condition the shots are untouched. `music-video` slices each shot `lead_frames` early and `trim_video` drops the run-up before the join. | — |
|
|
80
82
|
|
|
81
83
|
## Validation, plan and cost
|
|
@@ -94,9 +96,10 @@ one to open.
|
|
|
94
96
|
| Raw workflow GET | `dw/server/routes/library.py`: `get_workflow` | The raw workflow GET is served verbatim, with no `observed`, because the editor saves what it reads. | — |
|
|
95
97
|
| VRAM projection | `dw/vram_estimate.py`, `dw/guides.py`: `guide_lengths` | A template's `vram_estimate` is projected per step after `for_each` expansion, and only the largest step over the ceiling is reported. With `bytes_per_guide_voxel` declared, each guide the step lays in (its own non-null `guides` plus a guide chain's) adds its snapped frames times the canvas; an unprobeable clip is charged at `num_frames`, and validate, admission and run project the same number. | `tests/test_vram_estimate.py::test_only_the_largest_over_ceiling_step_is_reported_once_per_cost_entry`, `tests/test_vram_guides.py::test_validate_apply_and_required_agree_on_a_guided_definition` |
|
|
96
98
|
| H3 Ref2VA VRAM numbers | `workflows/templates/minimax/` | Every Ref2VA template declares `base_gb` 16.0, `bytes_per_voxel` 28.71 and `gb_per_reference` 1.0. | `tests/test_h3_vram_ceiling.py::test_every_ref2va_minimax_template_declares_gb_per_reference` |
|
|
97
|
-
| Inherited VRAM ceiling | `dw/vram_inheritance.py`, `dw/server/deps.py`: `ceiling_index` | A workflow with no `vram_estimate` is matched against the catalog by pipeline identity, and is warned, never refused. | `tests/test_vram_inheritance.py::test_every_template_declaring_one_identity_declares_the_same_numbers` |
|
|
99
|
+
| Inherited VRAM ceiling | `dw/vram_inheritance.py`, `dw/server/deps.py`: `ceiling_index` (the catalog parse is `_catalog_listing`, shared with the cost lookup below) | A workflow with no `vram_estimate` is matched against the catalog by pipeline identity, and is warned, never refused. | `tests/test_vram_inheritance.py::test_every_template_declaring_one_identity_declares_the_same_numbers` |
|
|
100
|
+
| Inherited cost | `dw/server/deps.py`: `inherited_observed`, `dw/vram_inheritance.py`: `inherited_differences`, `dw/plan.py`: `_observed` (basis `inherited`), `dw/server/routes/jobs.py`: `_inherited_cost_warnings` | An inline workflow (no catalog name) is priced from the observed runs of the catalog template with the same `component_type` + `model_name` + `workflow` key as `vram_inheritance`; the template with the most cold runs wins, then name. `differs` lists offload, quantization and frame count set differently from the template. It is warned, never refused. | `tests/test_inherited_cost.py::TestPricedByPipelineIdentity::test_an_inline_copy_inherits_the_templates_runs`, `tests/test_inherited_cost.py::TestDifferences::test_offload_quantization_and_frames_are_named`, `tests/test_inherited_cost.py::TestThePlanReportsIt::test_the_estimate_is_inherited_and_the_validate_answer_warns` |
|
|
98
101
|
| H3 adapter partition | `dw/adapter_compatibility.py` | An FL2VA LoRA on a reference step is refused, and a LoRA whose file name says neither `ref2v` nor `fl2v` is warned. | `tests/test_h3_adapters.py::TestWhatIsRefused::test_a_keyframe_adapter_on_the_reference_path`, `tests/test_h3_adapters.py::TestWhatIsRefused::test_an_unrecognised_name_is_a_warning_not_a_refusal` |
|
|
99
|
-
| H3 audio hold, refine and guide layout |
|
|
102
|
+
| H3 audio hold, refine and guide layout | Five modules, imported one way: `dw/pipeline_processors/h3_rules.py` holds the names and rules, torch- and diffusers-free (`refine_problems`, the per-argument refine rules asked before validation and before the call; `not_h3`, the step rule; `snap_guide_length`, `guide_frame_problem`, `guide_chain_problems`, `guide_end_problem`; `CHAIN_CONTINUITY_MODES`; the chunk constants), `dw/pipeline_processors/h3_hold.py` puts the hold and refine blocks in (`insert_audio_hold`, `core_denoise_sequences`, `refines`), and `dw/pipeline_processors/h3_guides.py` the guide layout (`LAYOUT_ANCHORS`, `insert_guides`), which imports `h3_hold` and never the reverse; the blocks themselves, and the arithmetic they run, are `dw/pipeline_processors/h3_hold_steps.py` (`encode_audio_span`, `refine_sigmas`) and `dw/pipeline_processors/h3_guide_steps.py` (`splice_guide_rows`), which import diffusers when they load, so the two owners import them only inside `blocks()` and `guide_blocks()` (#790), and `h3_guide_steps` imports `h3_hold_steps` and never the reverse (`_with_guides` in `dw/pipeline_processors/pipeline.py` adds its blocks for a `guides` call), `dw/guides.py`: the `guides` validation check and the chain `continuity: "guide"` check, `guide_chain_errors`, which asks the `guides` check's own step rule (`_takes_guides_problem`, built on `h3_rules.not_h3` and `REFERENCE_WORKFLOWS`) and reads the mode names from `h3_rules.CHAIN_CONTINUITY_MODES`, the names `chain.py`'s `CONTINUITY_MODES` is zipped against (both registered in `dw/validation.py`; a `previous_result:` guide is checked at run time), `dw/hold_audio.py`: `hold_audio_errors`, `refine_strength_errors` | The one place dw modifies a diffusers modular pipeline's block graph: three blocks go in, before `set_timesteps`, `denoise` and `after_denoise`, in every H3 core-denoise sequence (the whole graph and the `workflow=`-pruned flat graph), and they are no-ops without `hold_audio` / `refine_strength`. A `hold_audio` path is opened only after `locations.validate_media_path` against the step's workflow directory. `dw/introspection.py` builds the same graph without weights, hold included, so `get_pipeline_signature` lists a modular pipeline's block inputs. The copies of diffusers behaviour are pinned to the installed diffusers: `shifted_sigma_grid` (the spacing `refine_sigmas` rests on) to stock `set_timesteps`, `GUIDE_FRAMES_PER_CHUNK`/`GUIDE_LATENTS_PER_CHUNK` to the H3 video VAE's `clip_length` and latents per clip, and every name in `LAYOUT_ANCHORS` (`_fill_audio_positions` among them) to `before_denoise`. | `tests/test_h3_hold_audio.py::TestAnchors::test_inserted_next_to_the_anchors_in_every_shape`, `tests/test_h3_hold_audio.py::TestHoldAudioLocation::test_a_path_outside_the_roots_is_refused_at_the_call`, `tests/test_h3_hold_audio.py::TestRefusals::test_a_non_h3_step_is_refused`, `tests/test_h3_hold_audio.py::TestSignature::test_the_h3_signature_shows_hold_audio`, `tests/test_h3_refine.py::TestAnchors::test_inserted_before_denoise_in_every_shape`, `tests/test_h3_refine.py::TestSigmaGridDrift::test_the_full_grid_is_stock_set_timesteps`, `tests/test_h3_guides.py::TestChunkDrift::test_frames_per_chunk_is_the_vae_clip_length`, `tests/test_h3_guides.py::TestChunkDrift::test_latents_per_chunk_is_the_vae_tokens_per_clip`, `tests/test_h3_guides.py::TestAnchors::test_installed_diffusers_has_every_anchor`, `tests/test_guide_chain_validation.py::TestRefused::test_the_step_rule_is_the_guides_rule`, `tests/test_guide_chain_validation.py::TestRefused::test_every_run_mode_is_known_to_validate`, `tests/test_h3_rules.py::test_h3_rules_imports_neither_torch_nor_diffusers`, `tests/test_h3_rules.py::test_the_block_owners_import_no_diffusers` |
|
|
100
103
|
| IC-LoRA reference scale | `workflows/templates/ltx2/` | The three conditioning templates run at `reference_downscale_factor: 1`, and the two upscalers at 2. | `tests/test_ltx2_ic_loras.py::TestEachTemplateMatchesItsCard::test_the_reference_is_encoded_at_the_output_resolution`, `tests/test_ltx2_ic_loras.py::TestTheGenerativeUpscaleMatchesTheSameCard::test_it_loads_the_upscaler_at_factor_two` |
|
|
101
104
|
| IC-LoRA numbers | `workflows/templates/ltx2/` | Every number in the IC-LoRA templates comes from the vendor's model card. | `tests/test_ltx2_ic_loras.py::TestEachTemplateMatchesItsCard::test_the_strength_is_the_cards_default`, `tests/test_ltx2_ic_loras.py::TestEachTemplateMatchesItsCard::test_the_defaults_are_the_trained_bucket` |
|
|
102
105
|
| IC-LoRA prompt genre | `prompts/ltx2/` | A stored prompt tagged `ic-lora` is checked against its trained caption form, not against the T2V paragraph rule. | `tests/test_ltx_prompt_library.py::test_an_ic_lora_prompt_is_in_its_trained_form` |
|
|
@@ -122,7 +125,8 @@ one to open.
|
|
|
122
125
|
| Opening media | `dw/media.py` | This is the only module that calls `av.open`. It imports no torch and no step types. | `tests/test_media_layering.py::test_av_open_appears_only_in_media`, `tests/test_media_layering.py::test_media_imports_no_step_types` (no torch: —) |
|
|
123
126
|
| Signal processing | `dw/dsp.py` | It measures and transforms waveforms, decides nothing, and imports nothing from `dw`. | `tests/test_media_layering.py::test_dsp_imports_nothing_from_dw` |
|
|
124
127
|
| Assessment probes | `dw/tasks/assess.py`, `dw/assessment_rules.py` | Exactly three registered commands are assessment probes. Each measures a finished file, and every rule names a real probe field. | `tests/test_assessment_rules.py::TestRuleProbesAreRealCommands::test_assessment_is_exactly_the_three_probes`, `tests/test_assessment_rules.py::TestRuleProbesAreRealCommands::test_every_rule_names_a_registered_json_command` |
|
|
125
|
-
| Script check | `dw/tasks/script_check.py`: `check`; `dw/script_lines.py`: `parse_lines`, `parse_shots`, `shot_names_error` | `check_script` aligns a take's heard words to its expected lines and guards out words heard over silence and repetition loops (Whisper's hallucination over music). It builds its findings with `assessment_rules.finding()` and reads the guard's floor and window (`DEAD_AIR_FLOOR_DBFS`, `DEAD_AIR_WINDOW`) rather than copying them. It is not an assessment probe and adds nothing to `RULES`. Its literal `lines` is refused at validation through `
|
|
128
|
+
| Script check | `dw/tasks/script_check.py`: `check`; `dw/script_lines.py`: `parse_lines`, `parse_shots`, `shot_names_error` | `check_script` aligns a take's heard words to its expected lines and guards out words heard over silence and repetition loops (Whisper's hallucination over music). It builds its findings with `assessment_rules.finding()` and reads the guard's floor and window (`DEAD_AIR_FLOOR_DBFS`, `DEAD_AIR_WINDOW`) rather than copying them. It is not an assessment probe and adds nothing to `RULES`. Its literal `lines` is refused at validation through `task_problems` (`script_lines_errors`), which calls the same `parse_lines` the task runs, and a literal `shots` through the same `parse_shots` and `shot_names_error`; the parsers live in `dw/script_lines.py`, not the task, so that `task_problems` reaches them without importing `script_check` (the `import_cycles` ratchet in `scripts/arch_metrics.py`). Its shot map comes from `assess.resolve_shots`, the one the probes use, never a copy; it places each shot on the soundtrack with `assess.sample_span`, decides repeated shot names with `shots.duplicate_shot_names`, and asks `locations.is_http_url` whether the take is a URL. | `tests/test_script_check.py::TestRegistration::test_registered_as_json_command_without_assessment_flag`, `tests/test_script_check.py::TestEmptyLines::test_words_only_over_silence_are_discarded_not_found`, `tests/test_script_check.py::TestLinesErrors::test_literal_with_a_colon_is_not_a_reference` |
|
|
129
|
+
| Audio sync against a source slice | `dw/tasks/measure_sync.py`: `measure_sync`; `dw/dsp.py`: `envelope_lag` | `measure_sync` cross-correlates the onset envelopes of a shot's audio and its source slice and answers the lag and a 0-1 confidence. A positive lag means the audio is LATE (its events fall after the reference's), negative early; `lag_seconds` is None for a silent or flat track. It builds its findings (`sync_unmeasurable`, `sync_low_confidence`, `audio_out_of_sync`) with `assessment_rules.finding()` over module-local rule dicts and adds nothing to `RULES`; it reads the silence floor from `beats.SILENT_DBFS`. `envelope_lag` imports nothing from `dw`. | `tests/test_measure_sync.py::TestLag::test_late_audio_is_a_positive_lag`, `tests/test_measure_sync.py::TestLag::test_early_audio_is_a_negative_lag`, `tests/test_measure_sync.py::TestUnmeasurable::test_a_silent_reference_has_no_lag` |
|
|
126
130
|
|
|
127
131
|
## Security and architecture guardrails
|
|
128
132
|
|
|
@@ -133,7 +137,7 @@ one to open.
|
|
|
133
137
|
| Locations from a workflow | `dw/locations.py` | A local path in a workflow's media arguments (named like their media, or declared by the task's `@register_command(media_arguments=...)`, read through `TASK_MEDIA_ARGUMENTS`) is confined to a known root, a location written as a URL is one `security.validate_url` accepts, and a URL must not name a host inside the deployment. A host that does not resolve is refused. The requests themselves are `dw/outbound.py`'s. | `tests/test_locations.py::TestMediaPathContainment::test_absolute_path_outside_every_root_is_refused`, `tests/test_locations.py::TestMediaPathContainment::test_a_url_that_is_not_http_is_refused`, `tests/test_locations.py::TestMediaPathContainment::test_an_upper_case_https_url_is_not_refused_as_another_scheme`, `tests/test_security_ssrf.py::TestInternalAddressSpellings::test_a_name_that_resolves_inside`, `tests/test_locations.py::TestTaskMediaArguments::test_an_unreadable_source_is_an_error_at_its_path` |
|
|
134
138
|
| Outbound requests | `dw/outbound.py`: `safe_get`, `safe_post` | Every outbound request is validated per hop against `dw/locations.py`'s policy, resolved once and dialed at the address the policy checked, capped and timed. No other module under `dw/` makes an HTTP request or builds a session or adapter. | `tests/test_outbound.py::TestSafeRequest::test_one_lookup_per_hop_and_the_dial_is_the_checked_address` |
|
|
135
139
|
| Trust gate | `dw/trust.py`: `require_trusted_dotted_name` | In an untrusted workflow (the default), a dotted type outside the allowlist is a validation error before anything is imported. | `tests/test_security_trust_gate.py::TestValidationRefusesBeforeImport::test_a_dotted_type_is_a_validation_error` |
|
|
136
|
-
| CodeQL path-injection model | `.github/codeql/dw-security/DwPathSanitizers.qll`, `.github/workflows/codeql.yml` | The local pack models the `dw/security.py` validators as sanitizers, so a validator that moves is re-modelled in the same commit. | `.github/codeql/dw-security/DwPathInjection.ql` |
|
|
140
|
+
| CodeQL path-injection model | `.github/codeql/dw-security/DwPathSanitizers.qll`, `.github/workflows/codeql.yml` | The local pack models the `dw/security.py` validators (and `dw/locations.py`'s `validate_media_path`) as sanitizers, so a validator that moves is re-modelled in the same commit. | `.github/codeql/dw-security/DwPathInjection.ql` |
|
|
137
141
|
| Archives never follow links | `dw/server/outputs.py`: `zip_download` | A gallery listing drops a symlink that leaves its root, and an archive skips one. | `tests/test_security_symlinks.py::TestOutputs::test_the_archive_route_does_not_follow_the_link`, `tests/test_security_symlinks.py::TestOutputs::test_the_gallery_listing_does_not_enumerate_the_link` |
|
|
138
142
|
| Engine/server import direction | `dw/workspace.py`: `EXPORTS_SUBDIR` | No engine module imports `dw.server` except the entry point `dw/serve.py`, and a constant both sides need lives engine-side. | `docs/stabilization/baseline.json`: `import_cycles` ratchet (indirect: it fails only on an import that closes a cycle) |
|
|
139
143
|
| Module and function size | `scripts/arch_metrics.py`: `SIZE_WARNING`, `SIZE_CEILING` | A module stays at or under 1,100 lines, and it warns above 1,000. A function stays at or under 150 lines. | `docs/stabilization/baseline.json`: `modules_over_size_ceiling`, `functions_over_150_lines` |
|
|
@@ -279,7 +279,7 @@ tools) rather than relying on the session pin.
|
|
|
279
279
|
| `use_workspace(name)` | `name` | Work in that workspace for the rest of the session - every later call reads and writes there. This is how to keep your work out of another agent's namespace rather than sharing the default one. Checked against the server, so a typo fails here rather than scoping every later call to nothing. On a `dw.serve --mcp` endpoint the pin is shared by every connected client (#298, see the note above the table) - a `warning` field appears when this call overwrote a pin already pointed away from `default` |
|
|
280
280
|
| `create_workspace(name, use=False)` | `name`, `use` | Create a workspace. Pass use=true to switch this session to it as well; otherwise the session stays where it was and the result says so. The result names the workspace (`name`, `default`, `current`, `next`), not its folders - `list_workspaces(detail=true)` is the opt-in for those. `use=true` carries the same mounted-server caveat and `warning` field as `use_workspace` |
|
|
281
281
|
| `delete_workspace(name, acknowledged_cost=False)` | `name`, `acknowledged_cost` | Permanently delete a workspace and everything in it. Refuses without the acknowledgement, reporting what it would remove |
|
|
282
|
-
| `list_assets()` |
|
|
282
|
+
| `list_assets(limit=50, prefix)` | `limit`, `prefix` | The input media on the server, each with the `asset:` reference a workflow argument carries. Look here before asking for a file - what a workflow needs may already be there. `libraries` names the roots searched and which are writable; `shadowed` lists names a nearer library hides. Newest first; `prefix` keeps names starting with it (e.g. `cast/`), `limit` bounds the answer, `total` is the count matched before the cut |
|
|
283
283
|
| `keep_output(name, asset_name=None, overwrite=False, shared=False, workspace=None)` | `name`, optional `asset_name`, `overwrite`, `shared`, `workspace` | Keep a generated file as an input asset under a stable `asset:` name, so a later workflow can rely on it. The copy happens on the server: nothing is downloaded or re-uploaded. `asset_name` may name a folder and takes the kept file's extension when it has none; `shared=true` keeps it in the library every workspace shares, which is where a recurring cast belongs. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
|
|
284
284
|
| `upload_asset(file_path=None, content=None, asset_name=None, shared=False)` | exactly one of `file_path` or `content` (base64), optional `asset_name`, `shared` | Push an image, video or audio file, or a `.cube` 3D LUT for `apply_lut`, into the server's asset library and get back its `asset:` reference. `file_path` is read from the machine the MCP server runs on, so this is how an input reaches a dw.serve running somewhere else - but only when the caller shares a filesystem with that machine. `content` is the alternative for an agent that does not: the bytes travel inline, base64-encoded, in the tool call itself, capped at 4MB (well under `file_path`'s 200MB) because inline bytes compete with the calling agent's own context budget rather than being a bulk-transfer path (#203). `asset_name` is required with `content` (there is no file name to infer one from) and, either way, stores it under a readable name (`cast/priya-voice.wav`) instead of a random one; `shared=true` puts it in the library every workspace shares |
|
|
285
285
|
| `delete_asset(name)` | `name` | Permanently remove one file from the asset library, by the name `list_assets` reports. Deletes from whichever library holds it - this workspace's own before the shared one; one from a read-only examples library is refused. Any workflow still carrying that `asset:` reference stops loading |
|