Skip to content

Commit 67b8163

Browse files
Update api spec (#541)
* 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 8fdcd89 commit 67b8163

File tree

4 files changed

+60
-10
lines changed

4 files changed

+60
-10
lines changed

kittycad.py.patch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@
179179
"op": "add",
180180
"path": "/paths/~1file~1conversion/post/x-python",
181181
"value": {
182-
"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 OptionSldprt\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(OptionSldprt(\n split_closed_faces=False,\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",
182+
"example": "from kittycad.models.conversion_params import ConversionParams\nfrom kittycad.models.output_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.selection import OptionDefaultScene\nfrom kittycad.models.selection import Selection\nfrom kittycad.models.stl_storage import StlStorage\nfrom kittycad.models.unit_length import UnitLength\nfrom kittycad.models.output_format3d import OutputFormat3d\nfrom kittycad.models.input_format3d import OptionSldprt\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(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 selection=Selection(OptionDefaultScene()),\n storage=StlStorage.ASCII,\n units=UnitLength.CM,\n )),\n src_format=InputFormat3d(OptionSldprt(\n split_closed_faces=False,\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",
183183
"libDocsLink": "https://python.api.docs.zoo.dev/_autosummary/kittycad.KittyCAD.html#kittycad.KittyCAD.file"
184184
}
185185
},

kittycad/models/ml_copilot_server_message.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import datetime
2-
from typing import List, Optional, Union
2+
from typing import Dict, List, Optional, Union
33

44
from pydantic import RootModel, model_serializer, model_validator
55

@@ -151,6 +151,30 @@ def _wrap(self, handler, info):
151151
return {"info": payload}
152152

153153

154+
class ProjectUpdated(KittyCadBaseModel):
155+
"""Notification that the KCL project has been updated."""
156+
157+
files: Dict[str, str]
158+
159+
@model_validator(mode="before")
160+
@classmethod
161+
def _unwrap(cls, data):
162+
if (
163+
isinstance(data, dict)
164+
and "project_updated" in data
165+
and isinstance(data["project_updated"], dict)
166+
):
167+
return data["project_updated"]
168+
169+
return data
170+
171+
@model_serializer(mode="wrap")
172+
def _wrap(self, handler, info):
173+
payload = handler(self, info)
174+
175+
return {"project_updated": payload}
176+
177+
154178
class Reasoning(KittyCadBaseModel):
155179
"""Assistant reasoning / chain-of-thought (if you expose it)."""
156180

@@ -160,7 +184,7 @@ class Reasoning(KittyCadBaseModel):
160184
class Replay(KittyCadBaseModel):
161185
"""Replay containing raw bytes for previously-saved messages for a conversation. Includes server messages and client `User` messages.
162186
163-
Invariants: - Includes server messages: `Info`, `Error`, `Reasoning(..)`, `ToolOutput { .. }`, and `EndOfStream { .. }`. - Also includes client `User` messages. - The following are NEVER included: `SessionData`, `ConversationId`, or `Delta`. - Ordering is stable: messages are ordered by prompt creation time within the conversation, then by the per-prompt `seq` value (monotonically increasing as seen in the original stream).
187+
Invariants: - Includes server messages: `Info`, `Error`, `Reasoning(..)`, `ToolOutput { .. }`, `ProjectUpdated { .. }`, and `EndOfStream { .. }`. - Also includes client `User` messages. - The following are NEVER included: `SessionData`, `ConversationId`, or `Delta`. - Ordering is stable: messages are ordered by prompt creation time within the conversation, then by the per-prompt `seq` value (monotonically increasing as seen in the original stream).
164188
165189
Wire format: - Each element is canonical serialized bytes (typically JSON) for either a `MlCopilotServerMessage` or a `MlCopilotClientMessage::User`. - When delivered as an initial replay over the websocket (upon `?replay=true&conversation_id=<uuid>`), the server sends a single WebSocket Binary frame containing a BSON-encoded document of this enum: `Replay { messages }`."""
166190

@@ -225,6 +249,7 @@ def _wrap(self, handler, info):
225249
ToolOutput,
226250
Error,
227251
Info,
252+
ProjectUpdated,
228253
Reasoning,
229254
Replay,
230255
EndOfStream,

kittycad/tests/test_examples.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,8 @@
107107
from kittycad.models.modeling_app_event_type import ModelingAppEventType
108108
from kittycad.models.org_dataset_source import OrgDatasetSource
109109
from kittycad.models.org_details import OrgDetails
110-
from kittycad.models.output_format3d import OptionPly, OutputFormat3d
110+
from kittycad.models.output_format3d import OptionStl, OutputFormat3d
111111
from kittycad.models.plan_interval import PlanInterval
112-
from kittycad.models.ply_storage import PlyStorage
113112
from kittycad.models.post_effect_type import PostEffectType
114113
from kittycad.models.privacy_settings import PrivacySettings
115114
from kittycad.models.rtc_ice_candidate_init import RtcIceCandidateInit
@@ -120,6 +119,7 @@
120119
from kittycad.models.source_position import SourcePosition
121120
from kittycad.models.source_range import SourceRange
122121
from kittycad.models.source_range_prompt import SourceRangePrompt
122+
from kittycad.models.stl_storage import StlStorage
123123
from kittycad.models.storage_provider import StorageProvider
124124
from kittycad.models.store_coupon_params import StoreCouponParams
125125
from kittycad.models.subscribe import Subscribe
@@ -627,7 +627,7 @@ def test_create_file_conversion_options():
627627
result: FileConversion = client.file.create_file_conversion_options(
628628
body=ConversionParams(
629629
output_format=OutputFormat3d(
630-
OptionPly(
630+
OptionStl(
631631
coords=System(
632632
forward=AxisDirectionPair(
633633
axis=Axis.Y,
@@ -639,7 +639,7 @@ def test_create_file_conversion_options():
639639
),
640640
),
641641
selection=Selection(OptionDefaultScene()),
642-
storage=PlyStorage.ASCII,
642+
storage=StlStorage.ASCII,
643643
units=UnitLength.CM,
644644
)
645645
),
@@ -668,7 +668,7 @@ async def test_create_file_conversion_options_async():
668668
result: FileConversion = await client.file.create_file_conversion_options(
669669
body=ConversionParams(
670670
output_format=OutputFormat3d(
671-
OptionPly(
671+
OptionStl(
672672
coords=System(
673673
forward=AxisDirectionPair(
674674
axis=Axis.Y,
@@ -680,7 +680,7 @@ async def test_create_file_conversion_options_async():
680680
),
681681
),
682682
selection=Selection(OptionDefaultScene()),
683-
storage=PlyStorage.ASCII,
683+
storage=StlStorage.ASCII,
684684
units=UnitLength.CM,
685685
)
686686
),

spec.json

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30957,6 +30957,31 @@
3095730957
],
3095830958
"additionalProperties": false
3095930959
},
30960+
{
30961+
"description": "Notification that the KCL project has been updated.",
30962+
"type": "object",
30963+
"properties": {
30964+
"project_updated": {
30965+
"type": "object",
30966+
"properties": {
30967+
"files": {
30968+
"description": "Map of file paths to their latest contents. The file contents are not encoded since kcl files are not binary.",
30969+
"type": "object",
30970+
"additionalProperties": {
30971+
"type": "string"
30972+
}
30973+
}
30974+
},
30975+
"required": [
30976+
"files"
30977+
]
30978+
}
30979+
},
30980+
"required": [
30981+
"project_updated"
30982+
],
30983+
"additionalProperties": false
30984+
},
3096030985
{
3096130986
"description": "Assistant reasoning / chain-of-thought (if you expose it).",
3096230987
"type": "object",
@@ -30971,7 +30996,7 @@
3097130996
"additionalProperties": false
3097230997
},
3097330998
{
30974-
"description": "Replay containing raw bytes for previously-saved messages for a conversation. Includes server messages and client `User` messages.\n\nInvariants: - Includes server messages: `Info`, `Error`, `Reasoning(..)`, `ToolOutput { .. }`, and `EndOfStream { .. }`. - Also includes client `User` messages. - The following are NEVER included: `SessionData`, `ConversationId`, or `Delta`. - Ordering is stable: messages are ordered by prompt creation time within the conversation, then by the per-prompt `seq` value (monotonically increasing as seen in the original stream).\n\nWire format: - Each element is canonical serialized bytes (typically JSON) for either a `MlCopilotServerMessage` or a `MlCopilotClientMessage::User`. - When delivered as an initial replay over the websocket (upon `?replay=true&conversation_id=<uuid>`), the server sends a single WebSocket Binary frame containing a BSON-encoded document of this enum: `Replay { messages }`.",
30999+
"description": "Replay containing raw bytes for previously-saved messages for a conversation. Includes server messages and client `User` messages.\n\nInvariants: - Includes server messages: `Info`, `Error`, `Reasoning(..)`, `ToolOutput { .. }`, `ProjectUpdated { .. }`, and `EndOfStream { .. }`. - Also includes client `User` messages. - The following are NEVER included: `SessionData`, `ConversationId`, or `Delta`. - Ordering is stable: messages are ordered by prompt creation time within the conversation, then by the per-prompt `seq` value (monotonically increasing as seen in the original stream).\n\nWire format: - Each element is canonical serialized bytes (typically JSON) for either a `MlCopilotServerMessage` or a `MlCopilotClientMessage::User`. - When delivered as an initial replay over the websocket (upon `?replay=true&conversation_id=<uuid>`), the server sends a single WebSocket Binary frame containing a BSON-encoded document of this enum: `Replay { messages }`.",
3097531000
"type": "object",
3097631001
"properties": {
3097731002
"replay": {

0 commit comments

Comments
 (0)