diffusers-workflow 0.4.0a12__tar.gz → 0.4.0b1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {diffusers_workflow-0.4.0a12/diffusers_workflow.egg-info → diffusers_workflow-0.4.0b1}/PKG-INFO +5 -3
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/README.md +4 -2
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1/diffusers_workflow.egg-info}/PKG-INFO +5 -3
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/diffusers_workflow.egg-info/SOURCES.txt +39 -21
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/pipeline_processors/chain.py +14 -7
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/previous_results.py +5 -3
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/repl_commands.py +4 -1
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/result.py +40 -1
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/serve.py +35 -3
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/app.py +271 -27
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/jobs.py +74 -10
- diffusers_workflow-0.4.0b1/dw/server/mcp_mount.py +91 -0
- diffusers_workflow-0.4.0b1/dw/server/netinfo.py +124 -0
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/cssMode-CRm5Fmld.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/cssMode-DIA5LESv.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/editor.api-CArwgKCZ.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/editor.api-CuOF-U_A.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/freemarker2-B42MpbWP.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/freemarker2-xMcLxHzc.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/handlebars-BhleeD_A.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/handlebars-Dbt47IUh.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/html-Bi_v7qEe.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/html-C4QoqgED.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/htmlMode-c39yjrZR.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/htmlMode-BQ_x-rQl.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/index-CKHZ9ZUD.css → diffusers_workflow-0.4.0b1/dw/server/ui/assets/index-BCNGRglb.css +1 -1
- diffusers_workflow-0.4.0b1/dw/server/ui/assets/index-C14JKFhY.js +28 -0
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/javascript-BTuzJzdO.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/javascript-yDlADdyl.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/jsonMode-DY2FmMCP.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/jsonMode-X4znCY4b.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/liquid-iXwDEnQP.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/liquid-CAaCQzwu.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/lspLanguageFeatures-CVXyTq9V.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/lspLanguageFeatures-CTJIGm94.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/mdx-QE70XlV0.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/mdx-ByHLng1y.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/monaco-CzCru1EC.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/monaco-LJZc6TiS.js +4 -4
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/python-DxHS-kHp.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/python-BCT_lvfW.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/razor-CT5Qrhwg.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/razor-Bw9oTolL.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/tsMode-qXdDdnF1.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/tsMode-BGvHTpYz.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/typescript-BWfJagji.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/typescript-mwKKpQXP.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/workers-C9vxrwoC.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/workers-BOhWN9wu.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/xml-DhJEwsDK.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/xml-DuQ6E6P7.js +1 -1
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/yaml-CiixMxAq.js → diffusers_workflow-0.4.0b1/dw/server/ui/assets/yaml-D7o22x0f.js +1 -1
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/index.html +2 -2
- diffusers_workflow-0.4.0b1/dw/step_cache.py +260 -0
- diffusers_workflow-0.4.0b1/dw/tasks/audio_utils.py +579 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/concat_videos.py +44 -12
- diffusers_workflow-0.4.0b1/dw/tasks/dissolve_videos.py +138 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/gather.py +27 -9
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/image_utils.py +65 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/interpolate_frames.py +13 -3
- diffusers_workflow-0.4.0b1/dw/tasks/stabilize.py +121 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/task.py +99 -10
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/video_utils.py +137 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/worker.py +8 -2
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/workflow.py +169 -55
- diffusers_workflow-0.4.0b1/dw/workflows/h3_context_ir.json +57 -0
- diffusers_workflow-0.4.0b1/dw_mcp/__main__.py +122 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/catalog.py +9 -1
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/client.py +57 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/media.py +53 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/server.py +37 -1
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/pyproject.toml +4 -1
- diffusers_workflow-0.4.0b1/tests/test_audio_utils.py +469 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_chain.py +28 -0
- diffusers_workflow-0.4.0b1/tests/test_concat_videos.py +309 -0
- diffusers_workflow-0.4.0b1/tests/test_dissolve_videos.py +97 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_gather.py +96 -8
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_interpolate_frames.py +19 -4
- diffusers_workflow-0.4.0b1/tests/test_jobs_reused.py +53 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_mcp_catalog.py +1 -0
- diffusers_workflow-0.4.0b1/tests/test_mcp_main.py +138 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_mcp_media.py +182 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_mcp_server.py +17 -0
- diffusers_workflow-0.4.0b1/tests/test_mix_audio.py +53 -0
- diffusers_workflow-0.4.0b1/tests/test_recenter_crop.py +72 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_result.py +23 -0
- diffusers_workflow-0.4.0b1/tests/test_result_output_naming.py +34 -0
- diffusers_workflow-0.4.0b1/tests/test_serve_main.py +84 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_server.py +251 -2
- diffusers_workflow-0.4.0b1/tests/test_server_downloads.py +123 -0
- diffusers_workflow-0.4.0b1/tests/test_server_info.py +177 -0
- diffusers_workflow-0.4.0b1/tests/test_server_mcp.py +174 -0
- diffusers_workflow-0.4.0b1/tests/test_stabilize.py +110 -0
- diffusers_workflow-0.4.0b1/tests/test_step_cache.py +349 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_task.py +56 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_video_utils.py +96 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_worker_execute.py +25 -1
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_workflow.py +22 -0
- diffusers_workflow-0.4.0b1/tests/test_workflow_step_cache.py +610 -0
- diffusers_workflow-0.4.0a12/dw/server/ui/assets/index-Do_ZJ3yS.js +0 -23
- diffusers_workflow-0.4.0a12/dw/tasks/audio_utils.py +0 -266
- diffusers_workflow-0.4.0a12/dw/workflows/h3_context_ir.json +0 -57
- diffusers_workflow-0.4.0a12/dw_mcp/__main__.py +0 -47
- diffusers_workflow-0.4.0a12/tests/test_audio_utils.py +0 -194
- diffusers_workflow-0.4.0a12/tests/test_concat_videos.py +0 -133
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/LICENSE +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/MANIFEST.in +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/diffusers_workflow.egg-info/entry_points.txt +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/diffusers_workflow.egg-info/requires.txt +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/diffusers_workflow.egg-info/top_level.txt +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/__init__.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/arguments.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/cache_blocks.json +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/cache_blocks.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/events.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/hub_cache.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/introspection.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/log_setup.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/pipeline_processors/config_objects.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/pipeline_processors/pipeline.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/pipeline_processors/remote.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/prompt_schema.json +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/prompt_weighting.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/prompts.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/repl.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/repl_worker.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/run.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/schema.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/security.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/__init__.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/enhancers.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/php-nr791fC2.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/st-DbInun42.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/server/updater.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/settings.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/step.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/background_remover.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/borders.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/depth_estimator.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/diffusion_upscale.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/format_messages.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/image_to_text.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/model_cache.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/pair_audio.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/qr_code.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/restore_faces.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/rife_model.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/segment.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/tensor_image.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/text_generation.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/text_sections.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/upscale.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/tasks/zoe_depth.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/teacache.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/teacache_models.json +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/test.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/type_helpers.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/validate.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/variables.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/workflow_schema.json +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/workflows/augment_prompt.json +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/workflows/describe_image.json +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw/workflows/test.json +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/__init__.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/authoring.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/diagnose.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/models.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/dw_mcp/prompts.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/setup.cfg +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_argument_updates.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_arguments.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_borders.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_cache_blocks.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_cli.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_component_pruning.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_config_objects.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_configuration_schema.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_depth_estimator.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_device.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_device_helpers.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_device_portability.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_diffusion_upscale.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_docs_links.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_events.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_examples.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_hub_cache.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_image_to_text.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_image_utils.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_integration.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_introspection.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_list_images.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_mcp_authoring.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_mcp_client.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_mcp_diagnose.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_mcp_models.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_mcp_prompts.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_model_cache.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_modular_pipeline.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_offload_placement.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_pair_audio.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_phase_events.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_pipeline_caching.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_pipeline_components.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_previous_results.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_prompt_parser.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_prompt_weighting.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_prompts.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_repl_commands.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_repl_ergonomics.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_repl_hierarchical.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_repl_reorganization.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_repl_worker.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_resize_bucket.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_scheduler_config.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_schema.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_security.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_segment.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_step.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_strip_exif_and_watermark.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_task_discovery.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_teacache.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_tensor_image.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_text_generation.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_text_sections.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_type_helpers.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_updater.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_variables.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_worker.py +0 -0
- {diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/tests/test_workflow_trust.py +0 -0
{diffusers_workflow-0.4.0a12/diffusers_workflow.egg-info → diffusers_workflow-0.4.0b1}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diffusers-workflow
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.0b1
|
|
4
4
|
Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
|
|
5
5
|
Author: dkackman
|
|
6
6
|
License: Apache-2.0
|
|
@@ -91,10 +91,11 @@ A workflow JSON file is portable and easy to hand off — but that same flexibil
|
|
|
91
91
|
## Features
|
|
92
92
|
|
|
93
93
|
- **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).
|
|
94
|
-
- **MCP server** — a
|
|
94
|
+
- **MCP server** — a tool surface that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`: `dw-mcp` over stdio, or mounted at `/mcp` by `dw.serve --mcp` for a client on another machine. See [MCP Server](docs/MCP.md) and [Remote GPU server](docs/REMOTE.md).
|
|
95
|
+
- **Step-output caching** — a step whose resolved arguments and seed are unchanged since the last run in the same process reuses its cached result instead of re-executing. This applies to any `Workflow.run` — REPL iteration and a re-run of a server-submitted job alike, so re-running a fixed-seed workflow from the UI finishes instantly and writes no new output files. The cache holds the most recent 50 steps and is dropped by `memory clear`
|
|
95
96
|
- **Declarative JSON workflows** with variable substitution and cross-step data flow
|
|
96
97
|
- **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
|
|
97
|
-
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it (see [Trust model](docs/SECURITY.md#trust-model) before reopening one someone else sent you)
|
|
98
|
+
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it (see [Trust model](docs/SECURITY.md#trust-model) before reopening one someone else sent you). A rerun never overwrites a prior output — a name collision gets an incrementing suffix instead
|
|
98
99
|
- **Long-video chaining** — run a video pipeline once per segment and stitch the segments into one clip, with audio-driven length and frame-to-frame continuity
|
|
99
100
|
- **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
|
|
100
101
|
- **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
|
|
@@ -342,6 +343,7 @@ See [workflows/](workflows/) for more workflow files.
|
|
|
342
343
|
|
|
343
344
|
- [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
|
|
344
345
|
- [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
|
|
346
|
+
- [Remote GPU server](docs/REMOTE.md) — Using the server, UI and MCP from another machine
|
|
345
347
|
- [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
|
|
346
348
|
- [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
|
|
347
349
|
- [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
|
|
@@ -16,10 +16,11 @@ A workflow JSON file is portable and easy to hand off — but that same flexibil
|
|
|
16
16
|
## Features
|
|
17
17
|
|
|
18
18
|
- **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).
|
|
19
|
-
- **MCP server** — a
|
|
19
|
+
- **MCP server** — a tool surface that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`: `dw-mcp` over stdio, or mounted at `/mcp` by `dw.serve --mcp` for a client on another machine. See [MCP Server](docs/MCP.md) and [Remote GPU server](docs/REMOTE.md).
|
|
20
|
+
- **Step-output caching** — a step whose resolved arguments and seed are unchanged since the last run in the same process reuses its cached result instead of re-executing. This applies to any `Workflow.run` — REPL iteration and a re-run of a server-submitted job alike, so re-running a fixed-seed workflow from the UI finishes instantly and writes no new output files. The cache holds the most recent 50 steps and is dropped by `memory clear`
|
|
20
21
|
- **Declarative JSON workflows** with variable substitution and cross-step data flow
|
|
21
22
|
- **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
|
|
22
|
-
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it (see [Trust model](docs/SECURITY.md#trust-model) before reopening one someone else sent you)
|
|
23
|
+
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it (see [Trust model](docs/SECURITY.md#trust-model) before reopening one someone else sent you). A rerun never overwrites a prior output — a name collision gets an incrementing suffix instead
|
|
23
24
|
- **Long-video chaining** — run a video pipeline once per segment and stitch the segments into one clip, with audio-driven length and frame-to-frame continuity
|
|
24
25
|
- **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
|
|
25
26
|
- **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
|
|
@@ -267,6 +268,7 @@ See [workflows/](workflows/) for more workflow files.
|
|
|
267
268
|
|
|
268
269
|
- [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
|
|
269
270
|
- [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
|
|
271
|
+
- [Remote GPU server](docs/REMOTE.md) — Using the server, UI and MCP from another machine
|
|
270
272
|
- [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
|
|
271
273
|
- [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
|
|
272
274
|
- [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
|
{diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1/diffusers_workflow.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diffusers-workflow
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.0b1
|
|
4
4
|
Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
|
|
5
5
|
Author: dkackman
|
|
6
6
|
License: Apache-2.0
|
|
@@ -91,10 +91,11 @@ A workflow JSON file is portable and easy to hand off — but that same flexibil
|
|
|
91
91
|
## Features
|
|
92
92
|
|
|
93
93
|
- **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).
|
|
94
|
-
- **MCP server** — a
|
|
94
|
+
- **MCP server** — a tool surface that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`: `dw-mcp` over stdio, or mounted at `/mcp` by `dw.serve --mcp` for a client on another machine. See [MCP Server](docs/MCP.md) and [Remote GPU server](docs/REMOTE.md).
|
|
95
|
+
- **Step-output caching** — a step whose resolved arguments and seed are unchanged since the last run in the same process reuses its cached result instead of re-executing. This applies to any `Workflow.run` — REPL iteration and a re-run of a server-submitted job alike, so re-running a fixed-seed workflow from the UI finishes instantly and writes no new output files. The cache holds the most recent 50 steps and is dropped by `memory clear`
|
|
95
96
|
- **Declarative JSON workflows** with variable substitution and cross-step data flow
|
|
96
97
|
- **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
|
|
97
|
-
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it (see [Trust model](docs/SECURITY.md#trust-model) before reopening one someone else sent you)
|
|
98
|
+
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it (see [Trust model](docs/SECURITY.md#trust-model) before reopening one someone else sent you). A rerun never overwrites a prior output — a name collision gets an incrementing suffix instead
|
|
98
99
|
- **Long-video chaining** — run a video pipeline once per segment and stitch the segments into one clip, with audio-driven length and frame-to-frame continuity
|
|
99
100
|
- **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
|
|
100
101
|
- **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
|
|
@@ -342,6 +343,7 @@ See [workflows/](workflows/) for more workflow files.
|
|
|
342
343
|
|
|
343
344
|
- [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
|
|
344
345
|
- [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
|
|
346
|
+
- [Remote GPU server](docs/REMOTE.md) — Using the server, UI and MCP from another machine
|
|
345
347
|
- [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
|
|
346
348
|
- [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
|
|
347
349
|
- [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
|
{diffusers_workflow-0.4.0a12 → diffusers_workflow-0.4.0b1}/diffusers_workflow.egg-info/SOURCES.txt
RENAMED
|
@@ -30,6 +30,7 @@ dw/security.py
|
|
|
30
30
|
dw/serve.py
|
|
31
31
|
dw/settings.py
|
|
32
32
|
dw/step.py
|
|
33
|
+
dw/step_cache.py
|
|
33
34
|
dw/teacache.py
|
|
34
35
|
dw/teacache_models.json
|
|
35
36
|
dw/test.py
|
|
@@ -48,6 +49,8 @@ dw/server/__init__.py
|
|
|
48
49
|
dw/server/app.py
|
|
49
50
|
dw/server/enhancers.py
|
|
50
51
|
dw/server/jobs.py
|
|
52
|
+
dw/server/mcp_mount.py
|
|
53
|
+
dw/server/netinfo.py
|
|
51
54
|
dw/server/updater.py
|
|
52
55
|
dw/server/ui/index.html
|
|
53
56
|
dw/server/ui/assets/abap-08VXUWAP.js
|
|
@@ -64,45 +67,45 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
|
|
|
64
67
|
dw/server/ui/assets/csp-bTuwJoIa.js
|
|
65
68
|
dw/server/ui/assets/css-DIMkf-bt.js
|
|
66
69
|
dw/server/ui/assets/css.worker-B3ciXF_0.js
|
|
67
|
-
dw/server/ui/assets/cssMode-
|
|
70
|
+
dw/server/ui/assets/cssMode-DIA5LESv.js
|
|
68
71
|
dw/server/ui/assets/cypher-CVaqCwHa.js
|
|
69
72
|
dw/server/ui/assets/dart-onAF5SnQ.js
|
|
70
73
|
dw/server/ui/assets/dockerfile-DZFCIeNp.js
|
|
71
74
|
dw/server/ui/assets/ecl-D05T4iGw.js
|
|
72
75
|
dw/server/ui/assets/editor-jjEx9u7D.css
|
|
73
|
-
dw/server/ui/assets/editor.api-
|
|
76
|
+
dw/server/ui/assets/editor.api-CuOF-U_A.js
|
|
74
77
|
dw/server/ui/assets/editor.worker-q-txB4vs.js
|
|
75
78
|
dw/server/ui/assets/elixir-6RTg0lbw.js
|
|
76
79
|
dw/server/ui/assets/flow9-C5_-GSwl.js
|
|
77
|
-
dw/server/ui/assets/freemarker2-
|
|
80
|
+
dw/server/ui/assets/freemarker2-xMcLxHzc.js
|
|
78
81
|
dw/server/ui/assets/fsharp-C8Ef5oNN.js
|
|
79
82
|
dw/server/ui/assets/go-C-y9NEjX.js
|
|
80
83
|
dw/server/ui/assets/graphql-fmXr3nnJ.js
|
|
81
|
-
dw/server/ui/assets/handlebars-
|
|
84
|
+
dw/server/ui/assets/handlebars-Dbt47IUh.js
|
|
82
85
|
dw/server/ui/assets/hcl-CpzslTdj.js
|
|
83
|
-
dw/server/ui/assets/html-
|
|
86
|
+
dw/server/ui/assets/html-C4QoqgED.js
|
|
84
87
|
dw/server/ui/assets/html.worker-C93Ht9o9.js
|
|
85
|
-
dw/server/ui/assets/htmlMode-
|
|
86
|
-
dw/server/ui/assets/index-
|
|
87
|
-
dw/server/ui/assets/index-
|
|
88
|
+
dw/server/ui/assets/htmlMode-BQ_x-rQl.js
|
|
89
|
+
dw/server/ui/assets/index-BCNGRglb.css
|
|
90
|
+
dw/server/ui/assets/index-C14JKFhY.js
|
|
88
91
|
dw/server/ui/assets/ini-sBoK_t0W.js
|
|
89
92
|
dw/server/ui/assets/java-BEtHBSE6.js
|
|
90
|
-
dw/server/ui/assets/javascript-
|
|
93
|
+
dw/server/ui/assets/javascript-yDlADdyl.js
|
|
91
94
|
dw/server/ui/assets/json.worker-B2V3pomh.js
|
|
92
|
-
dw/server/ui/assets/jsonMode-
|
|
95
|
+
dw/server/ui/assets/jsonMode-X4znCY4b.js
|
|
93
96
|
dw/server/ui/assets/julia-Bri6UV-V.js
|
|
94
97
|
dw/server/ui/assets/kotlin-BOotOW0E.js
|
|
95
98
|
dw/server/ui/assets/less-B9JPFI3C.js
|
|
96
99
|
dw/server/ui/assets/lexon-CfSJPG6W.js
|
|
97
|
-
dw/server/ui/assets/liquid-
|
|
98
|
-
dw/server/ui/assets/lspLanguageFeatures-
|
|
100
|
+
dw/server/ui/assets/liquid-CAaCQzwu.js
|
|
101
|
+
dw/server/ui/assets/lspLanguageFeatures-CTJIGm94.js
|
|
99
102
|
dw/server/ui/assets/lua-CsQS60Ue.js
|
|
100
103
|
dw/server/ui/assets/m3-D-oSqn_W.js
|
|
101
104
|
dw/server/ui/assets/markdown-Cimd5fb3.js
|
|
102
|
-
dw/server/ui/assets/mdx-
|
|
105
|
+
dw/server/ui/assets/mdx-ByHLng1y.js
|
|
103
106
|
dw/server/ui/assets/mips-CIPQ_RoX.js
|
|
104
107
|
dw/server/ui/assets/monaco--ixms01u.css
|
|
105
|
-
dw/server/ui/assets/monaco-
|
|
108
|
+
dw/server/ui/assets/monaco-LJZc6TiS.js
|
|
106
109
|
dw/server/ui/assets/msdax-DauUninz.js
|
|
107
110
|
dw/server/ui/assets/mysql-SOo6toE5.js
|
|
108
111
|
dw/server/ui/assets/objective-c-FvmIjYaQ.js
|
|
@@ -117,10 +120,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
|
|
|
117
120
|
dw/server/ui/assets/powershell-DmHpPYUd.js
|
|
118
121
|
dw/server/ui/assets/protobuf-C531GsRP.js
|
|
119
122
|
dw/server/ui/assets/pug-Z5eAx3Zn.js
|
|
120
|
-
dw/server/ui/assets/python-
|
|
123
|
+
dw/server/ui/assets/python-BCT_lvfW.js
|
|
121
124
|
dw/server/ui/assets/qsharp-DkqhCAOL.js
|
|
122
125
|
dw/server/ui/assets/r-BwWrilGY.js
|
|
123
|
-
dw/server/ui/assets/razor-
|
|
126
|
+
dw/server/ui/assets/razor-Bw9oTolL.js
|
|
124
127
|
dw/server/ui/assets/redis-ClamHrr6.js
|
|
125
128
|
dw/server/ui/assets/redshift-DT7zqm-g.js
|
|
126
129
|
dw/server/ui/assets/restructuredtext-BYgofb2h.js
|
|
@@ -140,21 +143,22 @@ dw/server/ui/assets/swift-Bxkupp3x.js
|
|
|
140
143
|
dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
|
|
141
144
|
dw/server/ui/assets/tcl-DISqw1ZD.js
|
|
142
145
|
dw/server/ui/assets/ts.worker-D7T1-Ig5.js
|
|
143
|
-
dw/server/ui/assets/tsMode-
|
|
146
|
+
dw/server/ui/assets/tsMode-BGvHTpYz.js
|
|
144
147
|
dw/server/ui/assets/twig-De2hgUGE.js
|
|
145
|
-
dw/server/ui/assets/typescript-
|
|
148
|
+
dw/server/ui/assets/typescript-mwKKpQXP.js
|
|
146
149
|
dw/server/ui/assets/typespec-B8J7ngcE.js
|
|
147
150
|
dw/server/ui/assets/vb-DV3o63ZY.js
|
|
148
151
|
dw/server/ui/assets/wgsl-DpFanUEy.js
|
|
149
|
-
dw/server/ui/assets/workers-
|
|
150
|
-
dw/server/ui/assets/xml-
|
|
151
|
-
dw/server/ui/assets/yaml-
|
|
152
|
+
dw/server/ui/assets/workers-BOhWN9wu.js
|
|
153
|
+
dw/server/ui/assets/xml-DuQ6E6P7.js
|
|
154
|
+
dw/server/ui/assets/yaml-D7o22x0f.js
|
|
152
155
|
dw/tasks/audio_utils.py
|
|
153
156
|
dw/tasks/background_remover.py
|
|
154
157
|
dw/tasks/borders.py
|
|
155
158
|
dw/tasks/concat_videos.py
|
|
156
159
|
dw/tasks/depth_estimator.py
|
|
157
160
|
dw/tasks/diffusion_upscale.py
|
|
161
|
+
dw/tasks/dissolve_videos.py
|
|
158
162
|
dw/tasks/format_messages.py
|
|
159
163
|
dw/tasks/gather.py
|
|
160
164
|
dw/tasks/image_to_text.py
|
|
@@ -166,6 +170,7 @@ dw/tasks/qr_code.py
|
|
|
166
170
|
dw/tasks/restore_faces.py
|
|
167
171
|
dw/tasks/rife_model.py
|
|
168
172
|
dw/tasks/segment.py
|
|
173
|
+
dw/tasks/stabilize.py
|
|
169
174
|
dw/tasks/task.py
|
|
170
175
|
dw/tasks/tensor_image.py
|
|
171
176
|
dw/tasks/text_generation.py
|
|
@@ -203,6 +208,7 @@ tests/test_device.py
|
|
|
203
208
|
tests/test_device_helpers.py
|
|
204
209
|
tests/test_device_portability.py
|
|
205
210
|
tests/test_diffusion_upscale.py
|
|
211
|
+
tests/test_dissolve_videos.py
|
|
206
212
|
tests/test_docs_links.py
|
|
207
213
|
tests/test_events.py
|
|
208
214
|
tests/test_examples.py
|
|
@@ -213,15 +219,18 @@ tests/test_image_utils.py
|
|
|
213
219
|
tests/test_integration.py
|
|
214
220
|
tests/test_interpolate_frames.py
|
|
215
221
|
tests/test_introspection.py
|
|
222
|
+
tests/test_jobs_reused.py
|
|
216
223
|
tests/test_list_images.py
|
|
217
224
|
tests/test_mcp_authoring.py
|
|
218
225
|
tests/test_mcp_catalog.py
|
|
219
226
|
tests/test_mcp_client.py
|
|
220
227
|
tests/test_mcp_diagnose.py
|
|
228
|
+
tests/test_mcp_main.py
|
|
221
229
|
tests/test_mcp_media.py
|
|
222
230
|
tests/test_mcp_models.py
|
|
223
231
|
tests/test_mcp_prompts.py
|
|
224
232
|
tests/test_mcp_server.py
|
|
233
|
+
tests/test_mix_audio.py
|
|
225
234
|
tests/test_model_cache.py
|
|
226
235
|
tests/test_modular_pipeline.py
|
|
227
236
|
tests/test_offload_placement.py
|
|
@@ -233,6 +242,7 @@ tests/test_previous_results.py
|
|
|
233
242
|
tests/test_prompt_parser.py
|
|
234
243
|
tests/test_prompt_weighting.py
|
|
235
244
|
tests/test_prompts.py
|
|
245
|
+
tests/test_recenter_crop.py
|
|
236
246
|
tests/test_repl_commands.py
|
|
237
247
|
tests/test_repl_ergonomics.py
|
|
238
248
|
tests/test_repl_hierarchical.py
|
|
@@ -240,12 +250,19 @@ tests/test_repl_reorganization.py
|
|
|
240
250
|
tests/test_repl_worker.py
|
|
241
251
|
tests/test_resize_bucket.py
|
|
242
252
|
tests/test_result.py
|
|
253
|
+
tests/test_result_output_naming.py
|
|
243
254
|
tests/test_scheduler_config.py
|
|
244
255
|
tests/test_schema.py
|
|
245
256
|
tests/test_security.py
|
|
246
257
|
tests/test_segment.py
|
|
258
|
+
tests/test_serve_main.py
|
|
247
259
|
tests/test_server.py
|
|
260
|
+
tests/test_server_downloads.py
|
|
261
|
+
tests/test_server_info.py
|
|
262
|
+
tests/test_server_mcp.py
|
|
263
|
+
tests/test_stabilize.py
|
|
248
264
|
tests/test_step.py
|
|
265
|
+
tests/test_step_cache.py
|
|
249
266
|
tests/test_strip_exif_and_watermark.py
|
|
250
267
|
tests/test_task.py
|
|
251
268
|
tests/test_task_discovery.py
|
|
@@ -260,4 +277,5 @@ tests/test_video_utils.py
|
|
|
260
277
|
tests/test_worker.py
|
|
261
278
|
tests/test_worker_execute.py
|
|
262
279
|
tests/test_workflow.py
|
|
280
|
+
tests/test_workflow_step_cache.py
|
|
263
281
|
tests/test_workflow_trust.py
|
|
@@ -35,8 +35,7 @@ import torch
|
|
|
35
35
|
from diffusers.utils import encode_video, is_av_available
|
|
36
36
|
|
|
37
37
|
from .. import empty_device_cache
|
|
38
|
-
from ..result import AudioVideo, get_artifact_list
|
|
39
|
-
from ..security import validate_output_path
|
|
38
|
+
from ..result import AudioVideo, get_artifact_list, output_file_path
|
|
40
39
|
from ..tasks.audio_utils import (
|
|
41
40
|
as_channels_samples,
|
|
42
41
|
equal_power_crossfade_join,
|
|
@@ -165,6 +164,11 @@ class SegmentedFrames:
|
|
|
165
164
|
self.paths = list(paths)
|
|
166
165
|
self.total_frames = total_frames
|
|
167
166
|
self.keep_files = keep_files
|
|
167
|
+
# True once cleanup() has actually removed the files (not when
|
|
168
|
+
# keep_files skipped that) - a cached Result pointing at a cleaned-up
|
|
169
|
+
# SegmentedFrames must not be served to a later miss, since the files
|
|
170
|
+
# a replay would open are gone. See Result.retainable.
|
|
171
|
+
self.cleaned = False
|
|
168
172
|
|
|
169
173
|
def __len__(self):
|
|
170
174
|
"""Chunk count - one per segment file."""
|
|
@@ -191,6 +195,7 @@ class SegmentedFrames:
|
|
|
191
195
|
os.remove(path)
|
|
192
196
|
except FileNotFoundError:
|
|
193
197
|
pass
|
|
198
|
+
self.cleaned = True
|
|
194
199
|
|
|
195
200
|
|
|
196
201
|
class SegmentSpill:
|
|
@@ -240,12 +245,14 @@ class SegmentSpill:
|
|
|
240
245
|
chain leaves fully playable segments
|
|
241
246
|
sample_rate: Sample rate of that audio
|
|
242
247
|
"""
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
+
# A crashed or completed chain leaves segment files behind on disk,
|
|
249
|
+
# ready to salvage - and the per-wrapper iteration counter (base_name)
|
|
250
|
+
# restarts at 0 in a fresh process, so a rerun must dedupe through the
|
|
251
|
+
# same '-N' convention every other output goes through rather than
|
|
252
|
+
# silently overwriting them.
|
|
253
|
+
path = output_file_path(
|
|
248
254
|
self.output_dir,
|
|
255
|
+
f"{self.base_name}.segment-{len(self.paths):03d}.mp4",
|
|
249
256
|
)
|
|
250
257
|
|
|
251
258
|
audio_track = None
|
|
@@ -6,6 +6,7 @@ from .arguments import (
|
|
|
6
6
|
PREVIOUS_RESULT_PREFIX,
|
|
7
7
|
build_objects,
|
|
8
8
|
)
|
|
9
|
+
from .step_cache import reference_resolves_to
|
|
9
10
|
|
|
10
11
|
logger = logging.getLogger("dw")
|
|
11
12
|
|
|
@@ -126,13 +127,14 @@ def get_previous_results(previous_results, previous_result_name):
|
|
|
126
127
|
f"Previous result '{previous_result_name}' not found. Available results: {list(previous_results.keys())}"
|
|
127
128
|
)
|
|
128
129
|
|
|
129
|
-
# Find the longest known step name
|
|
130
|
-
#
|
|
130
|
+
# Find the longest known step name the reference resolves to, and treat
|
|
131
|
+
# the remainder as the property name. The exact-match case returned
|
|
132
|
+
# above, so every name reaching here is a strict '<name>.' prefix.
|
|
131
133
|
result_name = max(
|
|
132
134
|
(
|
|
133
135
|
name
|
|
134
136
|
for name in previous_results
|
|
135
|
-
if previous_result_name
|
|
137
|
+
if reference_resolves_to(previous_result_name, name)
|
|
136
138
|
),
|
|
137
139
|
key=len,
|
|
138
140
|
default=None,
|
|
@@ -279,7 +279,10 @@ class MemoryCommands:
|
|
|
279
279
|
if not arg or arg == "?":
|
|
280
280
|
print("\nMemory commands:")
|
|
281
281
|
print(" memory show - Show the worker's GPU memory usage")
|
|
282
|
-
print(
|
|
282
|
+
print(
|
|
283
|
+
" memory clear - Release cached models, cached step results, "
|
|
284
|
+
"and empty the device cache"
|
|
285
|
+
)
|
|
283
286
|
print()
|
|
284
287
|
print("The worker process starts on the first 'workflow run', so there")
|
|
285
288
|
print("is nothing to show before that. 'workflow restart' frees")
|
|
@@ -30,8 +30,28 @@ def output_file_path(output_dir, file_name):
|
|
|
30
30
|
they are concatenated into a file name. Without this a name carrying a
|
|
31
31
|
path separator would write outside the output directory, so the joined
|
|
32
32
|
path goes through the same validator every other path in the engine does.
|
|
33
|
+
|
|
34
|
+
A rerun that would otherwise produce a name already on disk gets a
|
|
35
|
+
'-2', '-3', ... counter instead of silently overwriting it - the same
|
|
36
|
+
guarantee ComfyUI's SaveImage node makes by scanning its output
|
|
37
|
+
directory before every write.
|
|
33
38
|
"""
|
|
34
|
-
|
|
39
|
+
candidate = validate_output_path(os.path.join(output_dir, file_name), output_dir)
|
|
40
|
+
return _dedupe_existing_path(candidate)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _dedupe_existing_path(path):
|
|
44
|
+
"""Append an incrementing counter before the extension until `path` is free."""
|
|
45
|
+
if not os.path.exists(path):
|
|
46
|
+
return path
|
|
47
|
+
|
|
48
|
+
base, ext = os.path.splitext(path)
|
|
49
|
+
counter = 2
|
|
50
|
+
while True:
|
|
51
|
+
candidate = f"{base}-{counter}{ext}"
|
|
52
|
+
if not os.path.exists(candidate):
|
|
53
|
+
return candidate
|
|
54
|
+
counter += 1
|
|
35
55
|
|
|
36
56
|
|
|
37
57
|
# Audio content types soundfile can write, mapped to their file extension and to any
|
|
@@ -142,6 +162,25 @@ class Result:
|
|
|
142
162
|
logger.debug("Adding single result to result list")
|
|
143
163
|
self.result_list.append(result)
|
|
144
164
|
|
|
165
|
+
@property
|
|
166
|
+
def retainable(self):
|
|
167
|
+
"""Whether the step cache may keep this Result's result_list.
|
|
168
|
+
|
|
169
|
+
A chain step's save_segments spills each segment to disk and
|
|
170
|
+
replays it lazily through a SegmentedFrames; save() removes those
|
|
171
|
+
files once the video is written (SegmentedFrames.cleanup(), called
|
|
172
|
+
from save_audio_video below). A Result cached after that point would
|
|
173
|
+
point a later cache hit at files that are already gone, so a
|
|
174
|
+
result_list holding such an artifact is not retainable - checked by
|
|
175
|
+
duck-typed attribute rather than isinstance, so this module need not
|
|
176
|
+
import pipeline_processors.chain.
|
|
177
|
+
"""
|
|
178
|
+
for result in self.result_list:
|
|
179
|
+
frames = getattr(result, "frames", None)
|
|
180
|
+
if getattr(frames, "cleaned", False):
|
|
181
|
+
return False
|
|
182
|
+
return True
|
|
183
|
+
|
|
145
184
|
def get_artifacts(self):
|
|
146
185
|
"""Retrieve all artifacts from stored results.
|
|
147
186
|
|
|
@@ -10,6 +10,7 @@ not to the network. Interactive API docs at http://127.0.0.1:8765/docs
|
|
|
10
10
|
import argparse
|
|
11
11
|
import multiprocessing
|
|
12
12
|
import os
|
|
13
|
+
import sys
|
|
13
14
|
|
|
14
15
|
# Spawn start method before anything touches multiprocessing (CUDA/MPS)
|
|
15
16
|
if multiprocessing.get_start_method(allow_none=True) != "spawn":
|
|
@@ -64,10 +65,36 @@ def main():
|
|
|
64
65
|
"anything can submit jobs to (including an MCP client) should "
|
|
65
66
|
"stay untrusted.",
|
|
66
67
|
)
|
|
68
|
+
parser.add_argument(
|
|
69
|
+
"--mcp",
|
|
70
|
+
action="store_true",
|
|
71
|
+
default=False,
|
|
72
|
+
help="Also serve the MCP tool surface at /mcp over Streamable HTTP, "
|
|
73
|
+
"behind the same token as /api, so an agent on another machine "
|
|
74
|
+
"needs no local install (`claude mcp add --transport http dw "
|
|
75
|
+
"http://<host>:<port>/mcp --header 'Authorization: Bearer <token>'`). "
|
|
76
|
+
"Refused on a non-loopback --host without a token.",
|
|
77
|
+
)
|
|
67
78
|
args = parser.parse_args()
|
|
68
79
|
|
|
69
80
|
token = args.token or os.environ.get("DW_API_TOKEN") or None
|
|
70
81
|
|
|
82
|
+
from .server.app import LOOPBACK_HOSTS
|
|
83
|
+
|
|
84
|
+
# A hard error, where the REST-only case below is a warning: an MCP
|
|
85
|
+
# endpoint can author and run workflows, and unlike the web UI there is
|
|
86
|
+
# no page to paste a token into. Raised before startup() and before the
|
|
87
|
+
# worker subprocess is ever spawned.
|
|
88
|
+
if args.mcp and args.host not in LOOPBACK_HOSTS and not token:
|
|
89
|
+
print(
|
|
90
|
+
f"dw-serve: --mcp on {args.host} needs a token. An MCP endpoint "
|
|
91
|
+
"can author and run workflows, and unlike the web UI there is "
|
|
92
|
+
"no page to type a token into - pass --token or set "
|
|
93
|
+
"DW_API_TOKEN, or bind to 127.0.0.1.",
|
|
94
|
+
file=sys.stderr,
|
|
95
|
+
)
|
|
96
|
+
raise SystemExit(2)
|
|
97
|
+
|
|
71
98
|
# Set before create_app / before the worker subprocess is ever spawned -
|
|
72
99
|
# 'spawn' launches a fresh interpreter that inherits this environment
|
|
73
100
|
# variable, so the job runner sees the same trust choice the API does
|
|
@@ -102,8 +129,6 @@ def main():
|
|
|
102
129
|
|
|
103
130
|
logger = logging.getLogger("dw")
|
|
104
131
|
|
|
105
|
-
from .server.app import LOOPBACK_HOSTS
|
|
106
|
-
|
|
107
132
|
if args.host not in LOOPBACK_HOSTS and not token:
|
|
108
133
|
logger.warning(
|
|
109
134
|
"Binding to %s with no API token configured (--token or "
|
|
@@ -126,10 +151,17 @@ def main():
|
|
|
126
151
|
prompt_dir=prompt_dir,
|
|
127
152
|
host=args.host,
|
|
128
153
|
token=token,
|
|
154
|
+
mcp=args.mcp,
|
|
155
|
+
port=args.port,
|
|
129
156
|
)
|
|
130
157
|
ui = " - UI at /" if default_ui_dir() else ""
|
|
158
|
+
mcp = " - MCP at /mcp" if args.mcp else ""
|
|
131
159
|
print(
|
|
132
|
-
f"diffusers-workflow server on http://{args.host}:{args.port}
|
|
160
|
+
f"diffusers-workflow server on http://{args.host}:{args.port}"
|
|
161
|
+
f" (docs at /docs{ui}{mcp})",
|
|
162
|
+
# stdout is a pipe under systemd or nohup, where block buffering
|
|
163
|
+
# would otherwise hold this line back until shutdown
|
|
164
|
+
flush=True,
|
|
133
165
|
)
|
|
134
166
|
uvicorn.run(app, host=args.host, port=args.port, log_level=args.log_level.lower())
|
|
135
167
|
|