diffusers-workflow 0.4.0a4__tar.gz → 0.4.0a10__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 (267) hide show
  1. {diffusers_workflow-0.4.0a4/diffusers_workflow.egg-info → diffusers_workflow-0.4.0a10}/PKG-INFO +15 -5
  2. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/README.md +10 -4
  3. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10/diffusers_workflow.egg-info}/PKG-INFO +15 -5
  4. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/SOURCES.txt +48 -21
  5. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/entry_points.txt +1 -0
  6. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/requires.txt +5 -0
  7. diffusers_workflow-0.4.0a10/diffusers_workflow.egg-info/top_level.txt +2 -0
  8. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/__init__.py +75 -0
  9. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/arguments.py +25 -1
  10. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/events.py +17 -0
  11. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/hub_cache.py +32 -3
  12. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/introspection.py +76 -15
  13. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/chain.py +5 -0
  14. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/config_objects.py +4 -2
  15. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/pipeline.py +75 -11
  16. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/previous_results.py +13 -8
  17. diffusers_workflow-0.4.0a10/dw/prompt_schema.json +48 -0
  18. diffusers_workflow-0.4.0a10/dw/prompts.py +145 -0
  19. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/repl.py +1 -1
  20. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/repl_commands.py +1 -1
  21. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/result.py +20 -2
  22. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/run.py +16 -1
  23. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/security.py +67 -25
  24. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/serve.py +22 -2
  25. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/app.py +347 -22
  26. diffusers_workflow-0.4.0a10/dw/server/enhancers.py +129 -0
  27. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/jobs.py +53 -4
  28. diffusers_workflow-0.4.0a4/dw/server/ui/assets/cssMode-DklhHuQC.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/cssMode-DBf-T_da.js +1 -1
  29. diffusers_workflow-0.4.0a4/dw/server/ui/assets/editor.api-DCWJa9Fw.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/editor.api-B0D5Ygq7.js +1 -1
  30. diffusers_workflow-0.4.0a4/dw/server/ui/assets/freemarker2-CVxDKoFq.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/freemarker2-Br8g4G1T.js +1 -1
  31. diffusers_workflow-0.4.0a4/dw/server/ui/assets/handlebars-DK-ehq_7.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/handlebars-BKo1TaOF.js +1 -1
  32. diffusers_workflow-0.4.0a4/dw/server/ui/assets/html-CrtXvEnP.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/html-Bis1seyM.js +1 -1
  33. diffusers_workflow-0.4.0a4/dw/server/ui/assets/htmlMode-D0r9dgS3.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/htmlMode-D2SOD2MF.js +1 -1
  34. diffusers_workflow-0.4.0a10/dw/server/ui/assets/index-D7eWnTCB.css +1 -0
  35. diffusers_workflow-0.4.0a10/dw/server/ui/assets/index-JyFxgIR9.js +20 -0
  36. diffusers_workflow-0.4.0a4/dw/server/ui/assets/javascript-rD650v5-.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/javascript-CkEbVb78.js +1 -1
  37. diffusers_workflow-0.4.0a4/dw/server/ui/assets/jsonMode-DvWKiZ5V.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/jsonMode-dVJbYwxg.js +1 -1
  38. diffusers_workflow-0.4.0a4/dw/server/ui/assets/liquid-DvjV9-yQ.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/liquid-Btak-6uF.js +1 -1
  39. diffusers_workflow-0.4.0a4/dw/server/ui/assets/lspLanguageFeatures-Bv4c-HOB.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/lspLanguageFeatures-BfeZZQbb.js +1 -1
  40. diffusers_workflow-0.4.0a4/dw/server/ui/assets/mdx-CmyDcP1k.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/mdx-D9KXK7-s.js +1 -1
  41. diffusers_workflow-0.4.0a4/dw/server/ui/assets/monaco-CFDZdQeR.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/monaco-ZMCk_MWf.js +4 -4
  42. diffusers_workflow-0.4.0a4/dw/server/ui/assets/python-BbNG9-ih.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/python-0FnO4xGM.js +1 -1
  43. diffusers_workflow-0.4.0a4/dw/server/ui/assets/razor-BruFjATi.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/razor-B6PMzeY4.js +1 -1
  44. diffusers_workflow-0.4.0a4/dw/server/ui/assets/tsMode-DhwsPBWM.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/tsMode-nxyvZH1t.js +1 -1
  45. diffusers_workflow-0.4.0a4/dw/server/ui/assets/typescript-DLBTIt_O.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/typescript-BhBe8aGf.js +1 -1
  46. diffusers_workflow-0.4.0a4/dw/server/ui/assets/workers-BD2vxpDW.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/workers-ChAf-t8A.js +1 -1
  47. diffusers_workflow-0.4.0a4/dw/server/ui/assets/xml-BCRgtEff.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/xml-z2r9dHSO.js +1 -1
  48. diffusers_workflow-0.4.0a4/dw/server/ui/assets/yaml-B9W8qjO1.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/yaml-DrcHrz7f.js +1 -1
  49. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/index.html +2 -2
  50. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/step.py +41 -0
  51. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/task.py +7 -2
  52. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/text_generation.py +15 -2
  53. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflow.py +20 -1
  54. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflow_schema.json +2 -2
  55. diffusers_workflow-0.4.0a10/dw_mcp/__init__.py +6 -0
  56. diffusers_workflow-0.4.0a10/dw_mcp/__main__.py +39 -0
  57. diffusers_workflow-0.4.0a10/dw_mcp/authoring.py +37 -0
  58. diffusers_workflow-0.4.0a10/dw_mcp/catalog.py +83 -0
  59. diffusers_workflow-0.4.0a10/dw_mcp/client.py +201 -0
  60. diffusers_workflow-0.4.0a10/dw_mcp/diagnose.py +89 -0
  61. diffusers_workflow-0.4.0a10/dw_mcp/media.py +133 -0
  62. diffusers_workflow-0.4.0a10/dw_mcp/models.py +97 -0
  63. diffusers_workflow-0.4.0a10/dw_mcp/prompts.py +91 -0
  64. diffusers_workflow-0.4.0a10/dw_mcp/server.py +392 -0
  65. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/pyproject.toml +4 -1
  66. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_arguments.py +22 -2
  67. diffusers_workflow-0.4.0a10/tests/test_cli.py +181 -0
  68. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_config_objects.py +10 -2
  69. diffusers_workflow-0.4.0a10/tests/test_device.py +150 -0
  70. diffusers_workflow-0.4.0a10/tests/test_device_portability.py +116 -0
  71. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_docs_links.py +8 -6
  72. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_examples.py +7 -6
  73. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_hub_cache.py +46 -0
  74. diffusers_workflow-0.4.0a10/tests/test_mcp_authoring.py +156 -0
  75. diffusers_workflow-0.4.0a10/tests/test_mcp_catalog.py +118 -0
  76. diffusers_workflow-0.4.0a10/tests/test_mcp_client.py +370 -0
  77. diffusers_workflow-0.4.0a10/tests/test_mcp_diagnose.py +252 -0
  78. diffusers_workflow-0.4.0a10/tests/test_mcp_media.py +377 -0
  79. diffusers_workflow-0.4.0a10/tests/test_mcp_models.py +187 -0
  80. diffusers_workflow-0.4.0a10/tests/test_mcp_prompts.py +267 -0
  81. diffusers_workflow-0.4.0a10/tests/test_mcp_server.py +727 -0
  82. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_modular_pipeline.py +9 -2
  83. diffusers_workflow-0.4.0a10/tests/test_offload_placement.py +105 -0
  84. diffusers_workflow-0.4.0a10/tests/test_phase_events.py +227 -0
  85. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_pipeline_components.py +33 -1
  86. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_previous_results.py +66 -0
  87. diffusers_workflow-0.4.0a10/tests/test_prompts.py +227 -0
  88. diffusers_workflow-0.4.0a10/tests/test_repl_worker.py +77 -0
  89. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_result.py +35 -0
  90. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_security.py +77 -0
  91. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_server.py +811 -1
  92. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_step.py +82 -0
  93. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_task.py +1 -1
  94. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_task_discovery.py +43 -0
  95. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_text_generation.py +38 -0
  96. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_text_sections.py +1 -1
  97. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_workflow.py +20 -0
  98. diffusers_workflow-0.4.0a4/diffusers_workflow.egg-info/top_level.txt +0 -1
  99. diffusers_workflow-0.4.0a4/dw/server/ui/assets/index-SQcvGbXy.css +0 -1
  100. diffusers_workflow-0.4.0a4/dw/server/ui/assets/index-qLIa9n7C.js +0 -13
  101. diffusers_workflow-0.4.0a4/tests/test_device.py +0 -59
  102. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/LICENSE +0 -0
  103. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/MANIFEST.in +0 -0
  104. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
  105. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/cache_blocks.json +0 -0
  106. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/cache_blocks.py +0 -0
  107. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
  108. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/log_setup.py +0 -0
  109. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/remote.py +0 -0
  110. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/prompt_weighting.py +0 -0
  111. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/repl_worker.py +0 -0
  112. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/schema.py +0 -0
  113. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/__init__.py +0 -0
  114. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
  115. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
  116. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
  117. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
  118. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
  119. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
  120. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
  121. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
  122. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
  123. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
  124. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
  125. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
  126. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
  127. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
  128. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
  129. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
  130. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
  131. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
  132. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
  133. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
  134. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
  135. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
  136. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
  137. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
  138. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
  139. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
  140. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
  141. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
  142. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
  143. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
  144. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
  145. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
  146. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
  147. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
  148. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
  149. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
  150. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
  151. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
  152. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
  153. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
  154. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
  155. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
  156. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
  157. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
  158. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
  159. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
  160. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/php-nr791fC2.js +0 -0
  161. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
  162. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
  163. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
  164. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
  165. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
  166. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
  167. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
  168. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
  169. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
  170. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
  171. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
  172. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
  173. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
  174. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
  175. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
  176. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
  177. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
  178. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
  179. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
  180. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
  181. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
  182. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
  183. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/st-DbInun42.js +0 -0
  184. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
  185. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
  186. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
  187. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
  188. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
  189. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
  190. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
  191. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
  192. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/updater.py +0 -0
  193. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/settings.py +0 -0
  194. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/audio_utils.py +0 -0
  195. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/background_remover.py +0 -0
  196. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/borders.py +0 -0
  197. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/concat_videos.py +0 -0
  198. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/depth_estimator.py +0 -0
  199. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/diffusion_upscale.py +0 -0
  200. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/format_messages.py +0 -0
  201. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/gather.py +0 -0
  202. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/image_to_text.py +0 -0
  203. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/image_utils.py +0 -0
  204. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/interpolate_frames.py +0 -0
  205. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/model_cache.py +0 -0
  206. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/pair_audio.py +0 -0
  207. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/qr_code.py +0 -0
  208. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/restore_faces.py +0 -0
  209. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/rife_model.py +0 -0
  210. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/segment.py +0 -0
  211. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/tensor_image.py +0 -0
  212. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/text_sections.py +0 -0
  213. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/upscale.py +0 -0
  214. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/video_utils.py +0 -0
  215. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/zoe_depth.py +0 -0
  216. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/teacache.py +0 -0
  217. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/teacache_models.json +0 -0
  218. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/test.py +0 -0
  219. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/type_helpers.py +0 -0
  220. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/validate.py +0 -0
  221. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/variables.py +0 -0
  222. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/worker.py +0 -0
  223. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflows/augment_prompt.json +0 -0
  224. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflows/describe_image.json +0 -0
  225. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflows/h3_context_ir.json +0 -0
  226. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflows/test.json +0 -0
  227. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/setup.cfg +0 -0
  228. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_argument_updates.py +0 -0
  229. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_audio_utils.py +0 -0
  230. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_borders.py +0 -0
  231. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_cache_blocks.py +0 -0
  232. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_chain.py +0 -0
  233. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_component_pruning.py +0 -0
  234. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_concat_videos.py +0 -0
  235. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_configuration_schema.py +0 -0
  236. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_depth_estimator.py +0 -0
  237. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_device_helpers.py +0 -0
  238. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_diffusion_upscale.py +0 -0
  239. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_events.py +0 -0
  240. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_gather.py +0 -0
  241. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_image_to_text.py +0 -0
  242. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_image_utils.py +0 -0
  243. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_integration.py +0 -0
  244. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_interpolate_frames.py +0 -0
  245. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_introspection.py +0 -0
  246. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_list_images.py +0 -0
  247. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_model_cache.py +0 -0
  248. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_pair_audio.py +0 -0
  249. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_pipeline_caching.py +0 -0
  250. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_prompt_parser.py +0 -0
  251. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_prompt_weighting.py +0 -0
  252. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_repl_commands.py +0 -0
  253. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_repl_ergonomics.py +0 -0
  254. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_repl_hierarchical.py +0 -0
  255. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_repl_reorganization.py +0 -0
  256. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_resize_bucket.py +0 -0
  257. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_scheduler_config.py +0 -0
  258. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_schema.py +0 -0
  259. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_segment.py +0 -0
  260. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_strip_exif_and_watermark.py +0 -0
  261. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_teacache.py +0 -0
  262. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_tensor_image.py +0 -0
  263. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_type_helpers.py +0 -0
  264. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_variables.py +0 -0
  265. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_video_utils.py +0 -0
  266. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_worker.py +0 -0
  267. {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_worker_execute.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.4.0a4
3
+ Version: 0.4.0a10
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -57,6 +57,9 @@ Requires-Dist: packaging>=26.3
57
57
  Provides-Extra: server
58
58
  Requires-Dist: fastapi>=0.141.1; extra == "server"
59
59
  Requires-Dist: uvicorn[standard]>=0.52.4; extra == "server"
60
+ Provides-Extra: mcp
61
+ Requires-Dist: mcp>=2.1.1; extra == "mcp"
62
+ Requires-Dist: httpx>=0.28.1; extra == "mcp"
60
63
  Provides-Extra: dev
61
64
  Requires-Dist: pytest>=9.1.1; extra == "dev"
62
65
  Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
@@ -67,6 +70,7 @@ Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
67
70
  Requires-Dist: httpx>=0.28.1; extra == "dev"
68
71
  Requires-Dist: black>=26.5.1; extra == "dev"
69
72
  Requires-Dist: build; extra == "dev"
73
+ Requires-Dist: mcp>=2.1.1; extra == "dev"
70
74
  Dynamic: license-file
71
75
 
72
76
  [![CodeQL](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql)
@@ -85,6 +89,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
85
89
  ## Features
86
90
 
87
91
  - **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
92
+ - **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
88
93
  - **Declarative JSON workflows** with variable substitution and cross-step data flow
89
94
  - **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
90
95
  - **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
@@ -92,6 +97,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
92
97
  - **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
93
98
  - **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
94
99
  - **Prompt weighting** — A1111-style `(word:1.5)` syntax with long prompt support
100
+ - **Prompt library** — store prompts once in `prompts/` and reference them from any workflow as `prompt:name` or `prompt:folder/name`, with a web UI for browsing, editing, and AI-enhancing them
95
101
  - **LoRA and IP-Adapter** support
96
102
  - **Composable workflows** from multiple JSON files with `builtin:` references
97
103
  - **Utility tasks** — upscaling, face restoration, segmentation, captioning, frame interpolation, QR codes, and more
@@ -135,6 +141,8 @@ Everything the engine does, in a browser backed by a persistent GPU worker — m
135
141
 
136
142
  ![The gallery with generated images and videos](docs/img/ui-gallery.jpg)
137
143
 
144
+ **A prompt library shared by every workflow.** Store a prompt once, reference it anywhere as `prompt:name` — the Prompts page browses, edits, and filters the library, and an *Enhance with AI* panel expands an idea into a full prompt with a local language model.
145
+
138
146
  **A model manager for the disk your models actually consume.** The Hugging Face hub cache, inventoried: sizes, revisions, last-used dates, free space — download new models by id with live progress, delete with one click.
139
147
 
140
148
  ![The model manager listing cached models with sizes](docs/img/ui-models.png)
@@ -146,14 +154,14 @@ Jobs queue, stream progress live (per denoising step), cancel cooperatively, and
146
154
  ### Run a Workflow
147
155
 
148
156
  ```bash
149
- python -m dw.run examples/flux/FluxDev.json
150
- python -m dw.run examples/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
157
+ python -m dw.run workflows/flux/FluxDev.json
158
+ python -m dw.run workflows/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
151
159
  ```
152
160
 
153
161
  ### Validate a Workflow
154
162
 
155
163
  ```bash
156
- python -m dw.validate examples/flux/FluxDev.json
164
+ python -m dw.validate workflows/flux/FluxDev.json
157
165
  ```
158
166
 
159
167
  ### Interactive REPL
@@ -313,13 +321,14 @@ a (photorealistic:1.4) portrait with (bright red hair:1.3) and [freckles]
313
321
 
314
322
  **Interactive schema browser:** [View Schema](https://json-schema.app/view/%23?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdkackman%2Fdiffusers-workflow%2Frefs%2Fheads%2Fmaster%2Fdw%2Fworkflow_schema.json)
315
323
 
316
- See [examples/](examples/) for more workflow files.
324
+ See [workflows/](workflows/) for more workflow files.
317
325
 
318
326
  ## Documentation
319
327
 
320
328
  ### Guides
321
329
 
322
330
  - [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
331
+ - [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
323
332
  - [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
324
333
  - [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
325
334
  - [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
@@ -327,6 +336,7 @@ See [examples/](examples/) for more workflow files.
327
336
  - [LoRA](docs/LORAS.md) — Loading and stacking LoRA adapters
328
337
  - [IP-Adapter](docs/IP_ADAPTER.md) — Image-prompt conditioning
329
338
  - [Prompt Weighting](docs/PROMPT_WEIGHTING.md) — A1111-style syntax
339
+ - [Prompt References](docs/WORKFLOW_GUIDE.md#prompt-references) — The stored prompt library and `prompt:` references
330
340
  - [Tasks](docs/TASKS.md) — Image processing, ControlNet preprocessors, utilities
331
341
 
332
342
  ### Reference
@@ -14,6 +14,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
14
14
  ## Features
15
15
 
16
16
  - **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
17
+ - **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
17
18
  - **Declarative JSON workflows** with variable substitution and cross-step data flow
18
19
  - **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
19
20
  - **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
@@ -21,6 +22,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
21
22
  - **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
22
23
  - **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
23
24
  - **Prompt weighting** — A1111-style `(word:1.5)` syntax with long prompt support
25
+ - **Prompt library** — store prompts once in `prompts/` and reference them from any workflow as `prompt:name` or `prompt:folder/name`, with a web UI for browsing, editing, and AI-enhancing them
24
26
  - **LoRA and IP-Adapter** support
25
27
  - **Composable workflows** from multiple JSON files with `builtin:` references
26
28
  - **Utility tasks** — upscaling, face restoration, segmentation, captioning, frame interpolation, QR codes, and more
@@ -64,6 +66,8 @@ Everything the engine does, in a browser backed by a persistent GPU worker — m
64
66
 
65
67
  ![The gallery with generated images and videos](docs/img/ui-gallery.jpg)
66
68
 
69
+ **A prompt library shared by every workflow.** Store a prompt once, reference it anywhere as `prompt:name` — the Prompts page browses, edits, and filters the library, and an *Enhance with AI* panel expands an idea into a full prompt with a local language model.
70
+
67
71
  **A model manager for the disk your models actually consume.** The Hugging Face hub cache, inventoried: sizes, revisions, last-used dates, free space — download new models by id with live progress, delete with one click.
68
72
 
69
73
  ![The model manager listing cached models with sizes](docs/img/ui-models.png)
@@ -75,14 +79,14 @@ Jobs queue, stream progress live (per denoising step), cancel cooperatively, and
75
79
  ### Run a Workflow
76
80
 
77
81
  ```bash
78
- python -m dw.run examples/flux/FluxDev.json
79
- python -m dw.run examples/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
82
+ python -m dw.run workflows/flux/FluxDev.json
83
+ python -m dw.run workflows/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
80
84
  ```
81
85
 
82
86
  ### Validate a Workflow
83
87
 
84
88
  ```bash
85
- python -m dw.validate examples/flux/FluxDev.json
89
+ python -m dw.validate workflows/flux/FluxDev.json
86
90
  ```
87
91
 
88
92
  ### Interactive REPL
@@ -242,13 +246,14 @@ a (photorealistic:1.4) portrait with (bright red hair:1.3) and [freckles]
242
246
 
243
247
  **Interactive schema browser:** [View Schema](https://json-schema.app/view/%23?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdkackman%2Fdiffusers-workflow%2Frefs%2Fheads%2Fmaster%2Fdw%2Fworkflow_schema.json)
244
248
 
245
- See [examples/](examples/) for more workflow files.
249
+ See [workflows/](workflows/) for more workflow files.
246
250
 
247
251
  ## Documentation
248
252
 
249
253
  ### Guides
250
254
 
251
255
  - [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
256
+ - [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
252
257
  - [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
253
258
  - [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
254
259
  - [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
@@ -256,6 +261,7 @@ See [examples/](examples/) for more workflow files.
256
261
  - [LoRA](docs/LORAS.md) — Loading and stacking LoRA adapters
257
262
  - [IP-Adapter](docs/IP_ADAPTER.md) — Image-prompt conditioning
258
263
  - [Prompt Weighting](docs/PROMPT_WEIGHTING.md) — A1111-style syntax
264
+ - [Prompt References](docs/WORKFLOW_GUIDE.md#prompt-references) — The stored prompt library and `prompt:` references
259
265
  - [Tasks](docs/TASKS.md) — Image processing, ControlNet preprocessors, utilities
260
266
 
261
267
  ### Reference
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.4.0a4
3
+ Version: 0.4.0a10
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -57,6 +57,9 @@ Requires-Dist: packaging>=26.3
57
57
  Provides-Extra: server
58
58
  Requires-Dist: fastapi>=0.141.1; extra == "server"
59
59
  Requires-Dist: uvicorn[standard]>=0.52.4; extra == "server"
60
+ Provides-Extra: mcp
61
+ Requires-Dist: mcp>=2.1.1; extra == "mcp"
62
+ Requires-Dist: httpx>=0.28.1; extra == "mcp"
60
63
  Provides-Extra: dev
61
64
  Requires-Dist: pytest>=9.1.1; extra == "dev"
62
65
  Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
@@ -67,6 +70,7 @@ Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
67
70
  Requires-Dist: httpx>=0.28.1; extra == "dev"
68
71
  Requires-Dist: black>=26.5.1; extra == "dev"
69
72
  Requires-Dist: build; extra == "dev"
73
+ Requires-Dist: mcp>=2.1.1; extra == "dev"
70
74
  Dynamic: license-file
71
75
 
72
76
  [![CodeQL](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql)
@@ -85,6 +89,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
85
89
  ## Features
86
90
 
87
91
  - **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
92
+ - **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
88
93
  - **Declarative JSON workflows** with variable substitution and cross-step data flow
89
94
  - **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
90
95
  - **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
@@ -92,6 +97,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
92
97
  - **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
93
98
  - **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
94
99
  - **Prompt weighting** — A1111-style `(word:1.5)` syntax with long prompt support
100
+ - **Prompt library** — store prompts once in `prompts/` and reference them from any workflow as `prompt:name` or `prompt:folder/name`, with a web UI for browsing, editing, and AI-enhancing them
95
101
  - **LoRA and IP-Adapter** support
96
102
  - **Composable workflows** from multiple JSON files with `builtin:` references
97
103
  - **Utility tasks** — upscaling, face restoration, segmentation, captioning, frame interpolation, QR codes, and more
@@ -135,6 +141,8 @@ Everything the engine does, in a browser backed by a persistent GPU worker — m
135
141
 
136
142
  ![The gallery with generated images and videos](docs/img/ui-gallery.jpg)
137
143
 
144
+ **A prompt library shared by every workflow.** Store a prompt once, reference it anywhere as `prompt:name` — the Prompts page browses, edits, and filters the library, and an *Enhance with AI* panel expands an idea into a full prompt with a local language model.
145
+
138
146
  **A model manager for the disk your models actually consume.** The Hugging Face hub cache, inventoried: sizes, revisions, last-used dates, free space — download new models by id with live progress, delete with one click.
139
147
 
140
148
  ![The model manager listing cached models with sizes](docs/img/ui-models.png)
@@ -146,14 +154,14 @@ Jobs queue, stream progress live (per denoising step), cancel cooperatively, and
146
154
  ### Run a Workflow
147
155
 
148
156
  ```bash
149
- python -m dw.run examples/flux/FluxDev.json
150
- python -m dw.run examples/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
157
+ python -m dw.run workflows/flux/FluxDev.json
158
+ python -m dw.run workflows/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
151
159
  ```
152
160
 
153
161
  ### Validate a Workflow
154
162
 
155
163
  ```bash
156
- python -m dw.validate examples/flux/FluxDev.json
164
+ python -m dw.validate workflows/flux/FluxDev.json
157
165
  ```
158
166
 
159
167
  ### Interactive REPL
@@ -313,13 +321,14 @@ a (photorealistic:1.4) portrait with (bright red hair:1.3) and [freckles]
313
321
 
314
322
  **Interactive schema browser:** [View Schema](https://json-schema.app/view/%23?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdkackman%2Fdiffusers-workflow%2Frefs%2Fheads%2Fmaster%2Fdw%2Fworkflow_schema.json)
315
323
 
316
- See [examples/](examples/) for more workflow files.
324
+ See [workflows/](workflows/) for more workflow files.
317
325
 
318
326
  ## Documentation
319
327
 
320
328
  ### Guides
321
329
 
322
330
  - [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
331
+ - [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
323
332
  - [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
324
333
  - [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
325
334
  - [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
@@ -327,6 +336,7 @@ See [examples/](examples/) for more workflow files.
327
336
  - [LoRA](docs/LORAS.md) — Loading and stacking LoRA adapters
328
337
  - [IP-Adapter](docs/IP_ADAPTER.md) — Image-prompt conditioning
329
338
  - [Prompt Weighting](docs/PROMPT_WEIGHTING.md) — A1111-style syntax
339
+ - [Prompt References](docs/WORKFLOW_GUIDE.md#prompt-references) — The stored prompt library and `prompt:` references
330
340
  - [Tasks](docs/TASKS.md) — Image processing, ControlNet preprocessors, utilities
331
341
 
332
342
  ### Reference
@@ -17,7 +17,9 @@ dw/hub_cache.py
17
17
  dw/introspection.py
18
18
  dw/log_setup.py
19
19
  dw/previous_results.py
20
+ dw/prompt_schema.json
20
21
  dw/prompt_weighting.py
22
+ dw/prompts.py
21
23
  dw/repl.py
22
24
  dw/repl_commands.py
23
25
  dw/repl_worker.py
@@ -44,6 +46,7 @@ dw/pipeline_processors/pipeline.py
44
46
  dw/pipeline_processors/remote.py
45
47
  dw/server/__init__.py
46
48
  dw/server/app.py
49
+ dw/server/enhancers.py
47
50
  dw/server/jobs.py
48
51
  dw/server/updater.py
49
52
  dw/server/ui/index.html
@@ -61,45 +64,45 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
61
64
  dw/server/ui/assets/csp-bTuwJoIa.js
62
65
  dw/server/ui/assets/css-DIMkf-bt.js
63
66
  dw/server/ui/assets/css.worker-B3ciXF_0.js
64
- dw/server/ui/assets/cssMode-DklhHuQC.js
67
+ dw/server/ui/assets/cssMode-DBf-T_da.js
65
68
  dw/server/ui/assets/cypher-CVaqCwHa.js
66
69
  dw/server/ui/assets/dart-onAF5SnQ.js
67
70
  dw/server/ui/assets/dockerfile-DZFCIeNp.js
68
71
  dw/server/ui/assets/ecl-D05T4iGw.js
69
72
  dw/server/ui/assets/editor-jjEx9u7D.css
70
- dw/server/ui/assets/editor.api-DCWJa9Fw.js
73
+ dw/server/ui/assets/editor.api-B0D5Ygq7.js
71
74
  dw/server/ui/assets/editor.worker-q-txB4vs.js
72
75
  dw/server/ui/assets/elixir-6RTg0lbw.js
73
76
  dw/server/ui/assets/flow9-C5_-GSwl.js
74
- dw/server/ui/assets/freemarker2-CVxDKoFq.js
77
+ dw/server/ui/assets/freemarker2-Br8g4G1T.js
75
78
  dw/server/ui/assets/fsharp-C8Ef5oNN.js
76
79
  dw/server/ui/assets/go-C-y9NEjX.js
77
80
  dw/server/ui/assets/graphql-fmXr3nnJ.js
78
- dw/server/ui/assets/handlebars-DK-ehq_7.js
81
+ dw/server/ui/assets/handlebars-BKo1TaOF.js
79
82
  dw/server/ui/assets/hcl-CpzslTdj.js
80
- dw/server/ui/assets/html-CrtXvEnP.js
83
+ dw/server/ui/assets/html-Bis1seyM.js
81
84
  dw/server/ui/assets/html.worker-C93Ht9o9.js
82
- dw/server/ui/assets/htmlMode-D0r9dgS3.js
83
- dw/server/ui/assets/index-SQcvGbXy.css
84
- dw/server/ui/assets/index-qLIa9n7C.js
85
+ dw/server/ui/assets/htmlMode-D2SOD2MF.js
86
+ dw/server/ui/assets/index-D7eWnTCB.css
87
+ dw/server/ui/assets/index-JyFxgIR9.js
85
88
  dw/server/ui/assets/ini-sBoK_t0W.js
86
89
  dw/server/ui/assets/java-BEtHBSE6.js
87
- dw/server/ui/assets/javascript-rD650v5-.js
90
+ dw/server/ui/assets/javascript-CkEbVb78.js
88
91
  dw/server/ui/assets/json.worker-B2V3pomh.js
89
- dw/server/ui/assets/jsonMode-DvWKiZ5V.js
92
+ dw/server/ui/assets/jsonMode-dVJbYwxg.js
90
93
  dw/server/ui/assets/julia-Bri6UV-V.js
91
94
  dw/server/ui/assets/kotlin-BOotOW0E.js
92
95
  dw/server/ui/assets/less-B9JPFI3C.js
93
96
  dw/server/ui/assets/lexon-CfSJPG6W.js
94
- dw/server/ui/assets/liquid-DvjV9-yQ.js
95
- dw/server/ui/assets/lspLanguageFeatures-Bv4c-HOB.js
97
+ dw/server/ui/assets/liquid-Btak-6uF.js
98
+ dw/server/ui/assets/lspLanguageFeatures-BfeZZQbb.js
96
99
  dw/server/ui/assets/lua-CsQS60Ue.js
97
100
  dw/server/ui/assets/m3-D-oSqn_W.js
98
101
  dw/server/ui/assets/markdown-Cimd5fb3.js
99
- dw/server/ui/assets/mdx-CmyDcP1k.js
102
+ dw/server/ui/assets/mdx-D9KXK7-s.js
100
103
  dw/server/ui/assets/mips-CIPQ_RoX.js
101
104
  dw/server/ui/assets/monaco--ixms01u.css
102
- dw/server/ui/assets/monaco-CFDZdQeR.js
105
+ dw/server/ui/assets/monaco-ZMCk_MWf.js
103
106
  dw/server/ui/assets/msdax-DauUninz.js
104
107
  dw/server/ui/assets/mysql-SOo6toE5.js
105
108
  dw/server/ui/assets/objective-c-FvmIjYaQ.js
@@ -114,10 +117,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
114
117
  dw/server/ui/assets/powershell-DmHpPYUd.js
115
118
  dw/server/ui/assets/protobuf-C531GsRP.js
116
119
  dw/server/ui/assets/pug-Z5eAx3Zn.js
117
- dw/server/ui/assets/python-BbNG9-ih.js
120
+ dw/server/ui/assets/python-0FnO4xGM.js
118
121
  dw/server/ui/assets/qsharp-DkqhCAOL.js
119
122
  dw/server/ui/assets/r-BwWrilGY.js
120
- dw/server/ui/assets/razor-BruFjATi.js
123
+ dw/server/ui/assets/razor-B6PMzeY4.js
121
124
  dw/server/ui/assets/redis-ClamHrr6.js
122
125
  dw/server/ui/assets/redshift-DT7zqm-g.js
123
126
  dw/server/ui/assets/restructuredtext-BYgofb2h.js
@@ -137,15 +140,15 @@ dw/server/ui/assets/swift-Bxkupp3x.js
137
140
  dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
138
141
  dw/server/ui/assets/tcl-DISqw1ZD.js
139
142
  dw/server/ui/assets/ts.worker-D7T1-Ig5.js
140
- dw/server/ui/assets/tsMode-DhwsPBWM.js
143
+ dw/server/ui/assets/tsMode-nxyvZH1t.js
141
144
  dw/server/ui/assets/twig-De2hgUGE.js
142
- dw/server/ui/assets/typescript-DLBTIt_O.js
145
+ dw/server/ui/assets/typescript-BhBe8aGf.js
143
146
  dw/server/ui/assets/typespec-B8J7ngcE.js
144
147
  dw/server/ui/assets/vb-DV3o63ZY.js
145
148
  dw/server/ui/assets/wgsl-DpFanUEy.js
146
- dw/server/ui/assets/workers-BD2vxpDW.js
147
- dw/server/ui/assets/xml-BCRgtEff.js
148
- dw/server/ui/assets/yaml-B9W8qjO1.js
149
+ dw/server/ui/assets/workers-ChAf-t8A.js
150
+ dw/server/ui/assets/xml-z2r9dHSO.js
151
+ dw/server/ui/assets/yaml-DrcHrz7f.js
149
152
  dw/tasks/audio_utils.py
150
153
  dw/tasks/background_remover.py
151
154
  dw/tasks/borders.py
@@ -174,12 +177,23 @@ dw/workflows/augment_prompt.json
174
177
  dw/workflows/describe_image.json
175
178
  dw/workflows/h3_context_ir.json
176
179
  dw/workflows/test.json
180
+ dw_mcp/__init__.py
181
+ dw_mcp/__main__.py
182
+ dw_mcp/authoring.py
183
+ dw_mcp/catalog.py
184
+ dw_mcp/client.py
185
+ dw_mcp/diagnose.py
186
+ dw_mcp/media.py
187
+ dw_mcp/models.py
188
+ dw_mcp/prompts.py
189
+ dw_mcp/server.py
177
190
  tests/test_argument_updates.py
178
191
  tests/test_arguments.py
179
192
  tests/test_audio_utils.py
180
193
  tests/test_borders.py
181
194
  tests/test_cache_blocks.py
182
195
  tests/test_chain.py
196
+ tests/test_cli.py
183
197
  tests/test_component_pruning.py
184
198
  tests/test_concat_videos.py
185
199
  tests/test_config_objects.py
@@ -187,6 +201,7 @@ tests/test_configuration_schema.py
187
201
  tests/test_depth_estimator.py
188
202
  tests/test_device.py
189
203
  tests/test_device_helpers.py
204
+ tests/test_device_portability.py
190
205
  tests/test_diffusion_upscale.py
191
206
  tests/test_docs_links.py
192
207
  tests/test_events.py
@@ -199,18 +214,30 @@ tests/test_integration.py
199
214
  tests/test_interpolate_frames.py
200
215
  tests/test_introspection.py
201
216
  tests/test_list_images.py
217
+ tests/test_mcp_authoring.py
218
+ tests/test_mcp_catalog.py
219
+ tests/test_mcp_client.py
220
+ tests/test_mcp_diagnose.py
221
+ tests/test_mcp_media.py
222
+ tests/test_mcp_models.py
223
+ tests/test_mcp_prompts.py
224
+ tests/test_mcp_server.py
202
225
  tests/test_model_cache.py
203
226
  tests/test_modular_pipeline.py
227
+ tests/test_offload_placement.py
204
228
  tests/test_pair_audio.py
229
+ tests/test_phase_events.py
205
230
  tests/test_pipeline_caching.py
206
231
  tests/test_pipeline_components.py
207
232
  tests/test_previous_results.py
208
233
  tests/test_prompt_parser.py
209
234
  tests/test_prompt_weighting.py
235
+ tests/test_prompts.py
210
236
  tests/test_repl_commands.py
211
237
  tests/test_repl_ergonomics.py
212
238
  tests/test_repl_hierarchical.py
213
239
  tests/test_repl_reorganization.py
240
+ tests/test_repl_worker.py
214
241
  tests/test_resize_bucket.py
215
242
  tests/test_result.py
216
243
  tests/test_scheduler_config.py
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
+ dw-mcp = dw_mcp.__main__:main
2
3
  dw-repl = dw.repl:main
3
4
  dw-run = dw.run:main
4
5
  dw-serve = dw.serve:main
@@ -49,6 +49,11 @@ pytest-asyncio>=1.4.0
49
49
  httpx>=0.28.1
50
50
  black>=26.5.1
51
51
  build
52
+ mcp>=2.1.1
53
+
54
+ [mcp]
55
+ mcp>=2.1.1
56
+ httpx>=0.28.1
52
57
 
53
58
  [server]
54
59
  fastapi>=0.141.1
@@ -138,6 +138,81 @@ def get_device_type(device=None):
138
138
  return torch.device(device if device is not None else get_device()).type
139
139
 
140
140
 
141
+ def backend_available(device_type):
142
+ """
143
+ Whether this machine can actually run on a backend.
144
+
145
+ Only the backends dw knows how to probe get an answer. An unrecognized one is
146
+ reported available rather than guessed at, so a device torch understands and dw
147
+ does not is left alone instead of being rewritten.
148
+
149
+ Args:
150
+ device_type: Backend name ('cuda', 'mps', 'cpu', ...)
151
+
152
+ Returns:
153
+ bool: Whether the backend is usable here
154
+ """
155
+ if not _TORCH_AVAILABLE:
156
+ return device_type == "cpu"
157
+
158
+ if device_type == "cpu":
159
+ return True
160
+
161
+ if device_type == "cuda":
162
+ return torch.cuda.is_available()
163
+
164
+ if device_type == "mps":
165
+ return hasattr(torch.backends, "mps") and torch.backends.mps.is_available()
166
+
167
+ is_available = getattr(getattr(torch, device_type, None), "is_available", None)
168
+ return bool(is_available()) if callable(is_available) else True
169
+
170
+
171
+ def resolve_device(requested):
172
+ """
173
+ Translate a device a workflow asked for into one this machine has.
174
+
175
+ A device named in a workflow is nearly always the author saying 'the accelerator'
176
+ rather than 'specifically NVIDIA', so a workflow written on a CUDA box runs on a
177
+ Mac and back again. The backend is what gets translated - an index is left alone
178
+ when the backend matches, since 'cuda:1' on a single-GPU CUDA box is a genuine
179
+ mistake and not a portability problem. A CPU device is never rewritten: pinning a
180
+ step to the CPU is how a GPU-specific problem gets ruled out.
181
+
182
+ Args:
183
+ requested: Device identifier from a workflow, or None for no override
184
+
185
+ Returns:
186
+ The device to use, or None if None was passed
187
+ """
188
+ if requested is None or not _TORCH_AVAILABLE:
189
+ return requested
190
+
191
+ try:
192
+ device = torch.device(requested)
193
+ except (RuntimeError, TypeError, ValueError):
194
+ # Not a device torch understands - let the failure surface where it is used
195
+ return requested
196
+
197
+ if device.type == "cpu" or backend_available(device.type):
198
+ return requested
199
+
200
+ target = get_device()
201
+ if device.index is not None:
202
+ logging.warning(
203
+ f"Workflow asks for '{requested}', which this machine has no {device.type} "
204
+ f"backend for - running on {target}. The device index is dropped, so a "
205
+ "workflow that meant to spread work across accelerators will not."
206
+ )
207
+ else:
208
+ logging.warning(
209
+ f"Workflow asks for '{requested}', which this machine has no {device.type} "
210
+ f"backend for - running on {target}"
211
+ )
212
+
213
+ return target
214
+
215
+
141
216
  def get_autocast_device_type():
142
217
  """
143
218
  Get the device type to use for torch.autocast.
@@ -3,6 +3,7 @@ import copy
3
3
  import logging
4
4
  from inspect import Parameter, signature
5
5
  from .type_helpers import load_type_from_name, load_constant_from_name, has_method
6
+ from .prompts import PROMPT_PREFIX, fetch_prompt
6
7
  from diffusers.utils import load_image, load_video
7
8
  from .security import (
8
9
  validate_path,
@@ -92,6 +93,11 @@ def realize_args(arg, base_dir=None):
92
93
  # conventions below - what it holds is the value, not a file to load
93
94
  if is_constant_reference(v):
94
95
  arg[k] = fetch_constant(v)
96
+ # A stored prompt resolves the same way - to its text, under any
97
+ # name, before the media conventions could mistake it for a file.
98
+ # The workflow's directory anchors prompt-library discovery
99
+ elif is_prompt_reference(v):
100
+ arg[k] = fetch_prompt(v, base_dir=base_dir)
95
101
  # An explicit media reference loads under any argument name - the
96
102
  # key conventions below only cover arguments named like their media
97
103
  elif is_media_reference(v):
@@ -140,6 +146,9 @@ def realize_args(arg, base_dir=None):
140
146
  if is_constant_reference(item):
141
147
  arg[i] = fetch_constant(item)
142
148
  continue
149
+ if is_prompt_reference(item):
150
+ arg[i] = fetch_prompt(item, base_dir=base_dir)
151
+ continue
143
152
  if is_media_reference(item):
144
153
  arg[i] = fetch_media(item, base_dir)
145
154
  continue
@@ -152,6 +161,11 @@ def is_constant_reference(value):
152
161
  return isinstance(value, str) and value.startswith(CONSTANT_PREFIX)
153
162
 
154
163
 
164
+ def is_prompt_reference(value):
165
+ """Whether a value references a stored prompt in the prompt library."""
166
+ return isinstance(value, str) and value.startswith(PROMPT_PREFIX)
167
+
168
+
155
169
  def fetch_constant(reference):
156
170
  """Read the value a 'constant:' reference names.
157
171
 
@@ -703,12 +717,22 @@ def media_arguments(object_type, artifact):
703
717
  arguments["sample_rate"] = sample_rate
704
718
  return arguments
705
719
 
720
+ if audio is None and hasattr(artifact, "ndim") and artifact.ndim <= 3:
721
+ # A step that generates audio alone - a music pipeline, a slice_audio
722
+ # task - produces the waveform itself rather than an AudioVideo. It
723
+ # carries no rate of its own, so the reference declares 'sample_rate'
724
+ # alongside 'from_previous_result'
725
+ audio = torch.as_tensor(as_channels_samples(artifact))
726
+
706
727
  if audio is None:
707
728
  raise ValueError(
708
729
  f"{object_type.__name__} holds audio, but the step it names produced "
709
730
  f"none - reference a step that generates a soundtrack"
710
731
  )
711
- return {"audio": audio, "sample_rate": sample_rate}
732
+ arguments = {"audio": audio}
733
+ if sample_rate is not None:
734
+ arguments["sample_rate"] = sample_rate
735
+ return arguments
712
736
 
713
737
 
714
738
  def validate_media_location(location, base_dir=None):
@@ -76,3 +76,20 @@ def activate_context(context):
76
76
 
77
77
  def deactivate_context(token):
78
78
  _active_context.reset(token)
79
+
80
+
81
+ # The coarse states a run passes through. Small on purpose: a phase says what
82
+ # the run is waiting on, not what any one library is doing internally
83
+ PHASES = ("loading", "cached", "generating", "decoding", "saving", "task")
84
+
85
+
86
+ def emit_phase(phase, detail=None):
87
+ """Report a coarse phase change on the active run.
88
+
89
+ A step spends most of its wall clock outside the denoise loop - pulling
90
+ weights, decoding latents, encoding video - and a step counter says
91
+ nothing about any of that. These are the rest of the story. They are rare
92
+ enough (a handful per step) to carry a free-text detail alongside, which
93
+ is what makes 'loading' readable as 'which model'.
94
+ """
95
+ get_context().emit("phase", phase=phase, detail=detail)