Name | comfy-catapult JSON |
Version |
3.0.0
JSON |
| download |
home_page | None |
Summary | Programmatically schedule ComfyUI workflows. |
upload_time | 2024-07-07 10:07:42 |
maintainer | None |
docs_url | None |
author | None |
requires_python | None |
license | MIT License Copyright (c) 2024 Azriel Fasten. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
keywords |
pipeline
scheduler
stable-diffusion
generative-ai
comfyui
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
<!--
WARNING: This file is auto-generated by snipinator. Do not edit directly.
SOURCE: `README.md.jinja2`.
-->
<!-- Note: This file is a jinja2 template of a Markdown file. -->
<!--
-->
# <div align="center">![Comfy Catapult][1]</div>
<div align="center">
<!-- Icons from https://lucide.dev/icons/users -->
<!-- Icons from https://lucide.dev/icons/laptop-minimal -->
![**Audience:** Developers][2] ![**Platform:** Linux][3]
</div>
<p align="center">
<strong>
<a href="https://github.com/realazthat/comfy-catapult">🏠Home</a>
•
<a href="#-features">🎇Features</a>
•
<a href="#-installation">🔨Installation</a>
•
<a href="#-usage">🚜Usage</a>
•
<a href="#-documentation">📘Documentation</a>
•
<a href="#-api">🤖API</a>
</strong>
</p>
<p align="center">
<strong>
<a href="#-requirements">✅Requirements</a>
•
<a href="#-command-line-options">💻CLI</a>
•
<a href="#-docker-image">🐳Docker</a>
•
<a href="#-limitations">🚸Limitations</a>
</strong>
</p>
<div align="center">
![Top language][4] ![GitHub License][5] [![PyPI - Version][6]][7]
[![Python Version][8]][7]
**Python library to programmatically schedule ComfyUI workflows via the ComfyUI
API**
</div>
---
<div align="center">
| Branch | Build Status | Commits Since | Last Commit |
| ------------- | --------------------------- | ------------------------- | ------------------ |
| [Master][9] | [![Build and Test][10]][11] | [![since tagged][12]][13] | ![last commit][14] |
| [Develop][15] | [![Build and Test][16]][17] | [![since tagged][18]][19] | ![last commit][20] |
</div>
```
ComfyUI API Endpoint <| <= Comfy Catapult <=> HTTP Server <| <= Public users
<| <|
<| Your python program <| Your Webui/JS frontend
<| <|
<| Your workflows <|
<| Your HTTP server <|
```
## What is it?
Comfy Catapult is a library for scheduling and running ComfyUI workflows from a
Python program, via the existing API endpoint. ComfyUI typically works by
hosting this API endpoint for its user interface.
This makes it easier for you to make workflows via the UI, and then use it from
a program.
## 🎇 Features
- ComfyUI API client
([interface](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/api_client_base.py),
[implementation](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/api_client.py)).
- ComfyUI Workflow scheduler
([interface](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult_base.py),
[implementation](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult.py)).
- ComfyUI API Pydantic Schema
([./comfy_catapult/comfy_schema.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/comfy_schema.py)).
- Helpers to handle uploading and downloading files to/from ComfyUI.
- Simple CLI to execute workflows.
## 🔨 Installation
```bash
# Inside your environment:
# From pypi:
pip install comfy_catapult
# From git:
pip install git+https://github.com/realazthat/comfy-catapult.git@v3.0.0
```
## 🚜 Usage
## Related Projects
| Project | ComfyUI API Wrapper | Outsource Backend | Distribute Execution | Wrap Workflow | Studio |
| --------------------------------- | ------------------- | ----------------- | -------------------- | ------------- | ------ |
| [CushyStudio][21] | ? | ? | ? | ? | Yes |
| [ComfyUI-Serving-Toolkit][22] | X | ? | ? | Yes | ? |
| [ComfyUI_NetDist][23] | X | ? | Yes | ? | ? |
| [ComfyUI script_examples][24] | Yes | No | No | No | No |
| [comfyui-python-api][25] | ? | ? | ? | Yes | ? |
| [comfyui-deploy][26] | ? | ? | ? | Yes | ? |
| [ComfyUI-to-Python-Extension][27] | ? | ? | ? | Yes | ? |
| [ComfyScript][28] | ? | ? | ? | Yes | ? |
| [hordelib][29] | ? | Yes | ? | ? | ? |
| [comfyui-cloud][30] | ? | Yes | ? | ? | ? |
| [comfy_runner][31] | ? | ? | ? | ? | ? |
| [ComfyUI-ComfyRun][32] | ? | ? | ? | ? | ? |
## 📘 Documentation
### Scheduling a Job
From
[`comfy_catapult/catapult_base.py`](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult_base.py):
````py
async def Catapult(
self,
*,
job_id: JobID,
prepared_workflow: dict,
important: Sequence[APINodeID],
use_future_api: Literal[True],
job_debug_path: Optional[Path] = None
) -> Tuple[JobStatus, 'asyncio.Future[dict]']:
````
### Example usage:
From
[`examples/sdxlturbo_example_catapulter.py`](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/sdxlturbo_example_catapulter.py):
````py
class ExampleWorkflowInfo:
# Direct wrapper around the ComfyUI API.
client: ComfyAPIClientBase
# Job scheduler (the main point of this library).
catapult: ComfyCatapultBase
# Something to help with retrieving files from the ComfyUI storage.
remote: RemoteFileAPIBase
comfy_api_url: str
# This should be the workflow json as a dict.
workflow_template_dict: dict
# This should begin as a deep copy of the template.
workflow_dict: dict
# This will hold the node ids that we must have results for.
important: List[APINodeID]
# Make this any string unique to this job.
job_id: str
# When the job is complete, this will be the `/history` json/dictionary for
# this job.
job_history_dict: Optional[dict]
# These are inputs that modify this particular workflow.
ckpt_name: Optional[str]
positive_prompt: str
negative_prompt: str
# For this particular workflow, this will define the path to the output image.
output_path: Path
````
````py
async def RunExampleWorkflow(*, job_info: ExampleWorkflowInfo):
# You have to write this function, to change the workflow_dict as you like.
await PrepareWorkflow(job_info=job_info)
job_id: str = job_info.job_id
workflow_dict: dict = job_info.workflow_dict
important: List[APINodeID] = job_info.important
# Here the magic happens, the job is submitted to the ComfyUI server.
status, future = await job_info.catapult.Catapult(
job_id=job_id,
prepared_workflow=workflow_dict,
important=important,
use_future_api=True)
# Wait for the job to complete.
while not future.done():
status, _ = await job_info.catapult.GetStatus(job_id=job_id)
print(f'status: {status}', file=sys.stderr)
await asyncio.sleep(3)
job_info.job_history_dict = await future
# Now that the job is done, you have to write something that will go and get
# the results you care about, if necessary.
await DownloadResults(job_info=job_info)
````
### Exporting workflows in the API json format
In ComfyUI web interface:
1. Open settings (gear box in the corner).
2. Enable the ability to export in the API format, `Enable Dev mode Options`.
3. Click new menu item `Save (API format)`.
![ComfyUI API format export instructions](https://raw.githubusercontent.com/realazthat/comfy-catapult/v3.0.0/.github/comfy-export-instructions.png)
### Example workflow: Prepare ComfyUI
**If you don't want to try the example workflow, you can skip this section.**
You need to get `sd_xl_turbo_1.0_fp16.safetensors` into the ComfyUI model
directory.
Hugging Face page:
[huggingface.co/stabilityai/sdxl-turbo/blob/main/sd_xl_turbo_1.0_fp16.safetensors](https://huggingface.co/stabilityai/sdxl-turbo/blob/main/sd_xl_turbo_1.0_fp16.safetensors).
Direct download link:
[huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0_fp16.safetensors](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0_fp16.safetensors).
### Download the example workflow, and export it in the API format
**This is optional, you can use the example workflow in `test_data/` instead and
skip this step.**
```bash
# Download the workflow:
wget https://github.com/comfyanonymous/ComfyUI_examples/raw/master/sdturbo/sdxlturbo_example.png
# 1. Open the Workflow in ComfyUI and export it. AFAIK there isn't a nice way
# to automated this right now.
#
# 2, Save to `./sdxlturbo_example_api.json`.
#
# Or just use `test_data/sdxlturbo_example_api.json`.
```
### Run the examples
```bash
# If you set this environment variable, you don't have to specify it as an
# argument.
export COMFY_API_URL=http://127.0.0.1:8188
# Note, in WSL2 you may have to use the IP of the host to connect to ComfyUI.
python -m comfy_catapult.examples.sdxlturbo_example_catapulter \
--api_workflow_json_path "$PWD/sdxlturbo_example_api.json" \
--tmp_path "$PWD/.deleteme/tmp/" \
--output_path "$PWD/.deleteme/output.png" \
--positive_prompt "amazing cloudscape, towering clouds, thunderstorm, awe" \
--negative_prompt "dull, blurry, nsfw"
# Optional if you don't want to set the environment variable:
# --comfy_api_url "..."
# Done! Now $PWD/.deleteme/output.png should contain the output image.
# Some other examples:
python -m comfy_catapult.examples.add_a_node
python -m comfy_catapult.examples.using_pydantic
```
### 🤖 API
- Examine [./examples/sdxlturbo_example_catapulter.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/sdxlturbo_example_catapulter.py) to
see how to use the main `ComfyCatapult` library.
- Examine [./test_data/sdxlturbo_example_api.json](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/test_data/sdxlturbo_example_api.json) to see
the API format. This will be necessary in order to programmatically set the
proper inputs for the workflow.
- (Optional) See [./examples/using_pydantic.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/using_pydantic.py) for how
to parse the API format into the Pydantic models schema for easier
navigation.
- (Optional) See [./examples/add_a_node.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/add_a_node.py) for how to
add a new node to a workflow. This is useful when you need to add nodes at
runtime (such as adding a bunch of LoadImage nodes).
- See [./comfy_catapult/catapult_base.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult_base.py) for the main
library interface.
- (Optional) See [./comfy_catapult/catapult.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult.py) for the
main library implementation.
- (Optional) See [./comfy_catapult/api_client_base.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/api_client_base.py) for
the direct ComfyUI API endpoint client library interface; you don't need to
use this usually.
- (Optional) For those who want to do use the raw API themselves and learn how
it works: Examine [./comfy_catapult/api_client.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/api_client.py) to see
the API client implementation if you want to directly interface with ComfyUI
endpoints yourself.
- (Optional) Also see
[ComfyUI/server.py](https://github.com/comfyanonymous/ComfyUI/blob/977eda19a6471fbff253dc92c3c2f1a4a67b1793/server.py#L99)
(pinned to a specific commit) for the server `@routes` endpoint
implementations.
### Parsing the API format into the Pydantic models schema for easier navigation
From [./examples/using_pydantic.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/using_pydantic.py):
````py
from comfy_catapult.comfy_schema import APIWorkflow
api_workflow_json_str: str = """
{
"1": {
"inputs": {
"image": "{remote_image_path} [input]",
"upload": "image"
},
"class_type": "LoadImage",
"_meta": {
"title": "My Loader Title"
}
},
"25": {
"inputs": {
"images": [
"8",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
}
}
"""
api_workflow: APIWorkflow = APIWorkflow.model_validate_json(
api_workflow_json_str)
# Or, if you have a APIWorkflow, and you want to deal with a dict instead:
api_workflow_dict = api_workflow.model_dump()
# Or, back to json:
api_workflow_json = api_workflow.model_dump_json()
# See comfy_catapult/comfyui_schema.py for the schema definition.
print(api_workflow_json)
````
### Adding a new node to a workflow
From [examples/add_a_node.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/add_a_node.py):
````py
from pathlib import Path
from comfy_catapult.comfy_schema import (APIWorkflow, APIWorkflowNodeInfo,
APIWorkflowNodeMeta)
from comfy_catapult.comfy_utils import GenerateNewNodeID
api_workflow_json_str: str = """
{
"1": {
"inputs": {
"image": "{remote_image_path} [input]",
"upload": "image"
},
"class_type": "LoadImage",
"_meta": {
"title": "My Loader Title"
}
},
"25": {
"inputs": {
"images": [
"8",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
}
}
"""
api_workflow: APIWorkflow = APIWorkflow.model_validate_json(
api_workflow_json_str)
path_to_comfy_input = Path('/path/to/ComfyUI/input')
path_to_image = path_to_comfy_input / 'image.jpg'
rel_path_to_image = path_to_image.relative_to(path_to_comfy_input)
# Add a new LoadImage node to the workflow.
new_node_id = GenerateNewNodeID(workflow=api_workflow)
api_workflow.root[new_node_id] = APIWorkflowNodeInfo(
inputs={
'image': f'{rel_path_to_image} [input]',
'upload': 'image',
},
class_type='LoadImage',
_meta=APIWorkflowNodeMeta(title='My Loader Title'))
print(api_workflow.model_dump_json())
````
### 💻 Command Line Options
Options:
<!---->
<img alt="Output of `python -m comfy_catapult.cli --help`" src="https://raw.githubusercontent.com/realazthat/comfy-catapult/v3.0.0/README.help.generated.svg"/>
<!-- -->
`execute` options:
<!---->
<img alt="Output of `python -m comfy_catapult.cli execute --help`" src="https://raw.githubusercontent.com/realazthat/comfy-catapult/v3.0.0/README.execute-help.generated.svg"/>
<!-- -->
Example usage:
````bash
python -m comfy_catapult.cli \
execute --workflow-path ./test_data/sdxlturbo_example_api.json
````
## ✅ Requirements
- Python 3.10+
- ComfyUI server with API endpoint enabled.
### Known to work on
- WSL2/Windows11, Ubuntu 22.04.2 LTS: **Python
3.8.0**.
- Ubuntu 20.04, Python `3.8.0, 3.9.0, 3.10.0, 3.11.0, 3.12.0`, tested in GitHub Actions
workflow ([./.github/workflows/build-and-test.yml](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/.github/workflows/build-and-test.yml)).
## 🐳 Docker Image
Docker images are published to [ghcr.io/realazthat/comfy-catapult][21] at each
tag.
```bash
# Use the published images at https://ghcr.io/realazthat/comfy-catapult.
docker run --rm --tty ghcr.io/realazthat/comfy-catapult:v3.0.0 --help
# /data in the docker image is the working directory, so paths are simpler.
docker run --rm --tty \
-v "${PWD}:/data" \
-e "COMFY_API_URL=${COMFY_API_URL}" \
ghcr.io/realazthat/comfy-catapult:v3.0.0 \
execute --workflow-path ./test_data/sdxlturbo_example_api.json
```
If you want to build the image yourself, you can use the Dockerfile in the
repository.
<!---->
```bash
# Build the docker image.
docker build -t my-comfy-catapult-image .
# Print usage.
docker run --rm --tty my-comfy-catapult-image --help
# /data in the docker image is the working directory, so paths are simpler.
docker run --rm --tty \
-v "${PWD}:/data" \
-e "COMFY_API_URL=${COMFY_API_URL}" \
my-comfy-catapult-image \
execute --workflow-path ./test_data/sdxlturbo_example_api.json
```
<!---->
## 🚸 Limitations
- Interrupting a job will interrupt any job, not the specific job interrupted.
See [#5](https://github.com/realazthat/comfy-catapult/issues/5).
## TODO
- [ ] Helpers should support remote/cloud storage for ComfyUI input/output/model
directories (Currently only supports local paths).
- [ ] ETA Estimator.
- [ ] Make sure the schema can parse the formats even if the format adds new
fields.
## Contributions
### Development environment: Linux-like
- For running `pre.sh` (Linux-like environment).
- From [./.github/dependencies.yml](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/.github/dependencies.yml), which is used for
the GH Action to do a fresh install of everything:
```yaml
bash: scripts.
findutils: scripts.
grep: tests.
xxd: tests.
git: scripts, tests.
xxhash: scripts (changeguard).
rsync: out-of-directory test.
jq: dependency for [yq](https://github.com/kislyuk/yq), which is used to generate
the README; the README generator needs to use `tomlq` (which is a part of `yq`)
to query `pyproject.toml`.
```
- Requires `pyenv`, or an exact matching version of python as in
[./.python-version](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/.python-version).
- `jq`, ([installation](https://jqlang.github.io/jq/)) required for
[yq](https://github.com/kislyuk/yq), which is itself required for our
`./README.md` generation, which uses `tomlq` (from the
[yq](https://github.com/kislyuk/yq) package) to include version strings from
[./pyproject.toml](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/pyproject.toml).
- act (to run the GH Action locally):
- Requires nodejs.
- Requires Go.
- docker.
- Generate animation:
- docker
- docker (for building the docker image).
### Commit Process
1. (Optionally) Fork the `develop` branch.
2. Stage your files: `git add path/to/file.py`.
3. `bash scripts/pre.sh`, this will format, lint, and test the code.
4. `git status` check if anything changed (generated `./README.md`
for example), if so, `git add` the changes, and go back to the previous step.
5. `git commit -m "..."`.
6. Make a PR to `develop` (or push to develop if you have the rights).
## Release Process
These instructions are for maintainers of the project.
1. `develop` branch: Run `bash ./scripts/pre.sh` to ensure
everything is in order.
2. `develop` branch: Bump the version in
[./pyproject.toml](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/pyproject.toml), following semantic versioning
principles. Also modify the `last_release` and `last_stable_release` in the
`[tool.comfy_catapult-project-metadata]` table as appropriate.
3. `develop` branch: Commit these changes with a message like "Prepare release
X.Y.Z". (See the contributions section [above](#commit-process)).
4. `master` branch: Merge the `develop` branch into the `master` branch:
`git checkout master && git merge develop --no-ff`.
5. `master` branch: Tag the release: Create a git tag for the release with
`git tag -a vX.Y.Z -m "Version X.Y.Z"`.
6. Publish to PyPI: Publish the release to PyPI with
`bash ./scripts/utilities/deploy-to-pypi.sh`.
7. Push to GitHub: Push the commit and tags to GitHub with `git push` and
`git push --tags`.
8. `git checkout develop && git merge master` The `--no-ff` option adds a commit
to the master branch for the merge, so refork the develop branch from the
master branch.
9. `git push origin develop` Push the develop branch to GitHub.
[1]: https://raw.githubusercontent.com/realazthat/comfy-catapult/v3.0.0/.github/logo-exported.svg
[2]: https://img.shields.io/badge/Audience-Developers-0A1E1E?style=plastic&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLXVzZXJzIj48cGF0aCBkPSJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIvPjxjaXJjbGUgY3g9IjkiIGN5PSI3IiByPSI0Ii8+PHBhdGggZD0iTTIyIDIxdi0yYTQgNCAwIDAgMC0zLTMuODciLz48cGF0aCBkPSJNMTYgMy4xM2E0IDQgMCAwIDEgMCA3Ljc1Ii8+PC9zdmc+
[3]: https://img.shields.io/badge/Platform-Linux-0A1E1E?style=plastic&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWxhcHRvcC1taW5pbWFsIj48cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTIiIHg9IjMiIHk9IjQiIHJ4PSIyIiByeT0iMiIvPjxsaW5lIHgxPSIyIiB4Mj0iMjIiIHkxPSIyMCIgeTI9IjIwIi8+PC9zdmc+
[4]: https://img.shields.io/github/languages/top/realazthat/comfy-catapult.svg?style=plastic&color=0A1E1E&cacheSeconds=28800
[5]: https://img.shields.io/github/license/realazthat/comfy-catapult?style=plastic&color=0A1E1E
[6]: https://img.shields.io/pypi/v/comfy_catapult?style=plastic&color=0A1E1E
[7]: https://pypi.org/project/comfy_catapult/
[8]: https://img.shields.io/pypi/pyversions/comfy_catapult?style=plastic&color=0A1E1E
[9]: https://github.com/realazthat/comfy-catapult/tree/master
[10]: https://img.shields.io/github/actions/workflow/status/realazthat/comfy-catapult/build-and-test.yml?branch=master&style=plastic
[11]: https://github.com/realazthat/comfy-catapult/actions/workflows/build-and-test.yml
[12]: https://img.shields.io/github/commits-since/realazthat/comfy-catapult/v3.0.0/master?style=plastic&color=0A1E1E
[13]: https://github.com/realazthat/comfy-catapult/compare/v3.0.0...master
[14]: https://img.shields.io/github/last-commit/realazthat/comfy-catapult/master?style=plastic&color=0A1E1E
[15]: https://github.com/realazthat/comfy-catapult/tree/develop
[16]: https://img.shields.io/github/actions/workflow/status/realazthat/comfy-catapult/build-and-test.yml?branch=develop&style=plastic
[17]: https://github.com/realazthat/comfy-catapult/actions/workflows/build-and-test.yml
[18]: https://img.shields.io/github/commits-since/realazthat/comfy-catapult/v3.0.0/develop?style=plastic&color=0A1E1E
[19]: https://github.com/realazthat/comfy-catapult/compare/v3.0.0...develop
[20]: https://img.shields.io/github/last-commit/realazthat/comfy-catapult/develop?style=plastic&color=0A1E1E
[21]: https://github.com/rvion/CushyStudio
[22]: https://github.com/matan1905/ComfyUI-Serving-Toolkit
[23]: https://github.com/city96/ComfyUI_NetDist
[24]: https://github.com/comfyanonymous/ComfyUI/tree/89d0e9abeb31e44cccef46537cd10d8812130ef3/script_examples "Permalink"
[25]: https://github.com/andreyryabtsev/comfyui-python-api
[26]: https://github.com/BennyKok/comfyui-deploy
[27]: https://github.com/pydn/ComfyUI-to-Python-Extension
[28]: https://github.com/Chaoses-Ib/ComfyScript
[29]: https://pypi.org/project/hordelib/
[30]: https://github.com/nathannlu/comfyui-cloud
[31]: https://github.com/piyushK52/comfy_runner
[32]: https://github.com/thecooltechguy/ComfyUI-ComfyRun
Raw data
{
"_id": null,
"home_page": null,
"name": "comfy-catapult",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "pipeline, scheduler, stable-diffusion, generative-ai, comfyui",
"author": null,
"author_email": "AYF <realazthat@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/d5/ed/5d2b379469fa237917745932edb7dcb4f902c9137bf2bcb8410f8c7a7b5d/comfy_catapult-3.0.0.tar.gz",
"platform": null,
"description": "<!--\n\nWARNING: This file is auto-generated by snipinator. Do not edit directly.\nSOURCE: `README.md.jinja2`.\n\n-->\n<!-- Note: This file is a jinja2 template of a Markdown file. -->\n<!--\n\n\n\n\n\n\n\n-->\n\n# <div align=\"center\">![Comfy Catapult][1]</div>\n\n<div align=\"center\">\n<!-- Icons from https://lucide.dev/icons/users -->\n<!-- Icons from https://lucide.dev/icons/laptop-minimal -->\n\n![**Audience:** Developers][2] ![**Platform:** Linux][3]\n\n</div>\n\n<p align=\"center\">\n <strong>\n <a href=\"https://github.com/realazthat/comfy-catapult\">\ud83c\udfe0Home</a>\n • \n <a href=\"#-features\">\ud83c\udf87Features</a>\n • \n <a href=\"#-installation\">\ud83d\udd28Installation</a>\n • \n <a href=\"#-usage\">\ud83d\ude9cUsage</a>\n • \n <a href=\"#-documentation\">\ud83d\udcd8Documentation</a>\n • \n <a href=\"#-api\">\ud83e\udd16API</a>\n </strong>\n</p>\n\n<p align=\"center\">\n <strong>\n <a href=\"#-requirements\">\u2705Requirements</a>\n • \n <a href=\"#-command-line-options\">\ud83d\udcbbCLI</a>\n • \n <a href=\"#-docker-image\">\ud83d\udc33Docker</a>\n • \n <a href=\"#-limitations\">\ud83d\udeb8Limitations</a>\n </strong>\n</p>\n\n<div align=\"center\">\n\n![Top language][4] ![GitHub License][5] [![PyPI - Version][6]][7]\n[![Python Version][8]][7]\n\n**Python library to programmatically schedule ComfyUI workflows via the ComfyUI\nAPI**\n\n</div>\n\n---\n\n<div align=\"center\">\n\n| Branch | Build Status | Commits Since | Last Commit |\n| ------------- | --------------------------- | ------------------------- | ------------------ |\n| [Master][9] | [![Build and Test][10]][11] | [![since tagged][12]][13] | ![last commit][14] |\n| [Develop][15] | [![Build and Test][16]][17] | [![since tagged][18]][19] | ![last commit][20] |\n\n</div>\n\n```\nComfyUI API Endpoint <| <= Comfy Catapult <=> HTTP Server <| <= Public users\n <| <|\n <| Your python program <| Your Webui/JS frontend\n <| <|\n <| Your workflows <|\n <| Your HTTP server <|\n```\n\n## What is it?\n\nComfy Catapult is a library for scheduling and running ComfyUI workflows from a\nPython program, via the existing API endpoint. ComfyUI typically works by\nhosting this API endpoint for its user interface.\n\nThis makes it easier for you to make workflows via the UI, and then use it from\na program.\n\n## \ud83c\udf87 Features\n\n- ComfyUI API client\n ([interface](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/api_client_base.py),\n [implementation](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/api_client.py)).\n- ComfyUI Workflow scheduler\n ([interface](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult_base.py),\n [implementation](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult.py)).\n- ComfyUI API Pydantic Schema\n ([./comfy_catapult/comfy_schema.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/comfy_schema.py)).\n- Helpers to handle uploading and downloading files to/from ComfyUI.\n- Simple CLI to execute workflows.\n\n## \ud83d\udd28 Installation\n\n```bash\n# Inside your environment:\n\n# From pypi:\npip install comfy_catapult\n\n# From git:\npip install git+https://github.com/realazthat/comfy-catapult.git@v3.0.0\n```\n\n## \ud83d\ude9c Usage\n\n## Related Projects\n\n| Project | ComfyUI API Wrapper | Outsource Backend | Distribute Execution | Wrap Workflow | Studio |\n| --------------------------------- | ------------------- | ----------------- | -------------------- | ------------- | ------ |\n| [CushyStudio][21] | ? | ? | ? | ? | Yes |\n| [ComfyUI-Serving-Toolkit][22] | X | ? | ? | Yes | ? |\n| [ComfyUI_NetDist][23] | X | ? | Yes | ? | ? |\n| [ComfyUI script_examples][24] | Yes | No | No | No | No |\n| [comfyui-python-api][25] | ? | ? | ? | Yes | ? |\n| [comfyui-deploy][26] | ? | ? | ? | Yes | ? |\n| [ComfyUI-to-Python-Extension][27] | ? | ? | ? | Yes | ? |\n| [ComfyScript][28] | ? | ? | ? | Yes | ? |\n| [hordelib][29] | ? | Yes | ? | ? | ? |\n| [comfyui-cloud][30] | ? | Yes | ? | ? | ? |\n| [comfy_runner][31] | ? | ? | ? | ? | ? |\n| [ComfyUI-ComfyRun][32] | ? | ? | ? | ? | ? |\n\n## \ud83d\udcd8 Documentation\n\n### Scheduling a Job\n\nFrom\n[`comfy_catapult/catapult_base.py`](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult_base.py):\n\n````py\n async def Catapult(\n self,\n *,\n job_id: JobID,\n prepared_workflow: dict,\n important: Sequence[APINodeID],\n use_future_api: Literal[True],\n job_debug_path: Optional[Path] = None\n ) -> Tuple[JobStatus, 'asyncio.Future[dict]']:\n````\n\n### Example usage:\n\nFrom\n[`examples/sdxlturbo_example_catapulter.py`](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/sdxlturbo_example_catapulter.py):\n\n````py\nclass ExampleWorkflowInfo:\n # Direct wrapper around the ComfyUI API.\n client: ComfyAPIClientBase\n # Job scheduler (the main point of this library).\n catapult: ComfyCatapultBase\n # Something to help with retrieving files from the ComfyUI storage.\n remote: RemoteFileAPIBase\n comfy_api_url: str\n\n # This should be the workflow json as a dict.\n workflow_template_dict: dict\n # This should begin as a deep copy of the template.\n workflow_dict: dict\n # This will hold the node ids that we must have results for.\n important: List[APINodeID]\n\n # Make this any string unique to this job.\n job_id: str\n\n # When the job is complete, this will be the `/history` json/dictionary for\n # this job.\n job_history_dict: Optional[dict]\n\n # These are inputs that modify this particular workflow.\n ckpt_name: Optional[str]\n positive_prompt: str\n negative_prompt: str\n # For this particular workflow, this will define the path to the output image.\n output_path: Path\n````\n\n````py\nasync def RunExampleWorkflow(*, job_info: ExampleWorkflowInfo):\n\n # You have to write this function, to change the workflow_dict as you like.\n await PrepareWorkflow(job_info=job_info)\n\n job_id: str = job_info.job_id\n workflow_dict: dict = job_info.workflow_dict\n important: List[APINodeID] = job_info.important\n\n # Here the magic happens, the job is submitted to the ComfyUI server.\n status, future = await job_info.catapult.Catapult(\n job_id=job_id,\n prepared_workflow=workflow_dict,\n important=important,\n use_future_api=True)\n\n # Wait for the job to complete.\n while not future.done():\n status, _ = await job_info.catapult.GetStatus(job_id=job_id)\n print(f'status: {status}', file=sys.stderr)\n await asyncio.sleep(3)\n\n job_info.job_history_dict = await future\n\n # Now that the job is done, you have to write something that will go and get\n # the results you care about, if necessary.\n await DownloadResults(job_info=job_info)\n````\n\n### Exporting workflows in the API json format\n\nIn ComfyUI web interface:\n\n1. Open settings (gear box in the corner).\n2. Enable the ability to export in the API format, `Enable Dev mode Options`.\n3. Click new menu item `Save (API format)`.\n\n![ComfyUI API format export instructions](https://raw.githubusercontent.com/realazthat/comfy-catapult/v3.0.0/.github/comfy-export-instructions.png)\n\n### Example workflow: Prepare ComfyUI\n\n**If you don't want to try the example workflow, you can skip this section.**\n\nYou need to get `sd_xl_turbo_1.0_fp16.safetensors` into the ComfyUI model\ndirectory.\n\nHugging Face page:\n[huggingface.co/stabilityai/sdxl-turbo/blob/main/sd_xl_turbo_1.0_fp16.safetensors](https://huggingface.co/stabilityai/sdxl-turbo/blob/main/sd_xl_turbo_1.0_fp16.safetensors).\n\nDirect download link:\n[huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0_fp16.safetensors](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0_fp16.safetensors).\n\n### Download the example workflow, and export it in the API format\n\n**This is optional, you can use the example workflow in `test_data/` instead and\nskip this step.**\n\n```bash\n# Download the workflow:\nwget https://github.com/comfyanonymous/ComfyUI_examples/raw/master/sdturbo/sdxlturbo_example.png\n\n# 1. Open the Workflow in ComfyUI and export it. AFAIK there isn't a nice way\n# to automated this right now.\n#\n# 2, Save to `./sdxlturbo_example_api.json`.\n#\n# Or just use `test_data/sdxlturbo_example_api.json`.\n```\n\n### Run the examples\n\n```bash\n\n\n# If you set this environment variable, you don't have to specify it as an\n# argument.\nexport COMFY_API_URL=http://127.0.0.1:8188\n# Note, in WSL2 you may have to use the IP of the host to connect to ComfyUI.\n\n\npython -m comfy_catapult.examples.sdxlturbo_example_catapulter \\\n --api_workflow_json_path \"$PWD/sdxlturbo_example_api.json\" \\\n --tmp_path \"$PWD/.deleteme/tmp/\" \\\n --output_path \"$PWD/.deleteme/output.png\" \\\n --positive_prompt \"amazing cloudscape, towering clouds, thunderstorm, awe\" \\\n --negative_prompt \"dull, blurry, nsfw\"\n\n# Optional if you don't want to set the environment variable:\n# --comfy_api_url \"...\"\n\n# Done! Now $PWD/.deleteme/output.png should contain the output image.\n\n# Some other examples:\npython -m comfy_catapult.examples.add_a_node\npython -m comfy_catapult.examples.using_pydantic\n\n```\n\n### \ud83e\udd16 API\n\n- Examine [./examples/sdxlturbo_example_catapulter.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/sdxlturbo_example_catapulter.py) to\n see how to use the main `ComfyCatapult` library.\n- Examine [./test_data/sdxlturbo_example_api.json](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/test_data/sdxlturbo_example_api.json) to see\n the API format. This will be necessary in order to programmatically set the\n proper inputs for the workflow.\n - (Optional) See [./examples/using_pydantic.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/using_pydantic.py) for how\n to parse the API format into the Pydantic models schema for easier\n navigation.\n - (Optional) See [./examples/add_a_node.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/add_a_node.py) for how to\n add a new node to a workflow. This is useful when you need to add nodes at\n runtime (such as adding a bunch of LoadImage nodes).\n- See [./comfy_catapult/catapult_base.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult_base.py) for the main\n library interface.\n- (Optional) See [./comfy_catapult/catapult.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/catapult.py) for the\n main library implementation.\n- (Optional) See [./comfy_catapult/api_client_base.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/api_client_base.py) for\n the direct ComfyUI API endpoint client library interface; you don't need to\n use this usually.\n- (Optional) For those who want to do use the raw API themselves and learn how\n it works: Examine [./comfy_catapult/api_client.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/comfy_catapult/api_client.py) to see\n the API client implementation if you want to directly interface with ComfyUI\n endpoints yourself.\n - (Optional) Also see\n [ComfyUI/server.py](https://github.com/comfyanonymous/ComfyUI/blob/977eda19a6471fbff253dc92c3c2f1a4a67b1793/server.py#L99)\n (pinned to a specific commit) for the server `@routes` endpoint\n implementations.\n\n### Parsing the API format into the Pydantic models schema for easier navigation\n\nFrom [./examples/using_pydantic.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/using_pydantic.py):\n\n````py\n\nfrom comfy_catapult.comfy_schema import APIWorkflow\n\napi_workflow_json_str: str = \"\"\"\n{\n \"1\": {\n \"inputs\": {\n \"image\": \"{remote_image_path} [input]\",\n \"upload\": \"image\"\n },\n \"class_type\": \"LoadImage\",\n \"_meta\": {\n \"title\": \"My Loader Title\"\n }\n },\n \"25\": {\n \"inputs\": {\n \"images\": [\n \"8\",\n 0\n ]\n },\n \"class_type\": \"PreviewImage\",\n \"_meta\": {\n \"title\": \"Preview Image\"\n }\n }\n}\n\"\"\"\napi_workflow: APIWorkflow = APIWorkflow.model_validate_json(\n api_workflow_json_str)\n\n# Or, if you have a APIWorkflow, and you want to deal with a dict instead:\napi_workflow_dict = api_workflow.model_dump()\n\n# Or, back to json:\napi_workflow_json = api_workflow.model_dump_json()\n\n# See comfy_catapult/comfyui_schema.py for the schema definition.\n\nprint(api_workflow_json)\n\n````\n\n### Adding a new node to a workflow\n\nFrom [examples/add_a_node.py](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/examples/add_a_node.py):\n\n````py\n\nfrom pathlib import Path\n\nfrom comfy_catapult.comfy_schema import (APIWorkflow, APIWorkflowNodeInfo,\n APIWorkflowNodeMeta)\nfrom comfy_catapult.comfy_utils import GenerateNewNodeID\n\napi_workflow_json_str: str = \"\"\"\n{\n \"1\": {\n \"inputs\": {\n \"image\": \"{remote_image_path} [input]\",\n \"upload\": \"image\"\n },\n \"class_type\": \"LoadImage\",\n \"_meta\": {\n \"title\": \"My Loader Title\"\n }\n },\n \"25\": {\n \"inputs\": {\n \"images\": [\n \"8\",\n 0\n ]\n },\n \"class_type\": \"PreviewImage\",\n \"_meta\": {\n \"title\": \"Preview Image\"\n }\n }\n}\n\"\"\"\napi_workflow: APIWorkflow = APIWorkflow.model_validate_json(\n api_workflow_json_str)\n\npath_to_comfy_input = Path('/path/to/ComfyUI/input')\npath_to_image = path_to_comfy_input / 'image.jpg'\nrel_path_to_image = path_to_image.relative_to(path_to_comfy_input)\n\n# Add a new LoadImage node to the workflow.\nnew_node_id = GenerateNewNodeID(workflow=api_workflow)\napi_workflow.root[new_node_id] = APIWorkflowNodeInfo(\n inputs={\n 'image': f'{rel_path_to_image} [input]',\n 'upload': 'image',\n },\n class_type='LoadImage',\n _meta=APIWorkflowNodeMeta(title='My Loader Title'))\n\nprint(api_workflow.model_dump_json())\n\n````\n\n### \ud83d\udcbb Command Line Options\n\nOptions:\n\n<!---->\n<img alt=\"Output of `python -m comfy_catapult.cli --help`\" src=\"https://raw.githubusercontent.com/realazthat/comfy-catapult/v3.0.0/README.help.generated.svg\"/>\n<!-- -->\n\n`execute` options:\n\n<!---->\n<img alt=\"Output of `python -m comfy_catapult.cli execute --help`\" src=\"https://raw.githubusercontent.com/realazthat/comfy-catapult/v3.0.0/README.execute-help.generated.svg\"/>\n<!-- -->\n\nExample usage:\n\n````bash\n\npython -m comfy_catapult.cli \\\n execute --workflow-path ./test_data/sdxlturbo_example_api.json\n\n````\n\n## \u2705 Requirements\n\n- Python 3.10+\n- ComfyUI server with API endpoint enabled.\n\n### Known to work on\n\n- WSL2/Windows11, Ubuntu 22.04.2 LTS: **Python\n 3.8.0**.\n- Ubuntu 20.04, Python `3.8.0, 3.9.0, 3.10.0, 3.11.0, 3.12.0`, tested in GitHub Actions\n workflow ([./.github/workflows/build-and-test.yml](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/.github/workflows/build-and-test.yml)).\n\n## \ud83d\udc33 Docker Image\n\nDocker images are published to [ghcr.io/realazthat/comfy-catapult][21] at each\ntag.\n\n```bash\n# Use the published images at https://ghcr.io/realazthat/comfy-catapult.\ndocker run --rm --tty ghcr.io/realazthat/comfy-catapult:v3.0.0 --help\n\n# /data in the docker image is the working directory, so paths are simpler.\ndocker run --rm --tty \\\n -v \"${PWD}:/data\" \\\n -e \"COMFY_API_URL=${COMFY_API_URL}\" \\\n ghcr.io/realazthat/comfy-catapult:v3.0.0 \\\n execute --workflow-path ./test_data/sdxlturbo_example_api.json\n```\n\nIf you want to build the image yourself, you can use the Dockerfile in the\nrepository.\n\n<!---->\n```bash\n\n# Build the docker image.\ndocker build -t my-comfy-catapult-image .\n\n# Print usage.\ndocker run --rm --tty my-comfy-catapult-image --help\n\n# /data in the docker image is the working directory, so paths are simpler.\ndocker run --rm --tty \\\n -v \"${PWD}:/data\" \\\n -e \"COMFY_API_URL=${COMFY_API_URL}\" \\\n my-comfy-catapult-image \\\n execute --workflow-path ./test_data/sdxlturbo_example_api.json\n\n```\n<!---->\n\n## \ud83d\udeb8 Limitations\n\n- Interrupting a job will interrupt any job, not the specific job interrupted.\n See [#5](https://github.com/realazthat/comfy-catapult/issues/5).\n\n## TODO\n\n- [ ] Helpers should support remote/cloud storage for ComfyUI input/output/model\n directories (Currently only supports local paths).\n- [ ] ETA Estimator.\n- [ ] Make sure the schema can parse the formats even if the format adds new\n fields.\n\n## Contributions\n\n### Development environment: Linux-like\n\n- For running `pre.sh` (Linux-like environment).\n\n - From [./.github/dependencies.yml](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/.github/dependencies.yml), which is used for\n the GH Action to do a fresh install of everything:\n\n ```yaml\n bash: scripts.\n findutils: scripts.\n grep: tests.\n xxd: tests.\n git: scripts, tests.\n xxhash: scripts (changeguard).\n rsync: out-of-directory test.\n jq: dependency for [yq](https://github.com/kislyuk/yq), which is used to generate\n the README; the README generator needs to use `tomlq` (which is a part of `yq`)\n to query `pyproject.toml`.\n\n ```\n\n - Requires `pyenv`, or an exact matching version of python as in\n [./.python-version](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/.python-version).\n - `jq`, ([installation](https://jqlang.github.io/jq/)) required for\n [yq](https://github.com/kislyuk/yq), which is itself required for our\n `./README.md` generation, which uses `tomlq` (from the\n [yq](https://github.com/kislyuk/yq) package) to include version strings from\n [./pyproject.toml](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/pyproject.toml).\n - act (to run the GH Action locally):\n - Requires nodejs.\n - Requires Go.\n - docker.\n - Generate animation:\n - docker\n - docker (for building the docker image).\n\n### Commit Process\n\n1. (Optionally) Fork the `develop` branch.\n2. Stage your files: `git add path/to/file.py`.\n3. `bash scripts/pre.sh`, this will format, lint, and test the code.\n4. `git status` check if anything changed (generated `./README.md`\n for example), if so, `git add` the changes, and go back to the previous step.\n5. `git commit -m \"...\"`.\n6. Make a PR to `develop` (or push to develop if you have the rights).\n\n## Release Process\n\nThese instructions are for maintainers of the project.\n\n1. `develop` branch: Run `bash ./scripts/pre.sh` to ensure\n everything is in order.\n2. `develop` branch: Bump the version in\n [./pyproject.toml](https://github.com/realazthat/comfy-catapult/blob/v3.0.0/pyproject.toml), following semantic versioning\n principles. Also modify the `last_release` and `last_stable_release` in the\n `[tool.comfy_catapult-project-metadata]` table as appropriate.\n3. `develop` branch: Commit these changes with a message like \"Prepare release\n X.Y.Z\". (See the contributions section [above](#commit-process)).\n4. `master` branch: Merge the `develop` branch into the `master` branch:\n `git checkout master && git merge develop --no-ff`.\n5. `master` branch: Tag the release: Create a git tag for the release with\n `git tag -a vX.Y.Z -m \"Version X.Y.Z\"`.\n6. Publish to PyPI: Publish the release to PyPI with\n `bash ./scripts/utilities/deploy-to-pypi.sh`.\n7. Push to GitHub: Push the commit and tags to GitHub with `git push` and\n `git push --tags`.\n8. `git checkout develop && git merge master` The `--no-ff` option adds a commit\n to the master branch for the merge, so refork the develop branch from the\n master branch.\n9. `git push origin develop` Push the develop branch to GitHub.\n\n[1]: https://raw.githubusercontent.com/realazthat/comfy-catapult/v3.0.0/.github/logo-exported.svg\n[2]: https://img.shields.io/badge/Audience-Developers-0A1E1E?style=plastic&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLXVzZXJzIj48cGF0aCBkPSJNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg2YTQgNCAwIDAgMC00IDR2MiIvPjxjaXJjbGUgY3g9IjkiIGN5PSI3IiByPSI0Ii8+PHBhdGggZD0iTTIyIDIxdi0yYTQgNCAwIDAgMC0zLTMuODciLz48cGF0aCBkPSJNMTYgMy4xM2E0IDQgMCAwIDEgMCA3Ljc1Ii8+PC9zdmc+\n[3]: https://img.shields.io/badge/Platform-Linux-0A1E1E?style=plastic&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWxhcHRvcC1taW5pbWFsIj48cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTIiIHg9IjMiIHk9IjQiIHJ4PSIyIiByeT0iMiIvPjxsaW5lIHgxPSIyIiB4Mj0iMjIiIHkxPSIyMCIgeTI9IjIwIi8+PC9zdmc+\n[4]: https://img.shields.io/github/languages/top/realazthat/comfy-catapult.svg?style=plastic&color=0A1E1E&cacheSeconds=28800\n[5]: https://img.shields.io/github/license/realazthat/comfy-catapult?style=plastic&color=0A1E1E\n[6]: https://img.shields.io/pypi/v/comfy_catapult?style=plastic&color=0A1E1E\n[7]: https://pypi.org/project/comfy_catapult/\n[8]: https://img.shields.io/pypi/pyversions/comfy_catapult?style=plastic&color=0A1E1E\n[9]: https://github.com/realazthat/comfy-catapult/tree/master\n[10]: https://img.shields.io/github/actions/workflow/status/realazthat/comfy-catapult/build-and-test.yml?branch=master&style=plastic\n[11]: https://github.com/realazthat/comfy-catapult/actions/workflows/build-and-test.yml\n[12]: https://img.shields.io/github/commits-since/realazthat/comfy-catapult/v3.0.0/master?style=plastic&color=0A1E1E\n[13]: https://github.com/realazthat/comfy-catapult/compare/v3.0.0...master\n[14]: https://img.shields.io/github/last-commit/realazthat/comfy-catapult/master?style=plastic&color=0A1E1E\n[15]: https://github.com/realazthat/comfy-catapult/tree/develop\n[16]: https://img.shields.io/github/actions/workflow/status/realazthat/comfy-catapult/build-and-test.yml?branch=develop&style=plastic\n[17]: https://github.com/realazthat/comfy-catapult/actions/workflows/build-and-test.yml\n[18]: https://img.shields.io/github/commits-since/realazthat/comfy-catapult/v3.0.0/develop?style=plastic&color=0A1E1E\n[19]: https://github.com/realazthat/comfy-catapult/compare/v3.0.0...develop\n[20]: https://img.shields.io/github/last-commit/realazthat/comfy-catapult/develop?style=plastic&color=0A1E1E\n[21]: https://github.com/rvion/CushyStudio\n[22]: https://github.com/matan1905/ComfyUI-Serving-Toolkit\n[23]: https://github.com/city96/ComfyUI_NetDist\n[24]: https://github.com/comfyanonymous/ComfyUI/tree/89d0e9abeb31e44cccef46537cd10d8812130ef3/script_examples \"Permalink\"\n[25]: https://github.com/andreyryabtsev/comfyui-python-api\n[26]: https://github.com/BennyKok/comfyui-deploy\n[27]: https://github.com/pydn/ComfyUI-to-Python-Extension\n[28]: https://github.com/Chaoses-Ib/ComfyScript\n[29]: https://pypi.org/project/hordelib/\n[30]: https://github.com/nathannlu/comfyui-cloud\n[31]: https://github.com/piyushK52/comfy_runner\n[32]: https://github.com/thecooltechguy/ComfyUI-ComfyRun\n",
"bugtrack_url": null,
"license": "MIT License Copyright (c) 2024 Azriel Fasten. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
"summary": "Programmatically schedule ComfyUI workflows.",
"version": "3.0.0",
"project_urls": {
"Documentation": "https://github.com/realazthat/comfy-catapult",
"Homepage": "https://github.com/realazthat/comfy-catapult",
"Repository": "https://github.com/realazthat/comfy-catapult"
},
"split_keywords": [
"pipeline",
" scheduler",
" stable-diffusion",
" generative-ai",
" comfyui"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "63b75cbc0418732083f3bbc9079c486f2c8a080bc2665009e6b4b2e1da69ca2d",
"md5": "7bf1f2a28c3f40fe54d9729b24432aa1",
"sha256": "1c8d31ac7390e8257d3f41aa3e16d9be69c37728e0a553c81837aa3edd6bcc90"
},
"downloads": -1,
"filename": "comfy_catapult-3.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7bf1f2a28c3f40fe54d9729b24432aa1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 55525,
"upload_time": "2024-07-07T10:07:40",
"upload_time_iso_8601": "2024-07-07T10:07:40.669078Z",
"url": "https://files.pythonhosted.org/packages/63/b7/5cbc0418732083f3bbc9079c486f2c8a080bc2665009e6b4b2e1da69ca2d/comfy_catapult-3.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d5ed5d2b379469fa237917745932edb7dcb4f902c9137bf2bcb8410f8c7a7b5d",
"md5": "0a3038d28a80326adfd8cf3bbe87ef7e",
"sha256": "acb77052ba2f4464f1c91373308f956f9516b186c05a13e355791c147d1da519"
},
"downloads": -1,
"filename": "comfy_catapult-3.0.0.tar.gz",
"has_sig": false,
"md5_digest": "0a3038d28a80326adfd8cf3bbe87ef7e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 62834,
"upload_time": "2024-07-07T10:07:42",
"upload_time_iso_8601": "2024-07-07T10:07:42.605210Z",
"url": "https://files.pythonhosted.org/packages/d5/ed/5d2b379469fa237917745932edb7dcb4f902c9137bf2bcb8410f8c7a7b5d/comfy_catapult-3.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-07 10:07:42",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "realazthat",
"github_project": "comfy-catapult",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "comfy-catapult"
}