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/labels.py CHANGED
@@ -1,10 +1,8 @@
1
- from typing import TypedDict
1
+ from pydantic import BaseModel
2
2
 
3
3
 
4
- class DesiredWorkerLabel(TypedDict, total=False):
4
+ class DesiredWorkerLabel(BaseModel):
5
5
  value: str | int
6
- required: bool | None = None
6
+ required: bool = False
7
7
  weight: int | None = None
8
- comparator: int | None = (
9
- None # _ClassVar[WorkerLabelComparator] TODO figure out type
10
- )
8
+ comparator: int | None = None
hatchet_sdk/metadata.py CHANGED
@@ -1,2 +1,2 @@
1
- def get_metadata(token: str):
1
+ def get_metadata(token: str) -> list[tuple[str, str]]:
2
2
  return [("authorization", "bearer " + token)]
@@ -1,6 +1,8 @@
1
1
  from importlib.metadata import version
2
2
  from typing import Any, Callable, Collection, Coroutine
3
3
 
4
+ from hatchet_sdk.utils.typing import JSONSerializableMapping
5
+
4
6
  try:
5
7
  from opentelemetry.context import Context
6
8
  from opentelemetry.instrumentation.instrumentor import ( # type: ignore[attr-defined]
@@ -28,7 +30,7 @@ import hatchet_sdk
28
30
  from hatchet_sdk.clients.admin import (
29
31
  AdminClient,
30
32
  TriggerWorkflowOptions,
31
- WorkflowRunDict,
33
+ WorkflowRunTriggerConfig,
32
34
  )
33
35
  from hatchet_sdk.clients.dispatcher.action_listener import Action
34
36
  from hatchet_sdk.clients.events import (
@@ -66,7 +68,9 @@ def create_traceparent() -> str | None:
66
68
  return carrier.get("traceparent")
67
69
 
68
70
 
69
- def parse_carrier_from_metadata(metadata: dict[str, str] | None) -> Context | None:
71
+ def parse_carrier_from_metadata(
72
+ metadata: JSONSerializableMapping | None,
73
+ ) -> Context | None:
70
74
  """
71
75
  Parses OpenTelemetry trace context from a metadata dictionary.
72
76
 
@@ -202,7 +206,7 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
202
206
 
203
207
  wrap_function_wrapper(
204
208
  hatchet_sdk,
205
- "clients.admin.AdminClientAioImpl.run_workflow",
209
+ "clients.admin.AdminClient.aio_run_workflow",
206
210
  self._wrap_async_run_workflow,
207
211
  )
208
212
 
@@ -214,7 +218,7 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
214
218
 
215
219
  wrap_function_wrapper(
216
220
  hatchet_sdk,
217
- "clients.admin.AdminClientAioImpl.run_workflows",
221
+ "clients.admin.AdminClient.aio_run_workflows",
218
222
  self._wrap_async_run_workflows,
219
223
  )
220
224
 
@@ -348,14 +352,12 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
348
352
  def _wrap_run_workflows(
349
353
  self,
350
354
  wrapped: Callable[
351
- [list[WorkflowRunDict], TriggerWorkflowOptions | None], list[WorkflowRunRef]
355
+ [list[WorkflowRunTriggerConfig]],
356
+ list[WorkflowRunRef],
352
357
  ],
353
358
  instance: AdminClient,
354
- args: tuple[
355
- list[WorkflowRunDict],
356
- TriggerWorkflowOptions | None,
357
- ],
358
- kwargs: dict[str, list[WorkflowRunDict] | TriggerWorkflowOptions | None],
359
+ args: tuple[list[WorkflowRunTriggerConfig],],
360
+ kwargs: dict[str, list[WorkflowRunTriggerConfig]],
359
361
  ) -> list[WorkflowRunRef]:
360
362
  with self._tracer.start_as_current_span(
361
363
  "hatchet.run_workflows",
@@ -366,15 +368,12 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
366
368
  async def _wrap_async_run_workflows(
367
369
  self,
368
370
  wrapped: Callable[
369
- [list[WorkflowRunDict], TriggerWorkflowOptions | None],
371
+ [list[WorkflowRunTriggerConfig]],
370
372
  Coroutine[None, None, list[WorkflowRunRef]],
371
373
  ],
372
374
  instance: AdminClient,
373
- args: tuple[
374
- list[WorkflowRunDict],
375
- TriggerWorkflowOptions | None,
376
- ],
377
- kwargs: dict[str, list[WorkflowRunDict] | TriggerWorkflowOptions | None],
375
+ args: tuple[list[WorkflowRunTriggerConfig],],
376
+ kwargs: dict[str, list[WorkflowRunTriggerConfig]],
378
377
  ) -> list[WorkflowRunRef]:
379
378
  with self._tracer.start_as_current_span(
380
379
  "hatchet.run_workflows",
@@ -391,6 +390,6 @@ class HatchetInstrumentor(BaseInstrumentor): # type: ignore[misc]
391
390
  unwrap(hatchet_sdk, "clients.events.EventClient.push")
392
391
  unwrap(hatchet_sdk, "clients.events.EventClient.bulk_push")
393
392
  unwrap(hatchet_sdk, "clients.admin.AdminClient.run_workflow")
394
- unwrap(hatchet_sdk, "clients.admin.AdminClientAioImpl.run_workflow")
393
+ unwrap(hatchet_sdk, "clients.admin.AdminClient.aio_run_workflow")
395
394
  unwrap(hatchet_sdk, "clients.admin.AdminClient.run_workflows")
396
- unwrap(hatchet_sdk, "clients.admin.AdminClientAioImpl.run_workflows")
395
+ unwrap(hatchet_sdk, "clients.admin.AdminClient.aio_run_workflows")
hatchet_sdk/rate_limit.py CHANGED
@@ -1,9 +1,9 @@
1
- from dataclasses import dataclass
2
- from typing import Union
1
+ from enum import Enum
3
2
 
4
- from celpy import CELEvalError, Environment
3
+ from celpy import CELEvalError, Environment # type: ignore
4
+ from pydantic import BaseModel, model_validator
5
5
 
6
- from hatchet_sdk.contracts.workflows_pb2 import CreateStepRateLimit
6
+ from hatchet_sdk.contracts.v1.workflows_pb2 import CreateTaskRateLimit
7
7
 
8
8
 
9
9
  def validate_cel_expression(expr: str) -> bool:
@@ -15,7 +15,7 @@ def validate_cel_expression(expr: str) -> bool:
15
15
  return False
16
16
 
17
17
 
18
- class RateLimitDuration:
18
+ class RateLimitDuration(str, Enum):
19
19
  SECOND = "SECOND"
20
20
  MINUTE = "MINUTE"
21
21
  HOUR = "HOUR"
@@ -25,8 +25,7 @@ class RateLimitDuration:
25
25
  YEAR = "YEAR"
26
26
 
27
27
 
28
- @dataclass
29
- class RateLimit:
28
+ class RateLimit(BaseModel):
30
29
  """
31
30
  Represents a rate limit configuration for a step in a workflow.
32
31
 
@@ -40,7 +39,6 @@ class RateLimit:
40
39
  units (int or str, default=1): The number of units or a CEL expression for dynamic unit calculation.
41
40
  limit (int or str, optional): The rate limit value or a CEL expression for dynamic limit calculation.
42
41
  duration (str, default=RateLimitDuration.MINUTE): The window duration of the rate limit.
43
- key (str, optional): Deprecated. Use static_key instead.
44
42
 
45
43
  Usage:
46
44
  1. Static rate limit:
@@ -61,62 +59,49 @@ class RateLimit:
61
59
 
62
60
  Raises:
63
61
  ValueError: If invalid combinations of attributes are provided or if CEL expressions are invalid.
64
- DeprecationWarning: If the deprecated 'key' attribute is used.
65
62
  """
66
63
 
67
- key: Union[str, None] = None
68
- static_key: Union[str, None] = None
69
- dynamic_key: Union[str, None] = None
70
- units: Union[int, str] = 1
71
- limit: Union[int, str, None] = None
64
+ static_key: str | None = None
65
+ dynamic_key: str | None = None
66
+ units: str | int = 1
67
+ limit: int | str | None = None
72
68
  duration: RateLimitDuration = RateLimitDuration.MINUTE
73
69
 
74
- _req: CreateStepRateLimit = None
70
+ @model_validator(mode="after")
71
+ def validate_rate_limit(self) -> "RateLimit":
72
+ if self.dynamic_key and self.static_key:
73
+ raise ValueError("Cannot have both static key and dynamic key set")
75
74
 
76
- def __post_init__(self):
77
- # juggle the key and key_expr fields
75
+ if self.dynamic_key and not validate_cel_expression(self.dynamic_key):
76
+ raise ValueError(f"Invalid CEL expression: {self.dynamic_key}")
77
+
78
+ if not isinstance(self.units, int) and not validate_cel_expression(self.units):
79
+ raise ValueError(f"Invalid CEL expression: {self.units}")
80
+
81
+ if (
82
+ self.limit
83
+ and not isinstance(self.limit, int)
84
+ and not validate_cel_expression(self.limit)
85
+ ):
86
+ raise ValueError(f"Invalid CEL expression: {self.limit}")
87
+
88
+ if self.dynamic_key and not self.limit:
89
+ raise ValueError("CEL based keys requires limit to be set")
90
+
91
+ return self
92
+
93
+ def to_proto(self) -> CreateTaskRateLimit:
78
94
  key = self.static_key
79
95
  key_expression = self.dynamic_key
80
96
 
81
- if self.key is not None:
82
- DeprecationWarning(
83
- "key is deprecated and will be removed in a future release, please use static_key instead"
84
- )
85
- key = self.key
86
-
87
- if key_expression is not None:
88
- if key is not None:
89
- raise ValueError("Cannot have both static key and dynamic key set")
90
-
91
- key = key_expression
92
- if not validate_cel_expression(key_expression):
93
- raise ValueError(f"Invalid CEL expression: {key_expression}")
94
-
95
- # juggle the units and units_expr fields
96
- units = None
97
- units_expression = None
98
- if isinstance(self.units, int):
99
- units = self.units
100
- else:
101
- if not validate_cel_expression(self.units):
102
- raise ValueError(f"Invalid CEL expression: {self.units}")
103
- units_expression = self.units
104
-
105
- # juggle the limit and limit_expr fields
106
- limit_expression = None
107
-
108
- if self.limit:
109
- if isinstance(self.limit, int):
110
- limit_expression = f"{self.limit}"
111
- else:
112
- if not validate_cel_expression(self.limit):
113
- raise ValueError(f"Invalid CEL expression: {self.limit}")
114
- limit_expression = self.limit
115
-
116
- if key_expression is not None and limit_expression is None:
117
- raise ValueError("CEL based keys requires limit to be set")
97
+ key = self.static_key or self.dynamic_key
98
+
99
+ units = self.units if isinstance(self.units, int) else None
100
+ units_expression = None if isinstance(self.units, int) else self.units
101
+
102
+ limit_expression = None if not self.limit else str(self.limit)
118
103
 
119
- self._req = CreateStepRateLimit(
104
+ return CreateTaskRateLimit(
120
105
  key=key,
121
106
  key_expr=key_expression,
122
107
  units=units,
@@ -0,0 +1,12 @@
1
+ import asyncio
2
+ from collections import Counter
3
+ from contextvars import ContextVar
4
+
5
+ ctx_workflow_run_id: ContextVar[str | None] = ContextVar(
6
+ "ctx_workflow_run_id", default=None
7
+ )
8
+ ctx_step_run_id: ContextVar[str | None] = ContextVar("ctx_step_run_id", default=None)
9
+ ctx_worker_id: ContextVar[str | None] = ContextVar("ctx_worker_id", default=None)
10
+
11
+ workflow_spawn_indices = Counter[str]()
12
+ spawn_index_lock = asyncio.Lock()
@@ -0,0 +1,194 @@
1
+ import asyncio
2
+ from datetime import datetime
3
+ from typing import Any, Generic, cast, get_type_hints
4
+
5
+ from google.protobuf import timestamp_pb2
6
+
7
+ from hatchet_sdk.clients.admin import (
8
+ ScheduleTriggerWorkflowOptions,
9
+ TriggerWorkflowOptions,
10
+ WorkflowRunTriggerConfig,
11
+ )
12
+ from hatchet_sdk.clients.rest.models.cron_workflows import CronWorkflows
13
+ from hatchet_sdk.contracts.workflows_pb2 import WorkflowVersion
14
+ from hatchet_sdk.runnables.task import Task
15
+ from hatchet_sdk.runnables.types import R, TWorkflowInput
16
+ from hatchet_sdk.runnables.workflow import BaseWorkflow, Workflow
17
+ from hatchet_sdk.utils.aio_utils import get_active_event_loop
18
+ from hatchet_sdk.utils.typing import JSONSerializableMapping, is_basemodel_subclass
19
+ from hatchet_sdk.workflow_run import WorkflowRunRef
20
+
21
+
22
+ class TaskRunRef(Generic[TWorkflowInput, R]):
23
+ def __init__(
24
+ self,
25
+ standalone: "Standalone[TWorkflowInput, R]",
26
+ workflow_run_ref: WorkflowRunRef,
27
+ ):
28
+ self._s = standalone
29
+ self._wrr = workflow_run_ref
30
+
31
+ async def aio_result(self) -> R:
32
+ result = await self._wrr.workflow_listener.result(self._wrr.workflow_run_id)
33
+ return self._s._extract_result(result)
34
+
35
+ def result(self) -> R:
36
+ coro = self._wrr.workflow_listener.result(self._wrr.workflow_run_id)
37
+
38
+ loop = get_active_event_loop()
39
+
40
+ if loop is None:
41
+ loop = asyncio.new_event_loop()
42
+ asyncio.set_event_loop(loop)
43
+ try:
44
+ result = loop.run_until_complete(coro)
45
+ finally:
46
+ asyncio.set_event_loop(None)
47
+ else:
48
+ result = loop.run_until_complete(coro)
49
+
50
+ return self._s._extract_result(result)
51
+
52
+
53
+ class Standalone(BaseWorkflow[TWorkflowInput], Generic[TWorkflowInput, R]):
54
+ def __init__(
55
+ self, workflow: Workflow[TWorkflowInput], task: Task[TWorkflowInput, R]
56
+ ) -> None:
57
+ super().__init__(config=workflow.config, client=workflow.client)
58
+
59
+ ## NOTE: This is a hack to assign the task back to the base workflow,
60
+ ## since the decorator to mutate the tasks is not being called.
61
+ self._default_tasks = [task]
62
+
63
+ self._workflow = workflow
64
+ self._task = task
65
+
66
+ return_type = get_type_hints(self._task.fn).get("return")
67
+
68
+ self._output_validator = (
69
+ return_type if is_basemodel_subclass(return_type) else None
70
+ )
71
+
72
+ self.config = self._workflow.config
73
+
74
+ def _extract_result(self, result: dict[str, Any]) -> R:
75
+ output = result.get(self._task.name)
76
+
77
+ if not self._output_validator:
78
+ return cast(R, output)
79
+
80
+ return cast(R, self._output_validator.model_validate(output))
81
+
82
+ def run(
83
+ self,
84
+ input: TWorkflowInput | None = None,
85
+ options: TriggerWorkflowOptions = TriggerWorkflowOptions(),
86
+ ) -> R:
87
+ return self._extract_result(self._workflow.run(input, options))
88
+
89
+ async def aio_run(
90
+ self,
91
+ input: TWorkflowInput | None = None,
92
+ options: TriggerWorkflowOptions = TriggerWorkflowOptions(),
93
+ ) -> R:
94
+ result = await self._workflow.aio_run(input, options)
95
+ return self._extract_result(result)
96
+
97
+ def run_no_wait(
98
+ self,
99
+ input: TWorkflowInput | None = None,
100
+ options: TriggerWorkflowOptions = TriggerWorkflowOptions(),
101
+ ) -> TaskRunRef[TWorkflowInput, R]:
102
+ ref = self._workflow.run_no_wait(input, options)
103
+
104
+ return TaskRunRef[TWorkflowInput, R](self, ref)
105
+
106
+ async def aio_run_no_wait(
107
+ self,
108
+ input: TWorkflowInput | None = None,
109
+ options: TriggerWorkflowOptions = TriggerWorkflowOptions(),
110
+ ) -> TaskRunRef[TWorkflowInput, R]:
111
+ ref = await self._workflow.aio_run_no_wait(input, options)
112
+
113
+ return TaskRunRef[TWorkflowInput, R](self, ref)
114
+
115
+ def run_many(self, workflows: list[WorkflowRunTriggerConfig]) -> list[R]:
116
+ return [
117
+ self._extract_result(result)
118
+ for result in self._workflow.run_many(workflows)
119
+ ]
120
+
121
+ async def aio_run_many(self, workflows: list[WorkflowRunTriggerConfig]) -> list[R]:
122
+ return [
123
+ self._extract_result(result)
124
+ for result in await self._workflow.aio_run_many(workflows)
125
+ ]
126
+
127
+ def run_many_no_wait(
128
+ self, workflows: list[WorkflowRunTriggerConfig]
129
+ ) -> list[TaskRunRef[TWorkflowInput, R]]:
130
+ refs = self._workflow.run_many_no_wait(workflows)
131
+
132
+ return [TaskRunRef[TWorkflowInput, R](self, ref) for ref in refs]
133
+
134
+ async def aio_run_many_no_wait(
135
+ self, workflows: list[WorkflowRunTriggerConfig]
136
+ ) -> list[TaskRunRef[TWorkflowInput, R]]:
137
+ refs = await self._workflow.aio_run_many_no_wait(workflows)
138
+
139
+ return [TaskRunRef[TWorkflowInput, R](self, ref) for ref in refs]
140
+
141
+ def schedule(
142
+ self,
143
+ schedules: list[datetime],
144
+ input: TWorkflowInput | None = None,
145
+ options: ScheduleTriggerWorkflowOptions = ScheduleTriggerWorkflowOptions(),
146
+ ) -> WorkflowVersion:
147
+ return self._workflow.schedule(
148
+ schedules=schedules,
149
+ input=input,
150
+ options=options,
151
+ )
152
+
153
+ async def aio_schedule(
154
+ self,
155
+ schedules: list[datetime | timestamp_pb2.Timestamp],
156
+ input: TWorkflowInput,
157
+ options: ScheduleTriggerWorkflowOptions = ScheduleTriggerWorkflowOptions(),
158
+ ) -> WorkflowVersion:
159
+ return await self._workflow.aio_schedule(
160
+ schedules=schedules,
161
+ input=input,
162
+ options=options,
163
+ )
164
+
165
+ def create_cron(
166
+ self,
167
+ cron_name: str,
168
+ expression: str,
169
+ input: TWorkflowInput,
170
+ additional_metadata: JSONSerializableMapping,
171
+ ) -> CronWorkflows:
172
+ return self._workflow.create_cron(
173
+ cron_name=cron_name,
174
+ expression=expression,
175
+ input=input,
176
+ additional_metadata=additional_metadata,
177
+ )
178
+
179
+ async def aio_create_cron(
180
+ self,
181
+ cron_name: str,
182
+ expression: str,
183
+ input: TWorkflowInput,
184
+ additional_metadata: JSONSerializableMapping,
185
+ ) -> CronWorkflows:
186
+ return await self._workflow.aio_create_cron(
187
+ cron_name=cron_name,
188
+ expression=expression,
189
+ input=input,
190
+ additional_metadata=additional_metadata,
191
+ )
192
+
193
+ def to_task(self) -> Task[TWorkflowInput, R]:
194
+ return self._task
@@ -0,0 +1,144 @@
1
+ from typing import (
2
+ TYPE_CHECKING,
3
+ Any,
4
+ Awaitable,
5
+ Callable,
6
+ Generic,
7
+ TypeVar,
8
+ Union,
9
+ cast,
10
+ )
11
+
12
+ from hatchet_sdk.context.context import Context, DurableContext
13
+ from hatchet_sdk.contracts.v1.workflows_pb2 import (
14
+ CreateTaskRateLimit,
15
+ DesiredWorkerLabels,
16
+ )
17
+ from hatchet_sdk.runnables.types import (
18
+ DEFAULT_EXECUTION_TIMEOUT,
19
+ DEFAULT_SCHEDULE_TIMEOUT,
20
+ ConcurrencyExpression,
21
+ R,
22
+ StepType,
23
+ TWorkflowInput,
24
+ is_async_fn,
25
+ is_durable_sync_fn,
26
+ is_sync_fn,
27
+ )
28
+ from hatchet_sdk.utils.timedelta_to_expression import Duration
29
+ from hatchet_sdk.waits import Condition, OrGroup
30
+
31
+ if TYPE_CHECKING:
32
+ from hatchet_sdk.runnables.workflow import Workflow
33
+
34
+
35
+ T = TypeVar("T")
36
+
37
+
38
+ def fall_back_to_default(value: T, default: T, fallback_value: T) -> T:
39
+ ## If the value is not the default, it's set
40
+ if value != default:
41
+ return value
42
+
43
+ ## Otherwise, it's unset, so return the fallback value
44
+ return fallback_value
45
+
46
+
47
+ class Task(Generic[TWorkflowInput, R]):
48
+ def __init__(
49
+ self,
50
+ _fn: Union[
51
+ Callable[[TWorkflowInput, Context], R]
52
+ | Callable[[TWorkflowInput, Context], Awaitable[R]],
53
+ Callable[[TWorkflowInput, DurableContext], R]
54
+ | Callable[[TWorkflowInput, DurableContext], Awaitable[R]],
55
+ ],
56
+ is_durable: bool,
57
+ type: StepType,
58
+ workflow: "Workflow[TWorkflowInput]",
59
+ name: str,
60
+ execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
61
+ schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
62
+ parents: "list[Task[TWorkflowInput, Any]]" = [],
63
+ retries: int = 0,
64
+ rate_limits: list[CreateTaskRateLimit] = [],
65
+ desired_worker_labels: dict[str, DesiredWorkerLabels] = {},
66
+ backoff_factor: float | None = None,
67
+ backoff_max_seconds: int | None = None,
68
+ concurrency: list[ConcurrencyExpression] = [],
69
+ wait_for: list[Condition | OrGroup] = [],
70
+ skip_if: list[Condition | OrGroup] = [],
71
+ cancel_if: list[Condition | OrGroup] = [],
72
+ ) -> None:
73
+ self.is_durable = is_durable
74
+
75
+ self.fn = _fn
76
+ self.is_async_function = is_async_fn(self.fn) # type: ignore
77
+
78
+ self.workflow = workflow
79
+
80
+ self.type = type
81
+ self.execution_timeout = fall_back_to_default(
82
+ execution_timeout, DEFAULT_EXECUTION_TIMEOUT, DEFAULT_EXECUTION_TIMEOUT
83
+ )
84
+ self.schedule_timeout = fall_back_to_default(
85
+ schedule_timeout, DEFAULT_SCHEDULE_TIMEOUT, DEFAULT_SCHEDULE_TIMEOUT
86
+ )
87
+ self.name = name
88
+ self.parents = parents
89
+ self.retries = retries
90
+ self.rate_limits = rate_limits
91
+ self.desired_worker_labels = desired_worker_labels
92
+ self.backoff_factor = backoff_factor
93
+ self.backoff_max_seconds = backoff_max_seconds
94
+ self.concurrency = concurrency
95
+
96
+ self.wait_for = self._flatten_conditions(wait_for)
97
+ self.skip_if = self._flatten_conditions(skip_if)
98
+ self.cancel_if = self._flatten_conditions(cancel_if)
99
+
100
+ def _flatten_conditions(
101
+ self, conditions: list[Condition | OrGroup]
102
+ ) -> list[Condition]:
103
+ flattened: list[Condition] = []
104
+
105
+ for condition in conditions:
106
+ if isinstance(condition, OrGroup):
107
+ for or_condition in condition.conditions:
108
+ or_condition.base.or_group_id = condition.or_group_id
109
+
110
+ flattened.extend(condition.conditions)
111
+ else:
112
+ flattened.append(condition)
113
+
114
+ return flattened
115
+
116
+ def call(self, ctx: Context | DurableContext) -> R:
117
+ if self.is_async_function:
118
+ raise TypeError(f"{self.name} is not a sync function. Use `acall` instead.")
119
+
120
+ workflow_input = self.workflow._get_workflow_input(ctx)
121
+
122
+ if self.is_durable:
123
+ fn = cast(Callable[[TWorkflowInput, DurableContext], R], self.fn)
124
+ if is_durable_sync_fn(fn):
125
+ return fn(workflow_input, cast(DurableContext, ctx))
126
+ else:
127
+ fn = cast(Callable[[TWorkflowInput, Context], R], self.fn)
128
+ if is_sync_fn(fn):
129
+ return fn(workflow_input, cast(Context, ctx))
130
+
131
+ raise TypeError(f"{self.name} is not a sync function. Use `acall` instead.")
132
+
133
+ async def aio_call(self, ctx: Context | DurableContext) -> R:
134
+ if not self.is_async_function:
135
+ raise TypeError(
136
+ f"{self.name} is not an async function. Use `call` instead."
137
+ )
138
+
139
+ workflow_input = self.workflow._get_workflow_input(ctx)
140
+
141
+ if is_async_fn(self.fn): # type: ignore
142
+ return await self.fn(workflow_input, cast(Context, ctx)) # type: ignore
143
+
144
+ raise TypeError(f"{self.name} is not an async function. Use `call` instead.")