prefect-client 3.6.23.dev2__tar.gz → 3.6.23.dev4__tar.gz
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.
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/PKG-INFO +1 -1
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/AGENTS.md +3 -0
- prefect_client-3.6.23.dev4/src/prefect/_build_info.py +5 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/__init__.py +77 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_work_pools/client.py +86 -1
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/routes.py +2 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/objects.py +14 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/responses.py +48 -0
- prefect_client-3.6.23.dev4/src/prefect/deployments/AGENTS.md +39 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/runner.py +41 -10
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/utility.py +91 -17
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/docker/docker_image.py +13 -1
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/flows.py +37 -11
- prefect_client-3.6.23.dev4/src/prefect/runner/AGENTS.md +67 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/work_queues.py +115 -19
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/workers.py +168 -16
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/tasks.py +1 -1
- prefect_client-3.6.23.dev2/src/prefect/_build_info.py +0 -5
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/.gitignore +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/LICENSE +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/README.md +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/pyproject.toml +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/bundles/execute.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/_version_checking.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/context.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/engine.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/flow_engine.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/futures.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/main.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/results.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_cancellation_manager.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_flow_run_executor.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_process_manager.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_starter_bundle.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_starter_direct.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_starter_engine.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/_state_proposer.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/runner.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/serializers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/states.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/asyncutils.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/callables.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/engine.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/filesystem.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/processutils.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/templating.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/process.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/workers/utilities.py +0 -0
|
@@ -46,4 +46,7 @@ Use `get_logger()` from `prefect.logging` instead of raw `logging.getLogger()`
|
|
|
46
46
|
- `settings/` → Configuration system (see settings/AGENTS.md)
|
|
47
47
|
- `concurrency/` → Concurrency slot acquisition and lease management (see concurrency/AGENTS.md)
|
|
48
48
|
- `logging/` → Logging handlers, API log shipping, and run-context loggers (see logging/AGENTS.md)
|
|
49
|
+
- `runner/` → Thin facade over extracted single-responsibility classes for local flow run execution (see runner/AGENTS.md)
|
|
50
|
+
- `deployments/` → YAML-driven deployment lifecycle: project init, build/push/pull steps, and triggering remote flow runs (see deployments/AGENTS.md)
|
|
51
|
+
- `docker/` → `DockerImage` class for building and pushing Docker images during deployment
|
|
49
52
|
- `telemetry/` → OS-level resource metric collection and run telemetry
|
|
@@ -143,6 +143,7 @@ from prefect.client._version_checking import (
|
|
|
143
143
|
)
|
|
144
144
|
|
|
145
145
|
if TYPE_CHECKING:
|
|
146
|
+
from prefect.client.schemas.responses import WorkQueueConcurrencyStatus
|
|
146
147
|
from prefect.tasks import Task as TaskObject
|
|
147
148
|
|
|
148
149
|
from prefect.client.base import (
|
|
@@ -713,6 +714,44 @@ class PrefectClient(
|
|
|
713
714
|
raise
|
|
714
715
|
return WorkQueueStatusDetail.model_validate(response.json())
|
|
715
716
|
|
|
717
|
+
async def read_work_queue_concurrency_status(
|
|
718
|
+
self,
|
|
719
|
+
id: UUID,
|
|
720
|
+
page: int = 1,
|
|
721
|
+
limit: Optional[int] = None,
|
|
722
|
+
) -> "WorkQueueConcurrencyStatus":
|
|
723
|
+
"""
|
|
724
|
+
Read concurrency status for a work queue.
|
|
725
|
+
|
|
726
|
+
Args:
|
|
727
|
+
id: the id of the work queue
|
|
728
|
+
page: Page number (1-indexed).
|
|
729
|
+
limit: Max flow runs per page (server default if None).
|
|
730
|
+
|
|
731
|
+
Raises:
|
|
732
|
+
prefect.exceptions.ObjectNotFound: If request returns 404
|
|
733
|
+
httpx.RequestError: If request fails
|
|
734
|
+
|
|
735
|
+
Returns:
|
|
736
|
+
Paginated WorkQueueConcurrencyStatus with flow run summaries
|
|
737
|
+
"""
|
|
738
|
+
from prefect.client.schemas.responses import WorkQueueConcurrencyStatus
|
|
739
|
+
|
|
740
|
+
body: dict = {"page": page}
|
|
741
|
+
if limit is not None:
|
|
742
|
+
body["limit"] = limit
|
|
743
|
+
|
|
744
|
+
try:
|
|
745
|
+
response = await self._client.post(
|
|
746
|
+
f"/work_queues/{id}/concurrency_status", json=body
|
|
747
|
+
)
|
|
748
|
+
except httpx.HTTPStatusError as e:
|
|
749
|
+
if e.response.status_code == status.HTTP_404_NOT_FOUND:
|
|
750
|
+
raise prefect.exceptions.ObjectNotFound(http_exc=e) from e
|
|
751
|
+
else:
|
|
752
|
+
raise
|
|
753
|
+
return WorkQueueConcurrencyStatus.model_validate(response.json())
|
|
754
|
+
|
|
716
755
|
async def match_work_queues(
|
|
717
756
|
self,
|
|
718
757
|
prefixes: list[str],
|
|
@@ -1882,6 +1921,44 @@ class SyncPrefectClient(
|
|
|
1882
1921
|
raise
|
|
1883
1922
|
return WorkQueueStatusDetail.model_validate(response.json())
|
|
1884
1923
|
|
|
1924
|
+
def read_work_queue_concurrency_status(
|
|
1925
|
+
self,
|
|
1926
|
+
id: UUID,
|
|
1927
|
+
page: int = 1,
|
|
1928
|
+
limit: Optional[int] = None,
|
|
1929
|
+
) -> "WorkQueueConcurrencyStatus":
|
|
1930
|
+
"""
|
|
1931
|
+
Read concurrency status for a work queue.
|
|
1932
|
+
|
|
1933
|
+
Args:
|
|
1934
|
+
id: the id of the work queue
|
|
1935
|
+
page: Page number (1-indexed).
|
|
1936
|
+
limit: Max flow runs per page (server default if None).
|
|
1937
|
+
|
|
1938
|
+
Raises:
|
|
1939
|
+
prefect.exceptions.ObjectNotFound: If request returns 404
|
|
1940
|
+
httpx.RequestError: If request fails
|
|
1941
|
+
|
|
1942
|
+
Returns:
|
|
1943
|
+
Paginated WorkQueueConcurrencyStatus with flow run summaries
|
|
1944
|
+
"""
|
|
1945
|
+
from prefect.client.schemas.responses import WorkQueueConcurrencyStatus
|
|
1946
|
+
|
|
1947
|
+
body: dict = {"page": page}
|
|
1948
|
+
if limit is not None:
|
|
1949
|
+
body["limit"] = limit
|
|
1950
|
+
|
|
1951
|
+
try:
|
|
1952
|
+
response = self._client.post(
|
|
1953
|
+
f"/work_queues/{id}/concurrency_status", json=body
|
|
1954
|
+
)
|
|
1955
|
+
except httpx.HTTPStatusError as e:
|
|
1956
|
+
if e.response.status_code == status.HTTP_404_NOT_FOUND:
|
|
1957
|
+
raise prefect.exceptions.ObjectNotFound(http_exc=e) from e
|
|
1958
|
+
else:
|
|
1959
|
+
raise
|
|
1960
|
+
return WorkQueueConcurrencyStatus.model_validate(response.json())
|
|
1961
|
+
|
|
1885
1962
|
def match_work_queues(
|
|
1886
1963
|
self,
|
|
1887
1964
|
prefixes: list[str],
|
|
@@ -25,7 +25,10 @@ if TYPE_CHECKING:
|
|
|
25
25
|
WorkerMetadata,
|
|
26
26
|
WorkPool,
|
|
27
27
|
)
|
|
28
|
-
from prefect.client.schemas.responses import
|
|
28
|
+
from prefect.client.schemas.responses import (
|
|
29
|
+
WorkerFlowRunResponse,
|
|
30
|
+
WorkPoolConcurrencyStatus,
|
|
31
|
+
)
|
|
29
32
|
|
|
30
33
|
from prefect.exceptions import ObjectAlreadyExists, ObjectNotFound, ObjectUnsupported
|
|
31
34
|
|
|
@@ -316,6 +319,47 @@ class WorkPoolClient(BaseClient):
|
|
|
316
319
|
|
|
317
320
|
return WorkerFlowRunResponse.model_validate_list(response.json())
|
|
318
321
|
|
|
322
|
+
def read_work_pool_concurrency_status(
|
|
323
|
+
self,
|
|
324
|
+
work_pool_name: str,
|
|
325
|
+
page: int = 1,
|
|
326
|
+
limit: int | None = None,
|
|
327
|
+
flow_run_limit: int = 10,
|
|
328
|
+
) -> "WorkPoolConcurrencyStatus":
|
|
329
|
+
"""
|
|
330
|
+
Reads concurrency status for a work pool.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
work_pool_name: The name of the work pool.
|
|
334
|
+
page: Page number (1-indexed).
|
|
335
|
+
limit: Max queues per page (server default if None).
|
|
336
|
+
flow_run_limit: Max flow runs per queue (0-200).
|
|
337
|
+
|
|
338
|
+
Returns:
|
|
339
|
+
Paginated concurrency status with per-queue breakdown.
|
|
340
|
+
"""
|
|
341
|
+
from prefect.client.schemas.responses import WorkPoolConcurrencyStatus
|
|
342
|
+
|
|
343
|
+
body: dict[str, Any] = {"page": page}
|
|
344
|
+
if limit is not None:
|
|
345
|
+
body["limit"] = limit
|
|
346
|
+
body["flow_run_limit"] = flow_run_limit
|
|
347
|
+
|
|
348
|
+
try:
|
|
349
|
+
response = self.request(
|
|
350
|
+
"POST",
|
|
351
|
+
"/work_pools/{name}/concurrency_status",
|
|
352
|
+
path_params={"name": work_pool_name},
|
|
353
|
+
json=body,
|
|
354
|
+
)
|
|
355
|
+
except HTTPStatusError as e:
|
|
356
|
+
if e.response.status_code == 404:
|
|
357
|
+
raise ObjectNotFound(http_exc=e) from e
|
|
358
|
+
else:
|
|
359
|
+
raise
|
|
360
|
+
|
|
361
|
+
return WorkPoolConcurrencyStatus.model_validate(response.json())
|
|
362
|
+
|
|
319
363
|
|
|
320
364
|
class WorkPoolAsyncClient(BaseAsyncClient):
|
|
321
365
|
async def send_worker_heartbeat(
|
|
@@ -599,3 +643,44 @@ class WorkPoolAsyncClient(BaseAsyncClient):
|
|
|
599
643
|
raise
|
|
600
644
|
|
|
601
645
|
return WorkerFlowRunResponse.model_validate_list(response.json())
|
|
646
|
+
|
|
647
|
+
async def read_work_pool_concurrency_status(
|
|
648
|
+
self,
|
|
649
|
+
work_pool_name: str,
|
|
650
|
+
page: int = 1,
|
|
651
|
+
limit: int | None = None,
|
|
652
|
+
flow_run_limit: int = 10,
|
|
653
|
+
) -> "WorkPoolConcurrencyStatus":
|
|
654
|
+
"""
|
|
655
|
+
Reads concurrency status for a work pool.
|
|
656
|
+
|
|
657
|
+
Args:
|
|
658
|
+
work_pool_name: The name of the work pool.
|
|
659
|
+
page: Page number (1-indexed).
|
|
660
|
+
limit: Max queues per page (server default if None).
|
|
661
|
+
flow_run_limit: Max flow runs per queue (0-200).
|
|
662
|
+
|
|
663
|
+
Returns:
|
|
664
|
+
Paginated concurrency status with per-queue breakdown.
|
|
665
|
+
"""
|
|
666
|
+
from prefect.client.schemas.responses import WorkPoolConcurrencyStatus
|
|
667
|
+
|
|
668
|
+
body: dict[str, Any] = {"page": page}
|
|
669
|
+
if limit is not None:
|
|
670
|
+
body["limit"] = limit
|
|
671
|
+
body["flow_run_limit"] = flow_run_limit
|
|
672
|
+
|
|
673
|
+
try:
|
|
674
|
+
response = await self.request(
|
|
675
|
+
"POST",
|
|
676
|
+
"/work_pools/{name}/concurrency_status",
|
|
677
|
+
path_params={"name": work_pool_name},
|
|
678
|
+
json=body,
|
|
679
|
+
)
|
|
680
|
+
except HTTPStatusError as e:
|
|
681
|
+
if e.response.status_code == 404:
|
|
682
|
+
raise ObjectNotFound(http_exc=e) from e
|
|
683
|
+
else:
|
|
684
|
+
raise
|
|
685
|
+
|
|
686
|
+
return WorkPoolConcurrencyStatus.model_validate(response.json())
|
{prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/orchestration/routes.py
RENAMED
|
@@ -125,6 +125,7 @@ ServerRoutes = Literal[
|
|
|
125
125
|
"/version",
|
|
126
126
|
"/work_pools/",
|
|
127
127
|
"/work_pools/{name}",
|
|
128
|
+
"/work_pools/{name}/concurrency_status",
|
|
128
129
|
"/work_pools/{name}/get_scheduled_flow_runs",
|
|
129
130
|
"/work_pools/{work_pool_name}/queues",
|
|
130
131
|
"/work_pools/{work_pool_name}/queues/{name}",
|
|
@@ -137,6 +138,7 @@ ServerRoutes = Literal[
|
|
|
137
138
|
"/work_queues/",
|
|
138
139
|
"/work_queues/{id}",
|
|
139
140
|
"/work_queues/{id}/get_runs",
|
|
141
|
+
"/work_queues/{id}/concurrency_status",
|
|
140
142
|
"/work_queues/{id}/status",
|
|
141
143
|
"/work_queues/filter",
|
|
142
144
|
"/work_queues/name/{name}",
|
{prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/objects.py
RENAMED
|
@@ -1433,6 +1433,13 @@ class WorkQueue(ObjectBaseModel):
|
|
|
1433
1433
|
status: Optional[WorkQueueStatus] = Field(
|
|
1434
1434
|
default=None, description="The queue status."
|
|
1435
1435
|
)
|
|
1436
|
+
active_slots: Optional[int] = Field(
|
|
1437
|
+
default=None,
|
|
1438
|
+
description=(
|
|
1439
|
+
"The number of concurrency slots currently in use. "
|
|
1440
|
+
"None when concurrency_limit is not set."
|
|
1441
|
+
),
|
|
1442
|
+
)
|
|
1436
1443
|
|
|
1437
1444
|
|
|
1438
1445
|
class WorkQueueHealthPolicy(PrefectBaseModel):
|
|
@@ -1554,6 +1561,13 @@ class WorkPool(ObjectBaseModel):
|
|
|
1554
1561
|
status: Optional[WorkPoolStatus] = Field(
|
|
1555
1562
|
default=None, description="The current status of the work pool."
|
|
1556
1563
|
)
|
|
1564
|
+
active_slots: Optional[int] = Field(
|
|
1565
|
+
default=None,
|
|
1566
|
+
description=(
|
|
1567
|
+
"The number of concurrency slots occupied by pending or running "
|
|
1568
|
+
"flow runs. None when concurrency_limit is not set."
|
|
1569
|
+
),
|
|
1570
|
+
)
|
|
1557
1571
|
|
|
1558
1572
|
storage_configuration: WorkPoolStorageConfiguration = Field(
|
|
1559
1573
|
default_factory=WorkPoolStorageConfiguration,
|
{prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/client/schemas/responses.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import datetime
|
|
2
|
+
from datetime import timedelta
|
|
2
3
|
from typing import TYPE_CHECKING, Any, ClassVar, Generic, Optional, TypeVar, Union
|
|
3
4
|
from uuid import UUID
|
|
4
5
|
|
|
@@ -501,3 +502,50 @@ class GlobalConcurrencyLimitResponse(ObjectBaseModel):
|
|
|
501
502
|
default=2.0,
|
|
502
503
|
description="The decay rate for active slots when used as a rate limit.",
|
|
503
504
|
)
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
class FlowRunSlotSummary(PrefectBaseModel):
|
|
508
|
+
"""Summary of a flow run occupying a concurrency slot."""
|
|
509
|
+
|
|
510
|
+
id: UUID
|
|
511
|
+
name: str
|
|
512
|
+
state_type: Optional[objects.StateType] = None
|
|
513
|
+
state_name: Optional[str] = None
|
|
514
|
+
start_time: Optional[DateTime] = None
|
|
515
|
+
state_timestamp: Optional[DateTime] = None
|
|
516
|
+
time_in_current_state: Optional[timedelta] = None
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
class WorkQueueConcurrencyStatusDetail(PrefectBaseModel):
|
|
520
|
+
"""Per-queue concurrency status with flow run details."""
|
|
521
|
+
|
|
522
|
+
queue_id: UUID
|
|
523
|
+
queue_name: str
|
|
524
|
+
active_slots: int
|
|
525
|
+
concurrency_limit: Optional[int] = None
|
|
526
|
+
flow_runs: list[FlowRunSlotSummary] = Field(default_factory=list)
|
|
527
|
+
flow_run_count: Optional[int] = None
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
class WorkPoolConcurrencyStatus(PrefectBaseModel):
|
|
531
|
+
"""Paginated pool-level concurrency status with per-queue breakdown."""
|
|
532
|
+
|
|
533
|
+
active_slots: int
|
|
534
|
+
concurrency_limit: Optional[int] = None
|
|
535
|
+
queues: list[WorkQueueConcurrencyStatusDetail] = Field(default_factory=list)
|
|
536
|
+
count: int
|
|
537
|
+
limit: int
|
|
538
|
+
pages: int
|
|
539
|
+
page: int
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
class WorkQueueConcurrencyStatus(PrefectBaseModel):
|
|
543
|
+
"""Paginated queue-level concurrency status with flow run details."""
|
|
544
|
+
|
|
545
|
+
active_slots: int
|
|
546
|
+
concurrency_limit: Optional[int] = None
|
|
547
|
+
flow_runs: list[FlowRunSlotSummary] = Field(default_factory=list)
|
|
548
|
+
count: int
|
|
549
|
+
limit: int
|
|
550
|
+
pages: int
|
|
551
|
+
page: int
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Deployments
|
|
2
|
+
|
|
3
|
+
YAML-driven configuration for packaging, publishing, and triggering flow runs from infrastructure.
|
|
4
|
+
|
|
5
|
+
## Purpose & Scope
|
|
6
|
+
|
|
7
|
+
Handles deployment lifecycle: initializing projects, building/pushing deployment artifacts, and triggering remote flow runs. Does NOT manage flow execution itself — that lives in `flow_engine.py` and `task_engine.py`.
|
|
8
|
+
|
|
9
|
+
## Entry Points & Contracts
|
|
10
|
+
|
|
11
|
+
- `runner.py` → `deploy()` — programmatic deployment creation from `Flow` objects
|
|
12
|
+
- `flow_runs.py` → `run_deployment()` / `arun_deployment()` — trigger a run of an existing deployment
|
|
13
|
+
- `base.py` → `initialize_project()` — scaffold `prefect.yaml` in a project directory
|
|
14
|
+
- `steps/core.py` → `run_step()` / `run_steps()` — execute lifecycle steps defined in `prefect.yaml`
|
|
15
|
+
|
|
16
|
+
## Steps System
|
|
17
|
+
|
|
18
|
+
Steps are YAML entries in `build`, `push`, or `pull` blocks of `prefect.yaml`. Each step maps to a Python function imported at runtime. The `requires` keyword auto-installs missing packages before import.
|
|
19
|
+
|
|
20
|
+
Step outputs are templated into subsequent steps via `{{ step-id.key }}`.
|
|
21
|
+
|
|
22
|
+
Built-in steps:
|
|
23
|
+
- `steps/pull.py` — `git_clone`, `set_working_directory`, `pull_from_remote_storage`
|
|
24
|
+
- `steps/utility.py` — `run_shell_script`, `pip_install_requirements`
|
|
25
|
+
|
|
26
|
+
## Entrypoint Formats
|
|
27
|
+
|
|
28
|
+
`runner.py`'s `from_storage` / `afrom_storage` (and `Flow.from_source`) support two entrypoint formats:
|
|
29
|
+
- **File path**: `path/to/file.py:flow_func_name` — detected by presence of `:`
|
|
30
|
+
- **Module path**: `my_package.flows.flow_func` — detected by absence of `:`
|
|
31
|
+
|
|
32
|
+
For module path entrypoints, the storage destination is temporarily prepended to `sys.path` so the module can be imported, then removed in a `finally` block. Any new code that loads flows from module paths must follow this same pattern to avoid polluting `sys.path`.
|
|
33
|
+
|
|
34
|
+
## Pitfalls
|
|
35
|
+
|
|
36
|
+
- **Windows shell mode**: `run_shell_script` always uses `asyncio.create_subprocess_shell` on Windows (`sys.platform == "win32"`), regardless of the `shell` parameter. This ensures cmd.exe built-ins (`echo`, `dir`, `set`, etc.) work. On non-Windows, `shell=False` (default) uses `create_subprocess_exec` with `shlex.split`.
|
|
37
|
+
- **Step ID namespace**: `id` and `requires` are reserved keywords — do not use them as step output keys.
|
|
38
|
+
- **Step import side effects**: steps are imported dynamically; packages listed in `requires` are installed into the current environment at execution time.
|
|
39
|
+
- **String `image` argument suppresses build/push output.** When `deploy()` / `adeploy()` receives `image` as a plain string, it constructs `DockerImage(stream_progress_to=None)`, silencing all build and push progress. `DockerImage` itself defaults to `sys.stdout`, so users who pass a string get no output. To see build/push progress, pass a `DockerImage` object explicitly: `DockerImage("registry/image:tag", stream_progress_to=sys.stdout)`.
|
|
@@ -32,6 +32,7 @@ Example:
|
|
|
32
32
|
from __future__ import annotations
|
|
33
33
|
|
|
34
34
|
import importlib
|
|
35
|
+
import sys
|
|
35
36
|
import tempfile
|
|
36
37
|
from datetime import datetime, timedelta
|
|
37
38
|
from pathlib import Path
|
|
@@ -1160,7 +1161,8 @@ class RunnerDeployment(BaseModel):
|
|
|
1160
1161
|
|
|
1161
1162
|
Args:
|
|
1162
1163
|
entrypoint: The path to a file containing a flow and the name of the flow function in
|
|
1163
|
-
the format `./path/to/file.py:flow_func_name
|
|
1164
|
+
the format `./path/to/file.py:flow_func_name`, or a module path to a flow function
|
|
1165
|
+
in the format `module.path.flow_func_name`.
|
|
1164
1166
|
name: A name for the deployment
|
|
1165
1167
|
flow_name: The name of the flow to deploy
|
|
1166
1168
|
storage: A storage object to use for retrieving flow code. If not provided, a
|
|
@@ -1213,10 +1215,19 @@ class RunnerDeployment(BaseModel):
|
|
|
1213
1215
|
storage.set_base_path(Path(tmpdir))
|
|
1214
1216
|
await storage.pull_code()
|
|
1215
1217
|
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1218
|
+
if ":" in entrypoint:
|
|
1219
|
+
full_entrypoint = str(storage.destination / entrypoint)
|
|
1220
|
+
else:
|
|
1221
|
+
sys.path.insert(0, str(storage.destination))
|
|
1222
|
+
full_entrypoint = entrypoint
|
|
1223
|
+
|
|
1224
|
+
try:
|
|
1225
|
+
flow = await from_async.wait_for_call_in_new_thread(
|
|
1226
|
+
create_call(load_flow_from_entrypoint, full_entrypoint)
|
|
1227
|
+
)
|
|
1228
|
+
finally:
|
|
1229
|
+
if ":" not in entrypoint:
|
|
1230
|
+
sys.path.remove(str(storage.destination))
|
|
1220
1231
|
|
|
1221
1232
|
deployment = cls(
|
|
1222
1233
|
name=name,
|
|
@@ -1239,6 +1250,11 @@ class RunnerDeployment(BaseModel):
|
|
|
1239
1250
|
job_variables=job_variables,
|
|
1240
1251
|
)
|
|
1241
1252
|
deployment._sla = _sla
|
|
1253
|
+
deployment._entrypoint_type = (
|
|
1254
|
+
EntrypointType.FILE_PATH
|
|
1255
|
+
if ":" in entrypoint
|
|
1256
|
+
else EntrypointType.MODULE_PATH
|
|
1257
|
+
)
|
|
1242
1258
|
deployment._path = str(storage.destination).replace(
|
|
1243
1259
|
tmpdir, "$STORAGE_BASE_PATH"
|
|
1244
1260
|
)
|
|
@@ -1282,7 +1298,8 @@ class RunnerDeployment(BaseModel):
|
|
|
1282
1298
|
|
|
1283
1299
|
Args:
|
|
1284
1300
|
entrypoint: The path to a file containing a flow and the name of the flow function in
|
|
1285
|
-
the format `./path/to/file.py:flow_func_name
|
|
1301
|
+
the format `./path/to/file.py:flow_func_name`, or a module path to a flow function
|
|
1302
|
+
in the format `module.path.flow_func_name`.
|
|
1286
1303
|
name: A name for the deployment
|
|
1287
1304
|
flow_name: The name of the flow to deploy
|
|
1288
1305
|
storage: A storage object to use for retrieving flow code. If not provided, a
|
|
@@ -1335,8 +1352,17 @@ class RunnerDeployment(BaseModel):
|
|
|
1335
1352
|
storage.set_base_path(Path(tmpdir))
|
|
1336
1353
|
run_coro_as_sync(storage.pull_code())
|
|
1337
1354
|
|
|
1338
|
-
|
|
1339
|
-
|
|
1355
|
+
if ":" in entrypoint:
|
|
1356
|
+
full_entrypoint = str(storage.destination / entrypoint)
|
|
1357
|
+
else:
|
|
1358
|
+
sys.path.insert(0, str(storage.destination))
|
|
1359
|
+
full_entrypoint = entrypoint
|
|
1360
|
+
|
|
1361
|
+
try:
|
|
1362
|
+
flow = load_flow_from_entrypoint(full_entrypoint)
|
|
1363
|
+
finally:
|
|
1364
|
+
if ":" not in entrypoint:
|
|
1365
|
+
sys.path.remove(str(storage.destination))
|
|
1340
1366
|
|
|
1341
1367
|
deployment = cls(
|
|
1342
1368
|
name=name,
|
|
@@ -1359,6 +1385,11 @@ class RunnerDeployment(BaseModel):
|
|
|
1359
1385
|
job_variables=job_variables,
|
|
1360
1386
|
)
|
|
1361
1387
|
deployment._sla = _sla
|
|
1388
|
+
deployment._entrypoint_type = (
|
|
1389
|
+
EntrypointType.FILE_PATH
|
|
1390
|
+
if ":" in entrypoint
|
|
1391
|
+
else EntrypointType.MODULE_PATH
|
|
1392
|
+
)
|
|
1362
1393
|
deployment._path = str(storage.destination).replace(
|
|
1363
1394
|
tmpdir, "$STORAGE_BASE_PATH"
|
|
1364
1395
|
)
|
|
@@ -1448,7 +1479,7 @@ async def adeploy(
|
|
|
1448
1479
|
|
|
1449
1480
|
if image and isinstance(image, str):
|
|
1450
1481
|
image_name, image_tag = parse_image_tag(image)
|
|
1451
|
-
image = DockerImage(name=image_name, tag=image_tag)
|
|
1482
|
+
image = DockerImage(name=image_name, tag=image_tag, stream_progress_to=None)
|
|
1452
1483
|
|
|
1453
1484
|
try:
|
|
1454
1485
|
async with get_client() as client:
|
|
@@ -1687,7 +1718,7 @@ def deploy(
|
|
|
1687
1718
|
|
|
1688
1719
|
if image and isinstance(image, str):
|
|
1689
1720
|
image_name, image_tag = parse_image_tag(image)
|
|
1690
|
-
image = DockerImage(name=image_name, tag=image_tag)
|
|
1721
|
+
image = DockerImage(name=image_name, tag=image_tag, stream_progress_to=None)
|
|
1691
1722
|
|
|
1692
1723
|
try:
|
|
1693
1724
|
with get_client(sync_client=True) as client:
|
{prefect_client-3.6.23.dev2 → prefect_client-3.6.23.dev4}/src/prefect/deployments/steps/utility.py
RENAMED
|
@@ -20,6 +20,7 @@ Example:
|
|
|
20
20
|
```
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
+
import asyncio
|
|
23
24
|
import io
|
|
24
25
|
import os
|
|
25
26
|
import shlex
|
|
@@ -28,6 +29,7 @@ import subprocess
|
|
|
28
29
|
import sys
|
|
29
30
|
from typing import Any, Dict, Optional
|
|
30
31
|
|
|
32
|
+
import anyio
|
|
31
33
|
from anyio import create_task_group
|
|
32
34
|
from anyio.streams.text import TextReceiveStream
|
|
33
35
|
from typing_extensions import TypedDict
|
|
@@ -60,6 +62,41 @@ async def _stream_capture_process_output(
|
|
|
60
62
|
)
|
|
61
63
|
|
|
62
64
|
|
|
65
|
+
async def _read_stream(
|
|
66
|
+
stream: asyncio.StreamReader,
|
|
67
|
+
*sinks: io.IOBase,
|
|
68
|
+
):
|
|
69
|
+
"""Read from an asyncio stream and write to one or more sinks."""
|
|
70
|
+
while True:
|
|
71
|
+
data = await stream.read(4096)
|
|
72
|
+
if not data:
|
|
73
|
+
break
|
|
74
|
+
text = data.decode()
|
|
75
|
+
for sink in sinks:
|
|
76
|
+
sink.write(text)
|
|
77
|
+
if hasattr(sink, "flush"):
|
|
78
|
+
sink.flush()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
async def _stream_capture_shell_process_output(
|
|
82
|
+
process: asyncio.subprocess.Process,
|
|
83
|
+
stdout_sink: io.StringIO,
|
|
84
|
+
stderr_sink: io.StringIO,
|
|
85
|
+
stream_output: bool = True,
|
|
86
|
+
):
|
|
87
|
+
"""Capture output from a shell subprocess (asyncio-based)."""
|
|
88
|
+
stdout_sinks = [stdout_sink, sys.stdout] if stream_output else [stdout_sink]
|
|
89
|
+
stderr_sinks = [stderr_sink, sys.stderr] if stream_output else [stderr_sink]
|
|
90
|
+
|
|
91
|
+
tasks = []
|
|
92
|
+
if process.stdout:
|
|
93
|
+
tasks.append(_read_stream(process.stdout, *stdout_sinks))
|
|
94
|
+
if process.stderr:
|
|
95
|
+
tasks.append(_read_stream(process.stderr, *stderr_sinks))
|
|
96
|
+
|
|
97
|
+
await asyncio.gather(*tasks)
|
|
98
|
+
|
|
99
|
+
|
|
63
100
|
class RunShellScriptResult(TypedDict):
|
|
64
101
|
"""
|
|
65
102
|
The result of a `run_shell_script` step.
|
|
@@ -79,6 +116,7 @@ async def run_shell_script(
|
|
|
79
116
|
env: Optional[Dict[str, str]] = None,
|
|
80
117
|
stream_output: bool = True,
|
|
81
118
|
expand_env_vars: bool = False,
|
|
119
|
+
shell: bool = False,
|
|
82
120
|
) -> RunShellScriptResult:
|
|
83
121
|
"""
|
|
84
122
|
Runs one or more shell commands in a subprocess. Returns the standard
|
|
@@ -93,6 +131,11 @@ async def run_shell_script(
|
|
|
93
131
|
stdout/stderr
|
|
94
132
|
expand_env_vars: Whether to expand environment variables in the script
|
|
95
133
|
before running it
|
|
134
|
+
shell: Whether to run the command through the system shell.
|
|
135
|
+
When True, shell operators like pipes (|), redirects (>),
|
|
136
|
+
and logical operators (&&, ||) are supported. Only set this
|
|
137
|
+
to True when you need shell features, as it has security
|
|
138
|
+
implications similar to subprocess.run(shell=True).
|
|
96
139
|
|
|
97
140
|
Returns:
|
|
98
141
|
A dictionary with the keys `stdout` and `stderr` containing the output
|
|
@@ -158,6 +201,14 @@ async def run_shell_script(
|
|
|
158
201
|
- prefect.deployments.steps.run_shell_script:
|
|
159
202
|
script: "bash path/to/script.sh"
|
|
160
203
|
```
|
|
204
|
+
|
|
205
|
+
Run a command that uses shell operators like pipes:
|
|
206
|
+
```yaml
|
|
207
|
+
push:
|
|
208
|
+
- prefect.deployments.steps.run_shell_script:
|
|
209
|
+
script: echo "hello world" | tr '[:lower:]' '[:upper:]'
|
|
210
|
+
shell: true
|
|
211
|
+
```
|
|
161
212
|
"""
|
|
162
213
|
current_env = os.environ.copy()
|
|
163
214
|
current_env.update(env or {})
|
|
@@ -170,30 +221,53 @@ async def run_shell_script(
|
|
|
170
221
|
if expand_env_vars:
|
|
171
222
|
# Expand environment variables in command and provided environment
|
|
172
223
|
command = string.Template(command).safe_substitute(current_env)
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
224
|
+
|
|
225
|
+
# On Windows, always use shell mode so cmd.exe built-ins
|
|
226
|
+
# (echo, dir, set, type, etc.) work without requiring shell=True.
|
|
227
|
+
use_shell = shell or sys.platform == "win32"
|
|
228
|
+
|
|
229
|
+
if use_shell:
|
|
230
|
+
command = command.strip()
|
|
231
|
+
if not command:
|
|
232
|
+
continue
|
|
233
|
+
process = await asyncio.create_subprocess_shell(
|
|
234
|
+
command,
|
|
235
|
+
stdout=asyncio.subprocess.PIPE,
|
|
236
|
+
stderr=asyncio.subprocess.PIPE,
|
|
237
|
+
cwd=directory,
|
|
238
|
+
env=current_env,
|
|
239
|
+
)
|
|
240
|
+
else:
|
|
241
|
+
split_command = shlex.split(command)
|
|
242
|
+
if not split_command:
|
|
243
|
+
continue
|
|
244
|
+
process = await asyncio.create_subprocess_exec(
|
|
245
|
+
*split_command,
|
|
246
|
+
stdout=asyncio.subprocess.PIPE,
|
|
247
|
+
stderr=asyncio.subprocess.PIPE,
|
|
248
|
+
cwd=directory,
|
|
249
|
+
env=current_env,
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
try:
|
|
253
|
+
await _stream_capture_shell_process_output(
|
|
184
254
|
process,
|
|
185
255
|
stdout_sink=stdout_sink,
|
|
186
256
|
stderr_sink=stderr_sink,
|
|
187
257
|
stream_output=stream_output,
|
|
188
258
|
)
|
|
189
|
-
|
|
190
259
|
await process.wait()
|
|
260
|
+
except BaseException:
|
|
261
|
+
with anyio.CancelScope(shield=True):
|
|
262
|
+
process.kill()
|
|
263
|
+
await process.wait()
|
|
264
|
+
raise
|
|
191
265
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
266
|
+
if process.returncode != 0:
|
|
267
|
+
raise RuntimeError(
|
|
268
|
+
f"`run_shell_script` failed with error code {process.returncode}:"
|
|
269
|
+
f" {stderr_sink.getvalue()}"
|
|
270
|
+
)
|
|
197
271
|
|
|
198
272
|
return {
|
|
199
273
|
"stdout": stdout_sink.getvalue().strip(),
|