viam-sdk 0.3.0__py3-none-linux_armv6l.whl → 0.66.0__py3-none-linux_armv6l.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.

Potentially problematic release.


This version of viam-sdk might be problematic. Click here for more details.

Files changed (452) hide show
  1. viam/__init__.py +29 -2
  2. viam/app/_logs.py +34 -0
  3. viam/app/app_client.py +2696 -0
  4. viam/app/billing_client.py +185 -0
  5. viam/app/data_client.py +2231 -0
  6. viam/app/ml_training_client.py +249 -0
  7. viam/app/provisioning_client.py +93 -0
  8. viam/app/viam_client.py +275 -0
  9. viam/components/arm/__init__.py +3 -26
  10. viam/components/arm/arm.py +123 -8
  11. viam/components/arm/client.py +37 -24
  12. viam/components/arm/service.py +35 -32
  13. viam/components/audio_in/__init__.py +24 -0
  14. viam/components/audio_in/audio_in.py +74 -0
  15. viam/components/audio_in/client.py +76 -0
  16. viam/components/audio_in/service.py +83 -0
  17. viam/components/audio_out/__init__.py +21 -0
  18. viam/components/audio_out/audio_out.py +72 -0
  19. viam/components/audio_out/client.py +67 -0
  20. viam/components/audio_out/service.py +63 -0
  21. viam/components/base/__init__.py +6 -11
  22. viam/components/base/base.py +134 -8
  23. viam/components/base/client.py +51 -23
  24. viam/components/base/service.py +33 -30
  25. viam/components/board/__init__.py +3 -12
  26. viam/components/board/board.py +247 -91
  27. viam/components/board/client.py +149 -83
  28. viam/components/board/service.py +63 -33
  29. viam/components/button/__init__.py +10 -0
  30. viam/components/button/button.py +41 -0
  31. viam/components/button/client.py +52 -0
  32. viam/components/button/service.py +46 -0
  33. viam/components/camera/__init__.py +3 -3
  34. viam/components/camera/camera.py +62 -27
  35. viam/components/camera/client.py +59 -27
  36. viam/components/camera/service.py +42 -65
  37. viam/components/component_base.py +28 -5
  38. viam/components/encoder/__init__.py +1 -1
  39. viam/components/encoder/client.py +25 -14
  40. viam/components/encoder/encoder.py +48 -10
  41. viam/components/encoder/service.py +14 -18
  42. viam/components/gantry/__init__.py +1 -13
  43. viam/components/gantry/client.py +80 -25
  44. viam/components/gantry/gantry.py +123 -9
  45. viam/components/gantry/service.py +51 -29
  46. viam/components/generic/__init__.py +1 -1
  47. viam/components/generic/client.py +21 -8
  48. viam/components/generic/generic.py +10 -2
  49. viam/components/generic/service.py +12 -7
  50. viam/components/gripper/__init__.py +3 -13
  51. viam/components/gripper/client.py +69 -21
  52. viam/components/gripper/gripper.py +123 -3
  53. viam/components/gripper/service.py +44 -22
  54. viam/components/input/__init__.py +1 -14
  55. viam/components/input/client.py +55 -23
  56. viam/components/input/input.py +106 -3
  57. viam/components/input/service.py +16 -21
  58. viam/components/motor/__init__.py +1 -21
  59. viam/components/motor/client.py +56 -33
  60. viam/components/motor/motor.py +127 -4
  61. viam/components/motor/service.py +33 -44
  62. viam/components/movement_sensor/__init__.py +1 -1
  63. viam/components/movement_sensor/client.py +102 -45
  64. viam/components/movement_sensor/movement_sensor.py +130 -61
  65. viam/components/movement_sensor/service.py +38 -41
  66. viam/components/pose_tracker/__init__.py +1 -1
  67. viam/components/pose_tracker/client.py +18 -7
  68. viam/components/pose_tracker/pose_tracker.py +4 -2
  69. viam/components/pose_tracker/service.py +12 -10
  70. viam/components/power_sensor/__init__.py +17 -0
  71. viam/components/power_sensor/client.py +86 -0
  72. viam/components/power_sensor/power_sensor.py +104 -0
  73. viam/components/power_sensor/service.py +72 -0
  74. viam/components/sensor/__init__.py +2 -1
  75. viam/components/sensor/client.py +26 -10
  76. viam/components/sensor/sensor.py +22 -4
  77. viam/components/sensor/service.py +20 -11
  78. viam/components/servo/__init__.py +1 -13
  79. viam/components/servo/client.py +47 -21
  80. viam/components/servo/service.py +15 -22
  81. viam/components/servo/servo.py +61 -2
  82. viam/components/switch/__init__.py +10 -0
  83. viam/components/switch/client.py +83 -0
  84. viam/components/switch/service.py +72 -0
  85. viam/components/switch/switch.py +98 -0
  86. viam/errors.py +10 -0
  87. viam/gen/app/agent/v1/agent_grpc.py +29 -0
  88. viam/gen/app/agent/v1/agent_pb2.py +47 -0
  89. viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
  90. viam/gen/app/cloudslam/v1/__init__.py +0 -0
  91. viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
  92. viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
  93. viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
  94. viam/gen/app/data/v1/data_grpc.py +197 -8
  95. viam/gen/app/data/v1/data_pb2.py +238 -99
  96. viam/gen/app/data/v1/data_pb2.pyi +1222 -259
  97. viam/gen/app/datapipelines/__init__.py +0 -0
  98. viam/gen/app/datapipelines/v1/__init__.py +0 -0
  99. viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
  100. viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +57 -0
  101. viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +387 -0
  102. viam/gen/app/dataset/__init__.py +0 -0
  103. viam/gen/app/dataset/v1/__init__.py +0 -0
  104. viam/gen/app/dataset/v1/dataset_grpc.py +68 -0
  105. viam/gen/app/dataset/v1/dataset_pb2.py +44 -0
  106. viam/gen/app/dataset/v1/dataset_pb2.pyi +214 -0
  107. viam/gen/app/datasync/v1/data_sync_grpc.py +21 -4
  108. viam/gen/app/datasync/v1/data_sync_pb2.py +62 -128
  109. viam/gen/app/datasync/v1/data_sync_pb2.pyi +156 -199
  110. viam/gen/app/mlinference/__init__.py +0 -0
  111. viam/gen/app/mlinference/v1/__init__.py +0 -0
  112. viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
  113. viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
  114. viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
  115. viam/gen/app/mltraining/v1/ml_training_grpc.py +51 -3
  116. viam/gen/app/mltraining/v1/ml_training_pb2.py +135 -58
  117. viam/gen/app/mltraining/v1/ml_training_pb2.pyi +328 -39
  118. viam/gen/app/packages/v1/packages_grpc.py +15 -1
  119. viam/gen/app/packages/v1/packages_pb2.py +44 -64
  120. viam/gen/app/packages/v1/packages_pb2.pyi +75 -85
  121. viam/gen/app/v1/app_grpc.py +644 -3
  122. viam/gen/app/v1/app_pb2.py +695 -295
  123. viam/gen/app/v1/app_pb2.pyi +4488 -635
  124. viam/gen/app/v1/billing_grpc.py +53 -11
  125. viam/gen/app/v1/billing_pb2.py +94 -39
  126. viam/gen/app/v1/billing_pb2.pyi +391 -191
  127. viam/gen/app/v1/end_user_grpc.py +59 -0
  128. viam/gen/app/v1/end_user_pb2.py +55 -0
  129. viam/gen/app/v1/end_user_pb2.pyi +181 -0
  130. viam/gen/app/v1/robot_grpc.py +16 -1
  131. viam/gen/app/v1/robot_pb2.py +122 -94
  132. viam/gen/app/v1/robot_pb2.pyi +463 -123
  133. viam/gen/common/v1/common_pb2.py +87 -58
  134. viam/gen/common/v1/common_pb2.pyi +456 -149
  135. viam/gen/component/arm/v1/arm_grpc.py +58 -2
  136. viam/gen/component/arm/v1/arm_pb2.py +68 -51
  137. viam/gen/component/arm/v1/arm_pb2.pyi +108 -42
  138. viam/gen/component/audioin/__init__.py +0 -0
  139. viam/gen/component/audioin/v1/__init__.py +0 -0
  140. viam/gen/component/audioin/v1/audioin_grpc.py +54 -0
  141. viam/gen/component/audioin/v1/audioin_pb2.py +34 -0
  142. viam/gen/component/audioin/v1/audioin_pb2.pyi +94 -0
  143. viam/gen/component/audioinput/v1/audioinput_grpc.py +25 -2
  144. viam/gen/component/audioinput/v1/audioinput_pb2.py +36 -31
  145. viam/gen/component/audioinput/v1/audioinput_pb2.pyi +22 -22
  146. viam/gen/component/audioout/__init__.py +0 -0
  147. viam/gen/component/audioout/v1/__init__.py +0 -0
  148. viam/gen/component/audioout/v1/audioout_grpc.py +54 -0
  149. viam/gen/component/audioout/v1/audioout_pb2.py +32 -0
  150. viam/gen/component/audioout/v1/audioout_pb2.pyi +47 -0
  151. viam/gen/component/base/v1/base_grpc.py +42 -2
  152. viam/gen/component/base/v1/base_pb2.py +58 -47
  153. viam/gen/component/base/v1/base_pb2.pyi +65 -30
  154. viam/gen/component/board/v1/board_grpc.py +59 -7
  155. viam/gen/component/board/v1/board_pb2.py +94 -73
  156. viam/gen/component/board/v1/board_pb2.pyi +165 -68
  157. viam/gen/component/button/__init__.py +0 -0
  158. viam/gen/component/button/v1/__init__.py +0 -0
  159. viam/gen/component/button/v1/button_grpc.py +38 -0
  160. viam/gen/component/button/v1/button_pb2.py +28 -0
  161. viam/gen/component/button/v1/button_pb2.pyi +39 -0
  162. viam/gen/component/camera/v1/camera_grpc.py +38 -2
  163. viam/gen/component/camera/v1/camera_pb2.py +60 -43
  164. viam/gen/component/camera/v1/camera_pb2.pyi +191 -37
  165. viam/gen/component/encoder/v1/encoder_grpc.py +25 -2
  166. viam/gen/component/encoder/v1/encoder_pb2.py +36 -31
  167. viam/gen/component/encoder/v1/encoder_pb2.pyi +15 -15
  168. viam/gen/component/gantry/v1/gantry_grpc.py +47 -2
  169. viam/gen/component/gantry/v1/gantry_pb2.py +56 -43
  170. viam/gen/component/gantry/v1/gantry_pb2.pyi +67 -31
  171. viam/gen/component/generic/v1/generic_grpc.py +16 -2
  172. viam/gen/component/generic/v1/generic_pb2.py +16 -11
  173. viam/gen/component/gripper/v1/gripper_grpc.py +44 -2
  174. viam/gen/component/gripper/v1/gripper_pb2.py +48 -35
  175. viam/gen/component/gripper/v1/gripper_pb2.pyi +62 -24
  176. viam/gen/component/inputcontroller/v1/input_controller_grpc.py +28 -2
  177. viam/gen/component/inputcontroller/v1/input_controller_pb2.py +46 -41
  178. viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +32 -36
  179. viam/gen/component/motor/v1/motor_grpc.py +51 -2
  180. viam/gen/component/motor/v1/motor_pb2.py +78 -67
  181. viam/gen/component/motor/v1/motor_pb2.pyi +75 -46
  182. viam/gen/component/movementsensor/v1/movementsensor_grpc.py +48 -2
  183. viam/gen/component/movementsensor/v1/movementsensor_pb2.py +70 -63
  184. viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +84 -57
  185. viam/gen/component/posetracker/v1/pose_tracker_grpc.py +19 -2
  186. viam/gen/component/posetracker/v1/pose_tracker_pb2.py +26 -21
  187. viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +9 -13
  188. viam/gen/component/powersensor/__init__.py +0 -0
  189. viam/gen/component/powersensor/v1/__init__.py +0 -0
  190. viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
  191. viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
  192. viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
  193. viam/gen/component/sensor/v1/sensor_grpc.py +21 -5
  194. viam/gen/component/sensor/v1/sensor_pb2.py +18 -22
  195. viam/gen/component/sensor/v1/sensor_pb2.pyi +1 -69
  196. viam/gen/component/servo/v1/servo_grpc.py +28 -2
  197. viam/gen/component/servo/v1/servo_pb2.py +42 -37
  198. viam/gen/component/servo/v1/servo_pb2.pyi +22 -26
  199. viam/gen/component/switch/__init__.py +0 -0
  200. viam/gen/component/switch/v1/__init__.py +0 -0
  201. viam/gen/component/switch/v1/switch_grpc.py +54 -0
  202. viam/gen/component/switch/v1/switch_pb2.py +40 -0
  203. viam/gen/component/switch/v1/switch_pb2.pyi +116 -0
  204. viam/gen/component/testecho/v1/testecho_grpc.py +15 -0
  205. viam/gen/component/testecho/v1/testecho_pb2.py +29 -26
  206. viam/gen/component/testecho/v1/testecho_pb2.pyi +16 -20
  207. viam/gen/module/v1/module_grpc.py +18 -0
  208. viam/gen/module/v1/module_pb2.py +36 -33
  209. viam/gen/module/v1/module_pb2.pyi +39 -34
  210. viam/gen/opentelemetry/__init__.py +0 -0
  211. viam/gen/opentelemetry/proto/__init__.py +0 -0
  212. viam/gen/opentelemetry/proto/common/__init__.py +0 -0
  213. viam/gen/opentelemetry/proto/common/v1/__init__.py +0 -0
  214. viam/gen/opentelemetry/proto/common/v1/common_grpc.py +0 -0
  215. viam/gen/opentelemetry/proto/common/v1/common_pb2.py +27 -0
  216. viam/gen/opentelemetry/proto/common/v1/common_pb2.pyi +208 -0
  217. viam/gen/opentelemetry/proto/resource/__init__.py +0 -0
  218. viam/gen/opentelemetry/proto/resource/v1/__init__.py +0 -0
  219. viam/gen/opentelemetry/proto/resource/v1/resource_grpc.py +0 -0
  220. viam/gen/opentelemetry/proto/resource/v1/resource_pb2.py +18 -0
  221. viam/gen/opentelemetry/proto/resource/v1/resource_pb2.pyi +59 -0
  222. viam/gen/opentelemetry/proto/trace/__init__.py +0 -0
  223. viam/gen/opentelemetry/proto/trace/v1/__init__.py +0 -0
  224. viam/gen/opentelemetry/proto/trace/v1/trace_grpc.py +0 -0
  225. viam/gen/opentelemetry/proto/trace/v1/trace_pb2.py +37 -0
  226. viam/gen/opentelemetry/proto/trace/v1/trace_pb2.pyi +402 -0
  227. viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +12 -0
  228. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +25 -22
  229. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +13 -17
  230. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +12 -0
  231. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +23 -20
  232. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +13 -17
  233. viam/gen/proto/rpc/v1/auth_grpc.py +11 -0
  234. viam/gen/proto/rpc/v1/auth_pb2.py +27 -24
  235. viam/gen/proto/rpc/v1/auth_pb2.pyi +12 -16
  236. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +35 -32
  237. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +37 -41
  238. viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +15 -0
  239. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +62 -57
  240. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +78 -69
  241. viam/gen/provisioning/__init__.py +0 -0
  242. viam/gen/provisioning/v1/__init__.py +0 -0
  243. viam/gen/provisioning/v1/provisioning_grpc.py +59 -0
  244. viam/gen/provisioning/v1/provisioning_pb2.py +45 -0
  245. viam/gen/provisioning/v1/provisioning_pb2.pyi +229 -0
  246. viam/gen/robot/v1/robot_grpc.py +144 -15
  247. viam/gen/robot/v1/robot_pb2.py +193 -119
  248. viam/gen/robot/v1/robot_pb2.pyi +565 -137
  249. viam/gen/service/datamanager/v1/data_manager_grpc.py +20 -2
  250. viam/gen/service/datamanager/v1/data_manager_pb2.py +27 -17
  251. viam/gen/service/datamanager/v1/data_manager_pb2.pyi +52 -10
  252. viam/gen/service/discovery/__init__.py +0 -0
  253. viam/gen/service/discovery/v1/__init__.py +0 -0
  254. viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
  255. viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
  256. viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
  257. viam/gen/service/generic/__init__.py +0 -0
  258. viam/gen/service/generic/v1/__init__.py +0 -0
  259. viam/gen/service/generic/v1/generic_grpc.py +29 -0
  260. viam/gen/service/generic/v1/generic_pb2.py +21 -0
  261. viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
  262. viam/gen/service/mlmodel/v1/mlmodel_grpc.py +9 -0
  263. viam/gen/service/mlmodel/v1/mlmodel_pb2.py +76 -29
  264. viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +307 -28
  265. viam/gen/service/motion/v1/motion_grpc.py +42 -4
  266. viam/gen/service/motion/v1/motion_pb2.py +119 -51
  267. viam/gen/service/motion/v1/motion_pb2.pyi +595 -120
  268. viam/gen/service/navigation/v1/navigation_grpc.py +49 -1
  269. viam/gen/service/navigation/v1/navigation_pb2.py +76 -51
  270. viam/gen/service/navigation/v1/navigation_pb2.pyi +188 -33
  271. viam/gen/service/sensors/v1/sensors_grpc.py +12 -0
  272. viam/gen/service/sensors/v1/sensors_pb2.py +60 -29
  273. viam/gen/service/sensors/v1/sensors_pb2.pyi +18 -21
  274. viam/gen/service/shell/v1/shell_grpc.py +27 -1
  275. viam/gen/service/shell/v1/shell_pb2.py +37 -15
  276. viam/gen/service/shell/v1/shell_pb2.pyi +260 -7
  277. viam/gen/service/slam/v1/slam_grpc.py +24 -2
  278. viam/gen/service/slam/v1/slam_pb2.py +44 -30
  279. viam/gen/service/slam/v1/slam_pb2.pyi +128 -27
  280. viam/gen/service/video/__init__.py +0 -0
  281. viam/gen/service/video/v1/__init__.py +0 -0
  282. viam/gen/service/video/v1/video_grpc.py +39 -0
  283. viam/gen/service/video/v1/video_pb2.py +29 -0
  284. viam/gen/service/video/v1/video_pb2.pyi +72 -0
  285. viam/gen/service/vision/v1/vision_grpc.py +39 -1
  286. viam/gen/service/vision/v1/vision_pb2.py +61 -45
  287. viam/gen/service/vision/v1/vision_pb2.pyi +180 -41
  288. viam/gen/service/worldstatestore/__init__.py +0 -0
  289. viam/gen/service/worldstatestore/v1/__init__.py +0 -0
  290. viam/gen/service/worldstatestore/v1/world_state_store_grpc.py +55 -0
  291. viam/gen/service/worldstatestore/v1/world_state_store_pb2.py +39 -0
  292. viam/gen/service/worldstatestore/v1/world_state_store_pb2.pyi +171 -0
  293. viam/gen/stream/__init__.py +0 -0
  294. viam/gen/stream/v1/__init__.py +0 -0
  295. viam/gen/stream/v1/stream_grpc.py +59 -0
  296. viam/gen/stream/v1/stream_pb2.py +39 -0
  297. viam/gen/stream/v1/stream_pb2.pyi +161 -0
  298. viam/gen/tagger/v1/tagger_pb2.py +9 -8
  299. viam/logging.py +160 -17
  300. viam/media/__init__.py +0 -9
  301. viam/media/audio.py +22 -10
  302. viam/media/utils/__init__.py +0 -0
  303. viam/media/utils/pil/__init__.py +55 -0
  304. viam/media/{viam_rgba_plugin.py → utils/pil/viam_rgba_plugin.py} +10 -16
  305. viam/media/viam_rgba.py +10 -0
  306. viam/media/video.py +197 -73
  307. viam/module/module.py +191 -44
  308. viam/module/resource_data_consumer.py +41 -0
  309. viam/module/service.py +9 -1
  310. viam/module/types.py +4 -5
  311. viam/operations.py +4 -3
  312. viam/proto/app/__init__.py +361 -5
  313. viam/proto/app/agent/__init__.py +28 -0
  314. viam/proto/app/billing.py +51 -27
  315. viam/proto/app/cloudslam/__init__.py +48 -0
  316. viam/proto/app/data/__init__.py +103 -17
  317. viam/proto/app/datapipelines/__init__.py +56 -0
  318. viam/proto/app/dataset/__init__.py +40 -0
  319. viam/proto/app/datasync/__init__.py +11 -5
  320. viam/proto/app/end_user.py +34 -0
  321. viam/proto/app/mlinference/__init__.py +15 -0
  322. viam/proto/app/mltraining/__init__.py +25 -1
  323. viam/proto/app/packages/__init__.py +3 -3
  324. viam/proto/app/robot.py +19 -1
  325. viam/proto/common/__init__.py +35 -8
  326. viam/proto/component/arm/__init__.py +9 -1
  327. viam/proto/component/audioin/__init__.py +16 -0
  328. viam/proto/component/audioinput/__init__.py +3 -1
  329. viam/proto/component/audioout/__init__.py +15 -0
  330. viam/proto/component/base/__init__.py +7 -1
  331. viam/proto/component/board/__init__.py +13 -5
  332. viam/proto/component/button/__init__.py +15 -0
  333. viam/proto/component/camera/__init__.py +9 -1
  334. viam/proto/component/encoder/__init__.py +3 -1
  335. viam/proto/component/gantry/__init__.py +7 -1
  336. viam/proto/component/generic/__init__.py +3 -1
  337. viam/proto/component/gripper/__init__.py +7 -1
  338. viam/proto/component/inputcontroller/__init__.py +7 -1
  339. viam/proto/component/motor/__init__.py +7 -1
  340. viam/proto/component/movementsensor/__init__.py +7 -1
  341. viam/proto/component/posetracker/__init__.py +7 -1
  342. viam/proto/component/powersensor/__init__.py +30 -0
  343. viam/proto/component/sensor/__init__.py +3 -4
  344. viam/proto/component/servo/__init__.py +3 -1
  345. viam/proto/component/switch/__init__.py +26 -0
  346. viam/proto/component/testecho/__init__.py +3 -1
  347. viam/proto/module/__init__.py +3 -1
  348. viam/proto/opentelemetry/__init__.py +0 -0
  349. viam/proto/opentelemetry/proto/__init__.py +0 -0
  350. viam/proto/opentelemetry/proto/common/__init__.py +15 -0
  351. viam/proto/opentelemetry/proto/resource/__init__.py +10 -0
  352. viam/proto/opentelemetry/proto/trace/__init__.py +15 -0
  353. viam/proto/provisioning/__init__.py +42 -0
  354. viam/proto/robot/__init__.py +57 -9
  355. viam/proto/rpc/auth.py +11 -1
  356. viam/proto/rpc/examples/echo/__init__.py +3 -1
  357. viam/proto/rpc/examples/echoresource/__init__.py +7 -1
  358. viam/proto/rpc/webrtc/grpc.py +3 -1
  359. viam/proto/rpc/webrtc/signaling.py +5 -1
  360. viam/proto/service/datamanager/__init__.py +15 -2
  361. viam/proto/service/discovery/__init__.py +15 -0
  362. viam/proto/service/generic/__init__.py +12 -0
  363. viam/proto/service/mlmodel/__init__.py +27 -1
  364. viam/proto/service/motion/__init__.py +35 -5
  365. viam/proto/service/navigation/__init__.py +19 -1
  366. viam/proto/service/sensors/__init__.py +3 -1
  367. viam/proto/service/shell/__init__.py +25 -2
  368. viam/proto/service/slam/__init__.py +13 -1
  369. viam/proto/service/video/__init__.py +15 -0
  370. viam/proto/service/vision/__init__.py +11 -1
  371. viam/proto/service/worldstatestore/__init__.py +32 -0
  372. viam/proto/stream/__init__.py +36 -0
  373. viam/py.typed +0 -0
  374. viam/resource/base.py +45 -8
  375. viam/resource/easy_resource.py +149 -0
  376. viam/resource/manager.py +35 -14
  377. viam/resource/registry.py +40 -52
  378. viam/resource/rpc_client_base.py +33 -1
  379. viam/resource/rpc_service_base.py +15 -8
  380. viam/resource/types.py +39 -26
  381. viam/robot/client.py +458 -91
  382. viam/robot/service.py +13 -107
  383. viam/rpc/dial.py +133 -15
  384. viam/rpc/libviam_rust_utils.so +0 -0
  385. viam/rpc/server.py +59 -15
  386. viam/rpc/types.py +2 -4
  387. viam/services/discovery/__init__.py +12 -0
  388. viam/services/discovery/client.py +55 -0
  389. viam/services/discovery/discovery.py +52 -0
  390. viam/services/discovery/service.py +43 -0
  391. viam/services/generic/__init__.py +18 -0
  392. viam/services/generic/client.py +58 -0
  393. viam/services/generic/generic.py +58 -0
  394. viam/services/generic/service.py +29 -0
  395. viam/services/mlmodel/__init__.py +15 -1
  396. viam/services/mlmodel/client.py +20 -15
  397. viam/services/mlmodel/mlmodel.py +44 -7
  398. viam/services/mlmodel/service.py +9 -13
  399. viam/services/mlmodel/utils.py +101 -0
  400. viam/services/motion/__init__.py +15 -3
  401. viam/services/motion/client.py +109 -150
  402. viam/services/motion/motion.py +380 -0
  403. viam/services/motion/service.py +132 -0
  404. viam/services/navigation/__init__.py +11 -0
  405. viam/services/navigation/client.py +99 -0
  406. viam/services/navigation/navigation.py +250 -0
  407. viam/services/navigation/service.py +137 -0
  408. viam/services/service_base.py +43 -4
  409. viam/services/service_client_base.py +4 -4
  410. viam/services/slam/__init__.py +4 -1
  411. viam/services/slam/client.py +21 -11
  412. viam/services/slam/service.py +16 -19
  413. viam/services/slam/slam.py +66 -5
  414. viam/services/vision/__init__.py +8 -0
  415. viam/services/vision/client.py +115 -111
  416. viam/services/vision/service.py +143 -0
  417. viam/services/vision/vision.py +317 -0
  418. viam/services/worldstatestore/__init__.py +18 -0
  419. viam/services/worldstatestore/client.py +94 -0
  420. viam/services/worldstatestore/service.py +55 -0
  421. viam/services/worldstatestore/worldstatestore.py +90 -0
  422. viam/sessions_client.py +254 -0
  423. viam/streams.py +44 -0
  424. viam/utils.py +143 -15
  425. viam/version_metadata.py +4 -0
  426. viam_sdk-0.66.0.dist-info/METADATA +157 -0
  427. viam_sdk-0.66.0.dist-info/RECORD +531 -0
  428. {viam_sdk-0.3.0.dist-info → viam_sdk-0.66.0.dist-info}/WHEEL +1 -1
  429. viam/components/audio_input/__init__.py +0 -18
  430. viam/components/audio_input/audio_input.py +0 -79
  431. viam/components/audio_input/client.py +0 -60
  432. viam/components/audio_input/service.py +0 -118
  433. viam/components/types.py +0 -5
  434. viam/gen/app/model/v1/model_grpc.py +0 -39
  435. viam/gen/app/model/v1/model_pb2.py +0 -71
  436. viam/gen/app/model/v1/model_pb2.pyi +0 -285
  437. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_grpc.py +0 -21
  438. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.py +0 -18
  439. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.pyi +0 -49
  440. viam/media/media.py +0 -53
  441. viam/proto/app/model/__init__.py +0 -40
  442. viam/proto/rpc/examples/fileupload/__init__.py +0 -13
  443. viam/services/sensors/__init__.py +0 -5
  444. viam/services/sensors/client.py +0 -63
  445. viam_sdk-0.3.0.dist-info/LICENSE +0 -202
  446. viam_sdk-0.3.0.dist-info/METADATA +0 -122
  447. viam_sdk-0.3.0.dist-info/RECORD +0 -372
  448. /viam/{gen/app/model → app}/__init__.py +0 -0
  449. /viam/gen/app/{model/v1 → agent}/__init__.py +0 -0
  450. /viam/gen/{proto/rpc/examples/fileupload → app/agent/v1}/__init__.py +0 -0
  451. /viam/gen/{proto/rpc/examples/fileupload/v1 → app/cloudslam}/__init__.py +0 -0
  452. /LICENSE → /viam_sdk-0.66.0.dist-info/licenses/LICENSE +0 -0
viam/resource/registry.py CHANGED
@@ -1,26 +1,20 @@
1
1
  from dataclasses import dataclass
2
2
  from threading import Lock
3
- from typing import TYPE_CHECKING, Any, Callable, ClassVar, Coroutine, Dict, Generic, Mapping, Type, TypeVar
3
+ from typing import TYPE_CHECKING, Callable, ClassVar, Dict, Generic, Mapping, Type, TypeVar
4
4
 
5
- from google.protobuf.struct_pb2 import Struct
6
5
  from grpclib.client import Channel
7
6
 
8
7
  from viam.errors import DuplicateResourceError, ResourceNotFoundError, ValidationError
9
- from viam.proto.robot import Status
10
8
 
11
9
  from .base import ResourceBase
12
10
 
13
11
  if TYPE_CHECKING:
14
12
  from .rpc_service_base import ResourceRPCServiceBase
15
- from .types import Model, ResourceCreator, Subtype, Validator
13
+ from .types import API, Model, ResourceCreator, Validator
16
14
 
17
15
  Resource = TypeVar("Resource", bound=ResourceBase)
18
16
 
19
17
 
20
- async def default_create_status(resource: ResourceBase) -> Status:
21
- return Status(name=resource.get_resource_name(resource.name), status=Struct())
22
-
23
-
24
18
  @dataclass
25
19
  class ResourceCreatorRegistration:
26
20
  """An object representing a resource creator to be registered.
@@ -33,7 +27,7 @@ class ResourceCreatorRegistration:
33
27
  """A function that can create a resource given a mapping of dependencies (``ResourceName`` to ``ResourceBase``
34
28
  """
35
29
 
36
- validator: "Validator" = lambda x: []
30
+ validator: "Validator" = lambda x: ([], [])
37
31
  """A function that can validate a resource and return implicit dependencies.
38
32
 
39
33
  If called without a validator function, default to a function returning an empty Sequence
@@ -63,12 +57,6 @@ class ResourceRegistration(Generic[Resource]):
63
57
  """A function that will create the RPC client for this resource
64
58
  """
65
59
 
66
- create_status: Callable[[Resource], Coroutine[Any, Any, Status]] = default_create_status
67
- """A function to create a Status object for this resource.
68
-
69
- If the resource does not provide a custom status type, the default implementation can be used.
70
- """
71
-
72
60
 
73
61
  class Registry:
74
62
  """The global registry of robotic parts.
@@ -76,50 +64,50 @@ class Registry:
76
64
  **NB** The Registry should almost never be used directly
77
65
 
78
66
  The Registry keeps track of the types of Resources that are available on robots using this SDK. All the base resource types are
79
- pre-registered (e.g. Arm, Motor).
67
+ pre-registered (for example Arm, Motor).
80
68
 
81
69
  If you create a new resource type that is not an extension of any of the existing base resource types, then you must register said
82
70
  resource using ``Registry.register(...)``.
83
71
  """
84
72
 
85
- _SUBTYPES: ClassVar[Dict["Subtype", ResourceRegistration]] = {}
73
+ _APIS: ClassVar[Dict["API", ResourceRegistration]] = {}
86
74
  _RESOURCES: ClassVar[Dict[str, ResourceCreatorRegistration]] = {}
87
75
  _lock: ClassVar[Lock] = Lock()
88
76
 
89
77
  @classmethod
90
- def register_subtype(cls, registration: ResourceRegistration[Resource]):
91
- """Register a Subtype with the Registry
78
+ def register_api(cls, registration: ResourceRegistration[Resource]):
79
+ """Register a API with the Registry
92
80
 
93
81
  Args:
94
- registration (ResourceRegistration): Object containing registration data for the subtype
82
+ registration (ResourceRegistration): Object containing registration data for the API
95
83
 
96
84
  Raises:
97
- DuplicateResourceError: Raised if the Subtype to register is already in the registry
85
+ DuplicateResourceError: Raised if the API to register is already in the registry
98
86
  ValidationError: Raised if registration is missing any necessary parameters
99
87
  """
100
88
  with cls._lock:
101
- if registration.resource_type.SUBTYPE in cls._SUBTYPES:
102
- raise DuplicateResourceError(str(registration.resource_type.SUBTYPE))
89
+ if registration.resource_type.API in cls._APIS:
90
+ raise DuplicateResourceError(str(registration.resource_type.API))
103
91
 
104
92
  if registration.resource_type and registration.rpc_service and registration.create_rpc_client:
105
- cls._SUBTYPES[registration.resource_type.SUBTYPE] = registration
93
+ cls._APIS[registration.resource_type.API] = registration
106
94
  else:
107
95
  raise ValidationError("Passed resource registration does not have correct parameters")
108
96
 
109
97
  @classmethod
110
- def register_resource_creator(cls, subtype: "Subtype", model: "Model", registration: ResourceCreatorRegistration):
111
- """Register a specific ``Model`` and validator function for the specific resource ``Subtype`` with the Registry
98
+ def register_resource_creator(cls, api: "API", model: "Model", registration: ResourceCreatorRegistration):
99
+ """Register a specific ``Model`` and validator function for the specific resource ``API`` with the Registry
112
100
 
113
101
  Args:
114
- subtype (Subtype): The Subtype of the resource
102
+ api (API): The API of the resource
115
103
  model (Model): The Model of the resource
116
104
  registration (ResourceCreatorRegistration): The registration functions of the model
117
105
 
118
106
  Raises:
119
- DuplicateResourceError: Raised if the Subtype and Model pairing is already registered
107
+ DuplicateResourceError: Raised if the API and Model pairing is already registered
120
108
  ValidationError: Raised if registration does not have creator
121
109
  """
122
- key = f"{subtype}/{model}"
110
+ key = f"{api}/{model}"
123
111
  with cls._lock:
124
112
  if key in cls._RESOURCES:
125
113
  raise DuplicateResourceError(key)
@@ -130,78 +118,78 @@ class Registry:
130
118
  raise ValidationError("A creator function was not provided")
131
119
 
132
120
  @classmethod
133
- def lookup_subtype(cls, subtype: "Subtype") -> ResourceRegistration:
134
- """Lookup and retrieve a registered Subtype by its name
121
+ def lookup_api(cls, api: "API") -> ResourceRegistration:
122
+ """Lookup and retrieve a registered API by its name
135
123
 
136
124
  Args:
137
- subtype (str): The subtype of the resource
125
+ api (str): The API of the resource
138
126
 
139
127
  Raises:
140
- ResourceNotFoundError: Raised if the Subtype is not registered
128
+ ResourceNotFoundError: Raised if the API is not registered
141
129
 
142
130
  Returns:
143
131
  ResourceRegistration: The registration object of the resource
144
132
  """
145
133
  with cls._lock:
146
134
  try:
147
- return cls._SUBTYPES[subtype]
135
+ return cls._APIS[api]
148
136
  except KeyError:
149
- raise ResourceNotFoundError(subtype.resource_type, subtype.resource_subtype)
137
+ raise ResourceNotFoundError(api.resource_type, api.resource_subtype)
150
138
 
151
139
  @classmethod
152
- def lookup_resource_creator(cls, subtype: "Subtype", model: "Model") -> "ResourceCreator":
153
- """Lookup and retrieve a registered resource creator by its subtype and model
140
+ def lookup_resource_creator(cls, api: "API", model: "Model") -> "ResourceCreator":
141
+ """Lookup and retrieve a registered resource creator by its API and model
154
142
 
155
143
  Args:
156
- subtype (Subtype): The Subtype of the resource
144
+ api (API): The API of the resource
157
145
  model (Model): The Model of the resource
158
146
 
159
147
  Raises:
160
- ResourceNotFoundError: Raised if the Subtype Model pairing is not registered
148
+ ResourceNotFoundError: Raised if the API Model pairing is not registered
161
149
 
162
150
  Returns:
163
151
  ResourceCreator: The function to create the resource
164
152
  """
165
153
  with cls._lock:
166
154
  try:
167
- return cls._RESOURCES[f"{subtype}/{model}"].creator
155
+ return cls._RESOURCES[f"{api}/{model}"].creator
168
156
  except KeyError:
169
- raise ResourceNotFoundError(subtype.resource_type, subtype.resource_subtype)
157
+ raise ResourceNotFoundError(api.resource_type, api.resource_subtype)
170
158
 
171
159
  @classmethod
172
- def lookup_validator(cls, subtype: "Subtype", model: "Model") -> "Validator":
173
- """Lookup and retrieve a registered validator function by its subtype and model. If there is none, return None
160
+ def lookup_validator(cls, api: "API", model: "Model") -> "Validator":
161
+ """Lookup and retrieve a registered validator function by its API and model. If there is none, return None
174
162
 
175
163
  Args:
176
- subtype (Subtype): The Subtype of the resource
164
+ api (API): The API of the resource
177
165
  model (Model): The Model of the resource
178
166
 
179
167
  Returns:
180
168
  Validator: The function to validate the resource
181
169
  """
182
170
  try:
183
- return cls._RESOURCES[f"{subtype}/{model}"].validator
171
+ return cls._RESOURCES[f"{api}/{model}"].validator
184
172
  except AttributeError:
185
- return lambda x: []
173
+ return lambda x: ([], [])
186
174
  except KeyError:
187
- raise ResourceNotFoundError(subtype.resource_type, subtype.resource_subtype)
175
+ raise ResourceNotFoundError(api.resource_type, api.resource_subtype)
188
176
 
189
177
  @classmethod
190
- def REGISTERED_SUBTYPES(cls) -> Mapping["Subtype", ResourceRegistration]:
178
+ def REGISTERED_APIS(cls) -> Mapping["API", ResourceRegistration]:
191
179
  """The dictionary of all registered resources
192
- - Key: Subtype of the resource
180
+ - Key: API of the resource
193
181
  - Value: The registration object for the resource
194
182
 
195
183
  Returns:
196
- Mapping[Subtype, ResourceRegistration]: All registered resources
184
+ Mapping[API, ResourceRegistration]: All registered resources
197
185
  """
198
186
  with cls._lock:
199
- return cls._SUBTYPES.copy()
187
+ return cls._APIS.copy()
200
188
 
201
189
  @classmethod
202
190
  def REGISTERED_RESOURCE_CREATORS(cls) -> Mapping[str, "ResourceCreatorRegistration"]:
203
191
  """The dictionary of all registered resources
204
- - Key: subtype/model
192
+ - Key: API/model
205
193
  - Value: The ResourceCreatorRegistration for the resource
206
194
 
207
195
  Returns:
@@ -1,4 +1,6 @@
1
- from typing import Any, Protocol, runtime_checkable
1
+ from random import choice
2
+ from string import ascii_lowercase
3
+ from typing import Any, Dict, Protocol, runtime_checkable
2
4
 
3
5
  from grpclib.client import Channel
4
6
 
@@ -12,6 +14,36 @@ class ResourceRPCClientBase(Protocol):
12
14
  Resource RPC clients must inherit from this class
13
15
  """
14
16
 
17
+ class Metadata:
18
+ metadata: Dict[str, str] = {}
19
+
20
+ def enable_debug_logging(self, key: str = ""):
21
+ """Enables server-side debug logging for resource methods.
22
+
23
+ Args:
24
+ key (str): The key to associate debug logs with. If not provided, will default to a randomly generated string value.
25
+ """
26
+ if key == "":
27
+ key = "".join(choice(ascii_lowercase) for i in range(6))
28
+ self.metadata["dtname"] = key
29
+
30
+ def disable_debug_logging(self):
31
+ """Disables server-side debug logging for resource methods."""
32
+ del self.metadata["dtname"]
33
+
34
+ def add_metadata(self, key: str, value: str):
35
+ """Adds a key-value pair to the metadata"""
36
+ self.metadata[key] = value
37
+
38
+ def delete_metadata(self, key: str):
39
+ """Removes a key-value pair from the metadata by key"""
40
+ del self.metadata[key]
41
+
42
+ @property
43
+ def proto(self):
44
+ """Returns metadata in a gRPC-appropriate form"""
45
+ return [(k, v) for k, v in self.metadata.items()]
46
+
15
47
  channel: Channel
16
48
  client: Any
17
49
 
@@ -1,13 +1,17 @@
1
1
  import abc
2
- from typing import Generic, Type
2
+ from typing import TYPE_CHECKING, Generic, Type
3
3
 
4
4
  from viam.components.component_base import ComponentBase
5
- from viam.resource.manager import ResourceManager, ResourceType
5
+ from viam.errors import ResourceNotFoundError
6
+ from viam.resource.manager import ResourceType
6
7
  from viam.rpc.types import RPCServiceBase
7
8
  from viam.services.service_base import ServiceBase
8
9
 
9
10
  from .base import ResourceBase
10
11
 
12
+ if TYPE_CHECKING:
13
+ from viam.resource.manager import ResourceManager
14
+
11
15
 
12
16
  class ResourceRPCServiceBase(abc.ABC, RPCServiceBase, Generic[ResourceType]):
13
17
  """
@@ -16,9 +20,9 @@ class ResourceRPCServiceBase(abc.ABC, RPCServiceBase, Generic[ResourceType]):
16
20
  """
17
21
 
18
22
  RESOURCE_TYPE = Type
19
- manager: ResourceManager
23
+ manager: "ResourceManager"
20
24
 
21
- def __init__(self, manager: ResourceManager):
25
+ def __init__(self, manager: "ResourceManager"):
22
26
  self.manager = manager
23
27
 
24
28
  def get_resource(self, name: str) -> ResourceType:
@@ -31,11 +35,14 @@ class ResourceRPCServiceBase(abc.ABC, RPCServiceBase, Generic[ResourceType]):
31
35
  name (str): Name of the resource
32
36
 
33
37
  Raises:
34
- ResourceNotFoundError
38
+ GRPCError with the status code Status.NOT_FOUND
35
39
 
36
40
  Returns:
37
41
  ResourceType: The resource
38
42
  """
39
- if self.RESOURCE_TYPE == ComponentBase or self.RESOURCE_TYPE == ResourceBase or self.RESOURCE_TYPE == ServiceBase:
40
- return self.manager._resource_by_name_only(name) # type: ignore
41
- return self.manager.get_resource(self.RESOURCE_TYPE, self.RESOURCE_TYPE.get_resource_name(name)) # type: ignore
43
+ try:
44
+ if self.RESOURCE_TYPE == ComponentBase or self.RESOURCE_TYPE == ResourceBase or self.RESOURCE_TYPE == ServiceBase:
45
+ return self.manager._resource_by_name_only(name) # type: ignore
46
+ return self.manager.get_resource(self.RESOURCE_TYPE, self.RESOURCE_TYPE.get_resource_name(name)) # type: ignore
47
+ except ResourceNotFoundError as e:
48
+ raise e.grpc_error
viam/resource/types.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import re
2
2
  import sys
3
- from typing import TYPE_CHECKING, Callable, ClassVar, Mapping, Sequence
3
+ from typing import TYPE_CHECKING, Callable, ClassVar, Mapping, Optional, Protocol, Sequence, Tuple, runtime_checkable
4
4
 
5
5
  if sys.version_info >= (3, 10):
6
6
  from typing import TypeAlias
@@ -10,7 +10,7 @@ else:
10
10
  from typing_extensions import Self
11
11
 
12
12
  from viam.proto.app.robot import ComponentConfig
13
- from viam.proto.common import ResourceName
13
+ from viam.proto.common import GetGeometriesRequest, GetGeometriesResponse, ResourceName
14
14
 
15
15
  if TYPE_CHECKING:
16
16
  from .base import ResourceBase
@@ -20,64 +20,66 @@ RESOURCE_TYPE_COMPONENT = "component"
20
20
  RESOURCE_TYPE_SERVICE = "service"
21
21
 
22
22
 
23
- class Subtype:
23
+ class API:
24
24
  """Represents a known component/service (resource) API"""
25
25
 
26
26
  namespace: str
27
27
  """The namespace of the resource"""
28
28
 
29
29
  resource_type: str
30
- """The type of the resource, e.g. `component` or `service`"""
30
+ """The type of the resource, for example `component` or `service`"""
31
31
 
32
32
  resource_subtype: str
33
- """The subtype of the resource e.g. `servo`, `arm`, `vision`"""
33
+ """The subtype of the resource for example `servo`, `arm`, `vision`"""
34
34
 
35
35
  def __init__(self, namespace: str, resource_type: str, resource_subtype: str):
36
- self.namespace = namespace.lower()
37
- self.resource_type = resource_type.lower()
38
- self.resource_subtype = resource_subtype.lower()
36
+ self.namespace = namespace
37
+ self.resource_type = resource_type
38
+ self.resource_subtype = resource_subtype
39
39
 
40
40
  def __str__(self) -> str:
41
41
  return f"{self.namespace}:{self.resource_type}:{self.resource_subtype}"
42
42
 
43
43
  def __repr__(self) -> str:
44
- return f"<viam.resource.types.Subtype {str(self)} at {hex(id(self))}>"
44
+ return f"<viam.resource.types.API {str(self)} at {hex(id(self))}>"
45
45
 
46
46
  def __hash__(self) -> int:
47
47
  return hash(str(self))
48
48
 
49
- def __eq__(self, other: "Subtype") -> bool:
50
- return str(self) == str(other)
49
+ def __eq__(self, other: object) -> bool:
50
+ if isinstance(other, API):
51
+ return str(self) == str(other)
52
+ return False
51
53
 
52
54
  @classmethod
53
55
  def from_resource_name(cls, resource_name: ResourceName) -> Self:
54
- """Convert a ```ResourceName``` into a ```Subtype```
56
+ """Convert a ```ResourceName``` into a ```API```
55
57
 
56
58
  Args:
57
59
  resource_name (viam.proto.common.ResourceName): The ResourceName to convert
58
60
 
59
61
  Returns:
60
- Self: A new Subtype
62
+ Self: A new API
61
63
  """
62
64
  return cls(resource_name.namespace, resource_name.type, resource_name.subtype)
63
65
 
64
66
  @classmethod
65
67
  def from_string(cls, string: str) -> Self:
66
- """Create a ```Subtype``` from its string representation (namespace:resource_type:resource_subtype)
68
+ """Create a ```API``` from its string representation (namespace:resource_type:resource_subtype)
67
69
 
68
70
  Args:
69
- string (str): The Subtype as a string
71
+ string (str): The API as a string
70
72
 
71
73
  Raises:
72
- ValueError: Raised if the string does not represent a valid Subtype
74
+ ValueError: Raised if the string does not represent a valid API
73
75
 
74
76
  Returns:
75
- Self: A new Subtype
77
+ Self: A new API
76
78
  """
77
79
  regex = re.compile(r"^([\w-]+):([\w-]+):([\w-]+)$")
78
80
  match = regex.match(string)
79
81
  if not match:
80
- raise ValueError(f"{string} is not a valid Subtype")
82
+ raise ValueError(f"{string} is not a valid API")
81
83
  return cls(match.group(1), match.group(2), match.group(3))
82
84
 
83
85
 
@@ -95,8 +97,8 @@ class ModelFamily:
95
97
  DEFAULT: ClassVar["ModelFamily"]
96
98
 
97
99
  def __init__(self, namespace: str, family: str):
98
- self.namespace = namespace.lower()
99
- self.family = family.lower()
100
+ self.namespace = namespace
101
+ self.family = family
100
102
 
101
103
  def __str__(self) -> str:
102
104
  return f"{self.namespace}:{self.family}"
@@ -107,8 +109,10 @@ class ModelFamily:
107
109
  def __hash__(self) -> int:
108
110
  return hash(str(self))
109
111
 
110
- def __eq__(self, other: "ModelFamily") -> bool:
111
- return str(self) == str(other)
112
+ def __eq__(self, other: object) -> bool:
113
+ if isinstance(other, ModelFamily):
114
+ return str(self) == str(other)
115
+ return False
112
116
 
113
117
 
114
118
  ModelFamily.DEFAULT = ModelFamily(RESOURCE_NAMESPACE_RDK, ModelFamily.DEFAULT_FAMILY_NAME)
@@ -125,7 +129,7 @@ class Model:
125
129
 
126
130
  def __init__(self, model_family: ModelFamily, name: str):
127
131
  self.model_family = model_family
128
- self.name = name.lower()
132
+ self.name = name
129
133
 
130
134
  def __str__(self) -> str:
131
135
  return f"{self.model_family}:{self.name}"
@@ -136,8 +140,10 @@ class Model:
136
140
  def __hash__(self) -> int:
137
141
  return hash(str(self))
138
142
 
139
- def __eq__(self, other: "Model") -> bool:
140
- return str(self) == str(other)
143
+ def __eq__(self, other: object) -> bool:
144
+ if isinstance(other, Model):
145
+ return str(self) == str(other)
146
+ return False
141
147
 
142
148
  @classmethod
143
149
  def from_string(cls, model: str, *, ignore_errors=False) -> Self:
@@ -197,4 +203,11 @@ def resource_name_from_string(string: str) -> ResourceName:
197
203
 
198
204
 
199
205
  ResourceCreator: TypeAlias = Callable[[ComponentConfig, Mapping[ResourceName, "ResourceBase"]], "ResourceBase"]
200
- Validator: TypeAlias = Callable[[ComponentConfig], Sequence[str]]
206
+ Validator: TypeAlias = Callable[[ComponentConfig], Tuple[Sequence[str], Sequence[str]]]
207
+
208
+
209
+ @runtime_checkable
210
+ class SupportsGetGeometries(Protocol):
211
+ """The SupportsGetGeometries protocol defines the requirements for a resource to call get_geometries."""
212
+
213
+ async def GetGeometries(self, request: GetGeometriesRequest, *, timeout: Optional[float] = None, **kwargs) -> GetGeometriesResponse: ...