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/app/_parameter.py
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
5
|
+
import typing
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from functools import cache, cached_property
|
|
8
|
+
from typing import TYPE_CHECKING, List, Literal, Optional
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel, model_validator
|
|
11
|
+
|
|
12
|
+
import flyte.io
|
|
13
|
+
from flyte._initialize import requires_initialization
|
|
14
|
+
from flyte._logging import logger
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from flyte.remote._task import AutoVersioning
|
|
18
|
+
else:
|
|
19
|
+
AutoVersioning = Literal["latest", "current"]
|
|
20
|
+
|
|
21
|
+
ParameterTypes = str | flyte.io.File | flyte.io.Dir
|
|
22
|
+
_SerializedParameterType = Literal["string", "file", "directory"]
|
|
23
|
+
|
|
24
|
+
PARAMETER_TYPE_MAP = {
|
|
25
|
+
str: "string",
|
|
26
|
+
flyte.io.File: "file",
|
|
27
|
+
flyte.io.Dir: "directory",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
RUNTIME_PARAMETERS_FILE = "flyte-parameters.json"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class _DelayedValue(BaseModel):
|
|
34
|
+
"""
|
|
35
|
+
Delayed value for app parameters.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
type: _SerializedParameterType
|
|
39
|
+
|
|
40
|
+
@model_validator(mode="before")
|
|
41
|
+
@classmethod
|
|
42
|
+
def check_type(cls, data: typing.Any) -> typing.Any:
|
|
43
|
+
if "type" in data:
|
|
44
|
+
data["type"] = PARAMETER_TYPE_MAP.get(data["type"], data["type"])
|
|
45
|
+
return data
|
|
46
|
+
|
|
47
|
+
async def get(self) -> str | flyte.io.File | flyte.io.Dir:
|
|
48
|
+
value = await self.materialize()
|
|
49
|
+
assert isinstance(value, (str, flyte.io.File, flyte.io.Dir)), (
|
|
50
|
+
f"Materialized value must be a string, file or directory, found {type(value)}"
|
|
51
|
+
)
|
|
52
|
+
if isinstance(value, (flyte.io.File, flyte.io.Dir)):
|
|
53
|
+
return value
|
|
54
|
+
return value
|
|
55
|
+
|
|
56
|
+
async def materialize(self) -> ParameterTypes:
|
|
57
|
+
raise NotImplementedError("Subclasses must implement this method")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class RunOutput(_DelayedValue):
|
|
61
|
+
"""
|
|
62
|
+
Use a run's output for app parameters.
|
|
63
|
+
|
|
64
|
+
This enables the declaration of an app parameter dependency on the output of
|
|
65
|
+
a run, given by a specific run name, or a task name and version. If
|
|
66
|
+
`task_auto_version == 'latest'`, the latest version of the task will be used.
|
|
67
|
+
If `task_auto_version == 'current'`, the version will be derived from the callee
|
|
68
|
+
app or task context. To get the latest task run for ephemeral task runs, set
|
|
69
|
+
`task_version` and `task_auto_version` should both be set to `None` (which is the default).
|
|
70
|
+
|
|
71
|
+
Examples:
|
|
72
|
+
|
|
73
|
+
Get the output of a specific run:
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
run_output = RunOutput(type="directory", run_name="my-run-123")
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Get the latest output of an ephemeral task run:
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
run_output = RunOutput(type="file", task_name="env.my_task")
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Get the latest output of a deployed task run:
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
run_output = RunOutput(type="file", task_name="env.my_task", task_auto_version="latest")
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Get the output of a specific task run:
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
run_output = RunOutput(type="file", task_name="env.my_task", task_version="xyz")
|
|
95
|
+
```
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
run_name: str | None = None
|
|
99
|
+
task_name: str | None = None
|
|
100
|
+
task_version: str | None = None
|
|
101
|
+
task_auto_version: AutoVersioning | None = None
|
|
102
|
+
getter: tuple[typing.Any, ...] = (0,)
|
|
103
|
+
|
|
104
|
+
def __post_init__(self):
|
|
105
|
+
if self.run_name is None and self.task_name is None:
|
|
106
|
+
raise ValueError("Either run_name or task_name must be provided")
|
|
107
|
+
if self.run_name is not None and self.task_name is not None:
|
|
108
|
+
raise ValueError("Only one of run_name or task_name must be provided")
|
|
109
|
+
|
|
110
|
+
@requires_initialization
|
|
111
|
+
async def materialize(self) -> ParameterTypes:
|
|
112
|
+
if self.run_name is not None:
|
|
113
|
+
return await self._materialize_with_run_name()
|
|
114
|
+
elif self.task_name is not None:
|
|
115
|
+
return await self._materialize_with_task_name()
|
|
116
|
+
else:
|
|
117
|
+
raise ValueError("Either run_name or task_name must be provided")
|
|
118
|
+
|
|
119
|
+
async def _materialize_with_task_name(self) -> ParameterTypes:
|
|
120
|
+
import flyte.errors
|
|
121
|
+
from flyte.remote import Run, RunDetails, Task, TaskDetails
|
|
122
|
+
|
|
123
|
+
assert self.task_name is not None, "task_name must be provided"
|
|
124
|
+
if self.task_auto_version is not None:
|
|
125
|
+
task_details: TaskDetails = await Task.get(
|
|
126
|
+
self.task_name, version=self.task_version, auto_version=self.task_auto_version
|
|
127
|
+
).fetch.aio()
|
|
128
|
+
task_version = task_details.version
|
|
129
|
+
elif self.task_version is not None:
|
|
130
|
+
task_version = self.task_version
|
|
131
|
+
else:
|
|
132
|
+
task_version = None
|
|
133
|
+
|
|
134
|
+
runs = Run.listall.aio(
|
|
135
|
+
in_phase=("succeeded",),
|
|
136
|
+
task_name=self.task_name,
|
|
137
|
+
task_version=task_version,
|
|
138
|
+
limit=1,
|
|
139
|
+
sort_by=("created_at", "desc"),
|
|
140
|
+
)
|
|
141
|
+
try:
|
|
142
|
+
run = await anext(runs)
|
|
143
|
+
run_details: RunDetails = await run.details.aio()
|
|
144
|
+
output = await run_details.outputs()
|
|
145
|
+
for getter in self.getter:
|
|
146
|
+
output = output[getter]
|
|
147
|
+
logger.debug("Materialized output: %s", output)
|
|
148
|
+
return typing.cast(ParameterTypes, output)
|
|
149
|
+
except StopAsyncIteration:
|
|
150
|
+
raise flyte.errors.ParameterMaterializationError(f"No runs found for task {self.task_name}")
|
|
151
|
+
except Exception as e:
|
|
152
|
+
raise flyte.errors.ParameterMaterializationError(
|
|
153
|
+
f"Failed to materialize output for task {self.task_name}"
|
|
154
|
+
) from e
|
|
155
|
+
|
|
156
|
+
async def _materialize_with_run_name(self) -> ParameterTypes:
|
|
157
|
+
from flyte.remote import Run, RunDetails
|
|
158
|
+
|
|
159
|
+
run: Run = await Run.get.aio(self.run_name)
|
|
160
|
+
run_details: RunDetails = await run.details.aio()
|
|
161
|
+
output = await run_details.outputs()
|
|
162
|
+
for getter in self.getter:
|
|
163
|
+
output = output[getter]
|
|
164
|
+
return typing.cast(ParameterTypes, output)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class AppEndpoint(_DelayedValue):
|
|
168
|
+
"""
|
|
169
|
+
Embed an upstream app's endpoint as an app parameter.
|
|
170
|
+
|
|
171
|
+
This enables the declaration of an app parameter dependency on a the endpoint of
|
|
172
|
+
an upstream app, given by a specific app name. This gives the app access to
|
|
173
|
+
the upstream app's endpoint as a public or private url.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
app_name: str
|
|
177
|
+
public: bool = False
|
|
178
|
+
type: Literal["string"] = "string"
|
|
179
|
+
|
|
180
|
+
@requires_initialization
|
|
181
|
+
async def materialize(self) -> str:
|
|
182
|
+
from flyte.app._app_environment import INTERNAL_APP_ENDPOINT_PATTERN_ENV_VAR
|
|
183
|
+
|
|
184
|
+
if self.public:
|
|
185
|
+
from flyte.remote import App
|
|
186
|
+
|
|
187
|
+
app = App.get(self.app_name)
|
|
188
|
+
return app.endpoint
|
|
189
|
+
|
|
190
|
+
endpoint_pattern = os.getenv(INTERNAL_APP_ENDPOINT_PATTERN_ENV_VAR)
|
|
191
|
+
if endpoint_pattern is not None:
|
|
192
|
+
return endpoint_pattern.format(app_fqdn=self.app_name)
|
|
193
|
+
|
|
194
|
+
raise ValueError(
|
|
195
|
+
f"Environment variable {INTERNAL_APP_ENDPOINT_PATTERN_ENV_VAR} is not set to create a private url."
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
@dataclass
|
|
200
|
+
class Parameter:
|
|
201
|
+
"""
|
|
202
|
+
Parameter for application.
|
|
203
|
+
|
|
204
|
+
:param name: Name of parameter.
|
|
205
|
+
:param value: Value for parameter.
|
|
206
|
+
:param env_var: Environment name to set the value in the serving environment.
|
|
207
|
+
:param download: When True, the parameter will be automatically downloaded. This
|
|
208
|
+
only works if the value refers to an item in a object store. i.e. `s3://...`
|
|
209
|
+
:param mount: If `value` is a directory, then the directory will be available
|
|
210
|
+
at `mount`. If `value` is a file, then the file will be downloaded into the
|
|
211
|
+
`mount` directory.
|
|
212
|
+
:param ignore_patterns: If `value` is a directory, then this is a list of glob
|
|
213
|
+
patterns to ignore.
|
|
214
|
+
"""
|
|
215
|
+
|
|
216
|
+
name: str
|
|
217
|
+
value: ParameterTypes | _DelayedValue
|
|
218
|
+
env_var: Optional[str] = None
|
|
219
|
+
download: bool = False
|
|
220
|
+
mount: Optional[str] = None
|
|
221
|
+
ignore_patterns: list[str] = field(default_factory=list)
|
|
222
|
+
|
|
223
|
+
def __post_init__(self):
|
|
224
|
+
import flyte.io
|
|
225
|
+
|
|
226
|
+
env_name_re = re.compile("^[_a-zA-Z][_a-zA-Z0-9]*$")
|
|
227
|
+
|
|
228
|
+
if self.env_var is not None and env_name_re.match(self.env_var) is None:
|
|
229
|
+
raise ValueError(f"env_var ({self.env_var}) is not a valid environment name for shells")
|
|
230
|
+
|
|
231
|
+
if self.value and not isinstance(self.value, (str, flyte.io.File, flyte.io.Dir, RunOutput, AppEndpoint)):
|
|
232
|
+
raise TypeError(
|
|
233
|
+
f"Expected value to be of type str, file, dir, RunOutput or AppEndpoint, got {type(self.value)}"
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
if self.name is None:
|
|
237
|
+
self.name = "i0"
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
class SerializableParameter(BaseModel):
|
|
241
|
+
"""
|
|
242
|
+
Serializable version of Parameter.
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
name: str
|
|
246
|
+
value: str
|
|
247
|
+
download: bool
|
|
248
|
+
type: _SerializedParameterType = "string"
|
|
249
|
+
env_var: Optional[str] = None
|
|
250
|
+
dest: Optional[str] = None
|
|
251
|
+
ignore_patterns: List[str] = field(default_factory=list)
|
|
252
|
+
|
|
253
|
+
@classmethod
|
|
254
|
+
def from_parameter(cls, param: Parameter) -> "SerializableParameter":
|
|
255
|
+
import flyte.io
|
|
256
|
+
|
|
257
|
+
# param.name is guaranteed to be set by Parameter.__post_init__
|
|
258
|
+
assert param.name is not None, "Parameter name should be set by __post_init__"
|
|
259
|
+
|
|
260
|
+
tpe: _SerializedParameterType = "string"
|
|
261
|
+
if isinstance(param.value, flyte.io.File):
|
|
262
|
+
value = param.value.path
|
|
263
|
+
tpe = "file"
|
|
264
|
+
download = True if param.mount is not None else param.download
|
|
265
|
+
elif isinstance(param.value, flyte.io.Dir):
|
|
266
|
+
value = param.value.path
|
|
267
|
+
tpe = "directory"
|
|
268
|
+
download = True if param.mount is not None else param.download
|
|
269
|
+
elif isinstance(param.value, (RunOutput, AppEndpoint)):
|
|
270
|
+
value = param.value.model_dump_json()
|
|
271
|
+
tpe = param.value.type
|
|
272
|
+
download = True if param.mount is not None else param.download
|
|
273
|
+
else:
|
|
274
|
+
value = typing.cast(str, param.value)
|
|
275
|
+
download = False
|
|
276
|
+
|
|
277
|
+
return cls(
|
|
278
|
+
name=param.name,
|
|
279
|
+
value=value,
|
|
280
|
+
type=tpe,
|
|
281
|
+
download=download,
|
|
282
|
+
env_var=param.env_var,
|
|
283
|
+
dest=param.mount,
|
|
284
|
+
ignore_patterns=param.ignore_patterns,
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class SerializableParameterCollection(BaseModel):
|
|
289
|
+
"""
|
|
290
|
+
Collection of parameters for application.
|
|
291
|
+
|
|
292
|
+
:param parameters: List of parameters.
|
|
293
|
+
"""
|
|
294
|
+
|
|
295
|
+
parameters: List[SerializableParameter] = field(default_factory=list)
|
|
296
|
+
|
|
297
|
+
@cached_property
|
|
298
|
+
def to_transport(self) -> str:
|
|
299
|
+
import base64
|
|
300
|
+
import gzip
|
|
301
|
+
from io import BytesIO
|
|
302
|
+
|
|
303
|
+
json_str = self.model_dump_json()
|
|
304
|
+
buf = BytesIO()
|
|
305
|
+
with gzip.GzipFile(mode="wb", fileobj=buf, mtime=0) as f:
|
|
306
|
+
f.write(json_str.encode("utf-8"))
|
|
307
|
+
return base64.b64encode(buf.getvalue()).decode("utf-8")
|
|
308
|
+
|
|
309
|
+
@classmethod
|
|
310
|
+
def from_transport(cls, s: str) -> SerializableParameterCollection:
|
|
311
|
+
import base64
|
|
312
|
+
import gzip
|
|
313
|
+
|
|
314
|
+
compressed_val = base64.b64decode(s.encode("utf-8"))
|
|
315
|
+
json_str = gzip.decompress(compressed_val).decode("utf-8")
|
|
316
|
+
return cls.model_validate_json(json_str)
|
|
317
|
+
|
|
318
|
+
@classmethod
|
|
319
|
+
def from_parameters(cls, parameters: List[Parameter]) -> SerializableParameterCollection:
|
|
320
|
+
return cls(parameters=[SerializableParameter.from_parameter(param) for param in parameters])
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
@cache
|
|
324
|
+
def _load_parameters() -> dict[str, str]:
|
|
325
|
+
"""Load parameters for application or endpoint."""
|
|
326
|
+
import json
|
|
327
|
+
import os
|
|
328
|
+
|
|
329
|
+
config_file = os.getenv(RUNTIME_PARAMETERS_FILE)
|
|
330
|
+
|
|
331
|
+
if config_file is None:
|
|
332
|
+
raise ValueError("Parameters are not mounted")
|
|
333
|
+
|
|
334
|
+
with open(config_file, "r") as f:
|
|
335
|
+
parameters = json.load(f)
|
|
336
|
+
|
|
337
|
+
return parameters
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def get_parameter(name: str) -> str:
|
|
341
|
+
"""Get parameters for application or endpoint."""
|
|
342
|
+
parameters = _load_parameters()
|
|
343
|
+
return parameters[name]
|