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.
- hatchet_sdk/__init__.py +45 -25
- hatchet_sdk/client.py +19 -94
- hatchet_sdk/clients/admin.py +309 -389
- hatchet_sdk/clients/dispatcher/action_listener.py +131 -109
- hatchet_sdk/clients/dispatcher/dispatcher.py +39 -37
- hatchet_sdk/clients/durable_event_listener.py +327 -0
- hatchet_sdk/clients/event_ts.py +23 -10
- hatchet_sdk/clients/events.py +96 -99
- hatchet_sdk/clients/rest/__init__.py +35 -0
- hatchet_sdk/clients/rest/api/__init__.py +2 -0
- hatchet_sdk/clients/rest/api/log_api.py +258 -0
- hatchet_sdk/clients/rest/api/task_api.py +2200 -0
- hatchet_sdk/clients/rest/api/workflow_runs_api.py +1274 -116
- hatchet_sdk/clients/rest/api_client.py +1 -1
- hatchet_sdk/clients/rest/configuration.py +8 -1
- hatchet_sdk/clients/rest/exceptions.py +21 -0
- hatchet_sdk/clients/rest/models/__init__.py +33 -0
- hatchet_sdk/clients/rest/models/tenant.py +4 -0
- hatchet_sdk/clients/rest/models/tenant_version.py +37 -0
- hatchet_sdk/clients/rest/models/update_tenant_request.py +7 -0
- hatchet_sdk/clients/rest/models/v1_cancel_task_request.py +104 -0
- hatchet_sdk/clients/rest/models/v1_dag_children.py +102 -0
- hatchet_sdk/clients/rest/models/v1_log_line.py +94 -0
- hatchet_sdk/clients/rest/models/v1_log_line_level.py +39 -0
- hatchet_sdk/clients/rest/models/v1_log_line_list.py +110 -0
- hatchet_sdk/clients/rest/models/v1_replay_task_request.py +104 -0
- hatchet_sdk/clients/rest/models/v1_task.py +174 -0
- hatchet_sdk/clients/rest/models/v1_task_event.py +118 -0
- hatchet_sdk/clients/rest/models/v1_task_event_list.py +110 -0
- hatchet_sdk/clients/rest/models/v1_task_event_type.py +55 -0
- hatchet_sdk/clients/rest/models/v1_task_filter.py +106 -0
- hatchet_sdk/clients/rest/models/v1_task_point_metric.py +92 -0
- hatchet_sdk/clients/rest/models/v1_task_point_metrics.py +100 -0
- hatchet_sdk/clients/rest/models/v1_task_run_metric.py +88 -0
- hatchet_sdk/clients/rest/models/v1_task_run_status.py +40 -0
- hatchet_sdk/clients/rest/models/v1_task_status.py +40 -0
- hatchet_sdk/clients/rest/models/v1_task_summary.py +228 -0
- hatchet_sdk/clients/rest/models/v1_task_summary_list.py +110 -0
- hatchet_sdk/clients/rest/models/v1_trigger_workflow_run_request.py +95 -0
- hatchet_sdk/clients/rest/models/v1_workflow_run.py +171 -0
- hatchet_sdk/clients/rest/models/v1_workflow_run_details.py +145 -0
- hatchet_sdk/clients/rest/models/v1_workflow_run_display_name.py +98 -0
- hatchet_sdk/clients/rest/models/v1_workflow_run_display_name_list.py +114 -0
- hatchet_sdk/clients/rest/models/v1_workflow_type.py +37 -0
- hatchet_sdk/clients/rest/models/workflow_run_shape_item_for_workflow_run_details.py +104 -0
- hatchet_sdk/clients/rest/rest.py +37 -26
- hatchet_sdk/clients/rest/tenacity_utils.py +1 -1
- hatchet_sdk/clients/rest_client.py +153 -116
- hatchet_sdk/clients/run_event_listener.py +65 -60
- hatchet_sdk/clients/workflow_listener.py +75 -66
- hatchet_sdk/config.py +117 -0
- hatchet_sdk/connection.py +27 -13
- hatchet_sdk/context/__init__.py +0 -1
- hatchet_sdk/context/context.py +118 -280
- hatchet_sdk/contracts/dispatcher_pb2_grpc.py +1 -1
- hatchet_sdk/contracts/events_pb2.py +2 -2
- hatchet_sdk/contracts/events_pb2_grpc.py +1 -1
- hatchet_sdk/contracts/v1/dispatcher_pb2.py +36 -0
- hatchet_sdk/contracts/v1/dispatcher_pb2.pyi +38 -0
- hatchet_sdk/contracts/v1/dispatcher_pb2_grpc.py +145 -0
- hatchet_sdk/contracts/v1/shared/condition_pb2.py +39 -0
- hatchet_sdk/contracts/v1/shared/condition_pb2.pyi +72 -0
- hatchet_sdk/contracts/v1/shared/condition_pb2_grpc.py +29 -0
- hatchet_sdk/contracts/v1/workflows_pb2.py +67 -0
- hatchet_sdk/contracts/v1/workflows_pb2.pyi +228 -0
- hatchet_sdk/contracts/v1/workflows_pb2_grpc.py +234 -0
- hatchet_sdk/contracts/workflows_pb2_grpc.py +1 -1
- hatchet_sdk/features/cron.py +43 -57
- hatchet_sdk/features/scheduled.py +60 -74
- hatchet_sdk/hatchet.py +491 -218
- hatchet_sdk/labels.py +4 -6
- hatchet_sdk/metadata.py +1 -1
- hatchet_sdk/opentelemetry/instrumentor.py +17 -18
- hatchet_sdk/rate_limit.py +40 -55
- hatchet_sdk/runnables/contextvars.py +12 -0
- hatchet_sdk/runnables/standalone.py +194 -0
- hatchet_sdk/runnables/task.py +144 -0
- hatchet_sdk/runnables/types.py +138 -0
- hatchet_sdk/runnables/workflow.py +764 -0
- hatchet_sdk/token.py +13 -9
- hatchet_sdk/utils/aio_utils.py +0 -119
- hatchet_sdk/utils/proto_enums.py +47 -0
- hatchet_sdk/utils/timedelta_to_expression.py +23 -0
- hatchet_sdk/utils/typing.py +10 -2
- hatchet_sdk/v0/__init__.py +251 -0
- hatchet_sdk/v0/client.py +119 -0
- hatchet_sdk/v0/clients/admin.py +541 -0
- hatchet_sdk/v0/clients/dispatcher/action_listener.py +422 -0
- hatchet_sdk/v0/clients/dispatcher/dispatcher.py +204 -0
- hatchet_sdk/v0/clients/event_ts.py +28 -0
- hatchet_sdk/v0/clients/events.py +182 -0
- hatchet_sdk/v0/clients/rest/__init__.py +307 -0
- hatchet_sdk/v0/clients/rest/api/__init__.py +19 -0
- hatchet_sdk/v0/clients/rest/api/api_token_api.py +858 -0
- hatchet_sdk/v0/clients/rest/api/default_api.py +2259 -0
- hatchet_sdk/v0/clients/rest/api/event_api.py +2548 -0
- hatchet_sdk/v0/clients/rest/api/github_api.py +331 -0
- hatchet_sdk/v0/clients/rest/api/healthcheck_api.py +483 -0
- hatchet_sdk/v0/clients/rest/api/log_api.py +449 -0
- hatchet_sdk/v0/clients/rest/api/metadata_api.py +728 -0
- hatchet_sdk/v0/clients/rest/api/rate_limits_api.py +423 -0
- hatchet_sdk/v0/clients/rest/api/slack_api.py +577 -0
- hatchet_sdk/v0/clients/rest/api/sns_api.py +872 -0
- hatchet_sdk/v0/clients/rest/api/step_run_api.py +2202 -0
- hatchet_sdk/v0/clients/rest/api/tenant_api.py +4430 -0
- hatchet_sdk/v0/clients/rest/api/user_api.py +2888 -0
- hatchet_sdk/v0/clients/rest/api/worker_api.py +858 -0
- hatchet_sdk/v0/clients/rest/api/workflow_api.py +6312 -0
- hatchet_sdk/v0/clients/rest/api/workflow_run_api.py +1932 -0
- hatchet_sdk/v0/clients/rest/api/workflow_runs_api.py +610 -0
- hatchet_sdk/v0/clients/rest/api_client.py +759 -0
- hatchet_sdk/v0/clients/rest/api_response.py +22 -0
- hatchet_sdk/v0/clients/rest/configuration.py +611 -0
- hatchet_sdk/v0/clients/rest/exceptions.py +200 -0
- hatchet_sdk/v0/clients/rest/models/__init__.py +274 -0
- hatchet_sdk/v0/clients/rest/models/accept_invite_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/api_error.py +102 -0
- hatchet_sdk/v0/clients/rest/models/api_errors.py +100 -0
- hatchet_sdk/v0/clients/rest/models/api_meta.py +144 -0
- hatchet_sdk/v0/clients/rest/models/api_meta_auth.py +85 -0
- hatchet_sdk/v0/clients/rest/models/api_meta_integration.py +88 -0
- hatchet_sdk/v0/clients/rest/models/api_meta_posthog.py +90 -0
- hatchet_sdk/v0/clients/rest/models/api_resource_meta.py +98 -0
- hatchet_sdk/v0/clients/rest/models/api_token.py +105 -0
- hatchet_sdk/v0/clients/rest/models/bulk_create_event_request.py +100 -0
- hatchet_sdk/v0/clients/rest/models/bulk_create_event_response.py +110 -0
- hatchet_sdk/v0/clients/rest/models/cancel_event_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/cancel_step_run_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/concurrency_limit_strategy.py +39 -0
- hatchet_sdk/v0/clients/rest/models/create_api_token_request.py +92 -0
- hatchet_sdk/v0/clients/rest/models/create_api_token_response.py +83 -0
- hatchet_sdk/v0/clients/rest/models/create_cron_workflow_trigger_request.py +98 -0
- hatchet_sdk/v0/clients/rest/models/create_event_request.py +95 -0
- hatchet_sdk/v0/clients/rest/models/create_pull_request_from_step_run.py +83 -0
- hatchet_sdk/v0/clients/rest/models/create_sns_integration_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/create_tenant_alert_email_group_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/create_tenant_invite_request.py +86 -0
- hatchet_sdk/v0/clients/rest/models/create_tenant_request.py +84 -0
- hatchet_sdk/v0/clients/rest/models/cron_workflows.py +131 -0
- hatchet_sdk/v0/clients/rest/models/cron_workflows_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/cron_workflows_method.py +37 -0
- hatchet_sdk/v0/clients/rest/models/cron_workflows_order_by_field.py +37 -0
- hatchet_sdk/v0/clients/rest/models/event.py +143 -0
- hatchet_sdk/v0/clients/rest/models/event_data.py +83 -0
- hatchet_sdk/v0/clients/rest/models/event_key_list.py +98 -0
- hatchet_sdk/v0/clients/rest/models/event_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/event_order_by_direction.py +37 -0
- hatchet_sdk/v0/clients/rest/models/event_order_by_field.py +36 -0
- hatchet_sdk/v0/clients/rest/models/event_update_cancel200_response.py +85 -0
- hatchet_sdk/v0/clients/rest/models/event_workflow_run_summary.py +116 -0
- hatchet_sdk/v0/clients/rest/models/events.py +110 -0
- hatchet_sdk/v0/clients/rest/models/get_step_run_diff_response.py +100 -0
- hatchet_sdk/v0/clients/rest/models/github_app_installation.py +107 -0
- hatchet_sdk/v0/clients/rest/models/github_branch.py +86 -0
- hatchet_sdk/v0/clients/rest/models/github_repo.py +86 -0
- hatchet_sdk/v0/clients/rest/models/info_get_version200_response.py +83 -0
- hatchet_sdk/v0/clients/rest/models/job.py +132 -0
- hatchet_sdk/v0/clients/rest/models/job_run.py +176 -0
- hatchet_sdk/v0/clients/rest/models/job_run_status.py +41 -0
- hatchet_sdk/v0/clients/rest/models/link_github_repository_request.py +106 -0
- hatchet_sdk/v0/clients/rest/models/list_api_tokens_response.py +110 -0
- hatchet_sdk/v0/clients/rest/models/list_github_app_installations_response.py +112 -0
- hatchet_sdk/v0/clients/rest/models/list_pull_requests_response.py +100 -0
- hatchet_sdk/v0/clients/rest/models/list_slack_webhooks.py +110 -0
- hatchet_sdk/v0/clients/rest/models/list_sns_integrations.py +110 -0
- hatchet_sdk/v0/clients/rest/models/log_line.py +94 -0
- hatchet_sdk/v0/clients/rest/models/log_line_level.py +39 -0
- hatchet_sdk/v0/clients/rest/models/log_line_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/log_line_order_by_direction.py +37 -0
- hatchet_sdk/v0/clients/rest/models/log_line_order_by_field.py +36 -0
- hatchet_sdk/v0/clients/rest/models/pagination_response.py +95 -0
- hatchet_sdk/v0/clients/rest/models/pull_request.py +112 -0
- hatchet_sdk/v0/clients/rest/models/pull_request_state.py +37 -0
- hatchet_sdk/v0/clients/rest/models/queue_metrics.py +97 -0
- hatchet_sdk/v0/clients/rest/models/rate_limit.py +117 -0
- hatchet_sdk/v0/clients/rest/models/rate_limit_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_direction.py +37 -0
- hatchet_sdk/v0/clients/rest/models/rate_limit_order_by_field.py +38 -0
- hatchet_sdk/v0/clients/rest/models/recent_step_runs.py +118 -0
- hatchet_sdk/v0/clients/rest/models/reject_invite_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/replay_event_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/replay_workflow_runs_response.py +100 -0
- hatchet_sdk/v0/clients/rest/models/rerun_step_run_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/schedule_workflow_run_request.py +92 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_run_status.py +42 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows.py +149 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_method.py +37 -0
- hatchet_sdk/v0/clients/rest/models/scheduled_workflows_order_by_field.py +37 -0
- hatchet_sdk/v0/clients/rest/models/semaphore_slots.py +113 -0
- hatchet_sdk/v0/clients/rest/models/slack_webhook.py +127 -0
- hatchet_sdk/v0/clients/rest/models/sns_integration.py +114 -0
- hatchet_sdk/v0/clients/rest/models/step.py +123 -0
- hatchet_sdk/v0/clients/rest/models/step_run.py +202 -0
- hatchet_sdk/v0/clients/rest/models/step_run_archive.py +142 -0
- hatchet_sdk/v0/clients/rest/models/step_run_archive_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/step_run_diff.py +91 -0
- hatchet_sdk/v0/clients/rest/models/step_run_event.py +122 -0
- hatchet_sdk/v0/clients/rest/models/step_run_event_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/step_run_event_reason.py +52 -0
- hatchet_sdk/v0/clients/rest/models/step_run_event_severity.py +38 -0
- hatchet_sdk/v0/clients/rest/models/step_run_status.py +44 -0
- hatchet_sdk/v0/clients/rest/models/tenant.py +118 -0
- hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group.py +98 -0
- hatchet_sdk/v0/clients/rest/models/tenant_alert_email_group_list.py +112 -0
- hatchet_sdk/v0/clients/rest/models/tenant_alerting_settings.py +143 -0
- hatchet_sdk/v0/clients/rest/models/tenant_invite.py +120 -0
- hatchet_sdk/v0/clients/rest/models/tenant_invite_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/tenant_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/tenant_member.py +123 -0
- hatchet_sdk/v0/clients/rest/models/tenant_member_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/tenant_member_role.py +38 -0
- hatchet_sdk/v0/clients/rest/models/tenant_queue_metrics.py +116 -0
- hatchet_sdk/v0/clients/rest/models/tenant_resource.py +40 -0
- hatchet_sdk/v0/clients/rest/models/tenant_resource_limit.py +135 -0
- hatchet_sdk/v0/clients/rest/models/tenant_resource_policy.py +102 -0
- hatchet_sdk/v0/clients/rest/models/tenant_step_run_queue_metrics.py +83 -0
- hatchet_sdk/v0/clients/rest/models/trigger_workflow_run_request.py +91 -0
- hatchet_sdk/v0/clients/rest/models/update_tenant_alert_email_group_request.py +83 -0
- hatchet_sdk/v0/clients/rest/models/update_tenant_invite_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/update_tenant_request.py +137 -0
- hatchet_sdk/v0/clients/rest/models/update_worker_request.py +87 -0
- hatchet_sdk/v0/clients/rest/models/user.py +126 -0
- hatchet_sdk/v0/clients/rest/models/user_change_password_request.py +88 -0
- hatchet_sdk/v0/clients/rest/models/user_login_request.py +86 -0
- hatchet_sdk/v0/clients/rest/models/user_register_request.py +91 -0
- hatchet_sdk/v0/clients/rest/models/user_tenant_memberships_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/user_tenant_public.py +86 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker.py +100 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_create_request.py +94 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_create_response.py +98 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_created.py +102 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_list_response.py +110 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request.py +102 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request_list_response.py +104 -0
- hatchet_sdk/v0/clients/rest/models/webhook_worker_request_method.py +38 -0
- hatchet_sdk/v0/clients/rest/models/worker.py +239 -0
- hatchet_sdk/v0/clients/rest/models/worker_label.py +102 -0
- hatchet_sdk/v0/clients/rest/models/worker_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/worker_runtime_info.py +103 -0
- hatchet_sdk/v0/clients/rest/models/worker_runtime_sdks.py +38 -0
- hatchet_sdk/v0/clients/rest/models/worker_type.py +38 -0
- hatchet_sdk/v0/clients/rest/models/workflow.py +165 -0
- hatchet_sdk/v0/clients/rest/models/workflow_concurrency.py +107 -0
- hatchet_sdk/v0/clients/rest/models/workflow_deployment_config.py +136 -0
- hatchet_sdk/v0/clients/rest/models/workflow_kind.py +38 -0
- hatchet_sdk/v0/clients/rest/models/workflow_list.py +120 -0
- hatchet_sdk/v0/clients/rest/models/workflow_metrics.py +97 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run.py +188 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_cancel200_response.py +85 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_list.py +110 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_direction.py +37 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_order_by_field.py +39 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_shape.py +186 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_status.py +42 -0
- hatchet_sdk/v0/clients/rest/models/workflow_run_triggered_by.py +112 -0
- hatchet_sdk/v0/clients/rest/models/workflow_runs_cancel_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics.py +94 -0
- hatchet_sdk/v0/clients/rest/models/workflow_runs_metrics_counts.py +104 -0
- hatchet_sdk/v0/clients/rest/models/workflow_tag.py +84 -0
- hatchet_sdk/v0/clients/rest/models/workflow_trigger_cron_ref.py +86 -0
- hatchet_sdk/v0/clients/rest/models/workflow_trigger_event_ref.py +86 -0
- hatchet_sdk/v0/clients/rest/models/workflow_triggers.py +141 -0
- hatchet_sdk/v0/clients/rest/models/workflow_update_request.py +85 -0
- hatchet_sdk/v0/clients/rest/models/workflow_version.py +170 -0
- hatchet_sdk/v0/clients/rest/models/workflow_version_concurrency.py +114 -0
- hatchet_sdk/v0/clients/rest/models/workflow_version_definition.py +85 -0
- hatchet_sdk/v0/clients/rest/models/workflow_version_meta.py +123 -0
- hatchet_sdk/v0/clients/rest/models/workflow_workers_count.py +95 -0
- hatchet_sdk/v0/clients/rest/rest.py +187 -0
- hatchet_sdk/v0/clients/rest/tenacity_utils.py +39 -0
- hatchet_sdk/v0/clients/rest_client.py +622 -0
- hatchet_sdk/v0/clients/run_event_listener.py +260 -0
- hatchet_sdk/v0/clients/workflow_listener.py +277 -0
- hatchet_sdk/v0/connection.py +63 -0
- hatchet_sdk/v0/context/__init__.py +1 -0
- hatchet_sdk/v0/context/context.py +446 -0
- hatchet_sdk/v0/context/worker_context.py +28 -0
- hatchet_sdk/v0/contracts/dispatcher_pb2.py +102 -0
- hatchet_sdk/v0/contracts/dispatcher_pb2.pyi +387 -0
- hatchet_sdk/v0/contracts/dispatcher_pb2_grpc.py +621 -0
- hatchet_sdk/v0/contracts/events_pb2.py +46 -0
- hatchet_sdk/v0/contracts/events_pb2.pyi +87 -0
- hatchet_sdk/v0/contracts/events_pb2_grpc.py +274 -0
- hatchet_sdk/v0/contracts/workflows_pb2.py +80 -0
- hatchet_sdk/v0/contracts/workflows_pb2.pyi +312 -0
- hatchet_sdk/v0/contracts/workflows_pb2_grpc.py +277 -0
- hatchet_sdk/v0/features/cron.py +286 -0
- hatchet_sdk/v0/features/scheduled.py +248 -0
- hatchet_sdk/v0/hatchet.py +310 -0
- hatchet_sdk/v0/labels.py +10 -0
- hatchet_sdk/v0/logger.py +13 -0
- hatchet_sdk/v0/metadata.py +2 -0
- hatchet_sdk/v0/opentelemetry/instrumentor.py +396 -0
- hatchet_sdk/v0/rate_limit.py +126 -0
- hatchet_sdk/v0/token.py +27 -0
- hatchet_sdk/v0/utils/aio_utils.py +137 -0
- hatchet_sdk/v0/utils/backoff.py +9 -0
- hatchet_sdk/v0/utils/typing.py +12 -0
- hatchet_sdk/{v2 → v0/v2}/callable.py +8 -8
- hatchet_sdk/{v2 → v0/v2}/concurrency.py +2 -2
- hatchet_sdk/{v2 → v0/v2}/hatchet.py +10 -10
- hatchet_sdk/v0/worker/__init__.py +1 -0
- hatchet_sdk/v0/worker/action_listener_process.py +294 -0
- hatchet_sdk/v0/worker/runner/run_loop_manager.py +112 -0
- hatchet_sdk/v0/worker/runner/runner.py +460 -0
- hatchet_sdk/v0/worker/runner/utils/capture_logs.py +81 -0
- hatchet_sdk/v0/worker/worker.py +391 -0
- hatchet_sdk/{workflow.py → v0/workflow.py} +4 -4
- hatchet_sdk/v0/workflow_run.py +59 -0
- hatchet_sdk/waits.py +120 -0
- hatchet_sdk/worker/__init__.py +0 -1
- hatchet_sdk/worker/action_listener_process.py +80 -55
- hatchet_sdk/worker/runner/run_loop_manager.py +46 -34
- hatchet_sdk/worker/runner/runner.py +82 -87
- hatchet_sdk/worker/runner/utils/capture_logs.py +26 -23
- hatchet_sdk/worker/worker.py +172 -149
- hatchet_sdk/workflow_run.py +7 -21
- {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/METADATA +2 -2
- hatchet_sdk-1.0.0a1.dist-info/RECORD +505 -0
- {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/entry_points.txt +2 -0
- hatchet_sdk/utils/serialization.py +0 -18
- hatchet_sdk-0.47.1.dist-info/RECORD +0 -237
- /hatchet_sdk/{loader.py → v0/loader.py} +0 -0
- /hatchet_sdk/{semver.py → v0/semver.py} +0 -0
- /hatchet_sdk/{utils → v0/utils}/types.py +0 -0
- /hatchet_sdk/{worker → v0/worker}/runner/utils/error_with_traceback.py +0 -0
- {hatchet_sdk-0.47.1.dist-info → hatchet_sdk-1.0.0a1.dist-info}/WHEEL +0 -0
hatchet_sdk/hatchet.py
CHANGED
|
@@ -1,197 +1,35 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Any, Callable,
|
|
4
|
-
|
|
5
|
-
from pydantic import BaseModel
|
|
6
|
-
from typing_extensions import deprecated
|
|
3
|
+
from typing import Any, Callable, Type, cast, overload
|
|
7
4
|
|
|
5
|
+
from hatchet_sdk import Context, DurableContext
|
|
6
|
+
from hatchet_sdk.client import Client
|
|
7
|
+
from hatchet_sdk.clients.admin import AdminClient
|
|
8
|
+
from hatchet_sdk.clients.dispatcher.dispatcher import DispatcherClient
|
|
9
|
+
from hatchet_sdk.clients.events import EventClient
|
|
8
10
|
from hatchet_sdk.clients.rest_client import RestApi
|
|
9
|
-
from hatchet_sdk.
|
|
10
|
-
from hatchet_sdk.
|
|
11
|
-
ConcurrencyLimitStrategy,
|
|
12
|
-
CreateStepRateLimit,
|
|
13
|
-
DesiredWorkerLabels,
|
|
14
|
-
StickyStrategy,
|
|
15
|
-
)
|
|
11
|
+
from hatchet_sdk.clients.run_event_listener import RunEventListenerClient
|
|
12
|
+
from hatchet_sdk.config import ClientConfig
|
|
16
13
|
from hatchet_sdk.features.cron import CronClient
|
|
17
14
|
from hatchet_sdk.features.scheduled import ScheduledClient
|
|
18
15
|
from hatchet_sdk.labels import DesiredWorkerLabel
|
|
19
|
-
from hatchet_sdk.
|
|
16
|
+
from hatchet_sdk.logger import logger
|
|
20
17
|
from hatchet_sdk.rate_limit import RateLimit
|
|
21
|
-
from hatchet_sdk.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
from .clients.dispatcher.dispatcher import DispatcherClient
|
|
26
|
-
from .clients.events import EventClient
|
|
27
|
-
from .clients.run_event_listener import RunEventListenerClient
|
|
28
|
-
from .logger import logger
|
|
29
|
-
from .worker.worker import Worker
|
|
30
|
-
from .workflow import (
|
|
18
|
+
from hatchet_sdk.runnables.standalone import Standalone
|
|
19
|
+
from hatchet_sdk.runnables.types import (
|
|
20
|
+
DEFAULT_EXECUTION_TIMEOUT,
|
|
21
|
+
DEFAULT_SCHEDULE_TIMEOUT,
|
|
31
22
|
ConcurrencyExpression,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
23
|
+
EmptyModel,
|
|
24
|
+
R,
|
|
25
|
+
StickyStrategy,
|
|
26
|
+
TaskDefaults,
|
|
27
|
+
TWorkflowInput,
|
|
28
|
+
WorkflowConfig,
|
|
35
29
|
)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
P = ParamSpec("P")
|
|
40
|
-
|
|
41
|
-
TWorkflow = TypeVar("TWorkflow", bound=object)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def workflow(
|
|
45
|
-
name: str = "",
|
|
46
|
-
on_events: list[str] | None = None,
|
|
47
|
-
on_crons: list[str] | None = None,
|
|
48
|
-
version: str = "",
|
|
49
|
-
timeout: str = "60m",
|
|
50
|
-
schedule_timeout: str = "5m",
|
|
51
|
-
sticky: Union[StickyStrategy.Value, None] = None, # type: ignore[name-defined]
|
|
52
|
-
default_priority: int | None = None,
|
|
53
|
-
concurrency: ConcurrencyExpression | None = None,
|
|
54
|
-
input_validator: Type[T] | None = None,
|
|
55
|
-
) -> Callable[[Type[TWorkflow]], WorkflowMeta]:
|
|
56
|
-
on_events = on_events or []
|
|
57
|
-
on_crons = on_crons or []
|
|
58
|
-
|
|
59
|
-
def inner(cls: Type[TWorkflow]) -> WorkflowMeta:
|
|
60
|
-
nonlocal name
|
|
61
|
-
name = name or str(cls.__name__)
|
|
62
|
-
|
|
63
|
-
setattr(cls, "on_events", on_events)
|
|
64
|
-
setattr(cls, "on_crons", on_crons)
|
|
65
|
-
setattr(cls, "name", name)
|
|
66
|
-
setattr(cls, "version", version)
|
|
67
|
-
setattr(cls, "timeout", timeout)
|
|
68
|
-
setattr(cls, "schedule_timeout", schedule_timeout)
|
|
69
|
-
setattr(cls, "sticky", sticky)
|
|
70
|
-
setattr(cls, "default_priority", default_priority)
|
|
71
|
-
setattr(cls, "concurrency_expression", concurrency)
|
|
72
|
-
|
|
73
|
-
# Define a new class with the same name and bases as the original, but
|
|
74
|
-
# with WorkflowMeta as its metaclass
|
|
75
|
-
|
|
76
|
-
## TODO: Figure out how to type this metaclass correctly
|
|
77
|
-
setattr(cls, "input_validator", input_validator)
|
|
78
|
-
|
|
79
|
-
return WorkflowMeta(name, cls.__bases__, dict(cls.__dict__))
|
|
80
|
-
|
|
81
|
-
return inner
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
def step(
|
|
85
|
-
name: str = "",
|
|
86
|
-
timeout: str = "",
|
|
87
|
-
parents: list[str] | None = None,
|
|
88
|
-
retries: int = 0,
|
|
89
|
-
rate_limits: list[RateLimit] | None = None,
|
|
90
|
-
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
91
|
-
backoff_factor: float | None = None,
|
|
92
|
-
backoff_max_seconds: int | None = None,
|
|
93
|
-
) -> Callable[[Callable[P, R]], Callable[P, R]]:
|
|
94
|
-
parents = parents or []
|
|
95
|
-
|
|
96
|
-
def inner(func: Callable[P, R]) -> Callable[P, R]:
|
|
97
|
-
limits = None
|
|
98
|
-
if rate_limits:
|
|
99
|
-
limits = [rate_limit._req for rate_limit in rate_limits or []]
|
|
100
|
-
|
|
101
|
-
setattr(func, "_step_name", name.lower() or str(func.__name__).lower())
|
|
102
|
-
setattr(func, "_step_parents", parents)
|
|
103
|
-
setattr(func, "_step_timeout", timeout)
|
|
104
|
-
setattr(func, "_step_retries", retries)
|
|
105
|
-
setattr(func, "_step_rate_limits", limits)
|
|
106
|
-
setattr(func, "_step_backoff_factor", backoff_factor)
|
|
107
|
-
setattr(func, "_step_backoff_max_seconds", backoff_max_seconds)
|
|
108
|
-
|
|
109
|
-
def create_label(d: DesiredWorkerLabel) -> DesiredWorkerLabels:
|
|
110
|
-
value = d["value"] if "value" in d else None
|
|
111
|
-
return DesiredWorkerLabels(
|
|
112
|
-
strValue=str(value) if not isinstance(value, int) else None,
|
|
113
|
-
intValue=value if isinstance(value, int) else None,
|
|
114
|
-
required=d["required"] if "required" in d else None, # type: ignore[arg-type]
|
|
115
|
-
weight=d["weight"] if "weight" in d else None,
|
|
116
|
-
comparator=d["comparator"] if "comparator" in d else None, # type: ignore[arg-type]
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
setattr(
|
|
120
|
-
func,
|
|
121
|
-
"_step_desired_worker_labels",
|
|
122
|
-
{key: create_label(d) for key, d in desired_worker_labels.items()},
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
return func
|
|
126
|
-
|
|
127
|
-
return inner
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def on_failure_step(
|
|
131
|
-
name: str = "",
|
|
132
|
-
timeout: str = "",
|
|
133
|
-
retries: int = 0,
|
|
134
|
-
rate_limits: list[RateLimit] | None = None,
|
|
135
|
-
backoff_factor: float | None = None,
|
|
136
|
-
backoff_max_seconds: int | None = None,
|
|
137
|
-
) -> Callable[..., Any]:
|
|
138
|
-
def inner(func: Callable[[Context], Any]) -> Callable[[Context], Any]:
|
|
139
|
-
limits = None
|
|
140
|
-
if rate_limits:
|
|
141
|
-
limits = [
|
|
142
|
-
CreateStepRateLimit(key=rate_limit.static_key, units=rate_limit.units) # type: ignore[arg-type]
|
|
143
|
-
for rate_limit in rate_limits or []
|
|
144
|
-
]
|
|
145
|
-
|
|
146
|
-
setattr(
|
|
147
|
-
func, "_on_failure_step_name", name.lower() or str(func.__name__).lower()
|
|
148
|
-
)
|
|
149
|
-
setattr(func, "_on_failure_step_timeout", timeout)
|
|
150
|
-
setattr(func, "_on_failure_step_retries", retries)
|
|
151
|
-
setattr(func, "_on_failure_step_rate_limits", limits)
|
|
152
|
-
setattr(func, "_on_failure_step_backoff_factor", backoff_factor)
|
|
153
|
-
setattr(func, "_on_failure_step_backoff_max_seconds", backoff_max_seconds)
|
|
154
|
-
|
|
155
|
-
return func
|
|
156
|
-
|
|
157
|
-
return inner
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
def concurrency(
|
|
161
|
-
name: str = "",
|
|
162
|
-
max_runs: int = 1,
|
|
163
|
-
limit_strategy: ConcurrencyLimitStrategy = ConcurrencyLimitStrategy.CANCEL_IN_PROGRESS,
|
|
164
|
-
) -> Callable[..., Any]:
|
|
165
|
-
def inner(func: Callable[[Context], Any]) -> Callable[[Context], Any]:
|
|
166
|
-
setattr(
|
|
167
|
-
func,
|
|
168
|
-
"_concurrency_fn_name",
|
|
169
|
-
name.lower() or str(func.__name__).lower(),
|
|
170
|
-
)
|
|
171
|
-
setattr(func, "_concurrency_max_runs", max_runs)
|
|
172
|
-
setattr(func, "_concurrency_limit_strategy", limit_strategy)
|
|
173
|
-
|
|
174
|
-
return func
|
|
175
|
-
|
|
176
|
-
return inner
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
class HatchetRest:
|
|
180
|
-
"""
|
|
181
|
-
Main client for interacting with the Hatchet API.
|
|
182
|
-
|
|
183
|
-
This class provides access to various client interfaces and utility methods
|
|
184
|
-
for working with Hatchet via the REST API,
|
|
185
|
-
|
|
186
|
-
Attributes:
|
|
187
|
-
rest (RestApi): Interface for REST API operations.
|
|
188
|
-
"""
|
|
189
|
-
|
|
190
|
-
rest: RestApi
|
|
191
|
-
|
|
192
|
-
def __init__(self, config: ClientConfig = ClientConfig()):
|
|
193
|
-
_config: ClientConfig = ConfigLoader(".").load_client_config(config)
|
|
194
|
-
self.rest = RestApi(_config.server_url, _config.token, _config.tenant_id)
|
|
30
|
+
from hatchet_sdk.runnables.workflow import BaseWorkflow, Workflow
|
|
31
|
+
from hatchet_sdk.utils.timedelta_to_expression import Duration
|
|
32
|
+
from hatchet_sdk.worker.worker import Worker
|
|
195
33
|
|
|
196
34
|
|
|
197
35
|
class Hatchet:
|
|
@@ -214,48 +52,32 @@ class Hatchet:
|
|
|
214
52
|
cron: CronClient
|
|
215
53
|
scheduled: ScheduledClient
|
|
216
54
|
|
|
217
|
-
@classmethod
|
|
218
|
-
def from_environment(
|
|
219
|
-
cls, defaults: ClientConfig = ClientConfig(), **kwargs: Any
|
|
220
|
-
) -> "Hatchet":
|
|
221
|
-
return cls(client=new_client(defaults), **kwargs)
|
|
222
|
-
|
|
223
|
-
@classmethod
|
|
224
|
-
def from_config(cls, config: ClientConfig, **kwargs: Any) -> "Hatchet":
|
|
225
|
-
return cls(client=new_client_raw(config), **kwargs)
|
|
226
|
-
|
|
227
55
|
def __init__(
|
|
228
56
|
self,
|
|
229
57
|
debug: bool = False,
|
|
230
|
-
client:
|
|
58
|
+
client: Client | None = None,
|
|
231
59
|
config: ClientConfig = ClientConfig(),
|
|
232
60
|
):
|
|
233
61
|
"""
|
|
234
62
|
Initialize a new Hatchet instance.
|
|
235
63
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
64
|
+
:param debug: Enable debug logging. Default: `False`
|
|
65
|
+
:type debug: bool
|
|
66
|
+
|
|
67
|
+
:param client: A pre-configured `Client` instance. Default: `None`.
|
|
68
|
+
:type client: Client | None
|
|
69
|
+
|
|
70
|
+
:param config: Configuration for creating a new Client. Defaults to ClientConfig()
|
|
71
|
+
:type config: ClientConfig
|
|
240
72
|
"""
|
|
241
|
-
if client is not None:
|
|
242
|
-
self._client = client
|
|
243
|
-
else:
|
|
244
|
-
self._client = new_client(config, debug)
|
|
245
73
|
|
|
246
74
|
if debug:
|
|
247
75
|
logger.setLevel(logging.DEBUG)
|
|
248
76
|
|
|
77
|
+
self._client = client if client else Client(config=config, debug=debug)
|
|
249
78
|
self.cron = CronClient(self._client)
|
|
250
79
|
self.scheduled = ScheduledClient(self._client)
|
|
251
80
|
|
|
252
|
-
@property
|
|
253
|
-
@deprecated(
|
|
254
|
-
"Direct access to client is deprecated and will be removed in a future version. Use specific client properties (Hatchet.admin, Hatchet.dispatcher, Hatchet.event, Hatchet.rest) instead. [0.32.0]",
|
|
255
|
-
)
|
|
256
|
-
def client(self) -> Client:
|
|
257
|
-
return self._client
|
|
258
|
-
|
|
259
81
|
@property
|
|
260
82
|
def admin(self) -> AdminClient:
|
|
261
83
|
return self._client.admin
|
|
@@ -284,17 +106,33 @@ class Hatchet:
|
|
|
284
106
|
def tenant_id(self) -> str:
|
|
285
107
|
return self._client.config.tenant_id
|
|
286
108
|
|
|
287
|
-
|
|
109
|
+
def worker(
|
|
110
|
+
self,
|
|
111
|
+
name: str,
|
|
112
|
+
slots: int = 100,
|
|
113
|
+
labels: dict[str, str | int] = {},
|
|
114
|
+
workflows: list[BaseWorkflow[Any]] = [],
|
|
115
|
+
) -> Worker:
|
|
116
|
+
"""
|
|
117
|
+
Create a Hatchet worker on which to run workflows.
|
|
288
118
|
|
|
289
|
-
|
|
119
|
+
:param name: The name of the worker.
|
|
120
|
+
:type name: str
|
|
290
121
|
|
|
291
|
-
|
|
122
|
+
:param slots: The number of workflow slots on the worker. In other words, the number of concurrent tasks the worker can run at any point in time. Default: 100
|
|
123
|
+
:type slots: int
|
|
292
124
|
|
|
293
|
-
|
|
125
|
+
:param labels: A dictionary of labels to assign to the worker. For more details, view examples on affinity and worker labels. Defaults to an empty dictionary (no labels)
|
|
126
|
+
:type labels: dict[str, str | int]
|
|
127
|
+
|
|
128
|
+
:param workflows: A list of workflows to register on the worker, as a shorthand for calling `register_workflow` on each or `register_workflows` on all of them. Defaults to an empty list
|
|
129
|
+
:type workflows: list[Workflow]
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
:returns: The created `Worker` object, which exposes an instance method `start` which can be called to start the worker.
|
|
133
|
+
:rtype: Worker
|
|
134
|
+
"""
|
|
294
135
|
|
|
295
|
-
def worker(
|
|
296
|
-
self, name: str, max_runs: int | None = None, labels: dict[str, str | int] = {}
|
|
297
|
-
) -> Worker:
|
|
298
136
|
try:
|
|
299
137
|
loop = asyncio.get_running_loop()
|
|
300
138
|
except RuntimeError:
|
|
@@ -302,9 +140,444 @@ class Hatchet:
|
|
|
302
140
|
|
|
303
141
|
return Worker(
|
|
304
142
|
name=name,
|
|
305
|
-
|
|
143
|
+
slots=slots,
|
|
306
144
|
labels=labels,
|
|
307
145
|
config=self._client.config,
|
|
308
146
|
debug=self._client.debug,
|
|
309
147
|
owned_loop=loop is None,
|
|
148
|
+
workflows=workflows,
|
|
310
149
|
)
|
|
150
|
+
|
|
151
|
+
@overload
|
|
152
|
+
def workflow(
|
|
153
|
+
self,
|
|
154
|
+
*,
|
|
155
|
+
name: str,
|
|
156
|
+
description: str | None = None,
|
|
157
|
+
input_validator: None = None,
|
|
158
|
+
on_events: list[str] = [],
|
|
159
|
+
on_crons: list[str] = [],
|
|
160
|
+
version: str | None = None,
|
|
161
|
+
sticky: StickyStrategy | None = None,
|
|
162
|
+
default_priority: int = 1,
|
|
163
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
164
|
+
task_defaults: TaskDefaults = TaskDefaults(),
|
|
165
|
+
) -> Workflow[EmptyModel]: ...
|
|
166
|
+
|
|
167
|
+
@overload
|
|
168
|
+
def workflow(
|
|
169
|
+
self,
|
|
170
|
+
*,
|
|
171
|
+
name: str,
|
|
172
|
+
description: str | None = None,
|
|
173
|
+
input_validator: Type[TWorkflowInput],
|
|
174
|
+
on_events: list[str] = [],
|
|
175
|
+
on_crons: list[str] = [],
|
|
176
|
+
version: str | None = None,
|
|
177
|
+
sticky: StickyStrategy | None = None,
|
|
178
|
+
default_priority: int = 1,
|
|
179
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
180
|
+
task_defaults: TaskDefaults = TaskDefaults(),
|
|
181
|
+
) -> Workflow[TWorkflowInput]: ...
|
|
182
|
+
|
|
183
|
+
def workflow(
|
|
184
|
+
self,
|
|
185
|
+
*,
|
|
186
|
+
name: str,
|
|
187
|
+
description: str | None = None,
|
|
188
|
+
input_validator: Type[TWorkflowInput] | None = None,
|
|
189
|
+
on_events: list[str] = [],
|
|
190
|
+
on_crons: list[str] = [],
|
|
191
|
+
version: str | None = None,
|
|
192
|
+
sticky: StickyStrategy | None = None,
|
|
193
|
+
default_priority: int = 1,
|
|
194
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
195
|
+
task_defaults: TaskDefaults = TaskDefaults(),
|
|
196
|
+
) -> Workflow[EmptyModel] | Workflow[TWorkflowInput]:
|
|
197
|
+
"""
|
|
198
|
+
Define a Hatchet workflow, which can then declare `task`s and be `run`, `schedule`d, and so on.
|
|
199
|
+
|
|
200
|
+
:param name: The name of the workflow.
|
|
201
|
+
:type name: str
|
|
202
|
+
|
|
203
|
+
:param description: A description for the workflow. Default: None
|
|
204
|
+
:type description: str | None
|
|
205
|
+
|
|
206
|
+
:param version: A version for the workflow. Default: None
|
|
207
|
+
:type version: str | None
|
|
208
|
+
|
|
209
|
+
:param input_validator: A Pydantic model to use as a validator for the `input` to the tasks in the workflow. If no validator is provided, defaults to an `EmptyModel` under the hood. The `EmptyModel` is a Pydantic model with no fields specified, and with the `extra` config option set to `"allow"`.
|
|
210
|
+
:type input_validator: Type[BaseModel]
|
|
211
|
+
|
|
212
|
+
:param on_events: A list of event triggers for the workflow - events which cause the workflow to be run. Defaults to an empty list, meaning the workflow will not be run on any event pushes.
|
|
213
|
+
:type on_events: list[str]
|
|
214
|
+
|
|
215
|
+
:param on_crons: A list of cron triggers for the workflow. Defaults to an empty list, meaning the workflow will not be run on any cron schedules.
|
|
216
|
+
:type on_crons: list[str]
|
|
217
|
+
|
|
218
|
+
:param sticky: A sticky strategy for the workflow. Default: `None`
|
|
219
|
+
:type sticky: StickyStategy
|
|
220
|
+
|
|
221
|
+
:param default_priority: The priority of the workflow. Higher values will cause this workflow to have priority in scheduling over other, lower priority ones. Default: `1`
|
|
222
|
+
:type default_priority: int
|
|
223
|
+
|
|
224
|
+
:param concurrency: A concurrency object controlling the concurrency settings for this workflow.
|
|
225
|
+
:type concurrency: ConcurrencyExpression | None
|
|
226
|
+
|
|
227
|
+
:param task_defaults: A `TaskDefaults` object controlling the default task settings for this workflow.
|
|
228
|
+
:type task_defaults: TaskDefaults
|
|
229
|
+
|
|
230
|
+
:returns: The created `Workflow` object, which can be used to declare tasks, run the workflow, and so on.
|
|
231
|
+
:rtype: Workflow
|
|
232
|
+
"""
|
|
233
|
+
|
|
234
|
+
return Workflow[TWorkflowInput](
|
|
235
|
+
WorkflowConfig(
|
|
236
|
+
name=name,
|
|
237
|
+
version=version,
|
|
238
|
+
description=description,
|
|
239
|
+
on_events=on_events,
|
|
240
|
+
on_crons=on_crons,
|
|
241
|
+
sticky=sticky,
|
|
242
|
+
concurrency=concurrency,
|
|
243
|
+
input_validator=input_validator
|
|
244
|
+
or cast(Type[TWorkflowInput], EmptyModel),
|
|
245
|
+
task_defaults=task_defaults,
|
|
246
|
+
),
|
|
247
|
+
self,
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
@overload
|
|
251
|
+
def task(
|
|
252
|
+
self,
|
|
253
|
+
*,
|
|
254
|
+
name: str,
|
|
255
|
+
description: str | None = None,
|
|
256
|
+
input_validator: None = None,
|
|
257
|
+
on_events: list[str] = [],
|
|
258
|
+
on_crons: list[str] = [],
|
|
259
|
+
version: str | None = None,
|
|
260
|
+
sticky: StickyStrategy | None = None,
|
|
261
|
+
default_priority: int = 1,
|
|
262
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
263
|
+
schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
|
|
264
|
+
execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
|
|
265
|
+
retries: int = 0,
|
|
266
|
+
rate_limits: list[RateLimit] = [],
|
|
267
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
268
|
+
backoff_factor: float | None = None,
|
|
269
|
+
backoff_max_seconds: int | None = None,
|
|
270
|
+
) -> Callable[[Callable[[EmptyModel, Context], R]], Standalone[EmptyModel, R]]: ...
|
|
271
|
+
|
|
272
|
+
@overload
|
|
273
|
+
def task(
|
|
274
|
+
self,
|
|
275
|
+
*,
|
|
276
|
+
name: str,
|
|
277
|
+
description: str | None = None,
|
|
278
|
+
input_validator: Type[TWorkflowInput],
|
|
279
|
+
on_events: list[str] = [],
|
|
280
|
+
on_crons: list[str] = [],
|
|
281
|
+
version: str | None = None,
|
|
282
|
+
sticky: StickyStrategy | None = None,
|
|
283
|
+
default_priority: int = 1,
|
|
284
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
285
|
+
schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
|
|
286
|
+
execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
|
|
287
|
+
retries: int = 0,
|
|
288
|
+
rate_limits: list[RateLimit] = [],
|
|
289
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
290
|
+
backoff_factor: float | None = None,
|
|
291
|
+
backoff_max_seconds: int | None = None,
|
|
292
|
+
) -> Callable[
|
|
293
|
+
[Callable[[TWorkflowInput, Context], R]], Standalone[TWorkflowInput, R]
|
|
294
|
+
]: ...
|
|
295
|
+
|
|
296
|
+
def task(
|
|
297
|
+
self,
|
|
298
|
+
*,
|
|
299
|
+
name: str,
|
|
300
|
+
description: str | None = None,
|
|
301
|
+
input_validator: Type[TWorkflowInput] | None = None,
|
|
302
|
+
on_events: list[str] = [],
|
|
303
|
+
on_crons: list[str] = [],
|
|
304
|
+
version: str | None = None,
|
|
305
|
+
sticky: StickyStrategy | None = None,
|
|
306
|
+
default_priority: int = 1,
|
|
307
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
308
|
+
schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
|
|
309
|
+
execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
|
|
310
|
+
retries: int = 0,
|
|
311
|
+
rate_limits: list[RateLimit] = [],
|
|
312
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
313
|
+
backoff_factor: float | None = None,
|
|
314
|
+
backoff_max_seconds: int | None = None,
|
|
315
|
+
) -> (
|
|
316
|
+
Callable[[Callable[[EmptyModel, Context], R]], Standalone[EmptyModel, R]]
|
|
317
|
+
| Callable[
|
|
318
|
+
[Callable[[TWorkflowInput, Context], R]], Standalone[TWorkflowInput, R]
|
|
319
|
+
]
|
|
320
|
+
):
|
|
321
|
+
"""
|
|
322
|
+
A decorator to transform a function into a standalone Hatchet task that runs as part of a workflow.
|
|
323
|
+
|
|
324
|
+
:param name: The name of the task. If not specified, defaults to the name of the function being wrapped by the `task` decorator.
|
|
325
|
+
:type name: str
|
|
326
|
+
|
|
327
|
+
:param description: An optional description for the task. Default: None
|
|
328
|
+
:type description: str | None
|
|
329
|
+
|
|
330
|
+
:param input_validator: A Pydantic model to use as a validator for the input to the task. If no validator is provided, defaults to an `EmptyModel`.
|
|
331
|
+
:type input_validator: Type[BaseModel]
|
|
332
|
+
|
|
333
|
+
:param on_events: A list of event triggers for the task - events which cause the task to be run. Defaults to an empty list.
|
|
334
|
+
:type on_events: list[str]
|
|
335
|
+
|
|
336
|
+
:param on_crons: A list of cron triggers for the task. Defaults to an empty list.
|
|
337
|
+
:type on_crons: list[str]
|
|
338
|
+
|
|
339
|
+
:param version: A version for the task. Default: None
|
|
340
|
+
:type version: str | None
|
|
341
|
+
|
|
342
|
+
:param sticky: A sticky strategy for the task. Default: None
|
|
343
|
+
:type sticky: StickyStrategy | None
|
|
344
|
+
|
|
345
|
+
:param default_priority: The priority of the task. Higher values will cause this task to have priority in scheduling. Default: 1
|
|
346
|
+
:type default_priority: int
|
|
347
|
+
|
|
348
|
+
:param concurrency: A concurrency object controlling the concurrency settings for this task.
|
|
349
|
+
:type concurrency: ConcurrencyExpression | None
|
|
350
|
+
|
|
351
|
+
:param schedule_timeout: The maximum time allowed for scheduling the task. Default: DEFAULT_SCHEDULE_TIMEOUT
|
|
352
|
+
:type schedule_timeout: Duration
|
|
353
|
+
|
|
354
|
+
:param execution_timeout: The maximum time allowed for executing the task. Default: DEFAULT_EXECUTION_TIMEOUT
|
|
355
|
+
:type execution_timeout: Duration
|
|
356
|
+
|
|
357
|
+
:param retries: The number of times to retry the task before failing. Default: 0
|
|
358
|
+
:type retries: int
|
|
359
|
+
|
|
360
|
+
:param rate_limits: A list of rate limit configurations for the task. Defaults to an empty list.
|
|
361
|
+
:type rate_limits: list[RateLimit]
|
|
362
|
+
|
|
363
|
+
:param desired_worker_labels: A dictionary of desired worker labels that determine to which worker the task should be assigned.
|
|
364
|
+
:type desired_worker_labels: dict[str, DesiredWorkerLabel]
|
|
365
|
+
|
|
366
|
+
:param backoff_factor: The backoff factor for controlling exponential backoff in retries. Default: None
|
|
367
|
+
:type backoff_factor: float | None
|
|
368
|
+
|
|
369
|
+
:param backoff_max_seconds: The maximum number of seconds to allow retries with exponential backoff to continue. Default: None
|
|
370
|
+
:type backoff_max_seconds: int | None
|
|
371
|
+
|
|
372
|
+
:returns: A decorator which creates a `Standalone` task object.
|
|
373
|
+
:rtype: Callable[[Callable[[TWorkflowInput, Context], R]], Standalone[TWorkflowInput, R]]
|
|
374
|
+
"""
|
|
375
|
+
|
|
376
|
+
workflow = Workflow[TWorkflowInput](
|
|
377
|
+
WorkflowConfig(
|
|
378
|
+
name=name,
|
|
379
|
+
version=version,
|
|
380
|
+
description=description,
|
|
381
|
+
on_events=on_events,
|
|
382
|
+
on_crons=on_crons,
|
|
383
|
+
sticky=sticky,
|
|
384
|
+
concurrency=concurrency,
|
|
385
|
+
input_validator=input_validator
|
|
386
|
+
or cast(Type[TWorkflowInput], EmptyModel),
|
|
387
|
+
),
|
|
388
|
+
self,
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
task_wrapper = workflow.task(
|
|
392
|
+
name=name,
|
|
393
|
+
schedule_timeout=schedule_timeout,
|
|
394
|
+
execution_timeout=execution_timeout,
|
|
395
|
+
parents=[],
|
|
396
|
+
retries=retries,
|
|
397
|
+
rate_limits=rate_limits,
|
|
398
|
+
desired_worker_labels=desired_worker_labels,
|
|
399
|
+
backoff_factor=backoff_factor,
|
|
400
|
+
backoff_max_seconds=backoff_max_seconds,
|
|
401
|
+
concurrency=[concurrency] if concurrency else [],
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
def inner(
|
|
405
|
+
func: Callable[[TWorkflowInput, Context], R]
|
|
406
|
+
) -> Standalone[TWorkflowInput, R]:
|
|
407
|
+
created_task = task_wrapper(func)
|
|
408
|
+
|
|
409
|
+
return Standalone[TWorkflowInput, R](
|
|
410
|
+
workflow=workflow,
|
|
411
|
+
task=created_task,
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
return inner
|
|
415
|
+
|
|
416
|
+
@overload
|
|
417
|
+
def durable_task(
|
|
418
|
+
self,
|
|
419
|
+
*,
|
|
420
|
+
name: str,
|
|
421
|
+
description: str | None = None,
|
|
422
|
+
input_validator: None = None,
|
|
423
|
+
on_events: list[str] = [],
|
|
424
|
+
on_crons: list[str] = [],
|
|
425
|
+
version: str | None = None,
|
|
426
|
+
sticky: StickyStrategy | None = None,
|
|
427
|
+
default_priority: int = 1,
|
|
428
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
429
|
+
schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
|
|
430
|
+
execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
|
|
431
|
+
retries: int = 0,
|
|
432
|
+
rate_limits: list[RateLimit] = [],
|
|
433
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
434
|
+
backoff_factor: float | None = None,
|
|
435
|
+
backoff_max_seconds: int | None = None,
|
|
436
|
+
) -> Callable[
|
|
437
|
+
[Callable[[EmptyModel, DurableContext], R]], Standalone[EmptyModel, R]
|
|
438
|
+
]: ...
|
|
439
|
+
|
|
440
|
+
@overload
|
|
441
|
+
def durable_task(
|
|
442
|
+
self,
|
|
443
|
+
*,
|
|
444
|
+
name: str,
|
|
445
|
+
description: str | None = None,
|
|
446
|
+
input_validator: Type[TWorkflowInput],
|
|
447
|
+
on_events: list[str] = [],
|
|
448
|
+
on_crons: list[str] = [],
|
|
449
|
+
version: str | None = None,
|
|
450
|
+
sticky: StickyStrategy | None = None,
|
|
451
|
+
default_priority: int = 1,
|
|
452
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
453
|
+
schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
|
|
454
|
+
execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
|
|
455
|
+
retries: int = 0,
|
|
456
|
+
rate_limits: list[RateLimit] = [],
|
|
457
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
458
|
+
backoff_factor: float | None = None,
|
|
459
|
+
backoff_max_seconds: int | None = None,
|
|
460
|
+
) -> Callable[
|
|
461
|
+
[Callable[[TWorkflowInput, DurableContext], R]], Standalone[TWorkflowInput, R]
|
|
462
|
+
]: ...
|
|
463
|
+
|
|
464
|
+
def durable_task(
|
|
465
|
+
self,
|
|
466
|
+
*,
|
|
467
|
+
name: str,
|
|
468
|
+
description: str | None = None,
|
|
469
|
+
input_validator: Type[TWorkflowInput] | None = None,
|
|
470
|
+
on_events: list[str] = [],
|
|
471
|
+
on_crons: list[str] = [],
|
|
472
|
+
version: str | None = None,
|
|
473
|
+
sticky: StickyStrategy | None = None,
|
|
474
|
+
default_priority: int = 1,
|
|
475
|
+
concurrency: ConcurrencyExpression | None = None,
|
|
476
|
+
schedule_timeout: Duration = DEFAULT_SCHEDULE_TIMEOUT,
|
|
477
|
+
execution_timeout: Duration = DEFAULT_EXECUTION_TIMEOUT,
|
|
478
|
+
retries: int = 0,
|
|
479
|
+
rate_limits: list[RateLimit] = [],
|
|
480
|
+
desired_worker_labels: dict[str, DesiredWorkerLabel] = {},
|
|
481
|
+
backoff_factor: float | None = None,
|
|
482
|
+
backoff_max_seconds: int | None = None,
|
|
483
|
+
) -> (
|
|
484
|
+
Callable[[Callable[[EmptyModel, DurableContext], R]], Standalone[EmptyModel, R]]
|
|
485
|
+
| Callable[
|
|
486
|
+
[Callable[[TWorkflowInput, DurableContext], R]],
|
|
487
|
+
Standalone[TWorkflowInput, R],
|
|
488
|
+
]
|
|
489
|
+
):
|
|
490
|
+
"""
|
|
491
|
+
A decorator to transform a function into a standalone Hatchet _durable_ task that runs as part of a workflow.
|
|
492
|
+
|
|
493
|
+
:param name: The name of the task. If not specified, defaults to the name of the function being wrapped by the `task` decorator.
|
|
494
|
+
:type name: str
|
|
495
|
+
|
|
496
|
+
:param description: An optional description for the task. Default: None
|
|
497
|
+
:type description: str | None
|
|
498
|
+
|
|
499
|
+
:param input_validator: A Pydantic model to use as a validator for the input to the task. If no validator is provided, defaults to an `EmptyModel`.
|
|
500
|
+
:type input_validator: Type[BaseModel]
|
|
501
|
+
|
|
502
|
+
:param on_events: A list of event triggers for the task - events which cause the task to be run. Defaults to an empty list.
|
|
503
|
+
:type on_events: list[str]
|
|
504
|
+
|
|
505
|
+
:param on_crons: A list of cron triggers for the task. Defaults to an empty list.
|
|
506
|
+
:type on_crons: list[str]
|
|
507
|
+
|
|
508
|
+
:param version: A version for the task. Default: None
|
|
509
|
+
:type version: str | None
|
|
510
|
+
|
|
511
|
+
:param sticky: A sticky strategy for the task. Default: None
|
|
512
|
+
:type sticky: StickyStrategy | None
|
|
513
|
+
|
|
514
|
+
:param default_priority: The priority of the task. Higher values will cause this task to have priority in scheduling. Default: 1
|
|
515
|
+
:type default_priority: int
|
|
516
|
+
|
|
517
|
+
:param concurrency: A concurrency object controlling the concurrency settings for this task.
|
|
518
|
+
:type concurrency: ConcurrencyExpression | None
|
|
519
|
+
|
|
520
|
+
:param schedule_timeout: The maximum time allowed for scheduling the task. Default: DEFAULT_SCHEDULE_TIMEOUT
|
|
521
|
+
:type schedule_timeout: Duration
|
|
522
|
+
|
|
523
|
+
:param execution_timeout: The maximum time allowed for executing the task. Default: DEFAULT_EXECUTION_TIMEOUT
|
|
524
|
+
:type execution_timeout: Duration
|
|
525
|
+
|
|
526
|
+
:param retries: The number of times to retry the task before failing. Default: 0
|
|
527
|
+
:type retries: int
|
|
528
|
+
|
|
529
|
+
:param rate_limits: A list of rate limit configurations for the task. Defaults to an empty list.
|
|
530
|
+
:type rate_limits: list[RateLimit]
|
|
531
|
+
|
|
532
|
+
:param desired_worker_labels: A dictionary of desired worker labels that determine to which worker the task should be assigned.
|
|
533
|
+
:type desired_worker_labels: dict[str, DesiredWorkerLabel]
|
|
534
|
+
|
|
535
|
+
:param backoff_factor: The backoff factor for controlling exponential backoff in retries. Default: None
|
|
536
|
+
:type backoff_factor: float | None
|
|
537
|
+
|
|
538
|
+
:param backoff_max_seconds: The maximum number of seconds to allow retries with exponential backoff to continue. Default: None
|
|
539
|
+
:type backoff_max_seconds: int | None
|
|
540
|
+
|
|
541
|
+
:returns: A decorator which creates a `Standalone` task object.
|
|
542
|
+
:rtype: Callable[[Callable[[TWorkflowInput, Context], R]], Standalone[TWorkflowInput, R]]
|
|
543
|
+
"""
|
|
544
|
+
|
|
545
|
+
workflow = Workflow[TWorkflowInput](
|
|
546
|
+
WorkflowConfig(
|
|
547
|
+
name=name,
|
|
548
|
+
version=version,
|
|
549
|
+
description=description,
|
|
550
|
+
on_events=on_events,
|
|
551
|
+
on_crons=on_crons,
|
|
552
|
+
sticky=sticky,
|
|
553
|
+
concurrency=concurrency,
|
|
554
|
+
input_validator=input_validator
|
|
555
|
+
or cast(Type[TWorkflowInput], EmptyModel),
|
|
556
|
+
),
|
|
557
|
+
self,
|
|
558
|
+
)
|
|
559
|
+
|
|
560
|
+
task_wrapper = workflow.durable_task(
|
|
561
|
+
name=name,
|
|
562
|
+
schedule_timeout=schedule_timeout,
|
|
563
|
+
execution_timeout=execution_timeout,
|
|
564
|
+
parents=[],
|
|
565
|
+
retries=retries,
|
|
566
|
+
rate_limits=rate_limits,
|
|
567
|
+
desired_worker_labels=desired_worker_labels,
|
|
568
|
+
backoff_factor=backoff_factor,
|
|
569
|
+
backoff_max_seconds=backoff_max_seconds,
|
|
570
|
+
concurrency=[concurrency] if concurrency else [],
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
def inner(
|
|
574
|
+
func: Callable[[TWorkflowInput, DurableContext], R]
|
|
575
|
+
) -> Standalone[TWorkflowInput, R]:
|
|
576
|
+
created_task = task_wrapper(func)
|
|
577
|
+
|
|
578
|
+
return Standalone[TWorkflowInput, R](
|
|
579
|
+
workflow=workflow,
|
|
580
|
+
task=created_task,
|
|
581
|
+
)
|
|
582
|
+
|
|
583
|
+
return inner
|