diffusers-workflow 0.4.0b6__tar.gz → 0.4.0b7__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 (411) hide show
  1. {diffusers_workflow-0.4.0b6/diffusers_workflow.egg-info → diffusers_workflow-0.4.0b7}/PKG-INFO +3 -2
  2. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/README.md +1 -1
  3. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7/diffusers_workflow.egg-info}/PKG-INFO +3 -2
  4. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/diffusers_workflow.egg-info/SOURCES.txt +42 -21
  5. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/diffusers_workflow.egg-info/requires.txt +1 -0
  6. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/arguments.py +9 -2
  7. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/MCP.md +53 -23
  8. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/RELEASING.md +15 -0
  9. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/REMOTE.md +7 -0
  10. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/SERVER.md +72 -27
  11. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/TASKS.md +211 -11
  12. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/WORKFLOW_GUIDE.md +65 -4
  13. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/WORKSPACES.md +23 -12
  14. diffusers_workflow-0.4.0b7/dw/host_memory_projection.py +175 -0
  15. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/introspection.py +152 -7
  16. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/locations.py +10 -4
  17. diffusers_workflow-0.4.0b7/dw/media_audio.py +217 -0
  18. diffusers_workflow-0.4.0b7/dw/media_frames.py +340 -0
  19. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/media_info.py +67 -9
  20. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/plan.py +347 -19
  21. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/prompt_schema.json +1 -1
  22. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/result.py +363 -55
  23. diffusers_workflow-0.4.0b7/dw/scalar_result_validation.py +78 -0
  24. diffusers_workflow-0.4.0b7/dw/select_validation.py +115 -0
  25. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/app.py +529 -22
  26. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/catalog_shape.py +11 -3
  27. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/guides.py +34 -3
  28. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/jobs.py +192 -26
  29. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/observed_cost.py +22 -6
  30. diffusers_workflow-0.4.0b7/dw/server/sysinfo.py +71 -0
  31. diffusers_workflow-0.4.0b6/dw/server/ui/assets/cssMode-1t4O7A8b.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/cssMode-xQCqMuag.js +1 -1
  32. diffusers_workflow-0.4.0b6/dw/server/ui/assets/editor.api-C2mqCHa9.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/editor.api-Bfiq9hmW.js +1 -1
  33. diffusers_workflow-0.4.0b6/dw/server/ui/assets/freemarker2-Cb6RGT42.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/freemarker2-BwDnlSuz.js +1 -1
  34. diffusers_workflow-0.4.0b6/dw/server/ui/assets/handlebars-LzK4_SEF.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/handlebars-Beb1we4G.js +1 -1
  35. diffusers_workflow-0.4.0b6/dw/server/ui/assets/html-Biz_qd50.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/html-Yw-qdTCH.js +1 -1
  36. diffusers_workflow-0.4.0b6/dw/server/ui/assets/htmlMode-CP4Kjl0x.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/htmlMode-Dbp7eBPO.js +1 -1
  37. diffusers_workflow-0.4.0b7/dw/server/ui/assets/index-CsXMC8a8.css +1 -0
  38. diffusers_workflow-0.4.0b7/dw/server/ui/assets/index-DqbiZNFq.js +43 -0
  39. diffusers_workflow-0.4.0b6/dw/server/ui/assets/javascript-DX4-t0BE.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/javascript-BNzP7yQZ.js +1 -1
  40. diffusers_workflow-0.4.0b6/dw/server/ui/assets/jsonMode-hZa_qOEa.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/jsonMode-DxIEESAg.js +1 -1
  41. diffusers_workflow-0.4.0b6/dw/server/ui/assets/liquid-BRkTuJ_A.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/liquid-CeQTai1N.js +1 -1
  42. diffusers_workflow-0.4.0b6/dw/server/ui/assets/lspLanguageFeatures-Dvt5tod9.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/lspLanguageFeatures-DKVB_UCB.js +1 -1
  43. diffusers_workflow-0.4.0b6/dw/server/ui/assets/mdx-Bdet7qev.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/mdx-Bczl_PHr.js +1 -1
  44. diffusers_workflow-0.4.0b6/dw/server/ui/assets/monaco-QRyCMGAv.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/monaco-Bu2OB6wI.js +4 -4
  45. diffusers_workflow-0.4.0b6/dw/server/ui/assets/python-DO0uJyUr.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/python-CeTsj82v.js +1 -1
  46. diffusers_workflow-0.4.0b6/dw/server/ui/assets/razor-CkfVe6oz.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/razor-CN7JaWqc.js +1 -1
  47. diffusers_workflow-0.4.0b6/dw/server/ui/assets/tsMode-z26QXNyE.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/tsMode-CoSEMx-L.js +1 -1
  48. diffusers_workflow-0.4.0b6/dw/server/ui/assets/typescript-DIdNc_uc.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/typescript-CcsolRTO.js +1 -1
  49. diffusers_workflow-0.4.0b6/dw/server/ui/assets/workers-Ce8CDVu5.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/workers-DLaycdy4.js +1 -1
  50. diffusers_workflow-0.4.0b6/dw/server/ui/assets/xml-Djj2U0Rl.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/xml-QEwuyn1w.js +1 -1
  51. diffusers_workflow-0.4.0b6/dw/server/ui/assets/yaml-CePLO71e.js → diffusers_workflow-0.4.0b7/dw/server/ui/assets/yaml-BB4U5D-R.js +1 -1
  52. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/index.html +2 -2
  53. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/step.py +17 -3
  54. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/step_cache.py +94 -7
  55. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/task_domains.py +59 -14
  56. diffusers_workflow-0.4.0b7/dw/tasks/audio_transcription.py +88 -0
  57. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/audio_utils.py +744 -54
  58. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/concat_videos.py +19 -3
  59. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/dissolve_videos.py +57 -8
  60. diffusers_workflow-0.4.0b7/dw/tasks/judge.py +68 -0
  61. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/pair_audio.py +11 -3
  62. diffusers_workflow-0.4.0b7/dw/tasks/select.py +111 -0
  63. diffusers_workflow-0.4.0b7/dw/tasks/speech_generation.py +228 -0
  64. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/task.py +177 -15
  65. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/video_utils.py +156 -3
  66. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/variables.py +27 -0
  67. diffusers_workflow-0.4.0b7/dw/vram_estimate.py +116 -0
  68. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/worker.py +55 -8
  69. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/workflow.py +71 -2
  70. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/workflow_schema.json +18 -0
  71. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/assets.py +126 -20
  72. diffusers_workflow-0.4.0b7/dw_mcp/authoring.py +135 -0
  73. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/catalog.py +23 -6
  74. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/client.py +40 -8
  75. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/diagnose.py +36 -7
  76. diffusers_workflow-0.4.0b7/dw_mcp/media.py +578 -0
  77. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/prompts.py +15 -3
  78. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/server.py +368 -156
  79. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/workspaces.py +84 -7
  80. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/pyproject.toml +12 -3
  81. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_assets.py +13 -0
  82. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_audio_utils.py +508 -3
  83. diffusers_workflow-0.4.0b7/tests/test_best_of_n_template.py +66 -0
  84. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_cache_blocks.py +26 -15
  85. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_catalog_shape.py +51 -0
  86. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_catalog_structure.py +13 -2
  87. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_cli.py +1 -1
  88. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_concat_videos.py +82 -1
  89. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_content_types.py +3 -3
  90. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_dissolve_videos.py +43 -2
  91. diffusers_workflow-0.4.0b7/tests/test_host_memory_projection.py +122 -0
  92. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_integration.py +5 -4
  93. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_introspection.py +113 -0
  94. diffusers_workflow-0.4.0b7/tests/test_job_history_wal.py +14 -0
  95. diffusers_workflow-0.4.0b7/tests/test_judge.py +105 -0
  96. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_ltx_prompt_library.py +1 -1
  97. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_assets.py +78 -0
  98. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_authoring.py +59 -0
  99. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_client.py +62 -0
  100. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_diagnose.py +126 -0
  101. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_media.py +601 -1
  102. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_prompts.py +45 -0
  103. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_server.py +400 -0
  104. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_workspaces.py +55 -0
  105. diffusers_workflow-0.4.0b7/tests/test_media_audio.py +343 -0
  106. diffusers_workflow-0.4.0b7/tests/test_media_frames.py +521 -0
  107. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_media_info.py +20 -4
  108. diffusers_workflow-0.4.0b7/tests/test_mix_audio.py +152 -0
  109. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_observed_cost.py +131 -6
  110. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_pair_audio_fit.py +9 -0
  111. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_plan.py +471 -5
  112. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_plugin_skills.py +61 -0
  113. diffusers_workflow-0.4.0b7/tests/test_prompt_library.py +71 -0
  114. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_reference_names.py +2 -2
  115. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_result.py +398 -18
  116. diffusers_workflow-0.4.0b7/tests/test_scalar_result_validation.py +103 -0
  117. diffusers_workflow-0.4.0b7/tests/test_select.py +119 -0
  118. diffusers_workflow-0.4.0b7/tests/test_select_validation.py +185 -0
  119. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_server.py +731 -7
  120. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_server_guides.py +39 -3
  121. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_server_jobs.py +51 -0
  122. diffusers_workflow-0.4.0b7/tests/test_speech_generation.py +481 -0
  123. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_step_cache.py +118 -5
  124. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_subfolders.py +4 -4
  125. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_task.py +25 -0
  126. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_task_signature_errors.py +6 -2
  127. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_template_subfolders.py +20 -16
  128. diffusers_workflow-0.4.0b7/tests/test_transcribe_audio.py +104 -0
  129. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_updater.py +9 -0
  130. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_variables.py +73 -0
  131. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_video_utils.py +172 -0
  132. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_workflow.py +41 -0
  133. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_workflow_step_cache.py +1 -0
  134. diffusers_workflow-0.4.0b6/dw/server/ui/assets/index-Bt8BlCkf.js +0 -41
  135. diffusers_workflow-0.4.0b6/dw/server/ui/assets/index-D9tEUhx5.css +0 -1
  136. diffusers_workflow-0.4.0b6/dw/tasks/speech_generation.py +0 -105
  137. diffusers_workflow-0.4.0b6/dw_mcp/authoring.py +0 -69
  138. diffusers_workflow-0.4.0b6/dw_mcp/media.py +0 -278
  139. diffusers_workflow-0.4.0b6/tests/test_mix_audio.py +0 -67
  140. diffusers_workflow-0.4.0b6/tests/test_speech_generation.py +0 -163
  141. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/LICENSE +0 -0
  142. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/MANIFEST.in +0 -0
  143. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
  144. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/diffusers_workflow.egg-info/entry_points.txt +0 -0
  145. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/diffusers_workflow.egg-info/top_level.txt +0 -0
  146. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/__init__.py +0 -0
  147. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/adapter_compatibility.py +0 -0
  148. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/assets.py +0 -0
  149. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/cache_blocks.json +0 -0
  150. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/cache_blocks.py +0 -0
  151. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
  152. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/content_types.py +0 -0
  153. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/ACCELERATION.md +0 -0
  154. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/AGENT_LOOP.md +0 -0
  155. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/DEPENDENCIES.md +0 -0
  156. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/IP_ADAPTER.md +0 -0
  157. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/LORAS.md +0 -0
  158. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/PROMPT_WEIGHTING.md +0 -0
  159. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/QUANTIZATION.md +0 -0
  160. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/RECIPES_24GB.md +0 -0
  161. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/REPL_COMMANDS.md +0 -0
  162. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/REPL_WORKER_GUIDE.md +0 -0
  163. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/SECURITY.md +0 -0
  164. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/SECURITY_QUICKREF.md +0 -0
  165. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/docs/TESTING.md +0 -0
  166. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/elision.py +0 -0
  167. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/events.py +0 -0
  168. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/for_each.py +0 -0
  169. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/host_memory.py +0 -0
  170. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/hub_cache.py +0 -0
  171. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/kernel_availability.py +0 -0
  172. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/log_setup.py +0 -0
  173. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/pipeline_processors/chain.py +0 -0
  174. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/pipeline_processors/config_objects.py +0 -0
  175. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/pipeline_processors/pipeline.py +0 -0
  176. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/pipeline_processors/remote.py +0 -0
  177. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/previous_results.py +0 -0
  178. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/prompt_weighting.py +0 -0
  179. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/prompts.py +0 -0
  180. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/realize.py +0 -0
  181. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/reference_limits.py +0 -0
  182. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/reference_names.py +0 -0
  183. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/repl.py +0 -0
  184. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/repl_commands.py +0 -0
  185. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/repl_worker.py +0 -0
  186. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/run.py +0 -0
  187. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/runs.py +0 -0
  188. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/schema.py +0 -0
  189. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/security.py +0 -0
  190. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/serve.py +0 -0
  191. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/__init__.py +0 -0
  192. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/enhancers.py +0 -0
  193. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/exports.py +0 -0
  194. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/mcp_mount.py +0 -0
  195. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/netinfo.py +0 -0
  196. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
  197. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
  198. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
  199. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
  200. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
  201. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
  202. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
  203. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
  204. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
  205. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
  206. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
  207. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
  208. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
  209. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
  210. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
  211. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
  212. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
  213. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
  214. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
  215. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
  216. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
  217. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
  218. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
  219. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
  220. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
  221. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
  222. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
  223. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
  224. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
  225. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
  226. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
  227. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
  228. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
  229. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
  230. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
  231. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
  232. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
  233. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
  234. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
  235. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
  236. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
  237. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
  238. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
  239. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
  240. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
  241. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
  242. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/php-nr791fC2.js +0 -0
  243. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
  244. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
  245. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
  246. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
  247. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
  248. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
  249. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
  250. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
  251. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
  252. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
  253. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
  254. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
  255. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
  256. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
  257. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
  258. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
  259. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
  260. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
  261. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
  262. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
  263. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
  264. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
  265. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/st-DbInun42.js +0 -0
  266. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
  267. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
  268. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
  269. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
  270. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
  271. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
  272. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
  273. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
  274. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/server/updater.py +0 -0
  275. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/settings.py +0 -0
  276. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/subfolders.py +0 -0
  277. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/background_remover.py +0 -0
  278. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/borders.py +0 -0
  279. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/compose_text.py +0 -0
  280. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/depth_estimator.py +0 -0
  281. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/diffusion_upscale.py +0 -0
  282. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/format_messages.py +0 -0
  283. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/gather.py +0 -0
  284. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/image_to_text.py +0 -0
  285. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/image_utils.py +0 -0
  286. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/interpolate_frames.py +0 -0
  287. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/model_cache.py +0 -0
  288. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/qr_code.py +0 -0
  289. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/restore_faces.py +0 -0
  290. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/rife_model.py +0 -0
  291. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/segment.py +0 -0
  292. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/stabilize.py +0 -0
  293. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/tensor_image.py +0 -0
  294. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/text_generation.py +0 -0
  295. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/text_sections.py +0 -0
  296. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/upscale.py +0 -0
  297. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/tasks/zoe_depth.py +0 -0
  298. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/teacache.py +0 -0
  299. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/teacache_models.json +0 -0
  300. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/test.py +0 -0
  301. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/type_helpers.py +0 -0
  302. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/validate.py +0 -0
  303. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/variable_constraints.py +0 -0
  304. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/workflow_sources.py +0 -0
  305. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/workflows/h3_context_ir.json +0 -0
  306. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/workflows/test.json +0 -0
  307. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw/workspace.py +0 -0
  308. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/__init__.py +0 -0
  309. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/__main__.py +0 -0
  310. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/exports.py +0 -0
  311. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/guides.py +0 -0
  312. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/dw_mcp/models.py +0 -0
  313. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/setup.cfg +0 -0
  314. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_argument_updates.py +0 -0
  315. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_arguments.py +0 -0
  316. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_borders.py +0 -0
  317. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_chain.py +0 -0
  318. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_component_pruning.py +0 -0
  319. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_compose_text.py +0 -0
  320. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_config_objects.py +0 -0
  321. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_configuration_schema.py +0 -0
  322. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_depth_estimator.py +0 -0
  323. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_device.py +0 -0
  324. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_device_helpers.py +0 -0
  325. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_device_portability.py +0 -0
  326. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_dialogue_short_voices.py +0 -0
  327. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_diffusion_upscale.py +0 -0
  328. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_docs_links.py +0 -0
  329. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_elision.py +0 -0
  330. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_events.py +0 -0
  331. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_examples.py +0 -0
  332. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_for_each.py +0 -0
  333. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_gather.py +0 -0
  334. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_h3_adapters.py +0 -0
  335. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_h3_context_ir.py +0 -0
  336. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_h3_schedule.py +0 -0
  337. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_hf_placement.py +0 -0
  338. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_host_memory.py +0 -0
  339. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_hub_cache.py +0 -0
  340. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_image_to_text.py +0 -0
  341. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_image_utils.py +0 -0
  342. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_interpolate_frames.py +0 -0
  343. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_job_progress.py +0 -0
  344. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_job_warnings.py +0 -0
  345. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_jobs_listing.py +0 -0
  346. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_jobs_reused.py +0 -0
  347. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_kernel_availability.py +0 -0
  348. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_library_sources.py +0 -0
  349. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_list_images.py +0 -0
  350. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_locations.py +0 -0
  351. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_lora_alpha.py +0 -0
  352. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_ltx2_diffusion_decode.py +0 -0
  353. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_ltx2_ic_loras.py +0 -0
  354. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_catalog.py +0 -0
  355. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_exports.py +0 -0
  356. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_guides.py +0 -0
  357. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_main.py +0 -0
  358. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_mcp_models.py +0 -0
  359. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_model_cache.py +0 -0
  360. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_modular_pipeline.py +0 -0
  361. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_modular_progress.py +0 -0
  362. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_offload_placement.py +0 -0
  363. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_output_references.py +0 -0
  364. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_pair_audio.py +0 -0
  365. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_phase_events.py +0 -0
  366. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_pipeline_caching.py +0 -0
  367. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_pipeline_components.py +0 -0
  368. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_previous_results.py +0 -0
  369. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_prompt_parser.py +0 -0
  370. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_prompt_references.py +0 -0
  371. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_prompt_weighting.py +0 -0
  372. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_prompts.py +0 -0
  373. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_realize.py +0 -0
  374. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_recenter_crop.py +0 -0
  375. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_reference_limits.py +0 -0
  376. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_repl_commands.py +0 -0
  377. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_repl_ergonomics.py +0 -0
  378. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_repl_hierarchical.py +0 -0
  379. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_repl_reorganization.py +0 -0
  380. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_repl_worker.py +0 -0
  381. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_rerun_new_seed.py +0 -0
  382. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_resize_bucket.py +0 -0
  383. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_result_output_naming.py +0 -0
  384. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_runs.py +0 -0
  385. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_scheduler_config.py +0 -0
  386. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_schema.py +0 -0
  387. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_security.py +0 -0
  388. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_segment.py +0 -0
  389. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_serve_main.py +0 -0
  390. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_server_downloads.py +0 -0
  391. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_server_exports.py +0 -0
  392. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_server_info.py +0 -0
  393. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_server_mcp.py +0 -0
  394. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_server_workspaces.py +0 -0
  395. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_stabilize.py +0 -0
  396. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_step.py +0 -0
  397. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_strip_exif_and_watermark.py +0 -0
  398. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_task_discovery.py +0 -0
  399. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_task_domains.py +0 -0
  400. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_teacache.py +0 -0
  401. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_tensor_image.py +0 -0
  402. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_text_generation.py +0 -0
  403. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_text_sections.py +0 -0
  404. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_type_helpers.py +0 -0
  405. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_validate_arguments.py +0 -0
  406. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_variable_constraints.py +0 -0
  407. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_worker.py +0 -0
  408. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_worker_execute.py +0 -0
  409. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_workflow_sources.py +0 -0
  410. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_workflow_trust.py +0 -0
  411. {diffusers_workflow-0.4.0b6 → diffusers_workflow-0.4.0b7}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.4.0b6
3
+ Version: 0.4.0b7
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -47,6 +47,7 @@ Requires-Dist: imageio-ffmpeg>=0.6.0
47
47
  Requires-Dist: av>=18.1.0
48
48
  Requires-Dist: soundfile>=0.14.0
49
49
  Requires-Dist: matplotlib>=3.11.1
50
+ Requires-Dist: speechbrain>=1.0.3
50
51
  Requires-Dist: qrcode>=8.2
51
52
  Requires-Dist: requests>=2.34.2
52
53
  Requires-Dist: aiohttp>=3.14.3
@@ -159,7 +160,7 @@ once; without it the run fails partway through with a 401/403 from the Hub.
159
160
 
160
161
  ## Drive it from an agent
161
162
 
162
- Then just ask. The agent has 55 tools covering the whole surface — the
163
+ Then just ask. The agent has 58 tools covering the whole surface — the
163
164
  workflow catalog, the real diffusers pipeline signatures, the job queue, the
164
165
  gallery, the model cache:
165
166
 
@@ -83,7 +83,7 @@ once; without it the run fails partway through with a 401/403 from the Hub.
83
83
 
84
84
  ## Drive it from an agent
85
85
 
86
- Then just ask. The agent has 55 tools covering the whole surface — the
86
+ Then just ask. The agent has 58 tools covering the whole surface — the
87
87
  workflow catalog, the real diffusers pipeline signatures, the job queue, the
88
88
  gallery, the model cache:
89
89
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.4.0b6
3
+ Version: 0.4.0b7
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -47,6 +47,7 @@ Requires-Dist: imageio-ffmpeg>=0.6.0
47
47
  Requires-Dist: av>=18.1.0
48
48
  Requires-Dist: soundfile>=0.14.0
49
49
  Requires-Dist: matplotlib>=3.11.1
50
+ Requires-Dist: speechbrain>=1.0.3
50
51
  Requires-Dist: qrcode>=8.2
51
52
  Requires-Dist: requests>=2.34.2
52
53
  Requires-Dist: aiohttp>=3.14.3
@@ -159,7 +160,7 @@ once; without it the run fails partway through with a 401/403 from the Hub.
159
160
 
160
161
  ## Drive it from an agent
161
162
 
162
- Then just ask. The agent has 55 tools covering the whole surface — the
163
+ Then just ask. The agent has 58 tools covering the whole surface — the
163
164
  workflow catalog, the real diffusers pipeline signatures, the job queue, the
164
165
  gallery, the model cache:
165
166
 
@@ -19,11 +19,14 @@ dw/elision.py
19
19
  dw/events.py
20
20
  dw/for_each.py
21
21
  dw/host_memory.py
22
+ dw/host_memory_projection.py
22
23
  dw/hub_cache.py
23
24
  dw/introspection.py
24
25
  dw/kernel_availability.py
25
26
  dw/locations.py
26
27
  dw/log_setup.py
28
+ dw/media_audio.py
29
+ dw/media_frames.py
27
30
  dw/media_info.py
28
31
  dw/plan.py
29
32
  dw/previous_results.py
@@ -39,8 +42,10 @@ dw/repl_worker.py
39
42
  dw/result.py
40
43
  dw/run.py
41
44
  dw/runs.py
45
+ dw/scalar_result_validation.py
42
46
  dw/schema.py
43
47
  dw/security.py
48
+ dw/select_validation.py
44
49
  dw/serve.py
45
50
  dw/settings.py
46
51
  dw/step.py
@@ -54,6 +59,7 @@ dw/type_helpers.py
54
59
  dw/validate.py
55
60
  dw/variable_constraints.py
56
61
  dw/variables.py
62
+ dw/vram_estimate.py
57
63
  dw/worker.py
58
64
  dw/workflow.py
59
65
  dw/workflow_schema.json
@@ -94,6 +100,7 @@ dw/server/jobs.py
94
100
  dw/server/mcp_mount.py
95
101
  dw/server/netinfo.py
96
102
  dw/server/observed_cost.py
103
+ dw/server/sysinfo.py
97
104
  dw/server/updater.py
98
105
  dw/server/ui/index.html
99
106
  dw/server/ui/assets/abap-08VXUWAP.js
@@ -110,45 +117,45 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
110
117
  dw/server/ui/assets/csp-bTuwJoIa.js
111
118
  dw/server/ui/assets/css-DIMkf-bt.js
112
119
  dw/server/ui/assets/css.worker-B3ciXF_0.js
113
- dw/server/ui/assets/cssMode-1t4O7A8b.js
120
+ dw/server/ui/assets/cssMode-xQCqMuag.js
114
121
  dw/server/ui/assets/cypher-CVaqCwHa.js
115
122
  dw/server/ui/assets/dart-onAF5SnQ.js
116
123
  dw/server/ui/assets/dockerfile-DZFCIeNp.js
117
124
  dw/server/ui/assets/ecl-D05T4iGw.js
118
125
  dw/server/ui/assets/editor-jjEx9u7D.css
119
- dw/server/ui/assets/editor.api-C2mqCHa9.js
126
+ dw/server/ui/assets/editor.api-Bfiq9hmW.js
120
127
  dw/server/ui/assets/editor.worker-q-txB4vs.js
121
128
  dw/server/ui/assets/elixir-6RTg0lbw.js
122
129
  dw/server/ui/assets/flow9-C5_-GSwl.js
123
- dw/server/ui/assets/freemarker2-Cb6RGT42.js
130
+ dw/server/ui/assets/freemarker2-BwDnlSuz.js
124
131
  dw/server/ui/assets/fsharp-C8Ef5oNN.js
125
132
  dw/server/ui/assets/go-C-y9NEjX.js
126
133
  dw/server/ui/assets/graphql-fmXr3nnJ.js
127
- dw/server/ui/assets/handlebars-LzK4_SEF.js
134
+ dw/server/ui/assets/handlebars-Beb1we4G.js
128
135
  dw/server/ui/assets/hcl-CpzslTdj.js
129
- dw/server/ui/assets/html-Biz_qd50.js
136
+ dw/server/ui/assets/html-Yw-qdTCH.js
130
137
  dw/server/ui/assets/html.worker-C93Ht9o9.js
131
- dw/server/ui/assets/htmlMode-CP4Kjl0x.js
132
- dw/server/ui/assets/index-Bt8BlCkf.js
133
- dw/server/ui/assets/index-D9tEUhx5.css
138
+ dw/server/ui/assets/htmlMode-Dbp7eBPO.js
139
+ dw/server/ui/assets/index-CsXMC8a8.css
140
+ dw/server/ui/assets/index-DqbiZNFq.js
134
141
  dw/server/ui/assets/ini-sBoK_t0W.js
135
142
  dw/server/ui/assets/java-BEtHBSE6.js
136
- dw/server/ui/assets/javascript-DX4-t0BE.js
143
+ dw/server/ui/assets/javascript-BNzP7yQZ.js
137
144
  dw/server/ui/assets/json.worker-B2V3pomh.js
138
- dw/server/ui/assets/jsonMode-hZa_qOEa.js
145
+ dw/server/ui/assets/jsonMode-DxIEESAg.js
139
146
  dw/server/ui/assets/julia-Bri6UV-V.js
140
147
  dw/server/ui/assets/kotlin-BOotOW0E.js
141
148
  dw/server/ui/assets/less-B9JPFI3C.js
142
149
  dw/server/ui/assets/lexon-CfSJPG6W.js
143
- dw/server/ui/assets/liquid-BRkTuJ_A.js
144
- dw/server/ui/assets/lspLanguageFeatures-Dvt5tod9.js
150
+ dw/server/ui/assets/liquid-CeQTai1N.js
151
+ dw/server/ui/assets/lspLanguageFeatures-DKVB_UCB.js
145
152
  dw/server/ui/assets/lua-CsQS60Ue.js
146
153
  dw/server/ui/assets/m3-D-oSqn_W.js
147
154
  dw/server/ui/assets/markdown-Cimd5fb3.js
148
- dw/server/ui/assets/mdx-Bdet7qev.js
155
+ dw/server/ui/assets/mdx-Bczl_PHr.js
149
156
  dw/server/ui/assets/mips-CIPQ_RoX.js
150
157
  dw/server/ui/assets/monaco--ixms01u.css
151
- dw/server/ui/assets/monaco-QRyCMGAv.js
158
+ dw/server/ui/assets/monaco-Bu2OB6wI.js
152
159
  dw/server/ui/assets/msdax-DauUninz.js
153
160
  dw/server/ui/assets/mysql-SOo6toE5.js
154
161
  dw/server/ui/assets/objective-c-FvmIjYaQ.js
@@ -163,10 +170,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
163
170
  dw/server/ui/assets/powershell-DmHpPYUd.js
164
171
  dw/server/ui/assets/protobuf-C531GsRP.js
165
172
  dw/server/ui/assets/pug-Z5eAx3Zn.js
166
- dw/server/ui/assets/python-DO0uJyUr.js
173
+ dw/server/ui/assets/python-CeTsj82v.js
167
174
  dw/server/ui/assets/qsharp-DkqhCAOL.js
168
175
  dw/server/ui/assets/r-BwWrilGY.js
169
- dw/server/ui/assets/razor-CkfVe6oz.js
176
+ dw/server/ui/assets/razor-CN7JaWqc.js
170
177
  dw/server/ui/assets/redis-ClamHrr6.js
171
178
  dw/server/ui/assets/redshift-DT7zqm-g.js
172
179
  dw/server/ui/assets/restructuredtext-BYgofb2h.js
@@ -186,15 +193,16 @@ dw/server/ui/assets/swift-Bxkupp3x.js
186
193
  dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
187
194
  dw/server/ui/assets/tcl-DISqw1ZD.js
188
195
  dw/server/ui/assets/ts.worker-D7T1-Ig5.js
189
- dw/server/ui/assets/tsMode-z26QXNyE.js
196
+ dw/server/ui/assets/tsMode-CoSEMx-L.js
190
197
  dw/server/ui/assets/twig-De2hgUGE.js
191
- dw/server/ui/assets/typescript-DIdNc_uc.js
198
+ dw/server/ui/assets/typescript-CcsolRTO.js
192
199
  dw/server/ui/assets/typespec-B8J7ngcE.js
193
200
  dw/server/ui/assets/vb-DV3o63ZY.js
194
201
  dw/server/ui/assets/wgsl-DpFanUEy.js
195
- dw/server/ui/assets/workers-Ce8CDVu5.js
196
- dw/server/ui/assets/xml-Djj2U0Rl.js
197
- dw/server/ui/assets/yaml-CePLO71e.js
202
+ dw/server/ui/assets/workers-DLaycdy4.js
203
+ dw/server/ui/assets/xml-QEwuyn1w.js
204
+ dw/server/ui/assets/yaml-BB4U5D-R.js
205
+ dw/tasks/audio_transcription.py
198
206
  dw/tasks/audio_utils.py
199
207
  dw/tasks/background_remover.py
200
208
  dw/tasks/borders.py
@@ -208,12 +216,14 @@ dw/tasks/gather.py
208
216
  dw/tasks/image_to_text.py
209
217
  dw/tasks/image_utils.py
210
218
  dw/tasks/interpolate_frames.py
219
+ dw/tasks/judge.py
211
220
  dw/tasks/model_cache.py
212
221
  dw/tasks/pair_audio.py
213
222
  dw/tasks/qr_code.py
214
223
  dw/tasks/restore_faces.py
215
224
  dw/tasks/rife_model.py
216
225
  dw/tasks/segment.py
226
+ dw/tasks/select.py
217
227
  dw/tasks/speech_generation.py
218
228
  dw/tasks/stabilize.py
219
229
  dw/tasks/task.py
@@ -243,6 +253,7 @@ tests/test_argument_updates.py
243
253
  tests/test_arguments.py
244
254
  tests/test_assets.py
245
255
  tests/test_audio_utils.py
256
+ tests/test_best_of_n_template.py
246
257
  tests/test_borders.py
247
258
  tests/test_cache_blocks.py
248
259
  tests/test_catalog_shape.py
@@ -273,16 +284,19 @@ tests/test_h3_context_ir.py
273
284
  tests/test_h3_schedule.py
274
285
  tests/test_hf_placement.py
275
286
  tests/test_host_memory.py
287
+ tests/test_host_memory_projection.py
276
288
  tests/test_hub_cache.py
277
289
  tests/test_image_to_text.py
278
290
  tests/test_image_utils.py
279
291
  tests/test_integration.py
280
292
  tests/test_interpolate_frames.py
281
293
  tests/test_introspection.py
294
+ tests/test_job_history_wal.py
282
295
  tests/test_job_progress.py
283
296
  tests/test_job_warnings.py
284
297
  tests/test_jobs_listing.py
285
298
  tests/test_jobs_reused.py
299
+ tests/test_judge.py
286
300
  tests/test_kernel_availability.py
287
301
  tests/test_library_sources.py
288
302
  tests/test_list_images.py
@@ -304,6 +318,8 @@ tests/test_mcp_models.py
304
318
  tests/test_mcp_prompts.py
305
319
  tests/test_mcp_server.py
306
320
  tests/test_mcp_workspaces.py
321
+ tests/test_media_audio.py
322
+ tests/test_media_frames.py
307
323
  tests/test_media_info.py
308
324
  tests/test_mix_audio.py
309
325
  tests/test_model_cache.py
@@ -320,6 +336,7 @@ tests/test_pipeline_components.py
320
336
  tests/test_plan.py
321
337
  tests/test_plugin_skills.py
322
338
  tests/test_previous_results.py
339
+ tests/test_prompt_library.py
323
340
  tests/test_prompt_parser.py
324
341
  tests/test_prompt_references.py
325
342
  tests/test_prompt_weighting.py
@@ -338,10 +355,13 @@ tests/test_resize_bucket.py
338
355
  tests/test_result.py
339
356
  tests/test_result_output_naming.py
340
357
  tests/test_runs.py
358
+ tests/test_scalar_result_validation.py
341
359
  tests/test_scheduler_config.py
342
360
  tests/test_schema.py
343
361
  tests/test_security.py
344
362
  tests/test_segment.py
363
+ tests/test_select.py
364
+ tests/test_select_validation.py
345
365
  tests/test_serve_main.py
346
366
  tests/test_server.py
347
367
  tests/test_server_downloads.py
@@ -366,6 +386,7 @@ tests/test_template_subfolders.py
366
386
  tests/test_tensor_image.py
367
387
  tests/test_text_generation.py
368
388
  tests/test_text_sections.py
389
+ tests/test_transcribe_audio.py
369
390
  tests/test_type_helpers.py
370
391
  tests/test_updater.py
371
392
  tests/test_validate_arguments.py
@@ -28,6 +28,7 @@ imageio-ffmpeg>=0.6.0
28
28
  av>=18.1.0
29
29
  soundfile>=0.14.0
30
30
  matplotlib>=3.11.1
31
+ speechbrain>=1.0.3
31
32
  qrcode>=8.2
32
33
  requests>=2.34.2
33
34
  aiohttp>=3.14.3
@@ -116,7 +116,7 @@ def realize_args(arg, base_dir=None):
116
116
  # library, and does it first: what it stands for is a path, so
117
117
  # everything below - the media conventions, an object's
118
118
  # 'from_file' - then handles it as the path it always was
119
- if is_path_reference(v) or isinstance(v, list):
119
+ if is_path_reference(v) or isinstance(v, (list, dict)):
120
120
  v = arg[k] = resolve_path_references(v, base_dir)
121
121
  # A constant resolves under any argument name, and before the
122
122
  # conventions below - what it holds is the value, not a file to load
@@ -212,7 +212,12 @@ def resolve_path_references(value, base_dir=None):
212
212
  A list is walked in place, because an 'image' argument may be a list of
213
213
  references and the key conventions hand the whole list to the loader at
214
214
  once - by then it is too late for a reference to be recognized.
215
- Dictionaries are left alone: realize_args recurses into those itself,
215
+ A {"location": ...} dict is walked the same way, for the same reason: the
216
+ media conventions hand the whole dict to the loader, which reads the
217
+ location out of it and joins it onto the workflow directory - so
218
+ {"location": "asset:x.png"} passed validation (which sees every string)
219
+ and then failed the run on a path that was never resolved. Other
220
+ dictionaries are left alone: realize_args recurses into those itself,
216
221
  and each of their values reaches this on the way through.
217
222
  """
218
223
  if is_asset_reference(value):
@@ -222,6 +227,8 @@ def resolve_path_references(value, base_dir=None):
222
227
  if isinstance(value, list):
223
228
  for index, item in enumerate(value):
224
229
  value[index] = resolve_path_references(item, base_dir)
230
+ elif isinstance(value, dict) and is_path_reference(value.get("location")):
231
+ value["location"] = resolve_path_references(value["location"], base_dir)
225
232
  return value
226
233
 
227
234
 
@@ -187,7 +187,7 @@ Nothing in this sequence costs GPU time.
187
187
 
188
188
  ## Tool reference
189
189
 
190
- 55 tools in six groups. Names and arguments below are transcribed from
190
+ 58 tools in six groups. Names and arguments below are transcribed from
191
191
  `dw_mcp/server.py` — nothing here is renamed or reshaped for the docs.
192
192
 
193
193
  ### Catalog (read-only)
@@ -223,8 +223,8 @@ when no single workflow covers it.
223
223
  | `get_task(command)` | `command` | Get a task command's argument schema |
224
224
  | `list_models()` | — | List what the Hugging Face model cache holds, largest first |
225
225
  | `get_memory()` | — | Get the worker's VRAM and RAM statistics. `gpu_*` is the card; `host_memory_rss_mb` / `host_memory_peak_rss_mb` are the worker process's resident and high-water host memory, beside the machine's `host_memory_total_mb` / `host_memory_available_mb` - read both, since an offloading workflow keeps its weights in host RAM and the card says little about what it holds (a host field is absent, not null, where the platform cannot measure it). `host_pinned_reserved_mb` / `host_pinned_allocated_mb`, when present, are torch's pinned-host cache - the staging buffers group offloading moves weights through, part of `host_memory_rss_mb` and invisible in every `gpu_*` figure, which is what a worker holding GB after releasing every model is usually holding (#98). `live: true` means `info` was measured now and is the worker's own memory; only live readings are comparable with each other. `live: false` with `info: null` (and `stale: false`) means nothing has been measured because nothing is resident; `live: false` with a populated `info` is a cached earlier reading, with `reason` (`job_running`, `worker_stopped`, `worker_busy`, `worker_unreachable`) and `age_seconds` - one cached while a job loads a model understates what is resident, so ask again when the server is idle rather than comparing it with a live figure |
226
- | `get_health()` | — | Check that the server is alive, and which machine answered: `version`, `device`, whether the worker process is up, the job running now and the queue depth |
227
- | `get_server_info()` | — | What this installation can do and where it keeps things: `device` (the accelerator a run will use), `version`, the `workspace` this session is working in and the workflow/asset/output/prompt `directories` of *that* workspace, the bind address and port, whether a token is required, and whether MCP is mounted. Check the device before authoring - a CUDA-only choice (bitsandbytes, `torch.compile`, flash attention) is not available on an `mps` or `cpu` server |
226
+ | `get_health()` | — | Check that the server is alive, and which machine answered: `version`, `device`, whether a model process is currently resident (`worker_alive`), the job running now and the queue depth. `worker_alive: false` is the normal idle state on a server that has not run a job since startup or the last memory clear - not a fault - the on-demand worker starts with the next job (#206) |
227
+ | `get_server_info()` | — | What this installation can do and where it keeps things: `device` (the accelerator a run will use), `version`, the `workspace` this session is working in and the workflow/asset/output/prompt `directories` of *that* workspace, the bind address and port, whether a token is required, and whether MCP is mounted. Check the device before authoring - a CUDA-only choice (bitsandbytes, `torch.compile`, flash attention) is not available on an `mps` or `cpu` server. `runtime` (#222) reports the Python version, torch version and the CUDA version torch was built against, the NVIDIA driver version (when `nvidia-smi` is reachable), and the installed versions of diffusers, transformers, accelerate, bitsandbytes, peft, safetensors and sentencepiece (`null` for one not installed) - for diagnosing an environment mismatch between boxes without shelling in |
228
228
  | `list_jobs(limit=20, status=None, workspace=None)` | optional `limit` (newest N), `status` (one state or a comma-separated set of `queued`, `running`, `succeeded`, `failed`, `cancelled`), `workspace` | List queued, running and recent jobs, **newest first**. Bounded by default: the unbounded listing was over a client's tool-result limit on a server with a few months of history, which made it a tool that could not be called at all. `total` says how many matched and `truncated`/`next` say so when the answer was cut - raise `limit` or narrow with `status`. Without `workspace`, a named workspace lists its own jobs and the default one lists every job the server holds |
229
229
  | `list_gallery(limit=50, subfolder=None, only_orphans=False, workspace=None)` | `limit`, `subfolder`, `only_orphans`, `workspace` | List generated output files, newest first. A name is `<workflow>/<run id>/<file>`, where `<file>` may sit in the subfolder the step chose (`final/episode.mp4`); each entry carries `folder` (the workflow) and `subfolder` (by convention `final` or `intermediate`, `''` when the step chose none, any path the workflow wrote otherwise), and `subfolder="final"` lists only deliverables. Each entry also carries a ready-made `url`, already scoped to the workspace that made it - a hand-built `/outputs/<name>` URL 404s for anything but the default workspace. `only_orphans=True` inverts the call: instead of files, it returns run directories with no media anywhere under them (`runs`, each `{name, mtime}`) - a run whose output was deleted before `delete_output` could remove it by name, or one that failed before writing anything; `subfolder` does not apply in this mode, and `name` is exactly what `delete_output` accepts (#170). `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
230
230
  | `get_gallery_metadata(name, envelope=False, workspace=None)` | `name`, `workspace` | Get the metadata embedded in a generated file — or, when `name` is an `asset:` reference, what an *input* asset holds (`source` says which; `job` is null for an asset). Reading an input's duration, frame count, fps and sample rate before a run is how a caller learns the `total_frames`, `fps` and `sample_rate` a workflow expects it to supply: the exact workflow and arguments that produced it, and, for audio/video, a `media` block (duration, rate, channels, fps, size, peak/mean dBFS). `envelope=true` adds `media.envelope` — `rms_dbfs` and `peak_dbfs` one entry per second — which is what locates something in a track rather than measuring the whole of it. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
@@ -233,10 +233,12 @@ when no single workflow covers it.
233
233
 
234
234
  | Tool | Arguments | Purpose |
235
235
  | --- | --- | --- |
236
- | `get_output_image(name, max_dimension=768, workspace=None)` | `name`, `max_dimension`, `workspace` | Look at a generated image, downscaled to `max_dimension` on its longest side. Returns the image plus a text part reporting `original_size`, `returned_size` and `bytes`, so a downscale is never silent. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
236
+ | `get_output_image(name, max_dimension=768, workspace=None, crop=None)` | `name`, `max_dimension`, `workspace`, `crop` | Look at a generated image, downscaled to `max_dimension` on its longest side. Returns the image plus a text part reporting `original_size`, `returned_size` and `bytes`, so a downscale is never silent. `crop` is `[x, y, width, height]` in the original's pixels, cut before the downscale and reported back clamped - the way to see a region of a 2K still at 100%, where the whole would be shrunk past what a small element or a decode-tiling seam can be judged at. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
237
+ | `get_output_audio(name, start=None, duration=None, workspace=None)` | `name`, `start`, `duration`, `workspace` | Listen to a generated soundtrack as base64 - an audio output, or the track muxed into a video (#193) - in its own encoding when served whole, WAV when extracted or excerpted. No downscale exists for audio, so a whole clip over the 4MB budget is refused rather than cut (#204); ask for the part instead with `start` and `duration` in seconds, and the text part names what was cut (`excerpt: 2.0s from 10.0s of 240.0s`) so a slice is never mistaken for the whole. `get_gallery_metadata`'s envelope says where in a track to look. `workspace` names the workspace for this one call without switching the session to it |
238
+ | `get_output_frames(name, at=None, seams=None, count=None, boundaries=None, names=None, max_dimension=512, hear=None, workspace=None)` | `name`, `at`, `seams`, `count`, `boundaries`, `names`, `max_dimension`, `hear`, `workspace` | See a generated video as frames, since there is no video content type over MCP (#193). One selector per call: `count` for an evenly spaced contact sheet, `at` for moments (seconds or `"frame:N"`), `seams` (true, or seam numbers from 1) for the last frame before and first frame after each join side by side (each pair carries `difference`, the mean pixel change across the join, 0-255 - rank seams by it and look at the worst) - `boundaries` is each later shot's first frame - the running sum of the shots' `frame_count` from `get_gallery_metadata` on their own `intermediate/` files - and `names` names them. Tiles are fitted to `max_dimension` and, when the set would exceed the 4MB budget, shrunk together rather than dropped; the text part lists each tile and says so. `hear=N` also returns N seconds of soundtrack centred on each `at` moment, after its image - the way to check a hit point or lip-sync without reconciling two clocks; a mute clip keeps its frames and says `no soundtrack` |
237
239
  | `get_output_text(name, max_characters=20000, workspace=None)` | `name`, `max_characters`, `workspace` | Read a text output — a prompt enhancement, or any step whose result is `text/plain` or JSON. Reports the file's real length and whether it was truncated. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
238
240
  | `download_output(name, destination=None, overwrite=False, workspace=None)` | `name`, `destination`, `overwrite`, `workspace` | Save one output file to local disk, of any content type. `destination` may be a full path, a directory, or omitted to save under the output's own name in the current working directory; `~` expands and missing parent directories are created. `overwrite=True` is required to replace a file already at the resolved path. Over a `dw.serve --mcp` endpoint the file lands on the server, so the destination is confined to that workspace and a relative one is joined onto it. Returns nothing to the conversation but where the file landed — unlike the other media tools, the point is a file on disk, not a payload in context. Writes on the machine running the MCP server - over `dw.serve --mcp` that is the GPU box. A write that fails there (a path that exists only on the client, for instance) comes back as an error naming the server-side write and the client-side alternatives, not as an anonymous tool failure. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
239
- | `delete_output(name, workspace=None)` | `name`, `workspace` | Permanently remove one generated file from the output directory. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
241
+ | `delete_output(name=None, workspace=None, job_id=None)` | exactly one of `name` / `job_id`, `workspace` | Permanently remove one generated file from the output directory, or - with `name` a `<workflow>/<run id>` run directory, or with `job_id` - a whole run. By `job_id` the run directory is read from the job record (`run_dir`) and the reply adds `job_id` and the resolved `run_dir` to the usual `name` / `deleted` / `run_swept`; a job that never wrote a run directory, or an unknown one, is an error. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it; a `job_id` delete with no `workspace` goes to the workspace the job ran in |
240
242
 
241
243
  ### Authoring, assets and workspaces
242
244
 
@@ -247,16 +249,33 @@ of its life. That is how two agents work against one GPU without saving over
247
249
  each other; see [Workspaces](WORKSPACES.md#several-workspaces-on-one-server).
248
250
  The session starts in `default` and stays there unless it is told otherwise.
249
251
 
252
+ The pin above is per-*process* state on `client.py`'s `DwClient`, which is
253
+ one session for the local stdio `dw-mcp`, but `dw.serve --mcp` (see
254
+ [REMOTE.md](REMOTE.md#claude-code-no-local-install)) builds a single client
255
+ for every agent it serves - so on that mounted surface the pin is shared by
256
+ every concurrently connected caller, not scoped to any one of them (#298).
257
+ A second client's `use_workspace`/`create_workspace(use=true)` can switch
258
+ what your session reads and writes without your session calling either. This
259
+ server is single-user by design, so nothing tracks distinct MCP sessions to
260
+ fix that; `use_workspace`/`create_workspace` add a `warning` field to their
261
+ result when the pin they are about to overwrite was already pointed
262
+ somewhere other than `default` (a sign another client may depend on it), but
263
+ they cannot warn the *other* session whose pin just moved out from under it.
264
+ A caller that needs real isolation on a mounted server - the tester and
265
+ regression harnesses among them - must pass `workspace=` on every call that
266
+ accepts it (`validate_workflow`, `run_workflow`, and most of the read/media
267
+ tools) rather than relying on the session pin.
268
+
250
269
  | Tool | Arguments | Purpose |
251
270
  | --- | --- | --- |
252
271
  | `validate_workflow(workflow=None, name=None, workspace=None, arguments=None)` | exactly one of `workflow` (inline definition) or `name` (a stored workflow, as `list_workflows` reports it), optional `workspace`, optional `arguments` | Check a workflow against the schema and against real pipeline signatures. Free and instant. Validating by name uses the workflow file's own directory as the base directory, so it sees what a run would. Returns every schema violation in `errors`, each with the JSON path it sits at, so a draft is fixed in one pass, and a `previous_result:` that names no earlier step is one of them. `warnings` covers what still runs but is probably wrong - a signature mismatch, and, for a list-driven variable, an entry key no step reads, at the entry's path. `workspace` names the workspace for this one call without switching the session to it - use it to pin a job whose `output:` or `asset:` references live in a workspace other than the session's. Pass the same `arguments` you will pass to `run_workflow` and they are checked too - an undeclared or renamed variable name, a value that will not coerce to the declared type, and an `asset:`, `prompt:` or `output:` reference that names nothing this workspace can reach, each reported at `arguments.<name>`. `checked_arguments` lists what was covered, so a `valid: true` about the stored defaults cannot be mistaken for one about your values. A reference set the model would refuse - too many images, videos or audio clips, or, for MiniMax-H3, audio as the only reference - is an error here too, rather than a failure minutes into a run you acknowledged. `run_workflow` makes the same check and refuses a bad argument rather than queuing a job that fails on its first step. A valid answer carries `plan` - the fingerprint, step count, list lengths, `downloads_required`, `estimate` (with `basis`) and `elided_steps` for the arguments given; quote from it. `steps` counts what will run: a step nothing reads and which saves no file does not run, and is named in `elided_steps` instead |
253
272
  | `list_workspaces()` | — | The server's workspaces and which one this session is using. Each has its own workflows, assets and outputs; the prompt library is shared by all of them |
254
- | `use_workspace(name)` | `name` | Work in that workspace for the rest of the session - every later call reads and writes there. This is how to keep your work out of another agent's namespace rather than sharing the default one. Checked against the server, so a typo fails here rather than scoping every later call to nothing |
255
- | `create_workspace(name, use=False)` | `name`, `use` | Create a workspace. Pass use=true to switch this session to it as well; otherwise the session stays where it was and the result says so |
273
+ | `use_workspace(name)` | `name` | Work in that workspace for the rest of the session - every later call reads and writes there. This is how to keep your work out of another agent's namespace rather than sharing the default one. Checked against the server, so a typo fails here rather than scoping every later call to nothing. On a `dw.serve --mcp` endpoint the pin is shared by every connected client (#298, see the note above the table) - a `warning` field appears when this call overwrote a pin already pointed away from `default` |
274
+ | `create_workspace(name, use=False)` | `name`, `use` | Create a workspace. Pass use=true to switch this session to it as well; otherwise the session stays where it was and the result says so. `use=true` carries the same mounted-server caveat and `warning` field as `use_workspace` |
256
275
  | `delete_workspace(name, acknowledged_cost=False)` | `name`, `acknowledged_cost` | Permanently delete a workspace and everything in it. Refuses without the acknowledgement, reporting what it would remove |
257
276
  | `list_assets()` | — | The input media on the server, each with the `asset:` reference a workflow argument carries. Look here before asking for a file - what a workflow needs may already be there. `libraries` names the roots searched and which are writable; `shadowed` lists names a nearer library hides |
258
277
  | `keep_output(name, asset_name=None, overwrite=False, shared=False, workspace=None)` | `name`, optional `asset_name`, `overwrite`, `shared`, `workspace` | Keep a generated file as an input asset under a stable `asset:` name, so a later workflow can rely on it. The copy happens on the server: nothing is downloaded or re-uploaded. `asset_name` may name a folder and takes the kept file's extension when it has none; `shared=true` keeps it in the library every workspace shares, which is where a recurring cast belongs. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
259
- | `upload_asset(file_path, asset_name=None, shared=False)` | `file_path` | Push a local image, video or audio file into the server's asset library and get back its `asset:` reference. The file is read from the machine the MCP server runs on, so this is how an input reaches a dw.serve running somewhere else. `asset_name` stores it under a readable name (`cast/priya-voice.wav`) instead of a random one; `shared=true` puts it in the library every workspace shares |
278
+ | `upload_asset(file_path=None, content=None, asset_name=None, shared=False)` | exactly one of `file_path` or `content` (base64), optional `asset_name`, `shared` | Push an image, video or audio file into the server's asset library and get back its `asset:` reference. `file_path` is read from the machine the MCP server runs on, so this is how an input reaches a dw.serve running somewhere else - but only when the caller shares a filesystem with that machine. `content` is the alternative for an agent that does not: the bytes travel inline, base64-encoded, in the tool call itself, capped at 4MB (well under `file_path`'s 200MB) because inline bytes compete with the calling agent's own context budget rather than being a bulk-transfer path (#203). `asset_name` is required with `content` (there is no file name to infer one from) and, either way, stores it under a readable name (`cast/priya-voice.wav`) instead of a random one; `shared=true` puts it in the library every workspace shares |
260
279
  | `delete_asset(name)` | `name` | Permanently remove one file from the asset library, by the name `list_assets` reports. Deletes from whichever library holds it - this workspace's own before the shared one; one from a read-only examples library is refused. Any workflow still carrying that `asset:` reference stops loading |
261
280
  | `save_workflow(name, workflow)` | `name`, `workflow` | Save a workflow into the server's writable workflow directory, overwriting any existing workflow of that name there. A name that currently resolves to a read-only source (an examples directory) is not overwritten - the copy lands in the writable directory and shadows it |
262
281
  | `delete_workflow(name)` | `name` | Permanently delete a stored workflow |
@@ -270,7 +289,7 @@ references written in the same session.
270
289
 
271
290
  | Tool | Arguments | Purpose |
272
291
  | --- | --- | --- |
273
- | `list_prompts()` | — | List the stored prompts with their text and descriptions |
292
+ | `list_prompts(tag=None, intended_model=None, include_text=False)` | optional `tag`, `intended_model`, `include_text` | List the stored prompts - description, intended model, tags and `text_chars`, bodies left out; `get_prompt` for one body |
274
293
  | `get_prompt(name)` | `name` | Get one stored prompt's full definition |
275
294
  | `get_prompt_schema()` | — | Get the JSON schema every stored prompt must satisfy. Its own route rather than a name under `/api/prompts`, so a prompt called `schema` cannot shadow it |
276
295
  | `save_prompt(name, prompt)` | `name`, `prompt` | Save a prompt, overwriting any prompt of that name. The server validates first, and refuses a `text` that itself begins with a reference prefix (`variable:`, `previous_result:`, `constant:`, `asset:`, `output:`, `prompt:`) |
@@ -282,13 +301,14 @@ references written in the same session.
282
301
 
283
302
  | Tool | Arguments | Purpose |
284
303
  | --- | --- | --- |
285
- | `run_workflow(workflow_path=None, inline_workflow=None, arguments=None, acknowledged_cost=False, workspace=None)` | exactly one of `workflow_path` (a catalog name from `list_workflows`, with or without `.json`, or a path to a workflow file on the server) or `inline_workflow`, optional `arguments`, `acknowledged_cost`, `workspace` | Queue a workflow for generation. Returns as soon as the job is queued. `workspace` names the workspace for this one call without switching the session to it - use it to pin a job whose `output:` or `asset:` references live in a workspace other than the session's - `acknowledged_cost` is `true` or the bound `{fingerprint, minutes, downloads}` from the validate plan; a 409 means the plan changed and the message carries the new estimate |
304
+ | `run_workflow(workflow_path=None, inline_workflow=None, arguments=None, acknowledged_cost=False, workspace=None, wait_seconds=0)` | exactly one of `workflow_path` (a catalog name from `list_workflows`, with or without `.json`, or a path to a workflow file on the server) or `inline_workflow`, optional `arguments`, `acknowledged_cost`, `workspace`, `wait_seconds` | Queue a workflow for generation. Returns as soon as the job is queued - unless `wait_seconds` is above 0, in which case the call then waits on the queued job exactly as `wait_for_job(job_id, timeout_seconds=wait_seconds)` would (same 55 s cap per call, clamped not honoured) and the result carries the queued-job fields plus that wait's (`status`, `still_running`, `waited_seconds`, `timeout_requested_seconds`, `timeout_applied_seconds`, `timeout_capped`, the slim `job`); when the cap covers the job's runtime one call is the run and the wait, and a `still_running: true` result is followed with `wait_for_job` as before. `workspace` names the workspace for this one call without switching the session to it - use it to pin a job whose `output:` or `asset:` references live in a workspace other than the session's - `acknowledged_cost` is `true` or the bound `{fingerprint, minutes, downloads}` from the validate plan; a 409 means the plan changed and the message carries the new estimate, and nothing is waited on |
286
305
  | `get_job(job_id)` | `job_id` | Get a job's status, warnings, output manifest, error and traceback; each manifest entry's `subfolder` is the in-run subfolder the step declared - by convention `final` for the deliverable, `intermediate` for scratch, `''` for none. A running job also carries `progress` (below) |
287
- | `get_job_workflow(job_id)` | `job_id` | The workflow the job actually ran. `realized: true` means every mutable input is pinned (arguments, seed, prompts, `output:latest`); `false` means the job predates run tracking and this is the definition as submitted. Pass it to `save_workflow` to keep it under a name |
306
+ | `get_job_workflow(job_id)` | `job_id` | The REST equivalent is `GET /api/jobs/{id}/workflow` (see [SERVER.md](SERVER.md#jobs-api)). The workflow the job actually ran. `realized: true` means every mutable input is pinned (arguments, seed, prompts, `output:latest`); `false` means the job predates run tracking and this is the definition as submitted. Pass it to `save_workflow` to keep it under a name |
288
307
  | `export_job(job_id, overwrite=False)` | `job_id`, `overwrite` | Gather one finished job into `<workspace>/exports/<job id>/` on the server: the realized workflow, the run's manifest, the job row, a README, and copies of the assets, earlier-run inputs and outputs. Returns the directory, a zip URL, the file list with sizes and the total. The three JSON files are in the zip, not repeated here - get_job_workflow and get_job serve them individually. **The directory is on the machine running the server**, like `download_output`'s destination - fetch the zip URL and unpack it into `exports/` under the session's working directory (a deliverable, not a temp file); the archive already unpacks into one folder named after the job id |
289
308
  | `get_job_events(job_id, after=-1, limit=200)` | `job_id`, `after`, `limit` | Get a page of a job's progress events |
290
309
  | `wait_for_job(job_id, timeout_seconds=20)` | `job_id`, `timeout_seconds` | Block until a job reaches a terminal status, or `timeout_seconds` elapses. **One call blocks for at most 55 seconds** — a larger `timeout_seconds` is clamped, not honoured, because no MCP client holds a tool call open for a generation's real runtime, so budget one call per ~55s of the job. Every reply carries `waited_seconds`, `timeout_requested_seconds`, `timeout_applied_seconds` and `timeout_capped`, so a capped return is distinguishable from an elapsed one. Use instead of hand-polling `get_job`/`get_job_events` in a loop; if it returns `still_running: true`, call it again. Returns a slim job - status, warnings, error, and the manifest once finished - without the arguments; `get_job` has those. A running job also carries `progress` (below) |
291
310
  | `cancel_job(job_id)` | `job_id` | Ask a queued or running job to stop |
311
+ | `clear_memory()` | — | Drop every loaded pipeline and the step cache, freeing VRAM/RAM immediately instead of waiting for the next job to evict one model for another. Also drops the step cache, so a seeded workflow that would otherwise reuse cached results regenerates on its next run. Refused with a 409 while a job is running or queued - the queue is FIFO, so wait for it to finish and retry rather than expecting this call to block until it does (#221) |
292
312
  | `rerun_job(job_id, acknowledged_cost=False, new_seed=False)` | `job_id`, `acknowledged_cost`, `new_seed` | Queue a fresh job from a previous job's stored specification. Costs GPU time, so it passes the same gate as `run_workflow`. `new_seed=true` draws a fresh seed into the workflow's seed variable — without it a seeded workflow's rerun repeats its arguments exactly and the step cache serves the whole run from the earlier one's files (`reused: true`), generating nothing. `get_job_workflow`'s `seed_variable` says whether there is one - `acknowledged_cost` is `true` or the bound `{fingerprint, minutes, downloads}` from the validate plan; a 409 means the plan changed and the message carries the new estimate |
293
313
  | `move_job(job_id, direction)` | `job_id`, `direction` (`up`\|`down`\|`front`\|`back`) | Reorder a queued job |
294
314
 
@@ -372,6 +392,8 @@ The intended loop:
372
392
  4. `get_job(job_id)` for the finished manifest (or the error and traceback,
373
393
  if it failed)
374
394
  5. `get_output_image(name)` to look at a result image
395
+ 6. `get_output_frames(name, count=12)` to look at a result video, and
396
+ `get_output_audio(name, start, duration)` to hear it
375
397
 
376
398
  While a job runs, `get_job` and `wait_for_job` carry a `progress` block -
377
399
  the step being run, the phase (`loading`, `generating`, `decoding`,
@@ -451,18 +473,26 @@ default) for any server an MCP client can reach.
451
473
  events of a finished job (`MAX_PERSISTED_EVENTS` in the job history store).
452
474
  A job that ran before this feature existed returns an empty event list
453
475
  with a `note` explaining why.
454
- - **Images only.** `get_output_image` decodes and returns images; it refuses
455
- video and audio outputs. Use `get_gallery_metadata` to inspect other media
456
- kinds.
457
- - **Uploads read the MCP server's disk.** `upload_asset(file_path)` pushes a
458
- local file into the asset library, but "local" means the machine `dw-mcp`
459
- runs on. Over `dw.serve --mcp` that is the GPU box, so a file sitting on
460
- the client's laptop is not reachable that way - put it on the server, or
461
- give the workflow a URL (the arguments that take a path take a URL too).
462
- On a `--mcp` endpoint `file_path` is also *confined* to the directories the
463
- server works in (its workspace, workflows, assets, outputs and prompts), and
464
- the refusal comes before the file is looked for, so the tool cannot be used
465
- to probe which paths exist on the box (#138).
476
+ - **Images, sound and frames.** `get_output_image` returns an image,
477
+ `get_output_audio` a soundtrack (an audio file's, or the one muxed into a
478
+ video) whole or as a named excerpt, and `get_output_frames` frames of a
479
+ video as images - there is no video content type over MCP, so a video is
480
+ seen as frames and heard as its track. `get_output_audio` refuses a whole
481
+ clip whose base64 size would exceed the same 4MB budget; ask for an
482
+ excerpt instead.
483
+ - **Uploads read the MCP server's disk, unless sent inline.**
484
+ `upload_asset(file_path)` pushes a local file into the asset library, but
485
+ "local" means the machine `dw-mcp` runs on. Over `dw.serve --mcp` that is
486
+ the GPU box, so a file sitting on the client's laptop is not reachable that
487
+ way - put it on the server, give the workflow a URL (the arguments that
488
+ take a path take a URL too), or use `upload_asset(content=..., asset_name=...)`
489
+ to send the bytes inline instead, base64-encoded in the call itself, capped
490
+ at 4MB (#203). On a `--mcp` endpoint `file_path` is also *confined* to the
491
+ directories the server works in (its workspace, workflows, assets, outputs
492
+ and prompts), and the refusal comes before the file is looked for, so the
493
+ tool cannot be used to probe which paths exist on the box (#138); `content`
494
+ reads no path and is not subject to this confinement, since no file on
495
+ either machine is ever named.
466
496
  `download_output` has the same asymmetry in the other direction: on a
467
497
  `--mcp` endpoint it writes on the GPU box, not the client's machine, and is
468
498
  confined to the workspace there.
@@ -1,5 +1,20 @@
1
1
  # Releasing
2
2
 
3
+ ## Unreleased
4
+
5
+ This project has no standing release-notes file - GitHub auto-generates
6
+ notes from commits at tag time (see below). This section is a scratch pad
7
+ for items a branch's author wants the next release note to name; clear it
8
+ when a release ships.
9
+
10
+ - `get_output_audio` now reads `GET /api/gallery/{name}/audio`, extracts a
11
+ video's soundtrack, and takes `start`/`duration` (moved off the
12
+ `/outputs` mount, which used to refuse `video/mp4`).
13
+ - New tool `get_output_frames` (route `GET /api/gallery/{name}/frames`):
14
+ a video seen as moments, a contact sheet, or seam pairs.
15
+ - `get_output_frames` takes `hear` (soundtrack around each `at` moment) and
16
+ reports `difference` per seam pair.
17
+
3
18
  Releases are cut by pushing a `v<semver>` tag. CI does the rest.
4
19
 
5
20
  ```bash
@@ -59,6 +59,13 @@ Two things differ from the local stdio setup:
59
59
  result, or open `http://<box>:8765/outputs/<name>` in the browser.
60
60
  - The connection is a plain HTTP call per tool invocation; there is no
61
61
  subprocess to restart.
62
+ - `use_workspace`/`create_workspace` pin *this box's* one MCP client, shared
63
+ by every agent connected to it - this server is single-user, so there is
64
+ no per-session isolation. If you and another agent are both against the
65
+ same box, either one's `use_workspace` call can move what the other reads
66
+ and writes next (#298). Pass `workspace=` on each call that takes it
67
+ (`validate_workflow`, `run_workflow`, most read/media tools) instead of
68
+ relying on the session pin when that matters.
62
69
 
63
70
  ## Claude Code with a local install (stdio)
64
71