hatchet-sdk 1.18.1__py3-none-any.whl → 1.20.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.

Potentially problematic release.


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

Files changed (234) hide show
  1. hatchet_sdk/clients/dispatcher/action_listener.py +0 -1
  2. hatchet_sdk/clients/dispatcher/dispatcher.py +0 -30
  3. hatchet_sdk/hatchet.py +0 -20
  4. hatchet_sdk/opentelemetry/instrumentor.py +1 -27
  5. hatchet_sdk/runnables/action.py +2 -5
  6. hatchet_sdk/runnables/task.py +0 -1
  7. hatchet_sdk/utils/opentelemetry.py +0 -1
  8. hatchet_sdk/worker/action_listener_process.py +0 -29
  9. hatchet_sdk/worker/runner/runner.py +1 -105
  10. {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.20.0.dist-info}/METADATA +2 -3
  11. {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.20.0.dist-info}/RECORD +13 -234
  12. hatchet_sdk/v0/__init__.py +0 -251
  13. hatchet_sdk/v0/client.py +0 -119
  14. hatchet_sdk/v0/clients/admin.py +0 -541
  15. hatchet_sdk/v0/clients/dispatcher/action_listener.py +0 -422
  16. hatchet_sdk/v0/clients/dispatcher/dispatcher.py +0 -204
  17. hatchet_sdk/v0/clients/event_ts.py +0 -28
  18. hatchet_sdk/v0/clients/events.py +0 -182
  19. hatchet_sdk/v0/clients/rest/__init__.py +0 -307
  20. hatchet_sdk/v0/clients/rest/api/__init__.py +0 -19
  21. hatchet_sdk/v0/clients/rest/api/api_token_api.py +0 -858
  22. hatchet_sdk/v0/clients/rest/api/default_api.py +0 -2259
  23. hatchet_sdk/v0/clients/rest/api/event_api.py +0 -2548
  24. hatchet_sdk/v0/clients/rest/api/github_api.py +0 -331
  25. hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +0 -483
  26. hatchet_sdk/v0/clients/rest/api/log_api.py +0 -449
  27. hatchet_sdk/v0/clients/rest/api/metadata_api.py +0 -728
  28. hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +0 -423
  29. hatchet_sdk/v0/clients/rest/api/slack_api.py +0 -577
  30. hatchet_sdk/v0/clients/rest/api/sns_api.py +0 -872
  31. hatchet_sdk/v0/clients/rest/api/step_run_api.py +0 -2202
  32. hatchet_sdk/v0/clients/rest/api/tenant_api.py +0 -4430
  33. hatchet_sdk/v0/clients/rest/api/user_api.py +0 -2888
  34. hatchet_sdk/v0/clients/rest/api/worker_api.py +0 -858
  35. hatchet_sdk/v0/clients/rest/api/workflow_api.py +0 -6312
  36. hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +0 -1932
  37. hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +0 -610
  38. hatchet_sdk/v0/clients/rest/api_client.py +0 -759
  39. hatchet_sdk/v0/clients/rest/api_response.py +0 -22
  40. hatchet_sdk/v0/clients/rest/configuration.py +0 -611
  41. hatchet_sdk/v0/clients/rest/exceptions.py +0 -200
  42. hatchet_sdk/v0/clients/rest/models/__init__.py +0 -274
  43. hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +0 -83
  44. hatchet_sdk/v0/clients/rest/models/api_error.py +0 -102
  45. hatchet_sdk/v0/clients/rest/models/api_errors.py +0 -100
  46. hatchet_sdk/v0/clients/rest/models/api_meta.py +0 -144
  47. hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +0 -85
  48. hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +0 -88
  49. hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +0 -90
  50. hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +0 -98
  51. hatchet_sdk/v0/clients/rest/models/api_token.py +0 -105
  52. hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +0 -100
  53. hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +0 -110
  54. hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +0 -85
  55. hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +0 -83
  56. hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +0 -39
  57. hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +0 -92
  58. hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +0 -83
  59. hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +0 -98
  60. hatchet_sdk/v0/clients/rest/models/create_event_request.py +0 -95
  61. hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +0 -83
  62. hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +0 -85
  63. hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +0 -83
  64. hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +0 -86
  65. hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +0 -84
  66. hatchet_sdk/v0/clients/rest/models/cron_workflows.py +0 -131
  67. hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +0 -110
  68. hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +0 -37
  69. hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +0 -37
  70. hatchet_sdk/v0/clients/rest/models/event.py +0 -143
  71. hatchet_sdk/v0/clients/rest/models/event_data.py +0 -83
  72. hatchet_sdk/v0/clients/rest/models/event_key_list.py +0 -98
  73. hatchet_sdk/v0/clients/rest/models/event_list.py +0 -110
  74. hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +0 -37
  75. hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +0 -36
  76. hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +0 -85
  77. hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +0 -116
  78. hatchet_sdk/v0/clients/rest/models/events.py +0 -110
  79. hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +0 -100
  80. hatchet_sdk/v0/clients/rest/models/github_app_installation.py +0 -107
  81. hatchet_sdk/v0/clients/rest/models/github_branch.py +0 -86
  82. hatchet_sdk/v0/clients/rest/models/github_repo.py +0 -86
  83. hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +0 -83
  84. hatchet_sdk/v0/clients/rest/models/job.py +0 -132
  85. hatchet_sdk/v0/clients/rest/models/job_run.py +0 -176
  86. hatchet_sdk/v0/clients/rest/models/job_run_status.py +0 -41
  87. hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +0 -106
  88. hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +0 -110
  89. hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +0 -112
  90. hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +0 -100
  91. hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +0 -110
  92. hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +0 -110
  93. hatchet_sdk/v0/clients/rest/models/log_line.py +0 -94
  94. hatchet_sdk/v0/clients/rest/models/log_line_level.py +0 -39
  95. hatchet_sdk/v0/clients/rest/models/log_line_list.py +0 -110
  96. hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +0 -37
  97. hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +0 -36
  98. hatchet_sdk/v0/clients/rest/models/pagination_response.py +0 -95
  99. hatchet_sdk/v0/clients/rest/models/pull_request.py +0 -112
  100. hatchet_sdk/v0/clients/rest/models/pull_request_state.py +0 -37
  101. hatchet_sdk/v0/clients/rest/models/queue_metrics.py +0 -97
  102. hatchet_sdk/v0/clients/rest/models/rate_limit.py +0 -117
  103. hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +0 -110
  104. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +0 -37
  105. hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +0 -38
  106. hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +0 -118
  107. hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +0 -83
  108. hatchet_sdk/v0/clients/rest/models/replay_event_request.py +0 -85
  109. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +0 -85
  110. hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +0 -100
  111. hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +0 -83
  112. hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +0 -92
  113. hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +0 -42
  114. hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +0 -149
  115. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +0 -110
  116. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +0 -37
  117. hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +0 -37
  118. hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +0 -113
  119. hatchet_sdk/v0/clients/rest/models/slack_webhook.py +0 -127
  120. hatchet_sdk/v0/clients/rest/models/sns_integration.py +0 -114
  121. hatchet_sdk/v0/clients/rest/models/step.py +0 -123
  122. hatchet_sdk/v0/clients/rest/models/step_run.py +0 -202
  123. hatchet_sdk/v0/clients/rest/models/step_run_archive.py +0 -142
  124. hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +0 -110
  125. hatchet_sdk/v0/clients/rest/models/step_run_diff.py +0 -91
  126. hatchet_sdk/v0/clients/rest/models/step_run_event.py +0 -122
  127. hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +0 -110
  128. hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +0 -52
  129. hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +0 -38
  130. hatchet_sdk/v0/clients/rest/models/step_run_status.py +0 -44
  131. hatchet_sdk/v0/clients/rest/models/tenant.py +0 -118
  132. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +0 -98
  133. hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +0 -112
  134. hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +0 -143
  135. hatchet_sdk/v0/clients/rest/models/tenant_invite.py +0 -120
  136. hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +0 -110
  137. hatchet_sdk/v0/clients/rest/models/tenant_list.py +0 -110
  138. hatchet_sdk/v0/clients/rest/models/tenant_member.py +0 -123
  139. hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +0 -110
  140. hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +0 -38
  141. hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +0 -116
  142. hatchet_sdk/v0/clients/rest/models/tenant_resource.py +0 -40
  143. hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +0 -135
  144. hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +0 -102
  145. hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +0 -83
  146. hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +0 -91
  147. hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +0 -83
  148. hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +0 -85
  149. hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +0 -137
  150. hatchet_sdk/v0/clients/rest/models/update_worker_request.py +0 -87
  151. hatchet_sdk/v0/clients/rest/models/user.py +0 -126
  152. hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +0 -88
  153. hatchet_sdk/v0/clients/rest/models/user_login_request.py +0 -86
  154. hatchet_sdk/v0/clients/rest/models/user_register_request.py +0 -91
  155. hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +0 -110
  156. hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +0 -86
  157. hatchet_sdk/v0/clients/rest/models/webhook_worker.py +0 -100
  158. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +0 -94
  159. hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +0 -98
  160. hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +0 -102
  161. hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +0 -110
  162. hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +0 -102
  163. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +0 -104
  164. hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +0 -38
  165. hatchet_sdk/v0/clients/rest/models/worker.py +0 -239
  166. hatchet_sdk/v0/clients/rest/models/worker_label.py +0 -102
  167. hatchet_sdk/v0/clients/rest/models/worker_list.py +0 -110
  168. hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +0 -103
  169. hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +0 -38
  170. hatchet_sdk/v0/clients/rest/models/worker_type.py +0 -38
  171. hatchet_sdk/v0/clients/rest/models/workflow.py +0 -165
  172. hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +0 -107
  173. hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +0 -136
  174. hatchet_sdk/v0/clients/rest/models/workflow_kind.py +0 -38
  175. hatchet_sdk/v0/clients/rest/models/workflow_list.py +0 -120
  176. hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +0 -97
  177. hatchet_sdk/v0/clients/rest/models/workflow_run.py +0 -188
  178. hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +0 -85
  179. hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +0 -110
  180. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +0 -37
  181. hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +0 -39
  182. hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +0 -186
  183. hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +0 -42
  184. hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +0 -112
  185. hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +0 -85
  186. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +0 -94
  187. hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +0 -104
  188. hatchet_sdk/v0/clients/rest/models/workflow_tag.py +0 -84
  189. hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +0 -86
  190. hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +0 -86
  191. hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +0 -141
  192. hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +0 -85
  193. hatchet_sdk/v0/clients/rest/models/workflow_version.py +0 -170
  194. hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +0 -114
  195. hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +0 -85
  196. hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +0 -123
  197. hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +0 -95
  198. hatchet_sdk/v0/clients/rest/rest.py +0 -187
  199. hatchet_sdk/v0/clients/rest/tenacity_utils.py +0 -39
  200. hatchet_sdk/v0/clients/rest_client.py +0 -622
  201. hatchet_sdk/v0/clients/run_event_listener.py +0 -260
  202. hatchet_sdk/v0/clients/workflow_listener.py +0 -277
  203. hatchet_sdk/v0/connection.py +0 -63
  204. hatchet_sdk/v0/context/__init__.py +0 -1
  205. hatchet_sdk/v0/context/context.py +0 -446
  206. hatchet_sdk/v0/context/worker_context.py +0 -28
  207. hatchet_sdk/v0/features/cron.py +0 -286
  208. hatchet_sdk/v0/features/scheduled.py +0 -248
  209. hatchet_sdk/v0/hatchet.py +0 -310
  210. hatchet_sdk/v0/labels.py +0 -10
  211. hatchet_sdk/v0/loader.py +0 -244
  212. hatchet_sdk/v0/metadata.py +0 -2
  213. hatchet_sdk/v0/opentelemetry/instrumentor.py +0 -393
  214. hatchet_sdk/v0/rate_limit.py +0 -126
  215. hatchet_sdk/v0/semver.py +0 -30
  216. hatchet_sdk/v0/token.py +0 -27
  217. hatchet_sdk/v0/utils/aio_utils.py +0 -137
  218. hatchet_sdk/v0/utils/backoff.py +0 -9
  219. hatchet_sdk/v0/utils/types.py +0 -8
  220. hatchet_sdk/v0/utils/typing.py +0 -12
  221. hatchet_sdk/v0/v2/callable.py +0 -202
  222. hatchet_sdk/v0/v2/concurrency.py +0 -47
  223. hatchet_sdk/v0/v2/hatchet.py +0 -224
  224. hatchet_sdk/v0/worker/__init__.py +0 -1
  225. hatchet_sdk/v0/worker/action_listener_process.py +0 -294
  226. hatchet_sdk/v0/worker/runner/run_loop_manager.py +0 -112
  227. hatchet_sdk/v0/worker/runner/runner.py +0 -460
  228. hatchet_sdk/v0/worker/runner/utils/capture_logs.py +0 -81
  229. hatchet_sdk/v0/worker/runner/utils/error_with_traceback.py +0 -6
  230. hatchet_sdk/v0/worker/worker.py +0 -391
  231. hatchet_sdk/v0/workflow.py +0 -261
  232. hatchet_sdk/v0/workflow_run.py +0 -59
  233. {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.20.0.dist-info}/WHEEL +0 -0
  234. {hatchet_sdk-1.18.1.dist-info → hatchet_sdk-1.20.0.dist-info}/entry_points.txt +0 -0
hatchet_sdk/v0/client.py DELETED
@@ -1,119 +0,0 @@
1
- import asyncio
2
- from logging import Logger
3
- from typing import Callable
4
-
5
- import grpc
6
-
7
- from hatchet_sdk.v0.clients.run_event_listener import RunEventListenerClient
8
- from hatchet_sdk.v0.clients.workflow_listener import PooledWorkflowRunListener
9
- from hatchet_sdk.v0.connection import new_conn
10
-
11
- from .clients.admin import AdminClient, new_admin
12
- from .clients.dispatcher.dispatcher import DispatcherClient, new_dispatcher
13
- from .clients.events import EventClient, new_event
14
- from .clients.rest_client import RestApi
15
- from .loader import ClientConfig, ConfigLoader
16
-
17
-
18
- class Client:
19
- admin: AdminClient
20
- dispatcher: DispatcherClient
21
- event: EventClient
22
- rest: RestApi
23
- workflow_listener: PooledWorkflowRunListener
24
- logInterceptor: Logger
25
- debug: bool = False
26
-
27
- @classmethod
28
- def from_environment(
29
- cls,
30
- defaults: ClientConfig = ClientConfig(),
31
- debug: bool = False,
32
- *opts_functions: Callable[[ClientConfig], None],
33
- ):
34
- try:
35
- loop = asyncio.get_running_loop()
36
- except RuntimeError:
37
- loop = asyncio.new_event_loop()
38
- asyncio.set_event_loop(loop)
39
-
40
- config: ClientConfig = ConfigLoader(".").load_client_config(defaults)
41
- for opt_function in opts_functions:
42
- opt_function(config)
43
-
44
- return cls.from_config(config, debug)
45
-
46
- @classmethod
47
- def from_config(
48
- cls,
49
- config: ClientConfig = ClientConfig(),
50
- debug: bool = False,
51
- ):
52
- try:
53
- loop = asyncio.get_running_loop()
54
- except RuntimeError:
55
- loop = asyncio.new_event_loop()
56
- asyncio.set_event_loop(loop)
57
-
58
- if config.tls_config is None:
59
- raise ValueError("TLS config is required")
60
-
61
- if config.host_port is None:
62
- raise ValueError("Host and port are required")
63
-
64
- conn: grpc.Channel = new_conn(config)
65
-
66
- # Instantiate clients
67
- event_client = new_event(conn, config)
68
- admin_client = new_admin(config)
69
- dispatcher_client = new_dispatcher(config)
70
- rest_client = RestApi(config.server_url, config.token, config.tenant_id)
71
- workflow_listener = None # Initialize this if needed
72
-
73
- return cls(
74
- event_client,
75
- admin_client,
76
- dispatcher_client,
77
- workflow_listener,
78
- rest_client,
79
- config,
80
- debug,
81
- )
82
-
83
- def __init__(
84
- self,
85
- event_client: EventClient,
86
- admin_client: AdminClient,
87
- dispatcher_client: DispatcherClient,
88
- workflow_listener: PooledWorkflowRunListener,
89
- rest_client: RestApi,
90
- config: ClientConfig,
91
- debug: bool = False,
92
- ):
93
- try:
94
- loop = asyncio.get_running_loop()
95
- except RuntimeError:
96
- loop = asyncio.new_event_loop()
97
- asyncio.set_event_loop(loop)
98
-
99
- self.admin = admin_client
100
- self.dispatcher = dispatcher_client
101
- self.event = event_client
102
- self.rest = rest_client
103
- self.config = config
104
- self.listener = RunEventListenerClient(config)
105
- self.workflow_listener = workflow_listener
106
- self.logInterceptor = config.logInterceptor
107
- self.debug = debug
108
-
109
-
110
- def with_host_port(host: str, port: int):
111
- def with_host_port_impl(config: ClientConfig):
112
- config.host = host
113
- config.port = port
114
-
115
- return with_host_port_impl
116
-
117
-
118
- new_client = Client.from_environment
119
- new_client_raw = Client.from_config
@@ -1,541 +0,0 @@
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.contracts.workflows_pb2 import (
9
- BulkTriggerWorkflowRequest,
10
- BulkTriggerWorkflowResponse,
11
- CreateWorkflowVersionOpts,
12
- PutRateLimitRequest,
13
- PutWorkflowRequest,
14
- RateLimitDuration,
15
- ScheduleWorkflowRequest,
16
- TriggerWorkflowRequest,
17
- TriggerWorkflowResponse,
18
- WorkflowVersion,
19
- )
20
- from hatchet_sdk.contracts.workflows_pb2_grpc import WorkflowServiceStub
21
- from hatchet_sdk.v0.clients.rest.models.workflow_run import WorkflowRun
22
- from hatchet_sdk.v0.clients.rest.tenacity_utils import tenacity_retry
23
- from hatchet_sdk.v0.clients.run_event_listener import new_listener
24
- from hatchet_sdk.v0.clients.workflow_listener import PooledWorkflowRunListener
25
- from hatchet_sdk.v0.connection import new_conn
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}")