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/connection.py
CHANGED
|
@@ -1,26 +1,36 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import Literal, cast, overload
|
|
3
3
|
|
|
4
4
|
import grpc
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
from hatchet_sdk.loader import ClientConfig
|
|
6
|
+
from hatchet_sdk.config import ClientConfig
|
|
8
7
|
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
@overload
|
|
10
|
+
def new_conn(config: ClientConfig, aio: Literal[False]) -> grpc.Channel: ...
|
|
11
11
|
|
|
12
|
+
|
|
13
|
+
@overload
|
|
14
|
+
def new_conn(config: ClientConfig, aio: Literal[True]) -> grpc.aio.Channel: ...
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def new_conn(config: ClientConfig, aio: bool) -> grpc.Channel | grpc.aio.Channel:
|
|
12
18
|
credentials: grpc.ChannelCredentials | None = None
|
|
13
19
|
|
|
14
20
|
# load channel credentials
|
|
15
|
-
if config.tls_config.
|
|
16
|
-
root:
|
|
21
|
+
if config.tls_config.strategy == "tls":
|
|
22
|
+
root: bytes | None = None
|
|
17
23
|
|
|
18
|
-
if config.tls_config.
|
|
19
|
-
root = open(config.tls_config.
|
|
24
|
+
if config.tls_config.root_ca_file:
|
|
25
|
+
root = open(config.tls_config.root_ca_file, "rb").read()
|
|
20
26
|
|
|
21
27
|
credentials = grpc.ssl_channel_credentials(root_certificates=root)
|
|
22
|
-
elif config.tls_config.
|
|
23
|
-
|
|
28
|
+
elif config.tls_config.strategy == "mtls":
|
|
29
|
+
assert config.tls_config.root_ca_file
|
|
30
|
+
assert config.tls_config.key_file
|
|
31
|
+
assert config.tls_config.cert_file
|
|
32
|
+
|
|
33
|
+
root = open(config.tls_config.root_ca_file, "rb").read()
|
|
24
34
|
private_key = open(config.tls_config.key_file, "rb").read()
|
|
25
35
|
certificate_chain = open(config.tls_config.cert_file, "rb").read()
|
|
26
36
|
|
|
@@ -32,7 +42,7 @@ def new_conn(config: "ClientConfig", aio=False):
|
|
|
32
42
|
|
|
33
43
|
start = grpc if not aio else grpc.aio
|
|
34
44
|
|
|
35
|
-
channel_options = [
|
|
45
|
+
channel_options: list[tuple[str, str | int]] = [
|
|
36
46
|
("grpc.max_send_message_length", config.grpc_max_send_message_length),
|
|
37
47
|
("grpc.max_receive_message_length", config.grpc_max_recv_message_length),
|
|
38
48
|
("grpc.keepalive_time_ms", 10 * 1000),
|
|
@@ -46,7 +56,7 @@ def new_conn(config: "ClientConfig", aio=False):
|
|
|
46
56
|
# When steps execute via os.fork, we see `TSI_DATA_CORRUPTED` errors.
|
|
47
57
|
os.environ["GRPC_ENABLE_FORK_SUPPORT"] = "False"
|
|
48
58
|
|
|
49
|
-
if config.tls_config.
|
|
59
|
+
if config.tls_config.strategy == "none":
|
|
50
60
|
conn = start.insecure_channel(
|
|
51
61
|
target=config.host_port,
|
|
52
62
|
options=channel_options,
|
|
@@ -61,4 +71,8 @@ def new_conn(config: "ClientConfig", aio=False):
|
|
|
61
71
|
credentials=credentials,
|
|
62
72
|
options=channel_options,
|
|
63
73
|
)
|
|
64
|
-
|
|
74
|
+
|
|
75
|
+
return cast(
|
|
76
|
+
grpc.Channel | grpc.aio.Channel,
|
|
77
|
+
conn,
|
|
78
|
+
)
|
hatchet_sdk/context/__init__.py
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from .context import Context
|
hatchet_sdk/context/context.py
CHANGED
|
@@ -2,42 +2,36 @@ import inspect
|
|
|
2
2
|
import json
|
|
3
3
|
import traceback
|
|
4
4
|
from concurrent.futures import Future, ThreadPoolExecutor
|
|
5
|
-
from
|
|
6
|
-
from
|
|
5
|
+
from datetime import timedelta
|
|
6
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
7
7
|
|
|
8
|
-
from pydantic import BaseModel
|
|
8
|
+
from pydantic import BaseModel
|
|
9
9
|
|
|
10
|
+
from hatchet_sdk.clients.admin import AdminClient
|
|
11
|
+
from hatchet_sdk.clients.dispatcher.dispatcher import ( # type: ignore[attr-defined]
|
|
12
|
+
Action,
|
|
13
|
+
DispatcherClient,
|
|
14
|
+
)
|
|
15
|
+
from hatchet_sdk.clients.durable_event_listener import (
|
|
16
|
+
DurableEventListener,
|
|
17
|
+
RegisterDurableEventRequest,
|
|
18
|
+
)
|
|
10
19
|
from hatchet_sdk.clients.events import EventClient
|
|
11
|
-
from hatchet_sdk.clients.rest.tenacity_utils import tenacity_retry
|
|
12
20
|
from hatchet_sdk.clients.rest_client import RestApi
|
|
13
21
|
from hatchet_sdk.clients.run_event_listener import RunEventListenerClient
|
|
14
22
|
from hatchet_sdk.clients.workflow_listener import PooledWorkflowRunListener
|
|
15
23
|
from hatchet_sdk.context.worker_context import WorkerContext
|
|
16
|
-
from hatchet_sdk.
|
|
17
|
-
from hatchet_sdk.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
)
|
|
21
|
-
from hatchet_sdk.utils.types import WorkflowValidator
|
|
22
|
-
from hatchet_sdk.utils.typing import is_basemodel_subclass
|
|
23
|
-
from hatchet_sdk.workflow_run import WorkflowRunRef
|
|
24
|
-
|
|
25
|
-
from ..clients.admin import (
|
|
26
|
-
AdminClient,
|
|
27
|
-
ChildTriggerWorkflowOptions,
|
|
28
|
-
ChildWorkflowRunDict,
|
|
29
|
-
TriggerWorkflowOptions,
|
|
30
|
-
WorkflowRunDict,
|
|
31
|
-
)
|
|
32
|
-
from ..clients.dispatcher.dispatcher import ( # type: ignore[attr-defined]
|
|
33
|
-
Action,
|
|
34
|
-
DispatcherClient,
|
|
35
|
-
)
|
|
36
|
-
from ..logger import logger
|
|
24
|
+
from hatchet_sdk.logger import logger
|
|
25
|
+
from hatchet_sdk.utils.timedelta_to_expression import Duration, timedelta_to_expr
|
|
26
|
+
from hatchet_sdk.utils.typing import JSONSerializableMapping, WorkflowValidator
|
|
27
|
+
from hatchet_sdk.waits import SleepCondition, UserEventCondition
|
|
37
28
|
|
|
38
|
-
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from hatchet_sdk.runnables.task import Task
|
|
31
|
+
from hatchet_sdk.runnables.types import R, TWorkflowInput
|
|
39
32
|
|
|
40
|
-
|
|
33
|
+
|
|
34
|
+
DEFAULT_WORKFLOW_POLLING_INTERVAL = 5 # Seconds
|
|
41
35
|
|
|
42
36
|
|
|
43
37
|
def get_caller_file_path() -> str:
|
|
@@ -46,43 +40,13 @@ def get_caller_file_path() -> str:
|
|
|
46
40
|
return caller_frame.filename
|
|
47
41
|
|
|
48
42
|
|
|
49
|
-
class
|
|
43
|
+
class StepRunError(BaseModel):
|
|
44
|
+
step_id: str
|
|
45
|
+
step_run_action_name: str
|
|
46
|
+
error: str
|
|
50
47
|
|
|
51
|
-
action: Action
|
|
52
|
-
spawn_index: int
|
|
53
48
|
|
|
54
|
-
|
|
55
|
-
self,
|
|
56
|
-
key: str | None = None,
|
|
57
|
-
options: ChildTriggerWorkflowOptions | None = None,
|
|
58
|
-
worker_id: str | None = None,
|
|
59
|
-
) -> TriggerWorkflowOptions:
|
|
60
|
-
workflow_run_id = self.action.workflow_run_id
|
|
61
|
-
step_run_id = self.action.step_run_id
|
|
62
|
-
|
|
63
|
-
desired_worker_id = None
|
|
64
|
-
if options is not None and "sticky" in options and options["sticky"] == True:
|
|
65
|
-
desired_worker_id = worker_id
|
|
66
|
-
|
|
67
|
-
meta = None
|
|
68
|
-
if options is not None and "additional_metadata" in options:
|
|
69
|
-
meta = options["additional_metadata"]
|
|
70
|
-
|
|
71
|
-
## TODO: Pydantic here to simplify this
|
|
72
|
-
trigger_options: TriggerWorkflowOptions = {
|
|
73
|
-
"parent_id": workflow_run_id,
|
|
74
|
-
"parent_step_run_id": step_run_id,
|
|
75
|
-
"child_key": key,
|
|
76
|
-
"child_index": self.spawn_index,
|
|
77
|
-
"additional_metadata": meta,
|
|
78
|
-
"desired_worker_id": desired_worker_id,
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
self.spawn_index += 1
|
|
82
|
-
return trigger_options
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
class ContextAioImpl(BaseContext):
|
|
49
|
+
class Context:
|
|
86
50
|
def __init__(
|
|
87
51
|
self,
|
|
88
52
|
action: Action,
|
|
@@ -90,89 +54,8 @@ class ContextAioImpl(BaseContext):
|
|
|
90
54
|
admin_client: AdminClient,
|
|
91
55
|
event_client: EventClient,
|
|
92
56
|
rest_client: RestApi,
|
|
93
|
-
workflow_listener: PooledWorkflowRunListener,
|
|
94
|
-
|
|
95
|
-
worker: WorkerContext,
|
|
96
|
-
namespace: str = "",
|
|
97
|
-
):
|
|
98
|
-
self.action = action
|
|
99
|
-
self.dispatcher_client = dispatcher_client
|
|
100
|
-
self.admin_client = admin_client
|
|
101
|
-
self.event_client = event_client
|
|
102
|
-
self.rest_client = rest_client
|
|
103
|
-
self.workflow_listener = workflow_listener
|
|
104
|
-
self.workflow_run_event_listener = workflow_run_event_listener
|
|
105
|
-
self.namespace = namespace
|
|
106
|
-
self.spawn_index = -1
|
|
107
|
-
self.worker = worker
|
|
108
|
-
|
|
109
|
-
@tenacity_retry
|
|
110
|
-
async def spawn_workflow(
|
|
111
|
-
self,
|
|
112
|
-
workflow_name: str,
|
|
113
|
-
input: dict[str, Any] = {},
|
|
114
|
-
key: str | None = None,
|
|
115
|
-
options: ChildTriggerWorkflowOptions | None = None,
|
|
116
|
-
) -> WorkflowRunRef:
|
|
117
|
-
worker_id = self.worker.id()
|
|
118
|
-
# if (
|
|
119
|
-
# options is not None
|
|
120
|
-
# and "sticky" in options
|
|
121
|
-
# and options["sticky"] == True
|
|
122
|
-
# and not self.worker.has_workflow(workflow_name)
|
|
123
|
-
# ):
|
|
124
|
-
# raise Exception(
|
|
125
|
-
# f"cannot run with sticky: workflow {workflow_name} is not registered on the worker"
|
|
126
|
-
# )
|
|
127
|
-
|
|
128
|
-
trigger_options = self._prepare_workflow_options(key, options, worker_id)
|
|
129
|
-
|
|
130
|
-
return await self.admin_client.aio.run_workflow(
|
|
131
|
-
workflow_name, input, trigger_options
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
@tenacity_retry
|
|
135
|
-
async def spawn_workflows(
|
|
136
|
-
self, child_workflow_runs: list[ChildWorkflowRunDict]
|
|
137
|
-
) -> list[WorkflowRunRef]:
|
|
138
|
-
|
|
139
|
-
if len(child_workflow_runs) == 0:
|
|
140
|
-
raise Exception("no child workflows to spawn")
|
|
141
|
-
|
|
142
|
-
worker_id = self.worker.id()
|
|
143
|
-
|
|
144
|
-
bulk_trigger_workflow_runs: list[WorkflowRunDict] = []
|
|
145
|
-
for child_workflow_run in child_workflow_runs:
|
|
146
|
-
workflow_name = child_workflow_run["workflow_name"]
|
|
147
|
-
input = child_workflow_run["input"]
|
|
148
|
-
|
|
149
|
-
key = child_workflow_run.get("key")
|
|
150
|
-
options = child_workflow_run.get("options", {})
|
|
151
|
-
|
|
152
|
-
trigger_options = self._prepare_workflow_options(key, options, worker_id)
|
|
153
|
-
|
|
154
|
-
bulk_trigger_workflow_runs.append(
|
|
155
|
-
WorkflowRunDict(
|
|
156
|
-
workflow_name=workflow_name, input=input, options=trigger_options
|
|
157
|
-
)
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
return await self.admin_client.aio.run_workflows(bulk_trigger_workflow_runs)
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
class Context(BaseContext):
|
|
164
|
-
spawn_index = -1
|
|
165
|
-
|
|
166
|
-
worker: WorkerContext
|
|
167
|
-
|
|
168
|
-
def __init__(
|
|
169
|
-
self,
|
|
170
|
-
action: Action,
|
|
171
|
-
dispatcher_client: DispatcherClient,
|
|
172
|
-
admin_client: AdminClient,
|
|
173
|
-
event_client: EventClient,
|
|
174
|
-
rest_client: RestApi,
|
|
175
|
-
workflow_listener: PooledWorkflowRunListener,
|
|
57
|
+
workflow_listener: PooledWorkflowRunListener | None,
|
|
58
|
+
durable_event_listener: DurableEventListener | None,
|
|
176
59
|
workflow_run_event_listener: RunEventListenerClient,
|
|
177
60
|
worker: WorkerContext,
|
|
178
61
|
namespace: str = "",
|
|
@@ -181,44 +64,18 @@ class Context(BaseContext):
|
|
|
181
64
|
self.worker = worker
|
|
182
65
|
self.validator_registry = validator_registry
|
|
183
66
|
|
|
184
|
-
self.
|
|
185
|
-
action,
|
|
186
|
-
dispatcher_client,
|
|
187
|
-
admin_client,
|
|
188
|
-
event_client,
|
|
189
|
-
rest_client,
|
|
190
|
-
workflow_listener,
|
|
191
|
-
workflow_run_event_listener,
|
|
192
|
-
worker,
|
|
193
|
-
namespace,
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
# Check the type of action.action_payload before attempting to load it as JSON
|
|
197
|
-
if isinstance(action.action_payload, (str, bytes, bytearray)):
|
|
198
|
-
try:
|
|
199
|
-
self.data = cast(dict[str, Any], json.loads(action.action_payload))
|
|
200
|
-
except Exception as e:
|
|
201
|
-
logger.error(f"Error parsing action payload: {e}")
|
|
202
|
-
# Assign an empty dictionary if parsing fails
|
|
203
|
-
self.data: dict[str, Any] = {} # type: ignore[no-redef]
|
|
204
|
-
else:
|
|
205
|
-
# Directly assign the payload to self.data if it's already a dict
|
|
206
|
-
self.data = (
|
|
207
|
-
action.action_payload if isinstance(action.action_payload, dict) else {}
|
|
208
|
-
)
|
|
67
|
+
self.data = action.action_payload
|
|
209
68
|
|
|
210
69
|
self.action = action
|
|
211
70
|
|
|
212
|
-
|
|
213
|
-
self.stepRunId = action.step_run_id
|
|
214
|
-
|
|
215
|
-
self.step_run_id = action.step_run_id
|
|
71
|
+
self.step_run_id: str = action.step_run_id
|
|
216
72
|
self.exit_flag = False
|
|
217
73
|
self.dispatcher_client = dispatcher_client
|
|
218
74
|
self.admin_client = admin_client
|
|
219
75
|
self.event_client = event_client
|
|
220
76
|
self.rest_client = rest_client
|
|
221
77
|
self.workflow_listener = workflow_listener
|
|
78
|
+
self.durable_event_listener = durable_event_listener
|
|
222
79
|
self.workflow_run_event_listener = workflow_run_event_listener
|
|
223
80
|
self.namespace = namespace
|
|
224
81
|
|
|
@@ -227,45 +84,55 @@ class Context(BaseContext):
|
|
|
227
84
|
self.logger_thread_pool = ThreadPoolExecutor(max_workers=1)
|
|
228
85
|
self.stream_event_thread_pool = ThreadPoolExecutor(max_workers=1)
|
|
229
86
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
87
|
+
self.input = self.data.input
|
|
88
|
+
|
|
89
|
+
def was_skipped(self, task: "Task[TWorkflowInput, R]") -> bool:
|
|
90
|
+
return self.data.parents.get(task.name, {}).get("skipped", False)
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def trigger_data(self) -> JSONSerializableMapping:
|
|
94
|
+
return self.data.triggers
|
|
95
|
+
|
|
96
|
+
def task_output(self, task: "Task[TWorkflowInput, R]") -> "R":
|
|
97
|
+
from hatchet_sdk.runnables.types import R
|
|
233
98
|
|
|
234
|
-
if
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
99
|
+
if self.was_skipped(task):
|
|
100
|
+
raise ValueError("{task.name} was skipped")
|
|
101
|
+
|
|
102
|
+
action_prefix = self.action.action_id.split(":")[0]
|
|
238
103
|
|
|
239
|
-
def step_output(self, step: str) -> dict[str, Any] | BaseModel:
|
|
240
104
|
workflow_validator = next(
|
|
241
|
-
(
|
|
105
|
+
(
|
|
106
|
+
v
|
|
107
|
+
for k, v in self.validator_registry.items()
|
|
108
|
+
if k == f"{action_prefix}:{task.name}"
|
|
109
|
+
),
|
|
242
110
|
None,
|
|
243
111
|
)
|
|
244
112
|
|
|
245
113
|
try:
|
|
246
|
-
parent_step_data = cast(
|
|
114
|
+
parent_step_data = cast(R, self.data.parents[task.name])
|
|
247
115
|
except KeyError:
|
|
248
|
-
raise ValueError(f"Step output for '{
|
|
116
|
+
raise ValueError(f"Step output for '{task.name}' not found")
|
|
249
117
|
|
|
250
|
-
if
|
|
251
|
-
|
|
118
|
+
if (
|
|
119
|
+
parent_step_data
|
|
120
|
+
and workflow_validator
|
|
121
|
+
and (v := workflow_validator.step_output)
|
|
122
|
+
):
|
|
123
|
+
return cast(R, v.model_validate(parent_step_data))
|
|
252
124
|
|
|
253
125
|
return parent_step_data
|
|
254
126
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
def workflow_input(self) -> dict[str, Any] | T:
|
|
259
|
-
if (r := self.validator_registry.get(self.action.action_id)) and (
|
|
260
|
-
i := r.workflow_input
|
|
261
|
-
):
|
|
262
|
-
return cast(
|
|
263
|
-
T,
|
|
264
|
-
i.model_validate(self.input),
|
|
265
|
-
)
|
|
127
|
+
@property
|
|
128
|
+
def was_triggered_by_event(self) -> bool:
|
|
129
|
+
return self.data.triggered_by == "event"
|
|
266
130
|
|
|
131
|
+
@property
|
|
132
|
+
def workflow_input(self) -> JSONSerializableMapping:
|
|
267
133
|
return self.input
|
|
268
134
|
|
|
135
|
+
@property
|
|
269
136
|
def workflow_run_id(self) -> str:
|
|
270
137
|
return self.action.workflow_run_id
|
|
271
138
|
|
|
@@ -277,39 +144,18 @@ class Context(BaseContext):
|
|
|
277
144
|
def done(self) -> bool:
|
|
278
145
|
return self.exit_flag
|
|
279
146
|
|
|
280
|
-
def playground(self, name: str, default: str | None = None) -> str | None:
|
|
281
|
-
# if the key exists in the overrides_data field, return the value
|
|
282
|
-
if name in self.overrides_data:
|
|
283
|
-
warn(
|
|
284
|
-
"Use of `overrides_data` is deprecated.",
|
|
285
|
-
DeprecationWarning,
|
|
286
|
-
stacklevel=1,
|
|
287
|
-
)
|
|
288
|
-
return str(self.overrides_data[name])
|
|
289
|
-
|
|
290
|
-
caller_file = get_caller_file_path()
|
|
291
|
-
|
|
292
|
-
self.dispatcher_client.put_overrides_data(
|
|
293
|
-
OverridesData(
|
|
294
|
-
stepRunId=self.stepRunId,
|
|
295
|
-
path=name,
|
|
296
|
-
value=json.dumps(default),
|
|
297
|
-
callerFilename=caller_file,
|
|
298
|
-
)
|
|
299
|
-
)
|
|
300
|
-
|
|
301
|
-
return default
|
|
302
|
-
|
|
303
147
|
def _log(self, line: str) -> tuple[bool, Exception | None]:
|
|
304
148
|
try:
|
|
305
|
-
self.event_client.log(message=line, step_run_id=self.
|
|
149
|
+
self.event_client.log(message=line, step_run_id=self.step_run_id)
|
|
306
150
|
return True, None
|
|
307
151
|
except Exception as e:
|
|
308
152
|
# we don't want to raise an exception here, as it will kill the log thread
|
|
309
153
|
return False, e
|
|
310
154
|
|
|
311
|
-
def log(
|
|
312
|
-
|
|
155
|
+
def log(
|
|
156
|
+
self, line: str | JSONSerializableMapping, raise_on_error: bool = False
|
|
157
|
+
) -> None:
|
|
158
|
+
if self.step_run_id == "":
|
|
313
159
|
return
|
|
314
160
|
|
|
315
161
|
if not isinstance(line, str):
|
|
@@ -339,45 +185,54 @@ class Context(BaseContext):
|
|
|
339
185
|
future.add_done_callback(handle_result)
|
|
340
186
|
|
|
341
187
|
def release_slot(self) -> None:
|
|
342
|
-
return self.dispatcher_client.release_slot(self.
|
|
188
|
+
return self.dispatcher_client.release_slot(self.step_run_id)
|
|
343
189
|
|
|
344
190
|
def _put_stream(self, data: str | bytes) -> None:
|
|
345
191
|
try:
|
|
346
|
-
self.event_client.stream(data=data, step_run_id=self.
|
|
192
|
+
self.event_client.stream(data=data, step_run_id=self.step_run_id)
|
|
347
193
|
except Exception as e:
|
|
348
194
|
logger.error(f"Error putting stream event: {e}")
|
|
349
195
|
|
|
350
196
|
def put_stream(self, data: str | bytes) -> None:
|
|
351
|
-
if self.
|
|
197
|
+
if self.step_run_id == "":
|
|
352
198
|
return
|
|
353
199
|
|
|
354
200
|
self.stream_event_thread_pool.submit(self._put_stream, data)
|
|
355
201
|
|
|
356
|
-
def refresh_timeout(self, increment_by: str) -> None:
|
|
202
|
+
def refresh_timeout(self, increment_by: str | timedelta) -> None:
|
|
203
|
+
if isinstance(increment_by, timedelta):
|
|
204
|
+
increment_by = timedelta_to_expr(increment_by)
|
|
205
|
+
|
|
357
206
|
try:
|
|
358
207
|
return self.dispatcher_client.refresh_timeout(
|
|
359
|
-
step_run_id=self.
|
|
208
|
+
step_run_id=self.step_run_id, increment_by=increment_by
|
|
360
209
|
)
|
|
361
210
|
except Exception as e:
|
|
362
211
|
logger.error(f"Error refreshing timeout: {e}")
|
|
363
212
|
|
|
213
|
+
@property
|
|
364
214
|
def retry_count(self) -> int:
|
|
365
215
|
return self.action.retry_count
|
|
366
216
|
|
|
367
|
-
|
|
217
|
+
@property
|
|
218
|
+
def additional_metadata(self) -> JSONSerializableMapping | None:
|
|
368
219
|
return self.action.additional_metadata
|
|
369
220
|
|
|
221
|
+
@property
|
|
370
222
|
def child_index(self) -> int | None:
|
|
371
223
|
return self.action.child_workflow_index
|
|
372
224
|
|
|
225
|
+
@property
|
|
373
226
|
def child_key(self) -> str | None:
|
|
374
227
|
return self.action.child_workflow_key
|
|
375
228
|
|
|
229
|
+
@property
|
|
376
230
|
def parent_workflow_run_id(self) -> str | None:
|
|
377
231
|
return self.action.parent_workflow_run_id
|
|
378
232
|
|
|
379
|
-
|
|
380
|
-
|
|
233
|
+
@property
|
|
234
|
+
def task_run_errors(self) -> dict[str, str]:
|
|
235
|
+
errors = self.data.step_run_errors
|
|
381
236
|
|
|
382
237
|
if not errors:
|
|
383
238
|
logger.error(
|
|
@@ -386,61 +241,44 @@ class Context(BaseContext):
|
|
|
386
241
|
|
|
387
242
|
return errors
|
|
388
243
|
|
|
389
|
-
def
|
|
390
|
-
data = self.rest_client.workflow_run_get(self.action.workflow_run_id)
|
|
391
|
-
other_job_runs = [
|
|
392
|
-
run for run in (data.job_runs or []) if run.job_id != self.action.job_id
|
|
393
|
-
]
|
|
394
|
-
# TODO: Parse Step Runs using a Pydantic Model rather than a hand crafted dictionary
|
|
395
|
-
return [
|
|
396
|
-
{
|
|
397
|
-
"step_id": step_run.step_id,
|
|
398
|
-
"step_run_action_name": step_run.step.action,
|
|
399
|
-
"error": step_run.error,
|
|
400
|
-
}
|
|
401
|
-
for job_run in other_job_runs
|
|
402
|
-
if job_run.step_runs
|
|
403
|
-
for step_run in job_run.step_runs
|
|
404
|
-
if step_run.error and step_run.step
|
|
405
|
-
]
|
|
406
|
-
|
|
407
|
-
@tenacity_retry
|
|
408
|
-
def spawn_workflow(
|
|
244
|
+
def fetch_task_run_error(
|
|
409
245
|
self,
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
options: ChildTriggerWorkflowOptions | None = None,
|
|
414
|
-
) -> WorkflowRunRef:
|
|
415
|
-
worker_id = self.worker.id()
|
|
416
|
-
trigger_options = self._prepare_workflow_options(key, options, worker_id)
|
|
246
|
+
task: "Task[TWorkflowInput, R]",
|
|
247
|
+
) -> str | None:
|
|
248
|
+
errors = self.data.step_run_errors
|
|
417
249
|
|
|
418
|
-
return
|
|
250
|
+
return errors.get(task.name)
|
|
419
251
|
|
|
420
|
-
@tenacity_retry
|
|
421
|
-
def spawn_workflows(
|
|
422
|
-
self, child_workflow_runs: list[ChildWorkflowRunDict]
|
|
423
|
-
) -> list[WorkflowRunRef]:
|
|
424
252
|
|
|
425
|
-
|
|
426
|
-
|
|
253
|
+
class DurableContext(Context):
|
|
254
|
+
async def aio_wait_for(
|
|
255
|
+
self, signal_key: str, *conditions: SleepCondition | UserEventCondition
|
|
256
|
+
) -> dict[str, Any]:
|
|
257
|
+
if self.durable_event_listener is None:
|
|
258
|
+
raise ValueError("Durable event listener is not available")
|
|
427
259
|
|
|
428
|
-
|
|
260
|
+
task_id = self.step_run_id
|
|
429
261
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
262
|
+
request = RegisterDurableEventRequest(
|
|
263
|
+
task_id=task_id,
|
|
264
|
+
signal_key=signal_key,
|
|
265
|
+
conditions=list(conditions),
|
|
266
|
+
)
|
|
434
267
|
|
|
435
|
-
|
|
436
|
-
options = child_workflow_run.get("options", {})
|
|
268
|
+
self.durable_event_listener.register_durable_event(request)
|
|
437
269
|
|
|
438
|
-
|
|
270
|
+
return await self.durable_event_listener.result(
|
|
271
|
+
task_id,
|
|
272
|
+
signal_key,
|
|
273
|
+
)
|
|
439
274
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
)
|
|
444
|
-
)
|
|
275
|
+
async def aio_sleep_for(self, duration: Duration) -> dict[str, Any]:
|
|
276
|
+
"""
|
|
277
|
+
Lightweight wrapper for durable sleep. Allows for shorthand usage of `ctx.aio_wait_for` when specifying a sleep condition.
|
|
445
278
|
|
|
446
|
-
|
|
279
|
+
For more complicated conditions, use `ctx.aio_wait_for` directly.
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
return await self.aio_wait_for(
|
|
283
|
+
f"sleep:{timedelta_to_expr(duration)}", SleepCondition(duration=duration)
|
|
284
|
+
)
|
|
@@ -15,14 +15,14 @@ _sym_db = _symbol_database.Default()
|
|
|
15
15
|
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x65vents.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xb4\x01\n\x05\x45vent\x12\x10\n\x08tenantId\x18\x01 \x01(\t\x12\x0f\n\x07\x65ventId\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x0f\n\x07payload\x18\x04 \x01(\t\x12\x32\n\x0e\x65ventTimestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x12\x61\x64\x64itionalMetadata\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_additionalMetadata\" \n\x06\x45vents\x12\x16\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x06.Event\"\x92\x01\n\rPutLogRequest\x12\x11\n\tstepRunId\x18\x01 \x01(\t\x12-\n\tcreatedAt\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x03 \x01(\t\x12\x12\n\x05level\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08metadata\x18\x05 \x01(\tB\x08\n\x06_level\"\x10\n\x0ePutLogResponse\"|\n\x15PutStreamEventRequest\x12\x11\n\tstepRunId\x18\x01 \x01(\t\x12-\n\tcreatedAt\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x10\n\x08metadata\x18\x05 \x01(\t\"\x18\n\x16PutStreamEventResponse\"9\n\x14\x42ulkPushEventRequest\x12!\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x11.PushEventRequest\"\x9c\x01\n\x10PushEventRequest\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\t\x12\x32\n\x0e\x65ventTimestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x12\x61\x64\x64itionalMetadata\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_additionalMetadata\"%\n\x12ReplayEventRequest\x12\x0f\n\x07\x65ventId\x18\x01 \x01(\t2\x88\x02\n\rEventsService\x12#\n\x04Push\x12\x11.PushEventRequest\x1a\x06.Event\"\x00\x12,\n\x08\x42ulkPush\x12\x15.BulkPushEventRequest\x1a\x07.Events\"\x00\x12\x32\n\x11ReplaySingleEvent\x12\x13.ReplayEventRequest\x1a\x06.Event\"\x00\x12+\n\x06PutLog\x12\x0e.PutLogRequest\x1a\x0f.PutLogResponse\"\x00\x12\x43\n\x0ePutStreamEvent\x12\x16.PutStreamEventRequest\x1a\x17.PutStreamEventResponse\"\x00\
|
|
18
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x65vents.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xb4\x01\n\x05\x45vent\x12\x10\n\x08tenantId\x18\x01 \x01(\t\x12\x0f\n\x07\x65ventId\x18\x02 \x01(\t\x12\x0b\n\x03key\x18\x03 \x01(\t\x12\x0f\n\x07payload\x18\x04 \x01(\t\x12\x32\n\x0e\x65ventTimestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x12\x61\x64\x64itionalMetadata\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_additionalMetadata\" \n\x06\x45vents\x12\x16\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x06.Event\"\x92\x01\n\rPutLogRequest\x12\x11\n\tstepRunId\x18\x01 \x01(\t\x12-\n\tcreatedAt\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x03 \x01(\t\x12\x12\n\x05level\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08metadata\x18\x05 \x01(\tB\x08\n\x06_level\"\x10\n\x0ePutLogResponse\"|\n\x15PutStreamEventRequest\x12\x11\n\tstepRunId\x18\x01 \x01(\t\x12-\n\tcreatedAt\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x10\n\x08metadata\x18\x05 \x01(\t\"\x18\n\x16PutStreamEventResponse\"9\n\x14\x42ulkPushEventRequest\x12!\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x11.PushEventRequest\"\x9c\x01\n\x10PushEventRequest\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\t\x12\x32\n\x0e\x65ventTimestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1f\n\x12\x61\x64\x64itionalMetadata\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x15\n\x13_additionalMetadata\"%\n\x12ReplayEventRequest\x12\x0f\n\x07\x65ventId\x18\x01 \x01(\t2\x88\x02\n\rEventsService\x12#\n\x04Push\x12\x11.PushEventRequest\x1a\x06.Event\"\x00\x12,\n\x08\x42ulkPush\x12\x15.BulkPushEventRequest\x1a\x07.Events\"\x00\x12\x32\n\x11ReplaySingleEvent\x12\x13.ReplayEventRequest\x1a\x06.Event\"\x00\x12+\n\x06PutLog\x12\x0e.PutLogRequest\x1a\x0f.PutLogResponse\"\x00\x12\x43\n\x0ePutStreamEvent\x12\x16.PutStreamEventRequest\x1a\x17.PutStreamEventResponse\"\x00\x42\x45ZCgithub.com/hatchet-dev/hatchet/internal/services/ingestor/contractsb\x06proto3')
|
|
19
19
|
|
|
20
20
|
_globals = globals()
|
|
21
21
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
22
22
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'events_pb2', _globals)
|
|
23
23
|
if not _descriptor._USE_C_DESCRIPTORS:
|
|
24
24
|
_globals['DESCRIPTOR']._loaded_options = None
|
|
25
|
-
_globals['DESCRIPTOR']._serialized_options = b'
|
|
25
|
+
_globals['DESCRIPTOR']._serialized_options = b'ZCgithub.com/hatchet-dev/hatchet/internal/services/ingestor/contracts'
|
|
26
26
|
_globals['_EVENT']._serialized_start=50
|
|
27
27
|
_globals['_EVENT']._serialized_end=230
|
|
28
28
|
_globals['_EVENTS']._serialized_start=232
|