Image-Text-to-Text
Transformers
Safetensors
English
qwen3_5
caid
blueprint
hardware
electronics
maker
structured-generation
json
qwen3.5
vision
unsloth
conversational
Instructions to use caid-technologies/parti-vision with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use caid-technologies/parti-vision with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="caid-technologies/parti-vision") 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)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("caid-technologies/parti-vision") model = AutoModelForMultimodalLM.from_pretrained("caid-technologies/parti-vision") 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=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use caid-technologies/parti-vision with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "caid-technologies/parti-vision" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "caid-technologies/parti-vision", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/caid-technologies/parti-vision
- SGLang
How to use caid-technologies/parti-vision 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 "caid-technologies/parti-vision" \ --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": "caid-technologies/parti-vision", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'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 "caid-technologies/parti-vision" \ --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": "caid-technologies/parti-vision", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Unsloth Studio
How to use caid-technologies/parti-vision with Unsloth Studio:
Install Unsloth Studio (macOS, Linux, WSL)
curl -fsSL https://unsloth.ai/install.sh | sh # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for caid-technologies/parti-vision to start chatting
Install Unsloth Studio (Windows)
irm https://unsloth.ai/install.ps1 | iex # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for caid-technologies/parti-vision to start chatting
Using HuggingFace Spaces for Unsloth
# No setup required # Open https://huggingface.co/spaces/unsloth/studio in your browser # Search for caid-technologies/parti-vision to start chatting
Load model with FastModel
pip install unsloth from unsloth import FastModel model, tokenizer = FastModel.from_pretrained( model_name="caid-technologies/parti-vision", max_seq_length=2048, ) - Docker Model Runner
How to use caid-technologies/parti-vision with Docker Model Runner:
docker model run hf.co/caid-technologies/parti-vision
| license: apache-2.0 | |
| language: | |
| - en | |
| tags: | |
| - caid | |
| - blueprint | |
| - hardware | |
| - electronics | |
| - maker | |
| - structured-generation | |
| - json | |
| - qwen3.5 | |
| - vision | |
| - unsloth | |
| pipeline_tag: image-text-to-text | |
| base_model: Qwen/Qwen3.5-9B | |
| base_model_relation: finetune | |
| library_name: transformers | |
| # Parti-Vision Base — Qwen3.5-9B | |
| **Parti-Vision turns a hardware idea — a sentence, a short brief, even a sketch — into a complete build blueprint.** | |
| Tell it what you want to build — *"a USB-powered desk lamp with touch dimming"* — and optionally | |
| hand it a short description document and/or a concept image (a hand-drawn sketch or a product | |
| render). It gives back one structured blueprint: the parts list, a pin-level wiring map, | |
| step-by-step build instructions, costs, and a description of how the finished product should | |
| look. Everything comes out as one clean JSON object that an app can read and build on. | |
| This is the **all-in-one model** — it runs on its own, no add-ons needed. | |
| > **Early research preview.** Great for drafting and exploring ideas — not a replacement for | |
| > real engineering, CAD software, or safety review. | |
| By [caid-technologies](https://huggingface.co/caid-technologies). | |
| --- | |
| ## What it can do | |
| Give it a hardware idea (and optionally a brief and/or a picture) and it produces **one complete | |
| project blueprint** containing: | |
| - 📋 a **parts list** (components) with roles and key specs | |
| - 🔌 a **pin-level wiring map** — which pin connects to which, net by net | |
| - 🛠️ ordered **build instructions**, from fabrication through assembly and testing | |
| - 💲 a **sourcing table** with per-part costs that add up to a stated total | |
| - 🎨 an **appearance spec** plus a ready-to-use **image-generation prompt** for concept renders | |
| - 🖼️ and it can **read images**: show it a napkin sketch or a product render and it designs to match | |
| Unlike a chat model, it answers with the whole plan at once — a single JSON object with ten | |
| sections (`project, requirements, components, relationships, circuit, fabrication, instructions, | |
| appearance, image_generation_prompt, sourcing`). | |
| ## What you can give it | |
| - ✍️ **A plain-English request** (always) — one or two sentences describing what you want to build. | |
| - 📄 **A short description document** (optional) — plain text or Markdown (a design brief, notes, | |
| a requirements list). The model can't open files itself: paste the document's text into the | |
| user message. It was trained with the document wrapped in markers, so use the same shape: | |
| ```text | |
| <your request> | |
| --- ATTACHED DOCUMENT: brief.md --- | |
| <the document text> | |
| --- END DOCUMENT --- | |
| ``` | |
| - 🖼️ **One concept image** (optional) — a **hand-drawn sketch** or a **product render**, passed | |
| as a regular vision input. Training images were PNGs; any format your image loader opens | |
| (PNG, JPEG, WebP, …) works, since it's decoded to pixels before the model sees it. One image | |
| per request is what it was trained on. | |
| Any combination works — prompt alone, prompt + document, prompt + image, or all three (the | |
| strongest setup in our testing). PDFs, CAD files, and spreadsheets aren't supported directly — | |
| convert them to text or an image first. | |
| ## What it's good for — and not | |
| ✅ **Good for:** brainstorming maker/electronics products, turning a rough idea (or a sketch) | |
| into an organized starting plan, and powering apps that need machine-readable project plans. | |
| 🚫 **Not for:** final engineering decisions, real CAD models, electrical safety, or anything | |
| safety-critical. Treat the output as a helpful **first draft to review**, not a finished design. | |
| ## Try it | |
| The model **answers in JSON directly** — no reasoning preamble to strip. (It ships a chat | |
| template that defaults to no-think; pass `enable_thinking=True` only if you deliberately want | |
| a reasoning trace.) | |
| ```python | |
| from unsloth import FastVisionModel | |
| REPO = "caid-technologies/parti-vision" | |
| model, tok = FastVisionModel.from_pretrained(REPO, load_in_4bit=False) | |
| FastVisionModel.for_inference(model) | |
| SYSTEM_PROMPT = ( | |
| "You design maker/electronics products. Reply with one JSON object with exactly these " | |
| "10 keys: project, requirements, components, relationships, circuit, fabrication, " | |
| "instructions, appearance, image_generation_prompt, sourcing. Output only the JSON." | |
| ) | |
| messages = [ | |
| {"role": "system", "content": [{"type": "text", "text": SYSTEM_PROMPT}]}, | |
| {"role": "user", "content": [{"type": "text", "text": "Design a USB desk lamp with touch dimming."}]}, | |
| ] | |
| text = tok.apply_chat_template(messages, add_generation_prompt=True, tokenize=False) | |
| inputs = tok(text=text, return_tensors="pt").to("cuda") | |
| out = model.generate(**inputs, max_new_tokens=13000, do_sample=False, repetition_penalty=1.1) | |
| print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)) | |
| ``` | |
| 💡 **Tip:** keep `do_sample=False` (greedy decoding), keep `max_new_tokens` high (≥ 13,000 — | |
| blueprints are long, and most parse failures are just plans cut off mid-sentence), and keep | |
| `repetition_penalty=1.1`. To include an image, add | |
| `{"type": "image", "image": your_image}` to the user content and pass `images=` to the tokenizer. | |
| 🚀 **Serving it for real?** Run it under **vLLM with structured output** (`guided_json` | |
| constrained to the ten-key blueprint schema). That's the intended production path — it takes | |
| valid-blueprint rates on unseen prompts from ~61% to **~97%** (see below). The bundled chat | |
| template carries over to vLLM automatically; if you override it, re-add | |
| `chat_template_kwargs={"enable_thinking": false}`. | |
| ## What it learned from | |
| It was trained on **150 synthetic maker/electronics products** — desk gadgets, lab tools, | |
| smart-home devices, audio gear and more, weighted toward hobbyist electronics. Every training | |
| record was machine-checked before inclusion: the circuit's pins had to exist on the named parts, | |
| the sourcing table had to add up, and the build steps had to come in a sensible order. | |
| Each product appears in **four flavors** — prompt only, prompt + brief, prompt + sketch, and | |
| prompt + brief + render — which is how the model learned to read documents and look at concept | |
| images, not just react to bare prompts. | |
| ## Good to know (limitations) | |
| - **English prompts, maker/electronics domain.** Off-topic requests still tend to get a | |
| blueprint rather than a refusal. | |
| - It **proposes** designs; it doesn't verify them. The plans are plausible engineering, not | |
| tested builds — review before you solder. | |
| - Roughly **half of outputs have at least one deep design slip** (a pin on the wrong net, | |
| costs that don't quite add up, a misordered step). Treat every blueprint as a draft and | |
| re-validate it in your app. | |
| - Very long plans can get **cut off at the token cap** — raise `max_new_tokens` and keep the | |
| repetition penalty on. | |
| - Contradictory or physically impossible requests can produce **confidently wrong** blueprints. | |
| ## How well it works | |
| We tested it on **60 held-out examples** (15 products it never saw in training × 4 input | |
| flavors) plus **42 fresh out-of-distribution prompts**, scoring every output against the real | |
| blueprint schema and semantic design checks. How often it produced a valid blueprint: | |
| | How you run it | In-distribution | Unseen realistic prompts | | |
| |---|---|---| | |
| | 📦 Plain (free) decoding | ~67% | ~61% | | |
| | ✅ With `guided_json` (recommended) | **~83%** | **~97%** | | |
| More context helps: the strongest input flavor (prompt + brief + render image) reached ~73% | |
| valid under plain decoding, with ~93% fidelity to what the prompt asked for. The deeper design | |
| checks (correct pins, costs that add up, ordered steps) pass on ~40–48% of outputs — which is | |
| why re-validating and regenerating on failure is part of the intended workflow. For comparison, | |
| the stock base model produced a valid blueprint **0%** of the time. | |
| --- | |
| <details> | |
| <summary><b>Technical details</b> (for ML folks)</summary> | |
| - **Base model:** `Qwen/Qwen3.5-9B` (Apache-2.0); this repo is the **fine-tune merged to | |
| 16-bit** (standalone, no adapter needed). | |
| - **Method:** LoRA with Unsloth (r=16, α=16, bf16) over language attention+MLP layers, vision | |
| encoder frozen, then merged. | |
| - **Training:** 3 epochs, max_seq_len 16384, on 150 schema- and gate-validated synthetic | |
| records × 4 input variants. Records authored by Claude Sonnet 5 and DeepSeek-V4-Pro; concept | |
| images (render + hand-drawn sketch per record) by gpt-image-1. | |
| - **Chat template:** patched to default to `enable_thinking=False` so the model emits JSON | |
| directly under transformers, Unsloth, and vLLM alike. | |
| - **Evaluation** (vLLM; strict parse = raw `json.loads`, no salvage; schema-valid = full | |
| pydantic `Product` validation; gates = pin existence, sourcing arithmetic, phase order): | |
| In-distribution, 60 held-out examples: | |
| | Metric | Fine-tuned — free | Fine-tuned — `guided_json` | Base Qwen3.5-9B | | |
| |---|---|---|---| | |
| | Strict JSON parse | 0.85 | 0.83 | 0.97 | | |
| | Schema-valid (`Product`) | 0.67 | **0.83** | 0.00 | | |
| | Gates-clean | 0.40 | 0.48 | 0.00 | | |
| | Prompt-echo fidelity | 0.82 | 0.82 | 0.00 | | |
| Out-of-distribution, 42 fresh prompts (free decoding): | |
| | kind | n | parse | schema | | |
| |---|---|---|---| | |
| | realistic paraphrase | 10 | 0.90 | 0.70 | | |
| | new domain | 10 | 0.90 | 0.70 | | |
| | vague / underspecified | 5 | 0.80 | 0.40 | | |
| | image-grounded | 6 | 0.83 | 0.50 | | |
| | adversarial | 7 | 0.43 | 0.29 | | |
| | off-task | 4 | 1.00 | 0.75 | | |
| Across realistic OOD rows, schema-valid is 0.61 free / **0.97** under `guided_json`. | |
| Sampling robustness at `temperature=0.7` (30 generations, 3 seeds): strict parse 0.97, | |
| schema-valid 0.57. Parse failures are overwhelmingly truncation at the 13k-token cap | |
| (10/126 free generations; 0 thinking-leaks, 0 markdown fences, 1 trailing-data). | |
| - **Inference:** `do_sample=False`, `repetition_penalty≈1.1`, `max_new_tokens≥13000`; serve | |
| with vLLM `guided_json` for production. | |
| ```bibtex | |
| @misc{parti_vision_base, | |
| title = {Parti-Vision Base: Qwen3.5-9B for multimodal hardware blueprint generation}, | |
| author = {Caid Technologies}, | |
| year = {2026}, | |
| howpublished = {\url{https://huggingface.co/caid-technologies}} | |
| } | |
| ``` | |
| Built with [Unsloth](https://github.com/unslothai/unsloth) and 🤗 Transformers / PEFT / TRL. | |
| </details> | |