diffusers-workflow 0.4.0a4__tar.gz → 0.4.0a10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {diffusers_workflow-0.4.0a4/diffusers_workflow.egg-info → diffusers_workflow-0.4.0a10}/PKG-INFO +15 -5
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/README.md +10 -4
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10/diffusers_workflow.egg-info}/PKG-INFO +15 -5
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/SOURCES.txt +48 -21
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/entry_points.txt +1 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/requires.txt +5 -0
- diffusers_workflow-0.4.0a10/diffusers_workflow.egg-info/top_level.txt +2 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/__init__.py +75 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/arguments.py +25 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/events.py +17 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/hub_cache.py +32 -3
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/introspection.py +76 -15
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/chain.py +5 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/config_objects.py +4 -2
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/pipeline.py +75 -11
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/previous_results.py +13 -8
- diffusers_workflow-0.4.0a10/dw/prompt_schema.json +48 -0
- diffusers_workflow-0.4.0a10/dw/prompts.py +145 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/repl.py +1 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/repl_commands.py +1 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/result.py +20 -2
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/run.py +16 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/security.py +67 -25
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/serve.py +22 -2
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/app.py +347 -22
- diffusers_workflow-0.4.0a10/dw/server/enhancers.py +129 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/jobs.py +53 -4
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/cssMode-DklhHuQC.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/cssMode-DBf-T_da.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/editor.api-DCWJa9Fw.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/editor.api-B0D5Ygq7.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/freemarker2-CVxDKoFq.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/freemarker2-Br8g4G1T.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/handlebars-DK-ehq_7.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/handlebars-BKo1TaOF.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/html-CrtXvEnP.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/html-Bis1seyM.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/htmlMode-D0r9dgS3.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/htmlMode-D2SOD2MF.js +1 -1
- diffusers_workflow-0.4.0a10/dw/server/ui/assets/index-D7eWnTCB.css +1 -0
- diffusers_workflow-0.4.0a10/dw/server/ui/assets/index-JyFxgIR9.js +20 -0
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/javascript-rD650v5-.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/javascript-CkEbVb78.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/jsonMode-DvWKiZ5V.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/jsonMode-dVJbYwxg.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/liquid-DvjV9-yQ.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/liquid-Btak-6uF.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/lspLanguageFeatures-Bv4c-HOB.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/lspLanguageFeatures-BfeZZQbb.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/mdx-CmyDcP1k.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/mdx-D9KXK7-s.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/monaco-CFDZdQeR.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/monaco-ZMCk_MWf.js +4 -4
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/python-BbNG9-ih.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/python-0FnO4xGM.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/razor-BruFjATi.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/razor-B6PMzeY4.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/tsMode-DhwsPBWM.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/tsMode-nxyvZH1t.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/typescript-DLBTIt_O.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/typescript-BhBe8aGf.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/workers-BD2vxpDW.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/workers-ChAf-t8A.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/xml-BCRgtEff.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/xml-z2r9dHSO.js +1 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/yaml-B9W8qjO1.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/yaml-DrcHrz7f.js +1 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/index.html +2 -2
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/step.py +41 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/task.py +7 -2
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/text_generation.py +15 -2
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflow.py +20 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflow_schema.json +2 -2
- diffusers_workflow-0.4.0a10/dw_mcp/__init__.py +6 -0
- diffusers_workflow-0.4.0a10/dw_mcp/__main__.py +39 -0
- diffusers_workflow-0.4.0a10/dw_mcp/authoring.py +37 -0
- diffusers_workflow-0.4.0a10/dw_mcp/catalog.py +83 -0
- diffusers_workflow-0.4.0a10/dw_mcp/client.py +201 -0
- diffusers_workflow-0.4.0a10/dw_mcp/diagnose.py +89 -0
- diffusers_workflow-0.4.0a10/dw_mcp/media.py +133 -0
- diffusers_workflow-0.4.0a10/dw_mcp/models.py +97 -0
- diffusers_workflow-0.4.0a10/dw_mcp/prompts.py +91 -0
- diffusers_workflow-0.4.0a10/dw_mcp/server.py +392 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/pyproject.toml +4 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_arguments.py +22 -2
- diffusers_workflow-0.4.0a10/tests/test_cli.py +181 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_config_objects.py +10 -2
- diffusers_workflow-0.4.0a10/tests/test_device.py +150 -0
- diffusers_workflow-0.4.0a10/tests/test_device_portability.py +116 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_docs_links.py +8 -6
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_examples.py +7 -6
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_hub_cache.py +46 -0
- diffusers_workflow-0.4.0a10/tests/test_mcp_authoring.py +156 -0
- diffusers_workflow-0.4.0a10/tests/test_mcp_catalog.py +118 -0
- diffusers_workflow-0.4.0a10/tests/test_mcp_client.py +370 -0
- diffusers_workflow-0.4.0a10/tests/test_mcp_diagnose.py +252 -0
- diffusers_workflow-0.4.0a10/tests/test_mcp_media.py +377 -0
- diffusers_workflow-0.4.0a10/tests/test_mcp_models.py +187 -0
- diffusers_workflow-0.4.0a10/tests/test_mcp_prompts.py +267 -0
- diffusers_workflow-0.4.0a10/tests/test_mcp_server.py +727 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_modular_pipeline.py +9 -2
- diffusers_workflow-0.4.0a10/tests/test_offload_placement.py +105 -0
- diffusers_workflow-0.4.0a10/tests/test_phase_events.py +227 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_pipeline_components.py +33 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_previous_results.py +66 -0
- diffusers_workflow-0.4.0a10/tests/test_prompts.py +227 -0
- diffusers_workflow-0.4.0a10/tests/test_repl_worker.py +77 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_result.py +35 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_security.py +77 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_server.py +811 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_step.py +82 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_task.py +1 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_task_discovery.py +43 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_text_generation.py +38 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_text_sections.py +1 -1
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_workflow.py +20 -0
- diffusers_workflow-0.4.0a4/diffusers_workflow.egg-info/top_level.txt +0 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/index-SQcvGbXy.css +0 -1
- diffusers_workflow-0.4.0a4/dw/server/ui/assets/index-qLIa9n7C.js +0 -13
- diffusers_workflow-0.4.0a4/tests/test_device.py +0 -59
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/LICENSE +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/MANIFEST.in +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/cache_blocks.json +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/cache_blocks.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/log_setup.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/remote.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/prompt_weighting.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/repl_worker.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/schema.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/__init__.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/php-nr791fC2.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/st-DbInun42.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/server/updater.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/settings.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/audio_utils.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/background_remover.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/borders.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/concat_videos.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/depth_estimator.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/diffusion_upscale.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/format_messages.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/gather.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/image_to_text.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/image_utils.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/interpolate_frames.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/model_cache.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/pair_audio.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/qr_code.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/restore_faces.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/rife_model.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/segment.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/tensor_image.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/text_sections.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/upscale.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/video_utils.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/tasks/zoe_depth.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/teacache.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/teacache_models.json +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/test.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/type_helpers.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/validate.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/variables.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/worker.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflows/augment_prompt.json +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflows/describe_image.json +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflows/h3_context_ir.json +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/dw/workflows/test.json +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/setup.cfg +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_argument_updates.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_audio_utils.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_borders.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_cache_blocks.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_chain.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_component_pruning.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_concat_videos.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_configuration_schema.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_depth_estimator.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_device_helpers.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_diffusion_upscale.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_events.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_gather.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_image_to_text.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_image_utils.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_integration.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_interpolate_frames.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_introspection.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_list_images.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_model_cache.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_pair_audio.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_pipeline_caching.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_prompt_parser.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_prompt_weighting.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_repl_commands.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_repl_ergonomics.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_repl_hierarchical.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_repl_reorganization.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_resize_bucket.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_scheduler_config.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_schema.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_segment.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_strip_exif_and_watermark.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_teacache.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_tensor_image.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_type_helpers.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_variables.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_video_utils.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_worker.py +0 -0
- {diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/tests/test_worker_execute.py +0 -0
{diffusers_workflow-0.4.0a4/diffusers_workflow.egg-info → diffusers_workflow-0.4.0a10}/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.0a10
|
|
4
4
|
Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
|
|
5
5
|
Author: dkackman
|
|
6
6
|
License: Apache-2.0
|
|
@@ -57,6 +57,9 @@ Requires-Dist: packaging>=26.3
|
|
|
57
57
|
Provides-Extra: server
|
|
58
58
|
Requires-Dist: fastapi>=0.141.1; extra == "server"
|
|
59
59
|
Requires-Dist: uvicorn[standard]>=0.52.4; extra == "server"
|
|
60
|
+
Provides-Extra: mcp
|
|
61
|
+
Requires-Dist: mcp>=2.1.1; extra == "mcp"
|
|
62
|
+
Requires-Dist: httpx>=0.28.1; extra == "mcp"
|
|
60
63
|
Provides-Extra: dev
|
|
61
64
|
Requires-Dist: pytest>=9.1.1; extra == "dev"
|
|
62
65
|
Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
|
|
@@ -67,6 +70,7 @@ Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
|
|
|
67
70
|
Requires-Dist: httpx>=0.28.1; extra == "dev"
|
|
68
71
|
Requires-Dist: black>=26.5.1; extra == "dev"
|
|
69
72
|
Requires-Dist: build; extra == "dev"
|
|
73
|
+
Requires-Dist: mcp>=2.1.1; extra == "dev"
|
|
70
74
|
Dynamic: license-file
|
|
71
75
|
|
|
72
76
|
[](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql)
|
|
@@ -85,6 +89,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
|
|
|
85
89
|
## Features
|
|
86
90
|
|
|
87
91
|
- **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
|
|
92
|
+
- **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
|
|
88
93
|
- **Declarative JSON workflows** with variable substitution and cross-step data flow
|
|
89
94
|
- **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
|
|
90
95
|
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
|
|
@@ -92,6 +97,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
|
|
|
92
97
|
- **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
|
|
93
98
|
- **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
|
|
94
99
|
- **Prompt weighting** — A1111-style `(word:1.5)` syntax with long prompt support
|
|
100
|
+
- **Prompt library** — store prompts once in `prompts/` and reference them from any workflow as `prompt:name` or `prompt:folder/name`, with a web UI for browsing, editing, and AI-enhancing them
|
|
95
101
|
- **LoRA and IP-Adapter** support
|
|
96
102
|
- **Composable workflows** from multiple JSON files with `builtin:` references
|
|
97
103
|
- **Utility tasks** — upscaling, face restoration, segmentation, captioning, frame interpolation, QR codes, and more
|
|
@@ -135,6 +141,8 @@ Everything the engine does, in a browser backed by a persistent GPU worker — m
|
|
|
135
141
|
|
|
136
142
|

|
|
137
143
|
|
|
144
|
+
**A prompt library shared by every workflow.** Store a prompt once, reference it anywhere as `prompt:name` — the Prompts page browses, edits, and filters the library, and an *Enhance with AI* panel expands an idea into a full prompt with a local language model.
|
|
145
|
+
|
|
138
146
|
**A model manager for the disk your models actually consume.** The Hugging Face hub cache, inventoried: sizes, revisions, last-used dates, free space — download new models by id with live progress, delete with one click.
|
|
139
147
|
|
|
140
148
|

|
|
@@ -146,14 +154,14 @@ Jobs queue, stream progress live (per denoising step), cancel cooperatively, and
|
|
|
146
154
|
### Run a Workflow
|
|
147
155
|
|
|
148
156
|
```bash
|
|
149
|
-
python -m dw.run
|
|
150
|
-
python -m dw.run
|
|
157
|
+
python -m dw.run workflows/flux/FluxDev.json
|
|
158
|
+
python -m dw.run workflows/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
|
|
151
159
|
```
|
|
152
160
|
|
|
153
161
|
### Validate a Workflow
|
|
154
162
|
|
|
155
163
|
```bash
|
|
156
|
-
python -m dw.validate
|
|
164
|
+
python -m dw.validate workflows/flux/FluxDev.json
|
|
157
165
|
```
|
|
158
166
|
|
|
159
167
|
### Interactive REPL
|
|
@@ -313,13 +321,14 @@ a (photorealistic:1.4) portrait with (bright red hair:1.3) and [freckles]
|
|
|
313
321
|
|
|
314
322
|
**Interactive schema browser:** [View Schema](https://json-schema.app/view/%23?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdkackman%2Fdiffusers-workflow%2Frefs%2Fheads%2Fmaster%2Fdw%2Fworkflow_schema.json)
|
|
315
323
|
|
|
316
|
-
See [
|
|
324
|
+
See [workflows/](workflows/) for more workflow files.
|
|
317
325
|
|
|
318
326
|
## Documentation
|
|
319
327
|
|
|
320
328
|
### Guides
|
|
321
329
|
|
|
322
330
|
- [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
|
|
331
|
+
- [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
|
|
323
332
|
- [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
|
|
324
333
|
- [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
|
|
325
334
|
- [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
|
|
@@ -327,6 +336,7 @@ See [examples/](examples/) for more workflow files.
|
|
|
327
336
|
- [LoRA](docs/LORAS.md) — Loading and stacking LoRA adapters
|
|
328
337
|
- [IP-Adapter](docs/IP_ADAPTER.md) — Image-prompt conditioning
|
|
329
338
|
- [Prompt Weighting](docs/PROMPT_WEIGHTING.md) — A1111-style syntax
|
|
339
|
+
- [Prompt References](docs/WORKFLOW_GUIDE.md#prompt-references) — The stored prompt library and `prompt:` references
|
|
330
340
|
- [Tasks](docs/TASKS.md) — Image processing, ControlNet preprocessors, utilities
|
|
331
341
|
|
|
332
342
|
### Reference
|
|
@@ -14,6 +14,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
|
|
|
14
14
|
## Features
|
|
15
15
|
|
|
16
16
|
- **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
|
|
17
|
+
- **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
|
|
17
18
|
- **Declarative JSON workflows** with variable substitution and cross-step data flow
|
|
18
19
|
- **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
|
|
19
20
|
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
|
|
@@ -21,6 +22,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
|
|
|
21
22
|
- **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
|
|
22
23
|
- **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
|
|
23
24
|
- **Prompt weighting** — A1111-style `(word:1.5)` syntax with long prompt support
|
|
25
|
+
- **Prompt library** — store prompts once in `prompts/` and reference them from any workflow as `prompt:name` or `prompt:folder/name`, with a web UI for browsing, editing, and AI-enhancing them
|
|
24
26
|
- **LoRA and IP-Adapter** support
|
|
25
27
|
- **Composable workflows** from multiple JSON files with `builtin:` references
|
|
26
28
|
- **Utility tasks** — upscaling, face restoration, segmentation, captioning, frame interpolation, QR codes, and more
|
|
@@ -64,6 +66,8 @@ Everything the engine does, in a browser backed by a persistent GPU worker — m
|
|
|
64
66
|
|
|
65
67
|

|
|
66
68
|
|
|
69
|
+
**A prompt library shared by every workflow.** Store a prompt once, reference it anywhere as `prompt:name` — the Prompts page browses, edits, and filters the library, and an *Enhance with AI* panel expands an idea into a full prompt with a local language model.
|
|
70
|
+
|
|
67
71
|
**A model manager for the disk your models actually consume.** The Hugging Face hub cache, inventoried: sizes, revisions, last-used dates, free space — download new models by id with live progress, delete with one click.
|
|
68
72
|
|
|
69
73
|

|
|
@@ -75,14 +79,14 @@ Jobs queue, stream progress live (per denoising step), cancel cooperatively, and
|
|
|
75
79
|
### Run a Workflow
|
|
76
80
|
|
|
77
81
|
```bash
|
|
78
|
-
python -m dw.run
|
|
79
|
-
python -m dw.run
|
|
82
|
+
python -m dw.run workflows/flux/FluxDev.json
|
|
83
|
+
python -m dw.run workflows/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
|
|
80
84
|
```
|
|
81
85
|
|
|
82
86
|
### Validate a Workflow
|
|
83
87
|
|
|
84
88
|
```bash
|
|
85
|
-
python -m dw.validate
|
|
89
|
+
python -m dw.validate workflows/flux/FluxDev.json
|
|
86
90
|
```
|
|
87
91
|
|
|
88
92
|
### Interactive REPL
|
|
@@ -242,13 +246,14 @@ a (photorealistic:1.4) portrait with (bright red hair:1.3) and [freckles]
|
|
|
242
246
|
|
|
243
247
|
**Interactive schema browser:** [View Schema](https://json-schema.app/view/%23?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdkackman%2Fdiffusers-workflow%2Frefs%2Fheads%2Fmaster%2Fdw%2Fworkflow_schema.json)
|
|
244
248
|
|
|
245
|
-
See [
|
|
249
|
+
See [workflows/](workflows/) for more workflow files.
|
|
246
250
|
|
|
247
251
|
## Documentation
|
|
248
252
|
|
|
249
253
|
### Guides
|
|
250
254
|
|
|
251
255
|
- [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
|
|
256
|
+
- [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
|
|
252
257
|
- [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
|
|
253
258
|
- [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
|
|
254
259
|
- [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
|
|
@@ -256,6 +261,7 @@ See [examples/](examples/) for more workflow files.
|
|
|
256
261
|
- [LoRA](docs/LORAS.md) — Loading and stacking LoRA adapters
|
|
257
262
|
- [IP-Adapter](docs/IP_ADAPTER.md) — Image-prompt conditioning
|
|
258
263
|
- [Prompt Weighting](docs/PROMPT_WEIGHTING.md) — A1111-style syntax
|
|
264
|
+
- [Prompt References](docs/WORKFLOW_GUIDE.md#prompt-references) — The stored prompt library and `prompt:` references
|
|
259
265
|
- [Tasks](docs/TASKS.md) — Image processing, ControlNet preprocessors, utilities
|
|
260
266
|
|
|
261
267
|
### Reference
|
{diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10/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.0a10
|
|
4
4
|
Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
|
|
5
5
|
Author: dkackman
|
|
6
6
|
License: Apache-2.0
|
|
@@ -57,6 +57,9 @@ Requires-Dist: packaging>=26.3
|
|
|
57
57
|
Provides-Extra: server
|
|
58
58
|
Requires-Dist: fastapi>=0.141.1; extra == "server"
|
|
59
59
|
Requires-Dist: uvicorn[standard]>=0.52.4; extra == "server"
|
|
60
|
+
Provides-Extra: mcp
|
|
61
|
+
Requires-Dist: mcp>=2.1.1; extra == "mcp"
|
|
62
|
+
Requires-Dist: httpx>=0.28.1; extra == "mcp"
|
|
60
63
|
Provides-Extra: dev
|
|
61
64
|
Requires-Dist: pytest>=9.1.1; extra == "dev"
|
|
62
65
|
Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
|
|
@@ -67,6 +70,7 @@ Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
|
|
|
67
70
|
Requires-Dist: httpx>=0.28.1; extra == "dev"
|
|
68
71
|
Requires-Dist: black>=26.5.1; extra == "dev"
|
|
69
72
|
Requires-Dist: build; extra == "dev"
|
|
73
|
+
Requires-Dist: mcp>=2.1.1; extra == "dev"
|
|
70
74
|
Dynamic: license-file
|
|
71
75
|
|
|
72
76
|
[](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql)
|
|
@@ -85,6 +89,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
|
|
|
85
89
|
## Features
|
|
86
90
|
|
|
87
91
|
- **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
|
|
92
|
+
- **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
|
|
88
93
|
- **Declarative JSON workflows** with variable substitution and cross-step data flow
|
|
89
94
|
- **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
|
|
90
95
|
- **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
|
|
@@ -92,6 +97,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
|
|
|
92
97
|
- **Quantization** — BitsAndBytes, TorchAO, GGUF, SDNQ, optimum-quanto
|
|
93
98
|
- **Inference acceleration** — TeaCache, FirstBlockCache, FasterCache, MagCache, TaylorSeerCache
|
|
94
99
|
- **Prompt weighting** — A1111-style `(word:1.5)` syntax with long prompt support
|
|
100
|
+
- **Prompt library** — store prompts once in `prompts/` and reference them from any workflow as `prompt:name` or `prompt:folder/name`, with a web UI for browsing, editing, and AI-enhancing them
|
|
95
101
|
- **LoRA and IP-Adapter** support
|
|
96
102
|
- **Composable workflows** from multiple JSON files with `builtin:` references
|
|
97
103
|
- **Utility tasks** — upscaling, face restoration, segmentation, captioning, frame interpolation, QR codes, and more
|
|
@@ -135,6 +141,8 @@ Everything the engine does, in a browser backed by a persistent GPU worker — m
|
|
|
135
141
|
|
|
136
142
|

|
|
137
143
|
|
|
144
|
+
**A prompt library shared by every workflow.** Store a prompt once, reference it anywhere as `prompt:name` — the Prompts page browses, edits, and filters the library, and an *Enhance with AI* panel expands an idea into a full prompt with a local language model.
|
|
145
|
+
|
|
138
146
|
**A model manager for the disk your models actually consume.** The Hugging Face hub cache, inventoried: sizes, revisions, last-used dates, free space — download new models by id with live progress, delete with one click.
|
|
139
147
|
|
|
140
148
|

|
|
@@ -146,14 +154,14 @@ Jobs queue, stream progress live (per denoising step), cancel cooperatively, and
|
|
|
146
154
|
### Run a Workflow
|
|
147
155
|
|
|
148
156
|
```bash
|
|
149
|
-
python -m dw.run
|
|
150
|
-
python -m dw.run
|
|
157
|
+
python -m dw.run workflows/flux/FluxDev.json
|
|
158
|
+
python -m dw.run workflows/flux/FluxDev.json prompt="a cat" num_images_per_prompt=4
|
|
151
159
|
```
|
|
152
160
|
|
|
153
161
|
### Validate a Workflow
|
|
154
162
|
|
|
155
163
|
```bash
|
|
156
|
-
python -m dw.validate
|
|
164
|
+
python -m dw.validate workflows/flux/FluxDev.json
|
|
157
165
|
```
|
|
158
166
|
|
|
159
167
|
### Interactive REPL
|
|
@@ -313,13 +321,14 @@ a (photorealistic:1.4) portrait with (bright red hair:1.3) and [freckles]
|
|
|
313
321
|
|
|
314
322
|
**Interactive schema browser:** [View Schema](https://json-schema.app/view/%23?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdkackman%2Fdiffusers-workflow%2Frefs%2Fheads%2Fmaster%2Fdw%2Fworkflow_schema.json)
|
|
315
323
|
|
|
316
|
-
See [
|
|
324
|
+
See [workflows/](workflows/) for more workflow files.
|
|
317
325
|
|
|
318
326
|
## Documentation
|
|
319
327
|
|
|
320
328
|
### Guides
|
|
321
329
|
|
|
322
330
|
- [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
|
|
331
|
+
- [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
|
|
323
332
|
- [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
|
|
324
333
|
- [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
|
|
325
334
|
- [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
|
|
@@ -327,6 +336,7 @@ See [examples/](examples/) for more workflow files.
|
|
|
327
336
|
- [LoRA](docs/LORAS.md) — Loading and stacking LoRA adapters
|
|
328
337
|
- [IP-Adapter](docs/IP_ADAPTER.md) — Image-prompt conditioning
|
|
329
338
|
- [Prompt Weighting](docs/PROMPT_WEIGHTING.md) — A1111-style syntax
|
|
339
|
+
- [Prompt References](docs/WORKFLOW_GUIDE.md#prompt-references) — The stored prompt library and `prompt:` references
|
|
330
340
|
- [Tasks](docs/TASKS.md) — Image processing, ControlNet preprocessors, utilities
|
|
331
341
|
|
|
332
342
|
### Reference
|
{diffusers_workflow-0.4.0a4 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/SOURCES.txt
RENAMED
|
@@ -17,7 +17,9 @@ dw/hub_cache.py
|
|
|
17
17
|
dw/introspection.py
|
|
18
18
|
dw/log_setup.py
|
|
19
19
|
dw/previous_results.py
|
|
20
|
+
dw/prompt_schema.json
|
|
20
21
|
dw/prompt_weighting.py
|
|
22
|
+
dw/prompts.py
|
|
21
23
|
dw/repl.py
|
|
22
24
|
dw/repl_commands.py
|
|
23
25
|
dw/repl_worker.py
|
|
@@ -44,6 +46,7 @@ dw/pipeline_processors/pipeline.py
|
|
|
44
46
|
dw/pipeline_processors/remote.py
|
|
45
47
|
dw/server/__init__.py
|
|
46
48
|
dw/server/app.py
|
|
49
|
+
dw/server/enhancers.py
|
|
47
50
|
dw/server/jobs.py
|
|
48
51
|
dw/server/updater.py
|
|
49
52
|
dw/server/ui/index.html
|
|
@@ -61,45 +64,45 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
|
|
|
61
64
|
dw/server/ui/assets/csp-bTuwJoIa.js
|
|
62
65
|
dw/server/ui/assets/css-DIMkf-bt.js
|
|
63
66
|
dw/server/ui/assets/css.worker-B3ciXF_0.js
|
|
64
|
-
dw/server/ui/assets/cssMode-
|
|
67
|
+
dw/server/ui/assets/cssMode-DBf-T_da.js
|
|
65
68
|
dw/server/ui/assets/cypher-CVaqCwHa.js
|
|
66
69
|
dw/server/ui/assets/dart-onAF5SnQ.js
|
|
67
70
|
dw/server/ui/assets/dockerfile-DZFCIeNp.js
|
|
68
71
|
dw/server/ui/assets/ecl-D05T4iGw.js
|
|
69
72
|
dw/server/ui/assets/editor-jjEx9u7D.css
|
|
70
|
-
dw/server/ui/assets/editor.api-
|
|
73
|
+
dw/server/ui/assets/editor.api-B0D5Ygq7.js
|
|
71
74
|
dw/server/ui/assets/editor.worker-q-txB4vs.js
|
|
72
75
|
dw/server/ui/assets/elixir-6RTg0lbw.js
|
|
73
76
|
dw/server/ui/assets/flow9-C5_-GSwl.js
|
|
74
|
-
dw/server/ui/assets/freemarker2-
|
|
77
|
+
dw/server/ui/assets/freemarker2-Br8g4G1T.js
|
|
75
78
|
dw/server/ui/assets/fsharp-C8Ef5oNN.js
|
|
76
79
|
dw/server/ui/assets/go-C-y9NEjX.js
|
|
77
80
|
dw/server/ui/assets/graphql-fmXr3nnJ.js
|
|
78
|
-
dw/server/ui/assets/handlebars-
|
|
81
|
+
dw/server/ui/assets/handlebars-BKo1TaOF.js
|
|
79
82
|
dw/server/ui/assets/hcl-CpzslTdj.js
|
|
80
|
-
dw/server/ui/assets/html-
|
|
83
|
+
dw/server/ui/assets/html-Bis1seyM.js
|
|
81
84
|
dw/server/ui/assets/html.worker-C93Ht9o9.js
|
|
82
|
-
dw/server/ui/assets/htmlMode-
|
|
83
|
-
dw/server/ui/assets/index-
|
|
84
|
-
dw/server/ui/assets/index-
|
|
85
|
+
dw/server/ui/assets/htmlMode-D2SOD2MF.js
|
|
86
|
+
dw/server/ui/assets/index-D7eWnTCB.css
|
|
87
|
+
dw/server/ui/assets/index-JyFxgIR9.js
|
|
85
88
|
dw/server/ui/assets/ini-sBoK_t0W.js
|
|
86
89
|
dw/server/ui/assets/java-BEtHBSE6.js
|
|
87
|
-
dw/server/ui/assets/javascript-
|
|
90
|
+
dw/server/ui/assets/javascript-CkEbVb78.js
|
|
88
91
|
dw/server/ui/assets/json.worker-B2V3pomh.js
|
|
89
|
-
dw/server/ui/assets/jsonMode-
|
|
92
|
+
dw/server/ui/assets/jsonMode-dVJbYwxg.js
|
|
90
93
|
dw/server/ui/assets/julia-Bri6UV-V.js
|
|
91
94
|
dw/server/ui/assets/kotlin-BOotOW0E.js
|
|
92
95
|
dw/server/ui/assets/less-B9JPFI3C.js
|
|
93
96
|
dw/server/ui/assets/lexon-CfSJPG6W.js
|
|
94
|
-
dw/server/ui/assets/liquid-
|
|
95
|
-
dw/server/ui/assets/lspLanguageFeatures-
|
|
97
|
+
dw/server/ui/assets/liquid-Btak-6uF.js
|
|
98
|
+
dw/server/ui/assets/lspLanguageFeatures-BfeZZQbb.js
|
|
96
99
|
dw/server/ui/assets/lua-CsQS60Ue.js
|
|
97
100
|
dw/server/ui/assets/m3-D-oSqn_W.js
|
|
98
101
|
dw/server/ui/assets/markdown-Cimd5fb3.js
|
|
99
|
-
dw/server/ui/assets/mdx-
|
|
102
|
+
dw/server/ui/assets/mdx-D9KXK7-s.js
|
|
100
103
|
dw/server/ui/assets/mips-CIPQ_RoX.js
|
|
101
104
|
dw/server/ui/assets/monaco--ixms01u.css
|
|
102
|
-
dw/server/ui/assets/monaco-
|
|
105
|
+
dw/server/ui/assets/monaco-ZMCk_MWf.js
|
|
103
106
|
dw/server/ui/assets/msdax-DauUninz.js
|
|
104
107
|
dw/server/ui/assets/mysql-SOo6toE5.js
|
|
105
108
|
dw/server/ui/assets/objective-c-FvmIjYaQ.js
|
|
@@ -114,10 +117,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
|
|
|
114
117
|
dw/server/ui/assets/powershell-DmHpPYUd.js
|
|
115
118
|
dw/server/ui/assets/protobuf-C531GsRP.js
|
|
116
119
|
dw/server/ui/assets/pug-Z5eAx3Zn.js
|
|
117
|
-
dw/server/ui/assets/python-
|
|
120
|
+
dw/server/ui/assets/python-0FnO4xGM.js
|
|
118
121
|
dw/server/ui/assets/qsharp-DkqhCAOL.js
|
|
119
122
|
dw/server/ui/assets/r-BwWrilGY.js
|
|
120
|
-
dw/server/ui/assets/razor-
|
|
123
|
+
dw/server/ui/assets/razor-B6PMzeY4.js
|
|
121
124
|
dw/server/ui/assets/redis-ClamHrr6.js
|
|
122
125
|
dw/server/ui/assets/redshift-DT7zqm-g.js
|
|
123
126
|
dw/server/ui/assets/restructuredtext-BYgofb2h.js
|
|
@@ -137,15 +140,15 @@ dw/server/ui/assets/swift-Bxkupp3x.js
|
|
|
137
140
|
dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
|
|
138
141
|
dw/server/ui/assets/tcl-DISqw1ZD.js
|
|
139
142
|
dw/server/ui/assets/ts.worker-D7T1-Ig5.js
|
|
140
|
-
dw/server/ui/assets/tsMode-
|
|
143
|
+
dw/server/ui/assets/tsMode-nxyvZH1t.js
|
|
141
144
|
dw/server/ui/assets/twig-De2hgUGE.js
|
|
142
|
-
dw/server/ui/assets/typescript-
|
|
145
|
+
dw/server/ui/assets/typescript-BhBe8aGf.js
|
|
143
146
|
dw/server/ui/assets/typespec-B8J7ngcE.js
|
|
144
147
|
dw/server/ui/assets/vb-DV3o63ZY.js
|
|
145
148
|
dw/server/ui/assets/wgsl-DpFanUEy.js
|
|
146
|
-
dw/server/ui/assets/workers-
|
|
147
|
-
dw/server/ui/assets/xml-
|
|
148
|
-
dw/server/ui/assets/yaml-
|
|
149
|
+
dw/server/ui/assets/workers-ChAf-t8A.js
|
|
150
|
+
dw/server/ui/assets/xml-z2r9dHSO.js
|
|
151
|
+
dw/server/ui/assets/yaml-DrcHrz7f.js
|
|
149
152
|
dw/tasks/audio_utils.py
|
|
150
153
|
dw/tasks/background_remover.py
|
|
151
154
|
dw/tasks/borders.py
|
|
@@ -174,12 +177,23 @@ dw/workflows/augment_prompt.json
|
|
|
174
177
|
dw/workflows/describe_image.json
|
|
175
178
|
dw/workflows/h3_context_ir.json
|
|
176
179
|
dw/workflows/test.json
|
|
180
|
+
dw_mcp/__init__.py
|
|
181
|
+
dw_mcp/__main__.py
|
|
182
|
+
dw_mcp/authoring.py
|
|
183
|
+
dw_mcp/catalog.py
|
|
184
|
+
dw_mcp/client.py
|
|
185
|
+
dw_mcp/diagnose.py
|
|
186
|
+
dw_mcp/media.py
|
|
187
|
+
dw_mcp/models.py
|
|
188
|
+
dw_mcp/prompts.py
|
|
189
|
+
dw_mcp/server.py
|
|
177
190
|
tests/test_argument_updates.py
|
|
178
191
|
tests/test_arguments.py
|
|
179
192
|
tests/test_audio_utils.py
|
|
180
193
|
tests/test_borders.py
|
|
181
194
|
tests/test_cache_blocks.py
|
|
182
195
|
tests/test_chain.py
|
|
196
|
+
tests/test_cli.py
|
|
183
197
|
tests/test_component_pruning.py
|
|
184
198
|
tests/test_concat_videos.py
|
|
185
199
|
tests/test_config_objects.py
|
|
@@ -187,6 +201,7 @@ tests/test_configuration_schema.py
|
|
|
187
201
|
tests/test_depth_estimator.py
|
|
188
202
|
tests/test_device.py
|
|
189
203
|
tests/test_device_helpers.py
|
|
204
|
+
tests/test_device_portability.py
|
|
190
205
|
tests/test_diffusion_upscale.py
|
|
191
206
|
tests/test_docs_links.py
|
|
192
207
|
tests/test_events.py
|
|
@@ -199,18 +214,30 @@ tests/test_integration.py
|
|
|
199
214
|
tests/test_interpolate_frames.py
|
|
200
215
|
tests/test_introspection.py
|
|
201
216
|
tests/test_list_images.py
|
|
217
|
+
tests/test_mcp_authoring.py
|
|
218
|
+
tests/test_mcp_catalog.py
|
|
219
|
+
tests/test_mcp_client.py
|
|
220
|
+
tests/test_mcp_diagnose.py
|
|
221
|
+
tests/test_mcp_media.py
|
|
222
|
+
tests/test_mcp_models.py
|
|
223
|
+
tests/test_mcp_prompts.py
|
|
224
|
+
tests/test_mcp_server.py
|
|
202
225
|
tests/test_model_cache.py
|
|
203
226
|
tests/test_modular_pipeline.py
|
|
227
|
+
tests/test_offload_placement.py
|
|
204
228
|
tests/test_pair_audio.py
|
|
229
|
+
tests/test_phase_events.py
|
|
205
230
|
tests/test_pipeline_caching.py
|
|
206
231
|
tests/test_pipeline_components.py
|
|
207
232
|
tests/test_previous_results.py
|
|
208
233
|
tests/test_prompt_parser.py
|
|
209
234
|
tests/test_prompt_weighting.py
|
|
235
|
+
tests/test_prompts.py
|
|
210
236
|
tests/test_repl_commands.py
|
|
211
237
|
tests/test_repl_ergonomics.py
|
|
212
238
|
tests/test_repl_hierarchical.py
|
|
213
239
|
tests/test_repl_reorganization.py
|
|
240
|
+
tests/test_repl_worker.py
|
|
214
241
|
tests/test_resize_bucket.py
|
|
215
242
|
tests/test_result.py
|
|
216
243
|
tests/test_scheduler_config.py
|
|
@@ -138,6 +138,81 @@ def get_device_type(device=None):
|
|
|
138
138
|
return torch.device(device if device is not None else get_device()).type
|
|
139
139
|
|
|
140
140
|
|
|
141
|
+
def backend_available(device_type):
|
|
142
|
+
"""
|
|
143
|
+
Whether this machine can actually run on a backend.
|
|
144
|
+
|
|
145
|
+
Only the backends dw knows how to probe get an answer. An unrecognized one is
|
|
146
|
+
reported available rather than guessed at, so a device torch understands and dw
|
|
147
|
+
does not is left alone instead of being rewritten.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
device_type: Backend name ('cuda', 'mps', 'cpu', ...)
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
bool: Whether the backend is usable here
|
|
154
|
+
"""
|
|
155
|
+
if not _TORCH_AVAILABLE:
|
|
156
|
+
return device_type == "cpu"
|
|
157
|
+
|
|
158
|
+
if device_type == "cpu":
|
|
159
|
+
return True
|
|
160
|
+
|
|
161
|
+
if device_type == "cuda":
|
|
162
|
+
return torch.cuda.is_available()
|
|
163
|
+
|
|
164
|
+
if device_type == "mps":
|
|
165
|
+
return hasattr(torch.backends, "mps") and torch.backends.mps.is_available()
|
|
166
|
+
|
|
167
|
+
is_available = getattr(getattr(torch, device_type, None), "is_available", None)
|
|
168
|
+
return bool(is_available()) if callable(is_available) else True
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def resolve_device(requested):
|
|
172
|
+
"""
|
|
173
|
+
Translate a device a workflow asked for into one this machine has.
|
|
174
|
+
|
|
175
|
+
A device named in a workflow is nearly always the author saying 'the accelerator'
|
|
176
|
+
rather than 'specifically NVIDIA', so a workflow written on a CUDA box runs on a
|
|
177
|
+
Mac and back again. The backend is what gets translated - an index is left alone
|
|
178
|
+
when the backend matches, since 'cuda:1' on a single-GPU CUDA box is a genuine
|
|
179
|
+
mistake and not a portability problem. A CPU device is never rewritten: pinning a
|
|
180
|
+
step to the CPU is how a GPU-specific problem gets ruled out.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
requested: Device identifier from a workflow, or None for no override
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
The device to use, or None if None was passed
|
|
187
|
+
"""
|
|
188
|
+
if requested is None or not _TORCH_AVAILABLE:
|
|
189
|
+
return requested
|
|
190
|
+
|
|
191
|
+
try:
|
|
192
|
+
device = torch.device(requested)
|
|
193
|
+
except (RuntimeError, TypeError, ValueError):
|
|
194
|
+
# Not a device torch understands - let the failure surface where it is used
|
|
195
|
+
return requested
|
|
196
|
+
|
|
197
|
+
if device.type == "cpu" or backend_available(device.type):
|
|
198
|
+
return requested
|
|
199
|
+
|
|
200
|
+
target = get_device()
|
|
201
|
+
if device.index is not None:
|
|
202
|
+
logging.warning(
|
|
203
|
+
f"Workflow asks for '{requested}', which this machine has no {device.type} "
|
|
204
|
+
f"backend for - running on {target}. The device index is dropped, so a "
|
|
205
|
+
"workflow that meant to spread work across accelerators will not."
|
|
206
|
+
)
|
|
207
|
+
else:
|
|
208
|
+
logging.warning(
|
|
209
|
+
f"Workflow asks for '{requested}', which this machine has no {device.type} "
|
|
210
|
+
f"backend for - running on {target}"
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
return target
|
|
214
|
+
|
|
215
|
+
|
|
141
216
|
def get_autocast_device_type():
|
|
142
217
|
"""
|
|
143
218
|
Get the device type to use for torch.autocast.
|
|
@@ -3,6 +3,7 @@ import copy
|
|
|
3
3
|
import logging
|
|
4
4
|
from inspect import Parameter, signature
|
|
5
5
|
from .type_helpers import load_type_from_name, load_constant_from_name, has_method
|
|
6
|
+
from .prompts import PROMPT_PREFIX, fetch_prompt
|
|
6
7
|
from diffusers.utils import load_image, load_video
|
|
7
8
|
from .security import (
|
|
8
9
|
validate_path,
|
|
@@ -92,6 +93,11 @@ def realize_args(arg, base_dir=None):
|
|
|
92
93
|
# conventions below - what it holds is the value, not a file to load
|
|
93
94
|
if is_constant_reference(v):
|
|
94
95
|
arg[k] = fetch_constant(v)
|
|
96
|
+
# A stored prompt resolves the same way - to its text, under any
|
|
97
|
+
# name, before the media conventions could mistake it for a file.
|
|
98
|
+
# The workflow's directory anchors prompt-library discovery
|
|
99
|
+
elif is_prompt_reference(v):
|
|
100
|
+
arg[k] = fetch_prompt(v, base_dir=base_dir)
|
|
95
101
|
# An explicit media reference loads under any argument name - the
|
|
96
102
|
# key conventions below only cover arguments named like their media
|
|
97
103
|
elif is_media_reference(v):
|
|
@@ -140,6 +146,9 @@ def realize_args(arg, base_dir=None):
|
|
|
140
146
|
if is_constant_reference(item):
|
|
141
147
|
arg[i] = fetch_constant(item)
|
|
142
148
|
continue
|
|
149
|
+
if is_prompt_reference(item):
|
|
150
|
+
arg[i] = fetch_prompt(item, base_dir=base_dir)
|
|
151
|
+
continue
|
|
143
152
|
if is_media_reference(item):
|
|
144
153
|
arg[i] = fetch_media(item, base_dir)
|
|
145
154
|
continue
|
|
@@ -152,6 +161,11 @@ def is_constant_reference(value):
|
|
|
152
161
|
return isinstance(value, str) and value.startswith(CONSTANT_PREFIX)
|
|
153
162
|
|
|
154
163
|
|
|
164
|
+
def is_prompt_reference(value):
|
|
165
|
+
"""Whether a value references a stored prompt in the prompt library."""
|
|
166
|
+
return isinstance(value, str) and value.startswith(PROMPT_PREFIX)
|
|
167
|
+
|
|
168
|
+
|
|
155
169
|
def fetch_constant(reference):
|
|
156
170
|
"""Read the value a 'constant:' reference names.
|
|
157
171
|
|
|
@@ -703,12 +717,22 @@ def media_arguments(object_type, artifact):
|
|
|
703
717
|
arguments["sample_rate"] = sample_rate
|
|
704
718
|
return arguments
|
|
705
719
|
|
|
720
|
+
if audio is None and hasattr(artifact, "ndim") and artifact.ndim <= 3:
|
|
721
|
+
# A step that generates audio alone - a music pipeline, a slice_audio
|
|
722
|
+
# task - produces the waveform itself rather than an AudioVideo. It
|
|
723
|
+
# carries no rate of its own, so the reference declares 'sample_rate'
|
|
724
|
+
# alongside 'from_previous_result'
|
|
725
|
+
audio = torch.as_tensor(as_channels_samples(artifact))
|
|
726
|
+
|
|
706
727
|
if audio is None:
|
|
707
728
|
raise ValueError(
|
|
708
729
|
f"{object_type.__name__} holds audio, but the step it names produced "
|
|
709
730
|
f"none - reference a step that generates a soundtrack"
|
|
710
731
|
)
|
|
711
|
-
|
|
732
|
+
arguments = {"audio": audio}
|
|
733
|
+
if sample_rate is not None:
|
|
734
|
+
arguments["sample_rate"] = sample_rate
|
|
735
|
+
return arguments
|
|
712
736
|
|
|
713
737
|
|
|
714
738
|
def validate_media_location(location, base_dir=None):
|
|
@@ -76,3 +76,20 @@ def activate_context(context):
|
|
|
76
76
|
|
|
77
77
|
def deactivate_context(token):
|
|
78
78
|
_active_context.reset(token)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# The coarse states a run passes through. Small on purpose: a phase says what
|
|
82
|
+
# the run is waiting on, not what any one library is doing internally
|
|
83
|
+
PHASES = ("loading", "cached", "generating", "decoding", "saving", "task")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def emit_phase(phase, detail=None):
|
|
87
|
+
"""Report a coarse phase change on the active run.
|
|
88
|
+
|
|
89
|
+
A step spends most of its wall clock outside the denoise loop - pulling
|
|
90
|
+
weights, decoding latents, encoding video - and a step counter says
|
|
91
|
+
nothing about any of that. These are the rest of the story. They are rare
|
|
92
|
+
enough (a handful per step) to carry a free-text detail alongside, which
|
|
93
|
+
is what makes 'loading' readable as 'which model'.
|
|
94
|
+
"""
|
|
95
|
+
get_context().emit("phase", phase=phase, detail=detail)
|