hatchet-sdk 0.47.1__py3-none-any.whl → 1.0.0a1__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.

Potentially problematic release.


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

Files changed (329) hide show
  1. hatchet_sdk/__init__.py +45 -25
  2. hatchet_sdk/client.py +19 -94
  3. hatchet_sdk/clients/admin.py +309 -389
  4. hatchet_sdk/clients/dispatcher/action_listener.py +131 -109
  5. hatchet_sdk/clients/dispatcher/dispatcher.py +39 -37
  6. hatchet_sdk/clients/durable_event_listener.py +327 -0
  7. hatchet_sdk/clients/event_ts.py +23 -10
  8. hatchet_sdk/clients/events.py +96 -99
  9. hatchet_sdk/clients/rest/__init__.py +35 -0
  10. hatchet_sdk/clients/rest/api/__init__.py +2 -0
  11. hatchet_sdk/clients/rest/api/log_api.py +258 -0
  12. hatchet_sdk/clients/rest/api/task_api.py +2200 -0
  13. hatchet_sdk/clients/rest/api/workflow_runs_api.py +1274 -116
  14. hatchet_sdk/clients/rest/api_client.py +1 -1
  15. hatchet_sdk/clients/rest/configuration.py +8 -1
  16. hatchet_sdk/clients/rest/exceptions.py +21 -0
  17. hatchet_sdk/clients/rest/models/__init__.py +33 -0
  18. hatchet_sdk/clients/rest/models/tenant.py +4 -0
  19. hatchet_sdk/clients/rest/models/tenant_version.py +37 -0
  20. hatchet_sdk/clients/rest/models/update_tenant_request.py +7 -0
  21. hatchet_sdk/clients/rest/models/v1_cancel_task_request.py +104 -0
  22. hatchet_sdk/clients/rest/models/v1_dag_children.py +102 -0
  23. hatchet_sdk/clients/rest/models/v1_log_line.py +94 -0
  24. hatchet_sdk/clients/rest/models/v1_log_line_level.py +39 -0
  25. hatchet_sdk/clients/rest/models/v1_log_line_list.py +110 -0
  26. hatchet_sdk/clients/rest/models/v1_replay_task_request.py +104 -0
  27. hatchet_sdk/clients/rest/models/v1_task.py +174 -0
  28. hatchet_sdk/clients/rest/models/v1_task_event.py +118 -0
  29. hatchet_sdk/clients/rest/models/v1_task_event_list.py +110 -0
  30. hatchet_sdk/clients/rest/models/v1_task_event_type.py +55 -0
  31. hatchet_sdk/clients/rest/models/v1_task_filter.py +106 -0
  32. hatchet_sdk/clients/rest/models/v1_task_point_metric.py +92 -0
  33. hatchet_sdk/clients/rest/models/v1_task_point_metrics.py +100 -0
  34. hatchet_sdk/clients/rest/models/v1_task_run_metric.py +88 -0
  35. hatchet_sdk/clients/rest/models/v1_task_run_status.py +40 -0
  36. hatchet_sdk/clients/rest/models/v1_task_status.py +40 -0
  37. hatchet_sdk/clients/rest/models/v1_task_summary.py +228 -0
  38. hatchet_sdk/clients/rest/models/v1_task_summary_list.py +110 -0
  39. hatchet_sdk/clients/rest/models/v1_trigger_workflow_run_request.py +95 -0
  40. hatchet_sdk/clients/rest/models/v1_workflow_run.py +171 -0
  41. hatchet_sdk/clients/rest/models/v1_workflow_run_details.py +145 -0
  42. hatchet_sdk/clients/rest/models/v1_workflow_run_display_name.py +98 -0
  43. hatchet_sdk/clients/rest/models/v1_workflow_run_display_name_list.py +114 -0
  44. hatchet_sdk/clients/rest/models/v1_workflow_type.py +37 -0
  45. hatchet_sdk/clients/rest/models/workflow_run_shape_item_for_workflow_run_details.py +104 -0
  46. hatchet_sdk/clients/rest/rest.py +37 -26
  47. hatchet_sdk/clients/rest/tenacity_utils.py +1 -1
  48. hatchet_sdk/clients/rest_client.py +153 -116
  49. hatchet_sdk/clients/run_event_listener.py +65 -60
  50. hatchet_sdk/clients/workflow_listener.py +75 -66
  51. hatchet_sdk/config.py +117 -0
  52. hatchet_sdk/connection.py +27 -13
  53. hatchet_sdk/context/__init__.py +0 -1
  54. hatchet_sdk/context/context.py +118 -280
  55. hatchet_sdk/contracts/dispatcher_pb2_grpc.py +1 -1
  56. hatchet_sdk/contracts/events_pb2.py +2 -2
  57. hatchet_sdk/contracts/events_pb2_grpc.py +1 -1
  58. hatchet_sdk/contracts/v1/dispatcher_pb2.py +36 -0
  59. hatchet_sdk/contracts/v1/dispatcher_pb2.pyi +38 -0
  60. hatchet_sdk/contracts/v1/dispatcher_pb2_grpc.py +145 -0
  61. hatchet_sdk/contracts/v1/shared/condition_pb2.py +39 -0
  62. hatchet_sdk/contracts/v1/shared/condition_pb2.pyi +72 -0
  63. hatchet_sdk/contracts/v1/shared/condition_pb2_grpc.py +29 -0
  64. hatchet_sdk/contracts/v1/workflows_pb2.py +67 -0
  65. hatchet_sdk/contracts/v1/workflows_pb2.pyi +228 -0
  66. hatchet_sdk/contracts/v1/workflows_pb2_grpc.py +234 -0
  67. hatchet_sdk/contracts/workflows_pb2_grpc.py +1 -1
  68. hatchet_sdk/features/cron.py +43 -57
  69. hatchet_sdk/features/scheduled.py +60 -74
  70. hatchet_sdk/hatchet.py +491 -218
  71. hatchet_sdk/labels.py +4 -6
  72. hatchet_sdk/metadata.py +1 -1
  73. hatchet_sdk/opentelemetry/instrumentor.py +17 -18
  74. hatchet_sdk/rate_limit.py +40 -55
  75. hatchet_sdk/runnables/contextvars.py +12 -0
  76. hatchet_sdk/runnables/standalone.py +194 -0
  77. hatchet_sdk/runnables/task.py +144 -0
  78. hatchet_sdk/runnables/types.py +138 -0
  79. hatchet_sdk/runnables/workflow.py +764 -0
  80. hatchet_sdk/token.py +13 -9
  81. hatchet_sdk/utils/aio_utils.py +0 -119
  82. hatchet_sdk/utils/proto_enums.py +47 -0
  83. hatchet_sdk/utils/timedelta_to_expression.py +23 -0
  84. hatchet_sdk/utils/typing.py +10 -2
  85. hatchet_sdk/v0/__init__.py +251 -0
  86. hatchet_sdk/v0/client.py +119 -0
  87. hatchet_sdk/v0/clients/admin.py +541 -0
  88. hatchet_sdk/v0/clients/dispatcher/action_listener.py +422 -0
  89. hatchet_sdk/v0/clients/dispatcher/dispatcher.py +204 -0
  90. hatchet_sdk/v0/clients/event_ts.py +28 -0
  91. hatchet_sdk/v0/clients/events.py +182 -0
  92. hatchet_sdk/v0/clients/rest/__init__.py +307 -0
  93. hatchet_sdk/v0/clients/rest/api/__init__.py +19 -0
  94. hatchet_sdk/v0/clients/rest/api/api_token_api.py +858 -0
  95. hatchet_sdk/v0/clients/rest/api/default_api.py +2259 -0
  96. hatchet_sdk/v0/clients/rest/api/event_api.py +2548 -0
  97. hatchet_sdk/v0/clients/rest/api/github_api.py +331 -0
  98. hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +483 -0
  99. hatchet_sdk/v0/clients/rest/api/log_api.py +449 -0
  100. hatchet_sdk/v0/clients/rest/api/metadata_api.py +728 -0
  101. hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +423 -0
  102. hatchet_sdk/v0/clients/rest/api/slack_api.py +577 -0
  103. hatchet_sdk/v0/clients/rest/api/sns_api.py +872 -0
  104. hatchet_sdk/v0/clients/rest/api/step_run_api.py +2202 -0
  105. hatchet_sdk/v0/clients/rest/api/tenant_api.py +4430 -0
  106. hatchet_sdk/v0/clients/rest/api/user_api.py +2888 -0
  107. hatchet_sdk/v0/clients/rest/api/worker_api.py +858 -0
  108. hatchet_sdk/v0/clients/rest/api/workflow_api.py +6312 -0
  109. hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +1932 -0
  110. hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +610 -0
  111. hatchet_sdk/v0/clients/rest/api_client.py +759 -0
  112. hatchet_sdk/v0/clients/rest/api_response.py +22 -0
  113. hatchet_sdk/v0/clients/rest/configuration.py +611 -0
  114. hatchet_sdk/v0/clients/rest/exceptions.py +200 -0
  115. hatchet_sdk/v0/clients/rest/models/__init__.py +274 -0
  116. hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +83 -0
  117. hatchet_sdk/v0/clients/rest/models/api_error.py +102 -0
  118. hatchet_sdk/v0/clients/rest/models/api_errors.py +100 -0
  119. hatchet_sdk/v0/clients/rest/models/api_meta.py +144 -0
  120. hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +85 -0
  121. hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +88 -0
  122. hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +90 -0
  123. hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +98 -0
  124. hatchet_sdk/v0/clients/rest/models/api_token.py +105 -0
  125. hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +100 -0
  126. hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +110 -0
  127. hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +85 -0
  128. hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +83 -0
  129. hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +39 -0
  130. hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +92 -0
  131. hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +83 -0
  132. hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +98 -0
  133. hatchet_sdk/v0/clients/rest/models/create_event_request.py +95 -0
  134. hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +83 -0
  135. hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +85 -0
  136. hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +83 -0
  137. hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +86 -0
  138. hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +84 -0
  139. hatchet_sdk/v0/clients/rest/models/cron_workflows.py +131 -0
  140. hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +110 -0
  141. hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +37 -0
  142. hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +37 -0
  143. hatchet_sdk/v0/clients/rest/models/event.py +143 -0
  144. hatchet_sdk/v0/clients/rest/models/event_data.py +83 -0
  145. hatchet_sdk/v0/clients/rest/models/event_key_list.py +98 -0
  146. hatchet_sdk/v0/clients/rest/models/event_list.py +110 -0
  147. hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +37 -0
  148. hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +36 -0
  149. hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +85 -0
  150. hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +116 -0
  151. hatchet_sdk/v0/clients/rest/models/events.py +110 -0
  152. hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +100 -0
  153. hatchet_sdk/v0/clients/rest/models/github_app_installation.py +107 -0
  154. hatchet_sdk/v0/clients/rest/models/github_branch.py +86 -0
  155. hatchet_sdk/v0/clients/rest/models/github_repo.py +86 -0
  156. hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +83 -0
  157. hatchet_sdk/v0/clients/rest/models/job.py +132 -0
  158. hatchet_sdk/v0/clients/rest/models/job_run.py +176 -0
  159. hatchet_sdk/v0/clients/rest/models/job_run_status.py +41 -0
  160. hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +106 -0
  161. hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +110 -0
  162. hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +112 -0
  163. hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +100 -0
  164. hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +110 -0
  165. hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +110 -0
  166. hatchet_sdk/v0/clients/rest/models/log_line.py +94 -0
  167. hatchet_sdk/v0/clients/rest/models/log_line_level.py +39 -0
  168. hatchet_sdk/v0/clients/rest/models/log_line_list.py +110 -0
  169. hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +37 -0
  170. hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +36 -0
  171. hatchet_sdk/v0/clients/rest/models/pagination_response.py +95 -0
  172. hatchet_sdk/v0/clients/rest/models/pull_request.py +112 -0
  173. hatchet_sdk/v0/clients/rest/models/pull_request_state.py +37 -0
  174. hatchet_sdk/v0/clients/rest/models/queue_metrics.py +97 -0
  175. hatchet_sdk/v0/clients/rest/models/rate_limit.py +117 -0
  176. hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +110 -0
  177. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +37 -0
  178. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +38 -0
  179. hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +118 -0
  180. hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +83 -0
  181. hatchet_sdk/v0/clients/rest/models/replay_event_request.py +85 -0
  182. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +85 -0
  183. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +100 -0
  184. hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +83 -0
  185. hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +92 -0
  186. hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +42 -0
  187. hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +149 -0
  188. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +110 -0
  189. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +37 -0
  190. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +37 -0
  191. hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +113 -0
  192. hatchet_sdk/v0/clients/rest/models/slack_webhook.py +127 -0
  193. hatchet_sdk/v0/clients/rest/models/sns_integration.py +114 -0
  194. hatchet_sdk/v0/clients/rest/models/step.py +123 -0
  195. hatchet_sdk/v0/clients/rest/models/step_run.py +202 -0
  196. hatchet_sdk/v0/clients/rest/models/step_run_archive.py +142 -0
  197. hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +110 -0
  198. hatchet_sdk/v0/clients/rest/models/step_run_diff.py +91 -0
  199. hatchet_sdk/v0/clients/rest/models/step_run_event.py +122 -0
  200. hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +110 -0
  201. hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +52 -0
  202. hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +38 -0
  203. hatchet_sdk/v0/clients/rest/models/step_run_status.py +44 -0
  204. hatchet_sdk/v0/clients/rest/models/tenant.py +118 -0
  205. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +98 -0
  206. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +112 -0
  207. hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +143 -0
  208. hatchet_sdk/v0/clients/rest/models/tenant_invite.py +120 -0
  209. hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +110 -0
  210. hatchet_sdk/v0/clients/rest/models/tenant_list.py +110 -0
  211. hatchet_sdk/v0/clients/rest/models/tenant_member.py +123 -0
  212. hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +110 -0
  213. hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +38 -0
  214. hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +116 -0
  215. hatchet_sdk/v0/clients/rest/models/tenant_resource.py +40 -0
  216. hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +135 -0
  217. hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +102 -0
  218. hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +83 -0
  219. hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +91 -0
  220. hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +83 -0
  221. hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +85 -0
  222. hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +137 -0
  223. hatchet_sdk/v0/clients/rest/models/update_worker_request.py +87 -0
  224. hatchet_sdk/v0/clients/rest/models/user.py +126 -0
  225. hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +88 -0
  226. hatchet_sdk/v0/clients/rest/models/user_login_request.py +86 -0
  227. hatchet_sdk/v0/clients/rest/models/user_register_request.py +91 -0
  228. hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +110 -0
  229. hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +86 -0
  230. hatchet_sdk/v0/clients/rest/models/webhook_worker.py +100 -0
  231. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +94 -0
  232. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +98 -0
  233. hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +102 -0
  234. hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +110 -0
  235. hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +102 -0
  236. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +104 -0
  237. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +38 -0
  238. hatchet_sdk/v0/clients/rest/models/worker.py +239 -0
  239. hatchet_sdk/v0/clients/rest/models/worker_label.py +102 -0
  240. hatchet_sdk/v0/clients/rest/models/worker_list.py +110 -0
  241. hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +103 -0
  242. hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +38 -0
  243. hatchet_sdk/v0/clients/rest/models/worker_type.py +38 -0
  244. hatchet_sdk/v0/clients/rest/models/workflow.py +165 -0
  245. hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +107 -0
  246. hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +136 -0
  247. hatchet_sdk/v0/clients/rest/models/workflow_kind.py +38 -0
  248. hatchet_sdk/v0/clients/rest/models/workflow_list.py +120 -0
  249. hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +97 -0
  250. hatchet_sdk/v0/clients/rest/models/workflow_run.py +188 -0
  251. hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +85 -0
  252. hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +110 -0
  253. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +37 -0
  254. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +39 -0
  255. hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +186 -0
  256. hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +42 -0
  257. hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +112 -0
  258. hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +85 -0
  259. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +94 -0
  260. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +104 -0
  261. hatchet_sdk/v0/clients/rest/models/workflow_tag.py +84 -0
  262. hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +86 -0
  263. hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +86 -0
  264. hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +141 -0
  265. hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +85 -0
  266. hatchet_sdk/v0/clients/rest/models/workflow_version.py +170 -0
  267. hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +114 -0
  268. hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +85 -0
  269. hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +123 -0
  270. hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +95 -0
  271. hatchet_sdk/v0/clients/rest/rest.py +187 -0
  272. hatchet_sdk/v0/clients/rest/tenacity_utils.py +39 -0
  273. hatchet_sdk/v0/clients/rest_client.py +622 -0
  274. hatchet_sdk/v0/clients/run_event_listener.py +260 -0
  275. hatchet_sdk/v0/clients/workflow_listener.py +277 -0
  276. hatchet_sdk/v0/connection.py +63 -0
  277. hatchet_sdk/v0/context/__init__.py +1 -0
  278. hatchet_sdk/v0/context/context.py +446 -0
  279. hatchet_sdk/v0/context/worker_context.py +28 -0
  280. hatchet_sdk/v0/contracts/dispatcher_pb2.py +102 -0
  281. hatchet_sdk/v0/contracts/dispatcher_pb2.pyi +387 -0
  282. hatchet_sdk/v0/contracts/dispatcher_pb2_grpc.py +621 -0
  283. hatchet_sdk/v0/contracts/events_pb2.py +46 -0
  284. hatchet_sdk/v0/contracts/events_pb2.pyi +87 -0
  285. hatchet_sdk/v0/contracts/events_pb2_grpc.py +274 -0
  286. hatchet_sdk/v0/contracts/workflows_pb2.py +80 -0
  287. hatchet_sdk/v0/contracts/workflows_pb2.pyi +312 -0
  288. hatchet_sdk/v0/contracts/workflows_pb2_grpc.py +277 -0
  289. hatchet_sdk/v0/features/cron.py +286 -0
  290. hatchet_sdk/v0/features/scheduled.py +248 -0
  291. hatchet_sdk/v0/hatchet.py +310 -0
  292. hatchet_sdk/v0/labels.py +10 -0
  293. hatchet_sdk/v0/logger.py +13 -0
  294. hatchet_sdk/v0/metadata.py +2 -0
  295. hatchet_sdk/v0/opentelemetry/instrumentor.py +396 -0
  296. hatchet_sdk/v0/rate_limit.py +126 -0
  297. hatchet_sdk/v0/token.py +27 -0
  298. hatchet_sdk/v0/utils/aio_utils.py +137 -0
  299. hatchet_sdk/v0/utils/backoff.py +9 -0
  300. hatchet_sdk/v0/utils/typing.py +12 -0
  301. hatchet_sdk/{v2 → v0/v2}/callable.py +8 -8
  302. hatchet_sdk/{v2 → v0/v2}/concurrency.py +2 -2
  303. hatchet_sdk/{v2 → v0/v2}/hatchet.py +10 -10
  304. hatchet_sdk/v0/worker/__init__.py +1 -0
  305. hatchet_sdk/v0/worker/action_listener_process.py +294 -0
  306. hatchet_sdk/v0/worker/runner/run_loop_manager.py +112 -0
  307. hatchet_sdk/v0/worker/runner/runner.py +460 -0
  308. hatchet_sdk/v0/worker/runner/utils/capture_logs.py +81 -0
  309. hatchet_sdk/v0/worker/worker.py +391 -0
  310. hatchet_sdk/{workflow.py → v0/workflow.py} +4 -4
  311. hatchet_sdk/v0/workflow_run.py +59 -0
  312. hatchet_sdk/waits.py +120 -0
  313. hatchet_sdk/worker/__init__.py +0 -1
  314. hatchet_sdk/worker/action_listener_process.py +80 -55
  315. hatchet_sdk/worker/runner/run_loop_manager.py +46 -34
  316. hatchet_sdk/worker/runner/runner.py +82 -87
  317. hatchet_sdk/worker/runner/utils/capture_logs.py +26 -23
  318. hatchet_sdk/worker/worker.py +172 -149
  319. hatchet_sdk/workflow_run.py +7 -21
  320. {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/METADATA +2 -2
  321. hatchet_sdk-1.0.0a1.dist-info/RECORD +505 -0
  322. {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/entry_points.txt +2 -0
  323. hatchet_sdk/utils/serialization.py +0 -18
  324. hatchet_sdk-0.47.1.dist-info/RECORD +0 -237
  325. /hatchet_sdk/{loader.py → v0/loader.py} +0 -0
  326. /hatchet_sdk/{semver.py → v0/semver.py} +0 -0
  327. /hatchet_sdk/{utils → v0/utils}/types.py +0 -0
  328. /hatchet_sdk/{worker → v0/worker}/runner/utils/error_with_traceback.py +0 -0
  329. {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/WHEEL +0 -0
@@ -2,27 +2,32 @@ import asyncio
2
2
  import logging
3
3
  import signal
4
4
  import time
5
- from dataclasses import dataclass, field
5
+ from dataclasses import dataclass
6
6
  from multiprocessing import Queue
7
- from typing import Any, List, Mapping, Optional
7
+ from typing import Any, Literal
8
8
 
9
9
  import grpc
10
10
 
11
- from hatchet_sdk.client import Client, new_client_raw
12
- from hatchet_sdk.clients.dispatcher.action_listener import Action
13
- from hatchet_sdk.clients.dispatcher.dispatcher import (
11
+ from hatchet_sdk.client import Client
12
+ from hatchet_sdk.clients.dispatcher.action_listener import (
13
+ Action,
14
14
  ActionListener,
15
+ ActionType,
15
16
  GetActionListenerRequest,
16
- new_dispatcher,
17
17
  )
18
+ from hatchet_sdk.clients.dispatcher.dispatcher import DispatcherClient
18
19
  from hatchet_sdk.clients.rest.models.update_worker_request import UpdateWorkerRequest
20
+ from hatchet_sdk.config import ClientConfig
19
21
  from hatchet_sdk.contracts.dispatcher_pb2 import (
20
22
  GROUP_KEY_EVENT_TYPE_STARTED,
21
23
  STEP_EVENT_TYPE_STARTED,
22
- ActionType,
23
24
  )
24
- from hatchet_sdk.loader import ClientConfig
25
25
  from hatchet_sdk.logger import logger
26
+ from hatchet_sdk.runnables.contextvars import (
27
+ ctx_step_run_id,
28
+ ctx_worker_id,
29
+ ctx_workflow_run_id,
30
+ )
26
31
  from hatchet_sdk.utils.backoff import exp_backoff_sleep
27
32
 
28
33
  ACTION_EVENT_RETRY_COUNT = 5
@@ -32,10 +37,11 @@ ACTION_EVENT_RETRY_COUNT = 5
32
37
  class ActionEvent:
33
38
  action: Action
34
39
  type: Any # TODO type
35
- payload: Optional[str] = None
40
+ payload: str
36
41
 
37
42
 
38
- STOP_LOOP = "STOP_LOOP" # Sentinel object to stop the loop
43
+ STOP_LOOP_TYPE = Literal["STOP_LOOP"]
44
+ STOP_LOOP: STOP_LOOP_TYPE = "STOP_LOOP" # Sentinel object to stop the loop
39
45
 
40
46
  # TODO link to a block post
41
47
  BLOCKED_THREAD_WARNING = (
@@ -43,32 +49,39 @@ BLOCKED_THREAD_WARNING = (
43
49
  )
44
50
 
45
51
 
46
- @dataclass
47
52
  class WorkerActionListenerProcess:
48
- name: str
49
- actions: List[str]
50
- max_runs: int
51
- config: ClientConfig
52
- action_queue: Queue
53
- event_queue: Queue
54
- handle_kill: bool = True
55
- debug: bool = False
56
- labels: dict = field(default_factory=dict)
57
-
58
- listener: ActionListener = field(init=False, default=None)
59
-
60
- killing: bool = field(init=False, default=False)
53
+ def __init__(
54
+ self,
55
+ name: str,
56
+ actions: list[str],
57
+ slots: int,
58
+ config: ClientConfig,
59
+ action_queue: "Queue[Action]",
60
+ event_queue: "Queue[ActionEvent | STOP_LOOP_TYPE]",
61
+ handle_kill: bool = True,
62
+ debug: bool = False,
63
+ labels: dict[str, str | int] = {},
64
+ ) -> None:
65
+ self.name = name
66
+ self.actions = actions
67
+ self.slots = slots
68
+ self.config = config
69
+ self.action_queue = action_queue
70
+ self.event_queue = event_queue
71
+ self.debug = debug
72
+ self.labels = labels
73
+ self.handle_kill = handle_kill
74
+
75
+ self.listener: ActionListener | None = None
76
+ self.killing = False
77
+ self.action_loop_task: asyncio.Task[None] | None = None
78
+ self.event_send_loop_task: asyncio.Task[None] | None = None
79
+ self.running_step_runs: dict[str, float] = {}
61
80
 
62
- action_loop_task: asyncio.Task = field(init=False, default=None)
63
- event_send_loop_task: asyncio.Task = field(init=False, default=None)
64
-
65
- running_step_runs: Mapping[str, float] = field(init=False, default_factory=dict)
66
-
67
- def __post_init__(self):
68
81
  if self.debug:
69
82
  logger.setLevel(logging.DEBUG)
70
83
 
71
- self.client = new_client_raw(self.config, self.debug)
84
+ self.client = Client(config=self.config, debug=self.debug)
72
85
 
73
86
  loop = asyncio.get_event_loop()
74
87
  loop.add_signal_handler(
@@ -81,7 +94,16 @@ class WorkerActionListenerProcess:
81
94
  signal.SIGQUIT, lambda: asyncio.create_task(self.exit_gracefully())
82
95
  )
83
96
 
84
- async def start(self, retry_attempt=0):
97
+ async def pause_task_assignment(self) -> None:
98
+ if self.listener is None:
99
+ raise ValueError("listener not started")
100
+
101
+ await self.client.rest.worker_api.worker_update(
102
+ worker=self.listener.worker_id,
103
+ update_worker_request=UpdateWorkerRequest(isPaused=True),
104
+ )
105
+
106
+ async def start(self, retry_attempt: int = 0) -> None:
85
107
  if retry_attempt > 5:
86
108
  logger.error("could not start action listener")
87
109
  return
@@ -89,15 +111,15 @@ class WorkerActionListenerProcess:
89
111
  logger.debug(f"starting action listener: {self.name}")
90
112
 
91
113
  try:
92
- self.dispatcher_client = new_dispatcher(self.config)
114
+ self.dispatcher_client = DispatcherClient(self.config)
93
115
 
94
116
  self.listener = await self.dispatcher_client.get_action_listener(
95
117
  GetActionListenerRequest(
96
118
  worker_name=self.name,
97
119
  services=["default"],
98
120
  actions=self.actions,
99
- max_runs=self.max_runs,
100
- _labels=self.labels,
121
+ slots=self.slots,
122
+ raw_labels=self.labels,
101
123
  )
102
124
  )
103
125
 
@@ -112,13 +134,13 @@ class WorkerActionListenerProcess:
112
134
  self.blocked_main_loop = asyncio.create_task(self.start_blocked_main_loop())
113
135
 
114
136
  # TODO move event methods to separate class
115
- async def _get_event(self):
137
+ async def _get_event(self) -> ActionEvent | STOP_LOOP_TYPE:
116
138
  loop = asyncio.get_running_loop()
117
139
  return await loop.run_in_executor(None, self.event_queue.get)
118
140
 
119
- async def start_event_send_loop(self):
141
+ async def start_event_send_loop(self) -> None:
120
142
  while True:
121
- event: ActionEvent = await self._get_event()
143
+ event = await self._get_event()
122
144
  if event == STOP_LOOP:
123
145
  logger.debug("stopping event send loop...")
124
146
  break
@@ -126,11 +148,11 @@ class WorkerActionListenerProcess:
126
148
  logger.debug(f"tx: event: {event.action.action_id}/{event.type}")
127
149
  asyncio.create_task(self.send_event(event))
128
150
 
129
- async def start_blocked_main_loop(self):
151
+ async def start_blocked_main_loop(self) -> None:
130
152
  threshold = 1
131
153
  while not self.killing:
132
154
  count = 0
133
- for step_run_id, start_time in self.running_step_runs.items():
155
+ for _, start_time in self.running_step_runs.items():
134
156
  diff = self.now() - start_time
135
157
  if diff > threshold:
136
158
  count += 1
@@ -139,7 +161,7 @@ class WorkerActionListenerProcess:
139
161
  logger.warning(f"{BLOCKED_THREAD_WARNING}: Waiting Steps {count}")
140
162
  await asyncio.sleep(1)
141
163
 
142
- async def send_event(self, event: ActionEvent, retry_attempt: int = 1):
164
+ async def send_event(self, event: ActionEvent, retry_attempt: int = 1) -> None:
143
165
  try:
144
166
  match event.action.action_type:
145
167
  # FIXME: all events sent from an execution of a function are of type ActionType.START_STEP_RUN since
@@ -189,15 +211,22 @@ class WorkerActionListenerProcess:
189
211
  await exp_backoff_sleep(retry_attempt, 1)
190
212
  await self.send_event(event, retry_attempt + 1)
191
213
 
192
- def now(self):
214
+ def now(self) -> float:
193
215
  return time.time()
194
216
 
195
- async def start_action_loop(self):
217
+ async def start_action_loop(self) -> None:
218
+ if self.listener is None:
219
+ raise ValueError("listener not started")
220
+
196
221
  try:
197
222
  async for action in self.listener:
198
223
  if action is None:
199
224
  break
200
225
 
226
+ ctx_step_run_id.set(action.step_run_id)
227
+ ctx_workflow_run_id.set(action.workflow_run_id)
228
+ ctx_worker_id.set(action.worker_id)
229
+
201
230
  # Process the action here
202
231
  match action.action_type:
203
232
  case ActionType.START_STEP_RUN:
@@ -205,6 +234,7 @@ class WorkerActionListenerProcess:
205
234
  ActionEvent(
206
235
  action=action,
207
236
  type=STEP_EVENT_TYPE_STARTED, # TODO ack type
237
+ payload="",
208
238
  )
209
239
  )
210
240
  logger.info(
@@ -224,6 +254,7 @@ class WorkerActionListenerProcess:
224
254
  ActionEvent(
225
255
  action=action,
226
256
  type=GROUP_KEY_EVENT_TYPE_STARTED, # TODO ack type
257
+ payload="",
227
258
  )
228
259
  )
229
260
  logger.info(
@@ -243,9 +274,9 @@ class WorkerActionListenerProcess:
243
274
  finally:
244
275
  logger.info("action loop closed")
245
276
  if not self.killing:
246
- await self.exit_gracefully(skip_unregister=True)
277
+ await self.exit_gracefully()
247
278
 
248
- async def cleanup(self):
279
+ async def cleanup(self) -> None:
249
280
  self.killing = True
250
281
 
251
282
  if self.listener is not None:
@@ -253,13 +284,7 @@ class WorkerActionListenerProcess:
253
284
 
254
285
  self.event_queue.put(STOP_LOOP)
255
286
 
256
- async def pause_task_assignment(self) -> None:
257
- await self.client.rest.aio.worker_api.worker_update(
258
- worker=self.listener.worker_id,
259
- update_worker_request=UpdateWorkerRequest(isPaused=True),
260
- )
261
-
262
- async def exit_gracefully(self, skip_unregister=False):
287
+ async def exit_gracefully(self) -> None:
263
288
  await self.pause_task_assignment()
264
289
 
265
290
  if self.killing:
@@ -274,13 +299,13 @@ class WorkerActionListenerProcess:
274
299
 
275
300
  logger.info("action listener closed")
276
301
 
277
- def exit_forcefully(self):
302
+ def exit_forcefully(self) -> None:
278
303
  asyncio.run(self.cleanup())
279
304
  logger.debug("forcefully closing listener...")
280
305
 
281
306
 
282
- def worker_action_listener_process(*args, **kwargs):
283
- async def run():
307
+ def worker_action_listener_process(*args: Any, **kwargs: Any) -> None:
308
+ async def run() -> None:
284
309
  process = WorkerActionListenerProcess(*args, **kwargs)
285
310
  await process.start()
286
311
  # Keep the process running
@@ -1,52 +1,64 @@
1
1
  import asyncio
2
2
  import logging
3
- from dataclasses import dataclass, field
4
3
  from multiprocessing import Queue
5
- from typing import Callable, TypeVar
4
+ from typing import Any, Literal, TypeVar
6
5
 
7
- from hatchet_sdk import Context
8
- from hatchet_sdk.client import Client, new_client_raw
6
+ from hatchet_sdk.client import Client
9
7
  from hatchet_sdk.clients.dispatcher.action_listener import Action
10
- from hatchet_sdk.loader import ClientConfig
8
+ from hatchet_sdk.config import ClientConfig
11
9
  from hatchet_sdk.logger import logger
12
- from hatchet_sdk.utils.types import WorkflowValidator
10
+ from hatchet_sdk.runnables.task import Task
11
+ from hatchet_sdk.utils.typing import WorkflowValidator
12
+ from hatchet_sdk.worker.action_listener_process import ActionEvent
13
13
  from hatchet_sdk.worker.runner.runner import Runner
14
14
  from hatchet_sdk.worker.runner.utils.capture_logs import capture_logs
15
15
 
16
- STOP_LOOP = "STOP_LOOP"
16
+ STOP_LOOP_TYPE = Literal["STOP_LOOP"]
17
+ STOP_LOOP: STOP_LOOP_TYPE = "STOP_LOOP"
17
18
 
18
19
  T = TypeVar("T")
19
20
 
20
21
 
21
- @dataclass
22
22
  class WorkerActionRunLoopManager:
23
- name: str
24
- action_registry: dict[str, Callable[[Context], T]]
25
- validator_registry: dict[str, WorkflowValidator]
26
- max_runs: int | None
27
- config: ClientConfig
28
- action_queue: Queue
29
- event_queue: Queue
30
- loop: asyncio.AbstractEventLoop
31
- handle_kill: bool = True
32
- debug: bool = False
33
- labels: dict[str, str | int] = field(default_factory=dict)
34
-
35
- client: Client = field(init=False, default=None)
36
-
37
- killing: bool = field(init=False, default=False)
38
- runner: Runner = field(init=False, default=None)
39
-
40
- def __post_init__(self):
23
+ def __init__(
24
+ self,
25
+ name: str,
26
+ action_registry: dict[str, Task[Any, Any]],
27
+ validator_registry: dict[str, WorkflowValidator],
28
+ slots: int | None,
29
+ config: ClientConfig,
30
+ action_queue: "Queue[Action | STOP_LOOP_TYPE]",
31
+ event_queue: "Queue[ActionEvent]",
32
+ loop: asyncio.AbstractEventLoop,
33
+ handle_kill: bool = True,
34
+ debug: bool = False,
35
+ labels: dict[str, str | int] = {},
36
+ ) -> None:
37
+ self.name = name
38
+ self.action_registry = action_registry
39
+ self.validator_registry = validator_registry
40
+ self.slots = slots
41
+ self.config = config
42
+ self.action_queue = action_queue
43
+ self.event_queue = event_queue
44
+ self.loop = loop
45
+ self.handle_kill = handle_kill
46
+ self.debug = debug
47
+ self.labels = labels
48
+
41
49
  if self.debug:
42
50
  logger.setLevel(logging.DEBUG)
43
- self.client = new_client_raw(self.config, self.debug)
51
+
52
+ self.killing = False
53
+ self.runner: Runner | None = None
54
+
55
+ self.client = Client(config=self.config, debug=self.debug)
44
56
  self.start()
45
57
 
46
- def start(self, retry_count=1):
47
- k = self.loop.create_task(self.async_start(retry_count))
58
+ def start(self, retry_count: int = 1) -> None:
59
+ k = self.loop.create_task(self.aio_start(retry_count)) # noqa: F841
48
60
 
49
- async def async_start(self, retry_count=1):
61
+ async def aio_start(self, retry_count: int = 1) -> None:
50
62
  await capture_logs(
51
63
  self.client.logInterceptor,
52
64
  self.client.event,
@@ -73,17 +85,17 @@ class WorkerActionRunLoopManager:
73
85
  self.runner = Runner(
74
86
  self.name,
75
87
  self.event_queue,
76
- self.max_runs,
88
+ self.config,
89
+ self.slots,
77
90
  self.handle_kill,
78
91
  self.action_registry,
79
92
  self.validator_registry,
80
- self.config,
81
93
  self.labels,
82
94
  )
83
95
 
84
96
  logger.debug(f"'{self.name}' waiting for {list(self.action_registry.keys())}")
85
97
  while not self.killing:
86
- action: Action = await self._get_action()
98
+ action = await self._get_action()
87
99
  if action == STOP_LOOP:
88
100
  logger.debug("stopping action runner loop...")
89
101
  break
@@ -91,7 +103,7 @@ class WorkerActionRunLoopManager:
91
103
  self.runner.run(action)
92
104
  logger.debug("action runner loop stopped")
93
105
 
94
- async def _get_action(self):
106
+ async def _get_action(self) -> Action | STOP_LOOP_TYPE:
95
107
  return await self.loop.run_in_executor(None, self.action_queue.get)
96
108
 
97
109
  async def exit_gracefully(self) -> None: