hatchet-sdk 0.47.0__py3-none-any.whl → 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. hatchet_sdk/__init__.py +25 -16
  2. hatchet_sdk/client.py +14 -39
  3. hatchet_sdk/clients/admin.py +203 -362
  4. hatchet_sdk/clients/dispatcher/action_listener.py +106 -84
  5. hatchet_sdk/clients/dispatcher/dispatcher.py +21 -21
  6. hatchet_sdk/clients/event_ts.py +23 -10
  7. hatchet_sdk/clients/events.py +96 -99
  8. hatchet_sdk/clients/rest/__init__.py +24 -0
  9. hatchet_sdk/clients/rest/api/__init__.py +2 -0
  10. hatchet_sdk/clients/rest/api/task_api.py +2174 -0
  11. hatchet_sdk/clients/rest/api/workflow_runs_api.py +638 -106
  12. hatchet_sdk/clients/rest/api_client.py +1 -1
  13. hatchet_sdk/clients/rest/configuration.py +8 -1
  14. hatchet_sdk/clients/rest/exceptions.py +21 -0
  15. hatchet_sdk/clients/rest/models/__init__.py +22 -0
  16. hatchet_sdk/clients/rest/models/tenant.py +4 -0
  17. hatchet_sdk/clients/rest/models/tenant_version.py +37 -0
  18. hatchet_sdk/clients/rest/models/update_tenant_request.py +7 -0
  19. hatchet_sdk/clients/rest/models/v1_cancel_task_request.py +104 -0
  20. hatchet_sdk/clients/rest/models/v1_dag_children.py +102 -0
  21. hatchet_sdk/clients/rest/models/v1_replay_task_request.py +104 -0
  22. hatchet_sdk/clients/rest/models/v1_task.py +174 -0
  23. hatchet_sdk/clients/rest/models/v1_task_event.py +118 -0
  24. hatchet_sdk/clients/rest/models/v1_task_event_list.py +110 -0
  25. hatchet_sdk/clients/rest/models/v1_task_event_type.py +55 -0
  26. hatchet_sdk/clients/rest/models/v1_task_filter.py +106 -0
  27. hatchet_sdk/clients/rest/models/v1_task_point_metric.py +92 -0
  28. hatchet_sdk/clients/rest/models/v1_task_point_metrics.py +100 -0
  29. hatchet_sdk/clients/rest/models/v1_task_run_metric.py +88 -0
  30. hatchet_sdk/clients/rest/models/v1_task_run_status.py +40 -0
  31. hatchet_sdk/clients/rest/models/v1_task_status.py +40 -0
  32. hatchet_sdk/clients/rest/models/v1_task_summary.py +212 -0
  33. hatchet_sdk/clients/rest/models/v1_task_summary_list.py +110 -0
  34. hatchet_sdk/clients/rest/models/v1_workflow_run.py +171 -0
  35. hatchet_sdk/clients/rest/models/v1_workflow_run_details.py +145 -0
  36. hatchet_sdk/clients/rest/models/v1_workflow_type.py +37 -0
  37. hatchet_sdk/clients/rest/models/workflow_run_shape_item_for_workflow_run_details.py +99 -0
  38. hatchet_sdk/clients/rest/rest.py +37 -26
  39. hatchet_sdk/clients/rest/tenacity_utils.py +1 -1
  40. hatchet_sdk/clients/rest_client.py +141 -116
  41. hatchet_sdk/clients/run_event_listener.py +66 -60
  42. hatchet_sdk/clients/workflow_listener.py +75 -66
  43. hatchet_sdk/config.py +117 -0
  44. hatchet_sdk/connection.py +27 -13
  45. hatchet_sdk/context/__init__.py +0 -1
  46. hatchet_sdk/context/context.py +118 -218
  47. hatchet_sdk/features/cron.py +43 -57
  48. hatchet_sdk/features/scheduled.py +60 -74
  49. hatchet_sdk/hatchet.py +192 -195
  50. hatchet_sdk/labels.py +4 -6
  51. hatchet_sdk/metadata.py +1 -1
  52. hatchet_sdk/opentelemetry/instrumentor.py +9 -5
  53. hatchet_sdk/rate_limit.py +9 -18
  54. hatchet_sdk/token.py +13 -9
  55. hatchet_sdk/utils/aio_utils.py +0 -40
  56. hatchet_sdk/utils/proto_enums.py +54 -0
  57. hatchet_sdk/utils/typing.py +9 -1
  58. hatchet_sdk/v0/__init__.py +251 -0
  59. hatchet_sdk/v0/client.py +119 -0
  60. hatchet_sdk/v0/clients/admin.py +541 -0
  61. hatchet_sdk/v0/clients/dispatcher/action_listener.py +422 -0
  62. hatchet_sdk/v0/clients/dispatcher/dispatcher.py +204 -0
  63. hatchet_sdk/v0/clients/event_ts.py +28 -0
  64. hatchet_sdk/v0/clients/events.py +182 -0
  65. hatchet_sdk/v0/clients/rest/__init__.py +307 -0
  66. hatchet_sdk/v0/clients/rest/api/__init__.py +19 -0
  67. hatchet_sdk/v0/clients/rest/api/api_token_api.py +858 -0
  68. hatchet_sdk/v0/clients/rest/api/default_api.py +2259 -0
  69. hatchet_sdk/v0/clients/rest/api/event_api.py +2548 -0
  70. hatchet_sdk/v0/clients/rest/api/github_api.py +331 -0
  71. hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +483 -0
  72. hatchet_sdk/v0/clients/rest/api/log_api.py +449 -0
  73. hatchet_sdk/v0/clients/rest/api/metadata_api.py +728 -0
  74. hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +423 -0
  75. hatchet_sdk/v0/clients/rest/api/slack_api.py +577 -0
  76. hatchet_sdk/v0/clients/rest/api/sns_api.py +872 -0
  77. hatchet_sdk/v0/clients/rest/api/step_run_api.py +2202 -0
  78. hatchet_sdk/v0/clients/rest/api/tenant_api.py +4430 -0
  79. hatchet_sdk/v0/clients/rest/api/user_api.py +2888 -0
  80. hatchet_sdk/v0/clients/rest/api/worker_api.py +858 -0
  81. hatchet_sdk/v0/clients/rest/api/workflow_api.py +6312 -0
  82. hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +1932 -0
  83. hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +610 -0
  84. hatchet_sdk/v0/clients/rest/api_client.py +759 -0
  85. hatchet_sdk/v0/clients/rest/api_response.py +22 -0
  86. hatchet_sdk/v0/clients/rest/configuration.py +611 -0
  87. hatchet_sdk/v0/clients/rest/exceptions.py +200 -0
  88. hatchet_sdk/v0/clients/rest/models/__init__.py +274 -0
  89. hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +83 -0
  90. hatchet_sdk/v0/clients/rest/models/api_error.py +102 -0
  91. hatchet_sdk/v0/clients/rest/models/api_errors.py +100 -0
  92. hatchet_sdk/v0/clients/rest/models/api_meta.py +144 -0
  93. hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +85 -0
  94. hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +88 -0
  95. hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +90 -0
  96. hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +98 -0
  97. hatchet_sdk/v0/clients/rest/models/api_token.py +105 -0
  98. hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +100 -0
  99. hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +110 -0
  100. hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +85 -0
  101. hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +83 -0
  102. hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +39 -0
  103. hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +92 -0
  104. hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +83 -0
  105. hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +98 -0
  106. hatchet_sdk/v0/clients/rest/models/create_event_request.py +95 -0
  107. hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +83 -0
  108. hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +85 -0
  109. hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +83 -0
  110. hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +86 -0
  111. hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +84 -0
  112. hatchet_sdk/v0/clients/rest/models/cron_workflows.py +131 -0
  113. hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +110 -0
  114. hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +37 -0
  115. hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +37 -0
  116. hatchet_sdk/v0/clients/rest/models/event.py +143 -0
  117. hatchet_sdk/v0/clients/rest/models/event_data.py +83 -0
  118. hatchet_sdk/v0/clients/rest/models/event_key_list.py +98 -0
  119. hatchet_sdk/v0/clients/rest/models/event_list.py +110 -0
  120. hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +37 -0
  121. hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +36 -0
  122. hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +85 -0
  123. hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +116 -0
  124. hatchet_sdk/v0/clients/rest/models/events.py +110 -0
  125. hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +100 -0
  126. hatchet_sdk/v0/clients/rest/models/github_app_installation.py +107 -0
  127. hatchet_sdk/v0/clients/rest/models/github_branch.py +86 -0
  128. hatchet_sdk/v0/clients/rest/models/github_repo.py +86 -0
  129. hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +83 -0
  130. hatchet_sdk/v0/clients/rest/models/job.py +132 -0
  131. hatchet_sdk/v0/clients/rest/models/job_run.py +176 -0
  132. hatchet_sdk/v0/clients/rest/models/job_run_status.py +41 -0
  133. hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +106 -0
  134. hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +110 -0
  135. hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +112 -0
  136. hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +100 -0
  137. hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +110 -0
  138. hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +110 -0
  139. hatchet_sdk/v0/clients/rest/models/log_line.py +94 -0
  140. hatchet_sdk/v0/clients/rest/models/log_line_level.py +39 -0
  141. hatchet_sdk/v0/clients/rest/models/log_line_list.py +110 -0
  142. hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +37 -0
  143. hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +36 -0
  144. hatchet_sdk/v0/clients/rest/models/pagination_response.py +95 -0
  145. hatchet_sdk/v0/clients/rest/models/pull_request.py +112 -0
  146. hatchet_sdk/v0/clients/rest/models/pull_request_state.py +37 -0
  147. hatchet_sdk/v0/clients/rest/models/queue_metrics.py +97 -0
  148. hatchet_sdk/v0/clients/rest/models/rate_limit.py +117 -0
  149. hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +110 -0
  150. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +37 -0
  151. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +38 -0
  152. hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +118 -0
  153. hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +83 -0
  154. hatchet_sdk/v0/clients/rest/models/replay_event_request.py +85 -0
  155. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +85 -0
  156. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +100 -0
  157. hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +83 -0
  158. hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +92 -0
  159. hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +42 -0
  160. hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +149 -0
  161. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +110 -0
  162. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +37 -0
  163. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +37 -0
  164. hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +113 -0
  165. hatchet_sdk/v0/clients/rest/models/slack_webhook.py +127 -0
  166. hatchet_sdk/v0/clients/rest/models/sns_integration.py +114 -0
  167. hatchet_sdk/v0/clients/rest/models/step.py +123 -0
  168. hatchet_sdk/v0/clients/rest/models/step_run.py +202 -0
  169. hatchet_sdk/v0/clients/rest/models/step_run_archive.py +142 -0
  170. hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +110 -0
  171. hatchet_sdk/v0/clients/rest/models/step_run_diff.py +91 -0
  172. hatchet_sdk/v0/clients/rest/models/step_run_event.py +122 -0
  173. hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +110 -0
  174. hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +52 -0
  175. hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +38 -0
  176. hatchet_sdk/v0/clients/rest/models/step_run_status.py +44 -0
  177. hatchet_sdk/v0/clients/rest/models/tenant.py +118 -0
  178. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +98 -0
  179. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +112 -0
  180. hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +143 -0
  181. hatchet_sdk/v0/clients/rest/models/tenant_invite.py +120 -0
  182. hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +110 -0
  183. hatchet_sdk/v0/clients/rest/models/tenant_list.py +110 -0
  184. hatchet_sdk/v0/clients/rest/models/tenant_member.py +123 -0
  185. hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +110 -0
  186. hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +38 -0
  187. hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +116 -0
  188. hatchet_sdk/v0/clients/rest/models/tenant_resource.py +40 -0
  189. hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +135 -0
  190. hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +102 -0
  191. hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +83 -0
  192. hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +91 -0
  193. hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +83 -0
  194. hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +85 -0
  195. hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +137 -0
  196. hatchet_sdk/v0/clients/rest/models/update_worker_request.py +87 -0
  197. hatchet_sdk/v0/clients/rest/models/user.py +126 -0
  198. hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +88 -0
  199. hatchet_sdk/v0/clients/rest/models/user_login_request.py +86 -0
  200. hatchet_sdk/v0/clients/rest/models/user_register_request.py +91 -0
  201. hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +110 -0
  202. hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +86 -0
  203. hatchet_sdk/v0/clients/rest/models/webhook_worker.py +100 -0
  204. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +94 -0
  205. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +98 -0
  206. hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +102 -0
  207. hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +110 -0
  208. hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +102 -0
  209. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +104 -0
  210. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +38 -0
  211. hatchet_sdk/v0/clients/rest/models/worker.py +239 -0
  212. hatchet_sdk/v0/clients/rest/models/worker_label.py +102 -0
  213. hatchet_sdk/v0/clients/rest/models/worker_list.py +110 -0
  214. hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +103 -0
  215. hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +38 -0
  216. hatchet_sdk/v0/clients/rest/models/worker_type.py +38 -0
  217. hatchet_sdk/v0/clients/rest/models/workflow.py +165 -0
  218. hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +107 -0
  219. hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +136 -0
  220. hatchet_sdk/v0/clients/rest/models/workflow_kind.py +38 -0
  221. hatchet_sdk/v0/clients/rest/models/workflow_list.py +120 -0
  222. hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +97 -0
  223. hatchet_sdk/v0/clients/rest/models/workflow_run.py +188 -0
  224. hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +85 -0
  225. hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +110 -0
  226. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +37 -0
  227. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +39 -0
  228. hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +186 -0
  229. hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +42 -0
  230. hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +112 -0
  231. hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +85 -0
  232. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +94 -0
  233. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +104 -0
  234. hatchet_sdk/v0/clients/rest/models/workflow_tag.py +84 -0
  235. hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +86 -0
  236. hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +86 -0
  237. hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +141 -0
  238. hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +85 -0
  239. hatchet_sdk/v0/clients/rest/models/workflow_version.py +170 -0
  240. hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +114 -0
  241. hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +85 -0
  242. hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +123 -0
  243. hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +95 -0
  244. hatchet_sdk/v0/clients/rest/rest.py +187 -0
  245. hatchet_sdk/v0/clients/rest/tenacity_utils.py +39 -0
  246. hatchet_sdk/v0/clients/rest_client.py +613 -0
  247. hatchet_sdk/v0/clients/run_event_listener.py +260 -0
  248. hatchet_sdk/v0/clients/workflow_listener.py +277 -0
  249. hatchet_sdk/v0/connection.py +63 -0
  250. hatchet_sdk/v0/context/__init__.py +1 -0
  251. hatchet_sdk/v0/context/context.py +446 -0
  252. hatchet_sdk/v0/context/worker_context.py +28 -0
  253. hatchet_sdk/v0/contracts/dispatcher_pb2.py +102 -0
  254. hatchet_sdk/v0/contracts/dispatcher_pb2.pyi +387 -0
  255. hatchet_sdk/v0/contracts/dispatcher_pb2_grpc.py +621 -0
  256. hatchet_sdk/v0/contracts/events_pb2.py +46 -0
  257. hatchet_sdk/v0/contracts/events_pb2.pyi +87 -0
  258. hatchet_sdk/v0/contracts/events_pb2_grpc.py +274 -0
  259. hatchet_sdk/v0/contracts/workflows_pb2.py +80 -0
  260. hatchet_sdk/v0/contracts/workflows_pb2.pyi +312 -0
  261. hatchet_sdk/v0/contracts/workflows_pb2_grpc.py +277 -0
  262. hatchet_sdk/v0/features/cron.py +286 -0
  263. hatchet_sdk/v0/features/scheduled.py +248 -0
  264. hatchet_sdk/v0/hatchet.py +310 -0
  265. hatchet_sdk/v0/labels.py +10 -0
  266. hatchet_sdk/v0/logger.py +13 -0
  267. hatchet_sdk/v0/metadata.py +2 -0
  268. hatchet_sdk/v0/opentelemetry/instrumentor.py +396 -0
  269. hatchet_sdk/v0/rate_limit.py +126 -0
  270. hatchet_sdk/v0/semver.py +30 -0
  271. hatchet_sdk/v0/token.py +27 -0
  272. hatchet_sdk/v0/utils/aio_utils.py +137 -0
  273. hatchet_sdk/v0/utils/backoff.py +9 -0
  274. hatchet_sdk/v0/utils/typing.py +12 -0
  275. hatchet_sdk/{v2 → v0/v2}/callable.py +8 -8
  276. hatchet_sdk/{v2 → v0/v2}/concurrency.py +2 -2
  277. hatchet_sdk/{v2 → v0/v2}/hatchet.py +10 -10
  278. hatchet_sdk/v0/worker/__init__.py +1 -0
  279. hatchet_sdk/v0/worker/action_listener_process.py +278 -0
  280. hatchet_sdk/v0/worker/runner/run_loop_manager.py +112 -0
  281. hatchet_sdk/v0/worker/runner/runner.py +460 -0
  282. hatchet_sdk/v0/worker/runner/utils/capture_logs.py +81 -0
  283. hatchet_sdk/v0/worker/runner/utils/error_with_traceback.py +6 -0
  284. hatchet_sdk/v0/worker/worker.py +391 -0
  285. hatchet_sdk/v0/workflow.py +261 -0
  286. hatchet_sdk/v0/workflow_run.py +59 -0
  287. hatchet_sdk/worker/__init__.py +0 -1
  288. hatchet_sdk/worker/action_listener_process.py +36 -33
  289. hatchet_sdk/worker/runner/run_loop_manager.py +18 -16
  290. hatchet_sdk/worker/runner/runner.py +32 -60
  291. hatchet_sdk/worker/runner/utils/capture_logs.py +25 -14
  292. hatchet_sdk/worker/runner/utils/error_with_traceback.py +1 -1
  293. hatchet_sdk/worker/worker.py +61 -75
  294. hatchet_sdk/workflow.py +473 -207
  295. hatchet_sdk/workflow_run.py +5 -18
  296. {hatchet_sdk-0.47.0.dist-info → hatchet_sdk-1.0.0.dist-info}/METADATA +2 -1
  297. hatchet_sdk-1.0.0.dist-info/RECORD +485 -0
  298. hatchet_sdk/utils/serialization.py +0 -18
  299. hatchet_sdk-0.47.0.dist-info/RECORD +0 -237
  300. /hatchet_sdk/{loader.py → v0/loader.py} +0 -0
  301. /hatchet_sdk/{utils → v0/utils}/types.py +0 -0
  302. {hatchet_sdk-0.47.0.dist-info → hatchet_sdk-1.0.0.dist-info}/WHEEL +0 -0
  303. {hatchet_sdk-0.47.0.dist-info → hatchet_sdk-1.0.0.dist-info}/entry_points.txt +0 -0
hatchet_sdk/connection.py CHANGED
@@ -1,26 +1,36 @@
1
1
  import os
2
- from typing import TYPE_CHECKING, Any
2
+ from typing import Literal, cast, overload
3
3
 
4
4
  import grpc
5
5
 
6
- if TYPE_CHECKING:
7
- from hatchet_sdk.loader import ClientConfig
6
+ from hatchet_sdk.config import ClientConfig
8
7
 
9
8
 
10
- def new_conn(config: "ClientConfig", aio=False):
9
+ @overload
10
+ def new_conn(config: ClientConfig, aio: Literal[False]) -> grpc.Channel: ...
11
11
 
12
+
13
+ @overload
14
+ def new_conn(config: ClientConfig, aio: Literal[True]) -> grpc.aio.Channel: ...
15
+
16
+
17
+ def new_conn(config: ClientConfig, aio: bool) -> grpc.Channel | grpc.aio.Channel:
12
18
  credentials: grpc.ChannelCredentials | None = None
13
19
 
14
20
  # load channel credentials
15
- if config.tls_config.tls_strategy == "tls":
16
- root: Any | None = None
21
+ if config.tls_config.strategy == "tls":
22
+ root: bytes | None = None
17
23
 
18
- if config.tls_config.ca_file:
19
- root = open(config.tls_config.ca_file, "rb").read()
24
+ if config.tls_config.root_ca_file:
25
+ root = open(config.tls_config.root_ca_file, "rb").read()
20
26
 
21
27
  credentials = grpc.ssl_channel_credentials(root_certificates=root)
22
- elif config.tls_config.tls_strategy == "mtls":
23
- root = open(config.tls_config.ca_file, "rb").read()
28
+ elif config.tls_config.strategy == "mtls":
29
+ assert config.tls_config.root_ca_file
30
+ assert config.tls_config.key_file
31
+ assert config.tls_config.cert_file
32
+
33
+ root = open(config.tls_config.root_ca_file, "rb").read()
24
34
  private_key = open(config.tls_config.key_file, "rb").read()
25
35
  certificate_chain = open(config.tls_config.cert_file, "rb").read()
26
36
 
@@ -32,7 +42,7 @@ def new_conn(config: "ClientConfig", aio=False):
32
42
 
33
43
  start = grpc if not aio else grpc.aio
34
44
 
35
- channel_options = [
45
+ channel_options: list[tuple[str, str | int]] = [
36
46
  ("grpc.max_send_message_length", config.grpc_max_send_message_length),
37
47
  ("grpc.max_receive_message_length", config.grpc_max_recv_message_length),
38
48
  ("grpc.keepalive_time_ms", 10 * 1000),
@@ -46,7 +56,7 @@ def new_conn(config: "ClientConfig", aio=False):
46
56
  # When steps execute via os.fork, we see `TSI_DATA_CORRUPTED` errors.
47
57
  os.environ["GRPC_ENABLE_FORK_SUPPORT"] = "False"
48
58
 
49
- if config.tls_config.tls_strategy == "none":
59
+ if config.tls_config.strategy == "none":
50
60
  conn = start.insecure_channel(
51
61
  target=config.host_port,
52
62
  options=channel_options,
@@ -61,4 +71,8 @@ def new_conn(config: "ClientConfig", aio=False):
61
71
  credentials=credentials,
62
72
  options=channel_options,
63
73
  )
64
- return conn
74
+
75
+ return cast(
76
+ grpc.Channel | grpc.aio.Channel,
77
+ conn,
78
+ )
@@ -1 +0,0 @@
1
- from .context import Context
@@ -2,43 +2,34 @@ import inspect
2
2
  import json
3
3
  import traceback
4
4
  from concurrent.futures import Future, ThreadPoolExecutor
5
- from typing import Any, Generic, Type, TypeVar, cast, overload
6
- from warnings import warn
5
+ from typing import Any, cast
7
6
 
8
- from pydantic import BaseModel, StrictStr
7
+ from pydantic import BaseModel
9
8
 
10
- from hatchet_sdk.clients.events import EventClient
11
- from hatchet_sdk.clients.rest.tenacity_utils import tenacity_retry
12
- from hatchet_sdk.clients.rest_client import RestApi
13
- from hatchet_sdk.clients.run_event_listener import RunEventListenerClient
14
- from hatchet_sdk.clients.workflow_listener import PooledWorkflowRunListener
15
- from hatchet_sdk.context.worker_context import WorkerContext
16
- from hatchet_sdk.contracts.dispatcher_pb2 import OverridesData
17
- from hatchet_sdk.contracts.workflows_pb2 import (
18
- BulkTriggerWorkflowRequest,
19
- TriggerWorkflowRequest,
20
- )
21
- from hatchet_sdk.utils.types import WorkflowValidator
22
- from hatchet_sdk.utils.typing import is_basemodel_subclass
23
- from hatchet_sdk.workflow_run import WorkflowRunRef
24
-
25
- from ..clients.admin import (
9
+ from hatchet_sdk.clients.admin import (
26
10
  AdminClient,
27
11
  ChildTriggerWorkflowOptions,
28
12
  ChildWorkflowRunDict,
29
13
  TriggerWorkflowOptions,
30
14
  WorkflowRunDict,
31
15
  )
32
- from ..clients.dispatcher.dispatcher import ( # type: ignore[attr-defined]
16
+ from hatchet_sdk.clients.dispatcher.dispatcher import ( # type: ignore[attr-defined]
33
17
  Action,
34
18
  DispatcherClient,
35
19
  )
36
- from ..logger import logger
20
+ from hatchet_sdk.clients.events import EventClient
21
+ from hatchet_sdk.clients.rest.tenacity_utils import tenacity_retry
22
+ from hatchet_sdk.clients.rest_client import RestApi
23
+ from hatchet_sdk.clients.run_event_listener import RunEventListenerClient
24
+ from hatchet_sdk.clients.workflow_listener import PooledWorkflowRunListener
25
+ from hatchet_sdk.context.worker_context import WorkerContext
26
+ from hatchet_sdk.contracts.dispatcher_pb2 import OverridesData
27
+ from hatchet_sdk.logger import logger
28
+ from hatchet_sdk.utils.typing import JSONSerializableMapping, WorkflowValidator
29
+ from hatchet_sdk.workflow_run import WorkflowRunRef
37
30
 
38
31
  DEFAULT_WORKFLOW_POLLING_INTERVAL = 5 # Seconds
39
32
 
40
- T = TypeVar("T", bound=BaseModel)
41
-
42
33
 
43
34
  def get_caller_file_path() -> str:
44
35
  caller_frame = inspect.stack()[2]
@@ -46,125 +37,15 @@ def get_caller_file_path() -> str:
46
37
  return caller_frame.filename
47
38
 
48
39
 
49
- class BaseContext:
50
-
51
- action: Action
52
- spawn_index: int
53
-
54
- def _prepare_workflow_options(
55
- self,
56
- key: str | None = None,
57
- options: ChildTriggerWorkflowOptions | None = None,
58
- worker_id: str | None = None,
59
- ) -> TriggerWorkflowOptions:
60
- workflow_run_id = self.action.workflow_run_id
61
- step_run_id = self.action.step_run_id
62
-
63
- desired_worker_id = None
64
- if options is not None and "sticky" in options and options["sticky"] == True:
65
- desired_worker_id = worker_id
66
-
67
- meta = None
68
- if options is not None and "additional_metadata" in options:
69
- meta = options["additional_metadata"]
70
-
71
- ## TODO: Pydantic here to simplify this
72
- trigger_options: TriggerWorkflowOptions = {
73
- "parent_id": workflow_run_id,
74
- "parent_step_run_id": step_run_id,
75
- "child_key": key,
76
- "child_index": self.spawn_index,
77
- "additional_metadata": meta,
78
- "desired_worker_id": desired_worker_id,
79
- }
80
-
81
- self.spawn_index += 1
82
- return trigger_options
83
-
84
-
85
- class ContextAioImpl(BaseContext):
86
- def __init__(
87
- self,
88
- action: Action,
89
- dispatcher_client: DispatcherClient,
90
- admin_client: AdminClient,
91
- event_client: EventClient,
92
- rest_client: RestApi,
93
- workflow_listener: PooledWorkflowRunListener,
94
- workflow_run_event_listener: RunEventListenerClient,
95
- worker: WorkerContext,
96
- namespace: str = "",
97
- ):
98
- self.action = action
99
- self.dispatcher_client = dispatcher_client
100
- self.admin_client = admin_client
101
- self.event_client = event_client
102
- self.rest_client = rest_client
103
- self.workflow_listener = workflow_listener
104
- self.workflow_run_event_listener = workflow_run_event_listener
105
- self.namespace = namespace
106
- self.spawn_index = -1
107
- self.worker = worker
108
-
109
- @tenacity_retry
110
- async def spawn_workflow(
111
- self,
112
- workflow_name: str,
113
- input: dict[str, Any] = {},
114
- key: str | None = None,
115
- options: ChildTriggerWorkflowOptions | None = None,
116
- ) -> WorkflowRunRef:
117
- worker_id = self.worker.id()
118
- # if (
119
- # options is not None
120
- # and "sticky" in options
121
- # and options["sticky"] == True
122
- # and not self.worker.has_workflow(workflow_name)
123
- # ):
124
- # raise Exception(
125
- # f"cannot run with sticky: workflow {workflow_name} is not registered on the worker"
126
- # )
127
-
128
- trigger_options = self._prepare_workflow_options(key, options, worker_id)
40
+ class StepRunError(BaseModel):
41
+ step_id: str
42
+ step_run_action_name: str
43
+ error: str
129
44
 
130
- return await self.admin_client.aio.run_workflow(
131
- workflow_name, input, trigger_options
132
- )
133
45
 
134
- @tenacity_retry
135
- async def spawn_workflows(
136
- self, child_workflow_runs: list[ChildWorkflowRunDict]
137
- ) -> list[WorkflowRunRef]:
138
-
139
- if len(child_workflow_runs) == 0:
140
- raise Exception("no child workflows to spawn")
141
-
142
- worker_id = self.worker.id()
143
-
144
- bulk_trigger_workflow_runs: list[WorkflowRunDict] = []
145
- for child_workflow_run in child_workflow_runs:
146
- workflow_name = child_workflow_run["workflow_name"]
147
- input = child_workflow_run["input"]
148
-
149
- key = child_workflow_run.get("key")
150
- options = child_workflow_run.get("options", {})
151
-
152
- trigger_options = self._prepare_workflow_options(key, options, worker_id)
153
-
154
- bulk_trigger_workflow_runs.append(
155
- WorkflowRunDict(
156
- workflow_name=workflow_name, input=input, options=trigger_options
157
- )
158
- )
159
-
160
- return await self.admin_client.aio.run_workflows(bulk_trigger_workflow_runs)
161
-
162
-
163
- class Context(BaseContext):
46
+ class Context:
164
47
  spawn_index = -1
165
48
 
166
- worker: WorkerContext
167
-
168
49
  def __init__(
169
50
  self,
170
51
  action: Action,
@@ -172,7 +53,7 @@ class Context(BaseContext):
172
53
  admin_client: AdminClient,
173
54
  event_client: EventClient,
174
55
  rest_client: RestApi,
175
- workflow_listener: PooledWorkflowRunListener,
56
+ workflow_listener: PooledWorkflowRunListener | None,
176
57
  workflow_run_event_listener: RunEventListenerClient,
177
58
  worker: WorkerContext,
178
59
  namespace: str = "",
@@ -181,38 +62,14 @@ class Context(BaseContext):
181
62
  self.worker = worker
182
63
  self.validator_registry = validator_registry
183
64
 
184
- self.aio = ContextAioImpl(
185
- action,
186
- dispatcher_client,
187
- admin_client,
188
- event_client,
189
- rest_client,
190
- workflow_listener,
191
- workflow_run_event_listener,
192
- worker,
193
- namespace,
194
- )
195
-
196
- # Check the type of action.action_payload before attempting to load it as JSON
197
- if isinstance(action.action_payload, (str, bytes, bytearray)):
198
- try:
199
- self.data = cast(dict[str, Any], json.loads(action.action_payload))
200
- except Exception as e:
201
- logger.error(f"Error parsing action payload: {e}")
202
- # Assign an empty dictionary if parsing fails
203
- self.data: dict[str, Any] = {} # type: ignore[no-redef]
204
- else:
205
- # Directly assign the payload to self.data if it's already a dict
206
- self.data = (
207
- action.action_payload if isinstance(action.action_payload, dict) else {}
208
- )
65
+ self.data = action.action_payload
209
66
 
210
67
  self.action = action
211
68
 
212
69
  # FIXME: stepRunId is a legacy field, we should remove it
213
70
  self.stepRunId = action.step_run_id
214
71
 
215
- self.step_run_id = action.step_run_id
72
+ self.step_run_id: str = action.step_run_id
216
73
  self.exit_flag = False
217
74
  self.dispatcher_client = dispatcher_client
218
75
  self.admin_client = admin_client
@@ -227,14 +84,28 @@ class Context(BaseContext):
227
84
  self.logger_thread_pool = ThreadPoolExecutor(max_workers=1)
228
85
  self.stream_event_thread_pool = ThreadPoolExecutor(max_workers=1)
229
86
 
230
- # store each key in the overrides field in a lookup table
231
- # overrides_data is a dictionary of key-value pairs
232
- self.overrides_data = self.data.get("overrides", {})
87
+ self.input = self.data.input
233
88
 
234
- if action.get_group_key_run_id != "":
235
- self.input = self.data
236
- else:
237
- self.input = self.data.get("input", {})
89
+ def _prepare_workflow_options(
90
+ self,
91
+ key: str | None = None,
92
+ options: ChildTriggerWorkflowOptions = ChildTriggerWorkflowOptions(),
93
+ worker_id: str | None = None,
94
+ ) -> TriggerWorkflowOptions:
95
+ workflow_run_id = self.action.workflow_run_id
96
+ step_run_id = self.action.step_run_id
97
+
98
+ trigger_options = TriggerWorkflowOptions(
99
+ parent_id=workflow_run_id,
100
+ parent_step_run_id=step_run_id,
101
+ child_key=key,
102
+ child_index=self.spawn_index,
103
+ additional_metadata=options.additional_metadata,
104
+ desired_worker_id=worker_id if options.sticky else None,
105
+ )
106
+
107
+ self.spawn_index += 1
108
+ return trigger_options
238
109
 
239
110
  def step_output(self, step: str) -> dict[str, Any] | BaseModel:
240
111
  workflow_validator = next(
@@ -243,7 +114,7 @@ class Context(BaseContext):
243
114
  )
244
115
 
245
116
  try:
246
- parent_step_data = cast(dict[str, Any], self.data["parents"][step])
117
+ parent_step_data = cast(dict[str, Any], self.data.parents[step])
247
118
  except KeyError:
248
119
  raise ValueError(f"Step output for '{step}' not found")
249
120
 
@@ -252,20 +123,15 @@ class Context(BaseContext):
252
123
 
253
124
  return parent_step_data
254
125
 
126
+ @property
255
127
  def triggered_by_event(self) -> bool:
256
- return cast(str, self.data.get("triggered_by", "")) == "event"
257
-
258
- def workflow_input(self) -> dict[str, Any] | T:
259
- if (r := self.validator_registry.get(self.action.action_id)) and (
260
- i := r.workflow_input
261
- ):
262
- return cast(
263
- T,
264
- i.model_validate(self.input),
265
- )
128
+ return self.data.triggered_by == "event"
266
129
 
130
+ @property
131
+ def workflow_input(self) -> JSONSerializableMapping:
267
132
  return self.input
268
133
 
134
+ @property
269
135
  def workflow_run_id(self) -> str:
270
136
  return self.action.workflow_run_id
271
137
 
@@ -278,15 +144,6 @@ class Context(BaseContext):
278
144
  return self.exit_flag
279
145
 
280
146
  def playground(self, name: str, default: str | None = None) -> str | None:
281
- # if the key exists in the overrides_data field, return the value
282
- if name in self.overrides_data:
283
- warn(
284
- "Use of `overrides_data` is deprecated.",
285
- DeprecationWarning,
286
- stacklevel=1,
287
- )
288
- return str(self.overrides_data[name])
289
-
290
147
  caller_file = get_caller_file_path()
291
148
 
292
149
  self.dispatcher_client.put_overrides_data(
@@ -308,7 +165,9 @@ class Context(BaseContext):
308
165
  # we don't want to raise an exception here, as it will kill the log thread
309
166
  return False, e
310
167
 
311
- def log(self, line: Any, raise_on_error: bool = False) -> None:
168
+ def log(
169
+ self, line: str | JSONSerializableMapping, raise_on_error: bool = False
170
+ ) -> None:
312
171
  if self.stepRunId == "":
313
172
  return
314
173
 
@@ -361,23 +220,29 @@ class Context(BaseContext):
361
220
  except Exception as e:
362
221
  logger.error(f"Error refreshing timeout: {e}")
363
222
 
223
+ @property
364
224
  def retry_count(self) -> int:
365
225
  return self.action.retry_count
366
226
 
367
- def additional_metadata(self) -> dict[str, Any] | None:
227
+ @property
228
+ def additional_metadata(self) -> JSONSerializableMapping | None:
368
229
  return self.action.additional_metadata
369
230
 
231
+ @property
370
232
  def child_index(self) -> int | None:
371
233
  return self.action.child_workflow_index
372
234
 
235
+ @property
373
236
  def child_key(self) -> str | None:
374
237
  return self.action.child_workflow_key
375
238
 
239
+ @property
376
240
  def parent_workflow_run_id(self) -> str | None:
377
241
  return self.action.parent_workflow_run_id
378
242
 
243
+ @property
379
244
  def step_run_errors(self) -> dict[str, str]:
380
- errors = cast(dict[str, str], self.data.get("step_run_errors", {}))
245
+ errors = self.data.step_run_errors
381
246
 
382
247
  if not errors:
383
248
  logger.error(
@@ -386,18 +251,18 @@ class Context(BaseContext):
386
251
 
387
252
  return errors
388
253
 
389
- def fetch_run_failures(self) -> list[dict[str, StrictStr]]:
254
+ def fetch_run_failures(self) -> list[StepRunError]:
390
255
  data = self.rest_client.workflow_run_get(self.action.workflow_run_id)
391
256
  other_job_runs = [
392
257
  run for run in (data.job_runs or []) if run.job_id != self.action.job_id
393
258
  ]
394
- # TODO: Parse Step Runs using a Pydantic Model rather than a hand crafted dictionary
259
+
395
260
  return [
396
- {
397
- "step_id": step_run.step_id,
398
- "step_run_action_name": step_run.step.action,
399
- "error": step_run.error,
400
- }
261
+ StepRunError(
262
+ step_id=step_run.step_id,
263
+ step_run_action_name=step_run.step.action,
264
+ error=step_run.error,
265
+ )
401
266
  for job_run in other_job_runs
402
267
  if job_run.step_runs
403
268
  for step_run in job_run.step_runs
@@ -405,20 +270,23 @@ class Context(BaseContext):
405
270
  ]
406
271
 
407
272
  @tenacity_retry
408
- def spawn_workflow(
273
+ async def aio_spawn_workflow(
409
274
  self,
410
275
  workflow_name: str,
411
- input: dict[str, Any] = {},
276
+ input: JSONSerializableMapping = {},
412
277
  key: str | None = None,
413
- options: ChildTriggerWorkflowOptions | None = None,
278
+ options: ChildTriggerWorkflowOptions = ChildTriggerWorkflowOptions(),
414
279
  ) -> WorkflowRunRef:
415
280
  worker_id = self.worker.id()
281
+
416
282
  trigger_options = self._prepare_workflow_options(key, options, worker_id)
417
283
 
418
- return self.admin_client.run_workflow(workflow_name, input, trigger_options)
284
+ return await self.admin_client.aio_run_workflow(
285
+ workflow_name, input, trigger_options
286
+ )
419
287
 
420
288
  @tenacity_retry
421
- def spawn_workflows(
289
+ async def aio_spawn_workflows(
422
290
  self, child_workflow_runs: list[ChildWorkflowRunDict]
423
291
  ) -> list[WorkflowRunRef]:
424
292
 
@@ -427,20 +295,52 @@ class Context(BaseContext):
427
295
 
428
296
  worker_id = self.worker.id()
429
297
 
430
- bulk_trigger_workflow_runs: list[WorkflowRunDict] = []
431
- for child_workflow_run in child_workflow_runs:
432
- workflow_name = child_workflow_run["workflow_name"]
433
- input = child_workflow_run["input"]
298
+ bulk_trigger_workflow_runs = [
299
+ WorkflowRunDict(
300
+ workflow_name=child_workflow_run.workflow_name,
301
+ input=child_workflow_run.input,
302
+ options=self._prepare_workflow_options(
303
+ child_workflow_run.key, child_workflow_run.options, worker_id
304
+ ),
305
+ )
306
+ for child_workflow_run in child_workflow_runs
307
+ ]
434
308
 
435
- key = child_workflow_run.get("key")
436
- options = child_workflow_run.get("options", {})
309
+ return await self.admin_client.aio_run_workflows(bulk_trigger_workflow_runs)
437
310
 
438
- trigger_options = self._prepare_workflow_options(key, options, worker_id)
311
+ @tenacity_retry
312
+ def spawn_workflow(
313
+ self,
314
+ workflow_name: str,
315
+ input: JSONSerializableMapping = {},
316
+ key: str | None = None,
317
+ options: ChildTriggerWorkflowOptions = ChildTriggerWorkflowOptions(),
318
+ ) -> WorkflowRunRef:
319
+ worker_id = self.worker.id()
320
+
321
+ trigger_options = self._prepare_workflow_options(key, options, worker_id)
322
+
323
+ return self.admin_client.run_workflow(workflow_name, input, trigger_options)
324
+
325
+ @tenacity_retry
326
+ def spawn_workflows(
327
+ self, child_workflow_runs: list[ChildWorkflowRunDict]
328
+ ) -> list[WorkflowRunRef]:
329
+
330
+ if len(child_workflow_runs) == 0:
331
+ raise Exception("no child workflows to spawn")
332
+
333
+ worker_id = self.worker.id()
439
334
 
440
- bulk_trigger_workflow_runs.append(
441
- WorkflowRunDict(
442
- workflow_name=workflow_name, input=input, options=trigger_options
443
- )
335
+ bulk_trigger_workflow_runs = [
336
+ WorkflowRunDict(
337
+ workflow_name=child_workflow_run.workflow_name,
338
+ input=child_workflow_run.input,
339
+ options=self._prepare_workflow_options(
340
+ child_workflow_run.key, child_workflow_run.options, worker_id
341
+ ),
444
342
  )
343
+ for child_workflow_run in child_workflow_runs
344
+ ]
445
345
 
446
346
  return self.admin_client.run_workflows(bulk_trigger_workflow_runs)