3.5 KiB
3.5 KiB
OpenAI-Compatible HTTP Adapter for ComfyUI
Small FastAPI bridge that exposes POST /v1/images/generations (OpenAI format) and maps it to ComfyUI's POST /api/prompt.
When to use
- OpenWebUI, Bifrost, or any other tool that speaks OpenAI
/v1/images/generationsneeds to generate images with ComfyUI. - ComfyUI itself has no native OpenAI-compatible endpoint.
- The adapter is especially useful for FLUX.2 workflows that OpenWebUI's built-in ComfyUI connector cannot handle (different nodes: Qwen3VL,
EmptyFlux2LatentImage, TAEF2).
Architecture
OpenWebUI / Bifrost / Client
POST /v1/images/generations
|
v
[FastAPI Adapter] (Docker or systemd)
|
v
POST http://<comfyui>:8188/api/prompt
GET http://<comfyui>:8188/history/<prompt_id>
GET http://<comfyui>:8188/view
Example: Minimal FLUX.2 Adapter (Docker)
Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY adapter.py .
EXPOSE 9000
CMD ["uvicorn", "adapter:app", "--host", "0.0.0.0", "--port", "9000"]
requirements.txt
fastapi>=0.110.0
uvicorn>=0.29.0
httpx>=0.27.0
pydantic>=2.0.0
adapter.py — FLUX.2 Variant
The node names must match what is installed on the target ComfyUI instance.
Query the running server first with GET /object_info to confirm.
Key requirements for FLUX.2:
CLIPLoaderGGUFwith"type": "flux2"(loads Qwen3VL)EmptyFlux2LatentImage(128-channel latents)VAELoaderwith"vae_name": "taef2"(or dedicatedflux2_vae.safetensors)UnetLoaderGGUFwith the FLUX.2 UNet GGUF
See scripts/adapter_flux2.py for a ready-to-use file.
Build & run
docker build -t comfyui-openai-adapter:latest .
docker run -d --name comfyui-openai-adapter --network host \
-e COMFYUI_URL=http://10.0.30.97:8188 \
-e WORKFLOW_PREFIX=oai_adapter \
--restart unless-stopped \
comfyui-openai-adapter:latest
Verifying node availability
Before deploying the adapter, confirm the target ComfyUI instance has the required nodes:
curl -s http://<comfyui>:8188/object_info | \
python3 -c "import sys,json; d=json.load(sys.stdin); \
[print(f'{n}: {n in d}') for n in \
['CLIPLoaderGGUF','UnetLoaderGGUF','EmptyFlux2LatentImage','VAELoader','KSampler']]"
OpenWebUI configuration
Admin Panel → Settings → Images → Image Generation
| Setting | Value |
|---|---|
| Engine | Open AI |
| API Base URL | http://<adapter-ip>:9000/v1 |
| API Key | dummy (adapter does not enforce auth) |
| Model | flux2 |
Bifrost integration
Bifrost is an LLM gateway with no native ComfyUI provider. The adapter fills that gap:
- Register the adapter as an OpenAI-compatible provider in Bifrost, or
- Point OpenWebUI directly at the adapter (recommended; keeps image path separate from chat routing).
Pitfalls
- Node names are exact. Use
GET /object_infoto verify everyclass_typeexists; missing custom nodes produce cryptic "class_type not found" errors from ComfyUI. - Model names are exact and case-sensitive.
flux-2-klein-9b-Q4_K_S.gguf!=flux-2-klein-9b-q4_k_s.gguf. - TAEF2 vs full VAE.
taef2resolves tiny encoder/decoderpthfiles; the fullflux2_vae.safetensorsrequires manual download from a gated repo. - Seed injection. Always rewrite the seed per image when
n > 1; otherwise every image in the batch is identical. - Timeout tuning. FLUX.2 on ROCm gfx1150 takes ~110s for 1024x1024 @ 4 steps. Set
wait_for_imagetimeout >= 300s.