What it does
Give it a hardware idea and it returns, as one machine-readable JSON object, any of:
- 📋 a parts list
- 🔌 a wiring / connection map between the parts
- 🛠️ ordered build steps
- 💲 rough sourcing and cost
- ✅ a basic design check
- 📦 or the whole plan at once
Ask for the complete plan, or just one piece (like only the parts list).
Results
We test on projects it has never seen during training. How often it produces a valid,
well-structured result for each task:
Table with columns: Task, Valid result| Task | Valid result |
|---|
| 🛠️ Build steps | ~100% |
| ✅ Design check | ~100% |
| 📋 Parts list | ~95% |
| 📦 Full project plan | ~85–97% |
| 🔌 Wiring map | ~67% |
It's strongest at build steps, design checks, and parts lists; full end-to-end plans are close
behind; wiring maps are the hardest. Figures are from held-out testing and are being finalized
for the current version.
Because it's a small model, treat the output as a helpful first draft to review, not a
finished design.
Where it fits
- Reliable structured JSON from plain English on a small (3B) model that runs on modest
hardware.
- For images (sketches / renders), improved quality, and larger projects, use
parti-vision (9B, multimodal).
What you can give it
- A plain-English request — one or two sentences. Text only
Try it
from transformers import AutoModelForCausalLM, AutoTokenizer REPO = "caid-technologies/parti-base"model = AutoModelForCausalLM.from_pretrained(REPO, device_map="auto", torch_dtype="bfloat16")tok = AutoTokenizer.from_pretrained(REPO) msgs = [ {"role": "system", "content": "You design maker/electronics products. Given a request, reply with a single JSON object " "describing the complete build plan. Output only the JSON."}, {"role": "user", "content": "A compact desk clock with an e-ink display and an IR remote."},]inputs = tok.apply_chat_template( msgs, add_generation_prompt=True, return_tensors="pt", return_dict=True).to(model.device)out = model.generate(**inputs, max_new_tokens=6144, do_sample=False, repetition_penalty=1.1, pad_token_id=tok.eos_token_id)print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
💡 Tips: keep do_sample=False (greedy — sampling degrades the JSON), keep
max_new_tokens high (≥ 6000) so long plans aren't cut off, and keep repetition_penalty=1.1 so
wiring lists don't get stuck repeating. For Ollama / local apps, convert to GGUF with llama.cpp.
Good to know
- It's a small model, so complex, many-part projects are harder for it.
- It proposes designs; it doesn't verify them. Always sanity-check before building.
- It's strongest on common project types (lab tools, smart-home) and weaker on rarer ones.
Learn more
Citation
@misc{parti_base, title = {Parti-Base}, author = {Caid Technologies}, year = {2026}, howpublished = {\url{https://huggingface.co/caid-technologies}}}