standardbots 2.20240212.19__tar.gz → 2.20240401.1__tar.gz

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.

Potentially problematic release.


This version of standardbots might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: standardbots
3
- Version: 2.20240212.19
3
+ Version: 2.20240401.1
4
4
  Summary: Standard Bots RO1 Robotics API
5
5
  Home-page:
6
6
  Author: Standard Bots Support
@@ -13,7 +13,7 @@
13
13
  from setuptools import setup, find_packages # noqa: H301
14
14
 
15
15
  NAME = "standardbots"
16
- VERSION = "2.20240212.19"
16
+ VERSION = "2.20240401.1"
17
17
  # To install the library, run the following
18
18
  #
19
19
  # python setup.py install
@@ -683,6 +683,79 @@ class Camera:
683
683
  self.data = Camera.Data(request_manager)
684
684
  self.settings = Camera.Settings(request_manager)
685
685
 
686
+ class ChatGpt:
687
+ _request_manager: RequestManager
688
+ class Data:
689
+ def __init__(self, request_manager: RequestManager):
690
+ self._request_manager = request_manager
691
+
692
+
693
+ def speech_to_text(
694
+ self,
695
+ body: models.SpeechToTextRequest,
696
+ ) -> Response[
697
+ None,
698
+ None
699
+ ]:
700
+ """
701
+ Convert speech to text.
702
+ """
703
+ path = "/api/v1/internal-only/speech-to-text"
704
+ response = self._request_manager.request(
705
+ "POST",
706
+ path,
707
+ headers=self._request_manager.json_headers(),
708
+ body=json.dumps(models.serialize_speech_to_text_request(body)),
709
+ )
710
+ parsed = None
711
+
712
+ is_user_error = response.status >= 400 and response.status < 500
713
+ is_unavailable = response.status == 503
714
+ if parsed is None and (is_user_error or is_unavailable):
715
+ parsed = models.parse_error_response(json.loads(response.data))
716
+
717
+ return Response(
718
+ parsed,
719
+ response.status,
720
+ response
721
+ )
722
+
723
+ def text_to_skill(
724
+ self,
725
+ body: models.TextToSkillRequest,
726
+ ) -> Response[
727
+ None,
728
+ None
729
+ ]:
730
+ """
731
+ Convert text to a skill.
732
+ """
733
+ path = "/api/v1/internal-only/text-to-skill"
734
+ response = self._request_manager.request(
735
+ "POST",
736
+ path,
737
+ headers=self._request_manager.json_headers(),
738
+ body=json.dumps(models.serialize_text_to_skill_request(body)),
739
+ )
740
+ parsed = None
741
+
742
+ is_user_error = response.status >= 400 and response.status < 500
743
+ is_unavailable = response.status == 503
744
+ if parsed is None and (is_user_error or is_unavailable):
745
+ parsed = models.parse_error_response(json.loads(response.data))
746
+
747
+ return Response(
748
+ parsed,
749
+ response.status,
750
+ response
751
+ )
752
+
753
+ data: Data
754
+
755
+ def __init__(self, request_manager: RequestManager):
756
+ self._request_manager = request_manager
757
+ self.data = ChatGpt.Data(request_manager)
758
+
686
759
  class RoutineEditor:
687
760
  _request_manager: RequestManager
688
761
  class Routines:
@@ -1067,6 +1140,90 @@ class Status:
1067
1140
  self.control = Status.Control(request_manager)
1068
1141
  self.health = Status.Health(request_manager)
1069
1142
 
1143
+ class Teleoperation:
1144
+ _request_manager: RequestManager
1145
+ class Control:
1146
+ def __init__(self, request_manager: RequestManager):
1147
+ self._request_manager = request_manager
1148
+
1149
+
1150
+ def update_teleop_state(
1151
+ self,
1152
+ body: models.TeleopStateUpdateRequest,
1153
+ ) -> Response[
1154
+ Union[
1155
+ models.TeleopStateResponse,
1156
+ models.ErrorResponse,
1157
+ None
1158
+ ],
1159
+ models.TeleopStateResponse
1160
+ ]:
1161
+ """
1162
+ Updates the state of teleoperation based on the provided action (&#x27;start&#x27; or &#x27;stop&#x27;).
1163
+ """
1164
+ path = "/api/v1/movement/teleop/state"
1165
+ response = self._request_manager.request(
1166
+ "POST",
1167
+ path,
1168
+ headers=self._request_manager.json_headers(),
1169
+ body=json.dumps(models.serialize_teleop_state_update_request(body)),
1170
+ )
1171
+ parsed = None
1172
+ if response.status == 200:
1173
+ parsed = models.parse_teleop_state_response(json.loads(response.data))
1174
+
1175
+ is_user_error = response.status >= 400 and response.status < 500
1176
+ is_unavailable = response.status == 503
1177
+ if parsed is None and (is_user_error or is_unavailable):
1178
+ parsed = models.parse_error_response(json.loads(response.data))
1179
+
1180
+ return Response(
1181
+ parsed,
1182
+ response.status,
1183
+ response
1184
+ )
1185
+
1186
+ class Status:
1187
+ def __init__(self, request_manager: RequestManager):
1188
+ self._request_manager = request_manager
1189
+
1190
+
1191
+ def get_teleop_state(
1192
+ self,
1193
+ ) -> Response[
1194
+ None,
1195
+ None
1196
+ ]:
1197
+ """
1198
+ Retrieves the current state of teleoperation.
1199
+ """
1200
+ path = "/api/v1/movement/teleop/state"
1201
+ response = self._request_manager.request(
1202
+ "GET",
1203
+ path,
1204
+ headers=self._request_manager.json_headers(),
1205
+ )
1206
+ parsed = None
1207
+
1208
+ is_user_error = response.status >= 400 and response.status < 500
1209
+ is_unavailable = response.status == 503
1210
+ if parsed is None and (is_user_error or is_unavailable):
1211
+ parsed = models.parse_error_response(json.loads(response.data))
1212
+
1213
+ return Response(
1214
+ parsed,
1215
+ response.status,
1216
+ response
1217
+ )
1218
+
1219
+ control: Control
1220
+ status: Status
1221
+
1222
+ def __init__(self, request_manager: RequestManager):
1223
+ self._request_manager = request_manager
1224
+ self.control = Teleoperation.Control(request_manager)
1225
+ self.status = Teleoperation.Status(request_manager)
1226
+
1070
1227
 
1071
1228
 
1072
1229
 
@@ -1075,8 +1232,10 @@ class StandardBotsRobot(Default):
1075
1232
 
1076
1233
  movement: Movement
1077
1234
  camera: Camera
1235
+ chat_gpt: ChatGpt
1078
1236
  routine_editor: RoutineEditor
1079
1237
  status: Status
1238
+ teleoperation: Teleoperation
1080
1239
  def __init__(
1081
1240
  self,
1082
1241
  url: str,
@@ -1092,8 +1251,10 @@ class StandardBotsRobot(Default):
1092
1251
  ))
1093
1252
  self.movement = Movement(self._request_manager)
1094
1253
  self.camera = Camera(self._request_manager)
1254
+ self.chat_gpt = ChatGpt(self._request_manager)
1095
1255
  self.routine_editor = RoutineEditor(self._request_manager)
1096
1256
  self.status = Status(self._request_manager)
1257
+ self.teleoperation = Teleoperation(self._request_manager)
1097
1258
 
1098
1259
  @contextmanager
1099
1260
  def connection(self):
@@ -1032,6 +1032,44 @@ def serialize_runtime_variable(data: RuntimeVariable) -> object:
1032
1032
  "value": None if data.value is None else serialize_str(data.value),
1033
1033
  }
1034
1034
 
1035
+ SkillsList = List[str]
1036
+
1037
+ def parse_skills_list(data: object) -> SkillsList:
1038
+ return [parse_str(item) for item in data]
1039
+
1040
+ def serialize_skills_list(data: SkillsList) -> List[object]:
1041
+ return [serialize_str(item) for item in data]
1042
+
1043
+ @dataclass
1044
+ class SpeechToTextRequest:
1045
+ """Request to convert speech to text."""
1046
+ encoded_audio_data: Union[str, None] = None
1047
+
1048
+ def validate_encoded_audio_data(self, value: str) -> Tuple[bool, str]:
1049
+ if value is None:
1050
+ return [True, ""]
1051
+
1052
+ if not isinstance(value, str):
1053
+ return [False, "encoded_audio_data must be of type str for SpeechToTextRequest, got " + type(value).__name__]
1054
+
1055
+ return [True, ""]
1056
+
1057
+ def __post_init__(self):
1058
+ # Type check incoming model - raise error if invalid (required or wrong type)
1059
+ is_valid, error_str = self.validate_encoded_audio_data(self.encoded_audio_data)
1060
+ if not is_valid:
1061
+ raise TypeError(error_str)
1062
+
1063
+ def parse_speech_to_text_request(data: object):
1064
+ return SpeechToTextRequest(
1065
+ encoded_audio_data=parse_str(data["encoded_audio_data"]) if "encoded_audio_data" in data else None,
1066
+ )
1067
+
1068
+ def serialize_speech_to_text_request(data: SpeechToTextRequest) -> object:
1069
+ return {
1070
+ "encoded_audio_data": None if data.encoded_audio_data is None else serialize_str(data.encoded_audio_data),
1071
+ }
1072
+
1035
1073
  class StatusHealthEnum(Enum):
1036
1074
  Ok = "ok"
1037
1075
  """Enum Ok = `ok`"""
@@ -1091,6 +1129,56 @@ def serialize_status_version_data(data: StatusVersionData) -> object:
1091
1129
  "name": None if data.name is None else serialize_str(data.name),
1092
1130
  }
1093
1131
 
1132
+ class TeleopStateEnum(Enum):
1133
+ WaitForTeleop = "wait_for_teleop"
1134
+ """The system is waiting to start teleoperation."""
1135
+ Teleop = "teleop"
1136
+ """Teleoperation is active, and the robot is being controlled remotely."""
1137
+ Stopping = "stopping"
1138
+ """The robot is stopping."""
1139
+ Stopped = "stopped"
1140
+ """Teleoperation is stopped, and the robot is not moving."""
1141
+ Moving = "moving"
1142
+ """The robot is moving but not under teleoperation."""
1143
+ Unfrozen = "unfrozen"
1144
+ """The mini-arm is unfrozen."""
1145
+
1146
+ def parse_teleop_state_enum(data: object) -> TeleopStateEnum:
1147
+ return TeleopStateEnum(data)
1148
+
1149
+ def serialize_teleop_state_enum(data: Union[TeleopStateEnum, str]) -> object:
1150
+ return TeleopStateEnum(data).value
1151
+
1152
+ @dataclass
1153
+ class TeleopStateUpdateRequest:
1154
+ """Request to update the state of teleoperation to either start or stop."""
1155
+ action: Union[str, None] = None
1156
+
1157
+ def validate_action(self, value: str) -> Tuple[bool, str]:
1158
+ if value is None:
1159
+ return [True, ""]
1160
+
1161
+ if not isinstance(value, str):
1162
+ return [False, "action must be of type str for TeleopStateUpdateRequest, got " + type(value).__name__]
1163
+
1164
+ return [True, ""]
1165
+
1166
+ def __post_init__(self):
1167
+ # Type check incoming model - raise error if invalid (required or wrong type)
1168
+ is_valid, error_str = self.validate_action(self.action)
1169
+ if not is_valid:
1170
+ raise TypeError(error_str)
1171
+
1172
+ def parse_teleop_state_update_request(data: object):
1173
+ return TeleopStateUpdateRequest(
1174
+ action=parse_str(data["action"]) if "action" in data else None,
1175
+ )
1176
+
1177
+ def serialize_teleop_state_update_request(data: TeleopStateUpdateRequest) -> object:
1178
+ return {
1179
+ "action": None if data.action is None else serialize_str(data.action),
1180
+ }
1181
+
1094
1182
  @dataclass
1095
1183
  class ArmPositionUpdateFailureEvent:
1096
1184
  """Move robot event when movement failed"""
@@ -1658,6 +1746,51 @@ def serialize_play_routine_request(data: PlayRoutineRequest) -> object:
1658
1746
  "variables": None if data.variables is None else serialize_routine_variables_state_map(data.variables),
1659
1747
  }
1660
1748
 
1749
+ @dataclass
1750
+ class TextToSkillRequest:
1751
+ """Request to convert text to a skill."""
1752
+ text: Union[str, None] = None
1753
+ skills: Union[SkillsList, None] = None
1754
+
1755
+ def validate_text(self, value: str) -> Tuple[bool, str]:
1756
+ if value is None:
1757
+ return [True, ""]
1758
+
1759
+ if not isinstance(value, str):
1760
+ return [False, "text must be of type str for TextToSkillRequest, got " + type(value).__name__]
1761
+
1762
+ return [True, ""]
1763
+
1764
+ def validate_skills(self, value: SkillsList) -> Tuple[bool, str]:
1765
+ if value is None:
1766
+ return [True, ""]
1767
+
1768
+ if not (isinstance(value, list) and all(isinstance(x, str) for x in value)):
1769
+ return [False, "skills must be of type SkillsList for TextToSkillRequest, got " + type(value).__name__]
1770
+
1771
+ return [True, ""]
1772
+
1773
+ def __post_init__(self):
1774
+ # Type check incoming model - raise error if invalid (required or wrong type)
1775
+ is_valid, error_str = self.validate_text(self.text)
1776
+ if not is_valid:
1777
+ raise TypeError(error_str)
1778
+ is_valid, error_str = self.validate_skills(self.skills)
1779
+ if not is_valid:
1780
+ raise TypeError(error_str)
1781
+
1782
+ def parse_text_to_skill_request(data: object):
1783
+ return TextToSkillRequest(
1784
+ text=parse_str(data["text"]) if "text" in data else None,
1785
+ skills=parse_skills_list(data["skills"]) if "skills" in data else None,
1786
+ )
1787
+
1788
+ def serialize_text_to_skill_request(data: TextToSkillRequest) -> object:
1789
+ return {
1790
+ "text": None if data.text is None else serialize_str(data.text),
1791
+ "skills": None if data.skills is None else serialize_skills_list(data.skills),
1792
+ }
1793
+
1661
1794
  @dataclass
1662
1795
  class StatusHealthResponse:
1663
1796
  """Status Health Response"""
@@ -1703,6 +1836,36 @@ def serialize_status_health_response(data: StatusHealthResponse) -> object:
1703
1836
  "build": None if data.build is None else serialize_status_version_data(data.build),
1704
1837
  }
1705
1838
 
1839
+ @dataclass
1840
+ class TeleopStateResponse:
1841
+ """Response to a query for the current state of teleoperation."""
1842
+ state: Union[TeleopStateEnum, None] = None
1843
+
1844
+ def validate_state(self, value: TeleopStateEnum) -> Tuple[bool, str]:
1845
+ if value is None:
1846
+ return [True, ""]
1847
+
1848
+ if not ((isinstance(value, str) and TeleopStateEnum in ['wait_for_teleop', 'teleop', 'stopping', 'stopped', 'moving', 'unfrozen']) or isinstance(value, TeleopStateEnum)):
1849
+ return [False, "state must be of type TeleopStateEnum for TeleopStateResponse, got " + type(value).__name__]
1850
+
1851
+ return [True, ""]
1852
+
1853
+ def __post_init__(self):
1854
+ # Type check incoming model - raise error if invalid (required or wrong type)
1855
+ is_valid, error_str = self.validate_state(self.state)
1856
+ if not is_valid:
1857
+ raise TypeError(error_str)
1858
+
1859
+ def parse_teleop_state_response(data: object):
1860
+ return TeleopStateResponse(
1861
+ state=parse_teleop_state_enum(data["state"]) if "state" in data else None,
1862
+ )
1863
+
1864
+ def serialize_teleop_state_response(data: TeleopStateResponse) -> object:
1865
+ return {
1866
+ "state": None if data.state is None else serialize_teleop_state_enum(data.state),
1867
+ }
1868
+
1706
1869
  @dataclass
1707
1870
  class ArmPositionUpdateRequestResponseEventStreamDetails:
1708
1871
  """Specify how the response should be sent
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: standardbots
3
- Version: 2.20240212.19
3
+ Version: 2.20240401.1
4
4
  Summary: Standard Bots RO1 Robotics API
5
5
  Home-page:
6
6
  Author: Standard Bots Support