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
hatchet_sdk/hatchet.py CHANGED
@@ -1,197 +1,35 @@
1
1
  import asyncio
2
2
  import logging
3
- from typing import Any, Callable, Optional, ParamSpec, Type, TypeVar, Union
4
-
5
- from pydantic import BaseModel
6
- from typing_extensions import deprecated
3
+ from typing import Any, Callable, Type, cast, overload
7
4
 
5
+ from hatchet_sdk import Context, DurableContext
6
+ from hatchet_sdk.client import Client
7
+ from hatchet_sdk.clients.admin import AdminClient
8
+ from hatchet_sdk.clients.dispatcher.dispatcher import DispatcherClient
9
+ from hatchet_sdk.clients.events import EventClient
8
10
  from hatchet_sdk.clients.rest_client import RestApi
9
- from hatchet_sdk.context.context import Context
10
- from hatchet_sdk.contracts.workflows_pb2 import (
11
- ConcurrencyLimitStrategy,
12
- CreateStepRateLimit,
13
- DesiredWorkerLabels,
14
- StickyStrategy,
15
- )
11
+ from hatchet_sdk.clients.run_event_listener import RunEventListenerClient
12
+ from hatchet_sdk.config import ClientConfig
16
13
  from hatchet_sdk.features.cron import CronClient
17
14
  from hatchet_sdk.features.scheduled import ScheduledClient
18
15
  from hatchet_sdk.labels import DesiredWorkerLabel
19
- from hatchet_sdk.loader import ClientConfig, ConfigLoader
16
+ from hatchet_sdk.logger import logger
20
17
  from hatchet_sdk.rate_limit import RateLimit
21
- from hatchet_sdk.v2.callable import HatchetCallable
22
-
23
- from .client import Client, new_client, new_client_raw
24
- from .clients.admin import AdminClient
25
- from .clients.dispatcher.dispatcher import DispatcherClient
26
- from .clients.events import EventClient
27
- from .clients.run_event_listener import RunEventListenerClient
28
- from .logger import logger
29
- from .worker.worker import Worker
30
- from .workflow import (
18
+ from hatchet_sdk.runnables.standalone import Standalone
19
+ from hatchet_sdk.runnables.types import (
20
+ DEFAULT_EXECUTION_TIMEOUT,
21
+ DEFAULT_SCHEDULE_TIMEOUT,
31
22
  ConcurrencyExpression,
32
- WorkflowInterface,
33
- WorkflowMeta,
34
- WorkflowStepProtocol,
23
+ EmptyModel,
24
+ R,
25
+ StickyStrategy,
26
+ TaskDefaults,
27
+ TWorkflowInput,
28
+ WorkflowConfig,
35
29
  )
36
-
37
- T = TypeVar("T", bound=BaseModel)
38
- R = TypeVar("R")
39
- P = ParamSpec("P")
40
-
41
- TWorkflow = TypeVar("TWorkflow", bound=object)
42
-
43
-
44
- def workflow(
45
- name: str = "",
46
- on_events: list[str] | None = None,
47
- on_crons: list[str] | None = None,
48
- version: str = "",
49
- timeout: str = "60m",
50
- schedule_timeout: str = "5m",
51
- sticky: Union[StickyStrategy.Value, None] = None, # type: ignore[name-defined]
52
- default_priority: int | None = None,
53
- concurrency: ConcurrencyExpression | None = None,
54
- input_validator: Type[T] | None = None,
55
- ) -> Callable[[Type[TWorkflow]], WorkflowMeta]:
56
- on_events = on_events or []
57
- on_crons = on_crons or []
58
-
59
- def inner(cls: Type[TWorkflow]) -> WorkflowMeta:
60
- nonlocal name
61
- name = name or str(cls.__name__)
62
-
63
- setattr(cls, "on_events", on_events)
64
- setattr(cls, "on_crons", on_crons)
65
- setattr(cls, "name", name)
66
- setattr(cls, "version", version)
67
- setattr(cls, "timeout", timeout)
68
- setattr(cls, "schedule_timeout", schedule_timeout)
69
- setattr(cls, "sticky", sticky)
70
- setattr(cls, "default_priority", default_priority)
71
- setattr(cls, "concurrency_expression", concurrency)
72
-
73
- # Define a new class with the same name and bases as the original, but
74
- # with WorkflowMeta as its metaclass
75
-
76
- ## TODO: Figure out how to type this metaclass correctly
77
- setattr(cls, "input_validator", input_validator)
78
-
79
- return WorkflowMeta(name, cls.__bases__, dict(cls.__dict__))
80
-
81
- return inner
82
-
83
-
84
- def step(
85
- name: str = "",
86
- timeout: str = "",
87
- parents: list[str] | None = None,
88
- retries: int = 0,
89
- rate_limits: list[RateLimit] | None = None,
90
- desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
91
- backoff_factor: float | None = None,
92
- backoff_max_seconds: int | None = None,
93
- ) -> Callable[[Callable[P, R]], Callable[P, R]]:
94
- parents = parents or []
95
-
96
- def inner(func: Callable[P, R]) -> Callable[P, R]:
97
- limits = None
98
- if rate_limits:
99
- limits = [rate_limit._req for rate_limit in rate_limits or []]
100
-
101
- setattr(func, "_step_name", name.lower() or str(func.__name__).lower())
102
- setattr(func, "_step_parents", parents)
103
- setattr(func, "_step_timeout", timeout)
104
- setattr(func, "_step_retries", retries)
105
- setattr(func, "_step_rate_limits", limits)
106
- setattr(func, "_step_backoff_factor", backoff_factor)
107
- setattr(func, "_step_backoff_max_seconds", backoff_max_seconds)
108
-
109
- def create_label(d: DesiredWorkerLabel) -> DesiredWorkerLabels:
110
- value = d["value"] if "value" in d else None
111
- return DesiredWorkerLabels(
112
- strValue=str(value) if not isinstance(value, int) else None,
113
- intValue=value if isinstance(value, int) else None,
114
- required=d["required"] if "required" in d else None, # type: ignore[arg-type]
115
- weight=d["weight"] if "weight" in d else None,
116
- comparator=d["comparator"] if "comparator" in d else None, # type: ignore[arg-type]
117
- )
118
-
119
- setattr(
120
- func,
121
- "_step_desired_worker_labels",
122
- {key: create_label(d) for key, d in desired_worker_labels.items()},
123
- )
124
-
125
- return func
126
-
127
- return inner
128
-
129
-
130
- def on_failure_step(
131
- name: str = "",
132
- timeout: str = "",
133
- retries: int = 0,
134
- rate_limits: list[RateLimit] | None = None,
135
- backoff_factor: float | None = None,
136
- backoff_max_seconds: int | None = None,
137
- ) -> Callable[..., Any]:
138
- def inner(func: Callable[[Context], Any]) -> Callable[[Context], Any]:
139
- limits = None
140
- if rate_limits:
141
- limits = [
142
- CreateStepRateLimit(key=rate_limit.static_key, units=rate_limit.units) # type: ignore[arg-type]
143
- for rate_limit in rate_limits or []
144
- ]
145
-
146
- setattr(
147
- func, "_on_failure_step_name", name.lower() or str(func.__name__).lower()
148
- )
149
- setattr(func, "_on_failure_step_timeout", timeout)
150
- setattr(func, "_on_failure_step_retries", retries)
151
- setattr(func, "_on_failure_step_rate_limits", limits)
152
- setattr(func, "_on_failure_step_backoff_factor", backoff_factor)
153
- setattr(func, "_on_failure_step_backoff_max_seconds", backoff_max_seconds)
154
-
155
- return func
156
-
157
- return inner
158
-
159
-
160
- def concurrency(
161
- name: str = "",
162
- max_runs: int = 1,
163
- limit_strategy: ConcurrencyLimitStrategy = ConcurrencyLimitStrategy.CANCEL_IN_PROGRESS,
164
- ) -> Callable[..., Any]:
165
- def inner(func: Callable[[Context], Any]) -> Callable[[Context], Any]:
166
- setattr(
167
- func,
168
- "_concurrency_fn_name",
169
- name.lower() or str(func.__name__).lower(),
170
- )
171
- setattr(func, "_concurrency_max_runs", max_runs)
172
- setattr(func, "_concurrency_limit_strategy", limit_strategy)
173
-
174
- return func
175
-
176
- return inner
177
-
178
-
179
- class HatchetRest:
180
- """
181
- Main client for interacting with the Hatchet API.
182
-
183
- This class provides access to various client interfaces and utility methods
184
- for working with Hatchet via the REST API,
185
-
186
- Attributes:
187
- rest (RestApi): Interface for REST API operations.
188
- """
189
-
190
- rest: RestApi
191
-
192
- def __init__(self, config: ClientConfig = ClientConfig()):
193
- _config: ClientConfig = ConfigLoader(".").load_client_config(config)
194
- self.rest = RestApi(_config.server_url, _config.token, _config.tenant_id)
30
+ from hatchet_sdk.runnables.workflow import BaseWorkflow, Workflow
31
+ from hatchet_sdk.utils.timedelta_to_expression import Duration
32
+ from hatchet_sdk.worker.worker import Worker
195
33
 
196
34
 
197
35
  class Hatchet:
@@ -214,48 +52,32 @@ class Hatchet:
214
52
  cron: CronClient
215
53
  scheduled: ScheduledClient
216
54
 
217
- @classmethod
218
- def from_environment(
219
- cls, defaults: ClientConfig = ClientConfig(), **kwargs: Any
220
- ) -> "Hatchet":
221
- return cls(client=new_client(defaults), **kwargs)
222
-
223
- @classmethod
224
- def from_config(cls, config: ClientConfig, **kwargs: Any) -> "Hatchet":
225
- return cls(client=new_client_raw(config), **kwargs)
226
-
227
55
  def __init__(
228
56
  self,
229
57
  debug: bool = False,
230
- client: Optional[Client] = None,
58
+ client: Client | None = None,
231
59
  config: ClientConfig = ClientConfig(),
232
60
  ):
233
61
  """
234
62
  Initialize a new Hatchet instance.
235
63
 
236
- Args:
237
- debug (bool, optional): Enable debug logging. Defaults to False.
238
- client (Optional[Client], optional): A pre-configured Client instance. Defaults to None.
239
- config (ClientConfig, optional): Configuration for creating a new Client. Defaults to ClientConfig().
64
+ :param debug: Enable debug logging. Default: `False`
65
+ :type debug: bool
66
+
67
+ :param client: A pre-configured `Client` instance. Default: `None`.
68
+ :type client: Client | None
69
+
70
+ :param config: Configuration for creating a new Client. Defaults to ClientConfig()
71
+ :type config: ClientConfig
240
72
  """
241
- if client is not None:
242
- self._client = client
243
- else:
244
- self._client = new_client(config, debug)
245
73
 
246
74
  if debug:
247
75
  logger.setLevel(logging.DEBUG)
248
76
 
77
+ self._client = client if client else Client(config=config, debug=debug)
249
78
  self.cron = CronClient(self._client)
250
79
  self.scheduled = ScheduledClient(self._client)
251
80
 
252
- @property
253
- @deprecated(
254
- "Direct access to client is deprecated and will be removed in a future version. Use specific client properties (Hatchet.admin, Hatchet.dispatcher, Hatchet.event, Hatchet.rest) instead. [0.32.0]",
255
- )
256
- def client(self) -> Client:
257
- return self._client
258
-
259
81
  @property
260
82
  def admin(self) -> AdminClient:
261
83
  return self._client.admin
@@ -284,17 +106,33 @@ class Hatchet:
284
106
  def tenant_id(self) -> str:
285
107
  return self._client.config.tenant_id
286
108
 
287
- concurrency = staticmethod(concurrency)
109
+ def worker(
110
+ self,
111
+ name: str,
112
+ slots: int = 100,
113
+ labels: dict[str, str | int] = {},
114
+ workflows: list[BaseWorkflow[Any]] = [],
115
+ ) -> Worker:
116
+ """
117
+ Create a Hatchet worker on which to run workflows.
288
118
 
289
- workflow = staticmethod(workflow)
119
+ :param name: The name of the worker.
120
+ :type name: str
290
121
 
291
- step = staticmethod(step)
122
+ :param slots: The number of workflow slots on the worker. In other words, the number of concurrent tasks the worker can run at any point in time. Default: 100
123
+ :type slots: int
292
124
 
293
- on_failure_step = staticmethod(on_failure_step)
125
+ :param labels: A dictionary of labels to assign to the worker. For more details, view examples on affinity and worker labels. Defaults to an empty dictionary (no labels)
126
+ :type labels: dict[str, str | int]
127
+
128
+ :param workflows: A list of workflows to register on the worker, as a shorthand for calling `register_workflow` on each or `register_workflows` on all of them. Defaults to an empty list
129
+ :type workflows: list[Workflow]
130
+
131
+
132
+ :returns: The created `Worker` object, which exposes an instance method `start` which can be called to start the worker.
133
+ :rtype: Worker
134
+ """
294
135
 
295
- def worker(
296
- self, name: str, max_runs: int | None = None, labels: dict[str, str | int] = {}
297
- ) -> Worker:
298
136
  try:
299
137
  loop = asyncio.get_running_loop()
300
138
  except RuntimeError:
@@ -302,9 +140,444 @@ class Hatchet:
302
140
 
303
141
  return Worker(
304
142
  name=name,
305
- max_runs=max_runs,
143
+ slots=slots,
306
144
  labels=labels,
307
145
  config=self._client.config,
308
146
  debug=self._client.debug,
309
147
  owned_loop=loop is None,
148
+ workflows=workflows,
310
149
  )
150
+
151
+ @overload
152
+ def workflow(
153
+ self,
154
+ *,
155
+ name: str,
156
+ description: str | None = None,
157
+ input_validator: None = None,
158
+ on_events: list[str] = [],
159
+ on_crons: list[str] = [],
160
+ version: str | None = None,
161
+ sticky: StickyStrategy | None = None,
162
+ default_priority: int = 1,
163
+ concurrency: ConcurrencyExpression | None = None,
164
+ task_defaults: TaskDefaults = TaskDefaults(),
165
+ ) -> Workflow[EmptyModel]: ...
166
+
167
+ @overload
168
+ def workflow(
169
+ self,
170
+ *,
171
+ name: str,
172
+ description: str | None = None,
173
+ input_validator: Type[TWorkflowInput],
174
+ on_events: list[str] = [],
175
+ on_crons: list[str] = [],
176
+ version: str | None = None,
177
+ sticky: StickyStrategy | None = None,
178
+ default_priority: int = 1,
179
+ concurrency: ConcurrencyExpression | None = None,
180
+ task_defaults: TaskDefaults = TaskDefaults(),
181
+ ) -> Workflow[TWorkflowInput]: ...
182
+
183
+ def workflow(
184
+ self,
185
+ *,
186
+ name: str,
187
+ description: str | None = None,
188
+ input_validator: Type[TWorkflowInput] | None = None,
189
+ on_events: list[str] = [],
190
+ on_crons: list[str] = [],
191
+ version: str | None = None,
192
+ sticky: StickyStrategy | None = None,
193
+ default_priority: int = 1,
194
+ concurrency: ConcurrencyExpression | None = None,
195
+ task_defaults: TaskDefaults = TaskDefaults(),
196
+ ) -> Workflow[EmptyModel] | Workflow[TWorkflowInput]:
197
+ """
198
+ Define a Hatchet workflow, which can then declare `task`s and be `run`, `schedule`d, and so on.
199
+
200
+ :param name: The name of the workflow.
201
+ :type name: str
202
+
203
+ :param description: A description for the workflow. Default: None
204
+ :type description: str | None
205
+
206
+ :param version: A version for the workflow. Default: None
207
+ :type version: str | None
208
+
209
+ :param input_validator: A Pydantic model to use as a validator for the `input` to the tasks in the workflow. If no validator is provided, defaults to an `EmptyModel` under the hood. The `EmptyModel` is a Pydantic model with no fields specified, and with the `extra` config option set to `"allow"`.
210
+ :type input_validator: Type[BaseModel]
211
+
212
+ :param on_events: A list of event triggers for the workflow - events which cause the workflow to be run. Defaults to an empty list, meaning the workflow will not be run on any event pushes.
213
+ :type on_events: list[str]
214
+
215
+ :param on_crons: A list of cron triggers for the workflow. Defaults to an empty list, meaning the workflow will not be run on any cron schedules.
216
+ :type on_crons: list[str]
217
+
218
+ :param sticky: A sticky strategy for the workflow. Default: `None`
219
+ :type sticky: StickyStategy
220
+
221
+ :param default_priority: The priority of the workflow. Higher values will cause this workflow to have priority in scheduling over other, lower priority ones. Default: `1`
222
+ :type default_priority: int
223
+
224
+ :param concurrency: A concurrency object controlling the concurrency settings for this workflow.
225
+ :type concurrency: ConcurrencyExpression | None
226
+
227
+ :param task_defaults: A `TaskDefaults` object controlling the default task settings for this workflow.
228
+ :type task_defaults: TaskDefaults
229
+
230
+ :returns: The created `Workflow` object, which can be used to declare tasks, run the workflow, and so on.
231
+ :rtype: Workflow
232
+ """
233
+
234
+ return Workflow[TWorkflowInput](
235
+ WorkflowConfig(
236
+ name=name,
237
+ version=version,
238
+ description=description,
239
+ on_events=on_events,
240
+ on_crons=on_crons,
241
+ sticky=sticky,
242
+ concurrency=concurrency,
243
+ input_validator=input_validator
244
+ or cast(Type[TWorkflowInput], EmptyModel),
245
+ task_defaults=task_defaults,
246
+ ),
247
+ self,
248
+ )
249
+
250
+ @overload
251
+ def task(
252
+ self,
253
+ *,
254
+ name: str,
255
+ description: str | None = None,
256
+ input_validator: None = None,
257
+ on_events: list[str] = [],
258
+ on_crons: list[str] = [],
259
+ version: str | None = None,
260
+ sticky: StickyStrategy | None = None,
261
+ default_priority: int = 1,
262
+ concurrency: ConcurrencyExpression | None = None,
263
+ schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
264
+ execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
265
+ retries: int = 0,
266
+ rate_limits: list[RateLimit] = [],
267
+ desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
268
+ backoff_factor: float | None = None,
269
+ backoff_max_seconds: int | None = None,
270
+ ) -> Callable[[Callable[[EmptyModel, Context], R]], Standalone[EmptyModel, R]]: ...
271
+
272
+ @overload
273
+ def task(
274
+ self,
275
+ *,
276
+ name: str,
277
+ description: str | None = None,
278
+ input_validator: Type[TWorkflowInput],
279
+ on_events: list[str] = [],
280
+ on_crons: list[str] = [],
281
+ version: str | None = None,
282
+ sticky: StickyStrategy | None = None,
283
+ default_priority: int = 1,
284
+ concurrency: ConcurrencyExpression | None = None,
285
+ schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
286
+ execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
287
+ retries: int = 0,
288
+ rate_limits: list[RateLimit] = [],
289
+ desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
290
+ backoff_factor: float | None = None,
291
+ backoff_max_seconds: int | None = None,
292
+ ) -> Callable[
293
+ [Callable[[TWorkflowInput, Context], R]], Standalone[TWorkflowInput, R]
294
+ ]: ...
295
+
296
+ def task(
297
+ self,
298
+ *,
299
+ name: str,
300
+ description: str | None = None,
301
+ input_validator: Type[TWorkflowInput] | None = None,
302
+ on_events: list[str] = [],
303
+ on_crons: list[str] = [],
304
+ version: str | None = None,
305
+ sticky: StickyStrategy | None = None,
306
+ default_priority: int = 1,
307
+ concurrency: ConcurrencyExpression | None = None,
308
+ schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
309
+ execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
310
+ retries: int = 0,
311
+ rate_limits: list[RateLimit] = [],
312
+ desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
313
+ backoff_factor: float | None = None,
314
+ backoff_max_seconds: int | None = None,
315
+ ) -> (
316
+ Callable[[Callable[[EmptyModel, Context], R]], Standalone[EmptyModel, R]]
317
+ | Callable[
318
+ [Callable[[TWorkflowInput, Context], R]], Standalone[TWorkflowInput, R]
319
+ ]
320
+ ):
321
+ """
322
+ A decorator to transform a function into a standalone Hatchet task that runs as part of a workflow.
323
+
324
+ :param name: The name of the task. If not specified, defaults to the name of the function being wrapped by the `task` decorator.
325
+ :type name: str
326
+
327
+ :param description: An optional description for the task. Default: None
328
+ :type description: str | None
329
+
330
+ :param input_validator: A Pydantic model to use as a validator for the input to the task. If no validator is provided, defaults to an `EmptyModel`.
331
+ :type input_validator: Type[BaseModel]
332
+
333
+ :param on_events: A list of event triggers for the task - events which cause the task to be run. Defaults to an empty list.
334
+ :type on_events: list[str]
335
+
336
+ :param on_crons: A list of cron triggers for the task. Defaults to an empty list.
337
+ :type on_crons: list[str]
338
+
339
+ :param version: A version for the task. Default: None
340
+ :type version: str | None
341
+
342
+ :param sticky: A sticky strategy for the task. Default: None
343
+ :type sticky: StickyStrategy | None
344
+
345
+ :param default_priority: The priority of the task. Higher values will cause this task to have priority in scheduling. Default: 1
346
+ :type default_priority: int
347
+
348
+ :param concurrency: A concurrency object controlling the concurrency settings for this task.
349
+ :type concurrency: ConcurrencyExpression | None
350
+
351
+ :param schedule_timeout: The maximum time allowed for scheduling the task. Default: DEFAULT_SCHEDULE_TIMEOUT
352
+ :type schedule_timeout: Duration
353
+
354
+ :param execution_timeout: The maximum time allowed for executing the task. Default: DEFAULT_EXECUTION_TIMEOUT
355
+ :type execution_timeout: Duration
356
+
357
+ :param retries: The number of times to retry the task before failing. Default: 0
358
+ :type retries: int
359
+
360
+ :param rate_limits: A list of rate limit configurations for the task. Defaults to an empty list.
361
+ :type rate_limits: list[RateLimit]
362
+
363
+ :param desired_worker_labels: A dictionary of desired worker labels that determine to which worker the task should be assigned.
364
+ :type desired_worker_labels: dict[str, DesiredWorkerLabel]
365
+
366
+ :param backoff_factor: The backoff factor for controlling exponential backoff in retries. Default: None
367
+ :type backoff_factor: float | None
368
+
369
+ :param backoff_max_seconds: The maximum number of seconds to allow retries with exponential backoff to continue. Default: None
370
+ :type backoff_max_seconds: int | None
371
+
372
+ :returns: A decorator which creates a `Standalone` task object.
373
+ :rtype: Callable[[Callable[[TWorkflowInput, Context], R]], Standalone[TWorkflowInput, R]]
374
+ """
375
+
376
+ workflow = Workflow[TWorkflowInput](
377
+ WorkflowConfig(
378
+ name=name,
379
+ version=version,
380
+ description=description,
381
+ on_events=on_events,
382
+ on_crons=on_crons,
383
+ sticky=sticky,
384
+ concurrency=concurrency,
385
+ input_validator=input_validator
386
+ or cast(Type[TWorkflowInput], EmptyModel),
387
+ ),
388
+ self,
389
+ )
390
+
391
+ task_wrapper = workflow.task(
392
+ name=name,
393
+ schedule_timeout=schedule_timeout,
394
+ execution_timeout=execution_timeout,
395
+ parents=[],
396
+ retries=retries,
397
+ rate_limits=rate_limits,
398
+ desired_worker_labels=desired_worker_labels,
399
+ backoff_factor=backoff_factor,
400
+ backoff_max_seconds=backoff_max_seconds,
401
+ concurrency=[concurrency] if concurrency else [],
402
+ )
403
+
404
+ def inner(
405
+ func: Callable[[TWorkflowInput, Context], R]
406
+ ) -> Standalone[TWorkflowInput, R]:
407
+ created_task = task_wrapper(func)
408
+
409
+ return Standalone[TWorkflowInput, R](
410
+ workflow=workflow,
411
+ task=created_task,
412
+ )
413
+
414
+ return inner
415
+
416
+ @overload
417
+ def durable_task(
418
+ self,
419
+ *,
420
+ name: str,
421
+ description: str | None = None,
422
+ input_validator: None = None,
423
+ on_events: list[str] = [],
424
+ on_crons: list[str] = [],
425
+ version: str | None = None,
426
+ sticky: StickyStrategy | None = None,
427
+ default_priority: int = 1,
428
+ concurrency: ConcurrencyExpression | None = None,
429
+ schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
430
+ execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
431
+ retries: int = 0,
432
+ rate_limits: list[RateLimit] = [],
433
+ desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
434
+ backoff_factor: float | None = None,
435
+ backoff_max_seconds: int | None = None,
436
+ ) -> Callable[
437
+ [Callable[[EmptyModel, DurableContext], R]], Standalone[EmptyModel, R]
438
+ ]: ...
439
+
440
+ @overload
441
+ def durable_task(
442
+ self,
443
+ *,
444
+ name: str,
445
+ description: str | None = None,
446
+ input_validator: Type[TWorkflowInput],
447
+ on_events: list[str] = [],
448
+ on_crons: list[str] = [],
449
+ version: str | None = None,
450
+ sticky: StickyStrategy | None = None,
451
+ default_priority: int = 1,
452
+ concurrency: ConcurrencyExpression | None = None,
453
+ schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
454
+ execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
455
+ retries: int = 0,
456
+ rate_limits: list[RateLimit] = [],
457
+ desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
458
+ backoff_factor: float | None = None,
459
+ backoff_max_seconds: int | None = None,
460
+ ) -> Callable[
461
+ [Callable[[TWorkflowInput, DurableContext], R]], Standalone[TWorkflowInput, R]
462
+ ]: ...
463
+
464
+ def durable_task(
465
+ self,
466
+ *,
467
+ name: str,
468
+ description: str | None = None,
469
+ input_validator: Type[TWorkflowInput] | None = None,
470
+ on_events: list[str] = [],
471
+ on_crons: list[str] = [],
472
+ version: str | None = None,
473
+ sticky: StickyStrategy | None = None,
474
+ default_priority: int = 1,
475
+ concurrency: ConcurrencyExpression | None = None,
476
+ schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
477
+ execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
478
+ retries: int = 0,
479
+ rate_limits: list[RateLimit] = [],
480
+ desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
481
+ backoff_factor: float | None = None,
482
+ backoff_max_seconds: int | None = None,
483
+ ) -> (
484
+ Callable[[Callable[[EmptyModel, DurableContext], R]], Standalone[EmptyModel, R]]
485
+ | Callable[
486
+ [Callable[[TWorkflowInput, DurableContext], R]],
487
+ Standalone[TWorkflowInput, R],
488
+ ]
489
+ ):
490
+ """
491
+ A decorator to transform a function into a standalone Hatchet _durable_ task that runs as part of a workflow.
492
+
493
+ :param name: The name of the task. If not specified, defaults to the name of the function being wrapped by the `task` decorator.
494
+ :type name: str
495
+
496
+ :param description: An optional description for the task. Default: None
497
+ :type description: str | None
498
+
499
+ :param input_validator: A Pydantic model to use as a validator for the input to the task. If no validator is provided, defaults to an `EmptyModel`.
500
+ :type input_validator: Type[BaseModel]
501
+
502
+ :param on_events: A list of event triggers for the task - events which cause the task to be run. Defaults to an empty list.
503
+ :type on_events: list[str]
504
+
505
+ :param on_crons: A list of cron triggers for the task. Defaults to an empty list.
506
+ :type on_crons: list[str]
507
+
508
+ :param version: A version for the task. Default: None
509
+ :type version: str | None
510
+
511
+ :param sticky: A sticky strategy for the task. Default: None
512
+ :type sticky: StickyStrategy | None
513
+
514
+ :param default_priority: The priority of the task. Higher values will cause this task to have priority in scheduling. Default: 1
515
+ :type default_priority: int
516
+
517
+ :param concurrency: A concurrency object controlling the concurrency settings for this task.
518
+ :type concurrency: ConcurrencyExpression | None
519
+
520
+ :param schedule_timeout: The maximum time allowed for scheduling the task. Default: DEFAULT_SCHEDULE_TIMEOUT
521
+ :type schedule_timeout: Duration
522
+
523
+ :param execution_timeout: The maximum time allowed for executing the task. Default: DEFAULT_EXECUTION_TIMEOUT
524
+ :type execution_timeout: Duration
525
+
526
+ :param retries: The number of times to retry the task before failing. Default: 0
527
+ :type retries: int
528
+
529
+ :param rate_limits: A list of rate limit configurations for the task. Defaults to an empty list.
530
+ :type rate_limits: list[RateLimit]
531
+
532
+ :param desired_worker_labels: A dictionary of desired worker labels that determine to which worker the task should be assigned.
533
+ :type desired_worker_labels: dict[str, DesiredWorkerLabel]
534
+
535
+ :param backoff_factor: The backoff factor for controlling exponential backoff in retries. Default: None
536
+ :type backoff_factor: float | None
537
+
538
+ :param backoff_max_seconds: The maximum number of seconds to allow retries with exponential backoff to continue. Default: None
539
+ :type backoff_max_seconds: int | None
540
+
541
+ :returns: A decorator which creates a `Standalone` task object.
542
+ :rtype: Callable[[Callable[[TWorkflowInput, Context], R]], Standalone[TWorkflowInput, R]]
543
+ """
544
+
545
+ workflow = Workflow[TWorkflowInput](
546
+ WorkflowConfig(
547
+ name=name,
548
+ version=version,
549
+ description=description,
550
+ on_events=on_events,
551
+ on_crons=on_crons,
552
+ sticky=sticky,
553
+ concurrency=concurrency,
554
+ input_validator=input_validator
555
+ or cast(Type[TWorkflowInput], EmptyModel),
556
+ ),
557
+ self,
558
+ )
559
+
560
+ task_wrapper = workflow.durable_task(
561
+ name=name,
562
+ schedule_timeout=schedule_timeout,
563
+ execution_timeout=execution_timeout,
564
+ parents=[],
565
+ retries=retries,
566
+ rate_limits=rate_limits,
567
+ desired_worker_labels=desired_worker_labels,
568
+ backoff_factor=backoff_factor,
569
+ backoff_max_seconds=backoff_max_seconds,
570
+ concurrency=[concurrency] if concurrency else [],
571
+ )
572
+
573
+ def inner(
574
+ func: Callable[[TWorkflowInput, DurableContext], R]
575
+ ) -> Standalone[TWorkflowInput, R]:
576
+ created_task = task_wrapper(func)
577
+
578
+ return Standalone[TWorkflowInput, R](
579
+ workflow=workflow,
580
+ task=created_task,
581
+ )
582
+
583
+ return inner