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.
Files changed (607) hide show
  1. {diffusers_workflow-0.11.1/diffusers_workflow.egg-info → diffusers_workflow-0.12.0}/PKG-INFO +1 -1
  2. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0/diffusers_workflow.egg-info}/PKG-INFO +1 -1
  3. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/SOURCES.txt +25 -21
  4. diffusers_workflow-0.12.0/dw/disk_caches.py +471 -0
  5. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/ACCELERATION.md +5 -2
  6. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/ARCHITECTURE.md +3 -1
  7. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/MCP.md +2 -2
  8. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/QUANTIZATION.md +27 -0
  9. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/RELEASING.md +68 -0
  10. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/REMOTE.md +2 -0
  11. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/SECURITY.md +4 -0
  12. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/SERVER.md +46 -1
  13. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/TASKS.md +4 -2
  14. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/WORKER_GUIDE.md +7 -0
  15. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/dsp.py +19 -0
  16. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/media.py +89 -18
  17. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/components.py +44 -8
  18. diffusers_workflow-0.12.0/dw/quantized_cache.py +917 -0
  19. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/script_lines.py +66 -0
  20. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/serve.py +13 -0
  21. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/api_models.py +59 -0
  22. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/deps.py +25 -0
  23. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/media.py +14 -6
  24. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/system.py +85 -0
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/index.html +2 -2
  47. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/assess.py +20 -5
  48. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/audio_transcription.py +53 -1
  49. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/cuts.py +41 -22
  50. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/script_check.py +11 -46
  51. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/catalog.py +10 -3
  52. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/tools_catalog.py +27 -20
  53. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/workspaces.py +31 -0
  54. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/pyproject.toml +1 -1
  55. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_api_contract.py +3 -0
  56. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_assess.py +8 -3
  57. diffusers_workflow-0.12.0/tests/test_disk_caches.py +769 -0
  58. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_inherited_cost.py +30 -0
  59. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_server.py +7 -0
  60. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_workspaces.py +79 -1
  61. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_info.py +59 -0
  62. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_modular_pipeline.py +19 -0
  63. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_plan_cuts.py +89 -0
  64. diffusers_workflow-0.12.0/tests/test_quantized_cache.py +1597 -0
  65. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server.py +30 -0
  66. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_assess.py +1 -1
  67. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_step_cache.py +17 -0
  68. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_transcribe_audio.py +115 -3
  69. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/LICENSE +0 -0
  70. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/MANIFEST.in +0 -0
  71. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/README.md +0 -0
  72. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
  73. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
  74. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/requires.txt +0 -0
  75. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
  76. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/__init__.py +0 -0
  77. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/adapter_compatibility.py +0 -0
  78. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/argument_media.py +0 -0
  79. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/argument_warnings.py +0 -0
  80. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/arguments.py +0 -0
  81. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/assessment_rules.py +0 -0
  82. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/assets.py +0 -0
  83. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/audio_qc.py +0 -0
  84. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/cache_blocks.json +0 -0
  85. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/cache_blocks.py +0 -0
  86. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
  87. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/community_pipelines/pipeline_ltx2_refine.py +0 -0
  88. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/content_types.py +0 -0
  89. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/devices.py +0 -0
  90. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/dissolve_frame_errors.py +0 -0
  91. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/AGENT_LOOP.md +0 -0
  92. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/DEPENDENCIES.md +0 -0
  93. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/IP_ADAPTER.md +0 -0
  94. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/LORAS.md +0 -0
  95. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
  96. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/RECIPES_24GB.md +0 -0
  97. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
  98. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/TESTING.md +0 -0
  99. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/WORKFLOW_GUIDE.md +0 -0
  100. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/docs/WORKSPACES.md +0 -0
  101. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/download_watch.py +0 -0
  102. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/elision.py +0 -0
  103. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/events.py +0 -0
  104. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/for_each.py +0 -0
  105. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/guides.py +0 -0
  106. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/hold_audio.py +0 -0
  107. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/host_memory.py +0 -0
  108. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/host_memory_projection.py +0 -0
  109. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/hub_cache.py +0 -0
  110. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/introspection.py +0 -0
  111. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/kernel_availability.py +0 -0
  112. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/library.py +0 -0
  113. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/locations.py +0 -0
  114. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/log_setup.py +0 -0
  115. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/lora_catalog.py +0 -0
  116. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/lora_catalog_schema.json +0 -0
  117. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/lora_hub.py +0 -0
  118. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/media_frames.py +0 -0
  119. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/media_types.py +0 -0
  120. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/outbound.py +0 -0
  121. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/output_extraction.py +0 -0
  122. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/path_redaction.py +0 -0
  123. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_ownership.py +0 -0
  124. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/adapters.py +0 -0
  125. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/chain.py +0 -0
  126. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/config_objects.py +0 -0
  127. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_guide_steps.py +0 -0
  128. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_guides.py +0 -0
  129. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_hold.py +0 -0
  130. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_hold_steps.py +0 -0
  131. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_rules.py +0 -0
  132. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/pipeline.py +0 -0
  133. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/placement.py +0 -0
  134. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/progress.py +0 -0
  135. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/pipeline_processors/remote.py +0 -0
  136. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/plan.py +0 -0
  137. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/previous_results.py +0 -0
  138. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/probe_paths.py +0 -0
  139. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/prompt_schema.json +0 -0
  140. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/prompt_weighting.py +0 -0
  141. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/prompts.py +0 -0
  142. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/realize.py +0 -0
  143. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/reference_limits.py +0 -0
  144. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/reference_names.py +0 -0
  145. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/references.py +0 -0
  146. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/result.py +0 -0
  147. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/run.py +0 -0
  148. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/runs.py +0 -0
  149. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/scalar_result_validation.py +0 -0
  150. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/schema.py +0 -0
  151. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/security.py +0 -0
  152. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/__init__.py +0 -0
  153. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/admission.py +0 -0
  154. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/app.py +0 -0
  155. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/assess.py +0 -0
  156. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/catalog.py +0 -0
  157. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/catalog_shape.py +0 -0
  158. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/enhancers.py +0 -0
  159. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/exports.py +0 -0
  160. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/guides.py +0 -0
  161. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/http_security.py +0 -0
  162. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/inline_media.py +0 -0
  163. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/job_history.py +0 -0
  164. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/job_record.py +0 -0
  165. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/job_results.py +0 -0
  166. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/jobs.py +0 -0
  167. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/mcp_mount.py +0 -0
  168. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/netinfo.py +0 -0
  169. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/observed_cost.py +0 -0
  170. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/outputs.py +0 -0
  171. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/pool.py +0 -0
  172. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/__init__.py +0 -0
  173. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/assets.py +0 -0
  174. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/files.py +0 -0
  175. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/gallery.py +0 -0
  176. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/jobs.py +0 -0
  177. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/library.py +0 -0
  178. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/routes/loras.py +0 -0
  179. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/sysinfo.py +0 -0
  180. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
  181. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
  182. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
  183. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
  184. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
  185. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
  186. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
  187. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/codicon-DF1abBS2.ttf +0 -0
  188. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
  189. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
  190. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
  191. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
  192. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
  193. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/css.worker-C6lDtRpF.js +0 -0
  194. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
  195. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
  196. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
  197. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
  198. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/editor-DjpsE8to.css +0 -0
  199. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/editor.worker-BmdWdrHZ.js +0 -0
  200. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
  201. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
  202. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
  203. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
  204. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
  205. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
  206. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/html.worker-C5yZDBHz.js +0 -0
  207. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
  208. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
  209. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/json.worker-DdeUAmHa.js +0 -0
  210. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
  211. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
  212. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
  213. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
  214. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
  215. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
  216. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
  217. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
  218. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/monaco-n7clI0si.css +0 -0
  219. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
  220. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
  221. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
  222. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
  223. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
  224. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
  225. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
  226. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
  227. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
  228. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
  229. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
  230. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
  231. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
  232. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
  233. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
  234. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
  235. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
  236. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
  237. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
  238. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
  239. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
  240. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
  241. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
  242. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
  243. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
  244. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
  245. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
  246. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
  247. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
  248. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
  249. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
  250. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
  251. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
  252. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
  253. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ts.worker-DGGa2mF8.js +0 -0
  254. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
  255. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
  256. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
  257. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
  258. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/updater.py +0 -0
  259. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/server/worker_memory.py +0 -0
  260. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/settings.py +0 -0
  261. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/shot_span_preflight.py +0 -0
  262. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/shots.py +0 -0
  263. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/slice_preflight.py +0 -0
  264. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/step.py +0 -0
  265. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/step_cache.py +0 -0
  266. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/step_value_checks.py +0 -0
  267. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/subfolders.py +0 -0
  268. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/task_domains.py +0 -0
  269. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/task_problems.py +0 -0
  270. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/audio_dynamics.py +0 -0
  271. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/audio_handlers.py +0 -0
  272. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/audio_utils.py +0 -0
  273. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/background_remover.py +0 -0
  274. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/beats.py +0 -0
  275. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/borders.py +0 -0
  276. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/compose_text.py +0 -0
  277. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/concat_videos.py +0 -0
  278. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/depth_estimator.py +0 -0
  279. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/diffusion_upscale.py +0 -0
  280. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/dissolve_videos.py +0 -0
  281. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/face_track.py +0 -0
  282. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/finish.py +0 -0
  283. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/finish_handlers.py +0 -0
  284. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/fit.py +0 -0
  285. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/format_messages.py +0 -0
  286. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/gather.py +0 -0
  287. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/grade.py +0 -0
  288. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/h3_latent_upscale.py +0 -0
  289. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/h3_latent_upscaler_model.py +0 -0
  290. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/image_ops.py +0 -0
  291. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/image_to_text.py +0 -0
  292. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/image_utils.py +0 -0
  293. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/interpolate_frames.py +0 -0
  294. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/join_into_song.py +0 -0
  295. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/joins.py +0 -0
  296. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/judge.py +0 -0
  297. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/loop_bed.py +0 -0
  298. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/lut.py +0 -0
  299. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/measure_sync.py +0 -0
  300. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/model_cache.py +0 -0
  301. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/model_handlers.py +0 -0
  302. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/pair_audio.py +0 -0
  303. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/qr_code.py +0 -0
  304. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/registry.py +0 -0
  305. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/restore_faces.py +0 -0
  306. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/rife_model.py +0 -0
  307. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/segment.py +0 -0
  308. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/select.py +0 -0
  309. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/speech_generation.py +0 -0
  310. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/stabilize.py +0 -0
  311. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/task.py +0 -0
  312. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/tensor_image.py +0 -0
  313. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/text_generation.py +0 -0
  314. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/text_sections.py +0 -0
  315. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/trim.py +0 -0
  316. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/upscale.py +0 -0
  317. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/video_handlers.py +0 -0
  318. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/video_utils.py +0 -0
  319. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/voice_attribution.py +0 -0
  320. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/windows.py +0 -0
  321. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/tasks/zoe_depth.py +0 -0
  322. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/test.py +0 -0
  323. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/trust.py +0 -0
  324. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/type_helpers.py +0 -0
  325. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/type_references.py +0 -0
  326. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/validate.py +0 -0
  327. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/validation.py +0 -0
  328. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/variable_constraints.py +0 -0
  329. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/variables.py +0 -0
  330. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/video_extensions.py +0 -0
  331. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/video_size_errors.py +0 -0
  332. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/vram_estimate.py +0 -0
  333. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/vram_inheritance.py +0 -0
  334. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/window_count_errors.py +0 -0
  335. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/worker.py +0 -0
  336. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/worker_manager.py +0 -0
  337. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/worker_protocol.py +0 -0
  338. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflow.py +0 -0
  339. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflow_run.py +0 -0
  340. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflow_schema.json +0 -0
  341. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflows/h3_context_ir.json +0 -0
  342. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workflows/test.json +0 -0
  343. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/workspace.py +0 -0
  344. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw/writers.py +0 -0
  345. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/__init__.py +0 -0
  346. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/__main__.py +0 -0
  347. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/assets.py +0 -0
  348. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/authoring.py +0 -0
  349. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/client.py +0 -0
  350. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/confine.py +0 -0
  351. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/diagnose.py +0 -0
  352. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/exports.py +0 -0
  353. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/guides.py +0 -0
  354. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/loras.py +0 -0
  355. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/media.py +0 -0
  356. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/models.py +0 -0
  357. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/prompts.py +0 -0
  358. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/server.py +0 -0
  359. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/tools_authoring.py +0 -0
  360. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/tools_jobs.py +0 -0
  361. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/dw_mcp/tools_media.py +0 -0
  362. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/setup.cfg +0 -0
  363. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_admission.py +0 -0
  364. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_admission_capacity.py +0 -0
  365. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_analyze_beats.py +0 -0
  366. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_arch_metrics.py +0 -0
  367. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_arch_report.py +0 -0
  368. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_architecture_map.py +0 -0
  369. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_argument_updates.py +0 -0
  370. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_arguments.py +0 -0
  371. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
  372. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_assessment_rules.py +0 -0
  373. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_assets.py +0 -0
  374. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_attention_slicing.py +0 -0
  375. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_audio_utils.py +0 -0
  376. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_best_of_n_template.py +0 -0
  377. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_borders.py +0 -0
  378. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_cache_blocks.py +0 -0
  379. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_catalog_shape.py +0 -0
  380. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_catalog_speed_defaults.py +0 -0
  381. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_catalog_structure.py +0 -0
  382. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_chain.py +0 -0
  383. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ci_config.py +0 -0
  384. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_cli.py +0 -0
  385. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_component_name_errors.py +0 -0
  386. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_component_pruning.py +0 -0
  387. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_component_type_errors.py +0 -0
  388. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_compose_text.py +0 -0
  389. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_concat_videos.py +0 -0
  390. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_config_objects.py +0 -0
  391. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_configuration_schema.py +0 -0
  392. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_content_types.py +0 -0
  393. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_depth_estimator.py +0 -0
  394. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_device.py +0 -0
  395. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_device_helpers.py +0 -0
  396. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_device_portability.py +0 -0
  397. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_dialogue_short_voices.py +0 -0
  398. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_diffusion_upscale.py +0 -0
  399. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_dissolve_frame_errors.py +0 -0
  400. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_dissolve_videos.py +0 -0
  401. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_docs_links.py +0 -0
  402. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_download_watch.py +0 -0
  403. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_dsp.py +0 -0
  404. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_elision.py +0 -0
  405. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_events.py +0 -0
  406. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_examples.py +0 -0
  407. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_face_track.py +0 -0
  408. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_find_loop_bed.py +0 -0
  409. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_finish.py +0 -0
  410. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_fit_templates.py +0 -0
  411. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_fit_to_model.py +0 -0
  412. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_for_each.py +0 -0
  413. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_gather.py +0 -0
  414. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_grade.py +0 -0
  415. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_guide_chain_validation.py +0 -0
  416. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_guides_validation.py +0 -0
  417. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_adapters.py +0 -0
  418. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_context_ir.py +0 -0
  419. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_guides.py +0 -0
  420. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_hold_audio.py +0 -0
  421. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_latent_upscale.py +0 -0
  422. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_refine.py +0 -0
  423. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_rules.py +0 -0
  424. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_schedule.py +0 -0
  425. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_upscaler_source.py +0 -0
  426. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_h3_vram_ceiling.py +0 -0
  427. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_hf_placement.py +0 -0
  428. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_host_memory.py +0 -0
  429. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_host_memory_projection.py +0 -0
  430. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_hub_cache.py +0 -0
  431. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_image_ops.py +0 -0
  432. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_image_to_text.py +0 -0
  433. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_image_utils.py +0 -0
  434. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_inductor_cache_default.py +0 -0
  435. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ingredients_grid.py +0 -0
  436. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_integration.py +0 -0
  437. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_interpolate_frames.py +0 -0
  438. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_introspection.py +0 -0
  439. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_job_history_device.py +0 -0
  440. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_job_history_wal.py +0 -0
  441. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_job_progress.py +0 -0
  442. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_job_warnings.py +0 -0
  443. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_jobs_listing.py +0 -0
  444. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_jobs_reused.py +0 -0
  445. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_join_into_song.py +0 -0
  446. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_join_windows.py +0 -0
  447. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_judge.py +0 -0
  448. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_kernel_availability.py +0 -0
  449. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_library_path.py +0 -0
  450. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_library_sources.py +0 -0
  451. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_list_images.py +0 -0
  452. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_locations.py +0 -0
  453. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_alpha.py +0 -0
  454. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_catalog.py +0 -0
  455. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_disable.py +0 -0
  456. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_hub.py +0 -0
  457. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lora_library.py +0 -0
  458. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx2_diffusion_decode.py +0 -0
  459. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx2_extend_clip.py +0 -0
  460. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx2_ic_loras.py +0 -0
  461. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx2_refine_pipeline.py +0 -0
  462. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ltx_prompt_library.py +0 -0
  463. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_lut.py +0 -0
  464. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_assets.py +0 -0
  465. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_authoring.py +0 -0
  466. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_catalog.py +0 -0
  467. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_client.py +0 -0
  468. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_confine.py +0 -0
  469. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_diagnose.py +0 -0
  470. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_exports.py +0 -0
  471. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_guides.py +0 -0
  472. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_loras.py +0 -0
  473. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_main.py +0 -0
  474. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_media.py +0 -0
  475. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_models.py +0 -0
  476. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_prompts.py +0 -0
  477. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mcp_twins.py +0 -0
  478. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_measure_sync.py +0 -0
  479. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_audio.py +0 -0
  480. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_decode_threads.py +0 -0
  481. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_frames.py +0 -0
  482. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_media_layering.py +0 -0
  483. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mix_audio.py +0 -0
  484. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_model_cache.py +0 -0
  485. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_modular_output_properties.py +0 -0
  486. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_modular_progress.py +0 -0
  487. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mps_fallback_warning.py +0 -0
  488. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_mps_rope_precision.py +0 -0
  489. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_null_media.py +0 -0
  490. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_numeric_coercion.py +0 -0
  491. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_observed_cost.py +0 -0
  492. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_offload_placement.py +0 -0
  493. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_outbound.py +0 -0
  494. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_output_references.py +0 -0
  495. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_pair_audio.py +0 -0
  496. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_pair_audio_fit.py +0 -0
  497. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_parallel_loading_default.py +0 -0
  498. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_path_redaction.py +0 -0
  499. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_phase_events.py +0 -0
  500. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_pipeline_caching.py +0 -0
  501. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_pipeline_components.py +0 -0
  502. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_plan.py +0 -0
  503. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_plugin_skills.py +0 -0
  504. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prepare_pipeline.py +0 -0
  505. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_previous_result_walker_parity.py +0 -0
  506. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_previous_results.py +0 -0
  507. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompt_library.py +0 -0
  508. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompt_parser.py +0 -0
  509. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompt_references.py +0 -0
  510. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompt_weighting.py +0 -0
  511. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_prompts.py +0 -0
  512. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_read_frame_range.py +0 -0
  513. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_real_models.py +0 -0
  514. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_realize.py +0 -0
  515. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_recenter_crop.py +0 -0
  516. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_reference_limits.py +0 -0
  517. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_reference_names.py +0 -0
  518. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_reference_skip_sets.py +0 -0
  519. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_references.py +0 -0
  520. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_rerun_new_seed.py +0 -0
  521. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_resize_bucket.py +0 -0
  522. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_restore_faces_helper_cache.py +0 -0
  523. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_restore_faces_video.py +0 -0
  524. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_result.py +0 -0
  525. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_result_fps.py +0 -0
  526. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_result_output_naming.py +0 -0
  527. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_rule_parity.py +0 -0
  528. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_runs.py +0 -0
  529. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_runtime_settings.py +0 -0
  530. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_scalar_result_validation.py +0 -0
  531. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_scheduler_config.py +0 -0
  532. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_schema.py +0 -0
  533. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_script_check.py +0 -0
  534. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security.py +0 -0
  535. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_auth.py +0 -0
  536. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_decoder_bombs.py +0 -0
  537. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_input_caps.py +0 -0
  538. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_ssrf.py +0 -0
  539. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_symlinks.py +0 -0
  540. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_trust_gate.py +0 -0
  541. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_security_web_headers.py +0 -0
  542. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_segment.py +0 -0
  543. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_select.py +0 -0
  544. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_select_validation.py +0 -0
  545. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_separate_stems.py +0 -0
  546. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_serve_main.py +0 -0
  547. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_downloads.py +0 -0
  548. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_exports.py +0 -0
  549. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_gallery_image.py +0 -0
  550. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_guides.py +0 -0
  551. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_info.py +0 -0
  552. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_jobs.py +0 -0
  553. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_library_path.py +0 -0
  554. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_loras.py +0 -0
  555. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_mcp.py +0 -0
  556. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_server_workspaces.py +0 -0
  557. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_shaping_logs.py +0 -0
  558. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_shot_span_preflight.py +0 -0
  559. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_shots.py +0 -0
  560. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_slice_preflight.py +0 -0
  561. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_speech_generation.py +0 -0
  562. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_stabilize.py +0 -0
  563. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_step.py +0 -0
  564. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_strip_exif_and_watermark.py +0 -0
  565. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_sub_workflow_resolver.py +0 -0
  566. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_subfolders.py +0 -0
  567. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task.py +0 -0
  568. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_discovery.py +0 -0
  569. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_domains.py +0 -0
  570. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_public_imports.py +0 -0
  571. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_registry_rules.py +0 -0
  572. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_task_signature_errors.py +0 -0
  573. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_template_defaults.py +0 -0
  574. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_template_subfolders.py +0 -0
  575. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_tensor_image.py +0 -0
  576. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_text_generation.py +0 -0
  577. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_text_sections.py +0 -0
  578. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_trim_video.py +0 -0
  579. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_type_helpers.py +0 -0
  580. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_type_helpers_concurrency.py +0 -0
  581. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_ui_twins.py +0 -0
  582. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_updater.py +0 -0
  583. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_validate_arguments.py +0 -0
  584. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_validation.py +0 -0
  585. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_variable_constraints.py +0 -0
  586. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_variables.py +0 -0
  587. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_video_extensions.py +0 -0
  588. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_video_size_errors.py +0 -0
  589. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_video_utils.py +0 -0
  590. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_voice_attribution.py +0 -0
  591. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_vram_estimate.py +0 -0
  592. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_vram_guides.py +0 -0
  593. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_vram_inheritance.py +0 -0
  594. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_window_count_errors.py +0 -0
  595. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_window_video.py +0 -0
  596. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker.py +0 -0
  597. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_execute.py +0 -0
  598. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_job_peak_rss.py +0 -0
  599. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_manager.py +0 -0
  600. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_messages.py +0 -0
  601. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_worker_pool.py +0 -0
  602. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow.py +0 -0
  603. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow_run_keys.py +0 -0
  604. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow_snapshot.py +0 -0
  605. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow_step_cache.py +0 -0
  606. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workflow_trust.py +0 -0
  607. {diffusers_workflow-0.11.1 → diffusers_workflow-0.12.0}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.11.1
3
+ Version: 0.12.0
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.11.1
3
+ Version: 0.12.0
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -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-ukxfz-ce.js
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-Bkt_tsj1.js
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-DbXygLvH.js
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-BdhZGoSz.js
198
+ dw/server/ui/assets/handlebars-8Houv1UM.js
197
199
  dw/server/ui/assets/hcl-CpzslTdj.js
198
- dw/server/ui/assets/html-Chhg10Tp.js
200
+ dw/server/ui/assets/html-DaY0zzOJ.js
199
201
  dw/server/ui/assets/html.worker-C5yZDBHz.js
200
- dw/server/ui/assets/htmlMode-cC3JW4lx.js
201
- dw/server/ui/assets/index-BYEwBCrU.css
202
- dw/server/ui/assets/index-CkD0GJG0.js
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-BWWLMkof.js
207
+ dw/server/ui/assets/javascript-B5R3UPTQ.js
206
208
  dw/server/ui/assets/json.worker-DdeUAmHa.js
207
- dw/server/ui/assets/jsonMode-DrC8C29V.js
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-CXdQfmUT.js
213
- dw/server/ui/assets/lspLanguageFeatures-BgAhb71w.js
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-CQS0lFaZ.js
219
+ dw/server/ui/assets/mdx-DIXDAORJ.js
218
220
  dw/server/ui/assets/mips-CIPQ_RoX.js
219
- dw/server/ui/assets/monaco-Z_sI-RLU.js
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-C9MtI630.js
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-DPO5mHyR.js
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-D8vGBTVc.js
260
+ dw/server/ui/assets/tsMode-DRjPuZ2P.js
259
261
  dw/server/ui/assets/twig-De2hgUGE.js
260
- dw/server/ui/assets/typescript-DyoEkQLT.js
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-Bdewp_DS.js
265
- dw/server/ui/assets/xml-DmmKOVWo.js
266
- dw/server/ui/assets/yaml-C4jCTuer.js
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