flyte 0.2.0b1__py3-none-any.whl โ†’ 2.0.0b46__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 (266) hide show
  1. flyte/__init__.py +83 -30
  2. flyte/_bin/connect.py +61 -0
  3. flyte/_bin/debug.py +38 -0
  4. flyte/_bin/runtime.py +87 -19
  5. flyte/_bin/serve.py +351 -0
  6. flyte/_build.py +3 -2
  7. flyte/_cache/cache.py +6 -5
  8. flyte/_cache/local_cache.py +216 -0
  9. flyte/_code_bundle/_ignore.py +31 -5
  10. flyte/_code_bundle/_packaging.py +42 -11
  11. flyte/_code_bundle/_utils.py +57 -34
  12. flyte/_code_bundle/bundle.py +130 -27
  13. flyte/_constants.py +1 -0
  14. flyte/_context.py +21 -5
  15. flyte/_custom_context.py +73 -0
  16. flyte/_debug/constants.py +37 -0
  17. flyte/_debug/utils.py +17 -0
  18. flyte/_debug/vscode.py +315 -0
  19. flyte/_deploy.py +396 -75
  20. flyte/_deployer.py +109 -0
  21. flyte/_environment.py +94 -11
  22. flyte/_excepthook.py +37 -0
  23. flyte/_group.py +2 -1
  24. flyte/_hash.py +1 -16
  25. flyte/_image.py +544 -231
  26. flyte/_initialize.py +456 -316
  27. flyte/_interface.py +40 -5
  28. flyte/_internal/controllers/__init__.py +22 -8
  29. flyte/_internal/controllers/_local_controller.py +159 -35
  30. flyte/_internal/controllers/_trace.py +18 -10
  31. flyte/_internal/controllers/remote/__init__.py +38 -9
  32. flyte/_internal/controllers/remote/_action.py +82 -12
  33. flyte/_internal/controllers/remote/_client.py +6 -2
  34. flyte/_internal/controllers/remote/_controller.py +290 -64
  35. flyte/_internal/controllers/remote/_core.py +155 -95
  36. flyte/_internal/controllers/remote/_informer.py +40 -20
  37. flyte/_internal/controllers/remote/_service_protocol.py +2 -2
  38. flyte/_internal/imagebuild/__init__.py +2 -10
  39. flyte/_internal/imagebuild/docker_builder.py +391 -84
  40. flyte/_internal/imagebuild/image_builder.py +111 -55
  41. flyte/_internal/imagebuild/remote_builder.py +409 -0
  42. flyte/_internal/imagebuild/utils.py +79 -0
  43. flyte/_internal/resolvers/_app_env_module.py +92 -0
  44. flyte/_internal/resolvers/_task_module.py +5 -38
  45. flyte/_internal/resolvers/app_env.py +26 -0
  46. flyte/_internal/resolvers/common.py +8 -1
  47. flyte/_internal/resolvers/default.py +2 -2
  48. flyte/_internal/runtime/convert.py +319 -36
  49. flyte/_internal/runtime/entrypoints.py +106 -18
  50. flyte/_internal/runtime/io.py +71 -23
  51. flyte/_internal/runtime/resources_serde.py +21 -7
  52. flyte/_internal/runtime/reuse.py +125 -0
  53. flyte/_internal/runtime/rusty.py +196 -0
  54. flyte/_internal/runtime/task_serde.py +239 -66
  55. flyte/_internal/runtime/taskrunner.py +48 -8
  56. flyte/_internal/runtime/trigger_serde.py +162 -0
  57. flyte/_internal/runtime/types_serde.py +7 -16
  58. flyte/_keyring/file.py +115 -0
  59. flyte/_link.py +30 -0
  60. flyte/_logging.py +241 -42
  61. flyte/_map.py +312 -0
  62. flyte/_metrics.py +59 -0
  63. flyte/_module.py +74 -0
  64. flyte/_pod.py +30 -0
  65. flyte/_resources.py +296 -33
  66. flyte/_retry.py +1 -7
  67. flyte/_reusable_environment.py +72 -7
  68. flyte/_run.py +462 -132
  69. flyte/_secret.py +47 -11
  70. flyte/_serve.py +333 -0
  71. flyte/_task.py +245 -56
  72. flyte/_task_environment.py +219 -97
  73. flyte/_task_plugins.py +47 -0
  74. flyte/_tools.py +8 -8
  75. flyte/_trace.py +15 -24
  76. flyte/_trigger.py +1027 -0
  77. flyte/_utils/__init__.py +12 -1
  78. flyte/_utils/asyn.py +3 -1
  79. flyte/_utils/async_cache.py +139 -0
  80. flyte/_utils/coro_management.py +5 -4
  81. flyte/_utils/description_parser.py +19 -0
  82. flyte/_utils/docker_credentials.py +173 -0
  83. flyte/_utils/helpers.py +45 -19
  84. flyte/_utils/module_loader.py +123 -0
  85. flyte/_utils/org_discovery.py +57 -0
  86. flyte/_utils/uv_script_parser.py +8 -1
  87. flyte/_version.py +16 -3
  88. flyte/app/__init__.py +27 -0
  89. flyte/app/_app_environment.py +362 -0
  90. flyte/app/_connector_environment.py +40 -0
  91. flyte/app/_deploy.py +130 -0
  92. flyte/app/_parameter.py +343 -0
  93. flyte/app/_runtime/__init__.py +3 -0
  94. flyte/app/_runtime/app_serde.py +383 -0
  95. flyte/app/_types.py +113 -0
  96. flyte/app/extras/__init__.py +9 -0
  97. flyte/app/extras/_auth_middleware.py +217 -0
  98. flyte/app/extras/_fastapi.py +93 -0
  99. flyte/app/extras/_model_loader/__init__.py +3 -0
  100. flyte/app/extras/_model_loader/config.py +7 -0
  101. flyte/app/extras/_model_loader/loader.py +288 -0
  102. flyte/cli/__init__.py +12 -0
  103. flyte/cli/_abort.py +28 -0
  104. flyte/cli/_build.py +114 -0
  105. flyte/cli/_common.py +493 -0
  106. flyte/cli/_create.py +371 -0
  107. flyte/cli/_delete.py +45 -0
  108. flyte/cli/_deploy.py +401 -0
  109. flyte/cli/_gen.py +316 -0
  110. flyte/cli/_get.py +446 -0
  111. flyte/cli/_option.py +33 -0
  112. flyte/{_cli โ†’ cli}/_params.py +57 -17
  113. flyte/cli/_plugins.py +209 -0
  114. flyte/cli/_prefetch.py +292 -0
  115. flyte/cli/_run.py +690 -0
  116. flyte/cli/_serve.py +338 -0
  117. flyte/cli/_update.py +86 -0
  118. flyte/cli/_user.py +20 -0
  119. flyte/cli/main.py +246 -0
  120. flyte/config/__init__.py +2 -167
  121. flyte/config/_config.py +215 -163
  122. flyte/config/_internal.py +10 -1
  123. flyte/config/_reader.py +225 -0
  124. flyte/connectors/__init__.py +11 -0
  125. flyte/connectors/_connector.py +330 -0
  126. flyte/connectors/_server.py +194 -0
  127. flyte/connectors/utils.py +159 -0
  128. flyte/errors.py +134 -2
  129. flyte/extend.py +24 -0
  130. flyte/extras/_container.py +69 -56
  131. flyte/git/__init__.py +3 -0
  132. flyte/git/_config.py +279 -0
  133. flyte/io/__init__.py +8 -1
  134. flyte/io/{structured_dataset โ†’ _dataframe}/__init__.py +32 -30
  135. flyte/io/{structured_dataset โ†’ _dataframe}/basic_dfs.py +75 -68
  136. flyte/io/{structured_dataset/structured_dataset.py โ†’ _dataframe/dataframe.py} +207 -242
  137. flyte/io/_dir.py +575 -113
  138. flyte/io/_file.py +587 -141
  139. flyte/io/_hashing_io.py +342 -0
  140. flyte/io/extend.py +7 -0
  141. flyte/models.py +635 -0
  142. flyte/prefetch/__init__.py +22 -0
  143. flyte/prefetch/_hf_model.py +563 -0
  144. flyte/remote/__init__.py +14 -3
  145. flyte/remote/_action.py +879 -0
  146. flyte/remote/_app.py +346 -0
  147. flyte/remote/_auth_metadata.py +42 -0
  148. flyte/remote/_client/_protocols.py +62 -4
  149. flyte/remote/_client/auth/_auth_utils.py +19 -0
  150. flyte/remote/_client/auth/_authenticators/base.py +8 -2
  151. flyte/remote/_client/auth/_authenticators/device_code.py +4 -5
  152. flyte/remote/_client/auth/_authenticators/factory.py +4 -0
  153. flyte/remote/_client/auth/_authenticators/passthrough.py +79 -0
  154. flyte/remote/_client/auth/_authenticators/pkce.py +17 -18
  155. flyte/remote/_client/auth/_channel.py +47 -18
  156. flyte/remote/_client/auth/_client_config.py +5 -3
  157. flyte/remote/_client/auth/_keyring.py +15 -2
  158. flyte/remote/_client/auth/_token_client.py +3 -3
  159. flyte/remote/_client/controlplane.py +206 -18
  160. flyte/remote/_common.py +66 -0
  161. flyte/remote/_data.py +107 -22
  162. flyte/remote/_logs.py +116 -33
  163. flyte/remote/_project.py +21 -19
  164. flyte/remote/_run.py +164 -631
  165. flyte/remote/_secret.py +72 -29
  166. flyte/remote/_task.py +387 -46
  167. flyte/remote/_trigger.py +368 -0
  168. flyte/remote/_user.py +43 -0
  169. flyte/report/_report.py +10 -6
  170. flyte/storage/__init__.py +13 -1
  171. flyte/storage/_config.py +237 -0
  172. flyte/storage/_parallel_reader.py +289 -0
  173. flyte/storage/_storage.py +268 -59
  174. flyte/syncify/__init__.py +56 -0
  175. flyte/syncify/_api.py +414 -0
  176. flyte/types/__init__.py +39 -0
  177. flyte/types/_interface.py +22 -7
  178. flyte/{io/pickle/transformer.py โ†’ types/_pickle.py} +37 -9
  179. flyte/types/_string_literals.py +8 -9
  180. flyte/types/_type_engine.py +226 -126
  181. flyte/types/_utils.py +1 -1
  182. flyte-2.0.0b46.data/scripts/debug.py +38 -0
  183. flyte-2.0.0b46.data/scripts/runtime.py +194 -0
  184. flyte-2.0.0b46.dist-info/METADATA +352 -0
  185. flyte-2.0.0b46.dist-info/RECORD +221 -0
  186. flyte-2.0.0b46.dist-info/entry_points.txt +8 -0
  187. flyte-2.0.0b46.dist-info/licenses/LICENSE +201 -0
  188. flyte/_api_commons.py +0 -3
  189. flyte/_cli/_common.py +0 -299
  190. flyte/_cli/_create.py +0 -42
  191. flyte/_cli/_delete.py +0 -23
  192. flyte/_cli/_deploy.py +0 -140
  193. flyte/_cli/_get.py +0 -235
  194. flyte/_cli/_run.py +0 -174
  195. flyte/_cli/main.py +0 -98
  196. flyte/_datastructures.py +0 -342
  197. flyte/_internal/controllers/pbhash.py +0 -39
  198. flyte/_protos/common/authorization_pb2.py +0 -66
  199. flyte/_protos/common/authorization_pb2.pyi +0 -108
  200. flyte/_protos/common/authorization_pb2_grpc.py +0 -4
  201. flyte/_protos/common/identifier_pb2.py +0 -71
  202. flyte/_protos/common/identifier_pb2.pyi +0 -82
  203. flyte/_protos/common/identifier_pb2_grpc.py +0 -4
  204. flyte/_protos/common/identity_pb2.py +0 -48
  205. flyte/_protos/common/identity_pb2.pyi +0 -72
  206. flyte/_protos/common/identity_pb2_grpc.py +0 -4
  207. flyte/_protos/common/list_pb2.py +0 -36
  208. flyte/_protos/common/list_pb2.pyi +0 -69
  209. flyte/_protos/common/list_pb2_grpc.py +0 -4
  210. flyte/_protos/common/policy_pb2.py +0 -37
  211. flyte/_protos/common/policy_pb2.pyi +0 -27
  212. flyte/_protos/common/policy_pb2_grpc.py +0 -4
  213. flyte/_protos/common/role_pb2.py +0 -37
  214. flyte/_protos/common/role_pb2.pyi +0 -53
  215. flyte/_protos/common/role_pb2_grpc.py +0 -4
  216. flyte/_protos/common/runtime_version_pb2.py +0 -28
  217. flyte/_protos/common/runtime_version_pb2.pyi +0 -24
  218. flyte/_protos/common/runtime_version_pb2_grpc.py +0 -4
  219. flyte/_protos/logs/dataplane/payload_pb2.py +0 -96
  220. flyte/_protos/logs/dataplane/payload_pb2.pyi +0 -168
  221. flyte/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
  222. flyte/_protos/secret/definition_pb2.py +0 -49
  223. flyte/_protos/secret/definition_pb2.pyi +0 -93
  224. flyte/_protos/secret/definition_pb2_grpc.py +0 -4
  225. flyte/_protos/secret/payload_pb2.py +0 -62
  226. flyte/_protos/secret/payload_pb2.pyi +0 -94
  227. flyte/_protos/secret/payload_pb2_grpc.py +0 -4
  228. flyte/_protos/secret/secret_pb2.py +0 -38
  229. flyte/_protos/secret/secret_pb2.pyi +0 -6
  230. flyte/_protos/secret/secret_pb2_grpc.py +0 -198
  231. flyte/_protos/secret/secret_pb2_grpc_grpc.py +0 -198
  232. flyte/_protos/validate/validate/validate_pb2.py +0 -76
  233. flyte/_protos/workflow/node_execution_service_pb2.py +0 -26
  234. flyte/_protos/workflow/node_execution_service_pb2.pyi +0 -4
  235. flyte/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
  236. flyte/_protos/workflow/queue_service_pb2.py +0 -106
  237. flyte/_protos/workflow/queue_service_pb2.pyi +0 -141
  238. flyte/_protos/workflow/queue_service_pb2_grpc.py +0 -172
  239. flyte/_protos/workflow/run_definition_pb2.py +0 -128
  240. flyte/_protos/workflow/run_definition_pb2.pyi +0 -310
  241. flyte/_protos/workflow/run_definition_pb2_grpc.py +0 -4
  242. flyte/_protos/workflow/run_logs_service_pb2.py +0 -41
  243. flyte/_protos/workflow/run_logs_service_pb2.pyi +0 -28
  244. flyte/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
  245. flyte/_protos/workflow/run_service_pb2.py +0 -133
  246. flyte/_protos/workflow/run_service_pb2.pyi +0 -175
  247. flyte/_protos/workflow/run_service_pb2_grpc.py +0 -412
  248. flyte/_protos/workflow/state_service_pb2.py +0 -58
  249. flyte/_protos/workflow/state_service_pb2.pyi +0 -71
  250. flyte/_protos/workflow/state_service_pb2_grpc.py +0 -138
  251. flyte/_protos/workflow/task_definition_pb2.py +0 -72
  252. flyte/_protos/workflow/task_definition_pb2.pyi +0 -65
  253. flyte/_protos/workflow/task_definition_pb2_grpc.py +0 -4
  254. flyte/_protos/workflow/task_service_pb2.py +0 -44
  255. flyte/_protos/workflow/task_service_pb2.pyi +0 -31
  256. flyte/_protos/workflow/task_service_pb2_grpc.py +0 -104
  257. flyte/io/_dataframe.py +0 -0
  258. flyte/io/pickle/__init__.py +0 -0
  259. flyte/remote/_console.py +0 -18
  260. flyte-0.2.0b1.dist-info/METADATA +0 -179
  261. flyte-0.2.0b1.dist-info/RECORD +0 -204
  262. flyte-0.2.0b1.dist-info/entry_points.txt +0 -3
  263. /flyte/{_cli โ†’ _debug}/__init__.py +0 -0
  264. /flyte/{_protos โ†’ _keyring}/__init__.py +0 -0
  265. {flyte-0.2.0b1.dist-info โ†’ flyte-2.0.0b46.dist-info}/WHEEL +0 -0
  266. {flyte-0.2.0b1.dist-info โ†’ flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,194 @@
1
+ """
2
+ Flyte runtime module, this is the entrypoint script for the Flyte runtime.
3
+
4
+ Caution: Startup time for this module is very important, as it is the entrypoint for the Flyte runtime.
5
+ Refrain from importing any modules here. If you need to import any modules, do it inside the main function.
6
+ """
7
+
8
+ import asyncio
9
+ import os
10
+ import sys
11
+ from typing import List
12
+
13
+ import click
14
+
15
+ from flyte.models import PathRewrite
16
+
17
+ ACTION_NAME = "ACTION_NAME"
18
+ RUN_NAME = "RUN_NAME"
19
+ PROJECT_NAME = "FLYTE_INTERNAL_EXECUTION_PROJECT"
20
+ DOMAIN_NAME = "FLYTE_INTERNAL_EXECUTION_DOMAIN"
21
+ ORG_NAME = "_U_ORG_NAME"
22
+ ENDPOINT_OVERRIDE = "_U_EP_OVERRIDE"
23
+ INSECURE_SKIP_VERIFY_OVERRIDE = "_U_INSECURE_SKIP_VERIFY"
24
+ RUN_OUTPUT_BASE_DIR = "_U_RUN_BASE"
25
+ FLYTE_ENABLE_VSCODE_KEY = "_F_E_VS"
26
+
27
+ _UNION_EAGER_API_KEY_ENV_VAR = "_UNION_EAGER_API_KEY"
28
+ _F_PATH_REWRITE = "_F_PATH_REWRITE"
29
+
30
+
31
+ @click.group()
32
+ def _pass_through():
33
+ pass
34
+
35
+
36
+ @_pass_through.command("a0")
37
+ @click.option("--inputs", "-i", required=True)
38
+ @click.option("--outputs-path", "-o", required=True)
39
+ @click.option("--version", "-v", required=True)
40
+ @click.option("--run-base-dir", envvar=RUN_OUTPUT_BASE_DIR, required=True)
41
+ @click.option("--raw-data-path", "-r", required=False)
42
+ @click.option("--checkpoint-path", "-c", required=False)
43
+ @click.option("--prev-checkpoint", "-p", required=False)
44
+ @click.option("--name", envvar=ACTION_NAME, required=False)
45
+ @click.option("--run-name", envvar=RUN_NAME, required=False)
46
+ @click.option("--project", envvar=PROJECT_NAME, required=False)
47
+ @click.option("--domain", envvar=DOMAIN_NAME, required=False)
48
+ @click.option("--org", envvar=ORG_NAME, required=False)
49
+ @click.option("--debug", envvar=FLYTE_ENABLE_VSCODE_KEY, type=click.BOOL, required=False)
50
+ @click.option("--interactive-mode", type=click.BOOL, required=False)
51
+ @click.option("--image-cache", required=False)
52
+ @click.option("--tgz", required=False)
53
+ @click.option("--pkl", required=False)
54
+ @click.option("--dest", required=False)
55
+ @click.option("--resolver", required=False)
56
+ @click.argument(
57
+ "resolver-args",
58
+ type=click.UNPROCESSED,
59
+ nargs=-1,
60
+ )
61
+ @click.pass_context
62
+ def main(
63
+ ctx: click.Context,
64
+ run_name: str,
65
+ name: str,
66
+ project: str,
67
+ domain: str,
68
+ org: str,
69
+ debug: bool,
70
+ interactive_mode: bool,
71
+ image_cache: str,
72
+ version: str,
73
+ inputs: str,
74
+ run_base_dir: str,
75
+ outputs_path: str,
76
+ raw_data_path: str,
77
+ checkpoint_path: str,
78
+ prev_checkpoint: str,
79
+ tgz: str,
80
+ pkl: str,
81
+ dest: str,
82
+ resolver: str,
83
+ resolver_args: List[str],
84
+ ):
85
+ sys.path.insert(0, ".")
86
+
87
+ import faulthandler
88
+ import signal
89
+
90
+ import flyte
91
+ import flyte._utils as utils
92
+ import flyte.errors
93
+ import flyte.storage as storage
94
+ from flyte._initialize import init_in_cluster
95
+ from flyte._internal.controllers import create_controller
96
+ from flyte._internal.imagebuild.image_builder import ImageCache
97
+ from flyte._internal.runtime.entrypoints import load_and_run_task
98
+ from flyte._logging import logger
99
+ from flyte.models import ActionID, Checkpoints, CodeBundle, RawDataPath
100
+
101
+ logger.info("Registering faulthandler for SIGUSR1")
102
+ faulthandler.register(signal.SIGUSR1)
103
+
104
+ logger.info(f"Initializing flyte runtime - version {flyte.__version__}")
105
+ assert org, "Org is required for now"
106
+ assert project, "Project is required"
107
+ assert domain, "Domain is required"
108
+ assert run_name, f"Run name is required {run_name}"
109
+ assert name, f"Action name is required {name}"
110
+
111
+ if run_name.startswith("{{"):
112
+ run_name = os.getenv("RUN_NAME", "")
113
+ if name.startswith("{{"):
114
+ name = os.getenv("ACTION_NAME", "")
115
+
116
+ logger.warning(f"Flyte runtime started for action {name} with run name {run_name}")
117
+
118
+ if debug and name == "a0":
119
+ from flyte._debug.vscode import _start_vscode_server
120
+
121
+ asyncio.run(_start_vscode_server(ctx))
122
+
123
+ bundle = None
124
+ if tgz or pkl:
125
+ bundle = CodeBundle(tgz=tgz, pkl=pkl, destination=dest, computed_version=version)
126
+
127
+ controller_kwargs = init_in_cluster(org=org, project=project, domain=domain)
128
+ # Controller is created with the same kwargs as init, so that it can be used to run tasks
129
+ controller = create_controller(ct="remote", **controller_kwargs)
130
+
131
+ ic = ImageCache.from_transport(image_cache) if image_cache else None
132
+
133
+ path_rewrite_cfg = os.getenv(_F_PATH_REWRITE, None)
134
+ path_rewrite = None
135
+ if path_rewrite_cfg:
136
+ potential_path_rewrite = PathRewrite.from_str(path_rewrite_cfg)
137
+ if storage.exists_sync(potential_path_rewrite.new_prefix):
138
+ path_rewrite = potential_path_rewrite
139
+ logger.info(f"Path rewrite configured for {path_rewrite.new_prefix}")
140
+ else:
141
+ logger.error(
142
+ f"Path rewrite failed for path {potential_path_rewrite.new_prefix}, "
143
+ f"not found, reverting to original path {potential_path_rewrite.old_prefix}"
144
+ )
145
+
146
+ # Create a coroutine to load the task and run it
147
+ task_coroutine = load_and_run_task(
148
+ resolver=resolver,
149
+ resolver_args=resolver_args,
150
+ action=ActionID(name=name, run_name=run_name, project=project, domain=domain, org=org),
151
+ raw_data_path=RawDataPath(path=raw_data_path, path_rewrite=path_rewrite),
152
+ checkpoints=Checkpoints(checkpoint_path, prev_checkpoint),
153
+ code_bundle=bundle,
154
+ input_path=inputs,
155
+ output_path=outputs_path,
156
+ run_base_dir=run_base_dir,
157
+ version=version,
158
+ controller=controller,
159
+ image_cache=ic,
160
+ interactive_mode=interactive_mode or debug,
161
+ )
162
+ # Create a coroutine to watch for errors
163
+ controller_failure = controller.watch_for_errors()
164
+
165
+ # Run both coroutines concurrently and wait for first to finish and cancel the other
166
+ async def _run_and_stop():
167
+ loop = asyncio.get_event_loop()
168
+ loop.set_exception_handler(flyte.errors.silence_grpc_polling_error)
169
+ try:
170
+ await utils.run_coros(controller_failure, task_coroutine)
171
+ await controller.stop()
172
+ except flyte.errors.RuntimeSystemError as e:
173
+ logger.error(f"Runtime system error: {e}")
174
+ from flyte._internal.runtime.convert import convert_from_native_to_error
175
+ from flyte._internal.runtime.io import upload_error
176
+
177
+ logger.error(f"Flyte runtime failed for action {name} with run name {run_name}, error: {e}")
178
+ err = convert_from_native_to_error(e)
179
+ path = await upload_error(err.err, outputs_path)
180
+ logger.error(f"Run {run_name} Action {name} failed with error: {err}. Uploaded error to {path}")
181
+ await controller.stop()
182
+
183
+ asyncio.run(_run_and_stop())
184
+ logger.warning(f"Flyte runtime completed for action {name} with run name {run_name}")
185
+ for h in logger.handlers:
186
+ h.flush()
187
+ sys.stdout.flush()
188
+ # We os._exit here to ensure that grpc does not block the exiting! grpc currently has a graceful shutdown system
189
+ # that blocks the process from exiting
190
+ os._exit(0)
191
+
192
+
193
+ if __name__ == "__main__":
194
+ _pass_through()
@@ -0,0 +1,352 @@
1
+ Metadata-Version: 2.4
2
+ Name: flyte
3
+ Version: 2.0.0b46
4
+ Summary: Add your description here
5
+ Author-email: Ketan Umare <kumare3@users.noreply.github.com>
6
+ Requires-Python: >=3.10
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: aiofiles>=24.1.0
10
+ Requires-Dist: click>=8.2.1
11
+ Requires-Dist: flyteidl<2.0.0,>=1.15.4b0
12
+ Requires-Dist: cloudpickle>=3.1.1
13
+ Requires-Dist: docstring_parser>=0.16
14
+ Requires-Dist: fsspec>=2025.3.0
15
+ Requires-Dist: grpcio>=1.71.0
16
+ Requires-Dist: obstore>=0.7.3
17
+ Requires-Dist: protobuf>=6.30.1
18
+ Requires-Dist: pydantic>=2.10.6
19
+ Requires-Dist: pyyaml>=6.0.2
20
+ Requires-Dist: rich-click==1.8.9
21
+ Requires-Dist: httpx<1.0.0,>=0.28.1
22
+ Requires-Dist: keyring>=25.6.0
23
+ Requires-Dist: msgpack>=1.1.0
24
+ Requires-Dist: toml>=0.10.2
25
+ Requires-Dist: async-lru>=2.0.5
26
+ Requires-Dist: mashumaro
27
+ Requires-Dist: aiolimiter>=1.2.1
28
+ Requires-Dist: flyteidl2==2.0.0
29
+ Requires-Dist: packaging
30
+ Provides-Extra: aiosqlite
31
+ Requires-Dist: aiosqlite>=0.21.0; extra == "aiosqlite"
32
+ Provides-Extra: connector
33
+ Requires-Dist: grpcio-health-checking; extra == "connector"
34
+ Requires-Dist: httpx; extra == "connector"
35
+ Requires-Dist: prometheus-client; extra == "connector"
36
+ Dynamic: license-file
37
+
38
+ # Flyte 2 SDK ๐Ÿš€
39
+
40
+ **Type-safe, distributed orchestration of agents, ML pipelines, and more โ€” in pure Python with async/await or sync!**
41
+
42
+ [![Version](https://img.shields.io/pypi/v/flyte?label=version&color=blue)](https://pypi.org/project/flyte/)
43
+ [![Python](https://img.shields.io/pypi/pyversions/flyte?color=brightgreen)](https://pypi.org/project/flyte/)
44
+ [![License](https://img.shields.io/badge/license-Apache%202.0-orange)](LICENSE)
45
+
46
+ > โšก **Pure Python workflows** โ€ข ๐Ÿ”„ **Async-first parallelism** โ€ข ๐Ÿ› ๏ธ **Zero DSL constraints** โ€ข ๐Ÿ“Š **Sub-task observability**
47
+
48
+ ## ๐ŸŒ Ecosystem & Resources
49
+
50
+ - **๐Ÿ“– Documentation**: [Docs Link](https://www.union.ai/docs/v2/flyte/user-guide/)
51
+ - **โ–ถ๏ธ Getting Started**: [Docs Link](https://www.union.ai/docs/v2/flyte/user-guide/getting-started/)
52
+ - **๐Ÿ’ฌ Community**: [Slack](https://slack.flyte.org/) | [GitHub Discussions](https://github.com/flyteorg/flyte/discussions)
53
+ - **๐ŸŽ“ Examples**: [GitHub Examples](https://github.com/flyteorg/flyte-sdk/tree/main/examples)
54
+ - **๐Ÿ› Issues**: [Bug Reports](https://github.com/flyteorg/flyte/issues)
55
+
56
+ ## What is Flyte 2?
57
+
58
+ Flyte 2 represents a fundamental shift from constrained domain-specific languages to **pure Python workflows**. Write data pipelines, ML training jobs, and distributed compute exactly like you write Pythonโ€”because it *is* Python.
59
+
60
+ ```python
61
+ import flyte
62
+
63
+ env = flyte.TaskEnvironment("hello_world")
64
+
65
+ @env.task
66
+ async def process_data(data: list[str]) -> list[str]:
67
+ # Use any Python construct: loops, conditionals, try/except
68
+ results = []
69
+ for item in data:
70
+ if len(item) > 5:
71
+ results.append(await transform_item(item))
72
+ return results
73
+
74
+ @env.task
75
+ async def transform_item(item: str) -> str:
76
+ return f"processed: {item.upper()}"
77
+
78
+ if __name__ == "__main__":
79
+ flyte.init()
80
+ result = flyte.run(process_data, data=["hello", "world", "flyte"])
81
+ ```
82
+
83
+ ## ๐ŸŒŸ Why Flyte 2?
84
+
85
+ | Feature Highlight | Flyte 1 | Flyte 2 |
86
+ |-| ------- | ------- |
87
+ | **No More Workflow DSL** | โŒ `@workflow` decorators with Python subset limitations | โœ… **Pure Python**: loops, conditionals, error handling, dynamic structures |
88
+ | **Async-First Parallelism** | โŒ Custom `map()` functions and workflow-specific parallel constructs | โœ… **Native `asyncio`**: `await asyncio.gather()` for distributed parallel execution |
89
+ | **Fine-Grained Observability** | โŒ Task-level logging only | โœ… **Function-level tracing** with `@flyte.trace` for sub-task checkpoints |
90
+
91
+ ## ๐Ÿš€ Quick Start
92
+
93
+ ### Installation
94
+
95
+ ```bash
96
+ # Install uv package manager
97
+ curl -LsSf https://astral.sh/uv/install.sh | sh
98
+
99
+ # Create virtual environment
100
+ uv venv && source .venv/bin/activate
101
+
102
+ # Install Flyte 2 (beta)
103
+ uv pip install --prerelease=allow flyte
104
+ ```
105
+
106
+ ### Your First Workflow
107
+
108
+ ```python
109
+ # hello.py
110
+ # /// script
111
+ # requires-python = ">=3.10"
112
+ # dependencies = ["flyte>=2.0.0b0"]
113
+ # ///
114
+
115
+ import flyte
116
+
117
+ env = flyte.TaskEnvironment(
118
+ name="hello_world",
119
+ resources=flyte.Resources(memory="250Mi")
120
+ )
121
+
122
+ @env.task
123
+ def calculate(x: int) -> int:
124
+ return x * 2 + 5
125
+
126
+ @env.task
127
+ async def main(numbers: list[int]) -> float:
128
+ # Parallel execution across distributed containers
129
+ results = await asyncio.gather(*[
130
+ calculate.aio(num) for num in numbers
131
+ ])
132
+ return sum(results) / len(results)
133
+
134
+ if __name__ == "__main__":
135
+ flyte.init_from_config("config.yaml")
136
+ run = flyte.run(main, numbers=list(range(10)))
137
+ print(f"Result: {run.result}")
138
+ print(f"View at: {run.url}")
139
+ ```
140
+
141
+ ```bash
142
+ # Run locally, execute remotely
143
+ uv run --prerelease=allow hello.py
144
+ ```
145
+
146
+ ## ๐Ÿ—๏ธ Core Concepts
147
+
148
+ ### **TaskEnvironments**: Container Configuration Made Simple
149
+
150
+ ```python
151
+ # Group tasks with shared configuration
152
+ env = flyte.TaskEnvironment(
153
+ name="ml_pipeline",
154
+ image=flyte.Image.from_debian_base().with_pip_packages(
155
+ "torch", "pandas", "scikit-learn"
156
+ ),
157
+ resources=flyte.Resources(cpu=4, memory="8Gi", gpu=1),
158
+ reusable=flyte.ReusePolicy(replicas=3, idle_ttl=300)
159
+ )
160
+
161
+ @env.task
162
+ def train_model(data: flyte.io.File) -> flyte.io.File:
163
+ # Runs in configured container with GPU access
164
+ pass
165
+
166
+ @env.task
167
+ def evaluate_model(model: flyte.io.File, test_data: flyte.io.File) -> dict:
168
+ # Same container configuration, different instance
169
+ pass
170
+ ```
171
+
172
+ ### **Pure Python Workflows**: No More DSL Constraints
173
+
174
+ ```python
175
+ @env.task
176
+ async def dynamic_pipeline(config: dict) -> list[str]:
177
+ results = []
178
+
179
+ # โœ… Use any Python construct
180
+ for dataset in config["datasets"]:
181
+ try:
182
+ # โœ… Native error handling
183
+ if dataset["type"] == "batch":
184
+ result = await process_batch(dataset)
185
+ else:
186
+ result = await process_stream(dataset)
187
+ results.append(result)
188
+ except ValidationError as e:
189
+ # โœ… Custom error recovery
190
+ result = await handle_error(dataset, e)
191
+ results.append(result)
192
+
193
+ return results
194
+ ```
195
+
196
+ ### **Async Parallelism**: Distributed by Default
197
+
198
+ ```python
199
+ @env.task
200
+ async def parallel_training(hyperparams: list[dict]) -> dict:
201
+ # Each model trains on separate infrastructure
202
+ models = await asyncio.gather(*[
203
+ train_model.aio(params) for params in hyperparams
204
+ ])
205
+
206
+ # Evaluate all models in parallel
207
+ evaluations = await asyncio.gather(*[
208
+ evaluate_model.aio(model) for model in models
209
+ ])
210
+
211
+ # Find best model
212
+ best_idx = max(range(len(evaluations)),
213
+ key=lambda i: evaluations[i]["accuracy"])
214
+ return {"best_model": models[best_idx], "accuracy": evaluations[best_idx]}
215
+ ```
216
+
217
+ ## ๐ŸŽฏ Advanced Features
218
+
219
+ ### **Sub-Task Observability with Tracing**
220
+
221
+ ```python
222
+ @flyte.trace
223
+ async def expensive_computation(data: str) -> str:
224
+ # Function-level checkpointing - recoverable on failure
225
+ result = await call_external_api(data)
226
+ return process_result(result)
227
+
228
+ @env.task(cache=flyte.Cache(behavior="auto"))
229
+ async def main_task(inputs: list[str]) -> list[str]:
230
+ results = []
231
+ for inp in inputs:
232
+ # If task fails here, it resumes from the last successful trace
233
+ result = await expensive_computation(inp)
234
+ results.append(result)
235
+ return results
236
+ ```
237
+
238
+ ### **Remote Task Execution**
239
+
240
+ ```python
241
+ import flyte.remote
242
+
243
+ # Remote tasks deployed elsewhere
244
+ torch_task = flyte.remote.Task.get("torch_env.train_model", auto_version="latest")
245
+ spark_task = flyte.remote.Task.get("spark_env.process_data", auto_version="latest")
246
+
247
+ @env.task
248
+ async def orchestrator(raw_data: flyte.io.File) -> flyte.io.File:
249
+ # Execute Spark job on big data cluster
250
+ processed = await spark_task(raw_data)
251
+
252
+ # Execute PyTorch training on GPU cluster
253
+ model = await torch_task(processed)
254
+
255
+ return model
256
+ ```
257
+
258
+ ## ๐Ÿ“Š Native Jupyter Integration
259
+
260
+ Run and monitor workflows directly from notebooks:
261
+
262
+ ```python
263
+ # In Jupyter cell
264
+ import flyte
265
+
266
+ flyte.init_from_config()
267
+ run = flyte.run(my_workflow, data=large_dataset)
268
+
269
+ # Stream logs in real-time
270
+ run.logs.stream()
271
+
272
+ # Get outputs when complete
273
+ results = run.wait()
274
+ ```
275
+
276
+ ## ๐Ÿ”ง Configuration & Deployment
277
+
278
+ ### Configuration File
279
+
280
+ ```yaml
281
+ # config.yaml
282
+ endpoint: https://my-flyte-instance.com
283
+ project: ml-team
284
+ domain: production
285
+ image:
286
+ builder: local
287
+ registry: ghcr.io/my-org
288
+ auth:
289
+ type: oauth2
290
+ ```
291
+
292
+ ### Deploy and Run
293
+
294
+ ```bash
295
+ # Deploy tasks to remote cluster
296
+ flyte deploy my_workflow.py
297
+
298
+ # Run deployed workflow
299
+ flyte run my_workflow --input-file params.json
300
+
301
+ # Monitor execution
302
+ flyte logs <execution-id>
303
+ ```
304
+
305
+ ## Migration from Flyte 1
306
+
307
+ | Flyte 1 | Flyte 2 |
308
+ |---------|---------|
309
+ | `@workflow` + `@task` | `@env.task` only |
310
+ | `flytekit.map()` | `await asyncio.gather()` |
311
+ | `@dynamic` workflows | Regular `@env.task` with loops |
312
+ | `flytekit.conditional()` | Python `if/else` |
313
+ | `LaunchPlan` schedules | `@env.task(on_schedule=...)` |
314
+ | Workflow failure handlers | Python `try/except` |
315
+
316
+ ## ๐Ÿค Contributing
317
+
318
+ We welcome contributions! Whether it's:
319
+
320
+ - ๐Ÿ› **Bug fixes**
321
+ - โœจ **New features**
322
+ - ๐Ÿ“š **Documentation improvements**
323
+ - ๐Ÿงช **Testing enhancements**
324
+
325
+ ### Setup & Iteration Cycle
326
+ To get started, make sure you start from a new virtual environment and install this package in editable mode with any of the supported Python versions, from 3.10 to 3.13.
327
+
328
+ ```bash
329
+ uv venv --python 3.13
330
+ uv pip install -e .
331
+ ```
332
+
333
+ Besides from picking up local code changes, installing the package in editable mode
334
+ also changes the definition of the default `Image()` object to use a locally
335
+ build wheel. You will need to build said wheel by yourself though, with the `make dist` target.
336
+
337
+ ```bash
338
+ make dist
339
+ python maint_tools/build_default_image.py
340
+ ```
341
+ You'll need to have a local docker daemon running for this. The build script does nothing
342
+ more than invoke the local image builder, which will create a buildx builder named `flytex` if not present. Note that only members of the `Flyte Maintainers` group has
343
+ access to push to the default registry. If you don't have access, please make sure to
344
+ specify the registry and name to the build script.
345
+
346
+ ```bash
347
+ python maint_tools/build_default_image.py --registry ghcr.io/my-org --name my-flyte-image
348
+ ```
349
+
350
+ ## ๐Ÿ“„ License
351
+
352
+ Flyte 2 is licensed under the [Apache 2.0 License](LICENSE).