Text Generation
Transformers
Safetensors
English
diffusion_gemma
image-text-to-text
diffusion-language-model
generative-ui
openui
openui-lang
gemma
conversational
Instructions to use thesysdev/OUI-1 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use thesysdev/OUI-1 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="thesysdev/OUI-1") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("thesysdev/OUI-1") model = AutoModelForMultimodalLM.from_pretrained("thesysdev/OUI-1", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use thesysdev/OUI-1 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "thesysdev/OUI-1" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "thesysdev/OUI-1", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/thesysdev/OUI-1
- SGLang
How to use thesysdev/OUI-1 with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "thesysdev/OUI-1" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "thesysdev/OUI-1", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "thesysdev/OUI-1" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "thesysdev/OUI-1", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use thesysdev/OUI-1 with Docker Model Runner:
docker model run hf.co/thesysdev/OUI-1
model card: lean results with the scoreboard chart
Browse files
README.md
CHANGED
|
@@ -36,52 +36,22 @@ left to right, which is what makes it fast enough to generate a screen while the
|
|
| 36 |
|
| 37 |
The [generative-ui-bench](https://github.com/thesysdev/generative-ui-bench) protocol: 46 screen
|
| 38 |
briefs in five size bands, 4 generations each, thinking off, one shared system prompt for every
|
| 39 |
-
model, scored by the benchmark's own validator
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
| Gemma 4 26B-A4B (autoregressive twin) | 4B | 55/184 (29.9%) |
|
| 49 |
-
| DiffusionGemma 26B-A4B-it (base, 48 denoising steps) | 4B | 24/184 (13.0%) |
|
| 50 |
-
|
| 51 |
-
By band (complete runs of 40/40/40/32/32): oui-1 38 · 34 · 24 · 19 · 17; Gemma 4 31B
|
| 52 |
-
17 · 18 · 26 · 14 · 11. oui-1 wins the two lighter bands, the dense band and the densest; the 31B keeps the medium band (26 to 24).
|
| 53 |
-
|
| 54 |
-
Temperature: the benchmark passes 0.7 to every model, but DiffusionGemma ignores per-request
|
| 55 |
-
temperature and seed (vLLM applies the checkpoint's own schedule, 0.8 annealing to 0.4 across the
|
| 56 |
-
denoising steps), so both diffusion rows ran at that fixed schedule. Thinking: off for both, the
|
| 57 |
-
benchmark's uniform condition. With thinking enabled oui-1 scores 119/184; it skips the thinking
|
| 58 |
-
channel in 167 of 184 outputs and the ones that think complete at the same rate.
|
| 59 |
-
|
| 60 |
-
On 100 fresh briefs written after training in the same numbered register (never seen by the
|
| 61 |
-
model, one generation each, internal scorer): 69/100.
|
| 62 |
-
|
| 63 |
-
Speed, 48 denoising steps, single request on one A100 80GB (vLLM 0.24 FP8, entropy-bound sampler,
|
| 64 |
-
wall-clock from request to last byte including the ~5k-token prompt), all 46 benchmark briefs,
|
| 65 |
-
median per band: lightest screens (~9 statements) 1.0 s, light (~15) 1.5 s, medium (~30) 2.8 s,
|
| 66 |
-
dense (~46) 4.6 s, densest (~64) 5.7 s; across the 46, median 2.6 s, p90 5.7 s, about 206
|
| 67 |
-
completion tokens per second of wall-clock (250 to 360 tokens per second after the first canvas).
|
| 68 |
-
The sampler stops early on its own (15 to 23 denoising steps per 256-token canvas on average), so
|
| 69 |
-
the step cap matters little above 32: on the public protocol 32 steps score 134/184, 48 (the
|
| 70 |
-
checkpoint default, used for every number here) 132/184, 64 steps 126/184; 16 steps collapse to
|
| 71 |
-
59/184 because the forced commit breaks the wiring. Four concurrent requests give about 54 screens
|
| 72 |
-
a minute at 170 aggregate tokens per second; on short screens the prompt prefill dominates and
|
| 73 |
-
does not batch well.
|
| 74 |
|
| 75 |
## What it was trained on
|
| 76 |
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
component library, and about 25 other component libraries (chat, dashboard, report, and synthetic
|
| 82 |
-
schemas) so that the model reads a schema rather than memorising one. The benchmark briefs were
|
| 83 |
-
among the briefs used to generate self-distillation data; the model never saw a human- or
|
| 84 |
-
teacher-written answer to them. The training set is not released.
|
| 85 |
|
| 86 |
## How to use
|
| 87 |
|
|
@@ -106,7 +76,8 @@ vllm serve thesysdev/OUI-1 --trust-remote-code --max-model-len 16384 --quantizat
|
|
| 106 |
```
|
| 107 |
|
| 108 |
Then call it as an OpenAI-compatible chat model. `temperature` and `seed` are ignored (diffusion
|
| 109 |
-
models use a fixed internal schedule)
|
|
|
|
| 110 |
|
| 111 |
```python
|
| 112 |
from openai import OpenAI
|
|
@@ -172,7 +143,7 @@ messages = [{"role": "system", "content": open("system-prompt.txt").read()},
|
|
| 172 |
{"role": "user", "content": brief}]
|
| 173 |
ids = processor.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt").to("cuda")
|
| 174 |
gc = model.generation_config # entropy-bound sampler, 48 steps, from the checkpoint
|
| 175 |
-
gc.max_new_tokens = 256 *
|
| 176 |
out = model.generate(input_ids=ids, generation_config=gc)
|
| 177 |
print(processor.decode(out.sequences[0, ids.shape[1]:], skip_special_tokens=True))
|
| 178 |
```
|
|
@@ -194,24 +165,6 @@ Cover every numbered item.
|
|
| 194 |
|
| 195 |
Plain-prose briefs also work; component names in the brief ("a table", "a chart") do not help.
|
| 196 |
|
| 197 |
-
## Known limitations
|
| 198 |
-
|
| 199 |
-
- **Long briefs.** Past roughly 18 numbered items the reference graph breaks: root commits to a
|
| 200 |
-
subset of sections and later ones are written but never attached.
|
| 201 |
-
- **Dense screens.** On the benchmark's medium band the model completes 24 of 40 runs against Gemma 4 31B's 26; on the densest band 17 of 32.
|
| 202 |
-
- **A stock cast.** The model reuses a small set of invented names, dates and numbers across
|
| 203 |
-
unrelated screens. Inject real data or names in the brief if it matters.
|
| 204 |
-
- **Valid is not the same as good.** Some parser-valid screens have tables with uneven column
|
| 205 |
-
lengths, a redefined name, or a boilerplate status tag. Render-time checks are advisable.
|
| 206 |
-
- **Positional slots on second-turn screens.** In multi-turn use (a tap sends the previous screen
|
| 207 |
-
back as context) the model sometimes drops a `null` from a five-slot component such as
|
| 208 |
-
`ListItem(title, subtitle, leading, trailing, action)`, which puts the action in the wrong slot. A
|
| 209 |
-
one-line rule in the system prompt fixes this in our testing; a lenient renderer also can.
|
| 210 |
-
- **Follow-ups.** Detail and confirmation screens often carry only one action.
|
| 211 |
-
- **Other libraries.** The model reads unseen component schemas and writes valid code for most
|
| 212 |
-
small screens, with fewer components than a native answer.
|
| 213 |
-
- **Empty or off-format input** produces a confident screen rather than a clarification.
|
| 214 |
-
|
| 215 |
## Intended use
|
| 216 |
|
| 217 |
Generating UI screens for OpenUI-based applications where latency matters and a small,
|
|
|
|
| 36 |
|
| 37 |
The [generative-ui-bench](https://github.com/thesysdev/generative-ui-bench) protocol: 46 screen
|
| 38 |
briefs in five size bands, 4 generations each, thinking off, one shared system prompt for every
|
| 39 |
+
model, scored by the benchmark's own validator. Base DiffusionGemma 24/184 (13.0%); oui-1
|
| 40 |
+
132/184 (71.7%). Raw outputs for oui-1 are committed to the benchmark repo so the number can be
|
| 41 |
+
rescored offline.
|
| 42 |
+
|
| 43 |
+

|
| 44 |
+
|
| 45 |
+
Every number here was measured with the serving settings below (vLLM 0.24, FP8, the checkpoint's
|
| 46 |
+
own sampler at 48 denoising steps). One request at a time on an A100 80GB, a light screen takes
|
| 47 |
+
about a second and a dense one three to six seconds, prompt included.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
## What it was trained on
|
| 50 |
|
| 51 |
+
Generated data only: screens written by larger models from briefs and kept when they passed the
|
| 52 |
+
openui-lang parser, then rounds of self-distillation on the model's own parser-checked outputs,
|
| 53 |
+
with near-misses minimally repaired. 27 component libraries in all, so the model reads a schema
|
| 54 |
+
rather than memorising one.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
|
| 56 |
## How to use
|
| 57 |
|
|
|
|
| 76 |
```
|
| 77 |
|
| 78 |
Then call it as an OpenAI-compatible chat model. `temperature` and `seed` are ignored (diffusion
|
| 79 |
+
models use a fixed internal schedule). The benchmark runs at `max_tokens` 8192; 4096 covers every
|
| 80 |
+
screen in the bands above.
|
| 81 |
|
| 82 |
```python
|
| 83 |
from openai import OpenAI
|
|
|
|
| 143 |
{"role": "user", "content": brief}]
|
| 144 |
ids = processor.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt").to("cuda")
|
| 145 |
gc = model.generation_config # entropy-bound sampler, 48 steps, from the checkpoint
|
| 146 |
+
gc.max_new_tokens = 256 * 32 # up to 32 canvases, the benchmark's 8,192 ceiling; EOS stops earlier
|
| 147 |
out = model.generate(input_ids=ids, generation_config=gc)
|
| 148 |
print(processor.decode(out.sequences[0, ids.shape[1]:], skip_special_tokens=True))
|
| 149 |
```
|
|
|
|
| 165 |
|
| 166 |
Plain-prose briefs also work; component names in the brief ("a table", "a chart") do not help.
|
| 167 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
## Intended use
|
| 169 |
|
| 170 |
Generating UI screens for OpenUI-based applications where latency matters and a small,
|