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.
- flyte/__init__.py +83 -30
- flyte/_bin/connect.py +61 -0
- flyte/_bin/debug.py +38 -0
- flyte/_bin/runtime.py +87 -19
- flyte/_bin/serve.py +351 -0
- flyte/_build.py +3 -2
- flyte/_cache/cache.py +6 -5
- flyte/_cache/local_cache.py +216 -0
- flyte/_code_bundle/_ignore.py +31 -5
- flyte/_code_bundle/_packaging.py +42 -11
- flyte/_code_bundle/_utils.py +57 -34
- flyte/_code_bundle/bundle.py +130 -27
- flyte/_constants.py +1 -0
- flyte/_context.py +21 -5
- flyte/_custom_context.py +73 -0
- flyte/_debug/constants.py +37 -0
- flyte/_debug/utils.py +17 -0
- flyte/_debug/vscode.py +315 -0
- flyte/_deploy.py +396 -75
- flyte/_deployer.py +109 -0
- flyte/_environment.py +94 -11
- flyte/_excepthook.py +37 -0
- flyte/_group.py +2 -1
- flyte/_hash.py +1 -16
- flyte/_image.py +544 -234
- flyte/_initialize.py +443 -294
- flyte/_interface.py +40 -5
- flyte/_internal/controllers/__init__.py +22 -8
- flyte/_internal/controllers/_local_controller.py +159 -35
- flyte/_internal/controllers/_trace.py +18 -10
- flyte/_internal/controllers/remote/__init__.py +38 -9
- flyte/_internal/controllers/remote/_action.py +82 -12
- flyte/_internal/controllers/remote/_client.py +6 -2
- flyte/_internal/controllers/remote/_controller.py +290 -64
- flyte/_internal/controllers/remote/_core.py +155 -95
- flyte/_internal/controllers/remote/_informer.py +40 -20
- flyte/_internal/controllers/remote/_service_protocol.py +2 -2
- flyte/_internal/imagebuild/__init__.py +2 -10
- flyte/_internal/imagebuild/docker_builder.py +391 -84
- flyte/_internal/imagebuild/image_builder.py +111 -55
- flyte/_internal/imagebuild/remote_builder.py +409 -0
- flyte/_internal/imagebuild/utils.py +79 -0
- flyte/_internal/resolvers/_app_env_module.py +92 -0
- flyte/_internal/resolvers/_task_module.py +5 -38
- flyte/_internal/resolvers/app_env.py +26 -0
- flyte/_internal/resolvers/common.py +8 -1
- flyte/_internal/resolvers/default.py +2 -2
- flyte/_internal/runtime/convert.py +322 -33
- flyte/_internal/runtime/entrypoints.py +106 -18
- flyte/_internal/runtime/io.py +71 -23
- flyte/_internal/runtime/resources_serde.py +21 -7
- flyte/_internal/runtime/reuse.py +125 -0
- flyte/_internal/runtime/rusty.py +196 -0
- flyte/_internal/runtime/task_serde.py +239 -66
- flyte/_internal/runtime/taskrunner.py +48 -8
- flyte/_internal/runtime/trigger_serde.py +162 -0
- flyte/_internal/runtime/types_serde.py +7 -16
- flyte/_keyring/file.py +115 -0
- flyte/_link.py +30 -0
- flyte/_logging.py +241 -42
- flyte/_map.py +312 -0
- flyte/_metrics.py +59 -0
- flyte/_module.py +74 -0
- flyte/_pod.py +30 -0
- flyte/_resources.py +296 -33
- flyte/_retry.py +1 -7
- flyte/_reusable_environment.py +72 -7
- flyte/_run.py +461 -132
- flyte/_secret.py +47 -11
- flyte/_serve.py +333 -0
- flyte/_task.py +245 -56
- flyte/_task_environment.py +219 -97
- flyte/_task_plugins.py +47 -0
- flyte/_tools.py +8 -8
- flyte/_trace.py +15 -24
- flyte/_trigger.py +1027 -0
- flyte/_utils/__init__.py +12 -1
- flyte/_utils/asyn.py +3 -1
- flyte/_utils/async_cache.py +139 -0
- flyte/_utils/coro_management.py +5 -4
- flyte/_utils/description_parser.py +19 -0
- flyte/_utils/docker_credentials.py +173 -0
- flyte/_utils/helpers.py +45 -19
- flyte/_utils/module_loader.py +123 -0
- flyte/_utils/org_discovery.py +57 -0
- flyte/_utils/uv_script_parser.py +8 -1
- flyte/_version.py +16 -3
- flyte/app/__init__.py +27 -0
- flyte/app/_app_environment.py +362 -0
- flyte/app/_connector_environment.py +40 -0
- flyte/app/_deploy.py +130 -0
- flyte/app/_parameter.py +343 -0
- flyte/app/_runtime/__init__.py +3 -0
- flyte/app/_runtime/app_serde.py +383 -0
- flyte/app/_types.py +113 -0
- flyte/app/extras/__init__.py +9 -0
- flyte/app/extras/_auth_middleware.py +217 -0
- flyte/app/extras/_fastapi.py +93 -0
- flyte/app/extras/_model_loader/__init__.py +3 -0
- flyte/app/extras/_model_loader/config.py +7 -0
- flyte/app/extras/_model_loader/loader.py +288 -0
- flyte/cli/__init__.py +12 -0
- flyte/cli/_abort.py +28 -0
- flyte/cli/_build.py +114 -0
- flyte/cli/_common.py +493 -0
- flyte/cli/_create.py +371 -0
- flyte/cli/_delete.py +45 -0
- flyte/cli/_deploy.py +401 -0
- flyte/cli/_gen.py +316 -0
- flyte/cli/_get.py +446 -0
- flyte/cli/_option.py +33 -0
- {union/_cli → flyte/cli}/_params.py +152 -153
- flyte/cli/_plugins.py +209 -0
- flyte/cli/_prefetch.py +292 -0
- flyte/cli/_run.py +690 -0
- flyte/cli/_serve.py +338 -0
- flyte/cli/_update.py +86 -0
- flyte/cli/_user.py +20 -0
- flyte/cli/main.py +246 -0
- flyte/config/__init__.py +3 -0
- flyte/config/_config.py +248 -0
- flyte/config/_internal.py +73 -0
- flyte/config/_reader.py +225 -0
- flyte/connectors/__init__.py +11 -0
- flyte/connectors/_connector.py +330 -0
- flyte/connectors/_server.py +194 -0
- flyte/connectors/utils.py +159 -0
- flyte/errors.py +134 -2
- flyte/extend.py +24 -0
- flyte/extras/_container.py +69 -56
- flyte/git/__init__.py +3 -0
- flyte/git/_config.py +279 -0
- flyte/io/__init__.py +8 -1
- flyte/io/{structured_dataset → _dataframe}/__init__.py +32 -30
- flyte/io/{structured_dataset → _dataframe}/basic_dfs.py +75 -68
- flyte/io/{structured_dataset/structured_dataset.py → _dataframe/dataframe.py} +207 -242
- flyte/io/_dir.py +575 -113
- flyte/io/_file.py +587 -141
- flyte/io/_hashing_io.py +342 -0
- flyte/io/extend.py +7 -0
- flyte/models.py +635 -0
- flyte/prefetch/__init__.py +22 -0
- flyte/prefetch/_hf_model.py +563 -0
- flyte/remote/__init__.py +14 -3
- flyte/remote/_action.py +879 -0
- flyte/remote/_app.py +346 -0
- flyte/remote/_auth_metadata.py +42 -0
- flyte/remote/_client/_protocols.py +62 -4
- flyte/remote/_client/auth/_auth_utils.py +19 -0
- flyte/remote/_client/auth/_authenticators/base.py +8 -2
- flyte/remote/_client/auth/_authenticators/device_code.py +4 -5
- flyte/remote/_client/auth/_authenticators/factory.py +4 -0
- flyte/remote/_client/auth/_authenticators/passthrough.py +79 -0
- flyte/remote/_client/auth/_authenticators/pkce.py +17 -18
- flyte/remote/_client/auth/_channel.py +47 -18
- flyte/remote/_client/auth/_client_config.py +5 -3
- flyte/remote/_client/auth/_keyring.py +15 -2
- flyte/remote/_client/auth/_token_client.py +3 -3
- flyte/remote/_client/controlplane.py +206 -18
- flyte/remote/_common.py +66 -0
- flyte/remote/_data.py +107 -22
- flyte/remote/_logs.py +116 -33
- flyte/remote/_project.py +21 -19
- flyte/remote/_run.py +164 -631
- flyte/remote/_secret.py +72 -29
- flyte/remote/_task.py +387 -46
- flyte/remote/_trigger.py +368 -0
- flyte/remote/_user.py +43 -0
- flyte/report/_report.py +10 -6
- flyte/storage/__init__.py +13 -1
- flyte/storage/_config.py +237 -0
- flyte/storage/_parallel_reader.py +289 -0
- flyte/storage/_storage.py +268 -59
- flyte/syncify/__init__.py +56 -0
- flyte/syncify/_api.py +414 -0
- flyte/types/__init__.py +39 -0
- flyte/types/_interface.py +22 -7
- flyte/{io/pickle/transformer.py → types/_pickle.py} +37 -9
- flyte/types/_string_literals.py +8 -9
- flyte/types/_type_engine.py +230 -129
- flyte/types/_utils.py +1 -1
- flyte-2.0.0b46.data/scripts/debug.py +38 -0
- flyte-2.0.0b46.data/scripts/runtime.py +194 -0
- flyte-2.0.0b46.dist-info/METADATA +352 -0
- flyte-2.0.0b46.dist-info/RECORD +221 -0
- flyte-2.0.0b46.dist-info/entry_points.txt +8 -0
- flyte-2.0.0b46.dist-info/licenses/LICENSE +201 -0
- flyte/_api_commons.py +0 -3
- flyte/_cli/_common.py +0 -287
- flyte/_cli/_create.py +0 -42
- flyte/_cli/_delete.py +0 -23
- flyte/_cli/_deploy.py +0 -140
- flyte/_cli/_get.py +0 -235
- flyte/_cli/_run.py +0 -152
- flyte/_cli/main.py +0 -72
- flyte/_datastructures.py +0 -342
- flyte/_internal/controllers/pbhash.py +0 -39
- flyte/_protos/common/authorization_pb2.py +0 -66
- flyte/_protos/common/authorization_pb2.pyi +0 -108
- flyte/_protos/common/authorization_pb2_grpc.py +0 -4
- flyte/_protos/common/identifier_pb2.py +0 -71
- flyte/_protos/common/identifier_pb2.pyi +0 -82
- flyte/_protos/common/identifier_pb2_grpc.py +0 -4
- flyte/_protos/common/identity_pb2.py +0 -48
- flyte/_protos/common/identity_pb2.pyi +0 -72
- flyte/_protos/common/identity_pb2_grpc.py +0 -4
- flyte/_protos/common/list_pb2.py +0 -36
- flyte/_protos/common/list_pb2.pyi +0 -69
- flyte/_protos/common/list_pb2_grpc.py +0 -4
- flyte/_protos/common/policy_pb2.py +0 -37
- flyte/_protos/common/policy_pb2.pyi +0 -27
- flyte/_protos/common/policy_pb2_grpc.py +0 -4
- flyte/_protos/common/role_pb2.py +0 -37
- flyte/_protos/common/role_pb2.pyi +0 -53
- flyte/_protos/common/role_pb2_grpc.py +0 -4
- flyte/_protos/common/runtime_version_pb2.py +0 -28
- flyte/_protos/common/runtime_version_pb2.pyi +0 -24
- flyte/_protos/common/runtime_version_pb2_grpc.py +0 -4
- flyte/_protos/logs/dataplane/payload_pb2.py +0 -96
- flyte/_protos/logs/dataplane/payload_pb2.pyi +0 -168
- flyte/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
- flyte/_protos/secret/definition_pb2.py +0 -49
- flyte/_protos/secret/definition_pb2.pyi +0 -93
- flyte/_protos/secret/definition_pb2_grpc.py +0 -4
- flyte/_protos/secret/payload_pb2.py +0 -62
- flyte/_protos/secret/payload_pb2.pyi +0 -94
- flyte/_protos/secret/payload_pb2_grpc.py +0 -4
- flyte/_protos/secret/secret_pb2.py +0 -38
- flyte/_protos/secret/secret_pb2.pyi +0 -6
- flyte/_protos/secret/secret_pb2_grpc.py +0 -198
- flyte/_protos/secret/secret_pb2_grpc_grpc.py +0 -198
- flyte/_protos/validate/validate/validate_pb2.py +0 -76
- flyte/_protos/workflow/node_execution_service_pb2.py +0 -26
- flyte/_protos/workflow/node_execution_service_pb2.pyi +0 -4
- flyte/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
- flyte/_protos/workflow/queue_service_pb2.py +0 -106
- flyte/_protos/workflow/queue_service_pb2.pyi +0 -141
- flyte/_protos/workflow/queue_service_pb2_grpc.py +0 -172
- flyte/_protos/workflow/run_definition_pb2.py +0 -128
- flyte/_protos/workflow/run_definition_pb2.pyi +0 -310
- flyte/_protos/workflow/run_definition_pb2_grpc.py +0 -4
- flyte/_protos/workflow/run_logs_service_pb2.py +0 -41
- flyte/_protos/workflow/run_logs_service_pb2.pyi +0 -28
- flyte/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
- flyte/_protos/workflow/run_service_pb2.py +0 -133
- flyte/_protos/workflow/run_service_pb2.pyi +0 -175
- flyte/_protos/workflow/run_service_pb2_grpc.py +0 -412
- flyte/_protos/workflow/state_service_pb2.py +0 -58
- flyte/_protos/workflow/state_service_pb2.pyi +0 -71
- flyte/_protos/workflow/state_service_pb2_grpc.py +0 -138
- flyte/_protos/workflow/task_definition_pb2.py +0 -72
- flyte/_protos/workflow/task_definition_pb2.pyi +0 -65
- flyte/_protos/workflow/task_definition_pb2_grpc.py +0 -4
- flyte/_protos/workflow/task_service_pb2.py +0 -44
- flyte/_protos/workflow/task_service_pb2.pyi +0 -31
- flyte/_protos/workflow/task_service_pb2_grpc.py +0 -104
- flyte/io/_dataframe.py +0 -0
- flyte/io/pickle/__init__.py +0 -0
- flyte/remote/_console.py +0 -18
- flyte-0.0.1b0.dist-info/METADATA +0 -179
- flyte-0.0.1b0.dist-info/RECORD +0 -390
- flyte-0.0.1b0.dist-info/entry_points.txt +0 -3
- union/__init__.py +0 -54
- union/_api_commons.py +0 -3
- union/_bin/__init__.py +0 -0
- union/_bin/runtime.py +0 -113
- union/_build.py +0 -25
- union/_cache/__init__.py +0 -12
- union/_cache/cache.py +0 -141
- union/_cache/defaults.py +0 -9
- union/_cache/policy_function_body.py +0 -42
- union/_cli/__init__.py +0 -0
- union/_cli/_common.py +0 -263
- union/_cli/_create.py +0 -40
- union/_cli/_delete.py +0 -23
- union/_cli/_deploy.py +0 -120
- union/_cli/_get.py +0 -162
- union/_cli/_run.py +0 -150
- union/_cli/main.py +0 -72
- union/_code_bundle/__init__.py +0 -8
- union/_code_bundle/_ignore.py +0 -113
- union/_code_bundle/_packaging.py +0 -187
- union/_code_bundle/_utils.py +0 -342
- union/_code_bundle/bundle.py +0 -176
- union/_context.py +0 -146
- union/_datastructures.py +0 -295
- union/_deploy.py +0 -185
- union/_doc.py +0 -29
- union/_docstring.py +0 -26
- union/_environment.py +0 -43
- union/_group.py +0 -31
- union/_hash.py +0 -23
- union/_image.py +0 -760
- union/_initialize.py +0 -585
- union/_interface.py +0 -84
- union/_internal/__init__.py +0 -3
- union/_internal/controllers/__init__.py +0 -77
- union/_internal/controllers/_local_controller.py +0 -77
- union/_internal/controllers/pbhash.py +0 -39
- union/_internal/controllers/remote/__init__.py +0 -40
- union/_internal/controllers/remote/_action.py +0 -131
- union/_internal/controllers/remote/_client.py +0 -43
- union/_internal/controllers/remote/_controller.py +0 -169
- union/_internal/controllers/remote/_core.py +0 -341
- union/_internal/controllers/remote/_informer.py +0 -260
- union/_internal/controllers/remote/_service_protocol.py +0 -44
- union/_internal/imagebuild/__init__.py +0 -11
- union/_internal/imagebuild/docker_builder.py +0 -416
- union/_internal/imagebuild/image_builder.py +0 -243
- union/_internal/imagebuild/remote_builder.py +0 -0
- union/_internal/resolvers/__init__.py +0 -0
- union/_internal/resolvers/_task_module.py +0 -31
- union/_internal/resolvers/common.py +0 -24
- union/_internal/resolvers/default.py +0 -27
- union/_internal/runtime/__init__.py +0 -0
- union/_internal/runtime/convert.py +0 -163
- union/_internal/runtime/entrypoints.py +0 -121
- union/_internal/runtime/io.py +0 -136
- union/_internal/runtime/resources_serde.py +0 -134
- union/_internal/runtime/task_serde.py +0 -202
- union/_internal/runtime/taskrunner.py +0 -179
- union/_internal/runtime/types_serde.py +0 -53
- union/_logging.py +0 -124
- union/_protos/__init__.py +0 -0
- union/_protos/common/authorization_pb2.py +0 -66
- union/_protos/common/authorization_pb2.pyi +0 -106
- union/_protos/common/authorization_pb2_grpc.py +0 -4
- union/_protos/common/identifier_pb2.py +0 -71
- union/_protos/common/identifier_pb2.pyi +0 -82
- union/_protos/common/identifier_pb2_grpc.py +0 -4
- union/_protos/common/identity_pb2.py +0 -48
- union/_protos/common/identity_pb2.pyi +0 -72
- union/_protos/common/identity_pb2_grpc.py +0 -4
- union/_protos/common/list_pb2.py +0 -36
- union/_protos/common/list_pb2.pyi +0 -69
- union/_protos/common/list_pb2_grpc.py +0 -4
- union/_protos/common/policy_pb2.py +0 -37
- union/_protos/common/policy_pb2.pyi +0 -27
- union/_protos/common/policy_pb2_grpc.py +0 -4
- union/_protos/common/role_pb2.py +0 -37
- union/_protos/common/role_pb2.pyi +0 -51
- union/_protos/common/role_pb2_grpc.py +0 -4
- union/_protos/common/runtime_version_pb2.py +0 -28
- union/_protos/common/runtime_version_pb2.pyi +0 -24
- union/_protos/common/runtime_version_pb2_grpc.py +0 -4
- union/_protos/logs/dataplane/payload_pb2.py +0 -96
- union/_protos/logs/dataplane/payload_pb2.pyi +0 -168
- union/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
- union/_protos/secret/definition_pb2.py +0 -49
- union/_protos/secret/definition_pb2.pyi +0 -93
- union/_protos/secret/definition_pb2_grpc.py +0 -4
- union/_protos/secret/payload_pb2.py +0 -62
- union/_protos/secret/payload_pb2.pyi +0 -94
- union/_protos/secret/payload_pb2_grpc.py +0 -4
- union/_protos/secret/secret_pb2.py +0 -38
- union/_protos/secret/secret_pb2.pyi +0 -6
- union/_protos/secret/secret_pb2_grpc.py +0 -198
- union/_protos/validate/validate/validate_pb2.py +0 -76
- union/_protos/workflow/node_execution_service_pb2.py +0 -26
- union/_protos/workflow/node_execution_service_pb2.pyi +0 -4
- union/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
- union/_protos/workflow/queue_service_pb2.py +0 -75
- union/_protos/workflow/queue_service_pb2.pyi +0 -103
- union/_protos/workflow/queue_service_pb2_grpc.py +0 -172
- union/_protos/workflow/run_definition_pb2.py +0 -100
- union/_protos/workflow/run_definition_pb2.pyi +0 -256
- union/_protos/workflow/run_definition_pb2_grpc.py +0 -4
- union/_protos/workflow/run_logs_service_pb2.py +0 -41
- union/_protos/workflow/run_logs_service_pb2.pyi +0 -28
- union/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
- union/_protos/workflow/run_service_pb2.py +0 -133
- union/_protos/workflow/run_service_pb2.pyi +0 -173
- union/_protos/workflow/run_service_pb2_grpc.py +0 -412
- union/_protos/workflow/state_service_pb2.py +0 -58
- union/_protos/workflow/state_service_pb2.pyi +0 -69
- union/_protos/workflow/state_service_pb2_grpc.py +0 -138
- union/_protos/workflow/task_definition_pb2.py +0 -72
- union/_protos/workflow/task_definition_pb2.pyi +0 -65
- union/_protos/workflow/task_definition_pb2_grpc.py +0 -4
- union/_protos/workflow/task_service_pb2.py +0 -44
- union/_protos/workflow/task_service_pb2.pyi +0 -31
- union/_protos/workflow/task_service_pb2_grpc.py +0 -104
- union/_resources.py +0 -226
- union/_retry.py +0 -32
- union/_reusable_environment.py +0 -25
- union/_run.py +0 -374
- union/_secret.py +0 -61
- union/_task.py +0 -354
- union/_task_environment.py +0 -186
- union/_timeout.py +0 -47
- union/_tools.py +0 -27
- union/_utils/__init__.py +0 -11
- union/_utils/asyn.py +0 -119
- union/_utils/file_handling.py +0 -71
- union/_utils/helpers.py +0 -46
- union/_utils/lazy_module.py +0 -54
- union/_utils/uv_script_parser.py +0 -49
- union/_version.py +0 -21
- union/connectors/__init__.py +0 -0
- union/errors.py +0 -128
- union/extras/__init__.py +0 -5
- union/extras/_container.py +0 -263
- union/io/__init__.py +0 -11
- union/io/_dataframe.py +0 -0
- union/io/_dir.py +0 -425
- union/io/_file.py +0 -418
- union/io/pickle/__init__.py +0 -0
- union/io/pickle/transformer.py +0 -117
- union/io/structured_dataset/__init__.py +0 -122
- union/io/structured_dataset/basic_dfs.py +0 -219
- union/io/structured_dataset/structured_dataset.py +0 -1057
- union/py.typed +0 -0
- union/remote/__init__.py +0 -23
- union/remote/_client/__init__.py +0 -0
- union/remote/_client/_protocols.py +0 -129
- union/remote/_client/auth/__init__.py +0 -12
- union/remote/_client/auth/_authenticators/__init__.py +0 -0
- union/remote/_client/auth/_authenticators/base.py +0 -391
- union/remote/_client/auth/_authenticators/client_credentials.py +0 -73
- union/remote/_client/auth/_authenticators/device_code.py +0 -120
- union/remote/_client/auth/_authenticators/external_command.py +0 -77
- union/remote/_client/auth/_authenticators/factory.py +0 -200
- union/remote/_client/auth/_authenticators/pkce.py +0 -515
- union/remote/_client/auth/_channel.py +0 -184
- union/remote/_client/auth/_client_config.py +0 -83
- union/remote/_client/auth/_default_html.py +0 -32
- union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
- union/remote/_client/auth/_grpc_utils/auth_interceptor.py +0 -204
- union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +0 -144
- union/remote/_client/auth/_keyring.py +0 -154
- union/remote/_client/auth/_token_client.py +0 -258
- union/remote/_client/auth/errors.py +0 -16
- union/remote/_client/controlplane.py +0 -86
- union/remote/_data.py +0 -149
- union/remote/_logs.py +0 -74
- union/remote/_project.py +0 -86
- union/remote/_run.py +0 -820
- union/remote/_secret.py +0 -132
- union/remote/_task.py +0 -193
- union/report/__init__.py +0 -3
- union/report/_report.py +0 -178
- union/report/_template.html +0 -124
- union/storage/__init__.py +0 -24
- union/storage/_remote_fs.py +0 -34
- union/storage/_storage.py +0 -247
- union/storage/_utils.py +0 -5
- union/types/__init__.py +0 -11
- union/types/_renderer.py +0 -162
- union/types/_string_literals.py +0 -120
- union/types/_type_engine.py +0 -2131
- union/types/_utils.py +0 -80
- /flyte/{_cli → _debug}/__init__.py +0 -0
- /flyte/{_protos → _keyring}/__init__.py +0 -0
- {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/WHEEL +0 -0
- {flyte-0.0.1b0.dist-info → flyte-2.0.0b46.dist-info}/top_level.txt +0 -0
flyte/_task_environment.py
CHANGED
|
@@ -1,30 +1,41 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import inspect
|
|
4
4
|
import weakref
|
|
5
5
|
from dataclasses import dataclass, field, replace
|
|
6
6
|
from datetime import timedelta
|
|
7
|
-
from
|
|
8
|
-
|
|
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
|
|
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
|
|
59
|
+
:param env_vars: Environment variables to set for the environment.
|
|
49
60
|
:param secrets: Secrets to inject into the environment.
|
|
50
|
-
:param
|
|
51
|
-
also deployed. This is useful when you have a set of environments
|
|
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:
|
|
57
|
-
reusable:
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
98
|
-
cache:
|
|
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
|
-
|
|
103
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
123
|
-
|
|
124
|
-
task_name = self.name + "." +
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if not
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
140
|
-
|
|
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
|
-
|
|
150
|
-
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
|
-
|
|
293
|
+
@classmethod
|
|
294
|
+
def from_task(cls, name: str, *tasks: TaskTemplate) -> TaskEnvironment:
|
|
194
295
|
"""
|
|
195
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
|
17
|
+
def ipywidgets_check() -> bool:
|
|
21
18
|
"""
|
|
22
|
-
Check if the
|
|
23
|
-
:return
|
|
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
|
-
|
|
22
|
+
try:
|
|
23
|
+
import ipywidgets # noqa: F401
|
|
24
|
+
|
|
26
25
|
return True
|
|
27
|
-
|
|
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.
|
|
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 =
|
|
33
|
+
controller = get_controller()
|
|
35
34
|
iface = NativeInterface.from_callable(func)
|
|
36
|
-
info, ok = await controller.get_action_outputs(iface,
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
78
|
+
controller = get_controller()
|
|
78
79
|
iface = NativeInterface.from_callable(func)
|
|
79
|
-
info, ok = await controller.get_action_outputs(iface,
|
|
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
|
-
|
|
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
|
-
|
|
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
|