A Telegram bot written in Rust that can be connected to a Stable Diffusion web UI or ComfyUI backend to generate images.
The simplest way to install the bot is to use Cargo, the Rust package manager. If you don't already have it installed, follow the official instructions to install Rust.
Then you can simply install the bot:
cargo install --git https://github.com/capslock/stable-diffusion-bot
or a specific version:
cargo install --git https://github.com/capslock/stable-diffusion-bot --tag v0.1.0
If you don't already have Rust installed, see the above section.
Check out the project source:
git clone https://github.com/capslock/stable-diffusion-bot.git
And build the project:
cd stable-diffusion-bot
cargo build
Or cargo build --release
for a release build.
Output will be in the target/debug
(or target/release
) directory:
./target/debug/stable-diffusion-bot --help
After making changes, you can install your custom version using cargo
:
cargo install --path .
If you are using the Nix package manager with flakes enabled, you can invoke the bot directly from the provided flake:
nix run github:capslock/stable-diffusion-bot
If you are running NixOS, you can add the flake to your system flake.nix
to
use the provided module:
{
inputs.stable-diffusion-bot.url = "github:capslock/stable-diffusion-bot";
outputs = {
self,
nixpkgs,
stable-diffusion-bot
}: {
nixosConfigurations.<yourhostnamehere> = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
stable-diffusion-bot.nixosModules.default
];
};
};
}
Then simply configure and enable the service in your configuration.nix
:
services.stableDiffusionBot = {
enable = true;
telegramApiKeyFile = "/path/to/your/api/key/file.toml";
settings = {
# All other settings, as described below
allowed_users = [ list of telegram ids ];
db_path = "/path/to/your/db.sqlite";
sd_api_url = "http://localhost:7860";
};
};
If the above options don't suit you, you can use the pre-built docker container.
Docker support is minimal right now, but you can quickly get up and running using
docker run
and specifying configuration through environment variables and CLI
arguments:
docker run \
-e SD_TELEGRAM_API_KEY="your_api_key_here" \
-v /path/to/config.toml:/config.toml \
ghcr.io/capslock/stable-diffusion-bot:latest -c /config.toml
:construction: TODO: Expand this section.
allowed_users
list.Stable Diffusion web UI
and enable API access.
See the wiki.Create a config.toml
file:
# Replace this with your telegram bot API key
api_key = "your_telegram_bot_api_key"
# Replace this with the telegram IDs of users or chats that you want to allow
allowed_users = [ 123, 456, 789 ]
# Path to where the DB should be stored. If not provided, user settings are not persisted.
db_path = "./db.sqlite"
# URL of the backend to use to generate images.
sd_api_url = "http://localhost:7860"
api_key
is optional, and can instead be provided via the environment
variable SD_TELEGRAM_API_KEY
.allowed_users
must be supplied.db_path
is optional; user settings will not persist on bot restart if not
provided.sd_api_url
is required and should be set to the url of a
Stable Diffusion web UI
or ComfyUI
API instance.For ComfyUI, you'll additionally want to set the api_type
to "ComfyUI"
and
specify a workflow to use for text-to-image and image-to-image:
api_type = "ComfyUI"
[comfyui]
txt2img_prompt_file = "path/to/workflow_api.json"
img2img_prompt_file = "path/to/workflow_api.json"
api_type
is either "ComfyUI"
or "StableDiffusionWebUI"
(default).
Default if left unset.txt2img_prompt_file
should be a path to a ComfyUI
workflow in API format that generates
an image from a prompt.img2img_prompt_file
should be a path to a ComfyUI
workflow in API format that has a
LoadImage
node and generates an image based on that and a prompt.To get a workflow in API format, open your workflow in ComfyUI and check the "Enable Dev mode Options" box in the settings. Then, press the new "Save (API Format)" button below the normal "Save" button.
You can take a look at ComfyUI Examples for some example txt2img and img2img workflows.
stable-diffusion-bot
Alternatively, if you don't want to store your API key in the config file, you can pass it through as an environment variable:
SD_TELEGRAM_API_KEY="your_telegram_bot_api_key" stable-diffusion-bot
$ stable-diffusion-bot --help
Usage: stable-diffusion-bot [OPTIONS]
Options:
-c, --config <CONFIG> Path to the configuration file [default: config.toml]
--log-to-systemd Output logs directly to systemd
-h, --help Print help
/start
to get started./help
will list the available commands.txt2img
Send the bot a prompt and it will generate an image using the default generation settings. The reply will also have an inline keyboard, giving you options to:
img2img
Send the bot an image with a caption and it will generate a new image based on that image and the prompt.
allow_all_users = true
can be set to instead allow any user to
access the bot. Note that this means if someone finds your bot, there's no way
to stop them from using it to generate images.For ComfyUI, you can configure the base workflow to contain the default settings you want to use.
For the Stable Diffusion WebUI, you can set the default txt2img
and img2img
parameters via the config.toml
file:
[txt2img]
steps = 50
cfg_scale = 10
width = 768
height = 768
[img2img]
width = 768
height = 768
See the documentation for
Txt2ImgRequest
and
Img2ImgRequest
for all of the available options.
Here's a few tips for configuring the bot for use in a group chat:
allowed_users
to allow any user in
the chat to have access to the bot./slash
commands./gen
command in the caption of a photo to use img2img
in a
group chat.This projects consists of four crates:
stable-diffusion-bot
crate containing the main program and bot
implementation.stable-diffusion-api
crate containing a wrapper around the Stable
Diffusion web UI API.comfyui-api
crate containing a wrapper around the ComfyUI API.sal-e-api
crate containing a API abstraction layer over ComfyUI and
Stable Diffusion Web UI.All can be used as standalone libraries:
You can use this to integrate the full bot into another program. This crate does not expose much of an API surface for the bot aside from initial configuration structs.
cargo add --git https://github.com/capslock/stable-diffusion-bot stable-diffusion-bot
You can use these simple API bindings to build another application that utilizes the Stable Diffusion web UI API.
cargo add --git https://github.com/capslock/stable-diffusion-bot stable-diffusion-api
You can use these simple API bindings to build another application that utilizes the ComfyUI API.
cargo add --git https://github.com/capslock/stable-diffusion-bot comfyui-api
You can use these API bindings to build an application that accepts either a Stable Diffusion web UI API or ComfyUI API backend.
cargo add --git https://github.com/capslock/stable-diffusion-bot sal-e-api