Fusion Needle
Version 0.2.0
Fusion Needle is a fine-tune of Needle 3 by Cactus Compute for one job: turning one written modelling step ("ร6 hole at (10, 0)") into tool calls for Autodesk Fusion. It is the model behind the Fusion Needle desktop app, which sends each call to Fusion through the MCP server that Fusion itself provides.
- Input: one feature in plain English, a one-line design state, and up to five tool schemas.
- Output: 0 to 4 tool calls from a catalogue of 47 narrow tools (JSON, constrained by the engine's grammar).
- Runs: on the CPU, through Cactus's
needleengine. No cloud service is involved. - Files:
fusion-mcp-20L.cact(63.4 MB),fusion-mcp-8L.cact(27.4 MB)
What is new in 0.2.0
47 tools instead of 33. The 14 added tools cover requests that 0.1.0 could not answer:
- Whole shapes in one step: a box from width, depth and height; a cylinder from diameter and height.
- Holes without coordinates: a hole in the centre of a face; a hole in each corner at a given margin; bolt holes by size, M3 to M12, as a clearance, counterbore or countersink hole.
- Working on the body: split it in two, make copies in a row, set the thickness of a plate, scale it, rotate it, delete it, hide it, show it, give it a colour.
- "Extrude down" and "extrude from the bottom" now mean the negative direction.
What got worse
Adding tools cost accuracy on the old ones, and the model is now too eager to call a tool.
- On the 620 test cases that 0.1.0 was measured on, exact match fell from 75.0% to 70.6%.
- On the requests among them that must produce no call (off-topic, a required value missing, a negated request), 0.2.0 calls a tool anyway in 37.8% of cases; 0.1.0 did so in 29.1% and base Needle 3 in 31.1%.
If you only need the original 33 tools, 0.1.0 is the better model. It stays available under the tag
v0.1.0. Whichever version you use, check each call before it
runs. The desktop app does part of this for you: it holds back calls whose numbers are not written in your
request, but it cannot catch every wrong choice of tool.
Credit: Needle 3 by Cactus Compute
This model is not a new architecture and was not trained from scratch. It is derived from
Needle 3, the tool-calling model by Cactus Compute, and it only runs on their engine.
All credit for the base model, its architecture, the .cact format and the inference engine goes to them.
- Base model and engine: huggingface.co/Cactus-Compute/needle3
- Needle 3 release page: cactuscompute.com/needle
- Source and Python package (
cactus-needle, Apache-2.0): github.com/cactus-compute/needle - Documentation: Needle Python Docs, Fine-tuning Needle, How to Design Tools for Needle 3
This project is independent. It is not affiliated with, sponsored by or endorsed by Cactus Compute or by Autodesk, Inc. Autodesk and Fusion are registered trademarks or trademarks of Autodesk, Inc.
Intended use
Driving Autodesk Fusion step by step from a written feature list, with a person watching:
plate 40x30x10 โ ร6 hole at (10, 0) โ polar pattern ร6 โ fillet the top edges R2
The companion app splits the goal into features, asks the model for the calls of one feature at a time, shows them, and runs vetted script templates in Fusion. The model never writes code.
Not intended for: general chat, free-form CAD scripting, tools outside the catalogue below, or unattended use on designs that matter.
Tools
The model was tuned for these 47 tools. Their full JSON schemas are in tools.json.
| Tool | Family | What it does | Arguments (required in bold) |
|---|---|---|---|
create_sketch |
sketch | Start a new sketch on an origin plane or on a face of the body. | plane, face, offset |
draw_rectangle |
sketch | Draw a rectangle in the active sketch, centred on a point. | width, height, center_x, center_y |
draw_circle |
sketch | Draw a circle in the active sketch. | diameter, center_x, center_y |
draw_line |
sketch | Draw a straight line in the active sketch between two points. | start_x, start_y, end_x, end_y |
draw_slot |
sketch | Draw a straight slot (obround) in the active sketch; 20x6 = length 20, width 6. | length, width, center_x, center_y, angle |
add_dimension |
sketch | Add a driving dimension to entities of the active sketch. | kind, value, entity_one, entity_two |
add_constraint |
sketch | Add a geometric constraint between entities of the active sketch. | kind, entity_one, entity_two |
extrude |
feature | Extrude (pad) the active sketch profile into a solid, or cut it out of the body (pocket). | distance, operation, direction, extent |
create_hole |
feature | Drill a hole into a face of the body. | diameter, x, y, depth, face |
circular_pattern |
feature | Repeat a feature or body around an axis (polar pattern, circular array). | count, axis, angle, target |
rectangular_pattern |
feature | Repeat a feature or body in a row or grid along X and Y (linear pattern). | x_count, x_spacing, y_count, y_spacing, target |
mirror |
feature | Mirror a feature or body across an origin plane. | plane, target |
fillet |
feature | Round edges of the body with a radius. | radius, edges |
chamfer |
feature | Bevel edges of the body with an equal-distance chamfer. | distance, edges |
shell |
feature | Hollow out the body, leaving walls of a given thickness and one face open. | thickness, open_face |
undo |
history | Undo the most recent operation. | |
redo |
history | Redo the most recently undone operation. | |
draw_polygon |
sketch | Draw a regular polygon such as a hexagon in the active sketch. | shape, size, measure, center_x, center_y, angle |
draw_arc |
sketch | Draw a circular arc in the active sketch, counter-clockwise from a start to an end angle. | radius, start_angle, end_angle, center_x, center_y |
revolve |
feature | Revolve the active sketch profile around an origin axis into a solid (turned part). | axis, angle, operation |
combine |
body | Boolean of bodies: join the other bodies to the first body, subtract them from it, or keep the overlap. | operation |
move_body |
body | Move the body by a distance along X, Y and Z. | x, y, z |
set_material |
body | Assign a physical material to the body. | material |
set_parameter |
parameter | Create a named user parameter or change its value. | name, value, unit |
list_parameters |
parameter | List the user parameters with their values. | |
measure_body |
inspect | Report the size (bounding box), volume and mass of each body. | |
check_timeline |
inspect | Check the timeline for features with errors or warnings. | |
capture_view |
view | Take a screenshot of the model, optionally from a standard view direction. | direction |
fit_view |
view | Zoom the view so the whole model fits the window. | |
export_model |
document | Export the design to a file in a named format. | format, name |
new_document |
document | Create a new empty design document. | |
save_document |
document | Save the active document. | |
open_document |
document | Find a saved document by name and open it. | name |
create_box |
body | Create a box (block, cube) in one step, centred on the origin. | width, depth, height |
create_cylinder |
body | Create a cylinder (rod, disc) in one step, standing on the origin. | diameter, height |
center_hole |
feature | Drill a hole at the centre (middle) of a face of the body. | diameter, depth, face |
corner_holes |
feature | Drill a hole near each corner of a face of the body. | diameter, margin, depth, face |
bolt_hole |
feature | Drill a clearance hole for a metric screw such as M6. | size, style, x, y |
split_body |
body | Split the body into two bodies at its middle (cut it in half). | direction, offset |
copy_body |
body | Duplicate the body: make copies of it in a row. | count, spacing, axis |
set_thickness |
feature | Change the thickness (height) of the existing body by editing its extrude. | thickness |
scale_body |
body | Scale the body uniformly by a factor (resize, make bigger or smaller). | factor |
rotate_body |
body | Rotate the body in place by an angle around an axis. | angle, axis |
delete_body |
body | Delete the body from the design. | |
hide_body |
body | Hide the body (make it invisible) without deleting it. | |
show_body |
body | Show hidden bodies again (unhide). | |
set_color |
body | Give the body a colour (appearance). | color |
How to use
With the app
Install Fusion Needle. It downloads manifest.json and the default weight file from this
repository on its first start, checks the SHA-256, and works offline afterwards.
Directly, with the needle Python package
pip install cactus-needle==3.1.1
needle download CharlZKP/fusion-needle3/fusion-mcp-20L.cact --out .
import json
import needle
catalogue = json.load(open("tools.json", encoding="utf-8"))
offered = ["create_hole", "draw_circle", "extrude", "fillet", "undo"] # at most five per turn
agent = needle.Needle(
tools=[tool for tool in catalogue if tool["name"] in offered],
system="units: mm; sketch: none; bodies: Body1; last_feature: Extrude1", # facts about the design
weights="fusion-mcp-20L.cact",
auto_date=False,
)
answer = agent.complete("ร6 hole at (10, 0)")
print(answer["function_calls"])
# expected shape: [{"name": "create_hole", "arguments": {"diameter": 6, "x": 10, "y": 0}}]
The weight files are tied to the engine version (cactus-needle==3.1.1). The system line is a list of
facts in exactly this form: units, sketch (none or <name> on <plane>), bodies, last_feature.
Evaluation
Numbers are measured on the built weight files through the shipped engine, on a held-out suite of hand-written single-step requests (calls, multi-call steps and requests that must produce no call) that were never used for tuning. A case counts as exact only when the tool names and every argument match. The suite has 844 cases.
| Metric | Fine-tuned, 20 layers | Base Needle 3 |
|---|---|---|
| Exact match (right tools and right arguments) | 67.8% (n=844) | 49.4% (n=844) |
| Tool selection (right set of tools) | 76.5% | 59.2% |
| Argument accuracy (given the right tools) | 84.8% (n=488) | 74.5% (n=325) |
| False-call rate on requests that need no call (lower is better) | 42.1% (n=273) | 35.9% (n=273) |
| Missed-call rate on requests that need a call (lower is better) | 5.9% (n=571) | 32.8% (n=571) |
Original cases and cases added in 0.2.0
The suite grew from 620 to 844 cases with this version. The 224 added cases cover the new tools and more requests that must produce no call. 0.1.0 has no figure for them because it does not have the new tools.
| Cases | 0.2.0 exact match | 0.1.0 exact match | Base Needle 3 exact match | 0.2.0 false calls | 0.1.0 false calls | Base Needle 3 false calls |
|---|---|---|---|---|---|---|
| Original 620 cases | 70.6% | 75.0% | 50.2% | 37.8% (n=196) | 29.1% (n=196) | 31.1% (n=196) |
| 224 cases added in 0.2.0 | 59.8% | 47.3% | 53.2% (n=77) | 48.1% (n=77) | ||
| All 844 | 67.8% | 49.4% | 42.1% (n=273) | 35.9% (n=273) |
Against base Needle 3, the fine-tune is 18 points ahead on exact match, mostly because it calls a tool when one is needed (it misses about 6% of such requests, the base model about 33%). It is behind the base model at staying silent: it makes a call on 42.1% of the requests that need none, the base model on 35.9%. The added cases are harder than the original ones for both models.
All figures are for the 20-layer file. The 8-layer file has not been scored.
Limitations
- Values must be written in the request. The model copies argument values from the text. It does not convert units, compute, or guess: "make a hole" has no diameter, so the answer is no call.
- One feature per turn. A turn yields at most four calls and the model has no memory of earlier turns; the design state line is its only context.
- At most five tools are visible per turn. The app chooses them with a keyword router; a request whose tool is not among the five cannot be answered correctly.
- Millimetres and English. The tools take millimetres and the suite is English only.
- No confidence score. Locally tuned Needle models do not report one; rely on the empty answer and on the calls the engine withholds.
- Only lightly tried in a real Autodesk Fusion. The scores above compare the model's calls with expected calls. Whether every call produces the intended geometry in Fusion has been tried by hand for a handful of requests on Windows only; see the status section of the app's README.
- Only the 47 tools above. Lofts, sweeps, threads, drawings, CAM and assemblies are out of scope.
Files
| File | Layers | Size | SHA-256 |
|---|---|---|---|
fusion-mcp-20L.cact |
20 | 63.4 MB | b0da36c0f9515c4e809f3717c634c0d75a6926a82a9c001f8db0a2778b4dafbd |
fusion-mcp-8L.cact |
8 | 27.4 MB | b896dca4e603ed0d6695b5cda8f158f5cba5cec473acf26824eb20b4dd9d7776 |
manifest.json lists every weight file with its size and SHA-256; the app verifies a download against it.
Licence
Apache-2.0, the same licence as the Needle 3 base weights these are fine-tuned from. See LICENSE.
Model tree for CharlZKP/fusion-needle3
Base model
Cactus-Compute/needle3

