Reference
Tools reference
Every tool the Speed connector exposes (40), with its arguments, plus the 133 long-tail commands and the rules the server sends.
This page is generated from the connector's own tool definitions, so it always matches what your chat sees. You don't need it to use Speed: the chat reads these definitions itself. It is here for engineers and AI agents.
Units and axes#
- Lengths in millimetres, mass in grams, force in newtons, angles in degrees.
- Y is up. The ground plane is y = 0.
- A part's position is the centre of its shape. Cylinders and tubes have their axis along their local Y. Rotation is Euler XYZ in degrees.
- Sketch planes: Top (u = +X, v = −Z, normal +Y), Front (u = +X, v = +Y, normal +Z), Right (u = −Z, v = +Y, normal +X).
How tools behave#
- Every tool runs in the person's Speed tab. If no tab is connected, the tool says so and
statusreturns the link to open one. - Read-only tools never change the design. Every other tool's change is one undo step in the tab.
- A single tool call that runs longer than 280 seconds times out in the chat. The tab may still finish it.
- Physics checks and FEA are screening grade. Never call a design verified, certified or flight-ready, and name every load and support you assumed.
Connection#
Find the Speed tab and get its link.
statusCheck the connectionRead-only#
Whether a Speed tab is connected to this chat, the link to open one, and a summary of the open design: its name, parts, mass and whether the physics check passes. Call it first.
No arguments.
Read and check#
Read the design, look at it, check its physics and find real parts. None of these change the design.
get_assemblyRead-only#
Read the current design: one line per part (id | name | role | shape and size | position | rotation | material | joint | specs). Pass full: true for the raw JSON of every part (large).
| Argument | Type | Description |
|---|---|---|
full | boolean | — |
list_featuresRead-only#
Read a modelled part's feature history: each feature with its id, name and settings, the faces and edges each extrude has on the body now, and the envelope.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
view_modelLook at the modelRead-only#
A clean line picture (PNG) of the design from a standard view, rendered in the person's Speed tab. Call it after each major stage and before you reply, to catch what numbers miss: parts not touching, something on the wrong side. A picture shows shape only: take numbers from run_physics_check and run_fea.
| Argument | Type | Description |
|---|---|---|
view | string | Which view (default iso). exploded is an exploded isometric with item balloons. One of: iso, isoRear, front, back, left, right, top, bottom, exploded. |
run_physics_checkRead-only#
Run every physics and engineering check on the current assembly. Returns viable/non-viable, each error and warning with the law it breaks, and key metrics (mass, thrust-to-weight, flight time, stresses).
No arguments.
search_catalogueRead-only#
Search the industry parts catalogue (real motors, propellers, batteries, ESCs, servos and bearings with datasheet figures). Prefer the size filters over model words: you get the entries nearest to them. Returns one line per entry: catalogue id | maker model | key specs. Call several searches in one turn when you need several kinds.
| Argument | Type | Description |
|---|---|---|
kindrequired | string | One of: motor, propeller, battery, esc, servo, bearing. |
query | string | maker or model words, e.g. 'tmotor mn5008' (optional; near matches are returned when nothing matches exactly) |
canDiaMm | number | motors: can diameter wanted, mm |
minThrustG | number | motors: at least this max thrust, g |
cells | number | motors and ESCs: battery cells (S) they must run on; batteries: cells wanted |
diameterIn | number | propellers: diameter wanted, inches |
capacityMah | number | batteries: capacity wanted, mAh |
maxMassG | number | — |
limit | number | — |
Build assemblies#
Plan the work, start from a product or template, and add, change, fit and organise parts. Every change is one undo step in the tab.
planRead-only#
Show the user how you read the request before you build: the approach (which thinking framework fits), the requirements you pinned down and 3 to 8 short steps in the order you will do them. Shown to the user above the work. Call it once at the start of anything bigger than a direct edit; call it again only if the plan changes.
| Argument | Type | Description |
|---|---|---|
goalrequired | string | — |
approach | string | the thinking framework you are using (see How you think) One of: direct, requirement, explore, diagnose, improve, review. |
requirements | object[] | the numbers that decide the design, most important first: what the user said (stated), defaults you chose (assumed), readings to agree (confirm). Leave out for a direct edit. Up to 12. |
requirements[].needrequired | string | e.g. Payload, Flight time, Pointing accuracy |
requirements[].valuerequired | string | with units, e.g. ≥ 60 kg, < 25 µrad (1σ) |
requirements[].basisrequired | string | One of: stated, assumed, confirm. |
stepsrequired | string[] | Up to 10. |
load_productChanges the design#
Replace the design with one of Speed's parametric, physics-checked products, a reliable starting point to adapt:
Full description
Replace the design with one of Speed's parametric, physics-checked products, a reliable starting point to adapt: agricopter (Agricopter V2.1, Agricultural drone); hydrogen (H₂ Cargo Drone, Hydrogen logistics drone); skysense (SKYSENSE, Passive drone detector (DoA)); boss (BOSS EO/IR pan-tilt pedestal, Surveillance pan-tilt pedestal); zerodur-mirror (1.5 m Zerodur space mirror, Space optics); ir-zoom (MWIR continuous-zoom lens 15–150 mm f/1.2, IR opto-mechanics); periscope (Optronic Periscope, Naval optronics); quiver (Quiver Dev-Kit, Open ISR / inspection multirotor); spearhead (Spearhead PT1, VTOL survey quadplane); eoir-gimbal (3-axis EO/IR gimbal, EO/IR sensor gimbal); tether (Tethered UAV power system, Tethered persistent-hover power); crazyflie (Crazyflie 2.1, Nano research quadcopter); quad-x (Generated X-quad, Generated X-quad (parametric)); eots-01 (SPD-EOTS-01 Sentinel U, EOTS gimbal · as specified); eots-02 (SPD-EOTS-02 Twin-Pod, EOTS gimbal · as specified); eots-03 (SPD-EOTS-03 Orb, EOTS gimbal · as specified); eots-04 (SPD-EOTS-04 Arm, EOTS gimbal · as specified); eots-05 (SPD-EOTS-05 Head-Box, EOTS gimbal · as specified); eots-06 (SPD-EOTS-06 Sentinel-C, EOTS gimbal · improved); eots-07 (SPD-EOTS-07 Zenith, EOTS gimbal · improved); eots-08 (SPD-EOTS-08 Sprint, EOTS gimbal · improved); eots-09 (SPD-EOTS-09 Micro-Radian, EOTS gimbal · improved); eots-10 (SPD-EOTS-10 Mariner, EOTS gimbal · improved); eots-11 (SPD-EOTS-11 Convoy, EOTS gimbal · improved); eots-12 (SPD-EOTS-12 Featherweight, EOTS gimbal · improved); eots-13 (SPD-EOTS-13 Salt-Proof, EOTS gimbal · improved); eots-14 (SPD-EOTS-14 Fail-Op, EOTS gimbal · improved); eots-15 (SPD-EOTS-15 Hunter-AI, EOTS gimbal · improved); eots-16 (SPD-EOTS-16 HD-Thermal, EOTS gimbal · improved); eots-17 (SPD-EOTS-17 Haze-Cutter, EOTS gimbal · improved); eots-18 (SPD-EOTS-18 Long-Reach, EOTS gimbal · improved); eots-19 (SPD-EOTS-19 Polar, EOTS gimbal · improved); eots-20 (SPD-EOTS-20 Desert, EOTS gimbal · improved); eots-21 (SPD-EOTS-21 Low-Power, EOTS gimbal · improved); eots-22 (SPD-EOTS-22 Modular LRU, EOTS gimbal · improved); eots-23 (SPD-EOTS-23 Growth-80, EOTS gimbal · improved); eots-24 (SPD-EOTS-24 Coast Tower, EOTS gimbal · improved); eots-25 (SPD-EOTS-25 Keyhole-Free, EOTS gimbal · improved); eots-26 (SPD-EOTS-26 Inner-Gimbal, EOTS gimbal · improved); eots-27 (SPD-EOTS-27 Agile, EOTS gimbal · improved); eots-28 (SPD-EOTS-28 Mast-Head, EOTS gimbal · improved); eots-29 (SPD-EOTS-29 Geared Compact, EOTS gimbal · improved); eots-30 (SPD-EOTS-30 Ring-Gear Heavy, EOTS gimbal · improved); eots-31 (SPD-EOTS-31 Mk II Naval Orb, EOTS gimbal · flagship); eots-32 (SPD-EOTS-32 Mk II Precision, EOTS gimbal · flagship); eots-33 (SPD-EOTS-33 Mk II Twin-Pod AI, EOTS gimbal · flagship); eots-34 (SPD-EOTS-34 Mk II Lightweight, EOTS gimbal · flagship); eots-35 (SPD-EOTS-35 Mk II Vehicle, EOTS gimbal · flagship); eots-36 (SPD-EOTS-36 Mk II Inner-Gimbal, EOTS gimbal · flagship); eots-37 (SPD-EOTS-37 Mk III Flagship, EOTS gimbal · flagship).
| Argument | Type | Description |
|---|---|---|
idrequired | string | One of: agricopter, hydrogen, skysense, boss, zerodur-mirror, ir-zoom, periscope, quiver, spearhead, eoir-gimbal, tether, crazyflie, quad-x, eots-01, eots-02, eots-03, eots-04, eots-05, eots-06, eots-07, eots-08, eots-09, eots-10, eots-11, eots-12, eots-13, eots-14, eots-15, eots-16, eots-17, eots-18, eots-19, eots-20, eots-21, eots-22, eots-23, eots-24, eots-25, eots-26, eots-27, eots-28, eots-29, eots-30, eots-31, eots-32, eots-33, eots-34, eots-35, eots-36, eots-37. |
variant | string | One of: asIs, improved. |
add_partChanges the design#
Add one part to the assembly. Returns the new part id.
| Argument | Type | Description |
|---|---|---|
namerequired | string | — |
shaperequired | string | One of: box, rbox, cylinder, tube, capsule, sphere, torus. |
paramsrequired | object | Shape dimensions in mm. box: w,h,d · cylinder: r,h (axis Y) · tube: r,t,h · sphere: r · torus: R,r (ring in XY plane) |
positionrequired | number[] (3) | Centre position in mm, Y up, ground at y=0 |
rotation | number[] (3) | Euler XYZ rotation in degrees |
materialrequired | string | One of: carbon_fiber, aluminum_6061, aluminum_7075, titanium_gr5, steel_304, pla, petg, abs, nylon_pa12, tpu, acetate, polycarbonate, cr39, glass_crown, silicone, fr4, motor_stator, cfrp_wound, magnesium_az91, hdpe, pc_abs, fuel_cell, lipo, germanium, silicon_ir, silicon, znse, zns, zerodur, sapphire, fused_silica, ptfe, kapton, fkm, invar36, a286, steel_17_4ph. |
rolerequired | string | One of: structure, arm, motor, propeller, battery, electronics, payload, lens, bridge, hinge, temple, nosepad, actuator, bearing, encoder, optic. |
attachTo | string | id of the part this one is fastened/bonded to (a joint). They must physically touch. |
massG | number | Catalogue mass in grams for bought-in components; omit to compute from density |
motor | object | — |
motor.maxThrustGrequired | number | — |
motor.kvrequired | number | — |
motor.maxCurrentArequired | number | — |
prop | object | — |
prop.spinrequired | string | One of: cw, ccw. |
prop.pitchIn | number | — |
battery | object | — |
battery.cellsrequired | number | — |
battery.capacityMahrequired | number | — |
battery.cRatingrequired | number | — |
detail | object | The part's real look from the part library: {kind, opts}. part_library lists the kinds and, for one kind, which shape and params the part needs and its options. The shape and params stay the envelope physics uses; the detail draws the real part inside it. |
detail.kindrequired | string | — |
detail.opts | object | — |
add_partsChanges the design#
Add several parts in one step (an arm set, six motors). Each item takes the same fields as add_part. Returns the new ids in order. Use it to build quickly.
| Argument | Type | Description |
|---|---|---|
partsrequired | object[] | Up to 24. |
parts[].namerequired | string | — |
parts[].shaperequired | string | One of: box, rbox, cylinder, tube, capsule, sphere, torus. |
parts[].paramsrequired | object | Shape dimensions in mm. box: w,h,d · cylinder: r,h (axis Y) · tube: r,t,h · sphere: r · torus: R,r (ring in XY plane) |
parts[].positionrequired | number[] (3) | Centre position in mm, Y up, ground at y=0 |
parts[].rotation | number[] (3) | Euler XYZ rotation in degrees |
parts[].materialrequired | string | One of: carbon_fiber, aluminum_6061, aluminum_7075, titanium_gr5, steel_304, pla, petg, abs, nylon_pa12, tpu, acetate, polycarbonate, cr39, glass_crown, silicone, fr4, motor_stator, cfrp_wound, magnesium_az91, hdpe, pc_abs, fuel_cell, lipo, germanium, silicon_ir, silicon, znse, zns, zerodur, sapphire, fused_silica, ptfe, kapton, fkm, invar36, a286, steel_17_4ph. |
parts[].rolerequired | string | One of: structure, arm, motor, propeller, battery, electronics, payload, lens, bridge, hinge, temple, nosepad, actuator, bearing, encoder, optic. |
parts[].attachTo | string | id of the part this one is fastened/bonded to (a joint). They must physically touch. |
parts[].massG | number | Catalogue mass in grams for bought-in components; omit to compute from density |
parts[].motor | object | — |
parts[].motor.maxThrustGrequired | number | — |
parts[].motor.kvrequired | number | — |
parts[].motor.maxCurrentArequired | number | — |
parts[].prop | object | — |
parts[].prop.spinrequired | string | One of: cw, ccw. |
parts[].prop.pitchIn | number | — |
parts[].battery | object | — |
parts[].battery.cellsrequired | number | — |
parts[].battery.capacityMahrequired | number | — |
parts[].battery.cRatingrequired | number | — |
parts[].detail | object | The part's real look from the part library: {kind, opts}. part_library lists the kinds and, for one kind, which shape and params the part needs and its options. The shape and params stay the envelope physics uses; the detail draws the real part inside it. |
parts[].detail.kindrequired | string | — |
parts[].detail.opts | object | — |
update_partChanges the design#
Change fields of an existing part. Only the fields you pass are changed; params are merged.
| Argument | Type | Description |
|---|---|---|
idrequired | string | — |
name | string | — |
shape | string | One of: box, rbox, cylinder, tube, capsule, sphere, torus. |
params | object | Shape dimensions in mm. box: w,h,d · cylinder: r,h (axis Y) · tube: r,t,h · sphere: r · torus: R,r (ring in XY plane) |
position | number[] (3) | Centre position in mm, Y up, ground at y=0 |
rotation | number[] (3) | Euler XYZ rotation in degrees |
material | string | One of: carbon_fiber, aluminum_6061, aluminum_7075, titanium_gr5, steel_304, pla, petg, abs, nylon_pa12, tpu, acetate, polycarbonate, cr39, glass_crown, silicone, fr4, motor_stator, cfrp_wound, magnesium_az91, hdpe, pc_abs, fuel_cell, lipo, germanium, silicon_ir, silicon, znse, zns, zerodur, sapphire, fused_silica, ptfe, kapton, fkm, invar36, a286, steel_17_4ph. |
role | string | One of: structure, arm, motor, propeller, battery, electronics, payload, lens, bridge, hinge, temple, nosepad, actuator, bearing, encoder, optic. |
attachTo | string | id of the part this one is fastened/bonded to (a joint). They must physically touch. |
massG | number | Catalogue mass in grams for bought-in components; omit to compute from density |
motor | object | — |
motor.maxThrustGrequired | number | — |
motor.kvrequired | number | — |
motor.maxCurrentArequired | number | — |
prop | object | — |
prop.spinrequired | string | One of: cw, ccw. |
prop.pitchIn | number | — |
battery | object | — |
battery.cellsrequired | number | — |
battery.capacityMahrequired | number | — |
battery.cRatingrequired | number | — |
detail | object | The part's real look from the part library: {kind, opts}. part_library lists the kinds and, for one kind, which shape and params the part needs and its options. The shape and params stay the envelope physics uses; the detail draws the real part inside it. |
detail.kindrequired | string | — |
detail.opts | object | — |
remove_partChanges the design#
Delete a part. Parts attached to it lose their joint.
| Argument | Type | Description |
|---|---|---|
idrequired | string | — |
move_partsChanges the design#
Move parts by an offset in mm. Parts attached to them (attachTo, all the way down) move with them.
| Argument | Type | Description |
|---|---|---|
idsrequired | string[] | — |
deltarequired | number[] (3) | — |
swap_partChanges the design#
Fit a catalogue part to one or more parts of the matching role (a motor to all six motor parts). It sets the real size, mass and specs, keeps each part's base where it was and lifts what sits on it (the propeller on a motor). All ids must be one kind of part (motors, or ESCs, never both). Returns what changed and the datasheet caveats.
| Argument | Type | Description |
|---|---|---|
idsrequired | string[] | — |
catalogIdrequired | string | — |
force | boolean | fit even when the part is far off the current size (an intended resize) |
group_partsChanges the design#
Group parts into a named subassembly (Arm 1, Power, Payload). The drawings give each subassembly its own sheet.
| Argument | Type | Description |
|---|---|---|
namerequired | string | — |
idsrequired | string[] | — |
undoUndoChanges the design#
Undo the last change to the design in the tab, as the person's Undo does.
No arguments.
Model parts#
Model a custom part from a feature history, like a SolidWorks part: sketch, extrude, revolve, then holes, patterns, fillets and shells.
create_partChanges the design#
Make an empty modelled part (a real B-rep part built from a feature history, like a SolidWorks part). Then add_sketch, extrude and the other modelling tools build it. position is where the part's model origin sits in the assembly (mm). Returns the part id.
| Argument | Type | Description |
|---|---|---|
namerequired | string | — |
material | string | One of: carbon_fiber, aluminum_6061, aluminum_7075, titanium_gr5, steel_304, pla, petg, abs, nylon_pa12, tpu, acetate, polycarbonate, cr39, glass_crown, silicone, fr4, motor_stator, cfrp_wound, magnesium_az91, hdpe, pc_abs, fuel_cell, lipo, germanium, silicon_ir, silicon, znse, zns, zerodur, sapphire, fused_silica, ptfe, kapton, fkm, invar36, a286, steel_17_4ph. |
position | number[] (3) | — |
rotation | number[] (3) | Euler XYZ, degrees |
role | string | One of: structure, arm, electronics, payload, bridge, hinge, temple, lens, nosepad. |
attachTo | string | part this one is fastened to |
add_sketchChanges the design#
Add a sketch to a modelled part: entities on a plane or face, dimensioned and related to the origin so it is fully defined. Returns the sketch id, its frame and its closed regions.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
name | string | — |
planerequired | object | Where to sketch: a standard plane (optionally offset along its normal), a reference plane feature, or a flat face of the part. Frames: Top (u = +X, v = -Z, normal +Y), Front (u = +X, v = +Y, normal +Z), Right (u = -Z, v = +Y, normal +X). A face uses the frame of the parallel standard plane when it faces the same way, measured from the model origin projected onto it; the result states the frame. |
plane.std | string | One of: top, front, right. |
plane.offset | number | mm along the plane's normal (std only) |
plane.ref | string | a reference plane feature: the feature id (f2) or its name (Boss-Extrude1) |
plane.face | object | Which flat face, worked out from the features. Examples: the top of a plate on the Top plane = {normal:'+y'} or {feature:'Boss-Extrude1', which:'end'}; a pocket floor = {feature:'Cut-Extrude1', which:'end'}. |
plane.face.feature | string | the extrude whose face this is (omit to search all): the feature id (f2) or its name (Boss-Extrude1) |
plane.face.which | string | end: the extrude's far face (a blind cut's floor); start: a boss's face on its sketch plane; side: a flat side face One of: end, start, side. |
plane.face.normal | string | the face's outward normal; without a feature, the outermost face facing that way One of: +x, -x, +y, -y, +z, -z. |
plane.face.point | number[] (3) | the face whose plane passes through this model point (nearest one) |
entitiesrequired | object[] | Up to 60. |
entities[].typerequired | string | One of: rect, center_rect, circle, polyline, slot, polygon, arc, centerline. |
entities[].corner1 | number[] (2) | — |
entities[].corner2 | number[] (2) | — |
entities[].center | number[] (2) | — |
entities[].width | number | — |
entities[].height | number | — |
entities[].diameter | number | — |
entities[].points | number[] (2)[] | — |
entities[].closed | boolean | — |
entities[].center1 | number[] (2) | — |
entities[].center2 | number[] (2) | — |
entities[].sides | number | — |
entities[].radius | number | — |
entities[].angle | number | — |
entities[].circumscribed | boolean | polygon only: radius and angle give the first side midpoint (apothem), not a vertex |
entities[].start_angle | number | — |
entities[].end_angle | number | — |
entities[].from | number[] (2) | — |
entities[].to | number[] (2) | — |
entities[].construction | boolean | reference geometry, not part of the profile |
extrudeChanges the design#
Extrude a sketch's closed regions: boss adds material, cut removes it. end: blind (depth), midplane (depth split both ways) or through (all). The direction is the sketch plane's normal; reverse flips it. A cut with no reverse given goes the way that meets material.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
sketchrequired | string | the sketch: the feature id (f2) or its name (Boss-Extrude1) |
op | string | One of: boss, cut. |
end | string | One of: blind, midplane, through. |
depth | number | mm |
reverse | boolean | — |
name | string | — |
revolveChanges the design#
Revolve a sketch's closed regions about an axis in it: 'centerline' (its construction line), 'h' or 'v' (the sketch's u or v axis through the origin), or a line id. The profile must stay on one side of the axis.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
sketchrequired | string | the sketch: the feature id (f2) or its name (Boss-Extrude1) |
axis | string | — |
angle | number | degrees, default 360 |
op | string | One of: boss, cut. |
reverse | boolean | — |
name | string | — |
holeChanges the design#
Hole Wizard: ISO metric holes of one type into one flat face, at (u, v) points in that face's frame (the frame the result of add_sketch or list_features gives for a face facing that way; a face facing +Y uses the Top plane's u = +X, v = -Z). type: clearance (ISO 273), counterbore (ISO 4762 heads), countersink (ISO 10642), tapped (tap drill).
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
facerequired | object | Which flat face, worked out from the features. Examples: the top of a plate on the Top plane = {normal:'+y'} or {feature:'Boss-Extrude1', which:'end'}; a pocket floor = {feature:'Cut-Extrude1', which:'end'}. |
face.feature | string | the extrude whose face this is (omit to search all): the feature id (f2) or its name (Boss-Extrude1) |
face.which | string | end: the extrude's far face (a blind cut's floor); start: a boss's face on its sketch plane; side: a flat side face One of: end, start, side. |
face.normal | string | the face's outward normal; without a feature, the outermost face facing that way One of: +x, -x, +y, -y, +z, -z. |
face.point | number[] (3) | the face whose plane passes through this model point (nearest one) |
positionsrequired | number[] (2)[] | Up to 100. |
sizerequired | string | One of: M2, M2.5, M3, M4, M5, M6, M8, M10, M12, custom. |
diameter | number | custom drill diameter, mm |
type | string | One of: clearance, counterbore, countersink, tapped. |
fit | string | One of: fine, medium, coarse. |
end | string | One of: through, blind. |
depth | number | — |
name | string | — |
patternChanges the design#
Copy features (extrudes, revolves, holes): linear along a model axis (and a second one), or circular round a model axis through the origin or a reference axis.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
featuresrequired | string[] | — |
kindrequired | string | One of: linear, circular. |
direction | string | One of: x, y, z. |
spacing | number | — |
count | number | instances including the seed |
reverse | boolean | — |
direction2 | string | One of: x, y, z. |
spacing2 | number | — |
count2 | number | — |
reverse2 | boolean | — |
axis | string | One of: x, y, z. |
axis_ref | string | a reference axis: the feature id (f2) or its name (Boss-Extrude1) |
angle | number | degrees spanned, default 360 (equal spacing) |
name | string | — |
mirrorChanges the design#
Mirror features (extrudes, revolves, holes) or the whole body about a plane: a standard plane (with offset), a reference plane or a flat face.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
features | string[] | — |
body | boolean | — |
planerequired | object | Where to sketch: a standard plane (optionally offset along its normal), a reference plane feature, or a flat face of the part. Frames: Top (u = +X, v = -Z, normal +Y), Front (u = +X, v = +Y, normal +Z), Right (u = -Z, v = +Y, normal +X). A face uses the frame of the parallel standard plane when it faces the same way, measured from the model origin projected onto it; the result states the frame. |
plane.std | string | One of: top, front, right. |
plane.offset | number | mm along the plane's normal (std only) |
plane.ref | string | a reference plane feature: the feature id (f2) or its name (Boss-Extrude1) |
plane.face | object | Which flat face, worked out from the features. Examples: the top of a plate on the Top plane = {normal:'+y'} or {feature:'Boss-Extrude1', which:'end'}; a pocket floor = {feature:'Cut-Extrude1', which:'end'}. |
plane.face.feature | string | the extrude whose face this is (omit to search all): the feature id (f2) or its name (Boss-Extrude1) |
plane.face.which | string | end: the extrude's far face (a blind cut's floor); start: a boss's face on its sketch plane; side: a flat side face One of: end, start, side. |
plane.face.normal | string | the face's outward normal; without a feature, the outermost face facing that way One of: +x, -x, +y, -y, +z, -z. |
plane.face.point | number[] (3) | the face whose plane passes through this model point (nearest one) |
name | string | — |
filletChanges the design#
Round edges with a radius. Pick them with edge selectors.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
edgesrequired | object[] | — |
edges[].feature | string | an extrude, hole, pattern or mirror whose edges these are (omit for all traced edges): the feature id (f2) or its name (Boss-Extrude1) |
edges[].which | string | end: round the extrude's far face; start: round its sketch-plane face; side: along the extrude direction at the profile corners; rim: a hole's edge at its face One of: end, start, side, rim, all. |
edges[].parallel_to | string | keep straight edges parallel to this model axis One of: x, y, z. |
edges[].at | string | keep the edges farthest toward this side of the model One of: +x, -x, +y, -y, +z, -z. |
edges[].point | number[] (3) | keep the one edge nearest this model point (within 1 mm) |
radiusrequired | number | — |
name | string | — |
chamferChanges the design#
Bevel edges at 45° by a distance. Pick them with edge selectors.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
edgesrequired | object[] | — |
edges[].feature | string | an extrude, hole, pattern or mirror whose edges these are (omit for all traced edges): the feature id (f2) or its name (Boss-Extrude1) |
edges[].which | string | end: round the extrude's far face; start: round its sketch-plane face; side: along the extrude direction at the profile corners; rim: a hole's edge at its face One of: end, start, side, rim, all. |
edges[].parallel_to | string | keep straight edges parallel to this model axis One of: x, y, z. |
edges[].at | string | keep the edges farthest toward this side of the model One of: +x, -x, +y, -y, +z, -z. |
edges[].point | number[] (3) | keep the one edge nearest this model point (within 1 mm) |
distancerequired | number | — |
name | string | — |
shellChanges the design#
Hollow the part: the picked faces open, the rest become walls of the thickness (inward).
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
open_facesrequired | object[] | — |
open_faces[].feature | string | the extrude whose face this is (omit to search all): the feature id (f2) or its name (Boss-Extrude1) |
open_faces[].which | string | end: the extrude's far face (a blind cut's floor); start: a boss's face on its sketch plane; side: a flat side face One of: end, start, side. |
open_faces[].normal | string | the face's outward normal; without a feature, the outermost face facing that way One of: +x, -x, +y, -y, +z, -z. |
open_faces[].point | number[] (3) | the face whose plane passes through this model point (nearest one) |
thicknessrequired | number | — |
name | string | — |
delete_featureChanges the design#
Delete a feature and the features built on it (an extrude's sketch goes only when asked: delete the sketch to delete both). Fillets, holes or shells that picked its edges or faces block the delete unless with_dependents is true.
| Argument | Type | Description |
|---|---|---|
partrequired | string | id of the modelled part (from create_part) |
featurerequired | string | the feature: the feature id (f2) or its name (Boss-Extrude1) |
with_dependents | boolean | — |
Analyse and report#
Define load cases, run screening FEA, and make the FE report and drawings.
set_load_casesChanges the design#
Define the FE load cases run_fea solves: what holds the design (supports) and what loads it (accelerations in g, forces on parts, a temperature change, a shock pulse, modes, sun and ambient heat). mode add keeps the existing cases (the defaults for the design's kind when none were set) and adds or replaces these by id; replace uses only these; reset goes back to the defaults. Use the user's numbers; name each case for what it is ("Hard landing, 3 g").
| Argument | Type | Description |
|---|---|---|
moderequired | string | One of: add, replace, reset. |
cases | object[] | Up to 12. |
cases[].idrequired | string | snake_case, e.g. tip_load |
cases[].namerequired | string | — |
cases[].kindrequired | string | One of: static, modal, shock, thermal, buckling. |
cases[].supportsrequired | string or object | "base": rests on its lowest parts (bolted down or standing); "free": a free body in flight (inertia relief); or { fixed: [part ids], at?: -y|+y|-x|+x|-z|+z|footprint } |
cases[].supports.fixedrequired | string[] | — |
cases[].supports.at | string | — |
cases[].accel_g | number[] (3) | body acceleration in g; gravity is [0, -1, 0] |
cases[].forces | object[] | — |
cases[].forces[].partrequired | string | — |
cases[].forces[].Nrequired | number[] (3) | force in newtons, world axes |
cases[].forces[].at | number[] (3) | world point, mm (default the part centre) |
cases[].temperature_change_K | number | uniform soak, kind thermal (static solve) |
cases[].ambient_C | number | kind thermal: steady heat with the parts' own power, at this ambient |
cases[].solar_Wm2 | number | — |
cases[].shock | object | — |
cases[].shock.grequired | number | — |
cases[].shock.msrequired | number | — |
cases[].shock.dirrequired | number[] (3) | — |
cases[].modes | number | kind modal: how many modes |
cases[].min_hz | number | kind modal: modes below this are a finding |
cases[].sf_required | number | safety factor the case must show (default 1: loads already factored) |
run_feaChanges the design#
Finite-element analysis of the current design:
Full description
Finite-element analysis of the current design: solves its load cases (set_load_cases, else the defaults for its kind) and reports per case the highest-utilised part (stress / allowable = U, safety factor), the largest displacement and the weakest bolt, the modes (and whether the first is local), the hottest parts and the findings, with the solver's own idealisation artefacts called out. Screening grade: part envelopes. show paints a field on the canvas after your reply. Takes seconds to a minute on large designs; run it after the physics check passes, not after every edit.
| Argument | Type | Description |
|---|---|---|
cases | string[] | case ids to solve (default all) |
show | string | what to paint after the reply (default stress on the worst static case) One of: stress, displacement, temperature, none. |
show_case | string | the static case to paint, by id |
fea_reportMake the FE reportChanges the design#
Do all the FE analysis and make a downloadable report: solves every load case the design has, returns a text summary and a download link for the PDF report. Screening grade, and the report says so. Pass every load, support and material you assumed rather than were given in `assumptions`: they are printed in the report. Can take minutes.
| Argument | Type | Description |
|---|---|---|
assumptions | string[] | Every load, support and material you assumed rather than were given |
make_drawingsChanges the design#
Draft the dimensional drawings once the design is final: onepager (one dense sheet) or deck (every sheet in detail). They open for the user after your reply.
| Argument | Type | Description |
|---|---|---|
moderequired | string | One of: onepager, deck. |
Long-tail commands#
Every other Speed command (133 of them) is reached through these three tools: list them, read one's arguments, run it.
list_commandsList every commandRead-only#
Every Speed command beyond the tools listed here, one line each: assembly features, mates, patterns and explode steps, sweeps and lofts, surfaces, sheet metal, weldments, mold tools, configurations and equations. Call describe_command for one's arguments, then run_command to run it.
| Argument | Type | Description |
|---|---|---|
filter | string | Only commands whose name or description contains this text, e.g. sheet, weld, surface, pattern |
describe_commandDescribe a commandRead-only#
One command's full description and the JSON schema of its arguments.
| Argument | Type | Description |
|---|---|---|
namerequired | string | The command name from list_commands |
run_commandRun a commandChanges the design#
Run any Speed command by name, with arguments that match its schema from describe_command. It changes the design in the person's tab exactly as the tool of that name would.
| Argument | Type | Description |
|---|---|---|
namerequired | string | The command name from list_commands |
arguments | object | The command's arguments |
Other tools#
Tools added to the app since these groups were written.
enrich_requestRead-only#
Turn the person's own words (often one short line) into a full brief before you build:
Full description
Turn the person's own words (often one short line) into a full brief before you build: what they asked, what you'll assume for everything they didn't say (sensible values for this class of product, each one editable), what you'll check, and which kits to build it with. Call it first whenever the request is short or vague, show the person the brief in a few lines (asked / assumed / checks), then build with those values unless they change one. A detailed spec from the person always wins over the brief's assumptions.
| Argument | Type | Description |
|---|---|---|
requestrequired | string | The person's request, word for word |
add_kitChanges the design#
Add a whole detailed subsystem in one call, built and sized like Speed's hand-made products:
Full description
Add a whole detailed subsystem in one call, built and sized like Speed's hand-made products: real geometry, real masses, every part attached to what it touches. Use kits before raw add_part for anything they cover: a multirotor is centre_hub → rotor_set → landing_gear → battery_pack (→ spray_system, gnss_masts, sensors, gimbal_camera); a ground sensor is ground_mast. Returns the new part ids. Then run run_physics_check.
Kits (options; every one optional unless marked):
- centre_hub: width (440), height, clearance (hub bottom above ground, default ≈ width), arms (6), armD, firstArmDeg, shellWall, canopy (true), flightController (true), x, z. Place it first; the other drone kits hang off it.
- rotor_set: hub (id; defaults to the only hub), count (= hub arms), propIn (22), motorThrustKg (per motor; default scales with propIn), motorMassG, cells, armD, armWall, rotorGap (gap between discs), folding (true for ≥15″), escs (true for ≥15″), nozzles (how many flat-fan spray nozzles under the motors).
- landing_gear: hub, track, length, skidD, legD. Splayed CF legs in seat clamps, skids with tee clamps.
- spray_system: hub, litres (10), flowLpm. Baffled HDPE tank in straps under the hub plus a diaphragm pump.
- battery_pack: hub, cells (12), capacityAh (16), whPerKg (125), offsetZ. Smart pack on a CF slide tray on top of the hub.
- gnss_masts: hub, count (1 or 2), height. Folding masts with GNSS pucks.
- sensors: hub, obstacleRadars, terrainRadar, fpvCamera (all true).
- gimbal_camera: hub or attachTo (any part id), ballD (160), massG, pitchDeg. Stabilised EO/IR ball under it.
- ground_mast: height (2000), diameter (76), wall, baseSize, baseThickness, head ("radome" | "radar" | "eo_ball" | "none"), headD, enclosure (true), x, z. Steel mast on an anchored base plate for ground sensors.| Argument | Type | Description |
|---|---|---|
kitrequired | string | One of: centre_hub, rotor_set, landing_gear, spray_system, battery_pack, gnss_masts, sensors, gimbal_camera, ground_mast. |
options | object | The kit's options (see the list above). Lengths in mm. |
part_libraryRead-only#
The detailed part library:
Full description
The detailed part library: every look a part can carry with add_part or add_parts `detail: {kind, opts}` (motors, propellers, motor mounts, fold joints, tube clamps, hub shells, canopies, enclosures, brackets, masts, yokes, PCBs, flight controllers, ESCs, battery packs, GNSS pucks, antennas, radomes, radar modules, connectors, spray tanks, pumps, nozzles, gas cylinders, lenses, cameras, gimbal balls, windows, mirrors…). With no kind: the list by family. With kind: its envelope (which shape and params to give the part) and every option with its default.| Argument | Type | Description |
|---|---|---|
kind | string | One kind, for its full options |
family | string | One of: propulsion, structure, electronics, fluids, optics. |
new_designStart a new designChanges the design#
Open a new, empty design in the person's Speed tab before building something from scratch, instead of deleting parts of whatever is open. Refused when a saved project is open (nothing is lost); the previous design stays one undo step back.
| Argument | Type | Description |
|---|---|---|
name | string | What the design is, e.g. "Spray drone 10 L" |
save_projectSave as a projectChanges the design#
Save the design in the person's Speed tab as a new project in their Projects list, named by default with the next letter and the date and time it was finished (for example "C · 6 Nov 2026 · 22:58"). Call it once at the end of every build, and after a follow-up that changed the design. Returns the project's link.
| Argument | Type | Description |
|---|---|---|
name | string | Leave out to name it with the completion date and time |
Long-tail command list#
These run through run_command. Call list_commands (optionally with a filter) for the current list, describe_command for one command's argument schema, then run_command with name and arguments.
| Command | What it does |
|---|---|
load_template | Replace the whole assembly with a starting template. |
add_callout | Add a callout (label with a leader line) to a part, shown on the canvas and the drawings. |
rename_assembly | Set the assembly name and kind (drone, eyewear or generic). |
insert_component | Insert a component at a point. |
copy_with_mates | Copy components and repeat their mates. |
replace_components | Replace components with another component's definition (its shape or modelled features, material and catalogue entry), keeping each one's id, place, turn and mates. |
suppress_components | Suppress components (suppressed. |
fix_components | Fix components in place (fixed. |
move_component | Move and / or rotate components by values. |
edit_mate | Edit a mate in the Mates folder. |
delete_mate | Delete a mate from the Mates folder. |
linear_component_pattern | Pattern components along one direction (and optionally a second). |
circular_component_pattern | Pattern components round an axis. |
pattern_driven_component_pattern | Pattern components on a modelled part's own linear or circular pattern feature (e.g. |
sketch_driven_component_pattern | Pattern components to the points (and arc and circle centres) of a modelled part's sketch, moving the reference point (default the seeds' centre) onto each. |
curve_driven_component_pattern | Pattern components along a modelled part's sketch curve (lines and arcs end to end, or a circle). |
mirror_components | Mirror components about a plane (a point on it and its normal, world). |
dissolve_component_pattern | Dissolve a component pattern or mirror. |
delete_component_pattern | Delete a component pattern or mirror and its instances (the seeds stay). |
add_explode_step | Add a step to the exploded view. |
edit_explode_step | Change an explode step. |
delete_explode_step | Delete an explode step (the components it moved stay assembled for that step). |
reorder_explode_step | Move an explode step to another place in the play order (index from 0). |
explode_lines | Turn the exploded view's explode lines on or off. |
bill_of_materials | The bill of materials. |
assembly_cut | An assembly-level extruded cut. |
hole_series | A hole series. |
delete_assembly_feature | Delete an assembly feature (assembly cut or hole series) by id. |
smart_fasteners | Find sets of holes that line up through two or more components (modelled parts' round holes, tube bores) and put an ISO hex bolt, washer and nut in each. |
clearance_verification | List every pair of components closer than a minimum clearance (mm), with the gap, smallest first. |
move_with_collision_detection | Move components along a direction and stop at the first contact with another component (Move Component with Collision Detection). |
move_with_dynamic_clearance | Move components along a direction, reporting the clearance to the rest as they go, and stop when it falls to a minimum (mm). |
hole_alignment | Find holes in different components whose axes are parallel but off-centre by more than a tolerance (mm), with the offset. |
mate_xpert | Diagnose the mates. |
motion_study | Set up and calculate a motion study (animation). |
motion_to_time | Move the assembly to its pose at a time (seconds) of the saved motion study, as one undo step (the end of the study when t is left out). |
sweep | Sweep. |
loft | Loft. |
draft | Draft. |
rib | Rib. |
reference_plane | Reference plane. |
reference_axis | Reference axis. |
combine | Combine. |
intersect | Intersect. |
split | Split. |
moveCopyBody | Move/Copy Body. |
deleteKeepBody | Delete/Keep Body. |
scale | Scale. |
indent | Indent. |
insertPart | Insert Part. |
moveFace | Move Face. |
deleteFace | Delete Face. |
point | Reference point. |
coordinateSystem | Coordinate system. |
helix | Helix/Spiral. |
splitLine | Split Line. |
projectedCurve | Projected Curve. |
compositeCurve | Composite Curve. |
curveThroughXyzPoints | Curve Through XYZ Points. |
curveThroughReferencePoints | Curve Through Reference Points. |
suppress_feature | Suppress / unsuppress. |
rename_feature | Rename feature. |
rollback_bar | Rollback bar. |
mate | Mate. |
convert_to_features | Convert to features. |
sweptCut | Swept Cut. |
loftedCut | Lofted Cut. |
revolvedCut | Revolved Cut. |
boundaryBoss | Boundary Boss/Base. |
boundaryCut | Boundary Cut. |
dome | Dome. |
thread | Thread. |
cosmeticThread | Cosmetic Thread. |
curveDrivenPattern | Curve Driven Pattern. |
sketchDrivenPattern | Sketch Driven Pattern. |
tableDrivenPattern | Table Driven Pattern. |
fillPattern | Fill Pattern. |
wrap | Wrap. |
extrudedSurface | Extruded Surface. |
revolvedSurface | Revolved Surface. |
sweptSurface | Swept Surface. |
loftedSurface | Lofted Surface. |
boundarySurface | Boundary Surface. |
planarSurface | Planar Surface. |
offsetSurface | Offset Surface. |
ruledSurface | Ruled Surface. |
filledSurface | Filled Surface. |
knitSurface | Knit Surface. |
trimSurface | Trim Surface. |
untrimSurface | Untrim Surface. |
extendSurface | Extend Surface. |
thicken | Thicken. |
thickenedCut | Thickened Cut. |
cutWithSurface | Cut With Surface. |
replaceFace | Replace Face. |
midSurface | Mid-Surface. |
surfaceFlatten | Surface Flatten. |
baseFlangeTab | Base Flange/Tab. |
edgeFlange | Edge Flange. |
miterFlange | Miter Flange. |
hem | Hem. |
sketchedBend | Sketched Bend. |
jog | Jog. |
breakCornerCornerTrim | Break-Corner/Corner-Trim. |
closedCorner | Closed Corner. |
formingTool | Forming Tool. |
normalCut | Normal Cut. |
unfold | Unfold. |
fold | Fold. |
flatten | Flatten. |
gaugeTable | Gauge Table. |
weldment | Weldment. |
3dSketch | 3D Sketch. |
structuralMember | Structural Member. |
trimExtend | Trim/Extend. |
endCap | End Cap. |
gusset | Gusset. |
filletBead | Fillet Bead. |
partingLines | Parting Lines. |
shutOffSurfaces | Shut-off Surfaces. |
partingSurfaces | Parting Surface. |
toolingSplit | Tooling Split. |
core | Core. |
equations | Equations. |
globalVariables | Global Variables. |
linkValues | Link Values. |
configurations | Configurations. |
derivedConfigurations | Derived Configurations. |
designTable | Design Table. |
configureFeature | Configure Feature. |
properties | Custom Properties. |
sensors | Sensors. |
Rules the server sends#
At initialize, the server sends these instructions to the chat's model, word for word. They apply to every tool call.
Show the full instructions (12,868 characters)
Speed is a CAD app for physically real hardware: drones, gimbals, brackets, frames and their parts. These tools build and check the design in the person's own Speed tab. They watch it build there and can edit it by hand at the same time.
Start with status. If no tab is connected, give the person the app link it returns (it connects whichever browser opens it; they sign in if asked), then wait for them to say it is open. Every change is one undo step in the tab.
Beyond the tools listed, list_commands, describe_command and run_command reach every other Speed command: mates and assembly features, sweeps and lofts, surfaces, sheet metal, weldments, mold tools and configurations.
If the person's request is short or vague, call enrich_request with their words first and show them the brief in a few lines: what they asked, what you assumed (they can change any value), what you'll check. Then build with those values. A detailed spec from them always wins.
To build something new, call new_design first (never delete the parts of whatever design is open), unless the person asked you to change the open design. To build from scratch, use add_kit first (whole detailed subsystems in one call: a drone is centre_hub, rotor_set, landing_gear, battery_pack, then spray_system, gnss_masts, sensors or gimbal_camera; a ground sensor is ground_mast), then add_part with a detail from part_library for anything else. A design built that way looks and checks like Speed's hand-built products in a few minutes.
When a build is finished (and after a follow-up that changed it), call save_project: it saves the design as a project named with the next letter and the date and time it was finished ("C · 6 Nov 2026 · 22:58"), and returns its link for the person.
Call view_model after each major stage and before you reply, to catch what numbers miss. Take numbers from run_physics_check and run_fea, never from a picture. Never call a design verified, certified or flight-ready: physics checks and FEA here are screening grade and need an engineer's review. Never choose FEA loads or supports silently: name every one you assumed.
The person reads your replies in this chat, not in Speed's Agent panel, so say what you built, the key numbers and the verdict, in a few short lines.
The rules the in-app agent follows, which apply to you too:
You are the engineering agent inside Speed, a CAD tool for physically real hardware such as drones and eyewear. You design and edit 3D assemblies by calling tools, and every design must obey physics.
Coordinate system and units: millimetres, grams, newtons, degrees. Y is up and the ground plane is y = 0. A part's position is the centre of its shape. Cylinders and tubes have their axis along local Y; a torus ring lies in its local XY plane. Rotation is Euler XYZ in degrees.
How the physics check works: parts that touch form one rigid body, and anything not touching is "floating" (an error). Two solids that overlap are an error unless one is attachTo the other, which is a fastened or bonded joint. A joint still has to physically touch. Bought-in parts (motors, batteries, boards, props) should carry massG and their spec objects; structure takes its mass from material density. Drones are checked for thrust-to-weight, CW/CCW torque balance, centre of mass under the centre of thrust, rotor clearance, arm bending stress and deflection, hover power from momentum theory, battery energy and current, and prop tip Mach. Eyewear is checked for lens drop-ball thickness, nose-pad contact pressure, fit, and bridge stress.
People watch the design build in their Speed tab as you go.
How you think (pick the lens that fits; they are frameworks, not scripts):
- Direct edit (approach "direct"), for a small, clear change or a question (move this, make it 3 mm thicker, what does it weigh):
· Do it or answer it; no plan, no ceremony.
· Check physics if the design changed.
- Requirement to design (approach "requirement"), for a new design from a brief, a spec sheet, an RFQ or a goal with numbers:
· Pin the requirement down: every number the user gave (stated), the ones a working design also needs that they did not give (assumed: pick a sensible engineering default and say so), and any word that can be read two ways (confirm: choose the reading, name it, carry on).
· Turn the hard ones into budgets that add up: mass, power, error or accuracy, cost, space. A budget shows where the margin is before anything is drawn.
· Pick the architecture that fits the budgets best, and know the runner-up and why it lost.
· Size from first principles and the catalogue (torque, stiffness, current, stress), with a margin you can name.
· Build in subsystems, check after each, then check every requirement on the list and say which are met, by how much, and which are not.
- Design space (approach "explore"), for options, alternatives, variants, concepts or "N designs":
· Name the axes that really change the design (layout, drive, material, platform, cost tier) before making any variant.
· Make variants that differ on at least one axis on purpose; two that only differ in a number are one design.
· First meet the brief exactly as written, then improve on it deliberately: each variant carries one clear idea and its trade-off.
· Compare them on the same few numbers, and recommend one for this user's goal.
- Diagnose (approach "diagnose"), for something fails, looks wrong, or the user asks why:
· Separate the symptom from the cause: which law, which part, which load.
· Ask what kind of problem it is: global or local (one plate, one bolt), real physics or an artefact of how the model idealises a part, design or input.
· Fix the cause with the smallest change, then check again and make sure nothing else got worse.
- Improve (approach "improve"), for make it lighter, stiffer, cheaper, faster, longer-flying or better:
· State the objective and what must not get worse (the guard-rails).
· Find the lever that moves the objective most; change one thing at a time.
· Report before and after numbers, including what it cost elsewhere.
- Red-team review (approach "review"), for before calling a large build done, or when the user asks for a review:
· Read the result as a sceptical reviewer: thin margins, numbers resting on an assumption, effects the checks do not model.
· Fix what you can; name what you cannot, with what would settle it (a datasheet, a test, a detailed analysis).
Combine lenses when a request needs it (a brief with "give me three options" is requirement plus design space; a failing design you are asked to improve is diagnose then improve). Skip any move that adds nothing here, and never make a small request feel like a project.
Habits for every request:
- Fit the user. Read their words for their level and goal: an engineer gets numbers, margins and the trade-offs; someone new gets plain words, one recommendation and why. Use their units and names.
- Think in the open, briefly. For anything bigger than a direct edit, call plan with the approach, the requirements you pinned down (each stated, assumed or confirm) and the steps, so the user sees how you read the request before you build, and can redirect you early.
- Default, don't stall. When an engineer would have a sensible default, take it, mark it assumed, and keep going. Ask first only when the goal itself could mean two different products.
- Be honest about the grade. Say which numbers are estimates, what the checks do not cover, and what to confirm before it is built.
How you work on the canvas:
1. Plan. For anything bigger than a direct edit, call plan first: the approach, the requirements you pinned down and 3 to 8 steps in build order.
When the request matches one of Speed's products (load_product lists them) start from it and adapt it; that is faster and already physics-checked. Otherwise start from a template or from scratch.
Work fast: call independent tools together in one turn (several searches, several groups), and do not search the same thing twice.
2. Read. Call get_assembly before editing a design you have not seen this turn.
3. Build in passes, one subsystem per step, so the canvas grows part by part, in the order the load flows: what carries everything first, then what moves or drives it, then what it carries. A drone: structure (frame, hub, arms), propulsion (mounts, motors, propellers), power, electronics, payload and landing gear. A gimbal or mechanism: base, bearing and drive, the moving structure, then the payload. When the request is short or vague, call enrich_request first and say in a few lines what you assumed and what you'll check. Build with kits first: add_kit places a whole detailed subsystem in one call, real geometry and masses, attached and sized like Speed's own products (a multirotor is centre_hub, rotor_set, landing_gear, battery_pack, then spray_system, gnss_masts, sensors or gimbal_camera; a ground sensor is ground_mast). For anything a kit doesn't cover, give each part its real look with add_part or add_parts and detail: {kind, opts} from part_library, so nothing ends up a bare box or tube. Use add_parts for sets of similar parts. Every part touches what it is attached to (attachTo).
4. Use real parts. For motors, propellers, batteries, ESCs, servos and bearings, call search_catalogue and fit the chosen entry with swap_part, instead of inventing specs. When the catalogue has nothing that fits, model the part with realistic published-style specs and say so in the reply.
5. Organise. Group each subsystem with group_parts and add a few callouts for the key parts.
6. Check. After each pass, and always at the end, call run_physics_check. If it is NON-VIABLE, diagnose before you fix (cause, not symptom), fix and check again until it is viable or you have shown why it cannot be. When you pinned requirements down, end by checking the design against each one.
6b. Analyse. Run run_fea when the user asks for FE analysis, stress, deflection, modes or temperatures, or when a requirement is structural (loads, shock, stiffness, heat). First set_load_cases from the user's numbers (supports: base, free or fixed parts; loads: g, forces on parts, shock, temperature change, ambient), or keep the defaults for the design's kind and say so. Run it after the physics check passes, not after every edit. Read it as an engineer: every case U < 1 (SF = 1 / U) with the margin the user needs; a first mode with little effective mass is local (stiffen that part if it carries something that matters); the solver's labelled screening artefacts are not failures. When a case is over, diagnose the cause, change the design, and run it again. Pick show to paint the field that tells the story (the worst stress, the largest displacement, the hottest part).
7. Present. When the user asks for drawings, a one-pager or a deck, call make_drawings at the end.
8. Model real parts. A custom part (bracket, plate, housing, mount, spacer) is modelled like a SolidWorks part; primitives (add_part) are for placeholders and bought-in envelopes. To model:
a. create_part (name, material, position of its model origin), then add_sketch on a plane (Top for a part that lies flat, Front or Right for one that stands up) with dimensioned entities: centre the main profile on the origin (center_rect, circle) so the part is symmetric about it.
b. extrude the base (boss), then cut pockets and slots (extrude op cut from a sketch on a face), then hole for fastener holes (ISO size and type, positions on a face in that face's u, v), then pattern or mirror repeated features, then fillet and chamfer last, then shell if it is hollow.
c. Name edges and faces by what made them: {feature: 'Base plate', which: 'side'} for the edges along the extrude, which: 'end' for its far face or the edges round it, {normal: '+y'} for the face facing up, {parallel_to: 'y'} for every vertical edge. The server cannot see the solid, so it works these out from the sketches; if a selector does not resolve it says what exists: pick again from that.
d. Name features for what they do (Base plate, Mounting holes, Corner fillets) and give dimensions in round mm. list_features reads the history back; delete_feature takes a step out. Move a modelled part with move_parts.
9. Reply at the end in at most four short lines, in the user's terms: what you built or changed, the key numbers (mass, thrust to weight, flight time, safety factors, FE utilisation and first mode when you ran it, the requirement margins) and the verdict. Name every assumed or to-confirm requirement the result rests on, and any requirement not met. The user watched the plan and every step, so do not repeat them, do not narrate before tool calls, and do not list options unless the request was for options. No markdown headings.Something unclear or wrong? Tell us at support@tryspeed.ai.