prefect-client 2.20.2__py3-none-any.whl → 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. prefect/__init__.py +74 -110
  2. prefect/_internal/compatibility/deprecated.py +6 -115
  3. prefect/_internal/compatibility/experimental.py +4 -79
  4. prefect/_internal/compatibility/migration.py +166 -0
  5. prefect/_internal/concurrency/__init__.py +2 -2
  6. prefect/_internal/concurrency/api.py +1 -35
  7. prefect/_internal/concurrency/calls.py +0 -6
  8. prefect/_internal/concurrency/cancellation.py +0 -3
  9. prefect/_internal/concurrency/event_loop.py +0 -20
  10. prefect/_internal/concurrency/inspection.py +3 -3
  11. prefect/_internal/concurrency/primitives.py +1 -0
  12. prefect/_internal/concurrency/services.py +23 -0
  13. prefect/_internal/concurrency/threads.py +35 -0
  14. prefect/_internal/concurrency/waiters.py +0 -28
  15. prefect/_internal/integrations.py +7 -0
  16. prefect/_internal/pydantic/__init__.py +0 -45
  17. prefect/_internal/pydantic/annotations/pendulum.py +2 -2
  18. prefect/_internal/pydantic/v1_schema.py +21 -22
  19. prefect/_internal/pydantic/v2_schema.py +0 -2
  20. prefect/_internal/pydantic/v2_validated_func.py +18 -23
  21. prefect/_internal/pytz.py +1 -1
  22. prefect/_internal/retries.py +61 -0
  23. prefect/_internal/schemas/bases.py +45 -177
  24. prefect/_internal/schemas/fields.py +1 -43
  25. prefect/_internal/schemas/validators.py +47 -233
  26. prefect/agent.py +3 -695
  27. prefect/artifacts.py +173 -14
  28. prefect/automations.py +39 -4
  29. prefect/blocks/abstract.py +1 -1
  30. prefect/blocks/core.py +423 -164
  31. prefect/blocks/fields.py +2 -57
  32. prefect/blocks/notifications.py +43 -28
  33. prefect/blocks/redis.py +168 -0
  34. prefect/blocks/system.py +67 -20
  35. prefect/blocks/webhook.py +2 -9
  36. prefect/cache_policies.py +239 -0
  37. prefect/client/__init__.py +4 -0
  38. prefect/client/base.py +33 -27
  39. prefect/client/cloud.py +65 -20
  40. prefect/client/collections.py +1 -1
  41. prefect/client/orchestration.py +667 -440
  42. prefect/client/schemas/actions.py +115 -100
  43. prefect/client/schemas/filters.py +46 -52
  44. prefect/client/schemas/objects.py +228 -178
  45. prefect/client/schemas/responses.py +18 -36
  46. prefect/client/schemas/schedules.py +55 -36
  47. prefect/client/schemas/sorting.py +2 -0
  48. prefect/client/subscriptions.py +8 -7
  49. prefect/client/types/flexible_schedule_list.py +11 -0
  50. prefect/client/utilities.py +9 -6
  51. prefect/concurrency/asyncio.py +60 -11
  52. prefect/concurrency/context.py +24 -0
  53. prefect/concurrency/events.py +2 -2
  54. prefect/concurrency/services.py +46 -16
  55. prefect/concurrency/sync.py +51 -7
  56. prefect/concurrency/v1/asyncio.py +143 -0
  57. prefect/concurrency/v1/context.py +27 -0
  58. prefect/concurrency/v1/events.py +61 -0
  59. prefect/concurrency/v1/services.py +116 -0
  60. prefect/concurrency/v1/sync.py +92 -0
  61. prefect/context.py +246 -149
  62. prefect/deployments/__init__.py +33 -18
  63. prefect/deployments/base.py +10 -15
  64. prefect/deployments/deployments.py +2 -1048
  65. prefect/deployments/flow_runs.py +178 -0
  66. prefect/deployments/runner.py +72 -173
  67. prefect/deployments/schedules.py +31 -25
  68. prefect/deployments/steps/__init__.py +0 -1
  69. prefect/deployments/steps/core.py +7 -0
  70. prefect/deployments/steps/pull.py +15 -21
  71. prefect/deployments/steps/utility.py +2 -1
  72. prefect/docker/__init__.py +20 -0
  73. prefect/docker/docker_image.py +82 -0
  74. prefect/engine.py +15 -2466
  75. prefect/events/actions.py +17 -23
  76. prefect/events/cli/automations.py +20 -7
  77. prefect/events/clients.py +142 -80
  78. prefect/events/filters.py +14 -18
  79. prefect/events/related.py +74 -75
  80. prefect/events/schemas/__init__.py +0 -5
  81. prefect/events/schemas/automations.py +55 -46
  82. prefect/events/schemas/deployment_triggers.py +7 -197
  83. prefect/events/schemas/events.py +46 -65
  84. prefect/events/schemas/labelling.py +10 -14
  85. prefect/events/utilities.py +4 -5
  86. prefect/events/worker.py +23 -8
  87. prefect/exceptions.py +15 -0
  88. prefect/filesystems.py +30 -529
  89. prefect/flow_engine.py +827 -0
  90. prefect/flow_runs.py +379 -7
  91. prefect/flows.py +470 -360
  92. prefect/futures.py +382 -331
  93. prefect/infrastructure/__init__.py +5 -26
  94. prefect/infrastructure/base.py +3 -320
  95. prefect/infrastructure/provisioners/__init__.py +5 -3
  96. prefect/infrastructure/provisioners/cloud_run.py +13 -8
  97. prefect/infrastructure/provisioners/container_instance.py +14 -9
  98. prefect/infrastructure/provisioners/ecs.py +10 -8
  99. prefect/infrastructure/provisioners/modal.py +8 -5
  100. prefect/input/__init__.py +4 -0
  101. prefect/input/actions.py +2 -4
  102. prefect/input/run_input.py +9 -9
  103. prefect/logging/formatters.py +2 -4
  104. prefect/logging/handlers.py +9 -14
  105. prefect/logging/loggers.py +5 -5
  106. prefect/main.py +72 -0
  107. prefect/plugins.py +2 -64
  108. prefect/profiles.toml +16 -2
  109. prefect/records/__init__.py +1 -0
  110. prefect/records/base.py +223 -0
  111. prefect/records/filesystem.py +207 -0
  112. prefect/records/memory.py +178 -0
  113. prefect/records/result_store.py +64 -0
  114. prefect/results.py +577 -504
  115. prefect/runner/runner.py +124 -51
  116. prefect/runner/server.py +32 -34
  117. prefect/runner/storage.py +3 -12
  118. prefect/runner/submit.py +2 -10
  119. prefect/runner/utils.py +2 -2
  120. prefect/runtime/__init__.py +1 -0
  121. prefect/runtime/deployment.py +1 -0
  122. prefect/runtime/flow_run.py +40 -5
  123. prefect/runtime/task_run.py +1 -0
  124. prefect/serializers.py +28 -39
  125. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  126. prefect/settings.py +209 -332
  127. prefect/states.py +160 -63
  128. prefect/task_engine.py +1478 -57
  129. prefect/task_runners.py +383 -287
  130. prefect/task_runs.py +240 -0
  131. prefect/task_worker.py +463 -0
  132. prefect/tasks.py +684 -374
  133. prefect/transactions.py +410 -0
  134. prefect/types/__init__.py +72 -86
  135. prefect/types/entrypoint.py +13 -0
  136. prefect/utilities/annotations.py +4 -3
  137. prefect/utilities/asyncutils.py +227 -148
  138. prefect/utilities/callables.py +138 -48
  139. prefect/utilities/collections.py +134 -86
  140. prefect/utilities/dispatch.py +27 -14
  141. prefect/utilities/dockerutils.py +11 -4
  142. prefect/utilities/engine.py +186 -32
  143. prefect/utilities/filesystem.py +4 -5
  144. prefect/utilities/importtools.py +26 -27
  145. prefect/utilities/pydantic.py +128 -38
  146. prefect/utilities/schema_tools/hydration.py +18 -1
  147. prefect/utilities/schema_tools/validation.py +30 -0
  148. prefect/utilities/services.py +35 -9
  149. prefect/utilities/templating.py +12 -2
  150. prefect/utilities/timeout.py +20 -5
  151. prefect/utilities/urls.py +195 -0
  152. prefect/utilities/visualization.py +1 -0
  153. prefect/variables.py +78 -59
  154. prefect/workers/__init__.py +0 -1
  155. prefect/workers/base.py +237 -244
  156. prefect/workers/block.py +5 -226
  157. prefect/workers/cloud.py +6 -0
  158. prefect/workers/process.py +265 -12
  159. prefect/workers/server.py +29 -11
  160. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/METADATA +30 -26
  161. prefect_client-3.0.0.dist-info/RECORD +201 -0
  162. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/WHEEL +1 -1
  163. prefect/_internal/pydantic/_base_model.py +0 -51
  164. prefect/_internal/pydantic/_compat.py +0 -82
  165. prefect/_internal/pydantic/_flags.py +0 -20
  166. prefect/_internal/pydantic/_types.py +0 -8
  167. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  168. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  169. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  170. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  171. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  172. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  173. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  174. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  175. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  176. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  177. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  178. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  179. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  180. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  181. prefect/_vendor/fastapi/__init__.py +0 -25
  182. prefect/_vendor/fastapi/applications.py +0 -946
  183. prefect/_vendor/fastapi/background.py +0 -3
  184. prefect/_vendor/fastapi/concurrency.py +0 -44
  185. prefect/_vendor/fastapi/datastructures.py +0 -58
  186. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  187. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  188. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  189. prefect/_vendor/fastapi/encoders.py +0 -177
  190. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  191. prefect/_vendor/fastapi/exceptions.py +0 -46
  192. prefect/_vendor/fastapi/logger.py +0 -3
  193. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  194. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  195. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  196. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  197. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  198. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  199. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  200. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  201. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  202. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  203. prefect/_vendor/fastapi/openapi/models.py +0 -480
  204. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  205. prefect/_vendor/fastapi/param_functions.py +0 -340
  206. prefect/_vendor/fastapi/params.py +0 -453
  207. prefect/_vendor/fastapi/py.typed +0 -0
  208. prefect/_vendor/fastapi/requests.py +0 -4
  209. prefect/_vendor/fastapi/responses.py +0 -40
  210. prefect/_vendor/fastapi/routing.py +0 -1331
  211. prefect/_vendor/fastapi/security/__init__.py +0 -15
  212. prefect/_vendor/fastapi/security/api_key.py +0 -98
  213. prefect/_vendor/fastapi/security/base.py +0 -6
  214. prefect/_vendor/fastapi/security/http.py +0 -172
  215. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  216. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  217. prefect/_vendor/fastapi/security/utils.py +0 -10
  218. prefect/_vendor/fastapi/staticfiles.py +0 -1
  219. prefect/_vendor/fastapi/templating.py +0 -3
  220. prefect/_vendor/fastapi/testclient.py +0 -1
  221. prefect/_vendor/fastapi/types.py +0 -3
  222. prefect/_vendor/fastapi/utils.py +0 -235
  223. prefect/_vendor/fastapi/websockets.py +0 -7
  224. prefect/_vendor/starlette/__init__.py +0 -1
  225. prefect/_vendor/starlette/_compat.py +0 -28
  226. prefect/_vendor/starlette/_exception_handler.py +0 -80
  227. prefect/_vendor/starlette/_utils.py +0 -88
  228. prefect/_vendor/starlette/applications.py +0 -261
  229. prefect/_vendor/starlette/authentication.py +0 -159
  230. prefect/_vendor/starlette/background.py +0 -43
  231. prefect/_vendor/starlette/concurrency.py +0 -59
  232. prefect/_vendor/starlette/config.py +0 -151
  233. prefect/_vendor/starlette/convertors.py +0 -87
  234. prefect/_vendor/starlette/datastructures.py +0 -707
  235. prefect/_vendor/starlette/endpoints.py +0 -130
  236. prefect/_vendor/starlette/exceptions.py +0 -60
  237. prefect/_vendor/starlette/formparsers.py +0 -276
  238. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  239. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  240. prefect/_vendor/starlette/middleware/base.py +0 -220
  241. prefect/_vendor/starlette/middleware/cors.py +0 -176
  242. prefect/_vendor/starlette/middleware/errors.py +0 -265
  243. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  244. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  245. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  246. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  247. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  248. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  249. prefect/_vendor/starlette/py.typed +0 -0
  250. prefect/_vendor/starlette/requests.py +0 -328
  251. prefect/_vendor/starlette/responses.py +0 -347
  252. prefect/_vendor/starlette/routing.py +0 -933
  253. prefect/_vendor/starlette/schemas.py +0 -154
  254. prefect/_vendor/starlette/staticfiles.py +0 -248
  255. prefect/_vendor/starlette/status.py +0 -199
  256. prefect/_vendor/starlette/templating.py +0 -231
  257. prefect/_vendor/starlette/testclient.py +0 -804
  258. prefect/_vendor/starlette/types.py +0 -30
  259. prefect/_vendor/starlette/websockets.py +0 -193
  260. prefect/blocks/kubernetes.py +0 -119
  261. prefect/deprecated/__init__.py +0 -0
  262. prefect/deprecated/data_documents.py +0 -350
  263. prefect/deprecated/packaging/__init__.py +0 -12
  264. prefect/deprecated/packaging/base.py +0 -96
  265. prefect/deprecated/packaging/docker.py +0 -146
  266. prefect/deprecated/packaging/file.py +0 -92
  267. prefect/deprecated/packaging/orion.py +0 -80
  268. prefect/deprecated/packaging/serializers.py +0 -171
  269. prefect/events/instrument.py +0 -135
  270. prefect/infrastructure/container.py +0 -824
  271. prefect/infrastructure/kubernetes.py +0 -920
  272. prefect/infrastructure/process.py +0 -289
  273. prefect/manifests.py +0 -20
  274. prefect/new_flow_engine.py +0 -449
  275. prefect/new_task_engine.py +0 -423
  276. prefect/pydantic/__init__.py +0 -76
  277. prefect/pydantic/main.py +0 -39
  278. prefect/software/__init__.py +0 -2
  279. prefect/software/base.py +0 -50
  280. prefect/software/conda.py +0 -199
  281. prefect/software/pip.py +0 -122
  282. prefect/software/python.py +0 -52
  283. prefect/task_server.py +0 -322
  284. prefect_client-2.20.2.dist-info/RECORD +0 -294
  285. /prefect/{_internal/pydantic/utilities → client/types}/__init__.py +0 -0
  286. /prefect/{_vendor → concurrency/v1}/__init__.py +0 -0
  287. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
  288. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/top_level.txt +0 -0
prefect/artifacts.py CHANGED
@@ -6,20 +6,27 @@ from __future__ import annotations
6
6
 
7
7
  import json # noqa: I001
8
8
  import math
9
- from typing import Any, Dict, List, Optional, Tuple, Union
9
+ import warnings
10
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
10
11
  from uuid import UUID
11
12
 
12
- from typing_extensions import Self
13
-
14
- from prefect.client.orchestration import PrefectClient
15
13
  from prefect.client.schemas.actions import ArtifactCreate as ArtifactRequest
14
+ from prefect.client.schemas.actions import ArtifactUpdate
16
15
  from prefect.client.schemas.filters import ArtifactFilter, ArtifactFilterKey
17
- from prefect.client.schemas.objects import Artifact as ArtifactResponse
18
16
  from prefect.client.schemas.sorting import ArtifactSort
19
17
  from prefect.client.utilities import get_or_create_client, inject_client
18
+ from prefect.logging.loggers import get_logger
20
19
  from prefect.utilities.asyncutils import sync_compatible
21
20
  from prefect.utilities.context import get_task_and_flow_run_ids
22
21
 
22
+ logger = get_logger("artifacts")
23
+
24
+ if TYPE_CHECKING:
25
+ from typing_extensions import Self
26
+
27
+ from prefect.client.orchestration import PrefectClient
28
+ from prefect.client.schemas.objects import Artifact as ArtifactResponse
29
+
23
30
 
24
31
  class Artifact(ArtifactRequest):
25
32
  """
@@ -36,9 +43,9 @@ class Artifact(ArtifactRequest):
36
43
 
37
44
  @sync_compatible
38
45
  async def create(
39
- self: Self,
40
- client: Optional[PrefectClient] = None,
41
- ) -> ArtifactResponse:
46
+ self: "Self",
47
+ client: Optional["PrefectClient"] = None,
48
+ ) -> "ArtifactResponse":
42
49
  """
43
50
  A method to create an artifact.
44
51
 
@@ -48,8 +55,19 @@ class Artifact(ArtifactRequest):
48
55
  Returns:
49
56
  - The created artifact.
50
57
  """
58
+ from prefect.context import MissingContextError, get_run_context
59
+
51
60
  client, _ = get_or_create_client(client)
52
61
  task_run_id, flow_run_id = get_task_and_flow_run_ids()
62
+
63
+ try:
64
+ get_run_context()
65
+ except MissingContextError:
66
+ warnings.warn(
67
+ "Artifact creation outside of a flow or task run is deprecated and will be removed in a later version.",
68
+ FutureWarning,
69
+ )
70
+
53
71
  return await client.create_artifact(
54
72
  artifact=ArtifactRequest(
55
73
  type=self.type,
@@ -64,8 +82,8 @@ class Artifact(ArtifactRequest):
64
82
  @classmethod
65
83
  @sync_compatible
66
84
  async def get(
67
- cls, key: Optional[str] = None, client: Optional[PrefectClient] = None
68
- ) -> Optional[ArtifactResponse]:
85
+ cls, key: Optional[str] = None, client: Optional["PrefectClient"] = None
86
+ ) -> Optional["ArtifactResponse"]:
69
87
  """
70
88
  A method to get an artifact.
71
89
 
@@ -95,9 +113,9 @@ class Artifact(ArtifactRequest):
95
113
  key: Optional[str] = None,
96
114
  description: Optional[str] = None,
97
115
  data: Optional[Union[Dict[str, Any], Any]] = None,
98
- client: Optional[PrefectClient] = None,
116
+ client: Optional["PrefectClient"] = None,
99
117
  **kwargs: Any,
100
- ) -> Tuple[ArtifactResponse, bool]:
118
+ ) -> Tuple["ArtifactResponse", bool]:
101
119
  """
102
120
  A method to get or create an artifact.
103
121
 
@@ -171,13 +189,54 @@ class TableArtifact(Artifact):
171
189
  return json.dumps(self._sanitize(self.table))
172
190
 
173
191
 
192
+ class ProgressArtifact(Artifact):
193
+ progress: float
194
+ type: Optional[str] = "progress"
195
+
196
+ async def format(self) -> float:
197
+ # Ensure progress is between 0 and 100
198
+ min_progress = 0.0
199
+ max_progress = 100.0
200
+ if self.progress < min_progress or self.progress > max_progress:
201
+ logger.warning(
202
+ f"ProgressArtifact received an invalid value, Progress: {self.progress}%"
203
+ )
204
+ self.progress = max(min_progress, min(self.progress, max_progress))
205
+ logger.warning(f"Interpreting as {self.progress}% progress")
206
+
207
+ return self.progress
208
+
209
+
210
+ class ImageArtifact(Artifact):
211
+ """
212
+ An artifact that will display an image from a publicly accessible URL in the UI.
213
+
214
+ Arguments:
215
+ image_url: The URL of the image to display.
216
+ """
217
+
218
+ image_url: str
219
+ type: Optional[str] = "image"
220
+
221
+ async def format(self) -> str:
222
+ """
223
+ This method is used to format the artifact data so it can be properly sent
224
+ to the API when the .create() method is called. It is async because the
225
+ method is awaited in the parent class.
226
+
227
+ Returns:
228
+ str: The image URL.
229
+ """
230
+ return self.image_url
231
+
232
+
174
233
  @inject_client
175
234
  async def _create_artifact(
176
235
  type: str,
177
236
  key: Optional[str] = None,
178
237
  description: Optional[str] = None,
179
238
  data: Optional[Union[Dict[str, Any], Any]] = None,
180
- client: Optional[PrefectClient] = None,
239
+ client: Optional["PrefectClient"] = None,
181
240
  ) -> UUID:
182
241
  """
183
242
  Helper function to create an artifact.
@@ -210,7 +269,7 @@ async def create_link_artifact(
210
269
  link_text: Optional[str] = None,
211
270
  key: Optional[str] = None,
212
271
  description: Optional[str] = None,
213
- client: Optional[PrefectClient] = None,
272
+ client: Optional["PrefectClient"] = None,
214
273
  ) -> UUID:
215
274
  """
216
275
  Create a link artifact.
@@ -292,3 +351,103 @@ async def create_table_artifact(
292
351
  ).create()
293
352
 
294
353
  return artifact.id
354
+
355
+
356
+ @sync_compatible
357
+ async def create_progress_artifact(
358
+ progress: float,
359
+ key: Optional[str] = None,
360
+ description: Optional[str] = None,
361
+ ) -> UUID:
362
+ """
363
+ Create a progress artifact.
364
+
365
+ Arguments:
366
+ progress: The percentage of progress represented by a float between 0 and 100.
367
+ key: A user-provided string identifier.
368
+ Required for the artifact to show in the Artifacts page in the UI.
369
+ The key must only contain lowercase letters, numbers, and dashes.
370
+ description: A user-specified description of the artifact.
371
+
372
+ Returns:
373
+ The progress artifact ID.
374
+ """
375
+
376
+ artifact = await ProgressArtifact(
377
+ key=key,
378
+ description=description,
379
+ progress=progress,
380
+ ).create()
381
+
382
+ return artifact.id
383
+
384
+
385
+ @sync_compatible
386
+ async def update_progress_artifact(
387
+ artifact_id: UUID,
388
+ progress: float,
389
+ description: Optional[str] = None,
390
+ client: Optional[PrefectClient] = None,
391
+ ) -> UUID:
392
+ """
393
+ Update a progress artifact.
394
+
395
+ Arguments:
396
+ artifact_id: The ID of the artifact to update.
397
+ progress: The percentage of progress represented by a float between 0 and 100.
398
+ description: A user-specified description of the artifact.
399
+
400
+ Returns:
401
+ The progress artifact ID.
402
+ """
403
+
404
+ client, _ = get_or_create_client(client)
405
+
406
+ artifact = ProgressArtifact(
407
+ description=description,
408
+ progress=progress,
409
+ )
410
+ update = (
411
+ ArtifactUpdate(
412
+ description=artifact.description,
413
+ data=await artifact.format(),
414
+ )
415
+ if description
416
+ else ArtifactUpdate(data=await artifact.format())
417
+ )
418
+
419
+ await client.update_artifact(
420
+ artifact_id=artifact_id,
421
+ artifact=update,
422
+ )
423
+
424
+ return artifact_id
425
+
426
+
427
+ @sync_compatible
428
+ async def create_image_artifact(
429
+ image_url: str,
430
+ key: Optional[str] = None,
431
+ description: Optional[str] = None,
432
+ ) -> UUID:
433
+ """
434
+ Create an image artifact.
435
+
436
+ Arguments:
437
+ image_url: The URL of the image to display.
438
+ key: A user-provided string identifier.
439
+ Required for the artifact to show in the Artifacts page in the UI.
440
+ The key must only contain lowercase letters, numbers, and dashes.
441
+ description: A user-specified description of the artifact.
442
+
443
+ Returns:
444
+ The image artifact ID.
445
+ """
446
+
447
+ artifact = await ImageArtifact(
448
+ key=key,
449
+ description=description,
450
+ image_url=image_url,
451
+ ).create()
452
+
453
+ return artifact.id
prefect/automations.py CHANGED
@@ -5,6 +5,24 @@ from pydantic import Field
5
5
  from typing_extensions import Self
6
6
 
7
7
  from prefect.client.utilities import get_or_create_client
8
+ from prefect.events.actions import (
9
+ CallWebhook,
10
+ CancelFlowRun,
11
+ ChangeFlowRunState,
12
+ DeclareIncident,
13
+ DoNothing,
14
+ PauseAutomation,
15
+ PauseDeployment,
16
+ PauseWorkPool,
17
+ PauseWorkQueue,
18
+ ResumeAutomation,
19
+ ResumeDeployment,
20
+ ResumeWorkPool,
21
+ ResumeWorkQueue,
22
+ RunDeployment,
23
+ SendNotification,
24
+ SuspendFlowRun,
25
+ )
8
26
  from prefect.events.schemas.automations import (
9
27
  AutomationCore,
10
28
  CompositeTrigger,
@@ -37,6 +55,23 @@ __all__ = [
37
55
  "SequenceTrigger",
38
56
  "CompoundTrigger",
39
57
  "MetricTriggerQuery",
58
+ # action types
59
+ "DoNothing",
60
+ "RunDeployment",
61
+ "PauseDeployment",
62
+ "ResumeDeployment",
63
+ "CancelFlowRun",
64
+ "ChangeFlowRunState",
65
+ "PauseWorkQueue",
66
+ "ResumeWorkQueue",
67
+ "SendNotification",
68
+ "CallWebhook",
69
+ "PauseAutomation",
70
+ "ResumeAutomation",
71
+ "SuspendFlowRun",
72
+ "PauseWorkPool",
73
+ "ResumeWorkPool",
74
+ "DeclareIncident",
40
75
  ]
41
76
 
42
77
 
@@ -65,7 +100,7 @@ class Automation(AutomationCore):
65
100
  created_automation = auto_to_create.create()
66
101
  """
67
102
  client, _ = get_or_create_client()
68
- automation = AutomationCore(**self.dict(exclude={"id"}))
103
+ automation = AutomationCore(**self.model_dump(exclude={"id"}))
69
104
  self.id = await client.create_automation(automation=automation)
70
105
  return self
71
106
 
@@ -79,7 +114,7 @@ class Automation(AutomationCore):
79
114
  """
80
115
 
81
116
  client, _ = get_or_create_client()
82
- automation = AutomationCore(**self.dict(exclude={"id", "owner_resource"}))
117
+ automation = AutomationCore(**self.model_dump(exclude={"id", "owner_resource"}))
83
118
  await client.update_automation(automation_id=self.id, automation=automation)
84
119
 
85
120
  @classmethod
@@ -106,11 +141,11 @@ class Automation(AutomationCore):
106
141
  except PrefectHTTPStatusError as exc:
107
142
  if exc.response.status_code == 404:
108
143
  raise ValueError(f"Automation with ID {id!r} not found")
109
- return Automation(**automation.dict())
144
+ return Automation(**automation.model_dump())
110
145
  else:
111
146
  automation = await client.read_automations_by_name(name=name)
112
147
  if len(automation) > 0:
113
- return Automation(**automation[0].dict()) if automation else None
148
+ return Automation(**automation[0].model_dump()) if automation else None
114
149
  else:
115
150
  raise ValueError(f"Automation with name {name!r} not found")
116
151
 
@@ -73,7 +73,7 @@ class NotificationBlock(Block, ABC):
73
73
  """
74
74
 
75
75
  _block_schema_capabilities = ["notify"]
76
- _events_excluded_methods = Block._events_excluded_methods + ["notify"]
76
+ _events_excluded_methods = Block._events_excluded_methods.default + ["notify"]
77
77
 
78
78
  @property
79
79
  def logger(self) -> Logger: