Wires the committed services/comfyui + services/openwebui scaffold into a seamless image-gen + chat bundle (coexisting on a 2-GPU box): - services/comfyui/download_ideogram4.sh: fetch the Ideogram-4 fp8 set (2 transformers + Qwen3-VL-8B enc + flux2 VAE) into the ComfyUI models tree - services/comfyui: opt-in COMFYUI_CUDA_VISIBLE_DEVICES GPU pin (entrypoint guard; empty default = all GPUs, preserves current behavior) - services/openwebui: pin :v0.9.6; image-gen wired via imagegen.env (env_file, PersistentConfig — fresh-volume); default chat -> gemma-4-12b :8069 (LiteLLM alt) - scripts/gpu-mode.sh: `image-studio` mode — ComfyUI/Ideogram-4 on GPU0 + gemma-4-12b chat on GPU1 (compose_at_env passes env through sudo); :8069 status - scripts/setup-image-studio.sh: one-shot build + download + bring-up Config-validated (docker compose config, bash -n, gpu-mode usage); test suite 40/42 (2 failures pre-existing, unrelated). Docs (IMAGE_STUDIO.md + deltas) and live cutover validation to follow on this branch. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
15 lines
2.6 KiB
Bash
15 lines
2.6 KiB
Bash
# OpenWebUI image-generation config — Ideogram-4 on the ComfyUI backend.
|
|
# Loaded via `env_file:` in docker-compose.yml. These are OpenWebUI PersistentConfig
|
|
# keys: they apply on a FRESH data volume (first boot). On an EXISTING volume the DB
|
|
# value wins — reconfigure in Admin -> Settings -> Images (or recreate the volume).
|
|
# Workflow is the validated native-fp8 two-transformer (DualModelGuider) graph;
|
|
# node-map binds OpenWebUI's prompt/seed/size/steps inputs to the graph node ids.
|
|
ENABLE_IMAGE_GENERATION=true
|
|
IMAGE_GENERATION_ENGINE=comfyui
|
|
COMFYUI_BASE_URL=http://host.docker.internal:8188
|
|
IMAGE_GENERATION_MODEL=ideogram4_fp8_scaled.safetensors
|
|
IMAGE_SIZE=1024x1024
|
|
IMAGE_STEPS=20
|
|
COMFYUI_WORKFLOW={"unet_main":{"class_type":"UNETLoader","inputs":{"unet_name":"ideogram4_fp8_scaled.safetensors","weight_dtype":"default"}},"unet_uncond":{"class_type":"UNETLoader","inputs":{"unet_name":"ideogram4_unconditional_fp8_scaled.safetensors","weight_dtype":"default"}},"clip":{"class_type":"CLIPLoader","inputs":{"clip_name":"qwen3vl_8b_fp8_scaled.safetensors","type":"ideogram4"}},"vae":{"class_type":"VAELoader","inputs":{"vae_name":"flux2-vae.safetensors"}},"pos":{"class_type":"CLIPTextEncode","inputs":{"text":"placeholder","clip":["clip",0]}},"neg":{"class_type":"ConditioningZeroOut","inputs":{"conditioning":["pos",0]}},"guider":{"class_type":"DualModelGuider","inputs":{"model":["unet_main",0],"positive":["pos",0],"cfg":3.5,"model_negative":["unet_uncond",0],"negative":["neg",0]}},"sigmas":{"class_type":"Ideogram4Scheduler","inputs":{"steps":20,"width":1024,"height":1024,"mu":0.5,"std":1.75}},"sampler":{"class_type":"KSamplerSelect","inputs":{"sampler_name":"euler"}},"noise":{"class_type":"RandomNoise","inputs":{"noise_seed":42}},"latent":{"class_type":"EmptyFlux2LatentImage","inputs":{"width":1024,"height":1024,"batch_size":1}},"samp":{"class_type":"SamplerCustomAdvanced","inputs":{"noise":["noise",0],"guider":["guider",0],"sampler":["sampler",0],"sigmas":["sigmas",0],"latent_image":["latent",0]}},"decode":{"class_type":"VAEDecode","inputs":{"samples":["samp",0],"vae":["vae",0]}},"save":{"class_type":"SaveImage","inputs":{"images":["decode",0],"filename_prefix":"owui_ideogram4"}}}
|
|
COMFYUI_WORKFLOW_NODES=[{"type":"model","key":"unet_name","node_ids":["unet_main"]},{"type":"prompt","key":"text","node_ids":["pos"]},{"type":"width","key":"width","node_ids":["sigmas","latent"]},{"type":"height","key":"height","node_ids":["sigmas","latent"]},{"type":"steps","key":"steps","node_ids":["sigmas"]},{"type":"seed","key":"noise_seed","node_ids":["noise"]},{"type":"n","key":"batch_size","node_ids":["latent"]}]
|