standardbots 2.20240212.18__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.
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/PKG-INFO +1 -1
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/setup.py +1 -1
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots/auto_generated/apis.py +161 -0
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots/auto_generated/models.py +163 -0
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots.egg-info/PKG-INFO +1 -1
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/setup.cfg +0 -0
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots/__init__.py +0 -0
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots/auto_generated/__init__.py +0 -0
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots.egg-info/SOURCES.txt +0 -0
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots.egg-info/dependency_links.txt +0 -0
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots.egg-info/requires.txt +0 -0
- {standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots.egg-info/top_level.txt +0 -0
{standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots/auto_generated/apis.py
RENAMED
|
@@ -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 ('start' or 'stop').
|
|
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):
|
{standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots/auto_generated/models.py
RENAMED
|
@@ -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
|
|
File without changes
|
|
File without changes
|
{standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots/auto_generated/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
{standardbots-2.20240212.18 → standardbots-2.20240401.1}/standardbots.egg-info/top_level.txt
RENAMED
|
File without changes
|