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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. hatchet_sdk/__init__.py +25 -16
  2. hatchet_sdk/client.py +14 -39
  3. hatchet_sdk/clients/admin.py +203 -362
  4. hatchet_sdk/clients/dispatcher/action_listener.py +106 -84
  5. hatchet_sdk/clients/dispatcher/dispatcher.py +21 -21
  6. hatchet_sdk/clients/event_ts.py +23 -10
  7. hatchet_sdk/clients/events.py +96 -99
  8. hatchet_sdk/clients/rest/__init__.py +24 -0
  9. hatchet_sdk/clients/rest/api/__init__.py +2 -0
  10. hatchet_sdk/clients/rest/api/task_api.py +2174 -0
  11. hatchet_sdk/clients/rest/api/workflow_runs_api.py +638 -106
  12. hatchet_sdk/clients/rest/api_client.py +1 -1
  13. hatchet_sdk/clients/rest/configuration.py +8 -1
  14. hatchet_sdk/clients/rest/exceptions.py +21 -0
  15. hatchet_sdk/clients/rest/models/__init__.py +22 -0
  16. hatchet_sdk/clients/rest/models/tenant.py +4 -0
  17. hatchet_sdk/clients/rest/models/tenant_version.py +37 -0
  18. hatchet_sdk/clients/rest/models/update_tenant_request.py +7 -0
  19. hatchet_sdk/clients/rest/models/v1_cancel_task_request.py +104 -0
  20. hatchet_sdk/clients/rest/models/v1_dag_children.py +102 -0
  21. hatchet_sdk/clients/rest/models/v1_replay_task_request.py +104 -0
  22. hatchet_sdk/clients/rest/models/v1_task.py +174 -0
  23. hatchet_sdk/clients/rest/models/v1_task_event.py +118 -0
  24. hatchet_sdk/clients/rest/models/v1_task_event_list.py +110 -0
  25. hatchet_sdk/clients/rest/models/v1_task_event_type.py +55 -0
  26. hatchet_sdk/clients/rest/models/v1_task_filter.py +106 -0
  27. hatchet_sdk/clients/rest/models/v1_task_point_metric.py +92 -0
  28. hatchet_sdk/clients/rest/models/v1_task_point_metrics.py +100 -0
  29. hatchet_sdk/clients/rest/models/v1_task_run_metric.py +88 -0
  30. hatchet_sdk/clients/rest/models/v1_task_run_status.py +40 -0
  31. hatchet_sdk/clients/rest/models/v1_task_status.py +40 -0
  32. hatchet_sdk/clients/rest/models/v1_task_summary.py +212 -0
  33. hatchet_sdk/clients/rest/models/v1_task_summary_list.py +110 -0
  34. hatchet_sdk/clients/rest/models/v1_workflow_run.py +171 -0
  35. hatchet_sdk/clients/rest/models/v1_workflow_run_details.py +145 -0
  36. hatchet_sdk/clients/rest/models/v1_workflow_type.py +37 -0
  37. hatchet_sdk/clients/rest/models/workflow_run_shape_item_for_workflow_run_details.py +99 -0
  38. hatchet_sdk/clients/rest/rest.py +37 -26
  39. hatchet_sdk/clients/rest/tenacity_utils.py +1 -1
  40. hatchet_sdk/clients/rest_client.py +141 -116
  41. hatchet_sdk/clients/run_event_listener.py +66 -60
  42. hatchet_sdk/clients/workflow_listener.py +77 -64
  43. hatchet_sdk/config.py +117 -0
  44. hatchet_sdk/connection.py +27 -13
  45. hatchet_sdk/context/__init__.py +0 -1
  46. hatchet_sdk/context/context.py +143 -202
  47. hatchet_sdk/features/cron.py +43 -57
  48. hatchet_sdk/features/scheduled.py +60 -74
  49. hatchet_sdk/hatchet.py +192 -195
  50. hatchet_sdk/labels.py +4 -6
  51. hatchet_sdk/metadata.py +1 -1
  52. hatchet_sdk/opentelemetry/instrumentor.py +112 -35
  53. hatchet_sdk/rate_limit.py +9 -18
  54. hatchet_sdk/token.py +13 -9
  55. hatchet_sdk/utils/aio_utils.py +0 -40
  56. hatchet_sdk/utils/proto_enums.py +54 -0
  57. hatchet_sdk/utils/typing.py +9 -1
  58. hatchet_sdk/v0/__init__.py +251 -0
  59. hatchet_sdk/v0/client.py +119 -0
  60. hatchet_sdk/v0/clients/admin.py +541 -0
  61. hatchet_sdk/v0/clients/dispatcher/action_listener.py +422 -0
  62. hatchet_sdk/v0/clients/dispatcher/dispatcher.py +204 -0
  63. hatchet_sdk/v0/clients/event_ts.py +28 -0
  64. hatchet_sdk/v0/clients/events.py +182 -0
  65. hatchet_sdk/v0/clients/rest/__init__.py +307 -0
  66. hatchet_sdk/v0/clients/rest/api/__init__.py +19 -0
  67. hatchet_sdk/v0/clients/rest/api/api_token_api.py +858 -0
  68. hatchet_sdk/v0/clients/rest/api/default_api.py +2259 -0
  69. hatchet_sdk/v0/clients/rest/api/event_api.py +2548 -0
  70. hatchet_sdk/v0/clients/rest/api/github_api.py +331 -0
  71. hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +483 -0
  72. hatchet_sdk/v0/clients/rest/api/log_api.py +449 -0
  73. hatchet_sdk/v0/clients/rest/api/metadata_api.py +728 -0
  74. hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +423 -0
  75. hatchet_sdk/v0/clients/rest/api/slack_api.py +577 -0
  76. hatchet_sdk/v0/clients/rest/api/sns_api.py +872 -0
  77. hatchet_sdk/v0/clients/rest/api/step_run_api.py +2202 -0
  78. hatchet_sdk/v0/clients/rest/api/tenant_api.py +4430 -0
  79. hatchet_sdk/v0/clients/rest/api/user_api.py +2888 -0
  80. hatchet_sdk/v0/clients/rest/api/worker_api.py +858 -0
  81. hatchet_sdk/v0/clients/rest/api/workflow_api.py +6312 -0
  82. hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +1932 -0
  83. hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +610 -0
  84. hatchet_sdk/v0/clients/rest/api_client.py +759 -0
  85. hatchet_sdk/v0/clients/rest/api_response.py +22 -0
  86. hatchet_sdk/v0/clients/rest/configuration.py +611 -0
  87. hatchet_sdk/v0/clients/rest/exceptions.py +200 -0
  88. hatchet_sdk/v0/clients/rest/models/__init__.py +274 -0
  89. hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +83 -0
  90. hatchet_sdk/v0/clients/rest/models/api_error.py +102 -0
  91. hatchet_sdk/v0/clients/rest/models/api_errors.py +100 -0
  92. hatchet_sdk/v0/clients/rest/models/api_meta.py +144 -0
  93. hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +85 -0
  94. hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +88 -0
  95. hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +90 -0
  96. hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +98 -0
  97. hatchet_sdk/v0/clients/rest/models/api_token.py +105 -0
  98. hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +100 -0
  99. hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +110 -0
  100. hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +85 -0
  101. hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +83 -0
  102. hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +39 -0
  103. hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +92 -0
  104. hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +83 -0
  105. hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +98 -0
  106. hatchet_sdk/v0/clients/rest/models/create_event_request.py +95 -0
  107. hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +83 -0
  108. hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +85 -0
  109. hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +83 -0
  110. hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +86 -0
  111. hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +84 -0
  112. hatchet_sdk/v0/clients/rest/models/cron_workflows.py +131 -0
  113. hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +110 -0
  114. hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +37 -0
  115. hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +37 -0
  116. hatchet_sdk/v0/clients/rest/models/event.py +143 -0
  117. hatchet_sdk/v0/clients/rest/models/event_data.py +83 -0
  118. hatchet_sdk/v0/clients/rest/models/event_key_list.py +98 -0
  119. hatchet_sdk/v0/clients/rest/models/event_list.py +110 -0
  120. hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +37 -0
  121. hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +36 -0
  122. hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +85 -0
  123. hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +116 -0
  124. hatchet_sdk/v0/clients/rest/models/events.py +110 -0
  125. hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +100 -0
  126. hatchet_sdk/v0/clients/rest/models/github_app_installation.py +107 -0
  127. hatchet_sdk/v0/clients/rest/models/github_branch.py +86 -0
  128. hatchet_sdk/v0/clients/rest/models/github_repo.py +86 -0
  129. hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +83 -0
  130. hatchet_sdk/v0/clients/rest/models/job.py +132 -0
  131. hatchet_sdk/v0/clients/rest/models/job_run.py +176 -0
  132. hatchet_sdk/v0/clients/rest/models/job_run_status.py +41 -0
  133. hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +106 -0
  134. hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +110 -0
  135. hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +112 -0
  136. hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +100 -0
  137. hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +110 -0
  138. hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +110 -0
  139. hatchet_sdk/v0/clients/rest/models/log_line.py +94 -0
  140. hatchet_sdk/v0/clients/rest/models/log_line_level.py +39 -0
  141. hatchet_sdk/v0/clients/rest/models/log_line_list.py +110 -0
  142. hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +37 -0
  143. hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +36 -0
  144. hatchet_sdk/v0/clients/rest/models/pagination_response.py +95 -0
  145. hatchet_sdk/v0/clients/rest/models/pull_request.py +112 -0
  146. hatchet_sdk/v0/clients/rest/models/pull_request_state.py +37 -0
  147. hatchet_sdk/v0/clients/rest/models/queue_metrics.py +97 -0
  148. hatchet_sdk/v0/clients/rest/models/rate_limit.py +117 -0
  149. hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +110 -0
  150. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +37 -0
  151. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +38 -0
  152. hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +118 -0
  153. hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +83 -0
  154. hatchet_sdk/v0/clients/rest/models/replay_event_request.py +85 -0
  155. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +85 -0
  156. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +100 -0
  157. hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +83 -0
  158. hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +92 -0
  159. hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +42 -0
  160. hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +149 -0
  161. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +110 -0
  162. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +37 -0
  163. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +37 -0
  164. hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +113 -0
  165. hatchet_sdk/v0/clients/rest/models/slack_webhook.py +127 -0
  166. hatchet_sdk/v0/clients/rest/models/sns_integration.py +114 -0
  167. hatchet_sdk/v0/clients/rest/models/step.py +123 -0
  168. hatchet_sdk/v0/clients/rest/models/step_run.py +202 -0
  169. hatchet_sdk/v0/clients/rest/models/step_run_archive.py +142 -0
  170. hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +110 -0
  171. hatchet_sdk/v0/clients/rest/models/step_run_diff.py +91 -0
  172. hatchet_sdk/v0/clients/rest/models/step_run_event.py +122 -0
  173. hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +110 -0
  174. hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +52 -0
  175. hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +38 -0
  176. hatchet_sdk/v0/clients/rest/models/step_run_status.py +44 -0
  177. hatchet_sdk/v0/clients/rest/models/tenant.py +118 -0
  178. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +98 -0
  179. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +112 -0
  180. hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +143 -0
  181. hatchet_sdk/v0/clients/rest/models/tenant_invite.py +120 -0
  182. hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +110 -0
  183. hatchet_sdk/v0/clients/rest/models/tenant_list.py +110 -0
  184. hatchet_sdk/v0/clients/rest/models/tenant_member.py +123 -0
  185. hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +110 -0
  186. hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +38 -0
  187. hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +116 -0
  188. hatchet_sdk/v0/clients/rest/models/tenant_resource.py +40 -0
  189. hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +135 -0
  190. hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +102 -0
  191. hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +83 -0
  192. hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +91 -0
  193. hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +83 -0
  194. hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +85 -0
  195. hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +137 -0
  196. hatchet_sdk/v0/clients/rest/models/update_worker_request.py +87 -0
  197. hatchet_sdk/v0/clients/rest/models/user.py +126 -0
  198. hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +88 -0
  199. hatchet_sdk/v0/clients/rest/models/user_login_request.py +86 -0
  200. hatchet_sdk/v0/clients/rest/models/user_register_request.py +91 -0
  201. hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +110 -0
  202. hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +86 -0
  203. hatchet_sdk/v0/clients/rest/models/webhook_worker.py +100 -0
  204. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +94 -0
  205. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +98 -0
  206. hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +102 -0
  207. hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +110 -0
  208. hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +102 -0
  209. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +104 -0
  210. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +38 -0
  211. hatchet_sdk/v0/clients/rest/models/worker.py +239 -0
  212. hatchet_sdk/v0/clients/rest/models/worker_label.py +102 -0
  213. hatchet_sdk/v0/clients/rest/models/worker_list.py +110 -0
  214. hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +103 -0
  215. hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +38 -0
  216. hatchet_sdk/v0/clients/rest/models/worker_type.py +38 -0
  217. hatchet_sdk/v0/clients/rest/models/workflow.py +165 -0
  218. hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +107 -0
  219. hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +136 -0
  220. hatchet_sdk/v0/clients/rest/models/workflow_kind.py +38 -0
  221. hatchet_sdk/v0/clients/rest/models/workflow_list.py +120 -0
  222. hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +97 -0
  223. hatchet_sdk/v0/clients/rest/models/workflow_run.py +188 -0
  224. hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +85 -0
  225. hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +110 -0
  226. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +37 -0
  227. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +39 -0
  228. hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +186 -0
  229. hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +42 -0
  230. hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +112 -0
  231. hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +85 -0
  232. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +94 -0
  233. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +104 -0
  234. hatchet_sdk/v0/clients/rest/models/workflow_tag.py +84 -0
  235. hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +86 -0
  236. hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +86 -0
  237. hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +141 -0
  238. hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +85 -0
  239. hatchet_sdk/v0/clients/rest/models/workflow_version.py +170 -0
  240. hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +114 -0
  241. hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +85 -0
  242. hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +123 -0
  243. hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +95 -0
  244. hatchet_sdk/v0/clients/rest/rest.py +187 -0
  245. hatchet_sdk/v0/clients/rest/tenacity_utils.py +39 -0
  246. hatchet_sdk/v0/clients/rest_client.py +613 -0
  247. hatchet_sdk/v0/clients/run_event_listener.py +260 -0
  248. hatchet_sdk/v0/clients/workflow_listener.py +277 -0
  249. hatchet_sdk/v0/connection.py +63 -0
  250. hatchet_sdk/v0/context/__init__.py +1 -0
  251. hatchet_sdk/v0/context/context.py +446 -0
  252. hatchet_sdk/v0/context/worker_context.py +28 -0
  253. hatchet_sdk/v0/contracts/dispatcher_pb2.py +102 -0
  254. hatchet_sdk/v0/contracts/dispatcher_pb2.pyi +387 -0
  255. hatchet_sdk/v0/contracts/dispatcher_pb2_grpc.py +621 -0
  256. hatchet_sdk/v0/contracts/events_pb2.py +46 -0
  257. hatchet_sdk/v0/contracts/events_pb2.pyi +87 -0
  258. hatchet_sdk/v0/contracts/events_pb2_grpc.py +274 -0
  259. hatchet_sdk/v0/contracts/workflows_pb2.py +80 -0
  260. hatchet_sdk/v0/contracts/workflows_pb2.pyi +312 -0
  261. hatchet_sdk/v0/contracts/workflows_pb2_grpc.py +277 -0
  262. hatchet_sdk/v0/features/cron.py +286 -0
  263. hatchet_sdk/v0/features/scheduled.py +248 -0
  264. hatchet_sdk/v0/hatchet.py +310 -0
  265. hatchet_sdk/v0/labels.py +10 -0
  266. hatchet_sdk/{loader.py → v0/loader.py} +11 -0
  267. hatchet_sdk/v0/logger.py +13 -0
  268. hatchet_sdk/v0/metadata.py +2 -0
  269. hatchet_sdk/v0/opentelemetry/instrumentor.py +396 -0
  270. hatchet_sdk/v0/rate_limit.py +126 -0
  271. hatchet_sdk/v0/semver.py +30 -0
  272. hatchet_sdk/v0/token.py +27 -0
  273. hatchet_sdk/v0/utils/aio_utils.py +137 -0
  274. hatchet_sdk/v0/utils/backoff.py +9 -0
  275. hatchet_sdk/v0/utils/typing.py +12 -0
  276. hatchet_sdk/{v2 → v0/v2}/callable.py +8 -8
  277. hatchet_sdk/{v2 → v0/v2}/concurrency.py +2 -2
  278. hatchet_sdk/{v2 → v0/v2}/hatchet.py +10 -10
  279. hatchet_sdk/v0/worker/__init__.py +1 -0
  280. hatchet_sdk/v0/worker/action_listener_process.py +278 -0
  281. hatchet_sdk/v0/worker/runner/run_loop_manager.py +112 -0
  282. hatchet_sdk/v0/worker/runner/runner.py +460 -0
  283. hatchet_sdk/v0/worker/runner/utils/capture_logs.py +81 -0
  284. hatchet_sdk/v0/worker/runner/utils/error_with_traceback.py +6 -0
  285. hatchet_sdk/v0/worker/worker.py +391 -0
  286. hatchet_sdk/v0/workflow.py +261 -0
  287. hatchet_sdk/v0/workflow_run.py +59 -0
  288. hatchet_sdk/worker/__init__.py +0 -1
  289. hatchet_sdk/worker/action_listener_process.py +36 -33
  290. hatchet_sdk/worker/runner/run_loop_manager.py +18 -16
  291. hatchet_sdk/worker/runner/runner.py +37 -59
  292. hatchet_sdk/worker/runner/utils/capture_logs.py +25 -14
  293. hatchet_sdk/worker/runner/utils/error_with_traceback.py +1 -1
  294. hatchet_sdk/worker/worker.py +61 -75
  295. hatchet_sdk/workflow.py +473 -207
  296. hatchet_sdk/workflow_run.py +14 -25
  297. {hatchet_sdk-0.46.1.dist-info → hatchet_sdk-1.0.0.dist-info}/METADATA +3 -2
  298. hatchet_sdk-1.0.0.dist-info/RECORD +485 -0
  299. {hatchet_sdk-0.46.1.dist-info → hatchet_sdk-1.0.0.dist-info}/entry_points.txt +1 -0
  300. hatchet_sdk/utils/serialization.py +0 -18
  301. hatchet_sdk-0.46.1.dist-info/RECORD +0 -237
  302. /hatchet_sdk/{utils → v0/utils}/types.py +0 -0
  303. {hatchet_sdk-0.46.1.dist-info → hatchet_sdk-1.0.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,541 @@
1
+ import json
2
+ from datetime import datetime
3
+ from typing import Any, Callable, Dict, List, Optional, TypedDict, TypeVar, Union
4
+
5
+ import grpc
6
+ from google.protobuf import timestamp_pb2
7
+
8
+ from hatchet_sdk.v0.clients.rest.models.workflow_run import WorkflowRun
9
+ from hatchet_sdk.v0.clients.rest.tenacity_utils import tenacity_retry
10
+ from hatchet_sdk.v0.clients.run_event_listener import new_listener
11
+ from hatchet_sdk.v0.clients.workflow_listener import PooledWorkflowRunListener
12
+ from hatchet_sdk.v0.connection import new_conn
13
+ from hatchet_sdk.v0.contracts.workflows_pb2 import (
14
+ BulkTriggerWorkflowRequest,
15
+ BulkTriggerWorkflowResponse,
16
+ CreateWorkflowVersionOpts,
17
+ PutRateLimitRequest,
18
+ PutWorkflowRequest,
19
+ RateLimitDuration,
20
+ ScheduleWorkflowRequest,
21
+ TriggerWorkflowRequest,
22
+ TriggerWorkflowResponse,
23
+ WorkflowVersion,
24
+ )
25
+ from hatchet_sdk.v0.contracts.workflows_pb2_grpc import WorkflowServiceStub
26
+ from hatchet_sdk.v0.workflow_run import RunRef, WorkflowRunRef
27
+
28
+ from ..loader import ClientConfig
29
+ from ..metadata import get_metadata
30
+ from ..workflow import WorkflowMeta
31
+
32
+
33
+ def new_admin(config: ClientConfig):
34
+ return AdminClient(config)
35
+
36
+
37
+ class ScheduleTriggerWorkflowOptions(TypedDict, total=False):
38
+ parent_id: Optional[str]
39
+ parent_step_run_id: Optional[str]
40
+ child_index: Optional[int]
41
+ child_key: Optional[str]
42
+ namespace: Optional[str]
43
+
44
+
45
+ class ChildTriggerWorkflowOptions(TypedDict, total=False):
46
+ additional_metadata: Dict[str, str] | None = None
47
+ sticky: bool | None = None
48
+
49
+
50
+ class ChildWorkflowRunDict(TypedDict, total=False):
51
+ workflow_name: str
52
+ input: Any
53
+ options: ChildTriggerWorkflowOptions
54
+ key: str | None = None
55
+
56
+
57
+ class TriggerWorkflowOptions(ScheduleTriggerWorkflowOptions, total=False):
58
+ additional_metadata: Dict[str, str] | None = None
59
+ desired_worker_id: str | None = None
60
+ namespace: str | None = None
61
+
62
+
63
+ class WorkflowRunDict(TypedDict, total=False):
64
+ workflow_name: str
65
+ input: Any
66
+ options: TriggerWorkflowOptions | None
67
+
68
+
69
+ class DedupeViolationErr(Exception):
70
+ """Raised by the Hatchet library to indicate that a workflow has already been run with this deduplication value."""
71
+
72
+ pass
73
+
74
+
75
+ class AdminClientBase:
76
+ pooled_workflow_listener: PooledWorkflowRunListener | None = None
77
+
78
+ def _prepare_workflow_request(
79
+ self, workflow_name: str, input: any, options: TriggerWorkflowOptions = None
80
+ ):
81
+ try:
82
+ payload_data = json.dumps(input)
83
+
84
+ try:
85
+ meta = (
86
+ None
87
+ if options is None or "additional_metadata" not in options
88
+ else options["additional_metadata"]
89
+ )
90
+ if meta is not None:
91
+ options = {
92
+ **options,
93
+ "additional_metadata": json.dumps(meta).encode("utf-8"),
94
+ }
95
+ except json.JSONDecodeError as e:
96
+ raise ValueError(f"Error encoding payload: {e}")
97
+
98
+ return TriggerWorkflowRequest(
99
+ name=workflow_name, input=payload_data, **(options or {})
100
+ )
101
+ except json.JSONDecodeError as e:
102
+ raise ValueError(f"Error encoding payload: {e}")
103
+
104
+ def _prepare_put_workflow_request(
105
+ self,
106
+ name: str,
107
+ workflow: CreateWorkflowVersionOpts | WorkflowMeta,
108
+ overrides: CreateWorkflowVersionOpts | None = None,
109
+ ):
110
+ try:
111
+ opts: CreateWorkflowVersionOpts
112
+
113
+ if isinstance(workflow, CreateWorkflowVersionOpts):
114
+ opts = workflow
115
+ else:
116
+ opts = workflow.get_create_opts(self.client.config.namespace)
117
+
118
+ if overrides is not None:
119
+ opts.MergeFrom(overrides)
120
+
121
+ opts.name = name
122
+
123
+ return PutWorkflowRequest(
124
+ opts=opts,
125
+ )
126
+ except grpc.RpcError as e:
127
+ raise ValueError(f"Could not put workflow: {e}")
128
+
129
+ def _prepare_schedule_workflow_request(
130
+ self,
131
+ name: str,
132
+ schedules: List[Union[datetime, timestamp_pb2.Timestamp]],
133
+ input={},
134
+ options: ScheduleTriggerWorkflowOptions = None,
135
+ ):
136
+ timestamp_schedules = []
137
+ for schedule in schedules:
138
+ if isinstance(schedule, datetime):
139
+ t = schedule.timestamp()
140
+ seconds = int(t)
141
+ nanos = int(t % 1 * 1e9)
142
+ timestamp = timestamp_pb2.Timestamp(seconds=seconds, nanos=nanos)
143
+ timestamp_schedules.append(timestamp)
144
+ elif isinstance(schedule, timestamp_pb2.Timestamp):
145
+ timestamp_schedules.append(schedule)
146
+ else:
147
+ raise ValueError(
148
+ "Invalid schedule type. Must be datetime or timestamp_pb2.Timestamp."
149
+ )
150
+
151
+ return ScheduleWorkflowRequest(
152
+ name=name,
153
+ schedules=timestamp_schedules,
154
+ input=json.dumps(input),
155
+ **(options or {}),
156
+ )
157
+
158
+
159
+ T = TypeVar("T")
160
+
161
+
162
+ class AdminClientAioImpl(AdminClientBase):
163
+ def __init__(self, config: ClientConfig):
164
+ aio_conn = new_conn(config, True)
165
+ self.config = config
166
+ self.aio_client = WorkflowServiceStub(aio_conn)
167
+ self.token = config.token
168
+ self.listener_client = new_listener(config)
169
+ self.namespace = config.namespace
170
+
171
+ async def run(
172
+ self,
173
+ function: Union[str, Callable[[Any], T]],
174
+ input: any,
175
+ options: TriggerWorkflowOptions = None,
176
+ ) -> "RunRef[T]":
177
+ workflow_name = function
178
+
179
+ if not isinstance(function, str):
180
+ workflow_name = function.function_name
181
+
182
+ wrr = await self.run_workflow(workflow_name, input, options)
183
+
184
+ return RunRef[T](
185
+ wrr.workflow_run_id, wrr.workflow_listener, wrr.workflow_run_event_listener
186
+ )
187
+
188
+ ## IMPORTANT: Keep this method's signature in sync with the wrapper in the OTel instrumentor
189
+ @tenacity_retry
190
+ async def run_workflow(
191
+ self, workflow_name: str, input: any, options: TriggerWorkflowOptions = None
192
+ ) -> WorkflowRunRef:
193
+ try:
194
+ if not self.pooled_workflow_listener:
195
+ self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
196
+
197
+ namespace = self.namespace
198
+
199
+ if (
200
+ options is not None
201
+ and "namespace" in options
202
+ and options["namespace"] is not None
203
+ ):
204
+ namespace = options.pop("namespace")
205
+
206
+ if namespace != "" and not workflow_name.startswith(self.namespace):
207
+ workflow_name = f"{namespace}{workflow_name}"
208
+
209
+ request = self._prepare_workflow_request(workflow_name, input, options)
210
+
211
+ resp: TriggerWorkflowResponse = await self.aio_client.TriggerWorkflow(
212
+ request,
213
+ metadata=get_metadata(self.token),
214
+ )
215
+
216
+ return WorkflowRunRef(
217
+ workflow_run_id=resp.workflow_run_id,
218
+ workflow_listener=self.pooled_workflow_listener,
219
+ workflow_run_event_listener=self.listener_client,
220
+ )
221
+ except (grpc.RpcError, grpc.aio.AioRpcError) as e:
222
+ if e.code() == grpc.StatusCode.ALREADY_EXISTS:
223
+ raise DedupeViolationErr(e.details())
224
+
225
+ raise e
226
+
227
+ ## IMPORTANT: Keep this method's signature in sync with the wrapper in the OTel instrumentor
228
+ @tenacity_retry
229
+ async def run_workflows(
230
+ self,
231
+ workflows: list[WorkflowRunDict],
232
+ options: TriggerWorkflowOptions | None = None,
233
+ ) -> List[WorkflowRunRef]:
234
+ if len(workflows) == 0:
235
+ raise ValueError("No workflows to run")
236
+
237
+ if not self.pooled_workflow_listener:
238
+ self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
239
+
240
+ namespace = self.namespace
241
+
242
+ if (
243
+ options is not None
244
+ and "namespace" in options
245
+ and options["namespace"] is not None
246
+ ):
247
+ namespace = options["namespace"]
248
+ del options["namespace"]
249
+
250
+ workflow_run_requests: TriggerWorkflowRequest = []
251
+
252
+ for workflow in workflows:
253
+ workflow_name = workflow["workflow_name"]
254
+ input_data = workflow["input"]
255
+ options = workflow["options"]
256
+
257
+ if namespace != "" and not workflow_name.startswith(self.namespace):
258
+ workflow_name = f"{namespace}{workflow_name}"
259
+
260
+ # Prepare and trigger workflow for each workflow name and input
261
+ request = self._prepare_workflow_request(workflow_name, input_data, options)
262
+ workflow_run_requests.append(request)
263
+
264
+ request = BulkTriggerWorkflowRequest(workflows=workflow_run_requests)
265
+
266
+ resp: BulkTriggerWorkflowResponse = await self.aio_client.BulkTriggerWorkflow(
267
+ request,
268
+ metadata=get_metadata(self.token),
269
+ )
270
+
271
+ return [
272
+ WorkflowRunRef(
273
+ workflow_run_id=workflow_run_id,
274
+ workflow_listener=self.pooled_workflow_listener,
275
+ workflow_run_event_listener=self.listener_client,
276
+ )
277
+ for workflow_run_id in resp.workflow_run_ids
278
+ ]
279
+
280
+ @tenacity_retry
281
+ async def put_workflow(
282
+ self,
283
+ name: str,
284
+ workflow: CreateWorkflowVersionOpts | WorkflowMeta,
285
+ overrides: CreateWorkflowVersionOpts | None = None,
286
+ ) -> WorkflowVersion:
287
+ opts = self._prepare_put_workflow_request(name, workflow, overrides)
288
+
289
+ return await self.aio_client.PutWorkflow(
290
+ opts,
291
+ metadata=get_metadata(self.token),
292
+ )
293
+
294
+ @tenacity_retry
295
+ async def put_rate_limit(
296
+ self,
297
+ key: str,
298
+ limit: int,
299
+ duration: RateLimitDuration = RateLimitDuration.SECOND,
300
+ ):
301
+ await self.aio_client.PutRateLimit(
302
+ PutRateLimitRequest(
303
+ key=key,
304
+ limit=limit,
305
+ duration=duration,
306
+ ),
307
+ metadata=get_metadata(self.token),
308
+ )
309
+
310
+ @tenacity_retry
311
+ async def schedule_workflow(
312
+ self,
313
+ name: str,
314
+ schedules: List[Union[datetime, timestamp_pb2.Timestamp]],
315
+ input={},
316
+ options: ScheduleTriggerWorkflowOptions = None,
317
+ ) -> WorkflowVersion:
318
+ try:
319
+ namespace = self.namespace
320
+
321
+ if (
322
+ options is not None
323
+ and "namespace" in options
324
+ and options["namespace"] is not None
325
+ ):
326
+ namespace = options["namespace"]
327
+ del options["namespace"]
328
+
329
+ if namespace != "" and not name.startswith(self.namespace):
330
+ name = f"{namespace}{name}"
331
+
332
+ request = self._prepare_schedule_workflow_request(
333
+ name, schedules, input, options
334
+ )
335
+
336
+ return await self.aio_client.ScheduleWorkflow(
337
+ request,
338
+ metadata=get_metadata(self.token),
339
+ )
340
+ except (grpc.aio.AioRpcError, grpc.RpcError) as e:
341
+ if e.code() == grpc.StatusCode.ALREADY_EXISTS:
342
+ raise DedupeViolationErr(e.details())
343
+
344
+ raise e
345
+
346
+
347
+ class AdminClient(AdminClientBase):
348
+ def __init__(self, config: ClientConfig):
349
+ conn = new_conn(config)
350
+ self.config = config
351
+ self.client = WorkflowServiceStub(conn)
352
+ self.aio = AdminClientAioImpl(config)
353
+ self.token = config.token
354
+ self.listener_client = new_listener(config)
355
+ self.namespace = config.namespace
356
+
357
+ @tenacity_retry
358
+ def put_workflow(
359
+ self,
360
+ name: str,
361
+ workflow: CreateWorkflowVersionOpts | WorkflowMeta,
362
+ overrides: CreateWorkflowVersionOpts | None = None,
363
+ ) -> WorkflowVersion:
364
+ opts = self._prepare_put_workflow_request(name, workflow, overrides)
365
+
366
+ resp: WorkflowVersion = self.client.PutWorkflow(
367
+ opts,
368
+ metadata=get_metadata(self.token),
369
+ )
370
+
371
+ return resp
372
+
373
+ @tenacity_retry
374
+ def put_rate_limit(
375
+ self,
376
+ key: str,
377
+ limit: int,
378
+ duration: Union[RateLimitDuration.Value, str] = RateLimitDuration.SECOND,
379
+ ):
380
+ self.client.PutRateLimit(
381
+ PutRateLimitRequest(
382
+ key=key,
383
+ limit=limit,
384
+ duration=duration,
385
+ ),
386
+ metadata=get_metadata(self.token),
387
+ )
388
+
389
+ @tenacity_retry
390
+ def schedule_workflow(
391
+ self,
392
+ name: str,
393
+ schedules: List[Union[datetime, timestamp_pb2.Timestamp]],
394
+ input={},
395
+ options: ScheduleTriggerWorkflowOptions = None,
396
+ ) -> WorkflowVersion:
397
+ try:
398
+ namespace = self.namespace
399
+
400
+ if (
401
+ options is not None
402
+ and "namespace" in options
403
+ and options["namespace"] is not None
404
+ ):
405
+ namespace = options["namespace"]
406
+ del options["namespace"]
407
+
408
+ if namespace != "" and not name.startswith(self.namespace):
409
+ name = f"{namespace}{name}"
410
+
411
+ request = self._prepare_schedule_workflow_request(
412
+ name, schedules, input, options
413
+ )
414
+
415
+ return self.client.ScheduleWorkflow(
416
+ request,
417
+ metadata=get_metadata(self.token),
418
+ )
419
+ except (grpc.RpcError, grpc.aio.AioRpcError) as e:
420
+ if e.code() == grpc.StatusCode.ALREADY_EXISTS:
421
+ raise DedupeViolationErr(e.details())
422
+
423
+ raise e
424
+
425
+ ## IMPORTANT: Keep this method's signature in sync with the wrapper in the OTel instrumentor
426
+ @tenacity_retry
427
+ def run_workflow(
428
+ self, workflow_name: str, input: any, options: TriggerWorkflowOptions = None
429
+ ) -> WorkflowRunRef:
430
+ try:
431
+ if not self.pooled_workflow_listener:
432
+ self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
433
+
434
+ namespace = self.namespace
435
+
436
+ ## TODO: Factor this out - it's repeated a lot of places
437
+ if (
438
+ options is not None
439
+ and "namespace" in options
440
+ and options["namespace"] is not None
441
+ ):
442
+ namespace = options.pop("namespace")
443
+
444
+ if namespace != "" and not workflow_name.startswith(self.namespace):
445
+ workflow_name = f"{namespace}{workflow_name}"
446
+
447
+ request = self._prepare_workflow_request(workflow_name, input, options)
448
+
449
+ resp: TriggerWorkflowResponse = self.client.TriggerWorkflow(
450
+ request,
451
+ metadata=get_metadata(self.token),
452
+ )
453
+
454
+ return WorkflowRunRef(
455
+ workflow_run_id=resp.workflow_run_id,
456
+ workflow_listener=self.pooled_workflow_listener,
457
+ workflow_run_event_listener=self.listener_client,
458
+ )
459
+ except (grpc.RpcError, grpc.aio.AioRpcError) as e:
460
+ if e.code() == grpc.StatusCode.ALREADY_EXISTS:
461
+ raise DedupeViolationErr(e.details())
462
+
463
+ raise e
464
+
465
+ ## IMPORTANT: Keep this method's signature in sync with the wrapper in the OTel instrumentor
466
+ @tenacity_retry
467
+ def run_workflows(
468
+ self, workflows: List[WorkflowRunDict], options: TriggerWorkflowOptions = None
469
+ ) -> list[WorkflowRunRef]:
470
+ workflow_run_requests: TriggerWorkflowRequest = []
471
+ if not self.pooled_workflow_listener:
472
+ self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
473
+
474
+ for workflow in workflows:
475
+ workflow_name = workflow["workflow_name"]
476
+ input_data = workflow["input"]
477
+ options = workflow["options"]
478
+
479
+ namespace = self.namespace
480
+
481
+ if (
482
+ options is not None
483
+ and "namespace" in options
484
+ and options["namespace"] is not None
485
+ ):
486
+ namespace = options["namespace"]
487
+ del options["namespace"]
488
+
489
+ if namespace != "" and not workflow_name.startswith(self.namespace):
490
+ workflow_name = f"{namespace}{workflow_name}"
491
+
492
+ # Prepare and trigger workflow for each workflow name and input
493
+ request = self._prepare_workflow_request(workflow_name, input_data, options)
494
+
495
+ workflow_run_requests.append(request)
496
+
497
+ request = BulkTriggerWorkflowRequest(workflows=workflow_run_requests)
498
+
499
+ resp: BulkTriggerWorkflowResponse = self.client.BulkTriggerWorkflow(
500
+ request,
501
+ metadata=get_metadata(self.token),
502
+ )
503
+
504
+ return [
505
+ WorkflowRunRef(
506
+ workflow_run_id=workflow_run_id,
507
+ workflow_listener=self.pooled_workflow_listener,
508
+ workflow_run_event_listener=self.listener_client,
509
+ )
510
+ for workflow_run_id in resp.workflow_run_ids
511
+ ]
512
+
513
+ def run(
514
+ self,
515
+ function: Union[str, Callable[[Any], T]],
516
+ input: any,
517
+ options: TriggerWorkflowOptions = None,
518
+ ) -> "RunRef[T]":
519
+ workflow_name = function
520
+
521
+ if not isinstance(function, str):
522
+ workflow_name = function.function_name
523
+
524
+ wrr = self.run_workflow(workflow_name, input, options)
525
+
526
+ return RunRef[T](
527
+ wrr.workflow_run_id, wrr.workflow_listener, wrr.workflow_run_event_listener
528
+ )
529
+
530
+ def get_workflow_run(self, workflow_run_id: str) -> WorkflowRunRef:
531
+ try:
532
+ if not self.pooled_workflow_listener:
533
+ self.pooled_workflow_listener = PooledWorkflowRunListener(self.config)
534
+
535
+ return WorkflowRunRef(
536
+ workflow_run_id=workflow_run_id,
537
+ workflow_listener=self.pooled_workflow_listener,
538
+ workflow_run_event_listener=self.listener_client,
539
+ )
540
+ except grpc.RpcError as e:
541
+ raise ValueError(f"Could not get workflow run: {e}")