flyte 0.0.1b0__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 (455) 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 -234
  26. flyte/_initialize.py +443 -294
  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 +322 -33
  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 +461 -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. {union/_cli → flyte/cli}/_params.py +152 -153
  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 +3 -0
  121. flyte/config/_config.py +248 -0
  122. flyte/config/_internal.py +73 -0
  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 +230 -129
  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 -287
  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 -152
  195. flyte/_cli/main.py +0 -72
  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.0.1b0.dist-info/METADATA +0 -179
  261. flyte-0.0.1b0.dist-info/RECORD +0 -390
  262. flyte-0.0.1b0.dist-info/entry_points.txt +0 -3
  263. union/__init__.py +0 -54
  264. union/_api_commons.py +0 -3
  265. union/_bin/__init__.py +0 -0
  266. union/_bin/runtime.py +0 -113
  267. union/_build.py +0 -25
  268. union/_cache/__init__.py +0 -12
  269. union/_cache/cache.py +0 -141
  270. union/_cache/defaults.py +0 -9
  271. union/_cache/policy_function_body.py +0 -42
  272. union/_cli/__init__.py +0 -0
  273. union/_cli/_common.py +0 -263
  274. union/_cli/_create.py +0 -40
  275. union/_cli/_delete.py +0 -23
  276. union/_cli/_deploy.py +0 -120
  277. union/_cli/_get.py +0 -162
  278. union/_cli/_run.py +0 -150
  279. union/_cli/main.py +0 -72
  280. union/_code_bundle/__init__.py +0 -8
  281. union/_code_bundle/_ignore.py +0 -113
  282. union/_code_bundle/_packaging.py +0 -187
  283. union/_code_bundle/_utils.py +0 -342
  284. union/_code_bundle/bundle.py +0 -176
  285. union/_context.py +0 -146
  286. union/_datastructures.py +0 -295
  287. union/_deploy.py +0 -185
  288. union/_doc.py +0 -29
  289. union/_docstring.py +0 -26
  290. union/_environment.py +0 -43
  291. union/_group.py +0 -31
  292. union/_hash.py +0 -23
  293. union/_image.py +0 -760
  294. union/_initialize.py +0 -585
  295. union/_interface.py +0 -84
  296. union/_internal/__init__.py +0 -3
  297. union/_internal/controllers/__init__.py +0 -77
  298. union/_internal/controllers/_local_controller.py +0 -77
  299. union/_internal/controllers/pbhash.py +0 -39
  300. union/_internal/controllers/remote/__init__.py +0 -40
  301. union/_internal/controllers/remote/_action.py +0 -131
  302. union/_internal/controllers/remote/_client.py +0 -43
  303. union/_internal/controllers/remote/_controller.py +0 -169
  304. union/_internal/controllers/remote/_core.py +0 -341
  305. union/_internal/controllers/remote/_informer.py +0 -260
  306. union/_internal/controllers/remote/_service_protocol.py +0 -44
  307. union/_internal/imagebuild/__init__.py +0 -11
  308. union/_internal/imagebuild/docker_builder.py +0 -416
  309. union/_internal/imagebuild/image_builder.py +0 -243
  310. union/_internal/imagebuild/remote_builder.py +0 -0
  311. union/_internal/resolvers/__init__.py +0 -0
  312. union/_internal/resolvers/_task_module.py +0 -31
  313. union/_internal/resolvers/common.py +0 -24
  314. union/_internal/resolvers/default.py +0 -27
  315. union/_internal/runtime/__init__.py +0 -0
  316. union/_internal/runtime/convert.py +0 -163
  317. union/_internal/runtime/entrypoints.py +0 -121
  318. union/_internal/runtime/io.py +0 -136
  319. union/_internal/runtime/resources_serde.py +0 -134
  320. union/_internal/runtime/task_serde.py +0 -202
  321. union/_internal/runtime/taskrunner.py +0 -179
  322. union/_internal/runtime/types_serde.py +0 -53
  323. union/_logging.py +0 -124
  324. union/_protos/__init__.py +0 -0
  325. union/_protos/common/authorization_pb2.py +0 -66
  326. union/_protos/common/authorization_pb2.pyi +0 -106
  327. union/_protos/common/authorization_pb2_grpc.py +0 -4
  328. union/_protos/common/identifier_pb2.py +0 -71
  329. union/_protos/common/identifier_pb2.pyi +0 -82
  330. union/_protos/common/identifier_pb2_grpc.py +0 -4
  331. union/_protos/common/identity_pb2.py +0 -48
  332. union/_protos/common/identity_pb2.pyi +0 -72
  333. union/_protos/common/identity_pb2_grpc.py +0 -4
  334. union/_protos/common/list_pb2.py +0 -36
  335. union/_protos/common/list_pb2.pyi +0 -69
  336. union/_protos/common/list_pb2_grpc.py +0 -4
  337. union/_protos/common/policy_pb2.py +0 -37
  338. union/_protos/common/policy_pb2.pyi +0 -27
  339. union/_protos/common/policy_pb2_grpc.py +0 -4
  340. union/_protos/common/role_pb2.py +0 -37
  341. union/_protos/common/role_pb2.pyi +0 -51
  342. union/_protos/common/role_pb2_grpc.py +0 -4
  343. union/_protos/common/runtime_version_pb2.py +0 -28
  344. union/_protos/common/runtime_version_pb2.pyi +0 -24
  345. union/_protos/common/runtime_version_pb2_grpc.py +0 -4
  346. union/_protos/logs/dataplane/payload_pb2.py +0 -96
  347. union/_protos/logs/dataplane/payload_pb2.pyi +0 -168
  348. union/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
  349. union/_protos/secret/definition_pb2.py +0 -49
  350. union/_protos/secret/definition_pb2.pyi +0 -93
  351. union/_protos/secret/definition_pb2_grpc.py +0 -4
  352. union/_protos/secret/payload_pb2.py +0 -62
  353. union/_protos/secret/payload_pb2.pyi +0 -94
  354. union/_protos/secret/payload_pb2_grpc.py +0 -4
  355. union/_protos/secret/secret_pb2.py +0 -38
  356. union/_protos/secret/secret_pb2.pyi +0 -6
  357. union/_protos/secret/secret_pb2_grpc.py +0 -198
  358. union/_protos/validate/validate/validate_pb2.py +0 -76
  359. union/_protos/workflow/node_execution_service_pb2.py +0 -26
  360. union/_protos/workflow/node_execution_service_pb2.pyi +0 -4
  361. union/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
  362. union/_protos/workflow/queue_service_pb2.py +0 -75
  363. union/_protos/workflow/queue_service_pb2.pyi +0 -103
  364. union/_protos/workflow/queue_service_pb2_grpc.py +0 -172
  365. union/_protos/workflow/run_definition_pb2.py +0 -100
  366. union/_protos/workflow/run_definition_pb2.pyi +0 -256
  367. union/_protos/workflow/run_definition_pb2_grpc.py +0 -4
  368. union/_protos/workflow/run_logs_service_pb2.py +0 -41
  369. union/_protos/workflow/run_logs_service_pb2.pyi +0 -28
  370. union/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
  371. union/_protos/workflow/run_service_pb2.py +0 -133
  372. union/_protos/workflow/run_service_pb2.pyi +0 -173
  373. union/_protos/workflow/run_service_pb2_grpc.py +0 -412
  374. union/_protos/workflow/state_service_pb2.py +0 -58
  375. union/_protos/workflow/state_service_pb2.pyi +0 -69
  376. union/_protos/workflow/state_service_pb2_grpc.py +0 -138
  377. union/_protos/workflow/task_definition_pb2.py +0 -72
  378. union/_protos/workflow/task_definition_pb2.pyi +0 -65
  379. union/_protos/workflow/task_definition_pb2_grpc.py +0 -4
  380. union/_protos/workflow/task_service_pb2.py +0 -44
  381. union/_protos/workflow/task_service_pb2.pyi +0 -31
  382. union/_protos/workflow/task_service_pb2_grpc.py +0 -104
  383. union/_resources.py +0 -226
  384. union/_retry.py +0 -32
  385. union/_reusable_environment.py +0 -25
  386. union/_run.py +0 -374
  387. union/_secret.py +0 -61
  388. union/_task.py +0 -354
  389. union/_task_environment.py +0 -186
  390. union/_timeout.py +0 -47
  391. union/_tools.py +0 -27
  392. union/_utils/__init__.py +0 -11
  393. union/_utils/asyn.py +0 -119
  394. union/_utils/file_handling.py +0 -71
  395. union/_utils/helpers.py +0 -46
  396. union/_utils/lazy_module.py +0 -54
  397. union/_utils/uv_script_parser.py +0 -49
  398. union/_version.py +0 -21
  399. union/connectors/__init__.py +0 -0
  400. union/errors.py +0 -128
  401. union/extras/__init__.py +0 -5
  402. union/extras/_container.py +0 -263
  403. union/io/__init__.py +0 -11
  404. union/io/_dataframe.py +0 -0
  405. union/io/_dir.py +0 -425
  406. union/io/_file.py +0 -418
  407. union/io/pickle/__init__.py +0 -0
  408. union/io/pickle/transformer.py +0 -117
  409. union/io/structured_dataset/__init__.py +0 -122
  410. union/io/structured_dataset/basic_dfs.py +0 -219
  411. union/io/structured_dataset/structured_dataset.py +0 -1057
  412. union/py.typed +0 -0
  413. union/remote/__init__.py +0 -23
  414. union/remote/_client/__init__.py +0 -0
  415. union/remote/_client/_protocols.py +0 -129
  416. union/remote/_client/auth/__init__.py +0 -12
  417. union/remote/_client/auth/_authenticators/__init__.py +0 -0
  418. union/remote/_client/auth/_authenticators/base.py +0 -391
  419. union/remote/_client/auth/_authenticators/client_credentials.py +0 -73
  420. union/remote/_client/auth/_authenticators/device_code.py +0 -120
  421. union/remote/_client/auth/_authenticators/external_command.py +0 -77
  422. union/remote/_client/auth/_authenticators/factory.py +0 -200
  423. union/remote/_client/auth/_authenticators/pkce.py +0 -515
  424. union/remote/_client/auth/_channel.py +0 -184
  425. union/remote/_client/auth/_client_config.py +0 -83
  426. union/remote/_client/auth/_default_html.py +0 -32
  427. union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
  428. union/remote/_client/auth/_grpc_utils/auth_interceptor.py +0 -204
  429. union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +0 -144
  430. union/remote/_client/auth/_keyring.py +0 -154
  431. union/remote/_client/auth/_token_client.py +0 -258
  432. union/remote/_client/auth/errors.py +0 -16
  433. union/remote/_client/controlplane.py +0 -86
  434. union/remote/_data.py +0 -149
  435. union/remote/_logs.py +0 -74
  436. union/remote/_project.py +0 -86
  437. union/remote/_run.py +0 -820
  438. union/remote/_secret.py +0 -132
  439. union/remote/_task.py +0 -193
  440. union/report/__init__.py +0 -3
  441. union/report/_report.py +0 -178
  442. union/report/_template.html +0 -124
  443. union/storage/__init__.py +0 -24
  444. union/storage/_remote_fs.py +0 -34
  445. union/storage/_storage.py +0 -247
  446. union/storage/_utils.py +0 -5
  447. union/types/__init__.py +0 -11
  448. union/types/_renderer.py +0 -162
  449. union/types/_string_literals.py +0 -120
  450. union/types/_type_engine.py +0 -2131
  451. union/types/_utils.py +0 -80
  452. /flyte/{_cli → _debug}/__init__.py +0 -0
  453. /flyte/{_protos → _keyring}/__init__.py +0 -0
  454. {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
  455. {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
@@ -3,66 +3,68 @@ This module provides functionality to serialize and deserialize tasks to and fro
3
3
  It includes a Resolver interface for loading tasks, and functions to load classes and tasks.
4
4
  """
5
5
 
6
- import importlib
6
+ import copy
7
+ import typing
7
8
  from datetime import timedelta
8
- from typing import Optional, Type
9
+ from typing import Optional, cast
9
10
 
10
- from flyteidl.core import identifier_pb2, literals_pb2, security_pb2, tasks_pb2
11
+ from flyteidl2.core import identifier_pb2, literals_pb2, security_pb2, tasks_pb2
12
+ from flyteidl2.core.execution_pb2 import TaskLog
13
+ from flyteidl2.task import common_pb2, environment_pb2, task_definition_pb2
11
14
  from google.protobuf import duration_pb2, wrappers_pb2
12
15
 
13
16
  import flyte.errors
14
17
  from flyte._cache.cache import VersionParameters, cache_from_request
15
- from flyte._datastructures import SerializationContext
16
18
  from flyte._logging import logger
17
- from flyte._protos.workflow import task_definition_pb2
19
+ from flyte._pod import _PRIMARY_CONTAINER_NAME_FIELD, PodTemplate
18
20
  from flyte._secret import SecretRequest, secrets_from_request
19
21
  from flyte._task import AsyncFunctionTaskTemplate, TaskTemplate
22
+ from flyte.models import CodeBundle, SerializationContext
20
23
 
24
+ from ... import ReusePolicy
25
+ from ..._context import internal_ctx
21
26
  from ..._retry import RetryStrategy
22
27
  from ..._timeout import TimeoutType, timeout_from_request
23
28
  from .resources_serde import get_proto_extended_resources, get_proto_resources
29
+ from .reuse import add_reusable
24
30
  from .types_serde import transform_native_to_typed_interface
25
31
 
26
-
27
- def load_class(qualified_name) -> Type:
28
- """
29
- Load a class from a qualified name. The qualified name should be in the format 'module.ClassName'.
30
- :param qualified_name: The qualified name of the class to load.
31
- :return: The class object.
32
- """
33
- module_name, class_name = qualified_name.rsplit(".", 1) # Split module and class
34
- module = importlib.import_module(module_name) # Import the module
35
- return getattr(module, class_name) # Retrieve the class
36
-
37
-
38
- def load_task(resolver: str, *resolver_args: str) -> TaskTemplate:
39
- """
40
- Load a task from a resolver. This is a placeholder function.
41
-
42
- :param resolver: The resolver to use to load the task.
43
- :param resolver_args: Arguments to pass to the resolver.
44
- :return: The loaded task.
45
- """
46
- resolver_class = load_class(resolver)
47
- resolver_instance = resolver_class()
48
- return resolver_instance.load_task(resolver_args)
32
+ _MAX_ENV_NAME_LENGTH = 63 # Maximum length for environment names
33
+ _MAX_TASK_SHORT_NAME_LENGTH = 63 # Maximum length for task short names
49
34
 
50
35
 
51
36
  def translate_task_to_wire(
52
- task: TaskTemplate, serialization_context: SerializationContext
37
+ task: TaskTemplate,
38
+ serialization_context: SerializationContext,
39
+ default_inputs: Optional[typing.List[common_pb2.NamedParameter]] = None,
53
40
  ) -> task_definition_pb2.TaskSpec:
54
41
  """
55
42
  Translate a task to a wire format. This is a placeholder function.
56
43
 
57
44
  :param task: The task to translate.
58
45
  :param serialization_context: The serialization context to use for the translation.
46
+ :param default_inputs: Optional list of default inputs for the task.
59
47
 
60
48
  :return: The translated task.
61
49
  """
62
- return get_proto_task(task, serialization_context)
50
+ tt = get_proto_task(task, serialization_context)
51
+ env: environment_pb2.Environment | None = None
52
+
53
+ if task.parent_env and task.parent_env():
54
+ _env = task.parent_env()
55
+ if _env:
56
+ env = environment_pb2.Environment(name=_env.name[:_MAX_ENV_NAME_LENGTH])
57
+ return task_definition_pb2.TaskSpec(
58
+ task_template=tt,
59
+ default_inputs=default_inputs,
60
+ short_name=task.short_name[:_MAX_TASK_SHORT_NAME_LENGTH],
61
+ environment=env,
62
+ )
63
63
 
64
64
 
65
- def get_security_context(secrets: Optional[SecretRequest]) -> Optional[security_pb2.SecurityContext]:
65
+ def get_security_context(
66
+ secrets: Optional[SecretRequest],
67
+ ) -> Optional[security_pb2.SecurityContext]:
66
68
  """
67
69
  Get the security context from a list of secrets. This is a placeholder function.
68
70
 
@@ -89,7 +91,9 @@ def get_security_context(secrets: Optional[SecretRequest]) -> Optional[security_
89
91
  )
90
92
 
91
93
 
92
- def get_proto_retry_strategy(retries: RetryStrategy | int | None) -> Optional[literals_pb2.RetryStrategy]:
94
+ def get_proto_retry_strategy(
95
+ retries: RetryStrategy | int | None,
96
+ ) -> Optional[literals_pb2.RetryStrategy]:
93
97
  if retries is None:
94
98
  return None
95
99
 
@@ -108,7 +112,7 @@ def get_proto_timeout(timeout: TimeoutType | None) -> Optional[duration_pb2.Dura
108
112
  return duration_pb2.Duration(seconds=max_runtime_timeout.seconds)
109
113
 
110
114
 
111
- def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext) -> task_definition_pb2.TaskSpec:
115
+ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext) -> tasks_pb2.TaskTemplate:
112
116
  task_id = identifier_pb2.Identifier(
113
117
  resource_type=identifier_pb2.ResourceType.TASK,
114
118
  project=serialize_context.project,
@@ -117,21 +121,38 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
117
121
  name=task.name,
118
122
  version=serialize_context.version,
119
123
  )
120
- # TODO, there will be tasks that do not have images, handle that case
121
- # if task.parent_env is None:
122
- # raise ValueError(f"Task {task.name} must have a parent environment")
123
-
124
- #
125
- # This pod will be incorrect when doing fast serialize
126
- #
127
- container = _get_urun_container(serialize_context, task)
128
-
129
- # TODO Add support for SQL, Pod, extra_config, custom
130
- pod = None
131
- sql = None
132
- # pod = task.get_k8s_pod(serialize_context)
133
- extra_config = {} # type: ignore
134
- custom = {} # type: ignore
124
+
125
+ extra_config: typing.Dict[str, str] = {}
126
+
127
+ if task.pod_template and not isinstance(task.pod_template, str):
128
+ pod = _get_k8s_pod(_get_urun_container(serialize_context, task), task.pod_template)
129
+ extra_config[_PRIMARY_CONTAINER_NAME_FIELD] = task.pod_template.primary_container_name
130
+ container = None
131
+ else:
132
+ container = _get_urun_container(serialize_context, task)
133
+ pod = None
134
+
135
+ ctx = internal_ctx()
136
+ task_ctx = ctx.data.task_context
137
+ log_links = []
138
+ if task.links and task_ctx:
139
+ action = task_ctx.action
140
+ for link in task.links:
141
+ uri = link.get_link(
142
+ run_name=action.run_name if action.run_name else "",
143
+ project=action.project if action.project else "",
144
+ domain=action.domain if action.domain else "",
145
+ context=task_ctx.custom_context if task_ctx.custom_context else {},
146
+ parent_action_name=action.name if action.name else "",
147
+ action_name="{{.actionName}}",
148
+ pod_name="{{.podName}}",
149
+ )
150
+ task_log = TaskLog(name=link.name, uri=uri, icon_uri=link.icon_uri)
151
+ log_links.append(task_log)
152
+
153
+ custom = task.custom_config(serialize_context)
154
+
155
+ sql = task.sql(serialize_context)
135
156
 
136
157
  # -------------- CACHE HANDLING ----------------------
137
158
  task_cache = cache_from_request(task.cache)
@@ -144,7 +165,6 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
144
165
  logger.debug(f"Detected pkl bundle for task {task.name}, using computed version as cache version")
145
166
  cache_version = serialize_context.code_bundle.computed_version
146
167
  else:
147
- version_parameters = None
148
168
  if isinstance(task, AsyncFunctionTaskTemplate):
149
169
  version_parameters = VersionParameters(func=task.func, image=task.image)
150
170
  else:
@@ -154,23 +174,29 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
154
174
  else:
155
175
  logger.debug(f"Cache disabled for task {task.name}")
156
176
 
157
- tt = tasks_pb2.TaskTemplate(
177
+ task_template = tasks_pb2.TaskTemplate(
158
178
  id=task_id,
159
179
  type=task.task_type,
160
180
  metadata=tasks_pb2.TaskMetadata(
161
181
  discoverable=cache_enabled,
162
182
  discovery_version=cache_version,
163
183
  cache_serializable=task_cache.serialize,
164
- cache_ignore_input_vars=task_cache.ignored_inputs,
165
- runtime=tasks_pb2.RuntimeMetadata(),
184
+ cache_ignore_input_vars=(task_cache.get_ignored_inputs() if cache_enabled else None),
185
+ runtime=tasks_pb2.RuntimeMetadata(
186
+ version=flyte.version(),
187
+ type=tasks_pb2.RuntimeMetadata.RuntimeType.FLYTE_SDK,
188
+ flavor="python",
189
+ ),
166
190
  retries=get_proto_retry_strategy(task.retries),
167
191
  timeout=get_proto_timeout(task.timeout),
168
- pod_template_name=task.pod_template if task.pod_template and isinstance(task.pod_template, str) else None,
169
- interruptible=task.interruptable,
170
- generates_deck=wrappers_pb2.BoolValue(value=False), # TODO add support for reports
192
+ pod_template_name=(task.pod_template if task.pod_template and isinstance(task.pod_template, str) else None),
193
+ interruptible=task.interruptible,
194
+ generates_deck=wrappers_pb2.BoolValue(value=task.report),
195
+ debuggable=task.debuggable,
196
+ log_links=log_links,
171
197
  ),
172
198
  interface=transform_native_to_typed_interface(task.native_interface),
173
- custom=custom,
199
+ custom=custom if len(custom) > 0 else None,
174
200
  container=container,
175
201
  task_type_version=task.task_type_version,
176
202
  security_context=get_security_context(task.secrets),
@@ -179,25 +205,69 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
179
205
  sql=sql,
180
206
  extended_resources=get_proto_extended_resources(task.resources),
181
207
  )
182
- return task_definition_pb2.TaskSpec(task_template=tt)
208
+
209
+ if task.reusable is not None:
210
+ if not isinstance(task.reusable, ReusePolicy):
211
+ raise flyte.errors.RuntimeUserError(
212
+ "BadConfig", f"Expected ReusePolicy, got {type(task.reusable)} for task {task.name}"
213
+ )
214
+ env_name = None
215
+ if task.parent_env is not None:
216
+ env = task.parent_env()
217
+ if env is not None:
218
+ env_name = env.name
219
+ return add_reusable(task_template, task.reusable, serialize_context.code_bundle, env_name)
220
+
221
+ return task_template
222
+
223
+
224
+ def lookup_image_in_cache(serialize_context: SerializationContext, env_name: str, image: flyte.Image) -> str:
225
+ if not serialize_context.image_cache or len(image._layers) == 0:
226
+ # This computes the image uri, computing hashes as necessary so can fail if done remotely.
227
+ return image.uri
228
+ elif serialize_context.image_cache and env_name not in serialize_context.image_cache.image_lookup:
229
+ raise flyte.errors.RuntimeUserError(
230
+ "MissingEnvironment",
231
+ f"Environment '{env_name}' not found in image cache.\n\n"
232
+ "💡 To fix this:\n"
233
+ " 1. If your parent environment calls a task in another environment,"
234
+ " declare that dependency using 'depends_on=[...]'.\n"
235
+ " Example:\n"
236
+ " env1 = flyte.TaskEnvironment(\n"
237
+ " name='outer',\n"
238
+ " image=flyte.Image.from_debian_base().with_pip_packages('requests'),\n"
239
+ " depends_on=[env2, env3],\n"
240
+ " )\n"
241
+ " 2. If you're using os.getenv() to set the environment name,"
242
+ " make sure the runtime environment has the same environment variable defined.\n"
243
+ " Example:\n"
244
+ " env = flyte.TaskEnvironment(\n"
245
+ ' name=os.getenv("my-name"),\n'
246
+ ' env_vars={"my-name": os.getenv("my-name")},\n'
247
+ " )\n",
248
+ )
249
+ return serialize_context.image_cache.image_lookup[env_name]
183
250
 
184
251
 
185
252
  def _get_urun_container(
186
253
  serialize_context: SerializationContext, task_template: TaskTemplate
187
254
  ) -> Optional[tasks_pb2.Container]:
188
255
  env = (
189
- [literals_pb2.KeyValuePair(key=k, value=v) for k, v in task_template.env.items()] if task_template.env else None
256
+ [literals_pb2.KeyValuePair(key=k, value=v) for k, v in task_template.env_vars.items()]
257
+ if task_template.env_vars
258
+ else None
190
259
  )
191
260
  resources = get_proto_resources(task_template.resources)
192
- # pr: under what conditions should this return None?
193
- if isinstance(task_template.image, str):
261
+
262
+ img = task_template.image
263
+ if isinstance(img, str):
194
264
  raise flyte.errors.RuntimeSystemError("BadConfig", "Image is not a valid image")
195
- image_id = task_template.image.identifier
196
- if not serialize_context.image_cache or image_id not in serialize_context.image_cache.image_lookup:
197
- # This computes the image uri, computing hashes as necessary so can fail if done remotely.
198
- img_uri = task_template.image.uri
199
- else:
200
- img_uri = serialize_context.image_cache.image_lookup[image_id]
265
+
266
+ env_name = task_template.parent_env_name
267
+ if env_name is None:
268
+ raise flyte.errors.RuntimeSystemError("BadConfig", f"Task {task_template.name} has no parent environment name")
269
+
270
+ img_uri = lookup_image_in_cache(serialize_context, env_name, img)
201
271
 
202
272
  return tasks_pb2.Container(
203
273
  image=img_uri,
@@ -208,3 +278,106 @@ def _get_urun_container(
208
278
  data_config=task_template.data_loading_config(serialize_context),
209
279
  config=task_template.config(serialize_context),
210
280
  )
281
+
282
+
283
+ def _sanitize_resource_name(resource: tasks_pb2.Resources.ResourceEntry) -> str:
284
+ return tasks_pb2.Resources.ResourceName.Name(resource.name).lower().replace("_", "-")
285
+
286
+
287
+ def _get_k8s_pod(primary_container: tasks_pb2.Container, pod_template: PodTemplate) -> Optional[tasks_pb2.K8sPod]:
288
+ """
289
+ Get the K8sPod representation of the task template.
290
+ :param task: The task to convert.
291
+ :return: The K8sPod representation of the task template.
292
+ """
293
+ from kubernetes.client import ApiClient, V1PodSpec
294
+ from kubernetes.client.models import V1EnvVar, V1ResourceRequirements
295
+
296
+ pod_template = copy.deepcopy(pod_template)
297
+ containers = cast(V1PodSpec, pod_template.pod_spec).containers
298
+ primary_exists = False
299
+
300
+ for container in containers:
301
+ if container.name == pod_template.primary_container_name:
302
+ primary_exists = True
303
+ break
304
+
305
+ if not primary_exists:
306
+ raise ValueError(
307
+ "No primary container defined in the pod spec."
308
+ f" You must define a primary container with the name '{pod_template.primary_container_name}'."
309
+ )
310
+ final_containers = []
311
+
312
+ for container in containers:
313
+ # We overwrite the primary container attributes with the values given to ContainerTask.
314
+ # The attributes include: image, command, args, resource, and env (env is unioned)
315
+
316
+ if container.name == pod_template.primary_container_name:
317
+ if container.image is None:
318
+ # Copy the image from primary_container only if the image is not specified in the pod spec.
319
+ container.image = primary_container.image
320
+
321
+ container.command = list(primary_container.command)
322
+ container.args = list(primary_container.args)
323
+
324
+ limits, requests = {}, {}
325
+ for resource in primary_container.resources.limits:
326
+ limits[_sanitize_resource_name(resource)] = resource.value
327
+ for resource in primary_container.resources.requests:
328
+ requests[_sanitize_resource_name(resource)] = resource.value
329
+
330
+ resource_requirements = V1ResourceRequirements(limits=limits, requests=requests)
331
+ if len(limits) > 0 or len(requests) > 0:
332
+ # Important! Only copy over resource requirements if they are non-empty.
333
+ container.resources = resource_requirements
334
+
335
+ if primary_container.env is not None:
336
+ container.env = [V1EnvVar(name=e.key, value=e.value) for e in primary_container.env] + (
337
+ container.env or []
338
+ )
339
+
340
+ final_containers.append(container)
341
+
342
+ cast(V1PodSpec, pod_template.pod_spec).containers = final_containers
343
+ pod_spec = ApiClient().sanitize_for_serialization(pod_template.pod_spec)
344
+
345
+ metadata = tasks_pb2.K8sObjectMetadata(labels=pod_template.labels, annotations=pod_template.annotations)
346
+ return tasks_pb2.K8sPod(pod_spec=pod_spec, metadata=metadata)
347
+
348
+
349
+ def extract_code_bundle(
350
+ task_spec: task_definition_pb2.TaskSpec,
351
+ ) -> Optional[CodeBundle]:
352
+ """
353
+ Extract the code bundle from the task spec.
354
+ :param task_spec: The task spec to extract the code bundle from.
355
+ :return: The extracted code bundle or None if not present.
356
+ """
357
+ container = task_spec.task_template.container
358
+ if container and container.args:
359
+ pkl_path = None
360
+ tgz_path = None
361
+ dest_path: str = "."
362
+ version = ""
363
+ for i, v in enumerate(container.args):
364
+ if v == "--pkl":
365
+ # Extract the code bundle path from the argument
366
+ pkl_path = container.args[i + 1] if i + 1 < len(container.args) else None
367
+ elif v == "--tgz":
368
+ # Extract the code bundle path from the argument
369
+ tgz_path = container.args[i + 1] if i + 1 < len(container.args) else None
370
+ elif v == "--dest":
371
+ # Extract the destination path from the argument
372
+ dest_path = container.args[i + 1] if i + 1 < len(container.args) else "."
373
+ elif v == "--version":
374
+ # Extract the version from the argument
375
+ version = container.args[i + 1] if i + 1 < len(container.args) else ""
376
+ if pkl_path or tgz_path:
377
+ return CodeBundle(
378
+ destination=dest_path,
379
+ tgz=tgz_path,
380
+ pkl=pkl_path,
381
+ computed_version=version,
382
+ )
383
+ return None
@@ -4,15 +4,17 @@ invoked within a context tree.
4
4
  """
5
5
 
6
6
  import pathlib
7
+ import time
7
8
  from typing import Any, Dict, List, Optional, Tuple
8
9
 
9
10
  import flyte.report
10
11
  from flyte._context import internal_ctx
11
- from flyte._datastructures import ActionID, Checkpoints, CodeBundle, RawDataPath, TaskContext
12
12
  from flyte._internal.imagebuild.image_builder import ImageCache
13
13
  from flyte._logging import log, logger
14
+ from flyte._metrics import Stopwatch
14
15
  from flyte._task import TaskTemplate
15
16
  from flyte.errors import CustomError, RuntimeSystemError, RuntimeUnknownError, RuntimeUserError
17
+ from flyte.models import ActionID, Checkpoints, CodeBundle, RawDataPath, TaskContext
16
18
 
17
19
  from .. import Controller
18
20
  from .convert import (
@@ -110,41 +112,75 @@ async def run_task(
110
112
  async def convert_and_run(
111
113
  *,
112
114
  task: TaskTemplate,
113
- inputs: Inputs,
114
115
  action: ActionID,
115
116
  controller: Controller,
116
117
  raw_data_path: RawDataPath,
117
118
  version: str,
118
119
  output_path: str,
119
120
  run_base_dir: str,
121
+ inputs: Inputs = Inputs.empty(),
122
+ input_path: str | None = None,
120
123
  checkpoints: Checkpoints | None = None,
121
124
  code_bundle: CodeBundle | None = None,
122
125
  image_cache: ImageCache | None = None,
126
+ interactive_mode: bool = False,
123
127
  ) -> Tuple[Optional[Outputs], Optional[Error]]:
124
128
  """
125
129
  This method is used to convert the inputs to native types, and run the task. It assumes you are running
126
130
  in a context tree.
127
131
  """
128
132
  ctx = internal_ctx()
133
+
134
+ # Load inputs first to get context
135
+ if input_path:
136
+ sw = Stopwatch("load_inputs")
137
+ sw.start()
138
+ inputs = await load_inputs(input_path, path_rewrite_config=raw_data_path.path_rewrite)
139
+ sw.stop()
140
+
141
+ # Extract context from inputs
142
+ custom_context = inputs.context if inputs else {}
143
+
129
144
  tctx = TaskContext(
130
145
  action=action,
131
146
  checkpoints=checkpoints,
132
147
  code_bundle=code_bundle,
148
+ input_path=input_path,
133
149
  output_path=output_path,
134
150
  run_base_dir=run_base_dir,
135
151
  version=version,
136
152
  raw_data_path=raw_data_path,
137
153
  compiled_image_cache=image_cache,
138
154
  report=flyte.report.Report(name=action.name),
155
+ mode="remote" if not ctx.data.task_context else ctx.data.task_context.mode,
156
+ interactive_mode=interactive_mode,
157
+ custom_context=custom_context,
139
158
  )
140
- async with ctx.replace_task_context(tctx):
159
+
160
+ with ctx.replace_task_context(tctx):
161
+ sw = Stopwatch("convert_inputs_to_native")
162
+ sw.start()
141
163
  inputs_kwargs = await convert_inputs_to_native(inputs, task.native_interface)
164
+ sw.stop()
165
+
166
+ sw = Stopwatch("run_task")
167
+ sw.start()
142
168
  out, err = await run_task(tctx=tctx, controller=controller, task=task, inputs=inputs_kwargs)
169
+ sw.stop()
170
+
143
171
  if err is not None:
144
172
  return None, convert_from_native_to_error(err)
145
173
  if task.report:
146
- await flyte.report.flush.aio()
147
- return await convert_from_native_to_outputs(out, task.native_interface), None
174
+ # Check if report has content before flushing to avoid overwriting
175
+ # worker reports (from Elastic/distributed tasks) with empty main process report
176
+ if ctx.get_report():
177
+ await flyte.report.flush.aio()
178
+
179
+ sw = Stopwatch("convert_outputs_from_native")
180
+ sw.start()
181
+ result = await convert_from_native_to_outputs(out, task.native_interface, task.name), None
182
+ sw.stop()
183
+ return result
148
184
 
149
185
 
150
186
  async def extract_download_run_upload(
@@ -160,15 +196,17 @@ async def extract_download_run_upload(
160
196
  code_bundle: CodeBundle | None = None,
161
197
  input_path: str | None = None,
162
198
  image_cache: ImageCache | None = None,
199
+ interactive_mode: bool = False,
163
200
  ):
164
201
  """
165
202
  This method is invoked from the CLI (urun) and is used to run a task. This assumes that the context tree
166
203
  has already been created, and the task has been loaded. It also handles the loading of the task.
167
204
  """
168
- inputs = await load_inputs(input_path) if input_path else None
205
+ t = time.time()
206
+ logger.info(f"Task {action.name} started at {t}")
169
207
  outputs, err = await convert_and_run(
170
208
  task=task,
171
- inputs=inputs or Inputs.empty(),
209
+ input_path=input_path,
172
210
  action=action,
173
211
  controller=controller,
174
212
  raw_data_path=raw_data_path,
@@ -178,7 +216,9 @@ async def extract_download_run_upload(
178
216
  checkpoints=checkpoints,
179
217
  code_bundle=code_bundle,
180
218
  image_cache=image_cache,
219
+ interactive_mode=interactive_mode,
181
220
  )
221
+ logger.debug(f"Task {action.name} completed at {t}, with outputs: {outputs}")
182
222
  if err is not None:
183
223
  path = await upload_error(err.err, output_path)
184
224
  logger.error(f"Task {task.name} failed with error: {err}. Uploaded error to {path}")
@@ -187,4 +227,4 @@ async def extract_download_run_upload(
187
227
  logger.info(f"Task {task.name} completed successfully, no outputs")
188
228
  return
189
229
  await upload_outputs(outputs, output_path) if output_path else None
190
- logger.info(f"Task {task.name} completed successfully, uploaded outputs to {output_path}")
230
+ logger.info(f"Task {task.name} completed successfully, uploaded outputs to {output_path} in {time.time() - t}s")