Loading…
Loading…
A 1.2M-parameter model that builds CAD parts in FreeCAD.
Taiga-S1 is an experiment in whether small, fast decision models can be useful for computer-use agents: a planner decides what to do, and a tiny model handles the step-by-step execution. FreeCAD is the testbed. The next step is the same approach for applications without a scripting API, using the operating system's accessibility tree as the interface.
Taiga-S1 is the fast "System 1" layer for a CAD agent. You give it a goal, an ordered list of features like "plate 40×30×10 → Ø6 hole at (10, 0) → polar pattern ×6 → fillet the top edges". It builds the part command by command: select a plane, sketch, draw, constrain, pad, pattern, fillet. At every step it reads FreeCAD's live state (feature tree, selection, sketch constraints, workbench) and picks the next command from the ones currently available.
| Goal | Built correctly | With 20% random actions injected |
|---|---|---|
| Parts like the training set (1–5 features) | 100% | 93–100% |
| 6–7 features | 100% | 86% |
| 8–9 features | 100% | 87% |
| 11 features (~55 commands) | 100% | 90% |
| 13 / 15 / 17 features | 100 / 100 / 95% | – |
| Feature combinations never seen in training | 90–100% | 94–97% |
"Built correctly" means the model finished and the final solid matches the target exactly (volumetric IoU ≥ 0.99, no stray objects). Each row is 100 fresh synthetic goals (same feature vocabulary as training, longer or recombined) in FreeCAD 1.1 (60 per length for 13–17 features). Per-step accuracy against the teacher's choices is 99.8%.
from freecad_s1.model.net import from_pretrained
from freecad_s1.rollout import Policy
model = from_pretrained("shhivv/taiga-s1")
policy = Policy(model, device="cpu")
probs = policy.score(state, goal, actions) # {command: probability}, best first
next_command = next(iter(probs))
What to pass in:
state: a snapshot of the FreeCAD session, from the included runtime (freecad_s1.runtime).goal: the ordered feature list, plus a rough size of the finished part (bounding box, volume). Estimates are fine.actions: the commands currently available in FreeCAD, as returned by the runtime's valid_actions().The returned probabilities are calibrated. The fitted temperature is stored in config.json.
Scope. It covers FreeCAD PartDesign workflows: sketches (rectangle, circle, hexagon), pad, pocket, hole, revolve, linear and polar patterns, mirror, fillet, chamfer and shell. Taiga-S1 chooses the command; numeric values come from the goal.
@misc{taiga_s1_2026,
title = {Taiga-S1: a small next-action model for CAD},
author = {Shanmugam, Shiv},
year = {2026}
}