wandelbots-api-client 26.1.0.dev53__py3-none-any.whl → 26.1.0.dev63__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. wandelbots_api_client/__init__.py +1 -1
  2. wandelbots_api_client/api_client.py +1 -1
  3. wandelbots_api_client/configuration.py +1 -1
  4. wandelbots_api_client/v2/__init__.py +1 -1
  5. wandelbots_api_client/v2/api/jogging_api.py +1 -1
  6. wandelbots_api_client/v2/api/motion_group_models_api.py +265 -0
  7. wandelbots_api_client/v2/api_client.py +1 -1
  8. wandelbots_api_client/v2/configuration.py +1 -1
  9. wandelbots_api_client/v2/models/__init__.py +2 -0
  10. wandelbots_api_client/v2/models/initialize_jogging_request.py +2 -4
  11. wandelbots_api_client/v2/models/inverse_kinematics_request.py +6 -4
  12. wandelbots_api_client/v2/models/kinematic_model.py +110 -0
  13. wandelbots_api_client/v2_pydantic/__init__.py +1 -1
  14. wandelbots_api_client/v2_pydantic/api/jogging_api.py +1 -1
  15. wandelbots_api_client/v2_pydantic/api/motion_group_models_api.py +268 -0
  16. wandelbots_api_client/v2_pydantic/api_client.py +1 -1
  17. wandelbots_api_client/v2_pydantic/configuration.py +1 -1
  18. wandelbots_api_client/v2_pydantic/models.py +51 -36
  19. {wandelbots_api_client-26.1.0.dev53.dist-info → wandelbots_api_client-26.1.0.dev63.dist-info}/METADATA +2 -2
  20. {wandelbots_api_client-26.1.0.dev53.dist-info → wandelbots_api_client-26.1.0.dev63.dist-info}/RECORD +23 -22
  21. {wandelbots_api_client-26.1.0.dev53.dist-info → wandelbots_api_client-26.1.0.dev63.dist-info}/WHEEL +0 -0
  22. {wandelbots_api_client-26.1.0.dev53.dist-info → wandelbots_api_client-26.1.0.dev63.dist-info}/licenses/LICENSE +0 -0
  23. {wandelbots_api_client-26.1.0.dev53.dist-info → wandelbots_api_client-26.1.0.dev63.dist-info}/top_level.txt +0 -0
@@ -13,7 +13,7 @@
13
13
  Do not edit the class manually.
14
14
  """ # noqa: E501
15
15
 
16
- __version__ = "26.1.0.dev53"
16
+ __version__ = "26.1.0.dev63"
17
17
 
18
18
  from . import models
19
19
  from . import api
@@ -91,7 +91,7 @@ class ApiClient:
91
91
  self.default_headers[header_name] = header_value
92
92
  self.cookie = cookie
93
93
  # Set default User-Agent.
94
- self.user_agent = 'Wandelbots-Nova-API-Python-Client/26.1.0.dev53'
94
+ self.user_agent = 'Wandelbots-Nova-API-Python-Client/26.1.0.dev63'
95
95
  self.client_side_validation = configuration.client_side_validation
96
96
 
97
97
  async def __aenter__(self):
@@ -535,7 +535,7 @@ conf = wandelbots_api_client.Configuration(
535
535
  "OS: {env}\n"\
536
536
  "Python Version: {pyversion}\n"\
537
537
  "Version of the API: 1.2.0 dev\n"\
538
- "SDK Package Version: 26.1.0.dev53".\
538
+ "SDK Package Version: 26.1.0.dev63".\
539
539
  format(env=sys.platform, pyversion=sys.version)
540
540
 
541
541
  def get_host_settings(self) -> List[HostSetting]:
@@ -13,7 +13,7 @@
13
13
  Do not edit the class manually.
14
14
  """ # noqa: E501
15
15
 
16
- __version__ = "26.1.0.dev53"
16
+ __version__ = "26.1.0.dev63"
17
17
 
18
18
  from . import models
19
19
  from . import api
@@ -47,7 +47,7 @@ class JoggingApi:
47
47
  async def execute_jogging(self, cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")], controller: Annotated[StrictStr, Field(description="Unique identifier to address a controller in the cell.")], client_request_generator: Callable[[AsyncGenerator[ExecuteJoggingResponse, None]], AsyncGenerator[ExecuteJoggingRequest, None]]) -> None: # noqa: E501
48
48
  """Execute Jogging # noqa: E501
49
49
 
50
- <!-- theme: success --> > Websocket endpoint Provides execution control over a dynamically adaptable jogging motion for a motion group. Jogging describes controlling a motion group by sending real-time commands to move either its joints or the TCP. The commands contain target velocities that may change at any time during execution, so the resulting motion cannot be computed upfront. ### Preconditions The motion group is not moved by any other endpoint. ### Requests #### 1. Send `InitializeJoggingRequest` to configure the jogging. - Sets the robot controller mode to control mode. - Sets rate and coordinate system for the jogging response. #### 2. Send `JointVelocityRequest` or `TcpVelocityRequest` to start the jogging motion. - Commands can only be processed in the cycle rate of the controller - Sending commands faster will not increase the responsiveness of the jogging motion, it will lead to dropped commands - It is recommended to couple sending commands with the (state stream)[streamMotionGroupState], which can be subscribed to via nats as well. #### 3. Change or stop the jogging motion - Change the jogging direction and/or velocity during the jogging motion with `JointVelocityRequest` or `TcpVelocityRequest`. - To stop the jogging motion, send zero velocities via either request. ### Responses - `InitializeJoggingResponse` is sent to signal the success or failure of the `InitializeJoggingRequest`. - Jogging responses are streamed continuously after an `InitializeJoggingRequest` is processed. Jogging responses contain the robot controller state and the state of the jogging control. - `JoggingErrorResponse` with error details is sent in case of an unexpected error, e.g., controller disconnects during jogging. ### Tips and Tricks - In the `JoggingResponse`, verify that the robot control is in the desired state, e.g., standstill, with JoggingState. - Ensure that the websocket connection remains open until the jogging motion is stopped to avoid unexpected stops. # noqa: E501
50
+ <!-- theme: success --> > Websocket endpoint Provides execution control over a dynamically adaptable jogging motion for a motion group. Jogging describes controlling a motion group by sending real-time commands to move either its joints or the TCP. The commands contain target velocities that may change at any time during execution, so the resulting motion cannot be computed upfront. ### Preconditions The motion group is not moved by any other endpoint. ### Requests #### 1. Send `InitializeJoggingRequest` to configure the jogging. - Sets the robot controller mode to control mode. - Claims the motion group for jogging. For robotic arms, TCP is required to ensure that limits, including TCP limits, are respected. #### 2. Send `JointVelocityRequest` or `TcpVelocityRequest` to start the jogging motion. - Commands can only be processed in the cycle rate of the controller - Sending commands faster will not increase the responsiveness of the jogging motion, it will lead to dropped commands - It is recommended to couple sending commands with the [state stream](streamMotionGroupState), which can be subscribed to via nats as well. #### 3. Change or stop the jogging motion - Change the jogging direction and/or velocity during the jogging motion with `JointVelocityRequest` or `TcpVelocityRequest`. - To stop the jogging motion, send zero velocities via either request or `PauseJoggingRequest`. ### Responses - Each request is acknowledged with a corresponding response: - `InitializeJoggingResponse` after `InitializeJoggingRequest` - `JointVelocityResponse` after `JointVelocityRequest` - `TcpVelocityResponse` after `TcpVelocityRequest` - `PauseJoggingResponse` after `PauseJoggingRequest` The responses confirm that the requests were received. They do not signal that the operation was successful; check the [motion group state](streamMotionGroupState) for that. - `MovementErrorResponse` with error details is sent in case of an unexpected error, e.g., controller disconnects during jogging. ### Tips and Tricks - Ensure that the websocket connection remains open until the jogging motion is stopped to avoid unexpected stops. # noqa: E501
51
51
  :param client_request_generator: An AsyncGenerator that yields request of type ExecuteJoggingRequest and takes an AsyncGenerator of ExecuteJoggingResponse as an input argument (required)
52
52
  :info All responses from the server will be yielded to client_request_generator through the (AsyncGenerator[ExecuteJoggingResponse, None])
53
53
  :type AsyncGenerator[ExecuteJoggingRequest, None]
@@ -26,6 +26,7 @@ from pydantic import Field, StrictBytes, StrictStr
26
26
  from typing import Dict, List, Tuple, Union
27
27
  from typing_extensions import Annotated
28
28
  from wandelbots_api_client.v2.models.collider import Collider
29
+ from wandelbots_api_client.v2.models.kinematic_model import KinematicModel
29
30
 
30
31
  from wandelbots_api_client.v2.api_client import ApiClient, RequestSerialized
31
32
  from wandelbots_api_client.v2.api_response import ApiResponse
@@ -571,6 +572,270 @@ class MotionGroupModelsApi:
571
572
 
572
573
 
573
574
 
575
+ @validate_call
576
+ async def get_motion_group_kinematic_model(
577
+ self,
578
+ motion_group_model: Annotated[StrictStr, Field(description="Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). ")],
579
+ _request_timeout: Union[
580
+ None,
581
+ Annotated[StrictFloat, Field(gt=0)],
582
+ Tuple[
583
+ Annotated[StrictFloat, Field(gt=0)],
584
+ Annotated[StrictFloat, Field(gt=0)]
585
+ ]
586
+ ] = None,
587
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
588
+ _content_type: Optional[StrictStr] = None,
589
+ _headers: Optional[Dict[StrictStr, Any]] = None,
590
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
591
+ ) -> KinematicModel:
592
+ """Get Kinematics
593
+
594
+ Returns the kinematics model (DH parameters) for the given motion group model. See [getMotionGroupModels](getMotionGroupModels) for supported motion group models.
595
+
596
+ :param motion_group_model: Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). (required)
597
+ :type motion_group_model: str
598
+ :param _request_timeout: timeout setting for this request. If one
599
+ number provided, it will be total request
600
+ timeout. It can also be a pair (tuple) of
601
+ (connection, read) timeouts.
602
+ :type _request_timeout: int, tuple(int, int), optional
603
+ :param _request_auth: set to override the auth_settings for an a single
604
+ request; this effectively ignores the
605
+ authentication in the spec for a single request.
606
+ :type _request_auth: dict, optional
607
+ :param _content_type: force content-type for the request.
608
+ :type _content_type: str, Optional
609
+ :param _headers: set to override the headers for a single
610
+ request; this effectively ignores the headers
611
+ in the spec for a single request.
612
+ :type _headers: dict, optional
613
+ :param _host_index: set to override the host_index for a single
614
+ request; this effectively ignores the host_index
615
+ in the spec for a single request.
616
+ :type _host_index: int, optional
617
+ :return: Returns the result object.
618
+ """ # noqa: E501
619
+
620
+ _param = self._get_motion_group_kinematic_model_serialize(
621
+ motion_group_model=motion_group_model,
622
+ _request_auth=_request_auth,
623
+ _content_type=_content_type,
624
+ _headers=_headers,
625
+ _host_index=_host_index
626
+ )
627
+
628
+ _response_types_map: Dict[str, Optional[str]] = {
629
+ '200': "KinematicModel",
630
+ '404': None,
631
+ '500': None,
632
+ }
633
+ response_data = await self.api_client.call_api(
634
+ *_param,
635
+ _request_timeout=_request_timeout
636
+ )
637
+ await response_data.read()
638
+ return self.api_client.response_deserialize(
639
+ response_data=response_data,
640
+ response_types_map=_response_types_map,
641
+ ).data
642
+
643
+
644
+ @validate_call
645
+ async def get_motion_group_kinematic_model_with_http_info(
646
+ self,
647
+ motion_group_model: Annotated[StrictStr, Field(description="Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). ")],
648
+ _request_timeout: Union[
649
+ None,
650
+ Annotated[StrictFloat, Field(gt=0)],
651
+ Tuple[
652
+ Annotated[StrictFloat, Field(gt=0)],
653
+ Annotated[StrictFloat, Field(gt=0)]
654
+ ]
655
+ ] = None,
656
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
657
+ _content_type: Optional[StrictStr] = None,
658
+ _headers: Optional[Dict[StrictStr, Any]] = None,
659
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
660
+ ) -> ApiResponse[KinematicModel]:
661
+ """Get Kinematics
662
+
663
+ Returns the kinematics model (DH parameters) for the given motion group model. See [getMotionGroupModels](getMotionGroupModels) for supported motion group models.
664
+
665
+ :param motion_group_model: Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). (required)
666
+ :type motion_group_model: str
667
+ :param _request_timeout: timeout setting for this request. If one
668
+ number provided, it will be total request
669
+ timeout. It can also be a pair (tuple) of
670
+ (connection, read) timeouts.
671
+ :type _request_timeout: int, tuple(int, int), optional
672
+ :param _request_auth: set to override the auth_settings for an a single
673
+ request; this effectively ignores the
674
+ authentication in the spec for a single request.
675
+ :type _request_auth: dict, optional
676
+ :param _content_type: force content-type for the request.
677
+ :type _content_type: str, Optional
678
+ :param _headers: set to override the headers for a single
679
+ request; this effectively ignores the headers
680
+ in the spec for a single request.
681
+ :type _headers: dict, optional
682
+ :param _host_index: set to override the host_index for a single
683
+ request; this effectively ignores the host_index
684
+ in the spec for a single request.
685
+ :type _host_index: int, optional
686
+ :return: Returns the result object.
687
+ """ # noqa: E501
688
+
689
+ _param = self._get_motion_group_kinematic_model_serialize(
690
+ motion_group_model=motion_group_model,
691
+ _request_auth=_request_auth,
692
+ _content_type=_content_type,
693
+ _headers=_headers,
694
+ _host_index=_host_index
695
+ )
696
+
697
+ _response_types_map: Dict[str, Optional[str]] = {
698
+ '200': "KinematicModel",
699
+ '404': None,
700
+ '500': None,
701
+ }
702
+ response_data = await self.api_client.call_api(
703
+ *_param,
704
+ _request_timeout=_request_timeout
705
+ )
706
+ await response_data.read()
707
+ return self.api_client.response_deserialize(
708
+ response_data=response_data,
709
+ response_types_map=_response_types_map,
710
+ )
711
+
712
+
713
+ @validate_call
714
+ async def get_motion_group_kinematic_model_without_preload_content(
715
+ self,
716
+ motion_group_model: Annotated[StrictStr, Field(description="Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). ")],
717
+ _request_timeout: Union[
718
+ None,
719
+ Annotated[StrictFloat, Field(gt=0)],
720
+ Tuple[
721
+ Annotated[StrictFloat, Field(gt=0)],
722
+ Annotated[StrictFloat, Field(gt=0)]
723
+ ]
724
+ ] = None,
725
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
726
+ _content_type: Optional[StrictStr] = None,
727
+ _headers: Optional[Dict[StrictStr, Any]] = None,
728
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
729
+ ) -> RESTResponseType:
730
+ """Get Kinematics
731
+
732
+ Returns the kinematics model (DH parameters) for the given motion group model. See [getMotionGroupModels](getMotionGroupModels) for supported motion group models.
733
+
734
+ :param motion_group_model: Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). (required)
735
+ :type motion_group_model: str
736
+ :param _request_timeout: timeout setting for this request. If one
737
+ number provided, it will be total request
738
+ timeout. It can also be a pair (tuple) of
739
+ (connection, read) timeouts.
740
+ :type _request_timeout: int, tuple(int, int), optional
741
+ :param _request_auth: set to override the auth_settings for an a single
742
+ request; this effectively ignores the
743
+ authentication in the spec for a single request.
744
+ :type _request_auth: dict, optional
745
+ :param _content_type: force content-type for the request.
746
+ :type _content_type: str, Optional
747
+ :param _headers: set to override the headers for a single
748
+ request; this effectively ignores the headers
749
+ in the spec for a single request.
750
+ :type _headers: dict, optional
751
+ :param _host_index: set to override the host_index for a single
752
+ request; this effectively ignores the host_index
753
+ in the spec for a single request.
754
+ :type _host_index: int, optional
755
+ :return: Returns the result object.
756
+ """ # noqa: E501
757
+
758
+ _param = self._get_motion_group_kinematic_model_serialize(
759
+ motion_group_model=motion_group_model,
760
+ _request_auth=_request_auth,
761
+ _content_type=_content_type,
762
+ _headers=_headers,
763
+ _host_index=_host_index
764
+ )
765
+
766
+ _response_types_map: Dict[str, Optional[str]] = {
767
+ '200': "KinematicModel",
768
+ '404': None,
769
+ '500': None,
770
+ }
771
+ response_data = await self.api_client.call_api(
772
+ *_param,
773
+ _request_timeout=_request_timeout
774
+ )
775
+ return response_data.response
776
+
777
+
778
+ def _get_motion_group_kinematic_model_serialize(
779
+ self,
780
+ motion_group_model,
781
+ _request_auth,
782
+ _content_type,
783
+ _headers,
784
+ _host_index,
785
+ ) -> RequestSerialized:
786
+
787
+ _host = None
788
+
789
+ _collection_formats: Dict[str, str] = {
790
+ }
791
+
792
+ _path_params: Dict[str, str] = {}
793
+ _query_params: List[Tuple[str, str]] = []
794
+ _header_params: Dict[str, Optional[str]] = _headers or {}
795
+ _form_params: List[Tuple[str, str]] = []
796
+ _files: Dict[str, Union[str, bytes]] = {}
797
+ _body_params: Optional[bytes] = None
798
+
799
+ # process the path parameters
800
+ if motion_group_model is not None:
801
+ _path_params['motion-group-model'] = motion_group_model
802
+ # process the query parameters
803
+ # process the header parameters
804
+ # process the form parameters
805
+ # process the body parameter
806
+
807
+
808
+ # set the HTTP header `Accept`
809
+ _header_params['Accept'] = self.api_client.select_header_accept(
810
+ [
811
+ 'application/json'
812
+ ]
813
+ )
814
+
815
+
816
+ # authentication setting
817
+ _auth_settings: List[str] = [
818
+ 'BasicAuth',
819
+ 'BearerAuth'
820
+ ]
821
+
822
+ return self.api_client.param_serialize(
823
+ method='GET',
824
+ resource_path='/motion-group-models/{motion-group-model}/kinematic',
825
+ path_params=_path_params,
826
+ query_params=_query_params,
827
+ header_params=_header_params,
828
+ body=_body_params,
829
+ post_params=_form_params,
830
+ files=_files,
831
+ auth_settings=_auth_settings,
832
+ collection_formats=_collection_formats,
833
+ _host=_host,
834
+ _request_auth=_request_auth
835
+ )
836
+
837
+
838
+
574
839
  @validate_call
575
840
  async def get_motion_group_models(
576
841
  self,
@@ -91,7 +91,7 @@ class ApiClient:
91
91
  self.default_headers[header_name] = header_value
92
92
  self.cookie = cookie
93
93
  # Set default User-Agent.
94
- self.user_agent = 'Wandelbots-Nova-API-Python-Client/26.1.0.dev53'
94
+ self.user_agent = 'Wandelbots-Nova-API-Python-Client/26.1.0.dev63'
95
95
  self.client_side_validation = configuration.client_side_validation
96
96
 
97
97
  async def __aenter__(self):
@@ -535,7 +535,7 @@ conf = wandelbots_api_client.v2.Configuration(
535
535
  "OS: {env}\n"\
536
536
  "Python Version: {pyversion}\n"\
537
537
  "Version of the API: 2.1.0 dev\n"\
538
- "SDK Package Version: 26.1.0.dev53".\
538
+ "SDK Package Version: 26.1.0.dev63".\
539
539
  format(env=sys.platform, pyversion=sys.version)
540
540
 
541
541
  def get_host_settings(self) -> List[HostSetting]:
@@ -135,6 +135,7 @@ from .joint_limits import JointLimits
135
135
  from .joint_trajectory import JointTrajectory
136
136
  from .joint_velocity_request import JointVelocityRequest
137
137
  from .joint_velocity_response import JointVelocityResponse
138
+ from .kinematic_model import KinematicModel
138
139
  from .kuka_controller import KukaController
139
140
  from .kuka_controller_rsi_server import KukaControllerRsiServer
140
141
  from .license import License
@@ -382,6 +383,7 @@ __all__ = [
382
383
  "JointTrajectory",
383
384
  "JointVelocityRequest",
384
385
  "JointVelocityResponse",
386
+ "KinematicModel",
385
387
  "KukaController",
386
388
  "KukaControllerRsiServer",
387
389
  "License",
@@ -29,8 +29,7 @@ class InitializeJoggingRequest(BaseModel):
29
29
  message_type: str = "InitializeJoggingRequest"
30
30
  motion_group: StrictStr = Field(description="Identifier of the motion group.")
31
31
  tcp: Optional[StrictStr] = Field(default=None, description="Identifier of the tool. Required for robots (all limits, including TCP limits, are respected at all times regardless of the motion). Not required for external axes. ")
32
- response_coordinate_system: Optional[StrictStr] = Field(default=None, description="Unique identifier addressing a coordinate system to which the responses are transformed. If not set, world coordinate system is used. ")
33
- __properties: ClassVar[List[str]] = ["message_type", "motion_group", "tcp", "response_coordinate_system"]
32
+ __properties: ClassVar[List[str]] = ["message_type", "motion_group", "tcp"]
34
33
 
35
34
  @field_validator('message_type')
36
35
  def message_type_validate_enum(cls, value):
@@ -96,8 +95,7 @@ class InitializeJoggingRequest(BaseModel):
96
95
  _obj = cls.model_validate({
97
96
  "message_type": obj.get("message_type"),
98
97
  "motion_group": obj.get("motion_group"),
99
- "tcp": obj.get("tcp"),
100
- "response_coordinate_system": obj.get("response_coordinate_system")
98
+ "tcp": obj.get("tcp")
101
99
  })
102
100
  return _obj
103
101
 
@@ -17,8 +17,8 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
- from typing import Any, ClassVar, Dict, List, Optional
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional, Union
22
22
  from wandelbots_api_client.v2.models.collision_setup import CollisionSetup
23
23
  from wandelbots_api_client.v2.models.limit_range import LimitRange
24
24
  from wandelbots_api_client.v2.models.pose import Pose
@@ -35,7 +35,8 @@ class InverseKinematicsRequest(BaseModel):
35
35
  mounting: Optional[Pose] = Field(default=None, description="Offset from the world frame to the motion group base.")
36
36
  joint_position_limits: Optional[List[LimitRange]] = Field(default=None, description="Joint position limits in [rad], indexed starting from base. ")
37
37
  collision_setups: Optional[Dict[str, CollisionSetup]] = Field(default=None, description="Collision layers to be respected by the motion planner when planning for a single motion group. Each setup represents one layer, e.g., the safety zones and shapes or a fine grained tool and workpiece model. Layers are checked individually along the trajectory and independently of other layers. To respect the safety zones of the controller and check for collision: 1. Fetch the safety zones, link and tool shapes from the controller. 2. Add the fetched zones, links and tools to a layer. 3. Create other layers from your own 3D data as needed. 4. Plan trajectory. 5. The response highlights the layer in which a collision was detected by key. ")
38
- __properties: ClassVar[List[str]] = ["motion_group_model", "tcp_poses", "tcp_offset", "mounting", "joint_position_limits", "collision_setups"]
38
+ reference_joint_position: Optional[List[Union[StrictFloat, StrictInt]]] = None
39
+ __properties: ClassVar[List[str]] = ["motion_group_model", "tcp_poses", "tcp_offset", "mounting", "joint_position_limits", "collision_setups", "reference_joint_position"]
39
40
 
40
41
  model_config = ConfigDict(
41
42
  populate_by_name=True,
@@ -148,7 +149,8 @@ class InverseKinematicsRequest(BaseModel):
148
149
  for _k, _v in obj["collision_setups"].items()
149
150
  )
150
151
  if obj.get("collision_setups") is not None
151
- else None
152
+ else None,
153
+ "reference_joint_position": obj.get("reference_joint_position")
152
154
  })
153
155
  return _obj
154
156
 
@@ -0,0 +1,110 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Wandelbots NOVA API
5
+
6
+ Interact with robots in an easy and intuitive way.
7
+
8
+ The version of the OpenAPI document: 2.1.0 dev
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from wandelbots_api_client.v2.models.dh_parameter import DHParameter
23
+ from typing import Optional, Set
24
+ from typing_extensions import Self
25
+
26
+ class KinematicModel(BaseModel):
27
+ """
28
+ Kinematics model described by Denavit-Hartenberg parameters.
29
+ """ # noqa: E501
30
+ dh_parameters: Optional[List[DHParameter]] = None
31
+ inverse_solver: Optional[StrictStr] = Field(default=None, description="Optional name of the inverse kinematics solver.")
32
+ __properties: ClassVar[List[str]] = ["dh_parameters", "inverse_solver"]
33
+
34
+ model_config = ConfigDict(
35
+ populate_by_name=True,
36
+ validate_assignment=True,
37
+ protected_namespaces=(),
38
+ )
39
+
40
+
41
+ def to_str(self) -> str:
42
+ """Returns the string representation of the model using alias"""
43
+ return pprint.pformat(self.model_dump(by_alias=True, exclude_none=True))
44
+
45
+ def to_json(self) -> str:
46
+ """
47
+ Returns the JSON representation of the model using alias
48
+
49
+ Do not use pydantic v2 .model_dump_json(by_alias=True, exclude_unset=True) here!
50
+ It is unable to resolve nested types generated by openapi-generator.
51
+ """
52
+ return json.dumps(self.to_dict())
53
+
54
+ @classmethod
55
+ def from_json(cls, json_str: str) -> Optional[Self]:
56
+ """Create an instance of KinematicModel from a JSON string"""
57
+ return cls.from_dict(json.loads(json_str))
58
+
59
+ def to_dict(self) -> Dict[str, Any]:
60
+ """Return the dictionary representation of the model using alias.
61
+
62
+ This has the following differences from calling pydantic's
63
+ `self.model_dump(by_alias=True)`:
64
+
65
+ * `None` is only added to the output dict for nullable fields that
66
+ were set at model initialization. Other fields with value `None`
67
+ are ignored.
68
+ """
69
+ excluded_fields: Set[str] = set([
70
+ ])
71
+
72
+ _dict = self.model_dump(
73
+ by_alias=True,
74
+ exclude=excluded_fields,
75
+ exclude_none=True,
76
+ )
77
+ # override the default output from pydantic by calling `to_dict()` of each item in dh_parameters (list)
78
+ _items = []
79
+ if self.dh_parameters:
80
+ for _item in self.dh_parameters:
81
+ # >>> Modified from https://github.com/OpenAPITools/openapi-generator/blob/v7.6.0/modules/openapi-generator/src/main/resources/python/model_generic.mustache
82
+ # to not drop empty elements in lists
83
+ if _item is not None:
84
+ _items.append(_item.to_dict())
85
+ # <<< End modification
86
+ _dict['dh_parameters'] = _items
87
+ return _dict
88
+
89
+ @classmethod
90
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
91
+ """Create an instance of KinematicModel from a dict"""
92
+ if obj is None:
93
+ return None
94
+
95
+ if not isinstance(obj, dict):
96
+ return cls.model_validate(obj)
97
+
98
+ _obj = cls.model_validate({
99
+ "dh_parameters": [
100
+ # >>> Modified from https://github.com/OpenAPITools/openapi-generator/blob/v7.6.0/modules/openapi-generator/src/main/resources/python/model_generic.mustache
101
+ # to allow dicts in lists
102
+ DHParameter.from_dict(_item) if hasattr(DHParameter, 'from_dict') else _item
103
+ # <<< End modification
104
+ for _item in obj["dh_parameters"]
105
+ ] if obj.get("dh_parameters") is not None else None,
106
+ "inverse_solver": obj.get("inverse_solver")
107
+ })
108
+ return _obj
109
+
110
+
@@ -13,7 +13,7 @@
13
13
  Do not edit the class manually.
14
14
  """ # noqa: E501
15
15
 
16
- __version__ = "26.1.0.dev53"
16
+ __version__ = "26.1.0.dev63"
17
17
 
18
18
  from . import api
19
19
  from . import api_client
@@ -47,7 +47,7 @@ class JoggingApi:
47
47
  async def execute_jogging(self, cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")], controller: Annotated[StrictStr, Field(description="Unique identifier to address a controller in the cell.")], client_request_generator: Callable[[AsyncGenerator[ExecuteJoggingResponse, None]], AsyncGenerator[ExecuteJoggingRequest, None]]) -> None: # noqa: E501
48
48
  """Execute Jogging # noqa: E501
49
49
 
50
- <!-- theme: success --> > Websocket endpoint Provides execution control over a dynamically adaptable jogging motion for a motion group. Jogging describes controlling a motion group by sending real-time commands to move either its joints or the TCP. The commands contain target velocities that may change at any time during execution, so the resulting motion cannot be computed upfront. ### Preconditions The motion group is not moved by any other endpoint. ### Requests #### 1. Send `InitializeJoggingRequest` to configure the jogging. - Sets the robot controller mode to control mode. - Sets rate and coordinate system for the jogging response. #### 2. Send `JointVelocityRequest` or `TcpVelocityRequest` to start the jogging motion. - Commands can only be processed in the cycle rate of the controller - Sending commands faster will not increase the responsiveness of the jogging motion, it will lead to dropped commands - It is recommended to couple sending commands with the (state stream)[streamMotionGroupState], which can be subscribed to via nats as well. #### 3. Change or stop the jogging motion - Change the jogging direction and/or velocity during the jogging motion with `JointVelocityRequest` or `TcpVelocityRequest`. - To stop the jogging motion, send zero velocities via either request. ### Responses - `InitializeJoggingResponse` is sent to signal the success or failure of the `InitializeJoggingRequest`. - Jogging responses are streamed continuously after an `InitializeJoggingRequest` is processed. Jogging responses contain the robot controller state and the state of the jogging control. - `JoggingErrorResponse` with error details is sent in case of an unexpected error, e.g., controller disconnects during jogging. ### Tips and Tricks - In the `JoggingResponse`, verify that the robot control is in the desired state, e.g., standstill, with JoggingState. - Ensure that the websocket connection remains open until the jogging motion is stopped to avoid unexpected stops. # noqa: E501
50
+ <!-- theme: success --> > Websocket endpoint Provides execution control over a dynamically adaptable jogging motion for a motion group. Jogging describes controlling a motion group by sending real-time commands to move either its joints or the TCP. The commands contain target velocities that may change at any time during execution, so the resulting motion cannot be computed upfront. ### Preconditions The motion group is not moved by any other endpoint. ### Requests #### 1. Send `InitializeJoggingRequest` to configure the jogging. - Sets the robot controller mode to control mode. - Claims the motion group for jogging. For robotic arms, TCP is required to ensure that limits, including TCP limits, are respected. #### 2. Send `JointVelocityRequest` or `TcpVelocityRequest` to start the jogging motion. - Commands can only be processed in the cycle rate of the controller - Sending commands faster will not increase the responsiveness of the jogging motion, it will lead to dropped commands - It is recommended to couple sending commands with the [state stream](streamMotionGroupState), which can be subscribed to via nats as well. #### 3. Change or stop the jogging motion - Change the jogging direction and/or velocity during the jogging motion with `JointVelocityRequest` or `TcpVelocityRequest`. - To stop the jogging motion, send zero velocities via either request or `PauseJoggingRequest`. ### Responses - Each request is acknowledged with a corresponding response: - `InitializeJoggingResponse` after `InitializeJoggingRequest` - `JointVelocityResponse` after `JointVelocityRequest` - `TcpVelocityResponse` after `TcpVelocityRequest` - `PauseJoggingResponse` after `PauseJoggingRequest` The responses confirm that the requests were received. They do not signal that the operation was successful; check the [motion group state](streamMotionGroupState) for that. - `MovementErrorResponse` with error details is sent in case of an unexpected error, e.g., controller disconnects during jogging. ### Tips and Tricks - Ensure that the websocket connection remains open until the jogging motion is stopped to avoid unexpected stops. # noqa: E501
51
51
  :param client_request_generator: An AsyncGenerator that yields request of type ExecuteJoggingRequest and takes an AsyncGenerator of ExecuteJoggingResponse as an input argument (required)
52
52
  :info All responses from the server will be yielded to client_request_generator through the (AsyncGenerator[ExecuteJoggingResponse, None])
53
53
  :type AsyncGenerator[ExecuteJoggingRequest, None]
@@ -26,6 +26,7 @@ from pydantic import Field, StrictBytes, StrictStr
26
26
  from typing import Dict, List, Tuple, Union
27
27
  from typing_extensions import Annotated
28
28
  from wandelbots_api_client.v2_pydantic.models import Collider
29
+ from wandelbots_api_client.v2_pydantic.models import KinematicModel
29
30
 
30
31
  from wandelbots_api_client.v2_pydantic.api_client import ApiClient, RequestSerialized
31
32
  from wandelbots_api_client.v2_pydantic.api_response import ApiResponse
@@ -577,6 +578,273 @@ class MotionGroupModelsApi:
577
578
 
578
579
 
579
580
 
581
+ @validate_call
582
+ async def get_motion_group_kinematic_model(
583
+ self,
584
+ motion_group_model: Annotated[StrictStr, Field(description="Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). ")],
585
+ _request_timeout: Union[
586
+ None,
587
+ Annotated[StrictFloat, Field(gt=0)],
588
+ Tuple[
589
+ Annotated[StrictFloat, Field(gt=0)],
590
+ Annotated[StrictFloat, Field(gt=0)]
591
+ ]
592
+ ] = None,
593
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
594
+ _content_type: Optional[StrictStr] = None,
595
+ _headers: Optional[Dict[StrictStr, Any]] = None,
596
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
597
+ ) -> KinematicModel:
598
+ """Get Kinematics
599
+
600
+ Returns the kinematics model (DH parameters) for the given motion group model. See [getMotionGroupModels](getMotionGroupModels) for supported motion group models.
601
+
602
+ :param motion_group_model: Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). (required)
603
+ :type motion_group_model: str
604
+ :param _request_timeout: timeout setting for this request. If one
605
+ number provided, it will be total request
606
+ timeout. It can also be a pair (tuple) of
607
+ (connection, read) timeouts.
608
+ :type _request_timeout: int, tuple(int, int), optional
609
+ :param _request_auth: set to override the auth_settings for an a single
610
+ request; this effectively ignores the
611
+ authentication in the spec for a single request.
612
+ :type _request_auth: dict, optional
613
+ :param _content_type: force content-type for the request.
614
+ :type _content_type: str, Optional
615
+ :param _headers: set to override the headers for a single
616
+ request; this effectively ignores the headers
617
+ in the spec for a single request.
618
+ :type _headers: dict, optional
619
+ :param _host_index: set to override the host_index for a single
620
+ request; this effectively ignores the host_index
621
+ in the spec for a single request.
622
+ :type _host_index: int, optional
623
+ :return: Returns the result object.
624
+ """ # noqa: E501
625
+
626
+ _param = self._get_motion_group_kinematic_model_serialize(
627
+ motion_group_model=motion_group_model,
628
+ _request_auth=_request_auth,
629
+ _content_type=_content_type,
630
+ _headers=_headers,
631
+ _host_index=_host_index
632
+ )
633
+
634
+ _response_types_map: Dict[str, Optional[str]] = {
635
+ '200': "KinematicModel",
636
+ '404': None,
637
+ '500': None,
638
+ }
639
+
640
+ response_data = await self.api_client.call_api(
641
+ *_param,
642
+ _request_timeout=_request_timeout
643
+ )
644
+ await response_data.read()
645
+ return self.api_client.response_deserialize(
646
+ response_data=response_data,
647
+ response_types_map=_response_types_map,
648
+ ).data
649
+
650
+
651
+ @validate_call
652
+ async def get_motion_group_kinematic_model_with_http_info(
653
+ self,
654
+ motion_group_model: Annotated[StrictStr, Field(description="Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). ")],
655
+ _request_timeout: Union[
656
+ None,
657
+ Annotated[StrictFloat, Field(gt=0)],
658
+ Tuple[
659
+ Annotated[StrictFloat, Field(gt=0)],
660
+ Annotated[StrictFloat, Field(gt=0)]
661
+ ]
662
+ ] = None,
663
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
664
+ _content_type: Optional[StrictStr] = None,
665
+ _headers: Optional[Dict[StrictStr, Any]] = None,
666
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
667
+ ) -> ApiResponse[KinematicModel]:
668
+ """Get Kinematics
669
+
670
+ Returns the kinematics model (DH parameters) for the given motion group model. See [getMotionGroupModels](getMotionGroupModels) for supported motion group models.
671
+
672
+ :param motion_group_model: Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). (required)
673
+ :type motion_group_model: str
674
+ :param _request_timeout: timeout setting for this request. If one
675
+ number provided, it will be total request
676
+ timeout. It can also be a pair (tuple) of
677
+ (connection, read) timeouts.
678
+ :type _request_timeout: int, tuple(int, int), optional
679
+ :param _request_auth: set to override the auth_settings for an a single
680
+ request; this effectively ignores the
681
+ authentication in the spec for a single request.
682
+ :type _request_auth: dict, optional
683
+ :param _content_type: force content-type for the request.
684
+ :type _content_type: str, Optional
685
+ :param _headers: set to override the headers for a single
686
+ request; this effectively ignores the headers
687
+ in the spec for a single request.
688
+ :type _headers: dict, optional
689
+ :param _host_index: set to override the host_index for a single
690
+ request; this effectively ignores the host_index
691
+ in the spec for a single request.
692
+ :type _host_index: int, optional
693
+ :return: Returns the result object.
694
+ """ # noqa: E501
695
+
696
+ _param = self._get_motion_group_kinematic_model_serialize(
697
+ motion_group_model=motion_group_model,
698
+ _request_auth=_request_auth,
699
+ _content_type=_content_type,
700
+ _headers=_headers,
701
+ _host_index=_host_index
702
+ )
703
+
704
+ _response_types_map: Dict[str, Optional[str]] = {
705
+ '200': "KinematicModel",
706
+ '404': None,
707
+ '500': None,
708
+ }
709
+
710
+ response_data = await self.api_client.call_api(
711
+ *_param,
712
+ _request_timeout=_request_timeout
713
+ )
714
+ await response_data.read()
715
+ return self.api_client.response_deserialize(
716
+ response_data=response_data,
717
+ response_types_map=_response_types_map,
718
+ )
719
+
720
+
721
+ @validate_call
722
+ async def get_motion_group_kinematic_model_without_preload_content(
723
+ self,
724
+ motion_group_model: Annotated[StrictStr, Field(description="Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). ")],
725
+ _request_timeout: Union[
726
+ None,
727
+ Annotated[StrictFloat, Field(gt=0)],
728
+ Tuple[
729
+ Annotated[StrictFloat, Field(gt=0)],
730
+ Annotated[StrictFloat, Field(gt=0)]
731
+ ]
732
+ ] = None,
733
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
734
+ _content_type: Optional[StrictStr] = None,
735
+ _headers: Optional[Dict[StrictStr, Any]] = None,
736
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
737
+ ) -> RESTResponseType:
738
+ """Get Kinematics
739
+
740
+ Returns the kinematics model (DH parameters) for the given motion group model. See [getMotionGroupModels](getMotionGroupModels) for supported motion group models.
741
+
742
+ :param motion_group_model: Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](getOptimizerConfiguration). (required)
743
+ :type motion_group_model: str
744
+ :param _request_timeout: timeout setting for this request. If one
745
+ number provided, it will be total request
746
+ timeout. It can also be a pair (tuple) of
747
+ (connection, read) timeouts.
748
+ :type _request_timeout: int, tuple(int, int), optional
749
+ :param _request_auth: set to override the auth_settings for an a single
750
+ request; this effectively ignores the
751
+ authentication in the spec for a single request.
752
+ :type _request_auth: dict, optional
753
+ :param _content_type: force content-type for the request.
754
+ :type _content_type: str, Optional
755
+ :param _headers: set to override the headers for a single
756
+ request; this effectively ignores the headers
757
+ in the spec for a single request.
758
+ :type _headers: dict, optional
759
+ :param _host_index: set to override the host_index for a single
760
+ request; this effectively ignores the host_index
761
+ in the spec for a single request.
762
+ :type _host_index: int, optional
763
+ :return: Returns the result object.
764
+ """ # noqa: E501
765
+
766
+ _param = self._get_motion_group_kinematic_model_serialize(
767
+ motion_group_model=motion_group_model,
768
+ _request_auth=_request_auth,
769
+ _content_type=_content_type,
770
+ _headers=_headers,
771
+ _host_index=_host_index
772
+ )
773
+
774
+ _response_types_map: Dict[str, Optional[str]] = {
775
+ '200': "KinematicModel",
776
+ '404': None,
777
+ '500': None,
778
+ }
779
+
780
+ response_data = await self.api_client.call_api(
781
+ *_param,
782
+ _request_timeout=_request_timeout
783
+ )
784
+ return response_data.response
785
+
786
+
787
+ def _get_motion_group_kinematic_model_serialize(
788
+ self,
789
+ motion_group_model,
790
+ _request_auth,
791
+ _content_type,
792
+ _headers,
793
+ _host_index,
794
+ ) -> RequestSerialized:
795
+
796
+ _host = None
797
+
798
+ _collection_formats: Dict[str, str] = {
799
+ }
800
+
801
+ _path_params: Dict[str, str] = {}
802
+ _query_params: List[Tuple[str, str]] = []
803
+ _header_params: Dict[str, Optional[str]] = _headers or {}
804
+ _form_params: List[Tuple[str, str]] = []
805
+ _files: Dict[str, Union[str, bytes]] = {}
806
+ _body_params: Optional[bytes] = None
807
+
808
+ # process the path parameters
809
+ if motion_group_model is not None:
810
+ _path_params['motion-group-model'] = motion_group_model
811
+ # process the query parameters
812
+ # process the header parameters
813
+ # process the form parameters
814
+ # process the body parameter
815
+
816
+
817
+ # set the HTTP header `Accept`
818
+ _header_params['Accept'] = self.api_client.select_header_accept(
819
+ [
820
+ 'application/json'
821
+ ]
822
+ )
823
+
824
+
825
+ # authentication setting
826
+ _auth_settings: List[str] = [
827
+ 'BasicAuth',
828
+ 'BearerAuth'
829
+ ]
830
+
831
+ return self.api_client.param_serialize(
832
+ method='GET',
833
+ resource_path='/motion-group-models/{motion-group-model}/kinematic',
834
+ path_params=_path_params,
835
+ query_params=_query_params,
836
+ header_params=_header_params,
837
+ body=_body_params,
838
+ post_params=_form_params,
839
+ files=_files,
840
+ auth_settings=_auth_settings,
841
+ collection_formats=_collection_formats,
842
+ _host=_host,
843
+ _request_auth=_request_auth
844
+ )
845
+
846
+
847
+
580
848
  @validate_call
581
849
  async def get_motion_group_models(
582
850
  self,
@@ -91,7 +91,7 @@ class ApiClient:
91
91
  self.default_headers[header_name] = header_value
92
92
  self.cookie = cookie
93
93
  # Set default User-Agent.
94
- self.user_agent = 'Wandelbots-Nova-API-Python-Client/26.1.0.dev53'
94
+ self.user_agent = 'Wandelbots-Nova-API-Python-Client/26.1.0.dev63'
95
95
  self.client_side_validation = configuration.client_side_validation
96
96
 
97
97
  async def __aenter__(self):
@@ -535,7 +535,7 @@ conf = wandelbots_api_client.v2_pydantic.Configuration(
535
535
  "OS: {env}\n"\
536
536
  "Python Version: {pyversion}\n"\
537
537
  "Version of the API: 2.1.0 dev\n"\
538
- "SDK Package Version: 26.1.0.dev53".\
538
+ "SDK Package Version: 26.1.0.dev63".\
539
539
  format(env=sys.platform, pyversion=sys.version)
540
540
 
541
541
  def get_host_settings(self) -> List[HostSetting]:
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: public.openapi.yaml
3
- # timestamp: 2026-01-10T00:12:37+00:00
3
+ # timestamp: 2026-01-15T16:36:39+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -49,7 +49,7 @@ class NameList(RootModel):
49
49
 
50
50
 
51
51
  class CellName(RootModel):
52
- root: Annotated[str, Field(pattern='^[a-z][a-z0-9-]{0,30}[a-z0-9]$')]
52
+ root: Annotated[str, Field(pattern='^[a-z][a-z0-9-]{0,30}[a-z0-9]$')] = 'cell'
53
53
  """
54
54
  A unique name for the cell used as an identifier for addressing the cell in all API calls.
55
55
  It must be a valid k8s label name as defined by [RFC 1123](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-label-names).
@@ -417,7 +417,7 @@ class Cell(BaseModel):
417
417
 
418
418
  """
419
419
 
420
- name: CellName
420
+ name: Annotated[CellName, Field(default_factory=lambda: CellName('cell'))]
421
421
  description: CellDescription | None = None
422
422
  controllers: list[RobotController] | None = None
423
423
  apps: list[App] | None = None
@@ -1226,6 +1226,45 @@ class LinkChain(RootModel):
1226
1226
  return iter(self.root)
1227
1227
 
1228
1228
 
1229
+ class DHParameter(BaseModel):
1230
+ """
1231
+ A single set of DH parameters.
1232
+ """
1233
+
1234
+ alpha: float | None = None
1235
+ """
1236
+ Angle about x-axis in [rad].
1237
+ """
1238
+ theta: float | None = None
1239
+ """
1240
+ Angle about z-axis in [rad].
1241
+ """
1242
+ a: float | None = None
1243
+ """
1244
+ Offset along x-axis in [mm].
1245
+ """
1246
+ d: float | None = None
1247
+ """
1248
+ Offset along z-axis in [mm].
1249
+ """
1250
+ reverse_rotation_direction: bool | None = None
1251
+ """
1252
+ True, if rotation direction of joint is reversed.
1253
+ """
1254
+
1255
+
1256
+ class KinematicModel(BaseModel):
1257
+ """
1258
+ Kinematics model described by Denavit-Hartenberg parameters.
1259
+ """
1260
+
1261
+ dh_parameters: list[DHParameter] | None = None
1262
+ inverse_solver: str | None = None
1263
+ """
1264
+ Optional name of the inverse kinematics solver.
1265
+ """
1266
+
1267
+
1229
1268
  class ControllerDescription(BaseModel):
1230
1269
  """
1231
1270
  The data type to describe a robot controller.
@@ -2255,33 +2294,6 @@ class Payload(BaseModel):
2255
2294
  moment_of_inertia: Vector3d | None = None
2256
2295
 
2257
2296
 
2258
- class DHParameter(BaseModel):
2259
- """
2260
- A single set of DH parameters.
2261
- """
2262
-
2263
- alpha: float | None = None
2264
- """
2265
- Angle about x-axis in [rad].
2266
- """
2267
- theta: float | None = None
2268
- """
2269
- Angle about z-axis in [rad].
2270
- """
2271
- a: float | None = None
2272
- """
2273
- Offset along x-axis in [mm].
2274
- """
2275
- d: float | None = None
2276
- """
2277
- Offset along z-axis in [mm].
2278
- """
2279
- reverse_rotation_direction: bool | None = None
2280
- """
2281
- True, if rotation direction of joint is reversed.
2282
- """
2283
-
2284
-
2285
2297
  class MotionGroupDescription(BaseModel):
2286
2298
  """
2287
2299
  The configuration of a motion-group used for motion planning.
@@ -3022,6 +3034,15 @@ class InverseKinematicsRequest(BaseModel):
3022
3034
  """
3023
3035
  joint_position_limits: JointPositionLimits | None = None
3024
3036
  collision_setups: CollisionSetups | None = None
3037
+ reference_joint_position: DoubleArray | None = None
3038
+ """
3039
+ If present, all solutions are shifted to the same periodicity
3040
+ as the reference: Each individual joint angle is shifted
3041
+ by integer multiples of 2 pi (whole revolutions) until it's
3042
+ as close to the reference as possible. The solutions are sorted
3043
+ by ascending distance (L2 norm) from the reference.
3044
+
3045
+ """
3025
3046
 
3026
3047
 
3027
3048
  class InverseKinematicsResponse(BaseModel):
@@ -3561,12 +3582,6 @@ class InitializeJoggingRequest(BaseModel):
3561
3582
  Identifier of the tool. Required for robots (all limits, including TCP limits, are respected at all times regardless of the motion). Not required for external axes.
3562
3583
 
3563
3584
  """
3564
- response_coordinate_system: str | None = None
3565
- """
3566
- Unique identifier addressing a coordinate system to which the responses are transformed.
3567
- If not set, world coordinate system is used.
3568
-
3569
- """
3570
3585
 
3571
3586
 
3572
3587
  class JointVelocityRequest(BaseModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wandelbots_api_client
3
- Version: 26.1.0.dev53
3
+ Version: 26.1.0.dev63
4
4
  Summary: Wandelbots Python Client: Interact with robots in an easy and intuitive way.
5
5
  Home-page:
6
6
  Author: Copyright (c) 2025 Wandelbots GmbH
@@ -41,7 +41,7 @@ Dynamic: license-file
41
41
  Interact with robots in an easy and intuitive way.
42
42
 
43
43
  - Compatible API version: 1.2.0 dev (can be found at the home screen of your instance -> API)
44
- - Package version: 26.1.0.dev53
44
+ - Package version: 26.1.0.dev63
45
45
 
46
46
  ## Requirements.
47
47
  Python >=3.11, Python < 4.0
@@ -1,8 +1,8 @@
1
- wandelbots_api_client/__init__.py,sha256=yb8PW4-7XWWi5Fsw-DHco19RFvp7WaKjqn8O50pe2p8,1026
2
- wandelbots_api_client/api_client.py,sha256=F-j_RzcF5S8CE5IreVSfshtIPomtLfyyp75109-vN30,27916
1
+ wandelbots_api_client/__init__.py,sha256=8IetRES0V4J1AjvXpVIPHyoj9P_uc-gRnDrRQfPEW8Y,1026
2
+ wandelbots_api_client/api_client.py,sha256=HToWASqeZtuxLHVH9HZowTqQClYJ4OLxZ4Vskjz-6qo,27916
3
3
  wandelbots_api_client/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
4
4
  wandelbots_api_client/authorization.py,sha256=DyGsVHmD-1D4C9rMEEtQLi5YvbxPxgt7MqKVlwQgC3o,9499
5
- wandelbots_api_client/configuration.py,sha256=g_zygx8Hxr0Pa-NMcQ3i7C35h01rhrw9FXBWyKZdYj4,18879
5
+ wandelbots_api_client/configuration.py,sha256=U8tdnS_noej23rGxmhw-qRMNVLiArCbg_eXDaJsYJwM,18879
6
6
  wandelbots_api_client/exceptions.py,sha256=vt8CfEEb6tv-SLne9AsjB68nYm6jfvl9T1fgq0Dp_2I,6432
7
7
  wandelbots_api_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  wandelbots_api_client/rest.py,sha256=l217DMul4sTxbJ24bRKuRo9kllBUfIec52829IxTFfA,7260
@@ -327,10 +327,10 @@ wandelbots_api_client/models/virtual_controller.py,sha256=La9EZaZacWBB7IWFR-TKRn
327
327
  wandelbots_api_client/models/virtual_controller_types.py,sha256=IIcNSonSxyah0DlHiiW_bSol1P5m5wSY5_DTvU2nj0w,6571
328
328
  wandelbots_api_client/models/virtual_robot_configuration.py,sha256=hSE-ATghHP7T0--x1LGmKjO3afMkRAvb7W-qvhgAWlU,2958
329
329
  wandelbots_api_client/models/yaskawa_controller.py,sha256=Qni-K_9wsekMuvwd1tjSGUYO6GXzcpqorNe6WceZAiU,3192
330
- wandelbots_api_client/v2/__init__.py,sha256=zz9WikH94hFs_xTg5sO8zvtwwZ5UibpO9pSZ5zoQrM4,1026
331
- wandelbots_api_client/v2/api_client.py,sha256=ElWsfTk30hR-1KfQiEWyppFWqvGu3-tFPP4m774eUX8,27934
330
+ wandelbots_api_client/v2/__init__.py,sha256=FVpsHaMNRANdIfa2KWJoTepO5N0JGFtGmWOH4E1FxVw,1026
331
+ wandelbots_api_client/v2/api_client.py,sha256=-1JsveN-qdT--Jw2a7x7yxLUYCtoggM7a2YmL2l10TU,27934
332
332
  wandelbots_api_client/v2/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
333
- wandelbots_api_client/v2/configuration.py,sha256=Ej9pv85GHARoxvAH1lgPKQt4ovKXR5N4uTOOw5KtgKY,18885
333
+ wandelbots_api_client/v2/configuration.py,sha256=eFdO3NqGbE-3Zkz3BNAZM8JnTjc3O6zW5ISx3Q72lyA,18885
334
334
  wandelbots_api_client/v2/exceptions.py,sha256=Ca5nkeVDg0VRjfjpyMekJd9c9OXUXfnd3aSOFDxRIZk,6432
335
335
  wandelbots_api_client/v2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
336
336
  wandelbots_api_client/v2/rest.py,sha256=2NwLYJ9HyXfGOM4vIz-AD_cL-BwZOzl5NvoHm7p73jk,7263
@@ -340,11 +340,11 @@ wandelbots_api_client/v2/api/bus_inputs_outputs_api.py,sha256=QxLWvgRJhtwJI2WuDb
340
340
  wandelbots_api_client/v2/api/cell_api.py,sha256=Uiche9Es8LpOKhtL09EOIe6Qu1u7j0MgAUCaYgW7mac,76604
341
341
  wandelbots_api_client/v2/api/controller_api.py,sha256=LlqkzCRpg-WSjwRJtn0PAh-4hOa8Vqod0sqbZHxxD5o,164265
342
342
  wandelbots_api_client/v2/api/controller_inputs_outputs_api.py,sha256=nP-Nv8CaSluktUWR-dBH2Mwq9-k3E-8GuqnrAut2aoM,61855
343
- wandelbots_api_client/v2/api/jogging_api.py,sha256=8jOmLOsxGfAYyKLx-rLSg3Gs2mH7QxvQ0c9emj5JoJI,7773
343
+ wandelbots_api_client/v2/api/jogging_api.py,sha256=ua2mW7nAN-W8S2TG6jDBHMUPippiIPwm-daxF2i6kLA,7927
344
344
  wandelbots_api_client/v2/api/kinematics_api.py,sha256=yp3xGJYs1N7sK4DP06iYZcClB-mmNBQhMF9N4LLAGqg,25405
345
345
  wandelbots_api_client/v2/api/license_api.py,sha256=90kO8MKfCdRb4E4Z9sUMs413G4151LNLMapJNLzBXlE,40658
346
346
  wandelbots_api_client/v2/api/motion_group_api.py,sha256=krnvzo5b-w5ai-0T4zZbUvWZAZCDlijDRaEUnTcr_ms,32792
347
- wandelbots_api_client/v2/api/motion_group_models_api.py,sha256=NvyCSaf4APArRqmxGNLFF5WIHH5uRD85vzQmobId9Qg,47352
347
+ wandelbots_api_client/v2/api/motion_group_models_api.py,sha256=ZoC-pv5Po0xDxDsqnxDMqNeLvfjq61eoGeAeOAVbOVE,59230
348
348
  wandelbots_api_client/v2/api/program_api.py,sha256=SxWfih0IxtgKl0GTAggQDqcV6Owzc2iOYVvgy1IPgCw,45939
349
349
  wandelbots_api_client/v2/api/robot_configurations_api.py,sha256=n6vKKYO-lp9E1yQlIYsNMh__iNqmt_mWY2ENDXebvUY,10995
350
350
  wandelbots_api_client/v2/api/store_collision_components_api.py,sha256=Nb8gg6E_DUiCqgVWBlJrMh6eAX7m2ShZ2LwvAUww60A,165184
@@ -358,7 +358,7 @@ wandelbots_api_client/v2/api/version_api.py,sha256=blrLxwmtrPj6Wq_ujGy1eC9vD_J1G
358
358
  wandelbots_api_client/v2/api/virtual_controller_api.py,sha256=n2njQG3KS956_XpuIKXOOw_2ckjBMBR8qhmtC8hydyM,206604
359
359
  wandelbots_api_client/v2/api/virtual_controller_behavior_api.py,sha256=tbCeKf5NfaynA85gCwm3dHoLFtrXS6FRcS-4aCo36i8,42162
360
360
  wandelbots_api_client/v2/api/virtual_controller_inputs_outputs_api.py,sha256=VnhBKJ5gwGT0RcS6d-kMp_wBngQmQ_FhNIDJTOlC9mg,42446
361
- wandelbots_api_client/v2/models/__init__.py,sha256=odkdp0j9INkYJONQrabcnuH1KVCm_Usu22PH1uVLz00,19858
361
+ wandelbots_api_client/v2/models/__init__.py,sha256=CtLrVlnhB3RUEzFgc8-I1J_xnphCBKnXyiTI4hrGU8Q,19925
362
362
  wandelbots_api_client/v2/models/abb_controller.py,sha256=J4KR0yDwYua1Jt7aPVDEAfVBgPinvJ6D6tE8ZnZhyFM,3860
363
363
  wandelbots_api_client/v2/models/abb_controller_egm_server.py,sha256=_-Kk3mAYlJ-beKKITI3nnTI4dQNLuzLIiFtN2jc_J8M,2776
364
364
  wandelbots_api_client/v2/models/activate_license_request.py,sha256=wBbxeVV_kGwJfKE6JVARyjrrgxxm32J9DYxqrzYxhcg,2693
@@ -447,7 +447,7 @@ wandelbots_api_client/v2/models/http_validation_error.py,sha256=yuEYvTsBOB5JoXRN
447
447
  wandelbots_api_client/v2/models/image_credentials.py,sha256=RnB5MMcibRwdnSsMaQEwLa24gzu3gWIiJNEEf0e0KI8,2791
448
448
  wandelbots_api_client/v2/models/inconsistent_trajectory_size_error.py,sha256=nQwAfBP1gLHm8cnA4ck5fmJ5n0gEVfjKBGWqsfX5wGU,3398
449
449
  wandelbots_api_client/v2/models/inconsistent_trajectory_size_error_inconsistent_trajectory_size.py,sha256=Tj6ZnIQl-y1nByjpxQWptEpp6-U3xWKYkI5JwthS6cg,3042
450
- wandelbots_api_client/v2/models/initialize_jogging_request.py,sha256=lam0Bb-8GWd8IIU0CYdl2AlggP4RdFc4l5HemOaYGXw,3758
450
+ wandelbots_api_client/v2/models/initialize_jogging_request.py,sha256=dvq3gPVK8SJ-8EeroMLbqPjlSM_aosxTtGTBzeSZ_IE,3422
451
451
  wandelbots_api_client/v2/models/initialize_jogging_response.py,sha256=g0KlElPFn2pI1I-2kNV0YJLTGVIRjDLygTHQxdcagew,3115
452
452
  wandelbots_api_client/v2/models/initialize_movement_request.py,sha256=AOs88zSsBorXvSgCmCiFGKZc7n6MXUfxg2OndwPWLJc,5076
453
453
  wandelbots_api_client/v2/models/initialize_movement_request_trajectory.py,sha256=l0q6XpzgvDFlRebED5hKTtpDoALTuFuoIzAHrcIiRtc,6161
@@ -456,7 +456,7 @@ wandelbots_api_client/v2/models/integer_value.py,sha256=d6l2pBP718l8sEL4SPpQ-1FP
456
456
  wandelbots_api_client/v2/models/invalid_dof_error.py,sha256=BsJJXLeTplkTnTDmiKP3YiVsSmf8F97SMsFrM1_XKGQ,2979
457
457
  wandelbots_api_client/v2/models/invalid_dof_error_invalid_dof.py,sha256=FOxL_scfg-NhBm4Yp5wr6fn_o9zkrkrmhIOBGXaLPr4,2978
458
458
  wandelbots_api_client/v2/models/inverse_kinematics422_response.py,sha256=qJOpa_DKDCXYA-QcAhTQQxlmpudKXKR3Ni5RSS1EZkI,3835
459
- wandelbots_api_client/v2/models/inverse_kinematics_request.py,sha256=Y-mNMb7qXBBLy1p0m4fC_mYBNsuz_METh3EZWRCQclM,7659
459
+ wandelbots_api_client/v2/models/inverse_kinematics_request.py,sha256=mYTeAeQRswC5rkcChrVcqkI5GZTGPetBCd0M-2VqeqE,7879
460
460
  wandelbots_api_client/v2/models/inverse_kinematics_response.py,sha256=DRgT-kuDtYK1hoMgpkgOSObcZCf8NlPEHVDs8F4pPpE,2663
461
461
  wandelbots_api_client/v2/models/inverse_kinematics_validation_error.py,sha256=ORW251P8MwgafCqxho2PSL7faIrvrt8m-wDxP1rgXZk,4468
462
462
  wandelbots_api_client/v2/models/inverse_kinematics_validation_error_all_of_data.py,sha256=AoTehZikk39JeKvFcBswusiMjmuc167qP2ZoYJ56Adk,6586
@@ -481,6 +481,7 @@ wandelbots_api_client/v2/models/joint_limits.py,sha256=4oGsGqhXf-5ZkXq3qf3_EokyY
481
481
  wandelbots_api_client/v2/models/joint_trajectory.py,sha256=rs7nO4xc42r-N1k2UXBuRMGo27OddZ5jRn_DeZZOv_w,3080
482
482
  wandelbots_api_client/v2/models/joint_velocity_request.py,sha256=tIT3Pou-33HLI-9BVnbJiPerpm_4D9NpFjC8UFDbZqU,3265
483
483
  wandelbots_api_client/v2/models/joint_velocity_response.py,sha256=Txw_KlgCa-YXYIWeivW24TbipPNIZXhBhGSGMMdx1EE,3106
484
+ wandelbots_api_client/v2/models/kinematic_model.py,sha256=65akUk2_zBcDerKT0SaRz7E4STqUAEFvJX5EiXxlz_E,4000
484
485
  wandelbots_api_client/v2/models/kuka_controller.py,sha256=3FYVbPlTjXnU9P1hfWnfq0KJ6DNrMYHE2wM83ATybBs,4076
485
486
  wandelbots_api_client/v2/models/kuka_controller_rsi_server.py,sha256=ecZ5PsRm0MpPkBycTFBAqR287BgIhlUKmBZFi34S558,2760
486
487
  wandelbots_api_client/v2/models/license.py,sha256=-TDBzT6M0sKPkP6Y9hhCy56oD_5Zat9QnB1TDA0IYgw,4593
@@ -604,12 +605,12 @@ wandelbots_api_client/v2/models/virtual_controller_types.py,sha256=IIcNSonSxyah0
604
605
  wandelbots_api_client/v2/models/virtual_robot_configuration.py,sha256=91OOKWd5zM15ohNn0NF7wwi08HJtZTZHQl29ibQb4LY,2958
605
606
  wandelbots_api_client/v2/models/wait_for_io_event_request.py,sha256=F5H8xDdWckiC4zwLc7Ce-TMcHeWteUfaUiu6wQ7FMr4,3211
606
607
  wandelbots_api_client/v2/models/yaskawa_controller.py,sha256=BQtgT1acj1-hXW5mA33GPcv7utqM5hbRqD0kmN5N2tk,3040
607
- wandelbots_api_client/v2_pydantic/__init__.py,sha256=_ONKa43ezopgmDEXOwEoGu92NjeoTKoHRE-p-94WvWU,1061
608
- wandelbots_api_client/v2_pydantic/api_client.py,sha256=uAbWhSQhoGO8_2KaNuGem_nObyOAp-BzA3ET9RlpvPQ,28142
608
+ wandelbots_api_client/v2_pydantic/__init__.py,sha256=6w5pX7aLTXERI-r1wBEumBwYlIvgbtKkKhr_aKiFKzo,1061
609
+ wandelbots_api_client/v2_pydantic/api_client.py,sha256=lSEAeGrSVyR1Lcq5RJUda_DIk0ygw64NwAupaXRqC5A,28142
609
610
  wandelbots_api_client/v2_pydantic/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
610
- wandelbots_api_client/v2_pydantic/configuration.py,sha256=8Qjub8FBxNq5h6BtlBuDZC5w1k_gL5WN5-mNIuoDB0I,18903
611
+ wandelbots_api_client/v2_pydantic/configuration.py,sha256=rOnW7mlQzonqYws-IAgVQezv2vahSioll2sc0qUSBR0,18903
611
612
  wandelbots_api_client/v2_pydantic/exceptions.py,sha256=Ca5nkeVDg0VRjfjpyMekJd9c9OXUXfnd3aSOFDxRIZk,6432
612
- wandelbots_api_client/v2_pydantic/models.py,sha256=jQxJDonl9eHPh-F_aFRB_re9RH-sj5S_FOsetjaFoeQ,129928
613
+ wandelbots_api_client/v2_pydantic/models.py,sha256=Ocw7DM4AYTsFLXPhB4EImrlyxlo1beGvw03TOIV7WPk,130450
613
614
  wandelbots_api_client/v2_pydantic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
614
615
  wandelbots_api_client/v2_pydantic/rest.py,sha256=327QB3WHUdmmKw_FBmYUGS3syi216LaW-BiTY40rgik,7272
615
616
  wandelbots_api_client/v2_pydantic/virtual_controller_types.py,sha256=luk6nO5VP4f8NmaHVrgzWmcw4TaFyNXD3B9WoECdID8,5225
@@ -619,11 +620,11 @@ wandelbots_api_client/v2_pydantic/api/bus_inputs_outputs_api.py,sha256=uBneLeJ_d
619
620
  wandelbots_api_client/v2_pydantic/api/cell_api.py,sha256=ZuEkqo4PbqsPdiP_vRAUO32mTl__udMCvn0aj6mvbGY,76914
620
621
  wandelbots_api_client/v2_pydantic/api/controller_api.py,sha256=XuNsMaKF1ZIaukuDuoscKBs_3JTEHKT5POu2Jqmwx7M,164728
621
622
  wandelbots_api_client/v2_pydantic/api/controller_inputs_outputs_api.py,sha256=JxmyAT8obJnn1JAvFJUuvhS9hfkRb3nF4TW1oLYLS18,62010
622
- wandelbots_api_client/v2_pydantic/api/jogging_api.py,sha256=Ak70H8bwTPG5U54Ph3usbAtSH6aX7C9WJvPh4u4AWzo,7809
623
+ wandelbots_api_client/v2_pydantic/api/jogging_api.py,sha256=cwflHND9jdF0Vh6Yzsklla5IzC3un9OpFdewW9wiplA,7963
623
624
  wandelbots_api_client/v2_pydantic/api/kinematics_api.py,sha256=OXNrHmtZx1y5L2sMIGRbDAqG6KLcf84IikY9Ilcdufc,25444
624
625
  wandelbots_api_client/v2_pydantic/api/license_api.py,sha256=jzArFEw0b2VJtpVQRa-74GpycDW0twntJllFTcFrHPI,40836
625
626
  wandelbots_api_client/v2_pydantic/api/motion_group_api.py,sha256=kXWHsnHrahohagR2dpMnLIWKxXqD9LonauK6xNCQnFE,32884
626
- wandelbots_api_client/v2_pydantic/api/motion_group_models_api.py,sha256=LU1iiOV4qmRaB6gfDJz293Dyyfl8cn42sJwNQ-Kmu8c,47551
627
+ wandelbots_api_client/v2_pydantic/api/motion_group_models_api.py,sha256=SsN6bOCIjvsFLrwGToZ4BVl8ZuKd3W2yaITuSwcmvdI,59465
627
628
  wandelbots_api_client/v2_pydantic/api/program_api.py,sha256=9ZJbfSiHmdgtGMYP909ujoTPPlFjDbH35gY4lrjbBD0,46123
628
629
  wandelbots_api_client/v2_pydantic/api/robot_configurations_api.py,sha256=Y7N04NmEN83_mB31BXtQEKZbafPSdqN3O9wcp9XlOtU,11065
629
630
  wandelbots_api_client/v2_pydantic/api/store_collision_components_api.py,sha256=DbBliWnZAeo5wjKwWTccnp825o4KBS-eCjYFha7f8eQ,165856
@@ -637,8 +638,8 @@ wandelbots_api_client/v2_pydantic/api/version_api.py,sha256=Wzp7Jj-lKy0QAzPddcsd
637
638
  wandelbots_api_client/v2_pydantic/api/virtual_controller_api.py,sha256=iayURe8F_4IK-12f9ZeQYxWGNmkwFcAnpn3S_J9s8Ag,207225
638
639
  wandelbots_api_client/v2_pydantic/api/virtual_controller_behavior_api.py,sha256=YykdkLQQc3zje8MBRog6sjELorPG4Q36GfJAeiBocc4,42312
639
640
  wandelbots_api_client/v2_pydantic/api/virtual_controller_inputs_outputs_api.py,sha256=1gYa5YfRF70oNBJFsDpfQCXQt6gEM1-S49mNSNmaMzE,42587
640
- wandelbots_api_client-26.1.0.dev53.dist-info/licenses/LICENSE,sha256=PJyUaZgTVC0_nJmhRpcbnOcXvmTqJGE6axeSifngIGY,11344
641
- wandelbots_api_client-26.1.0.dev53.dist-info/METADATA,sha256=7Q7MewantPzEDqOJqOYJgvnkVq35gHuHDrLwv31w7kM,1726
642
- wandelbots_api_client-26.1.0.dev53.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
643
- wandelbots_api_client-26.1.0.dev53.dist-info/top_level.txt,sha256=eCDsV95XWqVBSMDe4MRzyOj53-TK-o5WU1Qv_yv493M,22
644
- wandelbots_api_client-26.1.0.dev53.dist-info/RECORD,,
641
+ wandelbots_api_client-26.1.0.dev63.dist-info/licenses/LICENSE,sha256=PJyUaZgTVC0_nJmhRpcbnOcXvmTqJGE6axeSifngIGY,11344
642
+ wandelbots_api_client-26.1.0.dev63.dist-info/METADATA,sha256=d0cVH3UHjPHn5_4M4rdHG2sHF3Il3m-zdGLSshRmNyQ,1726
643
+ wandelbots_api_client-26.1.0.dev63.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
644
+ wandelbots_api_client-26.1.0.dev63.dist-info/top_level.txt,sha256=eCDsV95XWqVBSMDe4MRzyOj53-TK-o5WU1Qv_yv493M,22
645
+ wandelbots_api_client-26.1.0.dev63.dist-info/RECORD,,