Skip to content

Commit 8fb689e

Browse files
Update api spec (#604)
* YOYO NEW API SPEC! * I have generated the latest API! --------- Co-authored-by: zoo-github-actions-auth[bot] <zoo-github-actions-auth[bot]@users.noreply.github.com>
1 parent ac63465 commit 8fb689e

11 files changed

+515
-54
lines changed

kittycad.py.patch.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@
187187
"op": "add",
188188
"path": "/paths/~1file~1conversion/post/x-python",
189189
"value": {
190-
"example": "from kittycad.models.conversion_params import ConversionParams\nfrom kittycad.models.output_format3d import OptionPly\nfrom kittycad.models.system import System\nfrom kittycad.models.axis_direction_pair import AxisDirectionPair\nfrom kittycad.models.axis import Axis\nfrom kittycad.models.direction import Direction\nfrom kittycad.models.axis_direction_pair import AxisDirectionPair\nfrom kittycad.models.axis import Axis\nfrom kittycad.models.direction import Direction\nfrom kittycad.models.selection import OptionDefaultScene\nfrom kittycad.models.selection import Selection\nfrom kittycad.models.ply_storage import PlyStorage\nfrom kittycad.models.unit_length import UnitLength\nfrom kittycad.models.output_format3d import OutputFormat3d\nfrom kittycad.models.input_format3d import OptionPly\nfrom kittycad.models.system import System\nfrom kittycad.models.axis_direction_pair import AxisDirectionPair\nfrom kittycad.models.axis import Axis\nfrom kittycad.models.direction import Direction\nfrom kittycad.models.axis_direction_pair import AxisDirectionPair\nfrom kittycad.models.axis import Axis\nfrom kittycad.models.direction import Direction\nfrom kittycad.models.unit_length import UnitLength\nfrom kittycad.models.input_format3d import InputFormat3d\nfrom pathlib import Path\nfrom typing import Dict\nfrom kittycad._io_types import SyncUpload\nfrom kittycad.models import FileConversion\nfrom typing import Union, Any, Optional, List, Tuple\nfrom kittycad.types import Response\ndef example_create_file_conversion_options():\n client = KittyCAD() # Uses KITTYCAD_API_TOKEN environment variable\n\n result: FileConversion = client.file.create_file_conversion_options(body=ConversionParams(\n output_format=OutputFormat3d(OptionPly(\n coords=System(\n forward=AxisDirectionPair(\n axis=Axis.Y,\n direction=Direction.POSITIVE,\n ),\n up=AxisDirectionPair(\n axis=Axis.Y,\n direction=Direction.POSITIVE,\n ),\n ),\n selection=Selection(OptionDefaultScene()),\n storage=PlyStorage.ASCII,\n units=UnitLength.CM,\n )),\n src_format=InputFormat3d(OptionPly(\n coords=System(\n forward=AxisDirectionPair(\n axis=Axis.Y,\n direction=Direction.POSITIVE,\n ),\n up=AxisDirectionPair(\n axis=Axis.Y,\n direction=Direction.POSITIVE,\n ),\n ),\n units=UnitLength.CM,\n )),\n ),\n file_attachments={\n \"main.kcl\": Path(\"path/to/main.kcl\"),\n \"helper.kcl\": Path(\"path/to/helper.kcl\"),\n })\n\n\n body: FileConversion = result\n print(body)\n\n",
190+
"example": "from kittycad.models.conversion_params import ConversionParams\nfrom kittycad.models.output_format3d import OptionGltf\nfrom kittycad.models.gltf_presentation import GltfPresentation\nfrom kittycad.models.gltf_storage import GltfStorage\nfrom kittycad.models.output_format3d import OutputFormat3d\nfrom kittycad.models.input_format3d import OptionStl\nfrom kittycad.models.system import System\nfrom kittycad.models.axis_direction_pair import AxisDirectionPair\nfrom kittycad.models.axis import Axis\nfrom kittycad.models.direction import Direction\nfrom kittycad.models.axis_direction_pair import AxisDirectionPair\nfrom kittycad.models.axis import Axis\nfrom kittycad.models.direction import Direction\nfrom kittycad.models.unit_length import UnitLength\nfrom kittycad.models.input_format3d import InputFormat3d\nfrom pathlib import Path\nfrom typing import Dict\nfrom kittycad._io_types import SyncUpload\nfrom kittycad.models import FileConversion\nfrom typing import Union, Any, Optional, List, Tuple\nfrom kittycad.types import Response\ndef example_create_file_conversion_options():\n client = KittyCAD() # Uses KITTYCAD_API_TOKEN environment variable\n\n result: FileConversion = client.file.create_file_conversion_options(body=ConversionParams(\n output_format=OutputFormat3d(OptionGltf(\n presentation=GltfPresentation.COMPACT,\n storage=GltfStorage.BINARY,\n )),\n src_format=InputFormat3d(OptionStl(\n coords=System(\n forward=AxisDirectionPair(\n axis=Axis.Y,\n direction=Direction.POSITIVE,\n ),\n up=AxisDirectionPair(\n axis=Axis.Y,\n direction=Direction.POSITIVE,\n ),\n ),\n units=UnitLength.CM,\n )),\n ),\n file_attachments={\n \"main.kcl\": Path(\"path/to/main.kcl\"),\n \"helper.kcl\": Path(\"path/to/helper.kcl\"),\n })\n\n\n body: FileConversion = result\n print(body)\n\n",
191191
"libDocsLink": "https://python.api.docs.zoo.dev/_autosummary/kittycad.KittyCAD.html#kittycad.KittyCAD.file"
192192
}
193193
},
@@ -1379,23 +1379,23 @@
13791379
"op": "add",
13801380
"path": "/paths/~1ws~1ml~1copilot/get/x-python",
13811381
"value": {
1382-
"example": "from kittycad.models import MlCopilotClientMessage\nfrom kittycad.models.ml_copilot_client_message import OptionHeaders\nfrom kittycad.models import MlCopilotServerMessage\nfrom typing import Union, Any, Optional, List, Tuple\nfrom kittycad.types import Response\ndef example_ml_copilot_ws():\n client = KittyCAD() # Uses KITTYCAD_API_TOKEN environment variable\n\n # Connect to the websocket.\n with client.ml.ml_copilot_ws(conversation_id=None,\n replay=None,\n pr=None) as websocket:\n\n # Send a message.\n websocket.send(MlCopilotClientMessage(OptionHeaders(\nheaders={\"<string>\": \"<string>\"},\n)))\n\n # Get a message.\n message = websocket.recv()\n print(message)\n\n ",
1382+
"example": "from kittycad.models import MlCopilotClientMessage\nfrom kittycad.models.ml_copilot_client_message import OptionUser\nfrom kittycad.models.ml_copilot_file import MlCopilotFile\nfrom typing import List\nfrom kittycad.models.ml_copilot_tool import MlCopilotTool\nfrom typing import List\nfrom kittycad.models.source_range_prompt import SourceRangePrompt\nfrom kittycad.models.source_range import SourceRange\nfrom kittycad.models.source_position import SourcePosition\nfrom kittycad.models.source_position import SourcePosition\nfrom typing import List\nfrom kittycad.models import MlCopilotServerMessage\nfrom typing import Union, Any, Optional, List, Tuple\nfrom kittycad.types import Response\ndef example_ml_copilot_ws():\n client = KittyCAD() # Uses KITTYCAD_API_TOKEN environment variable\n\n # Connect to the websocket.\n with client.ml.ml_copilot_ws(conversation_id=None,\n replay=None,\n pr=None) as websocket:\n\n # Send a message.\n websocket.send(MlCopilotClientMessage(OptionUser(\nadditional_files=[MlCopilotFile(\ndata=b\"<bytes>\",\n\nmimetype=\"<string>\",\n\nname=\"<string>\",\n)],\n\ncontent=\"<string>\",\n\ncurrent_files={\"<string>\": b\"<bytes>\"},\n\nforced_tools=[MlCopilotTool.EDIT_KCL_CODE],\n\nsource_ranges=[SourceRangePrompt(\nprompt=\"<string>\",\n\nrange=SourceRange(\nend=SourcePosition(\ncolumn=10,\n\nline=10,\n),\n\nstart=SourcePosition(\ncolumn=10,\n\nline=10,\n),\n),\n)],\n)))\n\n # Get a message.\n message = websocket.recv()\n print(message)\n\n ",
13831383
"libDocsLink": "https://python.api.docs.zoo.dev/_autosummary/kittycad.KittyCAD.html#kittycad.KittyCAD.ml"
13841384
}
13851385
},
13861386
{
13871387
"op": "add",
13881388
"path": "/paths/~1ws~1ml~1reasoning~1{id}/get/x-python",
13891389
"value": {
1390-
"example": "from kittycad.models import MlCopilotClientMessage\nfrom kittycad.models.ml_copilot_client_message import OptionSystem\nfrom kittycad.models.ml_copilot_system_command import MlCopilotSystemCommand\nfrom kittycad.models import MlCopilotServerMessage\nfrom typing import Union, Any, Optional, List, Tuple\nfrom kittycad.types import Response\ndef example_ml_reasoning_ws():\n client = KittyCAD() # Uses KITTYCAD_API_TOKEN environment variable\n\n # Connect to the websocket.\n with client.ml.ml_reasoning_ws(id=\"<string>\") as websocket:\n\n # Send a message.\n websocket.send(MlCopilotClientMessage(OptionSystem(\ncommand=MlCopilotSystemCommand.NEW,\n)))\n\n # Get a message.\n message = websocket.recv()\n print(message)\n\n ",
1390+
"example": "from kittycad.models import MlCopilotClientMessage\nfrom kittycad.models.ml_copilot_client_message import OptionHeaders\nfrom kittycad.models import MlCopilotServerMessage\nfrom typing import Union, Any, Optional, List, Tuple\nfrom kittycad.types import Response\ndef example_ml_reasoning_ws():\n client = KittyCAD() # Uses KITTYCAD_API_TOKEN environment variable\n\n # Connect to the websocket.\n with client.ml.ml_reasoning_ws(id=\"<string>\") as websocket:\n\n # Send a message.\n websocket.send(MlCopilotClientMessage(OptionHeaders(\nheaders={\"<string>\": \"<string>\"},\n)))\n\n # Get a message.\n message = websocket.recv()\n print(message)\n\n ",
13911391
"libDocsLink": "https://python.api.docs.zoo.dev/_autosummary/kittycad.KittyCAD.html#kittycad.KittyCAD.ml"
13921392
}
13931393
},
13941394
{
13951395
"op": "add",
13961396
"path": "/paths/~1ws~1modeling~1commands/get/x-python",
13971397
"value": {
1398-
"example": "from kittycad.models.post_effect_type import PostEffectType\nfrom kittycad.models import WebSocketRequest\nfrom kittycad.models.web_socket_request import OptionModelingCmdReq\nfrom kittycad.models.modeling_cmd import OptionEntityFade\nfrom kittycad.models.modeling_cmd import ModelingCmd\nfrom kittycad.models.modeling_cmd_id import ModelingCmdId\nfrom kittycad.models.modeling_cmd_id import ModelingCmdId\nfrom kittycad.models import WebSocketResponse\nfrom typing import Union, Any, Optional, List, Tuple\nfrom kittycad.types import Response\ndef example_modeling_commands_ws():\n client = KittyCAD() # Uses KITTYCAD_API_TOKEN environment variable\n\n # Connect to the websocket.\n with client.modeling.modeling_commands_ws(fps=10,\n order_independent_transparency=False,\n post_effect=PostEffectType.PHOSPHOR,\n show_grid=False,\n unlocked_framerate=False,\n video_res_height=10,\n video_res_width=10,\n webrtc=False,\n api_call_id=None,\n pool=None,\n replay=None,\n pr=None) as websocket:\n\n # Send a message.\n websocket.send(WebSocketRequest(OptionModelingCmdReq(\ncmd=ModelingCmd(OptionEntityFade(\nduration_seconds=3.14,\n\nentity_id=\"<string>\",\n\nfade_in=False,\n)),\n\ncmd_id=ModelingCmdId(\"<string>\"),\n)))\n\n # Get a message.\n message = websocket.recv()\n print(message)\n\n ",
1398+
"example": "from kittycad.models.post_effect_type import PostEffectType\nfrom kittycad.models import WebSocketRequest\nfrom kittycad.models.web_socket_request import OptionModelingCmdReq\nfrom kittycad.models.modeling_cmd import OptionEntityMakeHelix\nfrom kittycad.models.angle import Angle\nfrom kittycad.models.unit_angle import UnitAngle\nfrom kittycad.models.modeling_cmd import ModelingCmd\nfrom kittycad.models.modeling_cmd_id import ModelingCmdId\nfrom kittycad.models.modeling_cmd_id import ModelingCmdId\nfrom kittycad.models import WebSocketResponse\nfrom typing import Union, Any, Optional, List, Tuple\nfrom kittycad.types import Response\ndef example_modeling_commands_ws():\n client = KittyCAD() # Uses KITTYCAD_API_TOKEN environment variable\n\n # Connect to the websocket.\n with client.modeling.modeling_commands_ws(fps=10,\n order_independent_transparency=False,\n post_effect=PostEffectType.PHOSPHOR,\n show_grid=False,\n unlocked_framerate=False,\n video_res_height=10,\n video_res_width=10,\n webrtc=False,\n api_call_id=None,\n pool=None,\n replay=None,\n pr=None) as websocket:\n\n # Send a message.\n websocket.send(WebSocketRequest(OptionModelingCmdReq(\ncmd=ModelingCmd(OptionEntityMakeHelix(\ncylinder_id=\"<string>\",\n\nis_clockwise=False,\n\nrevolutions=3.14,\n\nstart_angle=Angle(\nunit=UnitAngle.DEGREES,\n\nvalue=3.14,\n),\n)),\n\ncmd_id=ModelingCmdId(\"<string>\"),\n)))\n\n # Get a message.\n message = websocket.recv()\n print(message)\n\n ",
13991399
"libDocsLink": "https://python.api.docs.zoo.dev/_autosummary/kittycad.KittyCAD.html#kittycad.KittyCAD.modeling"
14001400
}
14011401
}

kittycad/models/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
from .boolean_intersection import BooleanIntersection
4949
from .boolean_subtract import BooleanSubtract
5050
from .boolean_union import BooleanUnion
51+
from .bounding_box import BoundingBox
5152
from .cad_discovery_source import CadDiscoverySource
5253
from .cad_industry import CadIndustry
5354
from .cad_user_type import CadUserType
@@ -62,6 +63,7 @@
6263
from .center_of_mass import CenterOfMass
6364
from .client_metrics import ClientMetrics
6465
from .close_path import ClosePath
66+
from .closest_edge import ClosestEdge
6567
from .code_language import CodeLanguage
6668
from .code_option import CodeOption
6769
from .code_output import CodeOutput
@@ -78,6 +80,7 @@
7880
from .create_custom_model import CreateCustomModel
7981
from .create_org_dataset import CreateOrgDataset
8082
from .create_region import CreateRegion
83+
from .create_region_from_query_point import CreateRegionFromQueryPoint
8184
from .create_shortlink_request import CreateShortlinkRequest
8285
from .create_shortlink_response import CreateShortlinkResponse
8386
from .created_at_sort_mode import CreatedAtSortMode
@@ -246,6 +249,7 @@
246249
from .object_bring_to_front import ObjectBringToFront
247250
from .object_set_material_params_pbr import ObjectSetMaterialParamsPbr
248251
from .object_visible import ObjectVisible
252+
from .offset_surface import OffsetSurface
249253
from .ok_modeling_cmd_response import OkModelingCmdResponse
250254
from .ok_web_socket_response_data import OkWebSocketResponseData
251255
from .opposite_for_angle import OppositeForAngle
@@ -309,6 +313,7 @@
309313
from .raw_file import RawFile
310314
from .reasoning_message import ReasoningMessage
311315
from .reconfigure_stream import ReconfigureStream
316+
from .region_get_query_point import RegionGetQueryPoint
312317
from .relative_to import RelativeTo
313318
from .remove_scene_objects import RemoveSceneObjects
314319
from .revolve import Revolve

kittycad/models/bounding_box.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from ..models.point3d import Point3d
2+
from .base import KittyCadBaseModel
3+
4+
5+
class BoundingBox(KittyCadBaseModel):
6+
"""The response from the 'BoundingBox'."""
7+
8+
center: Point3d
9+
10+
dimensions: Point3d

kittycad/models/closest_edge.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from typing import Optional
2+
3+
from .base import KittyCadBaseModel
4+
5+
6+
class ClosestEdge(KittyCadBaseModel):
7+
"""The response from the 'ClosestEdge'."""
8+
9+
edge_id: Optional[str] = None
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .base import KittyCadBaseModel
2+
3+
4+
class CreateRegionFromQueryPoint(KittyCadBaseModel):
5+
"""The response from the 'CreateRegionFromQueryPoint'. The region should have an ID taken from the ID of the 'CreateRegionFromQueryPoint' modeling command."""

kittycad/models/modeling_cmd.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,10 +1528,14 @@ class OptionBooleanImprint(KittyCadBaseModel):
15281528

15291529
body_ids: List[str]
15301530

1531+
keep_tools: bool = False
1532+
15311533
separate_bodies: bool = False
15321534

15331535
tolerance: LengthUnit
15341536

1537+
tool_ids: Optional[List[str]] = None
1538+
15351539
type: Literal["boolean_imprint"] = "boolean_imprint"
15361540

15371541

@@ -1609,6 +1613,24 @@ class OptionCreateRegion(KittyCadBaseModel):
16091613
type: Literal["create_region"] = "create_region"
16101614

16111615

1616+
class OptionCreateRegionFromQueryPoint(KittyCadBaseModel):
1617+
"""Create a region with a query point. The region should have an ID taken from the ID of the 'CreateRegionFromQueryPoint' modeling command."""
1618+
1619+
object_id: str
1620+
1621+
query_point: Point2d
1622+
1623+
type: Literal["create_region_from_query_point"] = "create_region_from_query_point"
1624+
1625+
1626+
class OptionRegionGetQueryPoint(KittyCadBaseModel):
1627+
"""Finds a suitable point inside the region for calling such that CreateRegionFromQueryPoint will generate an identical region."""
1628+
1629+
region_id: str
1630+
1631+
type: Literal["region_get_query_point"] = "region_get_query_point"
1632+
1633+
16121634
class OptionSelectRegionFromPoint(KittyCadBaseModel):
16131635
"""The user clicked on a point in the window, returns the region the user clicked on, if any."""
16141636

@@ -1617,6 +1639,36 @@ class OptionSelectRegionFromPoint(KittyCadBaseModel):
16171639
type: Literal["select_region_from_point"] = "select_region_from_point"
16181640

16191641

1642+
class OptionBoundingBox(KittyCadBaseModel):
1643+
"""Get the smallest box that could contain the given parts."""
1644+
1645+
entity_ids: List[str]
1646+
1647+
type: Literal["bounding_box"] = "bounding_box"
1648+
1649+
1650+
class OptionOffsetSurface(KittyCadBaseModel):
1651+
"""Offset a surface by a given distance."""
1652+
1653+
distance: LengthUnit
1654+
1655+
flip: bool
1656+
1657+
surface_id: str
1658+
1659+
type: Literal["offset_surface"] = "offset_surface"
1660+
1661+
1662+
class OptionClosestEdge(KittyCadBaseModel):
1663+
"""Returns the closest edge to this point."""
1664+
1665+
closest_to: Point3d
1666+
1667+
object_id: Optional[str] = None
1668+
1669+
type: Literal["closest_edge"] = "closest_edge"
1670+
1671+
16201672
ModelingCmd = RootModel[
16211673
Annotated[
16221674
Union[
@@ -1767,7 +1819,12 @@ class OptionSelectRegionFromPoint(KittyCadBaseModel):
17671819
OptionSetGridAutoScale,
17681820
OptionSetOrderIndependentTransparency,
17691821
OptionCreateRegion,
1822+
OptionCreateRegionFromQueryPoint,
1823+
OptionRegionGetQueryPoint,
17701824
OptionSelectRegionFromPoint,
1825+
OptionBoundingBox,
1826+
OptionOffsetSurface,
1827+
OptionClosestEdge,
17711828
],
17721829
Field(discriminator="type"),
17731830
]

kittycad/models/offset_surface.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from .base import KittyCadBaseModel
2+
3+
4+
class OffsetSurface(KittyCadBaseModel):
5+
"""The response from the 'OffsetSurface'."""

0 commit comments

Comments
 (0)