diffusers-workflow 0.6.0__tar.gz → 0.7.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.6.0/diffusers_workflow.egg-info → diffusers_workflow-0.7.0}/PKG-INFO +1 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0/diffusers_workflow.egg-info}/PKG-INFO +1 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/SOURCES.txt +24 -21
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/__init__.py +9 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/adapter_compatibility.py +6 -7
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/argument_media.py +2 -2
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/arguments.py +10 -7
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/assets.py +6 -4
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/content_types.py +3 -6
- diffusers_workflow-0.7.0/dw/docs/ARCHITECTURE.md +150 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/RELEASING.md +18 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/elision.py +1 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/for_each.py +6 -4
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/kernel_availability.py +19 -3
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/library.py +54 -18
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/locations.py +1 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/placement.py +7 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/plan.py +7 -11
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/previous_results.py +4 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/probe_paths.py +4 -6
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/prompts.py +10 -20
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/realize.py +29 -23
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/reference_limits.py +3 -5
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/reference_names.py +25 -18
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/references.py +7 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/runs.py +13 -6
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/admission.py +7 -6
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/catalog.py +8 -7
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/enhancers.py +3 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/exports.py +5 -6
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/job_history.py +7 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/jobs.py +3 -3
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/outputs.py +4 -4
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/assets.py +2 -2
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/jobs.py +4 -5
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/library.py +6 -4
- diffusers_workflow-0.6.0/dw/server/ui/assets/cssMode-CjZLP_Pe.js → diffusers_workflow-0.7.0/dw/server/ui/assets/cssMode-DQI1FUIr.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/editor.api-DXlBngV6.js → diffusers_workflow-0.7.0/dw/server/ui/assets/editor.api-a3j9A86u.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/freemarker2-CtKALOjK.js → diffusers_workflow-0.7.0/dw/server/ui/assets/freemarker2-BcdiHyGC.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/handlebars-teGPbQUB.js → diffusers_workflow-0.7.0/dw/server/ui/assets/handlebars-DCj-aPE8.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/html-DfSymt9C.js → diffusers_workflow-0.7.0/dw/server/ui/assets/html-D8xomw9g.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/htmlMode-Cr3jQp_U.js → diffusers_workflow-0.7.0/dw/server/ui/assets/htmlMode-DK_n-eew.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/index-J5rsq_M9.js → diffusers_workflow-0.7.0/dw/server/ui/assets/index-CNiY-pOw.js +5 -4
- diffusers_workflow-0.6.0/dw/server/ui/assets/javascript-BeSdrNYj.js → diffusers_workflow-0.7.0/dw/server/ui/assets/javascript-SmmG4uTF.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/jsonMode-DJLaxAu8.js → diffusers_workflow-0.7.0/dw/server/ui/assets/jsonMode-BRyslvRu.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/liquid-D5XtXQ2P.js → diffusers_workflow-0.7.0/dw/server/ui/assets/liquid-CC4C0BTL.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/lspLanguageFeatures-BJkK4mNN.js → diffusers_workflow-0.7.0/dw/server/ui/assets/lspLanguageFeatures-Cmg2_33_.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/mdx-CIThOdKr.js → diffusers_workflow-0.7.0/dw/server/ui/assets/mdx-DTAejllH.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/monaco-CYXGxb41.js → diffusers_workflow-0.7.0/dw/server/ui/assets/monaco-C_Um4bRZ.js +4 -4
- diffusers_workflow-0.6.0/dw/server/ui/assets/python-BlzkzsC6.js → diffusers_workflow-0.7.0/dw/server/ui/assets/python-DKASw3vF.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/razor-DeSKNqSl.js → diffusers_workflow-0.7.0/dw/server/ui/assets/razor-CkEOBTMa.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/tsMode-BCUw0fMr.js → diffusers_workflow-0.7.0/dw/server/ui/assets/tsMode-CmkUIEUu.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/typescript-3N0ou1YS.js → diffusers_workflow-0.7.0/dw/server/ui/assets/typescript-BXTFUpwg.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/workers-C91O0to6.js → diffusers_workflow-0.7.0/dw/server/ui/assets/workers-Cpj1l6gK.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/xml-DmIqin7X.js → diffusers_workflow-0.7.0/dw/server/ui/assets/xml-D1BkO5yz.js +1 -1
- diffusers_workflow-0.6.0/dw/server/ui/assets/yaml-BQg2lXI1.js → diffusers_workflow-0.7.0/dw/server/ui/assets/yaml-CDFThBDz.js +1 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/index.html +1 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/settings.py +14 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/shots.py +11 -14
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/step_cache.py +3 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/step_value_checks.py +3 -6
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/subfolders.py +10 -6
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/audio_utils.py +6 -5
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/dissolve_videos.py +0 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/joins.py +14 -11
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/validation.py +15 -14
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/variable_constraints.py +15 -10
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/video_extensions.py +4 -6
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/vram_estimate.py +9 -8
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/worker.py +4 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflow.py +20 -176
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflow_run.py +3 -4
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflow_schema.json +1 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/__init__.py +4 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/pyproject.toml +1 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_admission.py +1 -1
- diffusers_workflow-0.7.0/tests/test_arch_metrics.py +355 -0
- diffusers_workflow-0.7.0/tests/test_architecture_map.py +172 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_arguments.py +8 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_assets.py +10 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_audio_utils.py +25 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_concat_videos.py +16 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_dissolve_videos.py +11 -9
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_kernel_availability.py +33 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_lora_disable.py +7 -2
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_output_references.py +8 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompt_references.py +3 -3
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompts.py +18 -2
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_realize.py +2 -1
- diffusers_workflow-0.7.0/tests/test_reference_skip_sets.py +108 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_references.py +30 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_runs.py +27 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_guides.py +2 -2
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_shot_span_preflight.py +2 -1
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_slice_preflight.py +4 -1
- diffusers_workflow-0.7.0/tests/test_sub_workflow_resolver.py +243 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_validation.py +23 -8
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_vram_inheritance.py +5 -2
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker_execute.py +26 -17
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workflow.py +6 -3
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workflow_step_cache.py +9 -6
- diffusers_workflow-0.6.0/tests/test_arch_metrics.py +0 -183
- diffusers_workflow-0.6.0/tests/test_reference_sets.py +0 -36
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/LICENSE +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/MANIFEST.in +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/README.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/requires.txt +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/argument_warnings.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/assessment_rules.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/audio_qc.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/cache_blocks.json +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/cache_blocks.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/ACCELERATION.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/AGENT_LOOP.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/DEPENDENCIES.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/IP_ADAPTER.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/LORAS.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/MCP.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/QUANTIZATION.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/RECIPES_24GB.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/REMOTE.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/SECURITY.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/SERVER.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/TASKS.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/TESTING.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/WORKER_GUIDE.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/WORKFLOW_GUIDE.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/WORKSPACES.md +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/download_watch.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/dsp.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/events.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/host_memory.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/host_memory_projection.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/hub_cache.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/introspection.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/log_setup.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/media.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/media_frames.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/media_types.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/output_extraction.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_ownership.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/adapters.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/chain.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/components.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/config_objects.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/pipeline.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/progress.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/remote.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/prompt_schema.json +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/prompt_weighting.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/result.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/run.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/scalar_result_validation.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/schema.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/security.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/serve.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/__init__.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/app.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/assess.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/catalog_shape.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/deps.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/guides.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/http_security.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/job_record.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/mcp_mount.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/netinfo.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/observed_cost.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/__init__.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/files.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/gallery.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/media.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/system.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/sysinfo.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/index-3Vw6WAPW.css +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/updater.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/shot_span_preflight.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/slice_preflight.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/step.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/task_domains.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/assess.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/audio_dynamics.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/audio_transcription.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/background_remover.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/borders.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/compose_text.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/concat_videos.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/depth_estimator.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/diffusion_upscale.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/format_messages.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/gather.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/grade.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/image_to_text.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/image_utils.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/interpolate_frames.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/join_into_song.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/judge.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/loop_bed.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/model_cache.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/pair_audio.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/qr_code.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/restore_faces.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/rife_model.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/segment.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/select.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/speech_generation.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/stabilize.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/task.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/tensor_image.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/text_generation.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/text_sections.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/upscale.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/video_utils.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/voice_attribution.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/zoe_depth.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/test.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/trust.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/type_helpers.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/type_references.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/validate.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/variables.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/video_size_errors.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/vram_inheritance.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/worker_manager.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/worker_protocol.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflows/h3_context_ir.json +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflows/test.json +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workspace.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/writers.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/__main__.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/assets.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/authoring.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/catalog.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/client.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/diagnose.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/exports.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/guides.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/media.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/models.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/prompts.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/server.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/tools_authoring.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/tools_catalog.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/tools_jobs.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/tools_media.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/workspaces.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/setup.cfg +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_arch_report.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_argument_updates.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_assess.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_assessment_rules.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_attention_slicing.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_best_of_n_template.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_borders.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_cache_blocks.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_catalog_shape.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_catalog_structure.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_chain.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_cli.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_component_name_errors.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_component_pruning.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_component_type_errors.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_compose_text.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_config_objects.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_configuration_schema.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_content_types.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_depth_estimator.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_device.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_device_helpers.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_device_portability.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_dialogue_short_voices.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_diffusion_upscale.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_docs_links.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_download_watch.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_dsp.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_elision.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_events.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_examples.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_find_loop_bed.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_for_each.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_gather.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_grade.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_h3_adapters.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_h3_context_ir.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_h3_schedule.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_h3_vram_ceiling.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_hf_placement.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_host_memory.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_host_memory_projection.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_hub_cache.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_image_to_text.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_image_utils.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_integration.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_interpolate_frames.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_introspection.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_job_history_wal.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_job_progress.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_job_warnings.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_jobs_listing.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_jobs_reused.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_join_into_song.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_judge.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_library_path.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_library_sources.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_list_images.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_locations.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_lora_alpha.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_ltx2_diffusion_decode.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_ltx2_extend_clip.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_ltx2_ic_loras.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_ltx_prompt_library.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_assets.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_authoring.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_catalog.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_client.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_diagnose.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_exports.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_guides.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_main.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_media.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_models.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_prompts.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_server.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_workspaces.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_media_audio.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_media_frames.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_media_info.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_media_layering.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mix_audio.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_model_cache.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_modular_output_properties.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_modular_pipeline.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_modular_progress.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mps_fallback_warning.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mps_rope_precision.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_null_media.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_observed_cost.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_offload_placement.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_pair_audio.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_pair_audio_fit.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_parallel_loading_default.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_phase_events.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_pipeline_caching.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_pipeline_components.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_plan.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_plugin_skills.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prepare_pipeline.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_previous_result_walker_parity.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_previous_results.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompt_library.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompt_parser.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompt_weighting.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_real_models.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_recenter_crop.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_reference_limits.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_reference_names.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_rerun_new_seed.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_resize_bucket.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_result.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_result_fps.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_result_output_naming.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_rule_parity.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_scalar_result_validation.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_scheduler_config.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_schema.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_auth.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_decoder_bombs.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_input_caps.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_ssrf.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_symlinks.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_trust_gate.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_web_headers.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_segment.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_select.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_select_validation.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_serve_main.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_assess.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_downloads.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_exports.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_info.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_jobs.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_library_path.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_mcp.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_workspaces.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_shaping_logs.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_shots.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_speech_generation.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_stabilize.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_step.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_step_cache.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_strip_exif_and_watermark.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_subfolders.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_task.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_task_discovery.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_task_domains.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_task_signature_errors.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_template_defaults.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_template_subfolders.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_tensor_image.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_text_generation.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_text_sections.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_transcribe_audio.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_type_helpers.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_updater.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_validate_arguments.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_variable_constraints.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_variables.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_video_extensions.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_video_size_errors.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_video_utils.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_voice_attribution.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_vram_estimate.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker_job_peak_rss.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker_manager.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker_messages.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workflow_snapshot.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workflow_trust.py +0 -0
- {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workspace.py +0 -0
{diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/SOURCES.txt
RENAMED
|
@@ -87,6 +87,7 @@ dw/writers.py
|
|
|
87
87
|
dw/community_pipelines/pipeline_flux_rf_inversion.py
|
|
88
88
|
dw/docs/ACCELERATION.md
|
|
89
89
|
dw/docs/AGENT_LOOP.md
|
|
90
|
+
dw/docs/ARCHITECTURE.md
|
|
90
91
|
dw/docs/DEPENDENCIES.md
|
|
91
92
|
dw/docs/IP_ADAPTER.md
|
|
92
93
|
dw/docs/LORAS.md
|
|
@@ -155,45 +156,45 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
|
|
|
155
156
|
dw/server/ui/assets/csp-bTuwJoIa.js
|
|
156
157
|
dw/server/ui/assets/css-DIMkf-bt.js
|
|
157
158
|
dw/server/ui/assets/css.worker-B3ciXF_0.js
|
|
158
|
-
dw/server/ui/assets/cssMode-
|
|
159
|
+
dw/server/ui/assets/cssMode-DQI1FUIr.js
|
|
159
160
|
dw/server/ui/assets/cypher-CVaqCwHa.js
|
|
160
161
|
dw/server/ui/assets/dart-onAF5SnQ.js
|
|
161
162
|
dw/server/ui/assets/dockerfile-DZFCIeNp.js
|
|
162
163
|
dw/server/ui/assets/ecl-D05T4iGw.js
|
|
163
164
|
dw/server/ui/assets/editor-jjEx9u7D.css
|
|
164
|
-
dw/server/ui/assets/editor.api-
|
|
165
|
+
dw/server/ui/assets/editor.api-a3j9A86u.js
|
|
165
166
|
dw/server/ui/assets/editor.worker-q-txB4vs.js
|
|
166
167
|
dw/server/ui/assets/elixir-6RTg0lbw.js
|
|
167
168
|
dw/server/ui/assets/flow9-C5_-GSwl.js
|
|
168
|
-
dw/server/ui/assets/freemarker2-
|
|
169
|
+
dw/server/ui/assets/freemarker2-BcdiHyGC.js
|
|
169
170
|
dw/server/ui/assets/fsharp-C8Ef5oNN.js
|
|
170
171
|
dw/server/ui/assets/go-C-y9NEjX.js
|
|
171
172
|
dw/server/ui/assets/graphql-fmXr3nnJ.js
|
|
172
|
-
dw/server/ui/assets/handlebars-
|
|
173
|
+
dw/server/ui/assets/handlebars-DCj-aPE8.js
|
|
173
174
|
dw/server/ui/assets/hcl-CpzslTdj.js
|
|
174
|
-
dw/server/ui/assets/html-
|
|
175
|
+
dw/server/ui/assets/html-D8xomw9g.js
|
|
175
176
|
dw/server/ui/assets/html.worker-C93Ht9o9.js
|
|
176
|
-
dw/server/ui/assets/htmlMode-
|
|
177
|
+
dw/server/ui/assets/htmlMode-DK_n-eew.js
|
|
177
178
|
dw/server/ui/assets/index-3Vw6WAPW.css
|
|
178
|
-
dw/server/ui/assets/index-
|
|
179
|
+
dw/server/ui/assets/index-CNiY-pOw.js
|
|
179
180
|
dw/server/ui/assets/ini-sBoK_t0W.js
|
|
180
181
|
dw/server/ui/assets/java-BEtHBSE6.js
|
|
181
|
-
dw/server/ui/assets/javascript-
|
|
182
|
+
dw/server/ui/assets/javascript-SmmG4uTF.js
|
|
182
183
|
dw/server/ui/assets/json.worker-B2V3pomh.js
|
|
183
|
-
dw/server/ui/assets/jsonMode-
|
|
184
|
+
dw/server/ui/assets/jsonMode-BRyslvRu.js
|
|
184
185
|
dw/server/ui/assets/julia-Bri6UV-V.js
|
|
185
186
|
dw/server/ui/assets/kotlin-BOotOW0E.js
|
|
186
187
|
dw/server/ui/assets/less-B9JPFI3C.js
|
|
187
188
|
dw/server/ui/assets/lexon-CfSJPG6W.js
|
|
188
|
-
dw/server/ui/assets/liquid-
|
|
189
|
-
dw/server/ui/assets/lspLanguageFeatures-
|
|
189
|
+
dw/server/ui/assets/liquid-CC4C0BTL.js
|
|
190
|
+
dw/server/ui/assets/lspLanguageFeatures-Cmg2_33_.js
|
|
190
191
|
dw/server/ui/assets/lua-CsQS60Ue.js
|
|
191
192
|
dw/server/ui/assets/m3-D-oSqn_W.js
|
|
192
193
|
dw/server/ui/assets/markdown-Cimd5fb3.js
|
|
193
|
-
dw/server/ui/assets/mdx-
|
|
194
|
+
dw/server/ui/assets/mdx-DTAejllH.js
|
|
194
195
|
dw/server/ui/assets/mips-CIPQ_RoX.js
|
|
195
196
|
dw/server/ui/assets/monaco--ixms01u.css
|
|
196
|
-
dw/server/ui/assets/monaco-
|
|
197
|
+
dw/server/ui/assets/monaco-C_Um4bRZ.js
|
|
197
198
|
dw/server/ui/assets/msdax-DauUninz.js
|
|
198
199
|
dw/server/ui/assets/mysql-SOo6toE5.js
|
|
199
200
|
dw/server/ui/assets/objective-c-FvmIjYaQ.js
|
|
@@ -208,10 +209,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
|
|
|
208
209
|
dw/server/ui/assets/powershell-DmHpPYUd.js
|
|
209
210
|
dw/server/ui/assets/protobuf-C531GsRP.js
|
|
210
211
|
dw/server/ui/assets/pug-Z5eAx3Zn.js
|
|
211
|
-
dw/server/ui/assets/python-
|
|
212
|
+
dw/server/ui/assets/python-DKASw3vF.js
|
|
212
213
|
dw/server/ui/assets/qsharp-DkqhCAOL.js
|
|
213
214
|
dw/server/ui/assets/r-BwWrilGY.js
|
|
214
|
-
dw/server/ui/assets/razor-
|
|
215
|
+
dw/server/ui/assets/razor-CkEOBTMa.js
|
|
215
216
|
dw/server/ui/assets/redis-ClamHrr6.js
|
|
216
217
|
dw/server/ui/assets/redshift-DT7zqm-g.js
|
|
217
218
|
dw/server/ui/assets/restructuredtext-BYgofb2h.js
|
|
@@ -231,15 +232,15 @@ dw/server/ui/assets/swift-Bxkupp3x.js
|
|
|
231
232
|
dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
|
|
232
233
|
dw/server/ui/assets/tcl-DISqw1ZD.js
|
|
233
234
|
dw/server/ui/assets/ts.worker-D7T1-Ig5.js
|
|
234
|
-
dw/server/ui/assets/tsMode-
|
|
235
|
+
dw/server/ui/assets/tsMode-CmkUIEUu.js
|
|
235
236
|
dw/server/ui/assets/twig-De2hgUGE.js
|
|
236
|
-
dw/server/ui/assets/typescript-
|
|
237
|
+
dw/server/ui/assets/typescript-BXTFUpwg.js
|
|
237
238
|
dw/server/ui/assets/typespec-B8J7ngcE.js
|
|
238
239
|
dw/server/ui/assets/vb-DV3o63ZY.js
|
|
239
240
|
dw/server/ui/assets/wgsl-DpFanUEy.js
|
|
240
|
-
dw/server/ui/assets/workers-
|
|
241
|
-
dw/server/ui/assets/xml-
|
|
242
|
-
dw/server/ui/assets/yaml-
|
|
241
|
+
dw/server/ui/assets/workers-Cpj1l6gK.js
|
|
242
|
+
dw/server/ui/assets/xml-D1BkO5yz.js
|
|
243
|
+
dw/server/ui/assets/yaml-CDFThBDz.js
|
|
243
244
|
dw/tasks/assess.py
|
|
244
245
|
dw/tasks/audio_dynamics.py
|
|
245
246
|
dw/tasks/audio_transcription.py
|
|
@@ -301,6 +302,7 @@ dw_mcp/workspaces.py
|
|
|
301
302
|
tests/test_admission.py
|
|
302
303
|
tests/test_arch_metrics.py
|
|
303
304
|
tests/test_arch_report.py
|
|
305
|
+
tests/test_architecture_map.py
|
|
304
306
|
tests/test_argument_updates.py
|
|
305
307
|
tests/test_arguments.py
|
|
306
308
|
tests/test_assemble_and_score_target_lufs.py
|
|
@@ -422,7 +424,7 @@ tests/test_realize.py
|
|
|
422
424
|
tests/test_recenter_crop.py
|
|
423
425
|
tests/test_reference_limits.py
|
|
424
426
|
tests/test_reference_names.py
|
|
425
|
-
tests/
|
|
427
|
+
tests/test_reference_skip_sets.py
|
|
426
428
|
tests/test_references.py
|
|
427
429
|
tests/test_rerun_new_seed.py
|
|
428
430
|
tests/test_resize_bucket.py
|
|
@@ -465,6 +467,7 @@ tests/test_stabilize.py
|
|
|
465
467
|
tests/test_step.py
|
|
466
468
|
tests/test_step_cache.py
|
|
467
469
|
tests/test_strip_exif_and_watermark.py
|
|
470
|
+
tests/test_sub_workflow_resolver.py
|
|
468
471
|
tests/test_subfolders.py
|
|
469
472
|
tests/test_task.py
|
|
470
473
|
tests/test_task_discovery.py
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
"""diffusers-workflow: device detection and the startup that configures it.
|
|
2
|
+
|
|
3
|
+
The default torch device is deliberately never set. Diffusers loads weights
|
|
4
|
+
into system memory and then places them, onto the device or under offload
|
|
5
|
+
hooks; a default device of 'cuda' would build every module directly in VRAM
|
|
6
|
+
and run a large pipeline out of memory before any offload hook exists. Device
|
|
7
|
+
placement is explicit throughout dw.
|
|
8
|
+
"""
|
|
9
|
+
|
|
1
10
|
from .settings import resolve_path, load_settings
|
|
2
11
|
from .log_setup import setup_logging
|
|
3
12
|
import functools
|
|
@@ -53,9 +53,6 @@ MODEL_NAME_KEY = "model_name"
|
|
|
53
53
|
WEIGHT_NAME_KEY = "weight_name"
|
|
54
54
|
WORKFLOW_KEY = "workflow"
|
|
55
55
|
FROM_PRETRAINED_KEY = "from_pretrained_arguments"
|
|
56
|
-
# Values another pass resolves; one still spelled out here is not this
|
|
57
|
-
# pass's complaint
|
|
58
|
-
_UNRESOLVED_PREFIXES = references.UNRESOLVED
|
|
59
56
|
|
|
60
57
|
|
|
61
58
|
def _trained_for(weight_name):
|
|
@@ -140,8 +137,10 @@ def _lora_problems(steps, source_indices, written=None, supplied=()):
|
|
|
140
137
|
if not isinstance(lora, dict):
|
|
141
138
|
continue
|
|
142
139
|
weight_name = lora.get(WEIGHT_NAME_KEY)
|
|
143
|
-
|
|
144
|
-
|
|
140
|
+
# Values another pass resolves; one still spelled out here is not
|
|
141
|
+
# this pass's complaint
|
|
142
|
+
if not isinstance(weight_name, str) or references.is_ref(
|
|
143
|
+
references.UNRESOLVED, weight_name
|
|
145
144
|
):
|
|
146
145
|
continue
|
|
147
146
|
problem = _problem(workflow, weight_name)
|
|
@@ -180,9 +179,9 @@ def _path_for(written_steps, source, position, supplied, key=WEIGHT_NAME_KEY):
|
|
|
180
179
|
return None
|
|
181
180
|
entry = loras[position]
|
|
182
181
|
reference = entry.get(key) if isinstance(entry, dict) else None
|
|
183
|
-
|
|
182
|
+
variable = references.ref_name(references.VARIABLE, reference)
|
|
183
|
+
if variable is None:
|
|
184
184
|
return None
|
|
185
|
-
variable = reference.removeprefix(references.VARIABLE)
|
|
186
185
|
return f"arguments.{variable}" if variable in (supplied or ()) else None
|
|
187
186
|
|
|
188
187
|
|
|
@@ -135,7 +135,7 @@ def fetch_image(img_spec, base_dir=None):
|
|
|
135
135
|
raise ValueError(f"Image specification must be a string, got {type(img_spec)}")
|
|
136
136
|
|
|
137
137
|
# Skip cross-step and variable references — these are resolved later during execution
|
|
138
|
-
if references.is_ref(
|
|
138
|
+
if references.is_ref(references.LAZY_MEDIA, img_spec):
|
|
139
139
|
logger.debug(f"Skipping deferred reference: {img_spec}")
|
|
140
140
|
return img_spec
|
|
141
141
|
|
|
@@ -291,7 +291,7 @@ def fetch_video(video_spec, base_dir=None):
|
|
|
291
291
|
)
|
|
292
292
|
|
|
293
293
|
# Skip cross-step and variable references — these are resolved later during execution
|
|
294
|
-
if references.is_ref(
|
|
294
|
+
if references.is_ref(references.LAZY_MEDIA, video_spec):
|
|
295
295
|
logger.debug(f"Skipping deferred reference: {video_spec}")
|
|
296
296
|
return video_spec
|
|
297
297
|
|
|
@@ -14,7 +14,7 @@ from .type_helpers import (
|
|
|
14
14
|
load_constant_from_name,
|
|
15
15
|
has_method,
|
|
16
16
|
)
|
|
17
|
-
from .prompts import
|
|
17
|
+
from .prompts import fetch_prompt
|
|
18
18
|
from .assets import fetch_asset, is_asset_reference
|
|
19
19
|
from .runs import fetch_output, is_output_reference
|
|
20
20
|
from .argument_media import (
|
|
@@ -286,7 +286,7 @@ def is_constant_reference(value):
|
|
|
286
286
|
|
|
287
287
|
def is_prompt_reference(value):
|
|
288
288
|
"""Whether a value references a stored prompt in the prompt library."""
|
|
289
|
-
return references.is_ref(
|
|
289
|
+
return references.is_ref(references.PROMPT, value)
|
|
290
290
|
|
|
291
291
|
|
|
292
292
|
def fetch_constant(reference):
|
|
@@ -312,7 +312,12 @@ def fetch_constant(reference):
|
|
|
312
312
|
ValueError: If the name resolves to nothing, or to something callable
|
|
313
313
|
InvalidInputError: If the name is not a dotted python name
|
|
314
314
|
"""
|
|
315
|
-
name =
|
|
315
|
+
name = references.ref_name(references.CONSTANT, reference)
|
|
316
|
+
if name is None:
|
|
317
|
+
# A bare name reads as written: callers guard with is_constant_reference,
|
|
318
|
+
# a direct caller need not
|
|
319
|
+
name = reference
|
|
320
|
+
name = validate_constant_name(name.strip())
|
|
316
321
|
|
|
317
322
|
try:
|
|
318
323
|
value = load_constant_from_name(name)
|
|
@@ -325,7 +330,7 @@ def fetch_constant(reference):
|
|
|
325
330
|
if callable(value):
|
|
326
331
|
raise ValueError(
|
|
327
332
|
f"'{name}' is a {type(value).__name__}, not a constant - "
|
|
328
|
-
f"'
|
|
333
|
+
f"'constant:' reads a value, and a type is named with a "
|
|
329
334
|
f"'_type' argument instead"
|
|
330
335
|
)
|
|
331
336
|
|
|
@@ -931,9 +936,7 @@ def _realize_lazy_frame_arguments(arguments, base_dir):
|
|
|
931
936
|
video = arguments["video"]
|
|
932
937
|
if is_path_reference(video) or isinstance(video, (list, dict)):
|
|
933
938
|
video = resolve_path_references(video, base_dir)
|
|
934
|
-
deferred = references.is_ref(
|
|
935
|
-
(references.PREVIOUS_RESULT, references.VARIABLE), video
|
|
936
|
-
)
|
|
939
|
+
deferred = references.is_ref(references.LAZY_MEDIA, video)
|
|
937
940
|
url = isinstance(video, str) and (
|
|
938
941
|
video.startswith("http://") or video.startswith("https://")
|
|
939
942
|
)
|
|
@@ -26,9 +26,6 @@ from .workspace import ASSETS_SUBDIR, discover_library
|
|
|
26
26
|
|
|
27
27
|
logger = logging.getLogger("dw")
|
|
28
28
|
|
|
29
|
-
# The prefix marking a value as a reference to a stored asset
|
|
30
|
-
ASSET_PREFIX = references.ASSET
|
|
31
|
-
|
|
32
29
|
# The asset library of the run in progress. A server holds several
|
|
33
30
|
# workspaces and each has its own assets, so this cannot be a process-wide
|
|
34
31
|
# environment variable there the way the prompt library can - there is one
|
|
@@ -110,7 +107,12 @@ def resolve_asset_reference(reference, asset_dir=None, base_dir=None, library=No
|
|
|
110
107
|
ValueError: If no file exists under that name in any directory on
|
|
111
108
|
the search path
|
|
112
109
|
"""
|
|
113
|
-
name =
|
|
110
|
+
name = references.ref_name(references.ASSET, reference)
|
|
111
|
+
if name is None:
|
|
112
|
+
# A bare name resolves as written: callers guard with is_asset_reference,
|
|
113
|
+
# a direct caller need not
|
|
114
|
+
name = reference
|
|
115
|
+
name = validate_asset_reference(name.strip())
|
|
114
116
|
library = library or asset_library(asset_dir, base_dir)
|
|
115
117
|
# Confined to the library it was found in: the name is joined onto a
|
|
116
118
|
# directory, so the containment check is what makes a name a name
|
|
@@ -67,11 +67,6 @@ LOSSY_AUDIO_CONTENT_TYPES = {
|
|
|
67
67
|
# The only container encode_video writes - it always encodes h264 video
|
|
68
68
|
MUXED_VIDEO_CONTENT_TYPE = "video/mp4"
|
|
69
69
|
|
|
70
|
-
# Reference prefixes substitution resolves before this pass runs. One still
|
|
71
|
-
# spelled out here is one nothing resolved, and that is the undeclared-
|
|
72
|
-
# variable pass's complaint rather than a shape error
|
|
73
|
-
_UNRESOLVED_PREFIXES = references.SUBSTITUTED
|
|
74
|
-
|
|
75
70
|
# Result types a browser would run as a document on the UI origin
|
|
76
71
|
REFUSED_ACTIVE_CONTENT_TYPES = frozenset({"text/html", "text/xml"})
|
|
77
72
|
|
|
@@ -143,7 +138,9 @@ def content_type_errors(workflow_definition, source_indices=None):
|
|
|
143
138
|
if not isinstance(result, dict) or CONTENT_TYPE_KEY not in result:
|
|
144
139
|
continue
|
|
145
140
|
value = result[CONTENT_TYPE_KEY]
|
|
146
|
-
|
|
141
|
+
# A prefix substitution resolves before this pass: one still spelled
|
|
142
|
+
# out is the undeclared-variable pass's complaint, not a shape error
|
|
143
|
+
if references.is_ref(references.SUBSTITUTED, value):
|
|
147
144
|
continue
|
|
148
145
|
source = references.author_index(source_indices, index)
|
|
149
146
|
name = step.get("name")
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Architecture: the seam map
|
|
2
|
+
|
|
3
|
+
This map says where each concept lives. Each row names a concept, the module that owns it, the
|
|
4
|
+
rule that holds across the seam (in one sentence), and what enforces that rule. The detail is in
|
|
5
|
+
the owning module's docstring. Read the docstring before editing; the map only tells you which
|
|
6
|
+
one to open.
|
|
7
|
+
|
|
8
|
+
- **Owner**: repo-relative paths. Function, class or constant names follow the path after a colon
|
|
9
|
+
(`dw/runs.py`: `run_versions`).
|
|
10
|
+
- **Enforced by**: one of four kinds.
|
|
11
|
+
- A test, written as a file, or as `file::Class::test_name`.
|
|
12
|
+
- A ratchet, named by its key in `docs/stabilization/baseline.json`.
|
|
13
|
+
- The CodeQL pack.
|
|
14
|
+
- The validation registry.
|
|
15
|
+
|
|
16
|
+
A `—` means nothing mechanical holds the rule, so a change there is caught only in review.
|
|
17
|
+
- `tests/test_architecture_map.py` checks three things: every path named here exists, every name
|
|
18
|
+
after a path is defined in that file, and every test named here is defined in its class.
|
|
19
|
+
|
|
20
|
+
## Engine core
|
|
21
|
+
|
|
22
|
+
| Concept | Owner | Rule | Enforced by |
|
|
23
|
+
| --- | --- | --- | --- |
|
|
24
|
+
| Workflow | `dw/workflow.py`: `Workflow`, `workflow_from_file` | A workflow is loaded and schema-checked here (the hand-off of each run phase to `dw/workflow_run.py`: —). | `tests/test_workflow.py::test_workflow_validation_invalid` |
|
|
25
|
+
| One execution, in phases | `dw/workflow_run.py`: `prepare_definition`, `cache_lookup`, `cache_hits` | The cache probe shares `prepare_definition` and `cache_lookup` with the run, so the probe answers for the run that would happen. | `tests/test_workflow_step_cache.py::TestCacheHits::test_after_a_run_the_probe_names_what_the_next_run_reuses` |
|
|
26
|
+
| Step | `dw/step.py`: `Step`, `dw/workflow.py`: `Workflow.create_step_action` | A step is a pipeline, a task or a sub-workflow, `create_step_action` builds its action, and `dw/workflow_run.py` runs it. | — |
|
|
27
|
+
| Pipeline loading | `dw/pipeline_processors/pipeline.py`: `Pipeline`, `dw/pipeline_processors/components.py`: `load_component` | A quantization config is built from a `config_type` that the `_type` key convention loads by name, so a new backend needs no code. | `tests/test_config_objects.py::TestQuantizationConfiguration::test_the_config_type_is_constructed_with_its_arguments` |
|
|
28
|
+
| Device translation | `dw/pipeline_processors/placement.py`: `place_component` | A device is translated by `resolve_device()` before anything reads its backend, so the MPS accommodations also fire for a translated device. | `tests/test_device_portability.py::TestPlacement::test_a_translated_device_gets_its_backends_offload_downgrade` |
|
|
29
|
+
| On-demand wrappers | `dw/pipeline_processors/placement.py`: `apply_on_demand_placement` | The on-demand wrappers keep the wrapped signature, because H3's denoiser reads `signature(transformer.forward)`. | `tests/test_modular_pipeline.py::TestOnDemandResidency::test_the_wrapped_signature_survives` |
|
|
30
|
+
| On-demand and offload | `dw/pipeline_processors/placement.py`: `place_component`, `has_component_group_offload` | On-demand residency and `group_offload` cannot both be set on one component, and either one stops the whole pipeline from being moved to the device. | `tests/test_modular_pipeline.py::TestOnDemandResidency::test_group_offload_and_on_demand_together_are_rejected`, `tests/test_modular_pipeline.py::TestOffloadDevice::test_component_group_offload_is_not_moved_to_device` |
|
|
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
|
+
| 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
|
+
| Adding a task | `dw/tasks/task.py`: `register_command` | A task is a function registered with `@register_command`, and the signature of its implementation is its argument schema. | `tests/test_task_discovery.py::TestDescribeTask::test_signature_becomes_the_schema` |
|
|
34
|
+
| Task argument domains | `dw/task_domains.py`: `check_arguments` | A numeric domain that a signature cannot express is declared in this table, and it is checked at validation and again at run time. | `tests/test_task_domains.py::TestTheStaticPass::test_a_negative_frame_count_is_refused_at_its_path`, `tests/test_task_domains.py::TestAtRunTime::test_slice_audio_refuses_a_negative_count` |
|
|
35
|
+
| 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` |
|
|
36
|
+
| 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` |
|
|
37
|
+
| `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` |
|
|
38
|
+
| 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` |
|
|
39
|
+
| 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` |
|
|
40
|
+
| 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` |
|
|
41
|
+
|
|
42
|
+
## References and libraries
|
|
43
|
+
|
|
44
|
+
| Concept | Owner | Rule | Enforced by |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| Reference prefixes | `dw/references.py` | Every reference prefix is spelled only in this module, and every other module goes through it. | `docs/stabilization/baseline.json`: `prefix_literals`, `prefix_handling`; `tests/test_references.py::test_references_imports_nothing_from_dw` |
|
|
47
|
+
| Explicit references resolve first | `dw/arguments.py`: `_realize_explicit_reference` | `asset:`, `output:`, `constant:` and `prompt:` resolve in `realize_args` before any key-name convention. | — |
|
|
48
|
+
| Reference confinement | `dw/assets.py`: `resolve_asset_reference`, `dw/runs.py`: `resolve_output_reference`, `dw/library.py`: `LibraryPath`, `dw/security.py`: `validate_asset_reference`, `validate_output_reference` | `dw/security.py` validators confine an `asset:` path to its library and an `output:` path to the output root. | `tests/test_assets.py::TestReferences::test_a_symlink_out_of_the_library_is_refused`, `tests/test_security_symlinks.py::TestOutputs::test_an_output_reference_does_not_follow_a_linked_run_directory` |
|
|
49
|
+
| Reference name shape | `dw/reference_names.py`: `reference_name_errors` | The shape of every `asset:`, `prompt:` and `output:` name is checked before the queue, and existence is checked later. | `tests/test_reference_names.py::TestTheValidationPass::test_a_malformed_reference_is_refused_before_the_queue` |
|
|
50
|
+
| Library reads | `dw/library.py`: `LibraryPath` | Reads go through the roots front to back, so an earlier name shadows a later one. | `tests/test_library_path.py::TestResolution::test_the_front_of_the_path_shadows_the_rest` |
|
|
51
|
+
| Library writes | `dw/library.py`: `LibraryPath` | Writes go only to the front root, so saving something opened from a read-only root writes a copy. | `tests/test_library_path.py::TestConstruction::test_the_writable_root_comes_first`, `tests/test_library_sources.py::TestServer::test_saving_an_example_prompt_writes_a_copy` |
|
|
52
|
+
| Packaged builtins | `dw/library.py`: `builtin_root`, `resolve_sub_workflow_reference` | `builtin:` names the packaged `dw/workflows/`, not the top-level `workflows/` examples. | `tests/test_sub_workflow_resolver.py::TestTheResolver::test_a_builtin_resolves_in_the_packaged_root` |
|
|
53
|
+
| Sub-workflow paths | `dw/library.py`: `resolve_sub_workflow_reference`, `resolve_sub_workflow` | A sub-workflow path is confined to the root it resolves in. The search order is in the docstring of `resolve_sub_workflow`. | `tests/test_sub_workflow_resolver.py::TestTheResolver::test_a_path_escaping_its_root_is_refused` |
|
|
54
|
+
| Workspace | `dw/workspace.py`: `resolve_workspace`, `set_workspace` | `--workspace` beats `DW_WORKSPACE`, which beats the setting, which beats a working directory that looks like a workspace, which beats `~/diffusers-workspace`. | `tests/test_workspace.py::TestResolution::test_a_flag_wins_over_everything`, `tests/test_workspace.py::TestResolution::test_a_bare_working_directory_falls_back_to_the_home_workspace` |
|
|
55
|
+
| Realized workflow | `dw/realize.py`: `realize_workflow`, `dw/runs.py`: `write_realized_workflow` | Each run directory holds `workflow.json`, with the run's arguments, seed and stored prompt text pinned. | `tests/test_realize.py::TestVariablesAndSeed::test_arguments_become_the_variable_defaults`, `tests/test_runs.py::TestRealizedWorkflow::test_the_run_directory_holds_a_realized_copy` |
|
|
56
|
+
|
|
57
|
+
## Runs and outputs
|
|
58
|
+
|
|
59
|
+
| Concept | Owner | Rule | Enforced by |
|
|
60
|
+
| --- | --- | --- | --- |
|
|
61
|
+
| Run directories | `dw/runs.py`: `open_run`, `workflow_identity`, `new_run_id` | Each execution writes into `<output_dir>/<identity>/<run id>/` with a `manifest.json`, unless the flat layout is chosen (the test pins the flat-layout exception). | `tests/test_runs.py::TestRunDirectories::test_the_flat_layout_writes_where_it_always_did` |
|
|
62
|
+
| Run versions | `dw/runs.py`: `open_run`, `run_versions`, `record_run_versions` | A run takes its number once, when it opens, so deleting a middle run leaves a gap rather than renumbering. | `tests/test_runs.py::TestRunVersions::test_a_deleted_middle_run_leaves_a_gap_rather_than_renumbering`, `tests/test_runs.py::TestRunVersions::test_runs_started_in_the_same_second_still_number_upward` |
|
|
63
|
+
| Run-version surfaces | `dw/runs.py`: `run_versions`, `dw/server/routes/gallery.py`, `dw/server/outputs.py`, `dw_mcp/tools_catalog.py`: `list_gallery`, `ui/src/lib/pages/GalleryPage.svelte` | Only `dw/runs.py` computes the number, and every other module reads it back. | `tests/test_runs.py::TestRunVersions::test_an_output_reference_can_name_a_run_by_its_version` |
|
|
64
|
+
| Result subfolders | `dw/subfolders.py`: `subfolder_errors`, `dw/security.py`: `SUBFOLDER_PATTERN` | A step's `result.subfolder` is checked for shape at validation. | `tests/test_subfolders.py::TestValidationErrorsIntegration::test_validation_errors_reports_a_bad_subfolder` |
|
|
65
|
+
| Template subfolder roles | `workflows/templates/`, `dw/workflows/` | Every saving step of a template is marked `final` or `intermediate`, with at least one `final`, and packaged builtins stay unmarked. | `tests/test_template_subfolders.py::test_every_saving_step_of_a_template_names_its_role`, `tests/test_template_subfolders.py::test_the_packaged_builtins_stay_unmarked` |
|
|
66
|
+
| Shots in a joined video | `dw/shots.py` | Every `AudioVideo` constructor decides what to do with `shots`, and the sample spans are measured from the joined waveform. | `tests/test_shots.py::test_every_audio_video_constructor_site_is_decided`, `tests/test_shots.py::TestConcatVideosShots::test_an_overrun_track_is_measured_not_derived` |
|
|
67
|
+
| 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. | `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::TestTheWrittenLevel::test_a_file_that_decodes_above_full_scale_warns` |
|
|
68
|
+
| 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. | — |
|
|
69
|
+
|
|
70
|
+
## Validation, plan and cost
|
|
71
|
+
|
|
72
|
+
| Concept | Owner | Rule | Enforced by |
|
|
73
|
+
| --- | --- | --- | --- |
|
|
74
|
+
| Validation registry | `dw/validation.py`: `ERROR_CHECKS`, `WARNING_CHECKS`, `run_checks` | A check is one `Check` in a registry, and a check that raises becomes one `internal` finding while the rest still run. | `tests/test_validation.py::TestExceptionPolicy::test_a_raising_check_is_one_internal_error_and_the_rest_still_run` |
|
|
75
|
+
| Step-value checks | `dw/step_value_checks.py`: `fps_errors`, `null_media_errors`, `select_errors` | The only caller of these checks is the error registry. | `dw/validation.py`: `ERROR_CHECKS` |
|
|
76
|
+
| Admission | `dw/server/admission.py`: `admit` | Validate, submit, rerun and enhance load and check a request once, and `JobManager.submit` does not check it again. | `tests/test_admission.py::test_a_submit_expands_once` |
|
|
77
|
+
| Variable constraints | `dw/variable_constraints.py`: `apply_constraints` | A model's rule about a value is declared in the workflow's `variable_constraints`, and it is checked at validation and again before anything loads. | `tests/test_variable_constraints.py::TestTheGrid::test_without_snap_an_off_grid_value_is_refused_not_rounded`, `tests/test_variable_constraints.py::TestTheRunTimePass::test_an_illegal_value_is_refused_before_anything_loads` |
|
|
78
|
+
| Bound acknowledgement | `dw/plan.py`: `fingerprint`, `dw/server/admission.py`: `check_bound_acknowledgement` | A bound `acknowledged_cost` is refused with 409 when the plan's fingerprint or its required downloads changed. | `tests/test_server.py::TestBoundRerun::test_a_rerun_bound_to_a_stale_plan_is_refused`, `tests/test_server.py::TestBoundAcknowledgement::test_a_matching_fingerprint_queues` |
|
|
79
|
+
| Per-repo gating | `dw/plan.py`: `build_plan` | Each gated repo, including a `loras` entry's repo, is probed and reported on its own. | `tests/test_plan.py::TestDownloadsRequired::test_a_gated_repo_this_token_lacks_access_to_is_blocked` |
|
|
80
|
+
| Observed cost | `dw/server/observed_cost.py`: `declared_drivers` | `observed` comes only from this box's finished jobs and never writes `cost`. Cold and warm runs are reported separately. | `tests/test_observed_cost.py::TestColdIsNotWarm::test_the_two_are_reported_separately_each_with_its_runs` |
|
|
81
|
+
| The estimate | `dw/plan.py`: `estimate`, `_tempered` | `plan.estimate` quotes the observed figure ahead of the curated one, and blends it toward the curated figure below three runs. | `tests/test_plan.py::TestObservedEstimate::test_history_beats_a_curated_figure`, `tests/test_plan.py::TestLowConfidenceObservedEstimate::test_a_single_run_blends_toward_the_curated_figure` |
|
|
82
|
+
| Cost drivers | `dw/server/observed_cost.py`: `declared_drivers` | A cost driver that names no declared variable is dropped. | `tests/test_observed_cost.py::TestComparability::test_a_driver_naming_no_variable_is_dropped`, `tests/test_observed_cost.py::TestTheCatalogsDriversAreReal::test_every_declared_driver_is_a_variable_of_its_workflow` |
|
|
83
|
+
| 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. | — |
|
|
84
|
+
| VRAM projection | `dw/vram_estimate.py` | A template's `vram_estimate` is projected per step after `for_each` expansion, and only the largest step over the ceiling is reported. | `tests/test_vram_estimate.py::test_only_the_largest_over_ceiling_step_is_reported_once_per_cost_entry` |
|
|
85
|
+
| 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` |
|
|
86
|
+
| 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` |
|
|
87
|
+
| 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` |
|
|
88
|
+
| 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` |
|
|
89
|
+
| 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` |
|
|
90
|
+
| 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` |
|
|
91
|
+
|
|
92
|
+
## Execution and caching
|
|
93
|
+
|
|
94
|
+
| Concept | Owner | Rule | Enforced by |
|
|
95
|
+
| --- | --- | --- | --- |
|
|
96
|
+
| Step cache | `dw/step_cache.py`, `dw/workflow_run.py`: `cache_lookup` | A seeded rerun with unchanged inputs is served from the cache, marked `reused: true`, and writes nothing; `POST /api/memory/clear` (`dw/server/routes/system.py`: `clear_memory`) drops it. | `tests/test_workflow_step_cache.py::test_cache_hit_marks_its_manifest_entry_and_event_reused`, `tests/test_workflow_step_cache.py::test_second_run_with_unchanged_step_reuses_cached_result` |
|
|
97
|
+
| No seed, no cache | `dw/workflow_run.py`: `prepare_run` | A workflow that sets no `seed` skips the cache. | `tests/test_workflow_step_cache.py::TestCacheHits::test_an_unseeded_workflow_has_no_hits` |
|
|
98
|
+
| A different result | `dw/server/routes/jobs.py`, `dw_mcp/tools_jobs.py`: `rerun_job` | `rerun` with `new_seed` draws a fresh seed into the workflow's seed variable. | `tests/test_rerun_new_seed.py::test_a_rerun_with_a_new_seed_draws_one_into_that_variable` |
|
|
99
|
+
| Worker protocol | `dw/worker_protocol.py`: `parse_reply` | Every command and reply is a frozen dataclass that travels as a wire dict. | `tests/test_worker_messages.py::test_from_wire_inverts_to_wire`, `tests/test_worker_messages.py::test_an_unknown_reply_type_is_kept_whole_rather_than_raised` |
|
|
100
|
+
| Persistent worker | `dw/worker.py`, `dw/worker_manager.py`, `dw/serve.py` | Jobs run in one spawned worker that keeps models loaded, so a change to engine code needs a server restart. | — |
|
|
101
|
+
| Failed-run reporting | `dw/worker.py`, `dw/worker_protocol.py`: `Failed`, `Cancelled` | A failed or cancelled run's reply still carries the manifest of the steps that ran. | `tests/test_worker_execute.py::test_failure_carries_the_manifest_of_the_steps_that_ran`, `tests/test_worker_execute.py::test_cancellation_carries_the_manifest_too` |
|
|
102
|
+
| Run-time warnings | `dw/events.py`: `emit_warning` | A warning found at run time is emitted as an event, so it reaches the caller and not just the log. | `tests/test_concat_videos.py::TestWarningsReachTheCaller::test_the_level_spread_warning_is_emitted_as_an_event` |
|
|
103
|
+
|
|
104
|
+
## Media and DSP
|
|
105
|
+
|
|
106
|
+
| Concept | Owner | Rule | Enforced by |
|
|
107
|
+
| --- | --- | --- | --- |
|
|
108
|
+
| 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: —) |
|
|
109
|
+
| 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` |
|
|
110
|
+
| 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` |
|
|
111
|
+
|
|
112
|
+
## Security and architecture guardrails
|
|
113
|
+
|
|
114
|
+
| Concept | Owner | Rule | Enforced by |
|
|
115
|
+
| --- | --- | --- | --- |
|
|
116
|
+
| Path validators | `dw/security.py`: `validate_path`, `validate_workflow_path`, `validate_output_path` | Filesystem access goes through a path validator that is given a base directory. | `tests/test_security.py::test_path_validation`, `.github/codeql/dw-security/DwPathInjection.ql` |
|
|
117
|
+
| URL and argument validators | `dw/security.py`: `validate_url`, `sanitize_command_args` | A URL must be http or https, and a subprocess argument must not carry a shell metacharacter. | `tests/test_security.py::TestValidateUrl::test_dangerous_schemes_are_rejected`, `tests/test_security.py::TestSanitizeCommandArgs::test_every_shell_metacharacter_is_rejected` |
|
|
118
|
+
| Locations from a workflow | `dw/locations.py` | A local path in a workflow's media arguments is confined to a known root, and a URL must not name a host inside the deployment. | `tests/test_locations.py::TestMediaPathContainment::test_absolute_path_outside_every_root_is_refused`, `tests/test_security_ssrf.py::TestInternalAddressSpellings::test_a_name_that_resolves_inside` |
|
|
119
|
+
| 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` |
|
|
120
|
+
| 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` |
|
|
121
|
+
| 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` |
|
|
122
|
+
| 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) |
|
|
123
|
+
| 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` |
|
|
124
|
+
|
|
125
|
+
## Server
|
|
126
|
+
|
|
127
|
+
| Concept | Owner | Rule | Enforced by |
|
|
128
|
+
| --- | --- | --- | --- |
|
|
129
|
+
| App factory | `dw/server/app.py`: `create_app` | `create_app` builds the JobManager and `app.state`, installs the middleware and registers the routes, and all state lives in the JobManager. | — |
|
|
130
|
+
| Routers | `dw/server/routes/*.py`, `dw/server/routes/__init__.py`: `ROUTERS`, `include_routers`, `include_file_routes` | Routers register in `ROUTERS` order, because a greedy `{name:path}` route must come after its specific siblings. The files router comes later, after `/mcp`. | `tests/test_server_downloads.py::test_download_workflow_sets_content_disposition_attachment` |
|
|
131
|
+
| Job queue | `dw/server/jobs.py`: `JobManager` | One runner thread runs jobs FIFO on the single worker. A job carries its own `output_dir`, `asset_dir` and `workflow_dir`, so it stays in its workspace. | `tests/test_server_workspaces.py::TestRunning::test_rerun_stays_in_the_workspace_it_ran_in` (FIFO: —) |
|
|
132
|
+
| Job-to-run link | `dw/server/job_record.py`, `dw/server/jobs.py`: `JobManager.realized` | A job records `run_id`, `run_dir` and `run_version`, and `JobManager.realized` reads that run's `workflow.json`, confined to the output root. | `tests/test_server_jobs.py::test_realized_reads_the_file_the_run_wrote`, `tests/test_server_jobs.py::test_realized_refuses_a_run_dir_that_escapes_the_output_root` |
|
|
133
|
+
| Job history | `dw/server/job_history.py`: `JobHistory` | Finished jobs persist in `jobs.sqlite`, in WAL mode, so the Jobs view survives a restart. | `tests/test_server.py::test_job_history_survives_restart_and_reruns`, `tests/test_job_history_wal.py::test_the_jobs_database_uses_wal_mode` |
|
|
134
|
+
| HTTP security | `dw/server/http_security.py`: `install_middleware`, `query_token_ok` | Every API route needs the token, and only a route marked `query_token_ok` takes it as `?token=`. | `tests/test_security_auth.py::TestTheTokenGate::test_every_api_spelling_needs_the_token`, `tests/test_security_auth.py::TestTheTokenGate::test_the_query_token_is_refused_where_it_is_not_allowed` |
|
|
135
|
+
|
|
136
|
+
## MCP
|
|
137
|
+
|
|
138
|
+
| Concept | Owner | Rule | Enforced by |
|
|
139
|
+
| --- | --- | --- | --- |
|
|
140
|
+
| `dw_mcp` stays torch-free | `dw_mcp/` | `dw_mcp` reaches `dw.serve` over HTTP and imports no `dw` module, because `dw/__init__.py` pulls in torch. | `tests/test_mcp_server.py::TestStartupWeight::test_the_server_starts_without_importing_the_engine` |
|
|
141
|
+
| Tool surface | `dw_mcp/server.py`, `dw_mcp/tools_*.py` | Only these modules import the MCP SDK, and each tool body is a one-line call into a handler. | `tests/test_mcp_server.py::test_the_wiring_table_covers_every_registered_tool`, `tests/test_mcp_server.py::test_the_stated_tool_count_is_the_registered_one` |
|
|
142
|
+
| Surface text budget | the tool docstrings in `dw_mcp/tools_*.py`, the instructions in `dw_mcp/server.py` | The instructions and each tool description stay at or under 2,048 characters, and the whole surface stays within its token budget. | `tests/test_mcp_server.py`: `SURFACE_BUDGET`, `CLIENT_TEXT_LIMIT`; `tests/test_mcp_server.py::test_no_text_the_agent_reads_is_cut_off_by_the_client`, `tests/test_mcp_server.py::test_the_tool_surface_fits_the_budget` |
|
|
143
|
+
| Spending needs consent | `dw_mcp/diagnose.py` | `run_workflow` and `rerun_job` refuse until `acknowledged_cost` is set. | `tests/test_mcp_diagnose.py::test_run_refuses_without_an_acknowledged_cost`, `tests/test_mcp_diagnose.py::test_rerun_refuses_without_an_acknowledged_cost` |
|
|
144
|
+
| API errors | `dw_mcp/client.py` | An API failure becomes a message a person can act on, here and nowhere else. | `tests/test_mcp_client.py::test_a_400_surfaces_the_servers_detail_verbatim` |
|
|
145
|
+
|
|
146
|
+
## UI
|
|
147
|
+
|
|
148
|
+
| Concept | Owner | Rule | Enforced by |
|
|
149
|
+
| --- | --- | --- | --- |
|
|
150
|
+
| The UI reads engine fields | `ui/src/lib/plan.ts`: `describePlan`, `ui/src/lib/results.ts`: `sectionBySubfolder` | The UI reads `plan`, `version` and `subfolder` as fields the server sends and derives nothing of its own, and it never sends `acknowledged_cost`. | `ui/src/lib/plan.test.ts`, `ui/src/lib/results.test.ts` |
|
|
@@ -7,6 +7,24 @@ notes from commits at tag time (see below). This section is a scratch pad
|
|
|
7
7
|
for items a branch's author wants the next release note to name; clear it
|
|
8
8
|
when a release ships.
|
|
9
9
|
|
|
10
|
+
### 0.7.0
|
|
11
|
+
|
|
12
|
+
- A sub-workflow path is resolved by one function (`library.resolve_sub_workflow_reference`) at every site, so a path a run can open is one validation, the realized workflow's digest and the observed-cost lookup can open too.
|
|
13
|
+
- `builtin:builtin:x.json` no longer loads `x.json`: only the leading prefix is stripped, so the name `builtin:x.json` is looked up and reported as `SubWorkflowNotFound`.
|
|
14
|
+
- At run time a missing `builtin:` workflow now raises `SubWorkflowNotFound` (naming the packaged root) instead of `validate_workflow_path`'s missing-file error.
|
|
15
|
+
- The realized workflow's sub-workflow digest and a composed child's observed cost now fall back to the same catalog root, so a catalog sub-workflow a run could open is also digested and costed.
|
|
16
|
+
- A run that fails before it opens its run directory no longer rewrites the previous run's `manifest.json` when the same workflow instance is reused: `Workflow.run` resets the directory and version it carried.
|
|
17
|
+
- The per-variant lines of a kernels "Cannot find a build variant" error are sorted by dw (`kernel_availability.stable_message`), so the message no longer varies by process.
|
|
18
|
+
- The `argument_template` schema description now says what the code does: handed arguments are held on the child at run time, never written into the definition, and an authored value is the fallback.
|
|
19
|
+
- `gain_audio` rounds a frame-addressed region's end once, as `slice_audio` does, so a region's end can no longer be one sample off the matching slice's.
|
|
20
|
+
- `concat_videos` refuses a track with no sample rate (`concat_videos: '<name>' has audio with no sample rate`) instead of joining it unresampled at the wrong speed and pitch; `dissolve_videos` gives the same message in place of the resample error. Save that step with `audio_sample_rate` in its result and join the saved file through an `output:` reference. An unpinned `dissolve_videos` with such a track now raises this `ValueError` rather than a `TypeError`.
|
|
21
|
+
- For developers (Python paths only; nothing on the API or MCP reaches them):
|
|
22
|
+
- `Workflow`'s one-line check methods are gone: `validation_context`, `sub_workflow_warnings`, `adapter_warnings`, `inherited_vram_warnings`, `slice_past_end_warnings`, `shot_span_warnings`, `null_variable_argument_warnings` and `cache_hits`. Call `validation.workflow_context(workflow, ...)`, `validation.run_warning_check(workflow, "<name>", ...)` and `workflow_run.cache_hits(workflow, arguments)`.
|
|
23
|
+
- Reference prefixes (`variable:`, `asset:`, `output:`, ...) are read and built only through `dw.references`; a hand-written prefix check elsewhere fails the `prefix_handling` ratchet.
|
|
24
|
+
- `scripts/arch_metrics.py --check docs/stabilization/baseline.json` runs in CI and `scripts/preflight.sh`, so a PR that raises any architecture metric goes red. The module-size metric is `modules_over_size_ceiling` (fail over 1,100 lines, warn over 1,000), renamed from `modules_over_1000_lines`.
|
|
25
|
+
- Agent context: CLAUDE.md files went from 957 to 129 lines; `docs/ARCHITECTURE.md` is the seam map (concept, owning module, rule, enforced-by).
|
|
26
|
+
- The stabilization freeze is lifted (`stabilization-gate-4`).
|
|
27
|
+
|
|
10
28
|
### 0.6.0
|
|
11
29
|
|
|
12
30
|
<!-- Drafted by the release agent, model claude-opus-5-5 via the anthropic provider, from v0.5.0..54f8a3c9 (stabilization/gate-3). -->
|
|
@@ -207,7 +207,7 @@ def overriding_variables(written, substituted_steps):
|
|
|
207
207
|
|
|
208
208
|
def _reads_variable(tree, name):
|
|
209
209
|
"""Whether anything in `tree` references 'variable:<name>'."""
|
|
210
|
-
reference = references.VARIABLE
|
|
210
|
+
reference = references.make_ref(references.VARIABLE, name)
|
|
211
211
|
if isinstance(tree, str):
|
|
212
212
|
return tree == reference
|
|
213
213
|
if isinstance(tree, dict):
|
|
@@ -200,8 +200,9 @@ def _rewrite(value, path, groups, member):
|
|
|
200
200
|
return _item(value, path, member)
|
|
201
201
|
if references.is_ref(references.PREVIOUS_RESULT, value):
|
|
202
202
|
reference = references.ref_name(references.PREVIOUS_RESULT, value)
|
|
203
|
-
return references.
|
|
204
|
-
|
|
203
|
+
return references.make_ref(
|
|
204
|
+
references.PREVIOUS_RESULT,
|
|
205
|
+
_rewrite_reference(reference, path, groups, member),
|
|
205
206
|
)
|
|
206
207
|
return value
|
|
207
208
|
# A leaf is only copied where the copy is needed: inside a member, where
|
|
@@ -260,7 +261,7 @@ def _gather(value, path, groups):
|
|
|
260
261
|
f"for_each steps available here: {sorted(groups)}",
|
|
261
262
|
)
|
|
262
263
|
return [
|
|
263
|
-
references.PREVIOUS_RESULT
|
|
264
|
+
references.make_ref(references.PREVIOUS_RESULT, member_name(group, key))
|
|
264
265
|
for key in groups[group]["keys"]
|
|
265
266
|
]
|
|
266
267
|
|
|
@@ -289,7 +290,8 @@ def _rewrite_reference(reference, path, groups, member):
|
|
|
289
290
|
raise ForEachError(
|
|
290
291
|
render_path(path),
|
|
291
292
|
f"'{reference}' names the for_each step '{group}' {where}. Use "
|
|
292
|
-
f"'{references.GATHER
|
|
293
|
+
f"'{references.make_ref(references.GATHER, group)}' for every member's "
|
|
294
|
+
f"result, or a reference "
|
|
293
295
|
f"from a for_each step over the same list for the same-keyed member",
|
|
294
296
|
)
|
|
295
297
|
|
|
@@ -33,7 +33,6 @@ from .for_each import MEMBER_SEPARATOR, render_path
|
|
|
33
33
|
from .type_helpers import load_type_from_name
|
|
34
34
|
|
|
35
35
|
ATTN_PROCESSOR_KEY = "attn_processor_type"
|
|
36
|
-
_UNRESOLVED_PREFIXES = references.SUBSTITUTED
|
|
37
36
|
KERNEL_FAULT_MARKER = "cannot be used on this machine"
|
|
38
37
|
|
|
39
38
|
|
|
@@ -91,6 +90,21 @@ def _requires_remote_kernel(attn_processor_class):
|
|
|
91
90
|
return "get_kernel(" in source
|
|
92
91
|
|
|
93
92
|
|
|
93
|
+
def stable_message(message):
|
|
94
|
+
"""Sorts the per-variant lines of a kernels-hub "Cannot find a build
|
|
95
|
+
variant" error, which the hub library lists in set order (different on
|
|
96
|
+
every process). The lines are sorted in place, so their position against
|
|
97
|
+
the rest of the message still counts; any other message passes through
|
|
98
|
+
untouched."""
|
|
99
|
+
if "Cannot find a build variant" not in message:
|
|
100
|
+
return message
|
|
101
|
+
lines = message.split("\n")
|
|
102
|
+
slots = [i for i, line in enumerate(lines) if line.startswith("torch")]
|
|
103
|
+
for i, line in zip(slots, sorted(lines[i] for i in slots)):
|
|
104
|
+
lines[i] = line
|
|
105
|
+
return "\n".join(lines)
|
|
106
|
+
|
|
107
|
+
|
|
94
108
|
class _KernelFault(Exception):
|
|
95
109
|
"""Carries a fault message out of `_fault_for_name` without letting
|
|
96
110
|
`lru_cache` memoize it - see that function's docstring."""
|
|
@@ -123,7 +137,9 @@ def _fault_for_name(value):
|
|
|
123
137
|
try:
|
|
124
138
|
attn_processor_class()
|
|
125
139
|
except Exception as e:
|
|
126
|
-
raise _KernelFault(
|
|
140
|
+
raise _KernelFault(
|
|
141
|
+
f"'{value}' {KERNEL_FAULT_MARKER}: {stable_message(str(e))}"
|
|
142
|
+
) from e
|
|
127
143
|
return None
|
|
128
144
|
|
|
129
145
|
|
|
@@ -142,7 +158,7 @@ def kernel_availability_fault(value):
|
|
|
142
158
|
A fault is not memoized, and so is re-probed on every call - see
|
|
143
159
|
`_fault_for_name`.
|
|
144
160
|
"""
|
|
145
|
-
if not isinstance(value, str) or
|
|
161
|
+
if not isinstance(value, str) or references.is_ref(references.SUBSTITUTED, value):
|
|
146
162
|
return None
|
|
147
163
|
try:
|
|
148
164
|
return _fault_for_name(value)
|