Viyan

Viyan AI

AUTOMATIC1111, Rebuilt as 73 Nodes on a Gradio Canvas

Hugging Face rebuilt most of AUTOMATIC1111's feature set as a seventy-three-node Gradio Workflow, and the interesting part is what a node can now be.

AUTOMATIC1111's stable-diffusion-webui was a Python application with a tab per feature. Workflow1111 is that same feature set expressed as seventy-three nodes on a Gradio Workflow canvas: eleven media pipelines, four operator kinds, no extensions. Hugging Face published it as a Space you can sign into and run, with a walkthrough on its blog.

The unit of extension is what changed. A1111 gets its ControlNet-style annotators from an extension. Here, each one is an fn node written in plain NumPy with no model behind it, and on the demo's pre-loaded photo of a building facade each annotator takes about half a second on CPU.

Of the 36 operator nodes in the app, 32 are fn nodes, and 22 of those run entirely in-process with no network call. Roughly two-thirds of the canvas keeps working if you lose your connection. Because those nodes are ordinary Python functions, you can also test them directly, with no canvas, server, or GPU involved.

What a node is

Four kinds, each wrapping one operator. fn is a Python function. model is a model called through InferenceClient. space is another Gradio Space on the Hub. dataset is a row from a Hub dataset. An operator's inputs and outputs become ports, and you connect edges between them. That is the whole vocabulary.

It is enough vocabulary to stack pipelines. Text-to-image is a prompt-builder fn node that appends the selected style preset and cleans up the text, a model node that calls the checkpoint through Inference Providers, and a post-process fn node that writes the generation parameters into the PNG metadata on the way out. The exposed controls are the ones you would expect: negative prompt, steps, CFG, seed, width, height, and a model_id field for the checkpoint. The PNG Info pipeline reads back exactly what the post-process node wrote, the way A1111's parameters text chunk works.

Where it diverges from A1111

A1111 Workflow1111
Hi-res fix Upscale, then a second denoising pass Two-node detour through a FLUX.1-Kontext refine call
Interrogate CLIP Qwen2.5-VL writes a prompt; a ViT classifier returns labels. Both nodes share one image input and run in parallel
Inpaint mask Painted by hand DETR boxes converted into a mask locally with Pillow and NumPy
Prompt matrix One tab, N variants N separate text-to-image nodes; no loop operator exists
Annotators Supplied by the ControlNet extension NumPy fn nodes, about half a second each on CPU
Upscale Extras tab Lanczos in-process, or AuraSR ×4 as a Space call
Background removal Local model BRIA RMBG-2.0 as a Space call

The hi-res fix is the cleanest break. Instead of upscaling and running a second denoising pass, the txt2img output goes into a FLUX.1-Kontext model node with a refine instruction, "enhance fine detail and micro-texture, keep the composition identical," and comes back sharper and larger. The same Kontext node doubles as the image-to-image tab: upload an image, describe the change, get the edited image.

Interrogate is the other one worth looking at. Qwen2.5-VL reads a night-market photo and writes a prompt that could have produced it. A ViT classifier reads the same image and returns labels: restaurant 51.9%, tobacco shop 15.6%, toyshop 9.1%. Both nodes take the same image input, so the scheduler runs them in parallel and you get both answers in roughly the time it takes to run one. In a threaded application that is a goroutine or a Promise.all you have to write. Here it is two edges.

The architectural claim is stated plainly enough to quote:

There's no custom node involved, unlike in ComfyUI. In a Gradio workflow the LLM and the diffusion model are both ordinary model operators on the same canvas.

Where the graph's shape shows

The prompt matrix is the honest example of a graph not being a program. A base prompt, "a lone oak tree," gets combined with four suffixes (at sunrise, in a thunderstorm, under the Milky Way, in autumn fog) by an fn node, and each variant goes to its own text-to-image node. Because the four sit at the same dependency depth, they run at once, and a final node stitches the four results into one contact sheet.

That works beautifully at four. There is no loop operator in gr.Workflow, so forty variants means forty nodes on the canvas. The post does not say what you are supposed to do instead. This is the trade you make when the execution model is a static graph: parallelism you did not write, and fan-out you cannot express without drawing it.

Inpaint masks show the graph paying for itself. DETR finds six objects in a street photo, three people, a dog, a bicycle, and a car, and from there the workflow splits into two branches. One draws the detected boxes on the original image, the other turns them into a mask for a downstream inpaint pipeline. Both branches run locally with Pillow and NumPy. Only the detection call leaves the machine.

What it is actually demonstrating

Sign in with a Hugging Face account or an access token, and the model calls come out of your own quota. That detail matters more than the feature list. Workflow1111 is a demonstration of Inference Providers and of Space-to-Space calls as much as it is a rebuild of A1111.

Two of the pipelines are space nodes, meaning they call someone else's Space on the Hub. AuraSR ×4 handles one upscale path; the alternative is a Lanczos resample in an fn node, which needs no network call and finishes as fast as Pillow can resize. BRIA RMBG-2.0 handles background removal the same way. That is a different reliability profile from an extension running on your own machine: a Space can be cold, its concurrency is not yours to control, and its owner's quota is not your quota. The post gives no latency or cost figures for any of the hosted calls.

What holds up regardless is the testability argument. A ControlNet preprocessor is a hook into an application you did not write. A NumPy function that turns an image into a Canny edge map is a function you can unit test on a laptop. Same output, and only one of them requires launching the app to find out whether it works.

What is still open

Eleven pipelines are listed and most are walked through, but image-to-video appears in the list and is never described. There is no comparison of the Kontext refine pass against a genuine second denoising pass at matched settings, which is the number that would tell you whether the simplification costs image quality. And there is no timing for the parallel prompt matrix against four sequential generations, which is the claim the whole same-dependency-depth idea rests on.

The operator set is not about images. fn, model, space, dataset would describe a text pipeline, a retrieval pipeline, or an evaluation harness just as well. The diffusion rebuild is the demo; the primitives are the product. Whether they hold up is answered by whoever duplicates that Space and rewires it for a workload that has nothing to do with stable diffusion.

Sources