diffusers-workflow 0.11.1__tar.gz → 0.12.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.11.1/diffusers_workflow.egg-info → diffusers_workflow-0.12.0}/PKG-INFO +1 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0/diffusers_workflow.egg-info}/PKG-INFO +1 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/SOURCES.txt +25 -21
- diffusers_workflow-0.12.0/dw/disk_caches.py +471 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/ACCELERATION.md +5 -2
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/ARCHITECTURE.md +3 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/MCP.md +2 -2
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/QUANTIZATION.md +27 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/RELEASING.md +68 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/REMOTE.md +2 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/SECURITY.md +4 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/SERVER.md +46 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/TASKS.md +4 -2
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/WORKER_GUIDE.md +7 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/dsp.py +19 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/media.py +89 -18
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/components.py +44 -8
- diffusers_workflow-0.12.0/dw/quantized_cache.py +917 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/script_lines.py +66 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/serve.py +13 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/api_models.py +59 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/deps.py +25 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/media.py +14 -6
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/system.py +85 -0
- diffusers_workflow-0.11.1/dw/server/ui/assets/cssMode-ukxfz-ce.js → diffusers_workflow-0.12.0/dw/server/ui/assets/cssMode-n9saDHXf.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/editor.api-Bkt_tsj1.js → diffusers_workflow-0.12.0/dw/server/ui/assets/editor.api-DBE2zlnf.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/freemarker2-DbXygLvH.js → diffusers_workflow-0.12.0/dw/server/ui/assets/freemarker2-BomqYelz.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/handlebars-BdhZGoSz.js → diffusers_workflow-0.12.0/dw/server/ui/assets/handlebars-8Houv1UM.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/html-Chhg10Tp.js → diffusers_workflow-0.12.0/dw/server/ui/assets/html-DaY0zzOJ.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/htmlMode-cC3JW4lx.js → diffusers_workflow-0.12.0/dw/server/ui/assets/htmlMode-DP2rYJIT.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/index-BYEwBCrU.css → diffusers_workflow-0.12.0/dw/server/ui/assets/index-CZtjWH1q.css +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/index-CkD0GJG0.js → diffusers_workflow-0.12.0/dw/server/ui/assets/index-DGl2EK47.js +11 -9
- diffusers_workflow-0.11.1/dw/server/ui/assets/javascript-BWWLMkof.js → diffusers_workflow-0.12.0/dw/server/ui/assets/javascript-B5R3UPTQ.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/jsonMode-DrC8C29V.js → diffusers_workflow-0.12.0/dw/server/ui/assets/jsonMode-DsuGIxoD.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/liquid-CXdQfmUT.js → diffusers_workflow-0.12.0/dw/server/ui/assets/liquid-B2d5ZvOn.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/lspLanguageFeatures-BgAhb71w.js → diffusers_workflow-0.12.0/dw/server/ui/assets/lspLanguageFeatures-ChdmQify.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/mdx-CQS0lFaZ.js → diffusers_workflow-0.12.0/dw/server/ui/assets/mdx-DIXDAORJ.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/monaco-Z_sI-RLU.js → diffusers_workflow-0.12.0/dw/server/ui/assets/monaco-BgG3yDUh.js +4 -4
- diffusers_workflow-0.11.1/dw/server/ui/assets/python-C9MtI630.js → diffusers_workflow-0.12.0/dw/server/ui/assets/python-CXHtns6L.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/razor-DPO5mHyR.js → diffusers_workflow-0.12.0/dw/server/ui/assets/razor-BSKKsa7H.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/tsMode-D8vGBTVc.js → diffusers_workflow-0.12.0/dw/server/ui/assets/tsMode-DRjPuZ2P.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/typescript-DyoEkQLT.js → diffusers_workflow-0.12.0/dw/server/ui/assets/typescript-CBpoJtqE.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/workers-Bdewp_DS.js → diffusers_workflow-0.12.0/dw/server/ui/assets/workers-DUo4Mox_.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/xml-DmmKOVWo.js → diffusers_workflow-0.12.0/dw/server/ui/assets/xml-B2gZoNmP.js +1 -1
- diffusers_workflow-0.11.1/dw/server/ui/assets/yaml-C4jCTuer.js → diffusers_workflow-0.12.0/dw/server/ui/assets/yaml-CSvo_Woe.js +1 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/index.html +2 -2
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/assess.py +20 -5
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/audio_transcription.py +53 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/cuts.py +41 -22
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/script_check.py +11 -46
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/catalog.py +10 -3
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/tools_catalog.py +27 -20
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/workspaces.py +31 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/pyproject.toml +1 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_api_contract.py +3 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_assess.py +8 -3
- diffusers_workflow-0.12.0/tests/test_disk_caches.py +769 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_inherited_cost.py +30 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_server.py +7 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_workspaces.py +79 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_info.py +59 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_modular_pipeline.py +19 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_plan_cuts.py +89 -0
- diffusers_workflow-0.12.0/tests/test_quantized_cache.py +1597 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server.py +30 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_assess.py +1 -1
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_step_cache.py +17 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_transcribe_audio.py +115 -3
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/LICENSE +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/MANIFEST.in +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/README.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/requires.txt +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/__init__.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/adapter_compatibility.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/argument_media.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/argument_warnings.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/arguments.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/assessment_rules.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/assets.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/audio_qc.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/cache_blocks.json +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/cache_blocks.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/community_pipelines/pipeline_ltx2_refine.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/content_types.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/devices.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/AGENT_LOOP.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/DEPENDENCIES.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/IP_ADAPTER.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/LORAS.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/RECIPES_24GB.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/TESTING.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/WORKFLOW_GUIDE.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/WORKSPACES.md +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/download_watch.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/elision.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/events.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/for_each.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/guides.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/hold_audio.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/host_memory.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/host_memory_projection.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/hub_cache.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/introspection.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/kernel_availability.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/library.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/locations.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/log_setup.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/lora_catalog.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/lora_catalog_schema.json +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/lora_hub.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/media_frames.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/media_types.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/outbound.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/output_extraction.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/path_redaction.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_ownership.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/adapters.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/chain.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/config_objects.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_guide_steps.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_guides.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_hold.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_hold_steps.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_rules.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/pipeline.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/placement.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/progress.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/remote.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/plan.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/previous_results.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/probe_paths.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/prompt_schema.json +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/prompt_weighting.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/prompts.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/realize.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/reference_limits.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/reference_names.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/references.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/result.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/run.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/runs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/scalar_result_validation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/schema.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/security.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/__init__.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/admission.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/app.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/assess.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/catalog.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/catalog_shape.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/enhancers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/exports.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/guides.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/http_security.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/inline_media.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/job_history.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/job_record.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/job_results.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/jobs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/mcp_mount.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/netinfo.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/observed_cost.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/outputs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/pool.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/__init__.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/assets.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/files.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/gallery.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/jobs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/library.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/loras.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/sysinfo.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/codicon-DF1abBS2.ttf +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/css.worker-C6lDtRpF.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/editor-DjpsE8to.css +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/editor.worker-BmdWdrHZ.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/html.worker-C5yZDBHz.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/json.worker-DdeUAmHa.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/monaco-n7clI0si.css +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ts.worker-DGGa2mF8.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/updater.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/worker_memory.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/settings.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/shot_span_preflight.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/shots.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/slice_preflight.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/step.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/step_cache.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/step_value_checks.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/subfolders.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/task_domains.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/task_problems.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/audio_dynamics.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/audio_handlers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/audio_utils.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/background_remover.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/beats.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/borders.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/compose_text.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/concat_videos.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/depth_estimator.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/diffusion_upscale.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/dissolve_videos.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/face_track.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/finish.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/finish_handlers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/fit.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/format_messages.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/gather.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/grade.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/h3_latent_upscale.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/h3_latent_upscaler_model.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/image_ops.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/image_to_text.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/image_utils.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/interpolate_frames.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/join_into_song.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/joins.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/judge.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/loop_bed.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/lut.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/measure_sync.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/model_cache.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/model_handlers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/pair_audio.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/qr_code.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/registry.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/restore_faces.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/rife_model.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/segment.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/select.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/speech_generation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/stabilize.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/task.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/tensor_image.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/text_generation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/text_sections.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/trim.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/upscale.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/video_handlers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/video_utils.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/voice_attribution.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/windows.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/zoe_depth.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/test.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/trust.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/type_helpers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/type_references.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/validate.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/validation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/variable_constraints.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/variables.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/video_extensions.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/video_size_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/vram_estimate.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/vram_inheritance.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/window_count_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/worker.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/worker_manager.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/worker_protocol.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflow.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflow_run.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflow_schema.json +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflows/h3_context_ir.json +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflows/test.json +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workspace.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/writers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/__init__.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/__main__.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/assets.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/authoring.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/client.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/confine.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/diagnose.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/exports.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/guides.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/loras.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/media.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/models.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/prompts.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/server.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/tools_authoring.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/tools_jobs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/tools_media.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/setup.cfg +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_admission.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_admission_capacity.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_analyze_beats.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_arch_metrics.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_arch_report.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_architecture_map.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_argument_updates.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_arguments.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_assessment_rules.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_assets.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_attention_slicing.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_audio_utils.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_best_of_n_template.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_borders.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_cache_blocks.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_catalog_shape.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_catalog_speed_defaults.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_catalog_structure.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_chain.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ci_config.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_cli.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_component_name_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_component_pruning.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_component_type_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_compose_text.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_concat_videos.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_config_objects.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_configuration_schema.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_content_types.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_depth_estimator.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_device.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_device_helpers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_device_portability.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_dialogue_short_voices.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_diffusion_upscale.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_dissolve_videos.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_docs_links.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_download_watch.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_dsp.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_elision.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_events.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_examples.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_face_track.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_find_loop_bed.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_finish.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_fit_templates.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_fit_to_model.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_for_each.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_gather.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_grade.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_guide_chain_validation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_guides_validation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_adapters.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_context_ir.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_guides.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_hold_audio.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_latent_upscale.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_refine.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_rules.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_schedule.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_upscaler_source.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_vram_ceiling.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_hf_placement.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_host_memory.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_host_memory_projection.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_hub_cache.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_image_ops.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_image_to_text.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_image_utils.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_inductor_cache_default.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ingredients_grid.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_integration.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_interpolate_frames.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_introspection.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_job_history_device.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_job_history_wal.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_job_progress.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_job_warnings.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_jobs_listing.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_jobs_reused.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_join_into_song.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_join_windows.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_judge.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_kernel_availability.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_library_path.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_library_sources.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_list_images.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_locations.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_alpha.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_catalog.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_disable.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_hub.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_library.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx2_diffusion_decode.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx2_extend_clip.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx2_ic_loras.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx2_refine_pipeline.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx_prompt_library.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lut.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_assets.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_authoring.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_catalog.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_client.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_confine.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_diagnose.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_exports.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_guides.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_loras.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_main.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_media.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_models.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_prompts.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_twins.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_measure_sync.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_audio.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_decode_threads.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_frames.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_layering.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mix_audio.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_model_cache.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_modular_output_properties.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_modular_progress.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mps_fallback_warning.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mps_rope_precision.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_null_media.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_numeric_coercion.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_observed_cost.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_offload_placement.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_outbound.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_output_references.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_pair_audio.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_pair_audio_fit.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_parallel_loading_default.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_path_redaction.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_phase_events.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_pipeline_caching.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_pipeline_components.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_plan.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_plugin_skills.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prepare_pipeline.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_previous_result_walker_parity.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_previous_results.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompt_library.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompt_parser.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompt_references.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompt_weighting.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompts.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_read_frame_range.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_real_models.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_realize.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_recenter_crop.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_reference_limits.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_reference_names.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_reference_skip_sets.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_references.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_rerun_new_seed.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_resize_bucket.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_restore_faces_helper_cache.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_restore_faces_video.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_result.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_result_fps.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_result_output_naming.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_rule_parity.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_runs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_runtime_settings.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_scalar_result_validation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_scheduler_config.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_schema.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_script_check.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_auth.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_decoder_bombs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_input_caps.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_ssrf.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_symlinks.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_trust_gate.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_web_headers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_segment.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_select.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_select_validation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_separate_stems.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_serve_main.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_downloads.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_exports.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_gallery_image.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_guides.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_info.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_jobs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_library_path.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_loras.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_mcp.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_workspaces.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_shaping_logs.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_shot_span_preflight.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_shots.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_slice_preflight.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_speech_generation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_stabilize.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_step.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_strip_exif_and_watermark.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_sub_workflow_resolver.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_subfolders.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_discovery.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_domains.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_public_imports.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_registry_rules.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_signature_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_template_defaults.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_template_subfolders.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_tensor_image.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_text_generation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_text_sections.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_trim_video.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_type_helpers.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_type_helpers_concurrency.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ui_twins.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_updater.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_validate_arguments.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_validation.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_variable_constraints.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_variables.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_video_extensions.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_video_size_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_video_utils.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_voice_attribution.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_vram_estimate.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_vram_guides.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_vram_inheritance.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_window_count_errors.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_window_video.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_execute.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_job_peak_rss.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_manager.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_messages.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_pool.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow_run_keys.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow_snapshot.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow_step_cache.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow_trust.py +0 -0
- {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workspace.py +0 -0
{diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/SOURCES.txt
RENAMED
|
@@ -20,6 +20,7 @@ dw/cache_blocks.json
|
|
|
20
20
|
dw/cache_blocks.py
|
|
21
21
|
dw/content_types.py
|
|
22
22
|
dw/devices.py
|
|
23
|
+
dw/disk_caches.py
|
|
23
24
|
dw/dissolve_frame_errors.py
|
|
24
25
|
dw/download_watch.py
|
|
25
26
|
dw/dsp.py
|
|
@@ -52,6 +53,7 @@ dw/probe_paths.py
|
|
|
52
53
|
dw/prompt_schema.json
|
|
53
54
|
dw/prompt_weighting.py
|
|
54
55
|
dw/prompts.py
|
|
56
|
+
dw/quantized_cache.py
|
|
55
57
|
dw/realize.py
|
|
56
58
|
dw/reference_limits.py
|
|
57
59
|
dw/reference_names.py
|
|
@@ -179,44 +181,44 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
|
|
|
179
181
|
dw/server/ui/assets/csp-bTuwJoIa.js
|
|
180
182
|
dw/server/ui/assets/css-DIMkf-bt.js
|
|
181
183
|
dw/server/ui/assets/css.worker-C6lDtRpF.js
|
|
182
|
-
dw/server/ui/assets/cssMode-
|
|
184
|
+
dw/server/ui/assets/cssMode-n9saDHXf.js
|
|
183
185
|
dw/server/ui/assets/cypher-CVaqCwHa.js
|
|
184
186
|
dw/server/ui/assets/dart-onAF5SnQ.js
|
|
185
187
|
dw/server/ui/assets/dockerfile-DZFCIeNp.js
|
|
186
188
|
dw/server/ui/assets/ecl-D05T4iGw.js
|
|
187
189
|
dw/server/ui/assets/editor-DjpsE8to.css
|
|
188
|
-
dw/server/ui/assets/editor.api-
|
|
190
|
+
dw/server/ui/assets/editor.api-DBE2zlnf.js
|
|
189
191
|
dw/server/ui/assets/editor.worker-BmdWdrHZ.js
|
|
190
192
|
dw/server/ui/assets/elixir-6RTg0lbw.js
|
|
191
193
|
dw/server/ui/assets/flow9-C5_-GSwl.js
|
|
192
|
-
dw/server/ui/assets/freemarker2-
|
|
194
|
+
dw/server/ui/assets/freemarker2-BomqYelz.js
|
|
193
195
|
dw/server/ui/assets/fsharp-C8Ef5oNN.js
|
|
194
196
|
dw/server/ui/assets/go-C-y9NEjX.js
|
|
195
197
|
dw/server/ui/assets/graphql-fmXr3nnJ.js
|
|
196
|
-
dw/server/ui/assets/handlebars-
|
|
198
|
+
dw/server/ui/assets/handlebars-8Houv1UM.js
|
|
197
199
|
dw/server/ui/assets/hcl-CpzslTdj.js
|
|
198
|
-
dw/server/ui/assets/html-
|
|
200
|
+
dw/server/ui/assets/html-DaY0zzOJ.js
|
|
199
201
|
dw/server/ui/assets/html.worker-C5yZDBHz.js
|
|
200
|
-
dw/server/ui/assets/htmlMode-
|
|
201
|
-
dw/server/ui/assets/index-
|
|
202
|
-
dw/server/ui/assets/index-
|
|
202
|
+
dw/server/ui/assets/htmlMode-DP2rYJIT.js
|
|
203
|
+
dw/server/ui/assets/index-CZtjWH1q.css
|
|
204
|
+
dw/server/ui/assets/index-DGl2EK47.js
|
|
203
205
|
dw/server/ui/assets/ini-sBoK_t0W.js
|
|
204
206
|
dw/server/ui/assets/java-BEtHBSE6.js
|
|
205
|
-
dw/server/ui/assets/javascript-
|
|
207
|
+
dw/server/ui/assets/javascript-B5R3UPTQ.js
|
|
206
208
|
dw/server/ui/assets/json.worker-DdeUAmHa.js
|
|
207
|
-
dw/server/ui/assets/jsonMode-
|
|
209
|
+
dw/server/ui/assets/jsonMode-DsuGIxoD.js
|
|
208
210
|
dw/server/ui/assets/julia-Bri6UV-V.js
|
|
209
211
|
dw/server/ui/assets/kotlin-BOotOW0E.js
|
|
210
212
|
dw/server/ui/assets/less-B9JPFI3C.js
|
|
211
213
|
dw/server/ui/assets/lexon-CfSJPG6W.js
|
|
212
|
-
dw/server/ui/assets/liquid-
|
|
213
|
-
dw/server/ui/assets/lspLanguageFeatures-
|
|
214
|
+
dw/server/ui/assets/liquid-B2d5ZvOn.js
|
|
215
|
+
dw/server/ui/assets/lspLanguageFeatures-ChdmQify.js
|
|
214
216
|
dw/server/ui/assets/lua-CsQS60Ue.js
|
|
215
217
|
dw/server/ui/assets/m3-D-oSqn_W.js
|
|
216
218
|
dw/server/ui/assets/markdown-Cimd5fb3.js
|
|
217
|
-
dw/server/ui/assets/mdx-
|
|
219
|
+
dw/server/ui/assets/mdx-DIXDAORJ.js
|
|
218
220
|
dw/server/ui/assets/mips-CIPQ_RoX.js
|
|
219
|
-
dw/server/ui/assets/monaco-
|
|
221
|
+
dw/server/ui/assets/monaco-BgG3yDUh.js
|
|
220
222
|
dw/server/ui/assets/monaco-n7clI0si.css
|
|
221
223
|
dw/server/ui/assets/msdax-DauUninz.js
|
|
222
224
|
dw/server/ui/assets/mysql-SOo6toE5.js
|
|
@@ -232,10 +234,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
|
|
|
232
234
|
dw/server/ui/assets/powershell-DmHpPYUd.js
|
|
233
235
|
dw/server/ui/assets/protobuf-C531GsRP.js
|
|
234
236
|
dw/server/ui/assets/pug-Z5eAx3Zn.js
|
|
235
|
-
dw/server/ui/assets/python-
|
|
237
|
+
dw/server/ui/assets/python-CXHtns6L.js
|
|
236
238
|
dw/server/ui/assets/qsharp-DkqhCAOL.js
|
|
237
239
|
dw/server/ui/assets/r-BwWrilGY.js
|
|
238
|
-
dw/server/ui/assets/razor-
|
|
240
|
+
dw/server/ui/assets/razor-BSKKsa7H.js
|
|
239
241
|
dw/server/ui/assets/redis-ClamHrr6.js
|
|
240
242
|
dw/server/ui/assets/redshift-DT7zqm-g.js
|
|
241
243
|
dw/server/ui/assets/restructuredtext-BYgofb2h.js
|
|
@@ -255,15 +257,15 @@ dw/server/ui/assets/swift-Bxkupp3x.js
|
|
|
255
257
|
dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
|
|
256
258
|
dw/server/ui/assets/tcl-DISqw1ZD.js
|
|
257
259
|
dw/server/ui/assets/ts.worker-DGGa2mF8.js
|
|
258
|
-
dw/server/ui/assets/tsMode-
|
|
260
|
+
dw/server/ui/assets/tsMode-DRjPuZ2P.js
|
|
259
261
|
dw/server/ui/assets/twig-De2hgUGE.js
|
|
260
|
-
dw/server/ui/assets/typescript-
|
|
262
|
+
dw/server/ui/assets/typescript-CBpoJtqE.js
|
|
261
263
|
dw/server/ui/assets/typespec-B8J7ngcE.js
|
|
262
264
|
dw/server/ui/assets/vb-DV3o63ZY.js
|
|
263
265
|
dw/server/ui/assets/wgsl-DpFanUEy.js
|
|
264
|
-
dw/server/ui/assets/workers-
|
|
265
|
-
dw/server/ui/assets/xml-
|
|
266
|
-
dw/server/ui/assets/yaml-
|
|
266
|
+
dw/server/ui/assets/workers-DUo4Mox_.js
|
|
267
|
+
dw/server/ui/assets/xml-B2gZoNmP.js
|
|
268
|
+
dw/server/ui/assets/yaml-CSvo_Woe.js
|
|
267
269
|
dw/tasks/assess.py
|
|
268
270
|
dw/tasks/audio_dynamics.py
|
|
269
271
|
dw/tasks/audio_handlers.py
|
|
@@ -380,6 +382,7 @@ tests/test_device_helpers.py
|
|
|
380
382
|
tests/test_device_portability.py
|
|
381
383
|
tests/test_dialogue_short_voices.py
|
|
382
384
|
tests/test_diffusion_upscale.py
|
|
385
|
+
tests/test_disk_caches.py
|
|
383
386
|
tests/test_dissolve_frame_errors.py
|
|
384
387
|
tests/test_dissolve_videos.py
|
|
385
388
|
tests/test_docs_links.py
|
|
@@ -499,6 +502,7 @@ tests/test_prompt_parser.py
|
|
|
499
502
|
tests/test_prompt_references.py
|
|
500
503
|
tests/test_prompt_weighting.py
|
|
501
504
|
tests/test_prompts.py
|
|
505
|
+
tests/test_quantized_cache.py
|
|
502
506
|
tests/test_read_frame_range.py
|
|
503
507
|
tests/test_real_models.py
|
|
504
508
|
tests/test_realize.py
|
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
"""dw's own disk caches: what derived data its runs leave on disk, how big it
|
|
2
|
+
is, and clearing it (#828).
|
|
3
|
+
|
|
4
|
+
Each cache is a `DiskCache` in `CACHES`, named by the REST routes
|
|
5
|
+
(`GET /api/caches`, `DELETE /api/caches/{name}`) and summarized in the MCP
|
|
6
|
+
`get_server_info`'s `caches`:
|
|
7
|
+
|
|
8
|
+
- `inductor`: torch.compile's kernels, under `TORCHINDUCTOR_CACHE_DIR`, which
|
|
9
|
+
`dw/__init__.py` always sets.
|
|
10
|
+
- `triton`: Triton's compiled and autotuned kernels (SDNQ's `triton.jit` /
|
|
11
|
+
`triton.autotune` matmul and attention, most of the compile disk use).
|
|
12
|
+
Registered where Triton itself puts it - `TRITON_CACHE_DIR`, else
|
|
13
|
+
`$TRITON_HOME/.triton/cache`, else `~/.triton/cache` - resolved here
|
|
14
|
+
without importing triton. dw sets no `TRITON_*` variable and never creates
|
|
15
|
+
that directory.
|
|
16
|
+
- `quantized`: SDNQ components quantized once and saved (#815,
|
|
17
|
+
`dw/quantized_cache.py`), under `DW_QUANTIZED_CACHE_DIR`, enabled by
|
|
18
|
+
`DW_QUANTIZED_CACHE=1`. Its entries - one `<64-hex key>/` directory each,
|
|
19
|
+
described by its `entry.json` - are listed and can be deleted one at a time
|
|
20
|
+
(`DELETE /api/caches/quantized/entries/{entry}`). A cache that is off still
|
|
21
|
+
lists, and still clears, what is on disk.
|
|
22
|
+
|
|
23
|
+
**Clearing never trusts the root.** A root comes from an env var, and one
|
|
24
|
+
pointed at `~` by mistake must not be emptied. Only a root carrying the
|
|
25
|
+
`.dw-cache` marker is clearable. `mark_roots()`, run once at `dw.serve`
|
|
26
|
+
start, writes it into a root that is empty or missing (a missing `triton`
|
|
27
|
+
root is left missing), or into a populated root equal to the member's
|
|
28
|
+
default exactly - the cache dw (or Triton, by default) has been filling all
|
|
29
|
+
along. A populated root anywhere else stays unmarked and its clear is
|
|
30
|
+
refused, until someone marks it by hand.
|
|
31
|
+
|
|
32
|
+
**Clear empties the root and keeps it and its marker:** every top-level child
|
|
33
|
+
is renamed into one `<root>/.clearing-<pid>-<rand>/` directory, which is then
|
|
34
|
+
deleted. A writer racing the clear finds an empty cache and rebuilds; it never
|
|
35
|
+
reads a half-deleted tree. An entry delete moves the one entry the same way. The
|
|
36
|
+
routes refuse while a job is running or queued.
|
|
37
|
+
|
|
38
|
+
**An entry id must have a cache key's shape** (`quantized_cache.is_key`, 64
|
|
39
|
+
lowercase hex) before any path is built from it.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
import importlib.util
|
|
43
|
+
import logging
|
|
44
|
+
import os
|
|
45
|
+
import secrets
|
|
46
|
+
import shutil
|
|
47
|
+
import threading
|
|
48
|
+
from dataclasses import dataclass
|
|
49
|
+
from typing import Callable
|
|
50
|
+
|
|
51
|
+
from . import _inductor_cache_dir_default, quantized_cache
|
|
52
|
+
from .security import SecurityError, validate_path
|
|
53
|
+
|
|
54
|
+
logger = logging.getLogger("dw")
|
|
55
|
+
|
|
56
|
+
MARKER = ".dw-cache"
|
|
57
|
+
_CLEARING_PREFIX = ".clearing-"
|
|
58
|
+
_MARKER_TEXT = (
|
|
59
|
+
"This directory is a cache dw may empty from its server page or "
|
|
60
|
+
"DELETE /api/caches. Delete this file to stop that.\n"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# One clear at a time: a second one would find the first's staging directory
|
|
64
|
+
# among the root's children and move it out from under its rmtree
|
|
65
|
+
_clear_lock = threading.Lock()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class UnknownCache(ValueError):
|
|
69
|
+
pass
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class NotClearable(Exception):
|
|
73
|
+
pass
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class NoEntries(ValueError):
|
|
77
|
+
"""An entry operation on a cache that has no entries, or an entry id
|
|
78
|
+
that isn't one (a 400)."""
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class UnknownEntry(ValueError):
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@dataclass(frozen=True)
|
|
86
|
+
class DiskCache:
|
|
87
|
+
name: str
|
|
88
|
+
# The absolute root, from the environment as it stands
|
|
89
|
+
root: Callable[[], str]
|
|
90
|
+
# The root with the member's env var unset - only for grandfathering
|
|
91
|
+
default_root: Callable[[], str]
|
|
92
|
+
enabled: Callable[[], bool]
|
|
93
|
+
cost_of_clearing: str
|
|
94
|
+
# Whether the cache lists entries of its own: `<root>/<64-hex id>/`
|
|
95
|
+
# directories, each described by an `entry.json`
|
|
96
|
+
has_entries: bool = False
|
|
97
|
+
# Whether mark_roots may create a missing root
|
|
98
|
+
create_root: bool = True
|
|
99
|
+
# The free space under which the cache's volume reads `low_disk`, from
|
|
100
|
+
# the volume's total - for a cache that refuses to write below a floor
|
|
101
|
+
low_disk_floor: Callable[[int], int] | None = None
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _inductor_root():
|
|
105
|
+
return os.path.abspath(
|
|
106
|
+
os.environ.get("TORCHINDUCTOR_CACHE_DIR")
|
|
107
|
+
or _inductor_cache_dir_default(os.environ)
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _inductor_default():
|
|
112
|
+
return os.path.abspath(_inductor_cache_dir_default(os.environ))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _triton_default():
|
|
116
|
+
return os.path.abspath(os.path.join(os.path.expanduser("~"), ".triton", "cache"))
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _triton_root():
|
|
120
|
+
"""Where Triton caches, as triton.knobs resolves it - without importing
|
|
121
|
+
triton, which the server process never loads and macOS doesn't have."""
|
|
122
|
+
explicit = os.environ.get("TRITON_CACHE_DIR", "").strip()
|
|
123
|
+
if explicit:
|
|
124
|
+
return os.path.abspath(os.path.expanduser(explicit))
|
|
125
|
+
home = os.environ.get("TRITON_HOME", "").strip()
|
|
126
|
+
if home:
|
|
127
|
+
return os.path.abspath(
|
|
128
|
+
os.path.join(os.path.expanduser(home), ".triton", "cache")
|
|
129
|
+
)
|
|
130
|
+
return _triton_default()
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _triton_installed():
|
|
134
|
+
# find_spec on a top-level name looks for it without importing it. The
|
|
135
|
+
# workers run in this interpreter's environment, so this is theirs too
|
|
136
|
+
return importlib.util.find_spec("triton") is not None
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
CACHES = {
|
|
140
|
+
cache.name: cache
|
|
141
|
+
for cache in (
|
|
142
|
+
DiskCache(
|
|
143
|
+
name="inductor",
|
|
144
|
+
root=_inductor_root,
|
|
145
|
+
default_root=_inductor_default,
|
|
146
|
+
enabled=lambda: True,
|
|
147
|
+
cost_of_clearing=(
|
|
148
|
+
"The next first step of each torch.compile'd shape compiles "
|
|
149
|
+
"its kernels again, up to a few minutes per shape."
|
|
150
|
+
),
|
|
151
|
+
),
|
|
152
|
+
DiskCache(
|
|
153
|
+
name="triton",
|
|
154
|
+
root=_triton_root,
|
|
155
|
+
default_root=_triton_default,
|
|
156
|
+
enabled=_triton_installed,
|
|
157
|
+
cost_of_clearing=(
|
|
158
|
+
"The next first step of each SDNQ or compiled shape "
|
|
159
|
+
"re-autotunes its Triton kernels (100-300 s on MiniMax-H3). "
|
|
160
|
+
"This directory is shared with any other Triton user on "
|
|
161
|
+
"this machine, whose kernels are cleared too."
|
|
162
|
+
),
|
|
163
|
+
# A box without Triton gets no stray directory
|
|
164
|
+
create_root=False,
|
|
165
|
+
),
|
|
166
|
+
DiskCache(
|
|
167
|
+
name="quantized",
|
|
168
|
+
root=quantized_cache.cache_root,
|
|
169
|
+
default_root=quantized_cache.default_root,
|
|
170
|
+
enabled=quantized_cache.enabled,
|
|
171
|
+
cost_of_clearing=(
|
|
172
|
+
"The next load of each SDNQ-quantized component reads its "
|
|
173
|
+
"bf16 weights and quantizes them again (minutes per component "
|
|
174
|
+
"on MiniMax-H3), and saves a new entry while the cache is on."
|
|
175
|
+
),
|
|
176
|
+
has_entries=True,
|
|
177
|
+
# configure_at_startup creates it when the cache is on; a server
|
|
178
|
+
# with it off gets no stray directory
|
|
179
|
+
create_root=False,
|
|
180
|
+
low_disk_floor=quantized_cache.floor_bytes,
|
|
181
|
+
),
|
|
182
|
+
)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def get(name):
|
|
187
|
+
try:
|
|
188
|
+
return CACHES[name]
|
|
189
|
+
except (KeyError, TypeError):
|
|
190
|
+
raise UnknownCache(
|
|
191
|
+
f"Unknown cache {name!r} - the caches are: {', '.join(CACHES)}"
|
|
192
|
+
) from None
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _children(root):
|
|
196
|
+
"""The root's entries other than the marker."""
|
|
197
|
+
with os.scandir(root) as entries:
|
|
198
|
+
return [entry for entry in entries if entry.name != MARKER]
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _has_marker(root):
|
|
202
|
+
return os.path.isfile(os.path.join(root, MARKER)) and not os.path.islink(
|
|
203
|
+
os.path.join(root, MARKER)
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _write_marker(root):
|
|
208
|
+
marker = validate_path(os.path.join(root, MARKER), base_dir=root)
|
|
209
|
+
with open(marker, "w") as f:
|
|
210
|
+
f.write(_MARKER_TEXT)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def mark_root(cache):
|
|
214
|
+
"""Mark one cache's root as dw's to clear, if the rule allows it.
|
|
215
|
+
Returns whether the root carries the marker afterwards."""
|
|
216
|
+
root = cache.root()
|
|
217
|
+
if os.path.islink(root) or (os.path.exists(root) and not os.path.isdir(root)):
|
|
218
|
+
return False
|
|
219
|
+
if not os.path.exists(root):
|
|
220
|
+
if not cache.create_root:
|
|
221
|
+
return False
|
|
222
|
+
os.makedirs(root, exist_ok=True)
|
|
223
|
+
if _has_marker(root):
|
|
224
|
+
return True
|
|
225
|
+
if _children(root) and root != cache.default_root():
|
|
226
|
+
logger.info(
|
|
227
|
+
f"The {cache.name} cache at {root} was not created by dw and "
|
|
228
|
+
f"has no {MARKER} marker, so it can't be cleared from the server"
|
|
229
|
+
)
|
|
230
|
+
return False
|
|
231
|
+
_write_marker(root)
|
|
232
|
+
return True
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def mark_roots():
|
|
236
|
+
"""Write the ownership marker into each cache root the rule allows. Run
|
|
237
|
+
once at server start; a root it can't write is left unclearable."""
|
|
238
|
+
for cache in CACHES.values():
|
|
239
|
+
try:
|
|
240
|
+
mark_root(cache)
|
|
241
|
+
except (OSError, SecurityError) as e:
|
|
242
|
+
logger.warning(f"Could not mark the {cache.name} cache: {e}")
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def _walk(top):
|
|
246
|
+
"""(bytes, files, newest mtime) of the regular files under `top`,
|
|
247
|
+
symlinks neither followed nor counted, the marker not counted."""
|
|
248
|
+
total, files, newest = 0, 0, None
|
|
249
|
+
stack = [top]
|
|
250
|
+
while stack:
|
|
251
|
+
directory = stack.pop()
|
|
252
|
+
try:
|
|
253
|
+
entries = os.scandir(directory)
|
|
254
|
+
except OSError:
|
|
255
|
+
continue
|
|
256
|
+
with entries:
|
|
257
|
+
for entry in entries:
|
|
258
|
+
try:
|
|
259
|
+
if entry.is_dir(follow_symlinks=False):
|
|
260
|
+
stack.append(entry.path)
|
|
261
|
+
continue
|
|
262
|
+
if not entry.is_file(follow_symlinks=False):
|
|
263
|
+
continue
|
|
264
|
+
if entry.name == MARKER and directory == top:
|
|
265
|
+
continue
|
|
266
|
+
stat = entry.stat(follow_symlinks=False)
|
|
267
|
+
except OSError:
|
|
268
|
+
# A file deleted mid-walk (a racing compile's temp file)
|
|
269
|
+
continue
|
|
270
|
+
total += stat.st_size
|
|
271
|
+
files += 1
|
|
272
|
+
if newest is None or stat.st_mtime > newest:
|
|
273
|
+
newest = stat.st_mtime
|
|
274
|
+
return total, files, newest
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def _volume(path):
|
|
278
|
+
"""shutil.disk_usage of the volume `path` is (or would be) on: a missing
|
|
279
|
+
root is measured at its nearest existing ancestor."""
|
|
280
|
+
while path and not os.path.exists(path):
|
|
281
|
+
parent = os.path.dirname(path)
|
|
282
|
+
if parent == path:
|
|
283
|
+
return None
|
|
284
|
+
path = parent
|
|
285
|
+
try:
|
|
286
|
+
return shutil.disk_usage(path)
|
|
287
|
+
except OSError:
|
|
288
|
+
return None
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def _reason(cache):
|
|
292
|
+
"""Why `cache` can't be cleared now, or None. A root that came into being
|
|
293
|
+
after server start (Triton's, made by the first compile) is marked here
|
|
294
|
+
by the same rule mark_roots applies at startup."""
|
|
295
|
+
root = cache.root()
|
|
296
|
+
if os.path.isdir(root) and not _has_marker(root):
|
|
297
|
+
try:
|
|
298
|
+
mark_root(cache)
|
|
299
|
+
except (OSError, SecurityError) as e:
|
|
300
|
+
logger.warning(f"Could not mark the {cache.name} cache: {e}")
|
|
301
|
+
return _not_clearable_reason(root)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def _not_clearable_reason(root):
|
|
305
|
+
if not os.path.isdir(root) or os.path.islink(root):
|
|
306
|
+
return "root does not exist (nothing to clear)"
|
|
307
|
+
if not _has_marker(root):
|
|
308
|
+
return f"root not created by dw (no {MARKER} marker)"
|
|
309
|
+
return None
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def scan(cache):
|
|
313
|
+
"""One cache as plain data."""
|
|
314
|
+
root = cache.root()
|
|
315
|
+
present = os.path.isdir(root) and not os.path.islink(root)
|
|
316
|
+
total, files, newest = _walk(root) if present else (0, 0, None)
|
|
317
|
+
usage = _volume(root)
|
|
318
|
+
reason = _reason(cache)
|
|
319
|
+
info = {
|
|
320
|
+
"name": cache.name,
|
|
321
|
+
"root": root,
|
|
322
|
+
"enabled": cache.enabled(),
|
|
323
|
+
"bytes": total,
|
|
324
|
+
"files": files,
|
|
325
|
+
"last_used": newest,
|
|
326
|
+
"clearable": reason is None,
|
|
327
|
+
"cost_of_clearing": cache.cost_of_clearing,
|
|
328
|
+
"disk_free": usage.free if usage else None,
|
|
329
|
+
"disk_total": usage.total if usage else None,
|
|
330
|
+
}
|
|
331
|
+
if reason:
|
|
332
|
+
info["not_clearable_reason"] = reason
|
|
333
|
+
if cache.low_disk_floor and usage:
|
|
334
|
+
info["low_disk"] = usage.free < cache.low_disk_floor(usage.total)
|
|
335
|
+
if cache.has_entries:
|
|
336
|
+
info["entries"] = scan_entries(root) if present else []
|
|
337
|
+
return info
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def _entry_fields(path):
|
|
341
|
+
"""What an entry's `entry.json` says of it, or None when it can't be
|
|
342
|
+
read. `component` falls back to the subfolder - the component's name in
|
|
343
|
+
a diffusers repo - since entry.json doesn't record it."""
|
|
344
|
+
try:
|
|
345
|
+
entry = quantized_cache.read_entry(path)
|
|
346
|
+
except (OSError, ValueError):
|
|
347
|
+
return None
|
|
348
|
+
return {
|
|
349
|
+
"model": entry.get("model_name"),
|
|
350
|
+
"subfolder": entry.get("subfolder"),
|
|
351
|
+
"component": entry.get("component") or entry.get("subfolder") or None,
|
|
352
|
+
"created": entry.get("created"),
|
|
353
|
+
"last_hit": entry.get("last_hit"),
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def scan_entries(root):
|
|
358
|
+
"""Each `<64-hex id>/` directory under a cache root, newest first. An
|
|
359
|
+
entry whose `entry.json` is missing or unreadable is listed with
|
|
360
|
+
`unreadable: true`, so it can still be deleted."""
|
|
361
|
+
entries = []
|
|
362
|
+
with os.scandir(root) as children:
|
|
363
|
+
for child in children:
|
|
364
|
+
if not quantized_cache.is_key(child.name) or not child.is_dir(
|
|
365
|
+
follow_symlinks=False
|
|
366
|
+
):
|
|
367
|
+
continue
|
|
368
|
+
total, files, newest = _walk(child.path)
|
|
369
|
+
fields = _entry_fields(child.path)
|
|
370
|
+
entry = {"id": child.name, "bytes": total, "files": files}
|
|
371
|
+
if fields is None:
|
|
372
|
+
entry.update(
|
|
373
|
+
unreadable=True,
|
|
374
|
+
model=None,
|
|
375
|
+
subfolder=None,
|
|
376
|
+
component=None,
|
|
377
|
+
created=newest,
|
|
378
|
+
last_hit=None,
|
|
379
|
+
)
|
|
380
|
+
else:
|
|
381
|
+
entry.update(unreadable=False, **fields)
|
|
382
|
+
entries.append(entry)
|
|
383
|
+
entries.sort(key=lambda e: e["created"] or 0, reverse=True)
|
|
384
|
+
return entries
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
def scan_all():
|
|
388
|
+
return [scan(cache) for cache in CACHES.values()]
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def entry_cache(name, entry):
|
|
392
|
+
"""The cache an entry route names, after checking the id's shape - so
|
|
393
|
+
nothing builds a path from a malformed one. Raises UnknownCache, or
|
|
394
|
+
NoEntries for a cache without entries or an id that isn't 64 hex."""
|
|
395
|
+
cache = get(name)
|
|
396
|
+
if not cache.has_entries:
|
|
397
|
+
raise NoEntries(f"The {name} cache has no entries - clear it whole")
|
|
398
|
+
if not quantized_cache.is_key(entry):
|
|
399
|
+
raise NoEntries(f"Not an entry id: {entry!r} (64 lowercase hex characters)")
|
|
400
|
+
return cache
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def _stage_out(root, sources):
|
|
404
|
+
"""Move `sources` (paths directly under `root`) into one fresh
|
|
405
|
+
`.clearing-*` directory and delete it. Returns (bytes, files) removed."""
|
|
406
|
+
staging = validate_path(
|
|
407
|
+
os.path.join(root, f"{_CLEARING_PREFIX}{os.getpid()}-{secrets.token_hex(4)}"),
|
|
408
|
+
base_dir=root,
|
|
409
|
+
)
|
|
410
|
+
os.mkdir(staging)
|
|
411
|
+
try:
|
|
412
|
+
for path in sources:
|
|
413
|
+
try:
|
|
414
|
+
source = validate_path(path, base_dir=root)
|
|
415
|
+
target = validate_path(
|
|
416
|
+
os.path.join(staging, os.path.basename(path)), base_dir=root
|
|
417
|
+
)
|
|
418
|
+
except SecurityError:
|
|
419
|
+
# A name validate_path refuses (one holding "..") stays
|
|
420
|
+
continue
|
|
421
|
+
try:
|
|
422
|
+
os.rename(source, target)
|
|
423
|
+
except FileNotFoundError:
|
|
424
|
+
continue
|
|
425
|
+
freed, files, _ = _walk(staging)
|
|
426
|
+
finally:
|
|
427
|
+
shutil.rmtree(staging, ignore_errors=True)
|
|
428
|
+
return freed, files
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def delete_entry(name, entry):
|
|
432
|
+
"""Delete one entry of a marked cache root. Returns `{freed, files}`.
|
|
433
|
+
|
|
434
|
+
Raises UnknownCache, NoEntries (no entries here, or a malformed id),
|
|
435
|
+
NotClearable for a root without the marker, or UnknownEntry - each
|
|
436
|
+
before anything is moved."""
|
|
437
|
+
cache = entry_cache(name, entry)
|
|
438
|
+
with _clear_lock:
|
|
439
|
+
root = cache.root()
|
|
440
|
+
reason = _reason(cache)
|
|
441
|
+
if reason:
|
|
442
|
+
raise NotClearable(f"The {name} cache at {root} can't be changed: {reason}")
|
|
443
|
+
root = validate_path(root)
|
|
444
|
+
path = quantized_cache.entry_path(root, entry)
|
|
445
|
+
if os.path.islink(path) or not os.path.isdir(path):
|
|
446
|
+
raise UnknownEntry(f"The {name} cache has no entry {entry}")
|
|
447
|
+
freed, files = _stage_out(root, [path])
|
|
448
|
+
logger.info(f"Deleted {name} cache entry {entry} ({freed} bytes, {files} files)")
|
|
449
|
+
return {"freed": freed, "files": files}
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def clear(name):
|
|
453
|
+
"""Empty a marked cache root, keeping the root and its marker. Returns
|
|
454
|
+
`{freed, files}` for what was removed.
|
|
455
|
+
|
|
456
|
+
Raises UnknownCache for a name not in the registry and NotClearable for a
|
|
457
|
+
root without the marker - before anything is moved."""
|
|
458
|
+
cache = get(name)
|
|
459
|
+
with _clear_lock:
|
|
460
|
+
root = cache.root()
|
|
461
|
+
reason = _reason(cache)
|
|
462
|
+
if reason:
|
|
463
|
+
raise NotClearable(f"The {name} cache at {root} can't be cleared: {reason}")
|
|
464
|
+
root = validate_path(root)
|
|
465
|
+
# A link is left alone: validate_path resolves it, so the rename
|
|
466
|
+
# would move its target, not the link
|
|
467
|
+
freed, files = _stage_out(
|
|
468
|
+
root, [entry.path for entry in _children(root) if not entry.is_symlink()]
|
|
469
|
+
)
|
|
470
|
+
logger.info(f"Cleared the {name} cache at {root} ({freed} bytes, {files} files)")
|
|
471
|
+
return {"freed": freed, "files": files}
|
|
@@ -160,6 +160,8 @@ A component can also pin its backend persistently instead, via `set_attention_ba
|
|
|
160
160
|
|
|
161
161
|
Prefer the pinned form for a compiled component - the per-call context manager switches implementations under the compiled graph and forces a recompile on every run.
|
|
162
162
|
|
|
163
|
+
Either form stays on what it names. diffusers' `set_attention_backend` also makes its backend the process-wide default, which the persistent worker would keep for every later model; dw restores the default after pinning, so an H3 `sage_hub` pin cannot reach a Music3 or LTX job that follows it. The server-wide default is `DIFFUSERS_ATTN_BACKEND` in `.env` - leave it `native`, since it reaches every model and sage cannot serve all of them.
|
|
164
|
+
|
|
163
165
|
## Attention Slicing
|
|
164
166
|
|
|
165
167
|
```json
|
|
@@ -198,8 +200,9 @@ Compile a component once it is fully configured - the graph captures final dtype
|
|
|
198
200
|
|
|
199
201
|
Typical gains are 1.3-1.5x on diffusion transformers, and compilation stacks with the caches above. Notes:
|
|
200
202
|
|
|
201
|
-
- **First run pays the compile cost.** The [server](SERVER.md)'s persistent worker keeps compiled pipelines loaded between runs, so the cost is paid once per session rather than once per generation. A new session still retraces, but the kernels it built come back from the on-disk cache, which dw keeps across reboots (`TORCHINDUCTOR_CACHE_DIR`, see [Environment Defaults](#environment-defaults)).
|
|
203
|
+
- **First run pays the compile cost.** The [server](SERVER.md)'s persistent worker keeps compiled pipelines loaded between runs, so the cost is paid once per session rather than once per generation. A new session still retraces, but the kernels it built come back from the on-disk cache, which dw keeps across reboots (`TORCHINDUCTOR_CACHE_DIR`, see [Environment Defaults](#environment-defaults)). SDNQ's `triton.jit`/autotune kernels are cached separately by Triton itself (`TRITON_CACHE_DIR`, else `$TRITON_HOME/.triton/cache`, else `~/.triton/cache`); dw sets no `TRITON_*` variable and leaves that cache where it is, shared with any other Triton user on the machine. Both caches' sizes show in `get_server_info`'s `caches` and `GET /api/caches`, and `DELETE /api/caches/{name}` empties one ([SERVER.md](SERVER.md)); the next first step of each shape pays the compile or re-autotune again (100-300 s per shape on MiniMax-H3 for Triton).
|
|
202
204
|
- **Pin the attention backend** on a compiled component (`"attention_backend"` in the same `components` entry) rather than using the pipeline-level per-call context manager, which forces recompiles.
|
|
205
|
+
- **Quantize-on-load time is a separate cost.** An SDNQ on-the-fly component re-reads and re-quantizes its bf16 weights on every cold load; `DW_QUANTIZED_CACHE=1` saves the quantized result and reads it back instead - see [QUANTIZATION.md](QUANTIZATION.md#cached-on-the-fly-dw_quantized_cache).
|
|
203
206
|
- **Composes with offloading**: apply `group_offload` and `compile` on the same component and the offload hooks are installed first, as required. Skipped with a warning on MPS.
|
|
204
207
|
- **Don't combine `fullgraph` with a `cache`**: the cache hooks decide skip-or-compute per step, a data-dependent branch diffusers wraps in `torch.compiler.disable` - it needs the graph break that `fullgraph: true` forbids. Compile with the default (partial) graph mode when a cache is active.
|
|
205
208
|
- **TorchAO quantization needs compile to be fast** - see [QUANTIZATION.md](QUANTIZATION.md#torchao).
|
|
@@ -295,7 +298,7 @@ Set automatically at import unless already present in the environment (export yo
|
|
|
295
298
|
| `PYTORCH_CUDA_ALLOC_CONF` | `expandable_segments:True` | Lets the CUDA allocator grow segments instead of fragmenting fixed-size ones. Multi-step workflows churn differently-shaped allocations (generate, upscale, interpolate); fragmentation is what OOMs a card that nominally has room. |
|
|
296
299
|
| `HF_ENABLE_PARALLEL_LOADING` | `true` | Loads sharded checkpoints in parallel - faster cold starts. |
|
|
297
300
|
| `PYTORCH_MPS_HIGH_WATERMARK_RATIO` | `0.0` | MPS only - use all available unified memory. |
|
|
298
|
-
| `TORCHINDUCTOR_CACHE_DIR` | `$XDG_CACHE_HOME/dw/torchinductor` (`~/.cache/dw/torchinductor`) | Keeps `torch.compile`'s on-disk cache across reboots - Inductor's own default is under `/tmp`. A new worker still retraces, but a cache hit skips codegen and kernel builds, the bulk of a cold compile. Entries are per shape, so a new size or frame count compiles once more. |
|
|
301
|
+
| `TORCHINDUCTOR_CACHE_DIR` | `$XDG_CACHE_HOME/dw/torchinductor` (`~/.cache/dw/torchinductor`) | Keeps `torch.compile`'s on-disk cache across reboots - Inductor's own default is under `/tmp`. A new worker still retraces, but a cache hit skips codegen and kernel builds, the bulk of a cold compile. Entries are per shape, so a new size or frame count compiles once more. Listed as `inductor` by `GET /api/caches` and cleared with `DELETE /api/caches/inductor`. Triton's cache is not set by dw and stays at its own default (`~/.triton/cache`) - see the compile notes above. |
|
|
299
302
|
|
|
300
303
|
For faster model downloads, optionally `pip install hf_transfer` and set `HF_HUB_ENABLE_HF_TRANSFER=1`. Not enabled automatically - it bypasses the Python HTTP stack and breaks some proxy setups.
|
|
301
304
|
|