diffusers-workflow 0.11.0__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.0/diffusers_workflow.egg-info → diffusers_workflow-0.12.0}/PKG-INFO +1 -1
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0/diffusers_workflow.egg-info}/PKG-INFO +1 -1
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/SOURCES.txt +30 -21
- diffusers_workflow-0.12.0/dw/disk_caches.py +471 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/ACCELERATION.md +22 -3
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/ARCHITECTURE.md +3 -1
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/LORAS.md +4 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/MCP.md +2 -2
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/QUANTIZATION.md +27 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/RECIPES_24GB.md +73 -17
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/RELEASING.md +109 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/REMOTE.md +2 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/SECURITY.md +4 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/SERVER.md +49 -2
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/TASKS.md +5 -3
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/WORKER_GUIDE.md +14 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/WORKFLOW_GUIDE.md +12 -1
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/dsp.py +19 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/media.py +112 -23
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_ownership.py +18 -2
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/adapters.py +103 -36
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/components.py +61 -8
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/pipeline.py +32 -1
- diffusers_workflow-0.12.0/dw/quantized_cache.py +917 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/script_lines.py +66 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/serve.py +13 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/api_models.py +59 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/deps.py +25 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/media.py +14 -6
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/system.py +85 -0
- diffusers_workflow-0.11.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0/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.0 → diffusers_workflow-0.12.0}/dw/server/ui/index.html +2 -2
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/step_cache.py +117 -17
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/assess.py +20 -5
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/audio_transcription.py +53 -1
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/cuts.py +41 -22
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/restore_faces.py +18 -8
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/script_check.py +11 -46
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/worker.py +44 -10
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflow.py +8 -2
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflow_run.py +41 -7
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/catalog.py +10 -3
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/tools_catalog.py +27 -20
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/workspaces.py +31 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/pyproject.toml +1 -1
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_api_contract.py +3 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_assess.py +8 -3
- diffusers_workflow-0.12.0/tests/test_catalog_speed_defaults.py +76 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_catalog_structure.py +4 -1
- diffusers_workflow-0.12.0/tests/test_disk_caches.py +769 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_inherited_cost.py +30 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_server.py +7 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_workspaces.py +79 -1
- diffusers_workflow-0.12.0/tests/test_media_decode_threads.py +81 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_media_info.py +59 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_modular_pipeline.py +19 -0
- {diffusers_workflow-0.11.0 → 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.12.0/tests/test_restore_faces_helper_cache.py +93 -0
- diffusers_workflow-0.12.0/tests/test_runtime_settings.py +151 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server.py +30 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_assess.py +1 -1
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_step_cache.py +205 -72
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_transcribe_audio.py +115 -3
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_execute.py +46 -1
- diffusers_workflow-0.12.0/tests/test_workflow_run_keys.py +42 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workflow_step_cache.py +120 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/LICENSE +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/MANIFEST.in +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/README.md +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/requires.txt +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/__init__.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/adapter_compatibility.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/argument_media.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/argument_warnings.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/arguments.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/assessment_rules.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/assets.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/audio_qc.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/cache_blocks.json +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/cache_blocks.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/community_pipelines/pipeline_ltx2_refine.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/content_types.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/devices.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/AGENT_LOOP.md +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/DEPENDENCIES.md +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/IP_ADAPTER.md +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/TESTING.md +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/WORKSPACES.md +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/download_watch.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/elision.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/events.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/for_each.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/guides.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/hold_audio.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/host_memory.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/host_memory_projection.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/hub_cache.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/introspection.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/kernel_availability.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/library.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/locations.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/log_setup.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/lora_catalog.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/lora_catalog_schema.json +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/lora_hub.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/media_frames.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/media_types.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/outbound.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/output_extraction.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/path_redaction.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/chain.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/config_objects.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_guide_steps.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_guides.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_hold.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_hold_steps.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_rules.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/placement.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/progress.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/remote.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/plan.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/previous_results.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/probe_paths.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/prompt_schema.json +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/prompt_weighting.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/prompts.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/realize.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/reference_limits.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/reference_names.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/references.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/result.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/run.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/runs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/scalar_result_validation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/schema.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/security.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/__init__.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/admission.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/app.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/assess.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/catalog.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/catalog_shape.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/enhancers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/exports.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/guides.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/http_security.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/inline_media.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/job_history.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/job_record.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/job_results.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/jobs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/mcp_mount.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/netinfo.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/observed_cost.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/outputs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/pool.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/__init__.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/assets.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/files.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/gallery.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/jobs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/library.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/loras.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/sysinfo.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/codicon-DF1abBS2.ttf +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/css.worker-C6lDtRpF.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/editor-DjpsE8to.css +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/editor.worker-BmdWdrHZ.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/html.worker-C5yZDBHz.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/json.worker-DdeUAmHa.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/monaco-n7clI0si.css +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ts.worker-DGGa2mF8.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/updater.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/worker_memory.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/settings.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/shot_span_preflight.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/shots.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/slice_preflight.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/step.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/step_value_checks.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/subfolders.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/task_domains.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/task_problems.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/audio_dynamics.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/audio_handlers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/audio_utils.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/background_remover.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/beats.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/borders.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/compose_text.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/concat_videos.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/depth_estimator.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/diffusion_upscale.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/dissolve_videos.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/face_track.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/finish.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/finish_handlers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/fit.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/format_messages.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/gather.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/grade.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/h3_latent_upscale.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/h3_latent_upscaler_model.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/image_ops.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/image_to_text.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/image_utils.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/interpolate_frames.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/join_into_song.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/joins.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/judge.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/loop_bed.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/lut.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/measure_sync.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/model_cache.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/model_handlers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/pair_audio.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/qr_code.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/registry.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/rife_model.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/segment.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/select.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/speech_generation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/stabilize.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/task.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/tensor_image.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/text_generation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/text_sections.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/trim.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/upscale.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/video_handlers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/video_utils.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/voice_attribution.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/windows.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/zoe_depth.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/test.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/trust.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/type_helpers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/type_references.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/validate.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/validation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/variable_constraints.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/variables.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/video_extensions.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/video_size_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/vram_estimate.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/vram_inheritance.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/window_count_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/worker_manager.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/worker_protocol.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflow_schema.json +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflows/h3_context_ir.json +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflows/test.json +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workspace.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/writers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/__init__.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/__main__.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/assets.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/authoring.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/client.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/confine.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/diagnose.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/exports.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/guides.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/loras.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/media.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/models.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/prompts.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/server.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/tools_authoring.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/tools_jobs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/tools_media.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/setup.cfg +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_admission.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_admission_capacity.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_analyze_beats.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_arch_metrics.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_arch_report.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_architecture_map.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_argument_updates.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_arguments.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_assessment_rules.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_assets.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_attention_slicing.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_audio_utils.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_best_of_n_template.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_borders.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_cache_blocks.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_catalog_shape.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_chain.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ci_config.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_cli.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_component_name_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_component_pruning.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_component_type_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_compose_text.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_concat_videos.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_config_objects.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_configuration_schema.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_content_types.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_depth_estimator.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_device.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_device_helpers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_device_portability.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_dialogue_short_voices.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_diffusion_upscale.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_dissolve_videos.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_docs_links.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_download_watch.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_dsp.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_elision.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_events.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_examples.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_face_track.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_find_loop_bed.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_finish.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_fit_templates.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_fit_to_model.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_for_each.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_gather.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_grade.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_guide_chain_validation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_guides_validation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_adapters.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_context_ir.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_guides.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_hold_audio.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_latent_upscale.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_refine.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_rules.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_schedule.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_upscaler_source.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_vram_ceiling.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_hf_placement.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_host_memory.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_host_memory_projection.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_hub_cache.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_image_ops.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_image_to_text.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_image_utils.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_inductor_cache_default.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ingredients_grid.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_integration.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_interpolate_frames.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_introspection.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_job_history_device.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_job_history_wal.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_job_progress.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_job_warnings.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_jobs_listing.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_jobs_reused.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_join_into_song.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_join_windows.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_judge.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_kernel_availability.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_library_path.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_library_sources.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_list_images.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_locations.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_alpha.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_catalog.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_disable.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_hub.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_library.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx2_diffusion_decode.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx2_extend_clip.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx2_ic_loras.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx2_refine_pipeline.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx_prompt_library.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lut.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_assets.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_authoring.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_catalog.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_client.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_confine.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_diagnose.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_exports.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_guides.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_loras.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_main.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_media.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_models.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_prompts.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_twins.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_measure_sync.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_media_audio.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_media_frames.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_media_layering.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mix_audio.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_model_cache.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_modular_output_properties.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_modular_progress.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mps_fallback_warning.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mps_rope_precision.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_null_media.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_numeric_coercion.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_observed_cost.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_offload_placement.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_outbound.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_output_references.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_pair_audio.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_pair_audio_fit.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_parallel_loading_default.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_path_redaction.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_phase_events.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_pipeline_caching.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_pipeline_components.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_plan.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_plugin_skills.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prepare_pipeline.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_previous_result_walker_parity.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_previous_results.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompt_library.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompt_parser.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompt_references.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompt_weighting.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompts.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_read_frame_range.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_real_models.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_realize.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_recenter_crop.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_reference_limits.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_reference_names.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_reference_skip_sets.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_references.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_rerun_new_seed.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_resize_bucket.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_restore_faces_video.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_result.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_result_fps.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_result_output_naming.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_rule_parity.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_runs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_scalar_result_validation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_scheduler_config.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_schema.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_script_check.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_auth.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_decoder_bombs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_input_caps.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_ssrf.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_symlinks.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_trust_gate.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_web_headers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_segment.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_select.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_select_validation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_separate_stems.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_serve_main.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_downloads.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_exports.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_gallery_image.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_guides.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_info.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_jobs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_library_path.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_loras.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_mcp.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_workspaces.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_shaping_logs.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_shot_span_preflight.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_shots.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_slice_preflight.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_speech_generation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_stabilize.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_step.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_strip_exif_and_watermark.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_sub_workflow_resolver.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_subfolders.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_discovery.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_domains.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_public_imports.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_registry_rules.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_signature_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_template_defaults.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_template_subfolders.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_tensor_image.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_text_generation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_text_sections.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_trim_video.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_type_helpers.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_type_helpers_concurrency.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ui_twins.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_updater.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_validate_arguments.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_validation.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_variable_constraints.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_variables.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_video_extensions.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_video_size_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_video_utils.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_voice_attribution.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_vram_estimate.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_vram_guides.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_vram_inheritance.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_window_count_errors.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_window_video.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_job_peak_rss.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_manager.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_messages.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_pool.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workflow.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workflow_snapshot.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workflow_trust.py +0 -0
- {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workspace.py +0 -0
{diffusers_workflow-0.11.0 → 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
|
|
@@ -361,6 +363,7 @@ tests/test_best_of_n_template.py
|
|
|
361
363
|
tests/test_borders.py
|
|
362
364
|
tests/test_cache_blocks.py
|
|
363
365
|
tests/test_catalog_shape.py
|
|
366
|
+
tests/test_catalog_speed_defaults.py
|
|
364
367
|
tests/test_catalog_structure.py
|
|
365
368
|
tests/test_chain.py
|
|
366
369
|
tests/test_ci_config.py
|
|
@@ -379,6 +382,7 @@ tests/test_device_helpers.py
|
|
|
379
382
|
tests/test_device_portability.py
|
|
380
383
|
tests/test_dialogue_short_voices.py
|
|
381
384
|
tests/test_diffusion_upscale.py
|
|
385
|
+
tests/test_disk_caches.py
|
|
382
386
|
tests/test_dissolve_frame_errors.py
|
|
383
387
|
tests/test_dissolve_videos.py
|
|
384
388
|
tests/test_docs_links.py
|
|
@@ -463,6 +467,7 @@ tests/test_mcp_twins.py
|
|
|
463
467
|
tests/test_mcp_workspaces.py
|
|
464
468
|
tests/test_measure_sync.py
|
|
465
469
|
tests/test_media_audio.py
|
|
470
|
+
tests/test_media_decode_threads.py
|
|
466
471
|
tests/test_media_frames.py
|
|
467
472
|
tests/test_media_info.py
|
|
468
473
|
tests/test_media_layering.py
|
|
@@ -497,6 +502,7 @@ tests/test_prompt_parser.py
|
|
|
497
502
|
tests/test_prompt_references.py
|
|
498
503
|
tests/test_prompt_weighting.py
|
|
499
504
|
tests/test_prompts.py
|
|
505
|
+
tests/test_quantized_cache.py
|
|
500
506
|
tests/test_read_frame_range.py
|
|
501
507
|
tests/test_real_models.py
|
|
502
508
|
tests/test_realize.py
|
|
@@ -507,12 +513,14 @@ tests/test_reference_skip_sets.py
|
|
|
507
513
|
tests/test_references.py
|
|
508
514
|
tests/test_rerun_new_seed.py
|
|
509
515
|
tests/test_resize_bucket.py
|
|
516
|
+
tests/test_restore_faces_helper_cache.py
|
|
510
517
|
tests/test_restore_faces_video.py
|
|
511
518
|
tests/test_result.py
|
|
512
519
|
tests/test_result_fps.py
|
|
513
520
|
tests/test_result_output_naming.py
|
|
514
521
|
tests/test_rule_parity.py
|
|
515
522
|
tests/test_runs.py
|
|
523
|
+
tests/test_runtime_settings.py
|
|
516
524
|
tests/test_scalar_result_validation.py
|
|
517
525
|
tests/test_scheduler_config.py
|
|
518
526
|
tests/test_schema.py
|
|
@@ -590,6 +598,7 @@ tests/test_worker_manager.py
|
|
|
590
598
|
tests/test_worker_messages.py
|
|
591
599
|
tests/test_worker_pool.py
|
|
592
600
|
tests/test_workflow.py
|
|
601
|
+
tests/test_workflow_run_keys.py
|
|
593
602
|
tests/test_workflow_snapshot.py
|
|
594
603
|
tests/test_workflow_step_cache.py
|
|
595
604
|
tests/test_workflow_trust.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}
|