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
@@ -1,30 +1,41 @@
1
1
  from __future__ import annotations
2
2
 
3
- import asyncio
3
+ import inspect
4
4
  import weakref
5
5
  from dataclasses import dataclass, field, replace
6
6
  from datetime import timedelta
7
- from functools import wraps
8
- from typing import TYPE_CHECKING, Awaitable, Callable, Dict, List, Literal, Optional, ParamSpec, TypeVar, Union, cast
7
+ from typing import (
8
+ TYPE_CHECKING,
9
+ Any,
10
+ Callable,
11
+ Dict,
12
+ List,
13
+ Literal,
14
+ Optional,
15
+ Tuple,
16
+ Union,
17
+ cast,
18
+ overload,
19
+ )
9
20
 
10
21
  import rich.repr
11
22
 
12
- from ._cache import CacheRequest
13
- from ._datastructures import NativeInterface
23
+ from ._cache import Cache, CacheRequest
14
24
  from ._doc import Documentation
15
25
  from ._environment import Environment
16
26
  from ._image import Image
27
+ from ._link import Link
28
+ from ._pod import PodTemplate
17
29
  from ._resources import Resources
18
30
  from ._retry import RetryStrategy
19
31
  from ._reusable_environment import ReusePolicy
20
32
  from ._secret import SecretRequest
21
33
  from ._task import AsyncFunctionTaskTemplate, TaskTemplate
34
+ from ._trigger import Trigger
35
+ from .models import MAX_INLINE_IO_BYTES, NativeInterface
22
36
 
23
37
  if TYPE_CHECKING:
24
- from kubernetes.client import V1PodTemplate
25
-
26
- P = ParamSpec("P") # capture the function's parameters
27
- R = TypeVar("R") # return type
38
+ from ._task import F, P, R
28
39
 
29
40
 
30
41
  @rich.repr.auto
@@ -45,99 +56,203 @@ class TaskEnvironment(Environment):
45
56
  :param name: Name of the environment
46
57
  :param image: Docker image to use for the environment. If set to "auto", will use the default image.
47
58
  :param resources: Resources to allocate for the environment.
48
- :param env: Environment variables to set for the environment.
59
+ :param env_vars: Environment variables to set for the environment.
49
60
  :param secrets: Secrets to inject into the environment.
50
- :param env_dep_hints: Environment dependencies to hint, so when you deploy the environment, the dependencies are
51
- also deployed. This is useful when you have a set of environments that depend on each other.
61
+ :param depends_on: Environment dependencies to hint, so when you deploy the environment,
62
+ the dependencies are also deployed. This is useful when you have a set of environments
63
+ that depend on each other.
52
64
  :param cache: Cache policy for the environment.
53
65
  :param reusable: Reuse policy for the environment, if set, a python process may be reused for multiple tasks.
66
+ :param plugin_config: Optional plugin configuration for custom task types.
67
+ If set, all tasks in this environment will use the specified plugin configuration.
68
+ :param queue: Optional queue name to use for tasks in this environment.
69
+ If not set, the default queue will be used.
70
+ :param pod_template: Optional pod template to use for tasks in this environment.
71
+ If not set, the default pod template will be used.
54
72
  """
55
73
 
56
- cache: Union[CacheRequest] = "auto"
57
- reusable: Union[ReusePolicy, Literal["auto"], None] = None
58
- # TODO Shall we make this union of string or env? This way we can lookup the env by module/file:name
59
- # TODO also we could add list of files that are used by this environment
74
+ cache: CacheRequest = "disable"
75
+ reusable: ReusePolicy | None = None
76
+ plugin_config: Optional[Any] = None
77
+ queue: Optional[str] = None
60
78
 
61
79
  _tasks: Dict[str, TaskTemplate] = field(default_factory=dict, init=False)
62
80
 
81
+ def __post_init__(self) -> None:
82
+ super().__post_init__()
83
+ if self.reusable is not None and self.plugin_config is not None:
84
+ raise ValueError("Cannot set plugin_config when environment is reusable.")
85
+ if self.reusable and not isinstance(self.reusable, ReusePolicy):
86
+ raise TypeError(f"Expected reusable to be of type ReusePolicy, got {type(self.reusable)}")
87
+ if self.cache and not isinstance(self.cache, (str, Cache)):
88
+ raise TypeError(f"Expected cache to be of type str or Cache, got {type(self.cache)}")
89
+
63
90
  def clone_with(
64
91
  self,
65
92
  name: str,
66
93
  image: Optional[Union[str, Image, Literal["auto"]]] = None,
67
94
  resources: Optional[Resources] = None,
68
- cache: Union[CacheRequest, None] = None,
69
- env: Optional[Dict[str, str]] = None,
70
- reusable: Union[ReusePolicy, None] = None,
95
+ env_vars: Optional[Dict[str, str]] = None,
71
96
  secrets: Optional[SecretRequest] = None,
72
- env_dep_hints: Optional[List[Environment]] = None,
97
+ depends_on: Optional[List[Environment]] = None,
98
+ description: Optional[str] = None,
99
+ interruptible: Optional[bool] = None,
100
+ **kwargs: Any,
73
101
  ) -> TaskEnvironment:
74
102
  """
75
- Clone the environment with new settings.
103
+ Clone the TaskEnvironment with new parameters.
104
+
105
+ Besides the base environment parameters, you can override kwargs like `cache`, `reusable`, etc.
106
+
107
+ :param name: The name of the environment.
108
+ :param image: The image to use for the environment.
109
+ :param resources: The resources to allocate for the environment.
110
+ :param env_vars: The environment variables to set for the environment.
111
+ :param secrets: The secrets to inject into the environment.
112
+ :param depends_on: The environment dependencies to hint, so when you deploy the environment,
113
+ the dependencies are also deployed. This is useful when you have a set of environments
114
+ that depend on each other.
115
+ :param queue: The queue name to use for tasks in this environment.
116
+ :param pod_template: The pod template to use for tasks in this environment.
117
+ :param description: The description of the environment.
118
+ :param interruptible: Whether the environment is interruptible and can be scheduled on spot/preemptible
119
+ instances.
120
+ :param kwargs: Additional parameters to override the environment (e.g., cache, reusable, plugin_config).
76
121
  """
77
- if image is None:
78
- image = self.image
79
- else:
80
- image = "auto"
81
- return replace(
82
- self,
83
- cache=cache if cache else "auto",
84
- reusable=reusable,
85
- name=name,
86
- image=image,
87
- resources=resources,
88
- env=env,
89
- secrets=secrets,
90
- env_dep_hints=env_dep_hints if env_dep_hints else [],
91
- )
92
-
93
- def _task(
122
+ cache = kwargs.pop("cache", None)
123
+ reusable = None
124
+ reusable_set = False
125
+ if "reusable" in kwargs:
126
+ reusable_set = True
127
+ reusable = kwargs.pop("reusable", None)
128
+
129
+ # validate unknown kwargs if needed
130
+ if kwargs:
131
+ raise TypeError(f"Unexpected keyword arguments: {list(kwargs.keys())}")
132
+
133
+ kwargs = self._get_kwargs()
134
+ kwargs["name"] = name
135
+ if image is not None:
136
+ kwargs["image"] = image
137
+ if resources is not None:
138
+ kwargs["resources"] = resources
139
+ if cache is not None:
140
+ kwargs["cache"] = cache
141
+ if env_vars is not None:
142
+ kwargs["env_vars"] = env_vars
143
+ if reusable_set:
144
+ kwargs["reusable"] = reusable
145
+ if secrets is not None:
146
+ kwargs["secrets"] = secrets
147
+ if depends_on is not None:
148
+ kwargs["depends_on"] = depends_on
149
+ if description is not None:
150
+ kwargs["description"] = description
151
+ if interruptible is not None:
152
+ kwargs["interruptible"] = interruptible
153
+ return replace(self, **kwargs)
154
+
155
+ @overload
156
+ def task(
94
157
  self,
95
- _func=None,
96
158
  *,
97
- name: Optional[str] = None,
98
- cache: Union[CacheRequest] | None = None,
159
+ short_name: Optional[str] = None,
160
+ cache: CacheRequest | None = None,
99
161
  retries: Union[int, RetryStrategy] = 0,
100
162
  timeout: Union[timedelta, int] = 0,
101
163
  docs: Optional[Documentation] = None,
102
- secrets: Optional[SecretRequest] = None,
103
- pod_template: Optional[Union[str, "V1PodTemplate"]] = None,
164
+ pod_template: Optional[Union[str, PodTemplate]] = None,
165
+ report: bool = False,
166
+ interruptible: bool | None = None,
167
+ max_inline_io_bytes: int = MAX_INLINE_IO_BYTES,
168
+ queue: Optional[str] = None,
169
+ triggers: Tuple[Trigger, ...] | Trigger = (),
170
+ links: Tuple[Link, ...] | Link = (),
171
+ ) -> Callable[[Callable[P, R]], AsyncFunctionTaskTemplate[P, R, Callable[P, R]]]: ...
172
+
173
+ @overload
174
+ def task(
175
+ self,
176
+ _func: Callable[P, R],
177
+ /,
178
+ ) -> AsyncFunctionTaskTemplate[P, R, Callable[P, R]]: ...
179
+
180
+ def task(
181
+ self,
182
+ _func: F | None = None,
183
+ *,
184
+ short_name: Optional[str] = None,
185
+ cache: CacheRequest | None = None,
186
+ retries: Union[int, RetryStrategy] = 0,
187
+ timeout: Union[timedelta, int] = 0,
188
+ docs: Optional[Documentation] = None,
189
+ pod_template: Optional[Union[str, PodTemplate]] = None,
104
190
  report: bool = False,
105
- ) -> Union[AsyncFunctionTaskTemplate, Callable[P, R]]:
191
+ interruptible: bool | None = None,
192
+ max_inline_io_bytes: int = MAX_INLINE_IO_BYTES,
193
+ queue: Optional[str] = None,
194
+ triggers: Tuple[Trigger, ...] | Trigger = (),
195
+ links: Tuple[Link, ...] | Link = (),
196
+ ) -> Callable[[F], AsyncFunctionTaskTemplate[P, R, F]] | AsyncFunctionTaskTemplate[P, R, F]:
106
197
  """
107
- :param name: Optional The name of the task (defaults to the function name)
198
+ Decorate a function to be a task.
199
+
200
+ :param _func: Optional The function to decorate. If not provided, the decorator will return a callable that
201
+ accepts a function to be decorated.
202
+ :param short_name: Optional A friendly name for the task (defaults to the function name)
108
203
  :param cache: Optional The cache policy for the task, defaults to auto, which will cache the results of the
109
204
  task.
110
205
  :param retries: Optional The number of retries for the task, defaults to 0, which means no retries.
111
206
  :param docs: Optional The documentation for the task, if not provided the function docstring will be used.
112
- :param secrets: Optional The secrets that will be injected into the task at runtime.
113
207
  :param timeout: Optional The timeout for the task.
114
208
  :param pod_template: Optional The pod template for the task, if not provided the default pod template will be
115
209
  used.
116
210
  :param report: Optional Whether to generate the html report for the task, defaults to False.
211
+ :param max_inline_io_bytes: Maximum allowed size (in bytes) for all inputs and outputs passed directly to the
212
+ task (e.g., primitives, strings, dicts). Does not apply to files, directories, or dataframes.
213
+ :param triggers: Optional A tuple of triggers to associate with the task. This allows the task to be run on a
214
+ schedule or in response to events. Triggers can be defined using the `flyte.trigger` module.
215
+ :param links: Optional A tuple of links to associate with the task. Links can be used to provide
216
+ additional context or information about the task. Links should implement the `flyte.Link` protocol
217
+ :param interruptible: Optional Whether the task is interruptible, defaults to environment setting.
218
+ :param queue: Optional queue name to use for this task. If not set, the environment's queue will be used.
219
+
220
+ :return: A TaskTemplate that can be used to deploy the task.
117
221
  """
222
+ from ._task import F, P, R
223
+
118
224
  if self.reusable is not None:
119
225
  if pod_template is not None:
120
226
  raise ValueError("Cannot set pod_template when environment is reusable.")
121
227
 
122
- def decorator(func: Callable[P, Awaitable[R]]) -> AsyncFunctionTaskTemplate[P, R]:
123
- task_name = name or func.__name__
124
- task_name = self.name + "." + task_name
125
- if len(task_name) > 30:
126
- # delete this if we can remove the restriction that task names must be <= 30 characters
127
- task_name = task_name[-30:]
128
-
129
- @wraps(func)
130
- async def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
131
- return await func(*args, **kwargs)
132
-
133
- if not asyncio.iscoroutinefunction(func):
134
- raise TypeError(
135
- f"Function {func.__name__} is not a coroutine function. Use @env.task decorator for async tasks."
136
- f"You can simply mark your function as async def {func.__name__} to make it a coroutine function, "
137
- f"it is ok to write sync code in async functions, but not the other way around."
228
+ def decorator(func: F) -> AsyncFunctionTaskTemplate[P, R, F]:
229
+ short = short_name or func.__name__
230
+ task_name = self.name + "." + func.__name__
231
+
232
+ if not inspect.iscoroutinefunction(func) and self.reusable is not None:
233
+ if self.reusable.concurrency > 1:
234
+ raise ValueError(
235
+ "Reusable environments with concurrency greater than 1 are only supported for async tasks. "
236
+ "Please use an async function or set concurrency to 1."
237
+ )
238
+
239
+ if self.plugin_config is not None:
240
+ from flyte.extend import TaskPluginRegistry
241
+
242
+ task_template_class: type[AsyncFunctionTaskTemplate[P, R, F]] | None = TaskPluginRegistry.find(
243
+ config_type=type(self.plugin_config)
138
244
  )
139
- tmpl = AsyncFunctionTaskTemplate(
140
- func=wrapper,
245
+ if task_template_class is None:
246
+ raise ValueError(
247
+ f"No task plugin found for config type {type(self.plugin_config)}. "
248
+ f"Please register a plugin using flyte.extend.TaskPluginRegistry.register() api."
249
+ )
250
+ else:
251
+ task_template_class = AsyncFunctionTaskTemplate[P, R, F]
252
+
253
+ task_template_class = cast(type[AsyncFunctionTaskTemplate[P, R, F]], task_template_class)
254
+ tmpl = task_template_class(
255
+ func=func,
141
256
  name=task_name,
142
257
  image=self.image,
143
258
  resources=self.resources,
@@ -146,42 +261,27 @@ class TaskEnvironment(Environment):
146
261
  timeout=timeout,
147
262
  reusable=self.reusable,
148
263
  docs=docs,
149
- env=self.env,
150
- secrets=secrets or self.secrets,
264
+ env_vars=self.env_vars,
265
+ secrets=self.secrets,
151
266
  pod_template=pod_template or self.pod_template,
152
267
  parent_env=weakref.ref(self),
268
+ parent_env_name=self.name,
153
269
  interface=NativeInterface.from_callable(func),
154
270
  report=report,
271
+ short_name=short,
272
+ plugin_config=self.plugin_config,
273
+ max_inline_io_bytes=max_inline_io_bytes,
274
+ queue=queue or self.queue,
275
+ interruptible=interruptible if interruptible is not None else self.interruptible,
276
+ triggers=triggers if isinstance(triggers, tuple) else (triggers,),
277
+ links=links if isinstance(links, tuple) else (links,),
155
278
  )
156
279
  self._tasks[task_name] = tmpl
157
280
  return tmpl
158
281
 
159
282
  if _func is None:
160
- return cast(AsyncFunctionTaskTemplate, decorator)
161
- return cast(AsyncFunctionTaskTemplate, decorator(_func))
162
-
163
- @property
164
- def task(self) -> Callable:
165
- """
166
- Decorator to create a new task with the environment settings.
167
- The task will be executed in its own container with the specified image, resources, and environment variables,
168
- unless reusePolicy is set, in which case the same container will be reused for all tasks with the same
169
- environment settings.
170
-
171
- :param name: Optional The name of the task (defaults to the function name)
172
- :param cache: Optional The cache policy for the task, defaults to auto, which will cache the results of the
173
- task.
174
- :param retries: Optional The number of retries for the task, defaults to 0, which means no retries.
175
- :param docs: Optional The documentation for the task, if not provided the function docstring will be used.
176
- :param secrets: Optional The secrets that will be injected into the task at runtime.
177
- :param timeout: Optional The timeout for the task.
178
- :param pod_template: Optional The pod template for the task, if not provided the default pod template will be
179
- used.
180
- :param report: Optional Whether to generate the html report for the task, defaults to False.
181
-
182
- :return: New Task instance or Task decorator
183
- """
184
- return self._task
283
+ return cast(Callable[[F], AsyncFunctionTaskTemplate[P, R, F]], decorator)
284
+ return cast(AsyncFunctionTaskTemplate[P, R, F], decorator(_func))
185
285
 
186
286
  @property
187
287
  def tasks(self) -> Dict[str, TaskTemplate]:
@@ -190,11 +290,33 @@ class TaskEnvironment(Environment):
190
290
  """
191
291
  return self._tasks
192
292
 
193
- def add_task(self, task: TaskTemplate) -> TaskTemplate:
293
+ @classmethod
294
+ def from_task(cls, name: str, *tasks: TaskTemplate) -> TaskEnvironment:
194
295
  """
195
- Add a task to the environment.
296
+ Create a TaskEnvironment from a list of tasks. All tasks should have the same image or no Image defined.
297
+ Similarity of Image is determined by the python reference, not by value.
298
+
299
+ If images are different, an error is raised. If no image is defined, the image is set to "auto".
300
+
301
+ For any other tasks that need to be use these tasks, the returned environment can be used in the `depends_on`
302
+ attribute of the other TaskEnvironment.
303
+
304
+ :param name: The name of the environment.
305
+ :param tasks: The list of tasks to create the environment from.
306
+
307
+ :raises ValueError: If tasks are assigned to multiple environments or have different images.
308
+ :return: The created TaskEnvironment.
196
309
  """
197
- if task.name in self._tasks:
198
- raise ValueError(f"Task {task.name} already exists in the environment. Task names should be unique.")
199
- self._tasks[task.name] = task
200
- return task
310
+ envs = [t.parent_env() for t in tasks if t.parent_env and t.parent_env() is not None]
311
+ if envs:
312
+ raise ValueError("Tasks cannot assigned to multiple environments.")
313
+ images = {t.image for t in tasks}
314
+ if len(images) > 1:
315
+ raise ValueError("Tasks must have the same image to be in the same environment.")
316
+ image: Union[str, Image] = images.pop() if images else "auto"
317
+ env = cls(name, image=image)
318
+ for t in tasks:
319
+ env._tasks[t.name] = t
320
+ t.parent_env = weakref.ref(env)
321
+ t.parent_env_name = name
322
+ return env
flyte/_task_plugins.py ADDED
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from typing import Type
5
+
6
+ import rich.repr
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from ._task import AsyncFunctionTaskTemplate
10
+
11
+ T = typing.TypeVar("T", bound="AsyncFunctionTaskTemplate")
12
+
13
+
14
+ class _Registry:
15
+ """
16
+ A registry for task plugins.
17
+ """
18
+
19
+ def __init__(self: _Registry):
20
+ self._plugins: typing.Dict[Type, Type[typing.Any]] = {}
21
+
22
+ def register(self, config_type: Type, plugin: Type[T]):
23
+ """
24
+ Register a plugin.
25
+ """
26
+ self._plugins[config_type] = plugin
27
+
28
+ def find(self, config_type: Type) -> typing.Optional[Type[T]]:
29
+ """
30
+ Get a plugin by name.
31
+ """
32
+ return self._plugins.get(config_type)
33
+
34
+ def list_plugins(self):
35
+ """
36
+ List all registered plugins.
37
+ """
38
+ return list(self._plugins.keys())
39
+
40
+ def __rich_repr__(self) -> "rich.repr.Result":
41
+ yield from (("Name", i) for i in self.list_plugins())
42
+
43
+ def __repr__(self):
44
+ return f"TaskPluginRegistry(plugins={self.list_plugins()})"
45
+
46
+
47
+ TaskPluginRegistry = _Registry()
flyte/_tools.py CHANGED
@@ -1,6 +1,3 @@
1
- import os
2
-
3
-
4
1
  def ipython_check() -> bool:
5
2
  """
6
3
  Check if interface is launching from iPython (not colab)
@@ -17,11 +14,14 @@ def ipython_check() -> bool:
17
14
  return is_ipython
18
15
 
19
16
 
20
- def is_in_cluster() -> bool:
17
+ def ipywidgets_check() -> bool:
21
18
  """
22
- Check if the task is running in a cluster
23
- :return is_in_cluster (bool): True or False
19
+ Check if the interface is running in IPython with ipywidgets support.
20
+ :return: True if running in IPython with ipywidgets support, False otherwise.
24
21
  """
25
- if os.getenv("_UN_CLS"):
22
+ try:
23
+ import ipywidgets # noqa: F401
24
+
26
25
  return True
27
- return False
26
+ except (ImportError, NameError):
27
+ return False
flyte/_trace.py CHANGED
@@ -1,10 +1,10 @@
1
1
  import functools
2
2
  import inspect
3
3
  import time
4
- from datetime import timedelta
5
4
  from typing import Any, AsyncGenerator, AsyncIterator, Awaitable, Callable, TypeGuard, TypeVar, Union, cast
6
5
 
7
- from flyte._datastructures import NativeInterface
6
+ from flyte._logging import logger
7
+ from flyte.models import NativeInterface
8
8
 
9
9
  T = TypeVar("T")
10
10
 
@@ -14,7 +14,6 @@ def trace(func: Callable[..., T]) -> Callable[..., T]:
14
14
  A decorator that traces function execution with timing information.
15
15
  Works with regular functions, async functions, and async generators/iterators.
16
16
  """
17
- func_name = func.__name__
18
17
 
19
18
  @functools.wraps(func)
20
19
  def wrapper_sync(*args: Any, **kwargs: Any) -> Any:
@@ -31,27 +30,29 @@ def trace(func: Callable[..., T]) -> Callable[..., T]:
31
30
  # We will also check if we are not initialized, It is not expected to be not initialized
32
31
  from ._internal.controllers import get_controller
33
32
 
34
- controller = await get_controller()
33
+ controller = get_controller()
35
34
  iface = NativeInterface.from_callable(func)
36
- info, ok = await controller.get_action_outputs(iface, func_name, *args, **kwargs)
35
+ info, ok = await controller.get_action_outputs(iface, func, *args, **kwargs)
37
36
  if ok:
37
+ logger.info(f"Found existing trace info for {func}, {info}")
38
38
  if info.output:
39
39
  return info.output
40
40
  elif info.error:
41
41
  raise info.error
42
+ else:
43
+ logger.debug(f"No existing trace info found for {func}, proceeding to execute.")
42
44
  start_time = time.time()
43
45
  try:
44
46
  # Cast to Awaitable to satisfy mypy
45
47
  coroutine_result = cast(Awaitable[Any], func(*args, **kwargs))
46
48
  results = await coroutine_result
47
- duration = time.time() - start_time
48
- info.add_outputs(results, timedelta(seconds=duration))
49
+ info.add_outputs(results, start_time=start_time, end_time=time.time())
49
50
  await controller.record_trace(info)
51
+ logger.debug(f"Finished trace for {func}, {info}")
50
52
  return results
51
53
  except Exception as e:
52
54
  # If there is an error, we need to record it
53
- duration = time.time() - start_time
54
- info.add_error(e, timedelta(seconds=duration))
55
+ info.add_error(e, start_time=start_time, end_time=time.time())
55
56
  await controller.record_trace(info)
56
57
  raise e
57
58
  else:
@@ -74,9 +75,9 @@ def trace(func: Callable[..., T]) -> Callable[..., T]:
74
75
  # We will also check if we are not initialized, It is not expected to be not initialized
75
76
  from ._internal.controllers import get_controller
76
77
 
77
- controller = await get_controller()
78
+ controller = get_controller()
78
79
  iface = NativeInterface.from_callable(func)
79
- info, ok = await controller.get_action_outputs(iface, func_name, *args, **kwargs)
80
+ info, ok = await controller.get_action_outputs(iface, func, *args, **kwargs)
80
81
  if ok:
81
82
  if info.output:
82
83
  for item in info.output:
@@ -88,25 +89,17 @@ def trace(func: Callable[..., T]) -> Callable[..., T]:
88
89
  items = []
89
90
  result = func(*args, **kwargs)
90
91
  # TODO ideally we should use streaming into the type-engine so that it stream uploads large blocks
91
- if inspect.isasyncgen(result):
92
+ if inspect.isasyncgen(result) or is_async_iterable(result):
92
93
  # If it's directly an async generator
93
94
  async_iter = result
94
95
  async for item in async_iter:
95
96
  items.append(item)
96
97
  yield item
97
- elif is_async_iterable(result):
98
- # If it's an async iterable (has __aiter__)
99
- async for item in result:
100
- items.append(item)
101
- yield item
102
- duration = time.time() - start_time
103
- info.add_outputs(items, timedelta(seconds=duration))
98
+ info.add_outputs(items, start_time=start_time, end_time=time.time())
104
99
  await controller.record_trace(info)
105
100
  return
106
101
  except Exception as e:
107
- end_time = time.time()
108
- duration = end_time - start_time
109
- info.add_error(e, timedelta(seconds=duration))
102
+ info.add_error(e, start_time=start_time, end_time=time.time())
110
103
  await controller.record_trace(info)
111
104
  raise e
112
105
  else:
@@ -118,10 +111,8 @@ def trace(func: Callable[..., T]) -> Callable[..., T]:
118
111
  # Choose the appropriate wrapper based on the function type
119
112
  if inspect.iscoroutinefunction(func):
120
113
  # This handles async functions that return normal values
121
- print(f"Coroutine function {func.__name__}")
122
114
  return cast(Callable[..., T], wrapper_async)
123
115
  elif inspect.isasyncgenfunction(func):
124
- print(f"Async generator function {func.__name__}")
125
116
  return cast(Callable[..., T], wrapper_async_iterator)
126
117
  else:
127
118
  # For regular sync functions