flyte 0.2.0b10__py3-none-any.whl → 0.2.0b11__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.

Potentially problematic release.


This version of flyte might be problematic. Click here for more details.

flyte/__init__.py CHANGED
@@ -25,6 +25,7 @@ __all__ = [
25
25
  "Device",
26
26
  "Environment",
27
27
  "Image",
28
+ "PodTemplate",
28
29
  "Resources",
29
30
  "RetryStrategy",
30
31
  "ReusePolicy",
@@ -53,6 +54,7 @@ from ._group import group
53
54
  from ._image import Image
54
55
  from ._initialize import init, init_from_config
55
56
  from ._map import map
57
+ from ._pod import PodTemplate
56
58
  from ._resources import GPU, TPU, Device, Resources
57
59
  from ._retry import RetryStrategy
58
60
  from ._reusable_environment import ReusePolicy
flyte/_bin/runtime.py CHANGED
@@ -76,13 +76,17 @@ def main(
76
76
  ):
77
77
  sys.path.insert(0, ".")
78
78
 
79
+ import flyte
79
80
  import flyte._utils as utils
80
81
  from flyte._initialize import initialize_in_cluster
81
82
  from flyte._internal.controllers import create_controller
82
83
  from flyte._internal.imagebuild.image_builder import ImageCache
83
84
  from flyte._internal.runtime.entrypoints import load_and_run_task
85
+ from flyte._logging import logger
84
86
  from flyte.models import ActionID, Checkpoints, CodeBundle, RawDataPath
85
87
 
88
+ logger.info(f"Initializing flyte runtime - version {flyte.__version__}")
89
+
86
90
  assert org, "Org is required for now"
87
91
  assert project, "Project is required"
88
92
  assert domain, "Domain is required"
@@ -98,15 +102,14 @@ def main(
98
102
  # This detection of api key is a hack for now.
99
103
  controller_kwargs: dict[str, Any] = {"insecure": False}
100
104
  if api_key := os.getenv(_UNION_EAGER_API_KEY_ENV_VAR):
101
- from flyte._logging import logger
102
-
103
- logger.warning(f"Using api key {api_key}")
105
+ logger.info("Using api key from environment")
104
106
  controller_kwargs["api_key"] = api_key
105
107
  else:
106
108
  ep = os.environ.get(ENDPOINT_OVERRIDE, "host.docker.internal:8090")
107
109
  controller_kwargs["endpoint"] = ep
108
110
  if "localhost" in ep or "docker" in ep:
109
111
  controller_kwargs["insecure"] = True
112
+ logger.debug(f"Using controller endpoint: {ep} with kwargs: {controller_kwargs}")
110
113
 
111
114
  bundle = CodeBundle(tgz=tgz, pkl=pkl, destination=dest, computed_version=version)
112
115
  initialize_in_cluster()
flyte/_initialize.py CHANGED
@@ -168,6 +168,8 @@ async def init(
168
168
  """
169
169
  from flyte._utils import get_cwd_editable_install
170
170
 
171
+ from ._utils.org_discovery import org_from_endpoint
172
+
171
173
  interactive_mode = ipython_check()
172
174
 
173
175
  initialize_logger(enable_rich=interactive_mode)
@@ -206,12 +208,14 @@ async def init(
206
208
  domain=domain,
207
209
  client=client,
208
210
  storage=storage,
209
- org=org,
211
+ org=org or org_from_endpoint(endpoint),
210
212
  )
211
213
 
212
214
 
213
215
  @syncify
214
- async def init_from_config(path_or_config: str | Config | None = None, root_dir: Path | None = None) -> None:
216
+ async def init_from_config(
217
+ path_or_config: str | Config | None = None, root_dir: Path | None = None, log_level: int | None = None
218
+ ) -> None:
215
219
  """
216
220
  Initialize the Flyte system using a configuration file or Config object. This method should be called before any
217
221
  other Flyte remote API methods are called. Thread-safe implementation.
@@ -221,6 +225,8 @@ async def init_from_config(path_or_config: str | Config | None = None, root_dir:
221
225
  files like config etc. For example if one uses the copy-style=="all", it is essential to determine the
222
226
  root directory for the current project. If not provided, it defaults to the editable install directory or
223
227
  if not available, the current working directory.
228
+ :param log_level: Optional logging level for the framework logger,
229
+ default is set using the default initialization policies
224
230
  :return: None
225
231
  """
226
232
  import flyte.config as config
@@ -228,6 +234,13 @@ async def init_from_config(path_or_config: str | Config | None = None, root_dir:
228
234
  cfg: config.Config
229
235
  if path_or_config is None or isinstance(path_or_config, str):
230
236
  # If a string is passed, treat it as a path to the config file
237
+ if path_or_config:
238
+ if not Path(path_or_config).exists():
239
+ raise InitializationError(
240
+ "ConfigFileNotFoundError",
241
+ "user",
242
+ f"Configuration file '{path_or_config}' does not exist., current working directory is {Path.cwd()}",
243
+ )
231
244
  if root_dir and path_or_config:
232
245
  cfg = config.auto(str(root_dir / path_or_config))
233
246
  else:
@@ -251,6 +264,7 @@ async def init_from_config(path_or_config: str | Config | None = None, root_dir:
251
264
  client_id=cfg.platform.client_id,
252
265
  client_credentials_secret=cfg.platform.client_credentials_secret,
253
266
  root_dir=root_dir,
267
+ log_level=log_level,
254
268
  )
255
269
 
256
270
 
@@ -162,6 +162,7 @@ class LocalController:
162
162
  action=action_id,
163
163
  interface=_interface,
164
164
  inputs_path=action_output_path,
165
+ name=_func.__name__,
165
166
  ),
166
167
  True,
167
168
  )
@@ -179,7 +180,7 @@ class LocalController:
179
180
 
180
181
  if info.interface.outputs and info.output:
181
182
  # If the result is not an AsyncGenerator, convert it directly
182
- converted_outputs = await convert.convert_from_native_to_outputs(info.output, info.interface)
183
+ converted_outputs = await convert.convert_from_native_to_outputs(info.output, info.interface, info.name)
183
184
  assert converted_outputs
184
185
  elif info.error:
185
186
  # If there is an error, convert it to a native error
@@ -18,6 +18,7 @@ class TraceInfo:
18
18
  duration: Optional[timedelta] = None
19
19
  output: Optional[Any] = None
20
20
  error: Optional[Exception] = None
21
+ name: str = ""
21
22
 
22
23
  def add_outputs(self, output: Any, duration: timedelta):
23
24
  """
@@ -130,7 +130,7 @@ class Action:
130
130
  """
131
131
  from flyte._logging import logger
132
132
 
133
- logger.info(f"In Action from_state {obj.action_id} {obj.phase} {obj.output_uri}")
133
+ logger.debug(f"In Action from_state {obj.action_id} {obj.phase} {obj.output_uri}")
134
134
  return cls(
135
135
  action_id=obj.action_id,
136
136
  parent_action_name=parent_action_name,
@@ -235,7 +235,7 @@ class Informer:
235
235
  await self._shared_queue.put(node)
236
236
  # hack to work in the absence of sentinel
237
237
  except asyncio.CancelledError:
238
- logger.warning(f"Watch cancelled: {self.name}")
238
+ logger.info(f"Watch cancelled: {self.name}")
239
239
  return
240
240
  except asyncio.TimeoutError as e:
241
241
  logger.error(f"Watch timeout: {self.name}", exc_info=e)
@@ -11,7 +11,7 @@ import flyte.errors
11
11
  import flyte.storage as storage
12
12
  from flyte._protos.workflow import run_definition_pb2, task_definition_pb2
13
13
  from flyte.models import ActionID, NativeInterface, TaskContext
14
- from flyte.types import TypeEngine
14
+ from flyte.types import TypeEngine, TypeTransformerFailedError
15
15
 
16
16
 
17
17
  @dataclass(frozen=True)
@@ -80,7 +80,7 @@ async def convert_from_native_to_inputs(interface: NativeInterface, *args, **kwa
80
80
  )
81
81
 
82
82
 
83
- async def convert_from_native_to_outputs(o: Any, interface: NativeInterface) -> Outputs:
83
+ async def convert_from_native_to_outputs(o: Any, interface: NativeInterface, task_name: str = "") -> Outputs:
84
84
  # Always make it a tuple even if it's just one item to simplify logic below
85
85
  if not isinstance(o, tuple):
86
86
  o = (o,)
@@ -90,8 +90,11 @@ async def convert_from_native_to_outputs(o: Any, interface: NativeInterface) ->
90
90
  )
91
91
  named = []
92
92
  for (output_name, python_type), v in zip(interface.outputs.items(), o):
93
- lit = await TypeEngine.to_literal(v, python_type, TypeEngine.to_literal_type(python_type))
94
- named.append(run_definition_pb2.NamedLiteral(name=output_name, value=lit))
93
+ try:
94
+ lit = await TypeEngine.to_literal(v, python_type, TypeEngine.to_literal_type(python_type))
95
+ named.append(run_definition_pb2.NamedLiteral(name=output_name, value=lit))
96
+ except TypeTransformerFailedError as e:
97
+ raise flyte.errors.RuntimeDataValidationError(output_name, e, task_name)
95
98
 
96
99
  return Outputs(proto_outputs=run_definition_pb2.Outputs(literals=named))
97
100
 
@@ -3,9 +3,11 @@ This module provides functionality to serialize and deserialize tasks to and fro
3
3
  It includes a Resolver interface for loading tasks, and functions to load classes and tasks.
4
4
  """
5
5
 
6
+ import copy
6
7
  import importlib
8
+ import typing
7
9
  from datetime import timedelta
8
- from typing import Optional, Type
10
+ from typing import Optional, Type, cast
9
11
 
10
12
  from flyteidl.core import identifier_pb2, literals_pb2, security_pb2, tasks_pb2
11
13
  from google.protobuf import duration_pb2, wrappers_pb2
@@ -13,6 +15,7 @@ from google.protobuf import duration_pb2, wrappers_pb2
13
15
  import flyte.errors
14
16
  from flyte._cache.cache import VersionParameters, cache_from_request
15
17
  from flyte._logging import logger
18
+ from flyte._pod import _PRIMARY_CONTAINER_NAME_FIELD, PodTemplate
16
19
  from flyte._protos.workflow import task_definition_pb2
17
20
  from flyte._secret import SecretRequest, secrets_from_request
18
21
  from flyte._task import AsyncFunctionTaskTemplate, TaskTemplate
@@ -121,17 +124,18 @@ def get_proto_task(task: TaskTemplate, serialize_context: SerializationContext)
121
124
  # if task.parent_env is None:
122
125
  # raise ValueError(f"Task {task.name} must have a parent environment")
123
126
 
124
- #
125
- # This pod will be incorrect when doing fast serialize
126
- #
127
- container = _get_urun_container(serialize_context, task)
127
+ # TODO Add support for SQL, extra_config, custom
128
+ extra_config: typing.Dict[str, str] = {}
129
+ custom = {} # type: ignore
128
130
 
129
- # TODO Add support for SQL, Pod, extra_config, custom
130
- pod = None
131
131
  sql = None
132
- # pod = task.get_k8s_pod(serialize_context)
133
- extra_config = {} # type: ignore
134
- custom = {} # type: ignore
132
+ if task.pod_template and not isinstance(task.pod_template, str):
133
+ container = None
134
+ pod = _get_k8s_pod(_get_urun_container(serialize_context, task), task.pod_template)
135
+ extra_config[_PRIMARY_CONTAINER_NAME_FIELD] = task.pod_template.primary_container_name
136
+ else:
137
+ container = _get_urun_container(serialize_context, task)
138
+ pod = None
135
139
 
136
140
  # -------------- CACHE HANDLING ----------------------
137
141
  task_cache = cache_from_request(task.cache)
@@ -210,6 +214,72 @@ def _get_urun_container(
210
214
  )
211
215
 
212
216
 
217
+ def _sanitize_resource_name(resource: tasks_pb2.Resources.ResourceEntry) -> str:
218
+ return tasks_pb2.Resources.ResourceName.Name(resource.name).lower().replace("_", "-")
219
+
220
+
221
+ def _get_k8s_pod(primary_container: tasks_pb2.Container, pod_template: PodTemplate) -> Optional[tasks_pb2.K8sPod]:
222
+ """
223
+ Get the K8sPod representation of the task template.
224
+ :param task: The task to convert.
225
+ :return: The K8sPod representation of the task template.
226
+ """
227
+ from kubernetes.client import ApiClient, V1PodSpec
228
+ from kubernetes.client.models import V1EnvVar, V1ResourceRequirements
229
+
230
+ pod_template = copy.deepcopy(pod_template)
231
+ containers = cast(V1PodSpec, pod_template.pod_spec).containers
232
+ primary_exists = False
233
+
234
+ for container in containers:
235
+ if container.name == pod_template.primary_container_name:
236
+ primary_exists = True
237
+ break
238
+
239
+ if not primary_exists:
240
+ raise ValueError(
241
+ "No primary container defined in the pod spec."
242
+ f" You must define a primary container with the name '{pod_template.primary_container_name}'."
243
+ )
244
+ final_containers = []
245
+
246
+ for container in containers:
247
+ # We overwrite the primary container attributes with the values given to ContainerTask.
248
+ # The attributes include: image, command, args, resource, and env (env is unioned)
249
+
250
+ if container.name == pod_template.primary_container_name:
251
+ if container.image is None:
252
+ # Copy the image from primary_container only if the image is not specified in the pod spec.
253
+ container.image = primary_container.image
254
+
255
+ container.command = list(primary_container.command)
256
+ container.args = list(primary_container.args)
257
+
258
+ limits, requests = {}, {}
259
+ for resource in primary_container.resources.limits:
260
+ limits[_sanitize_resource_name(resource)] = resource.value
261
+ for resource in primary_container.resources.requests:
262
+ requests[_sanitize_resource_name(resource)] = resource.value
263
+
264
+ resource_requirements = V1ResourceRequirements(limits=limits, requests=requests)
265
+ if len(limits) > 0 or len(requests) > 0:
266
+ # Important! Only copy over resource requirements if they are non-empty.
267
+ container.resources = resource_requirements
268
+
269
+ if primary_container.env is not None:
270
+ container.env = [V1EnvVar(name=e.key, value=e.value) for e in primary_container.env] + (
271
+ container.env or []
272
+ )
273
+
274
+ final_containers.append(container)
275
+
276
+ cast(V1PodSpec, pod_template.pod_spec).containers = final_containers
277
+ pod_spec = ApiClient().sanitize_for_serialization(pod_template.pod_spec)
278
+
279
+ metadata = tasks_pb2.K8sObjectMetadata(labels=pod_template.labels, annotations=pod_template.annotations)
280
+ return tasks_pb2.K8sPod(pod_spec=pod_spec, metadata=metadata)
281
+
282
+
213
283
  def extract_code_bundle(task_spec: task_definition_pb2.TaskSpec) -> Optional[CodeBundle]:
214
284
  """
215
285
  Extract the code bundle from the task spec.
@@ -145,7 +145,7 @@ async def convert_and_run(
145
145
  return None, convert_from_native_to_error(err)
146
146
  if task.report:
147
147
  await flyte.report.flush.aio()
148
- return await convert_from_native_to_outputs(out, task.native_interface), None
148
+ return await convert_from_native_to_outputs(out, task.native_interface, task.name), None
149
149
 
150
150
 
151
151
  async def extract_download_run_upload(
flyte/_logging.py CHANGED
@@ -6,7 +6,7 @@ from typing import Optional
6
6
 
7
7
  from ._tools import ipython_check, is_in_cluster
8
8
 
9
- DEFAULT_LOG_LEVEL = logging.INFO
9
+ DEFAULT_LOG_LEVEL = logging.WARNING
10
10
 
11
11
 
12
12
  def is_rich_logging_disabled() -> bool:
flyte/_pod.py ADDED
@@ -0,0 +1,19 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import TYPE_CHECKING, Dict, Optional
3
+
4
+ if TYPE_CHECKING:
5
+ from kubernetes.client import V1PodSpec
6
+
7
+
8
+ _PRIMARY_CONTAINER_NAME_FIELD = "primary_container_name"
9
+ _PRIMARY_CONTAINER_DEFAULT_NAME = "primary"
10
+
11
+
12
+ @dataclass(init=True, repr=True, eq=True, frozen=False)
13
+ class PodTemplate(object):
14
+ """Custom PodTemplate specification for a Task."""
15
+
16
+ pod_spec: Optional["V1PodSpec"] = field(default_factory=lambda: V1PodSpec())
17
+ primary_container_name: str = _PRIMARY_CONTAINER_DEFAULT_NAME
18
+ labels: Optional[Dict[str, str]] = None
19
+ annotations: Optional[Dict[str, str]] = None
flyte/_task.py CHANGED
@@ -23,6 +23,7 @@ from typing import (
23
23
 
24
24
  from flyteidl.core.tasks_pb2 import DataLoadingConfig
25
25
 
26
+ from flyte._pod import PodTemplate
26
27
  from flyte.errors import RuntimeSystemError, RuntimeUserError
27
28
 
28
29
  from ._cache import Cache, CacheRequest
@@ -37,8 +38,6 @@ from ._timeout import TimeoutType
37
38
  from .models import NativeInterface, SerializationContext
38
39
 
39
40
  if TYPE_CHECKING:
40
- from kubernetes.client import V1PodTemplate
41
-
42
41
  from ._task_environment import TaskEnvironment
43
42
 
44
43
  P = ParamSpec("P") # capture the function's parameters
@@ -96,8 +95,7 @@ class TaskTemplate(Generic[P, R]):
96
95
  env: Optional[Dict[str, str]] = None
97
96
  secrets: Optional[SecretRequest] = None
98
97
  timeout: Optional[TimeoutType] = None
99
- primary_container_name: str = "primary"
100
- pod_template: Optional[Union[str, V1PodTemplate]] = None
98
+ pod_template: Optional[Union[str, PodTemplate]] = None
101
99
  report: bool = False
102
100
 
103
101
  parent_env: Optional[weakref.ReferenceType[TaskEnvironment]] = None
@@ -108,15 +106,6 @@ class TaskTemplate(Generic[P, R]):
108
106
  _call_as_synchronous: bool = False
109
107
 
110
108
  def __post_init__(self):
111
- # If pod_template is set to a pod, verify
112
- if self.pod_template is not None and not isinstance(self.pod_template, str):
113
- try:
114
- from kubernetes.client import V1PodTemplate # noqa: F401
115
- except ImportError as e:
116
- raise ImportError(
117
- "kubernetes is not installed, please install kubernetes package to use pod_template"
118
- ) from e
119
-
120
109
  # Auto set the image based on the image request
121
110
  if self.image == "auto":
122
111
  self.image = Image.auto()
@@ -0,0 +1,31 @@
1
+ def hostname_from_url(url: str) -> str:
2
+ """Parse a URL and return the hostname part."""
3
+
4
+ # Handle dns:/// format specifically (gRPC convention)
5
+ if url.startswith("dns:///"):
6
+ return url[7:] # Skip the "dns:///" prefix
7
+
8
+ # Handle standard URL formats
9
+ import urllib.parse
10
+
11
+ parsed = urllib.parse.urlparse(url)
12
+ return parsed.netloc or parsed.path.lstrip("/").rsplit("/")[0]
13
+
14
+
15
+ def org_from_endpoint(endpoint: str | None) -> str | None:
16
+ """
17
+ Extracts the organization from the endpoint URL. The organization is assumed to be the first part of the domain.
18
+ This is temporary until we have a proper organization discovery mechanism through APIs.
19
+
20
+ :param endpoint: The endpoint URL
21
+ :return: The organization name or None if not found
22
+ """
23
+ if not endpoint:
24
+ return None
25
+
26
+ hostname = hostname_from_url(endpoint)
27
+ domain_parts = hostname.split(".")
28
+ if len(domain_parts) > 2:
29
+ # Assuming the organization is the first part of the domain
30
+ return domain_parts[0]
31
+ return None
flyte/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.2.0b10'
21
- __version_tuple__ = version_tuple = (0, 2, 0, 'b10')
20
+ __version__ = version = '0.2.0b11'
21
+ __version_tuple__ = version_tuple = (0, 2, 0, 'b11')
flyte/cli/_common.py CHANGED
@@ -78,7 +78,7 @@ class CLIConfig:
78
78
  log_level: int | None = logging.ERROR
79
79
  endpoint: str | None = None
80
80
  insecure: bool = False
81
- org_override: str | None = None
81
+ org: str | None = None
82
82
 
83
83
  def replace(self, **kwargs) -> CLIConfig:
84
84
  """
@@ -90,7 +90,7 @@ class CLIConfig:
90
90
  from flyte.config._config import TaskConfig
91
91
 
92
92
  task_cfg = TaskConfig(
93
- org=self.org_override or self.config.task.org,
93
+ org=self.org or self.config.task.org,
94
94
  project=project or self.config.task.project,
95
95
  domain=domain or self.config.task.domain,
96
96
  )
flyte/cli/_create.py CHANGED
@@ -86,11 +86,9 @@ def secret(
86
86
  default=False,
87
87
  help="Force overwrite of the configuration file if it already exists.",
88
88
  show_default=True,
89
- prompt="Are you sure you want to overwrite the configuration file?",
90
- confirmation_prompt=True,
91
89
  )
92
90
  def config(
93
- output: Path,
91
+ output: str,
94
92
  endpoint: str | None = None,
95
93
  insecure: bool = False,
96
94
  org: str | None = None,
@@ -105,8 +103,13 @@ def config(
105
103
  """
106
104
  import yaml
107
105
 
108
- if output.exists() and not force:
109
- raise click.BadParameter(f"Output file {output} already exists. Use --force to overwrite.")
106
+ output_path = Path(output)
107
+
108
+ if output_path.exists() and not force:
109
+ force = click.confirm(f"Overwrite [{output_path}]?", default=False)
110
+ if not force:
111
+ click.echo(f"Will not overwrite the existing config file at {output_path}")
112
+ return
110
113
 
111
114
  admin: Dict[str, Any] = {}
112
115
  if endpoint:
@@ -114,6 +117,11 @@ def config(
114
117
  if insecure:
115
118
  admin["insecure"] = insecure
116
119
 
120
+ if not org and endpoint:
121
+ from flyte._utils.org_discovery import org_from_endpoint
122
+
123
+ org = org_from_endpoint(endpoint)
124
+
117
125
  task: Dict[str, str] = {}
118
126
  if org:
119
127
  task["org"] = org
@@ -125,7 +133,7 @@ def config(
125
133
  if not admin and not task:
126
134
  raise click.BadParameter("At least one of --endpoint or --org must be provided.")
127
135
 
128
- with open(output, "w") as f:
136
+ with open(output_path, "w") as f:
129
137
  d: Dict[str, Any] = {}
130
138
  if admin:
131
139
  d["admin"] = admin
@@ -133,4 +141,4 @@ def config(
133
141
  d["task"] = task
134
142
  yaml.dump(d, f)
135
143
 
136
- click.echo(f"Config file created at {output}")
144
+ click.echo(f"Config file written to {output_path}")
flyte/cli/_params.py CHANGED
@@ -110,7 +110,7 @@ class FileParamType(click.ParamType):
110
110
  p = pathlib.Path(value)
111
111
  if not p.exists() or not p.is_file():
112
112
  raise click.BadParameter(f"parameter should be a valid file path, {value}")
113
- return File(path=value)
113
+ return File.from_existing_remote(value)
114
114
 
115
115
 
116
116
  class PickleParamType(click.ParamType):
flyte/cli/_run.py CHANGED
@@ -97,7 +97,7 @@ class RunTaskCommand(click.Command):
97
97
  if obj is None:
98
98
  import flyte.config
99
99
 
100
- obj = CLIConfig(flyte.config.auto())
100
+ obj = CLIConfig(flyte.config.auto(), ctx)
101
101
 
102
102
  if not self.run_args.local:
103
103
  assert obj.endpoint, "CLI Config should have an endpoint"
flyte/cli/main.py CHANGED
@@ -146,15 +146,11 @@ def main(
146
146
  cfg = config.auto(config_file=config_file)
147
147
  logger.debug(f"Using config file discovered at location {cfg.source}")
148
148
 
149
- final_insecure = cfg.platform.insecure
150
- if insecure is not None:
151
- final_insecure = insecure
152
-
153
149
  ctx.obj = CLIConfig(
154
150
  log_level=log_level,
155
- endpoint=endpoint or cfg.platform.endpoint,
156
- insecure=final_insecure,
157
- org_override=org or cfg.task.org,
151
+ endpoint=endpoint,
152
+ insecure=insecure,
153
+ org=org,
158
154
  config=cfg,
159
155
  ctx=ctx,
160
156
  )
flyte/errors.py CHANGED
@@ -150,3 +150,14 @@ class LogsNotYetAvailableError(BaseRuntimeError):
150
150
 
151
151
  def __init__(self, message: str):
152
152
  super().__init__("LogsNotYetAvailable", "system", message, None)
153
+
154
+
155
+ class RuntimeDataValidationError(RuntimeUserError):
156
+ """
157
+ This error is raised when the user tries to access a resource that does not exist or is invalid.
158
+ """
159
+
160
+ def __init__(self, var: str, e: Exception, task_name: str = ""):
161
+ super().__init__(
162
+ "DataValiationError", f"In task {task_name} variable {var}, failed to serialize/deserialize because {e}"
163
+ )
@@ -9,8 +9,6 @@ from flyte._logging import logger
9
9
  from flyte._task import TaskTemplate
10
10
  from flyte.models import NativeInterface, SerializationContext
11
11
 
12
- _PRIMARY_CONTAINER_NAME_FIELD = "primary_container_name"
13
-
14
12
 
15
13
  def _extract_command_key(cmd: str, **kwargs) -> List[Any] | None:
16
14
  """
@@ -263,8 +261,3 @@ class ContainerTask(TaskTemplate):
263
261
 
264
262
  def container_args(self, sctx: SerializationContext) -> List[str]:
265
263
  return self._cmd + (self._args if self._args else [])
266
-
267
- def config(self, sctx: SerializationContext) -> Dict[str, str]:
268
- if self.pod_template is None:
269
- return {}
270
- return {_PRIMARY_CONTAINER_NAME_FIELD: self.primary_container_name}
flyte/remote/_data.py CHANGED
@@ -100,7 +100,8 @@ async def _upload_single_file(
100
100
  if put_resp.status_code != 200:
101
101
  raise RuntimeSystemError(
102
102
  "UploadFailed",
103
- f"Failed to upload {fp} to {resp.signed_url}, status code: {put_resp.status_code}",
103
+ f"Failed to upload {fp} to {resp.signed_url}, status code: {put_resp.status_code}, "
104
+ f"response: {put_resp.text}",
104
105
  )
105
106
  # TODO in old code we did this
106
107
  # if self._config.platform.insecure_skip_verify is True
@@ -1207,7 +1207,9 @@ class TypeEngine(typing.Generic[T]):
1207
1207
  python_type = type_hints.get(k, type(d[k]))
1208
1208
  e: BaseException = literal_map[k].exception() # type: ignore
1209
1209
  if isinstance(e, TypeError):
1210
- raise TypeError(f"Error converting: {type(v)}, {python_type}, received_value {v}")
1210
+ raise TypeError(
1211
+ f"Error converting: Var:{k}, type:{type(v)}, into:{python_type}, received_value {v}"
1212
+ )
1211
1213
  else:
1212
1214
  raise e
1213
1215
  literal_map[k] = v.result()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flyte
3
- Version: 0.2.0b10
3
+ Version: 0.2.0b11
4
4
  Summary: Add your description here
5
5
  Author-email: Ketan Umare <kumare3@users.noreply.github.com>
6
6
  Requires-Python: >=3.10
@@ -1,4 +1,4 @@
1
- flyte/__init__.py,sha256=QzKbvypcEAJCF7g8oqpIZhpQfYOsqz6hEvT2OwK0IAc,1415
1
+ flyte/__init__.py,sha256=e8-Obt_5OZDdC5Riznft0Y4ctQMYkYYO1UU7Z6EirLA,1464
2
2
  flyte/_build.py,sha256=MkgfLAPeL56YeVrGRNZUCZgbwzlEzVP3wLbl5Qru4yk,578
3
3
  flyte/_context.py,sha256=K0-TCt-_pHOoE5Xni87_8uIe2vCBOhfNQEtjGT4Hu4k,5239
4
4
  flyte/_deploy.py,sha256=NApDDNQRGauhZP_eBYUnVSQilooSLpmmHQNhqNa5jmk,8034
@@ -8,26 +8,27 @@ flyte/_environment.py,sha256=BkChtdVhWB3SwMSvetDZ-KiNBgRFlAXgq69PHT4zyG0,2942
8
8
  flyte/_group.py,sha256=7o1j16sZyUmYB50mOiq1ui4TBAKhRpDqLakV8Ya1kw4,803
9
9
  flyte/_hash.py,sha256=Of_Zl_DzzzF2jp4ZsLm-3o-xJFCCJ8_GubmLI1htx78,504
10
10
  flyte/_image.py,sha256=NeBvjCdwFAVGd666ufi1q-YOvhwdTEzAeJl5YBfl0bI,29043
11
- flyte/_initialize.py,sha256=N7q2n22iHSWmOB86ZLfgMd1En_XU6dz3OusB-t5nUwg,17073
11
+ flyte/_initialize.py,sha256=oVLiidNRATEdDouzppaG2W_NYRok-YuNBjA7xlGpRAY,17696
12
12
  flyte/_interface.py,sha256=MP5o_qpIwfBNtAc7zo_cLSjMugsPyanuO6EgUSk4fBE,3644
13
- flyte/_logging.py,sha256=FQvF3W1kkFypbARcOQ7WZVXO0XJasXp8EhozF6E6-aQ,3379
13
+ flyte/_logging.py,sha256=n3pi1cE_oqA03vQHlqSxexXcjRhCsZg1ODvUSoWlwk4,3382
14
14
  flyte/_map.py,sha256=efPd8O-JKUg1OY3_MzU3KGbhsGYDVRNBwWr0ceNIXhQ,7444
15
+ flyte/_pod.py,sha256=lNaQuWX22QG6Xji7-8GpuKUkqCmVFaRxOVU-eUEa-Vk,637
15
16
  flyte/_resources.py,sha256=UOLyEVhdxolvrHhddiBbYdJuE1RkM_l7xeS9G1abe6M,7583
16
17
  flyte/_retry.py,sha256=rfLv0MvWxzPByKESTglEmjPsytEAKiIvvmzlJxXwsfE,941
17
18
  flyte/_reusable_environment.py,sha256=P4FBATVKAYcIKpdFN98sI8acPyKy8eIGx6V0kUb9YdM,1289
18
19
  flyte/_run.py,sha256=ePlFrABDR0ud_qxY55Nk4eATDialHGHsxNdTiVWYQkw,19919
19
20
  flyte/_secret.py,sha256=SqIHs6mi8hEkIIBZe3bI9jJsPt65Mt6dV5uh9_op1ME,2392
20
- flyte/_task.py,sha256=Gq34LbELz5dIc4dvYjgRXyzAnBvs8ED3iU1FWVuAFRE,18391
21
+ flyte/_task.py,sha256=AHxg4lqHfExdSU6adwPiFzAT2EtrLI8mBdRxTUL1RgA,17902
21
22
  flyte/_task_environment.py,sha256=J1LFH9Zz1nPhlsrc_rYny1SS3QC1b55X7tRYoTG7Vk4,6815
22
23
  flyte/_timeout.py,sha256=zx5sFcbYmjJAJbZWSGzzX-BpC9HC7Jfs35T7vVhKwkk,1571
23
24
  flyte/_tools.py,sha256=JewkQZBR_M85tS6QY8e4xXue75jbOE48nID4ZHnc9jY,632
24
25
  flyte/_trace.py,sha256=7OQtQNosIlycTwaMjdc3GW4h3T3N0bYTsY6og4clPl8,5234
25
- flyte/_version.py,sha256=mlXpANdUuYfy0QPXXxhosF8MwMVypx0OlvhibSGO2P8,521
26
- flyte/errors.py,sha256=m2JUNqLC6anVW6UiDK_ihuA06q_Hkw1mIUMDskb2OW8,4289
26
+ flyte/_version.py,sha256=D4lhYrgx59XZRRry4jkbv6B5ZVzqyxGy7BrlDWwfBR0,521
27
+ flyte/errors.py,sha256=lJgSiZb2nZnuTZqBEB9rg-bV_GXVAYNjQFRuKWQskyY,4683
27
28
  flyte/models.py,sha256=A85HnTLqInJiMmQKhpl2IXb2Uh6_46tdRrwW2TTzD9o,12908
28
29
  flyte/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
30
  flyte/_bin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- flyte/_bin/runtime.py,sha256=Q1vajoQ913KUfCQSP0u8Qoj-AYgfvU2i2wI19ydqnDw,4849
31
+ flyte/_bin/runtime.py,sha256=D6iFiVkOh3toKpBoJ_X9S1SeBDrEVGumSiqOrMhZG70,5032
31
32
  flyte/_cache/__init__.py,sha256=zhdO5UuHQRdzn8GHmSN40nrxfAmI4ihDRuHZM11U84Y,305
32
33
  flyte/_cache/cache.py,sha256=ErhWzzJdEjTIuEF4f-r6IBgko-3Al9iUs1Eq4O42TUE,5021
33
34
  flyte/_cache/defaults.py,sha256=gzJZW0QJPUfd2OPnGpv3tzIfwPtgFjAKoie3NP1P97U,217
@@ -39,14 +40,14 @@ flyte/_code_bundle/_utils.py,sha256=b0s3ZVKSRwaa_2CMTCqt2iRrUvTTW3FmlyqCD9k5BS0,
39
40
  flyte/_code_bundle/bundle.py,sha256=8T0gcXck6dmg-8L2-0G3B2iNjC-Xwydu806iyKneMMY,8789
40
41
  flyte/_internal/__init__.py,sha256=vjXgGzAAjy609YFkAy9_RVPuUlslsHSJBXCLNTVnqOY,136
41
42
  flyte/_internal/controllers/__init__.py,sha256=5CBnS9lb1VFMzZuRXUiaPhlN3G9qh7Aq9kTwxW5hsRw,4301
42
- flyte/_internal/controllers/_local_controller.py,sha256=LDwVxwm365L6-OEpwo5FcWe6abxK8L1231Hf54pYLZ8,7076
43
- flyte/_internal/controllers/_trace.py,sha256=Ga2b65sn9q2IoOwHBZV2inMYyO6-CSDwzN7E3pDxsEI,1126
43
+ flyte/_internal/controllers/_local_controller.py,sha256=Wpgtd50C_ovIHpQSZC6asQc7iKyKIraEf-MAHCwcNJI,7124
44
+ flyte/_internal/controllers/_trace.py,sha256=biI-lXSIe3gXuWI-KT6T-jTtojQCQ7BLOHTCG3J6MQc,1145
44
45
  flyte/_internal/controllers/remote/__init__.py,sha256=9_azH1eHLqY6VULpDugXi7Kf1kK1ODqEnsQ_3wM6IqU,1919
45
- flyte/_internal/controllers/remote/_action.py,sha256=w6vE1vPz1BwxvwfotDWjTNbDXfGEPrRBA8N3UVQ6P0w,4905
46
+ flyte/_internal/controllers/remote/_action.py,sha256=5V26eE1ggtf95M8l_3wBRGrtbQ1DkOD_ePRT2bppMGM,4906
46
47
  flyte/_internal/controllers/remote/_client.py,sha256=HPbzbfaWZVv5wpOvKNtFXR6COiZDwd1cUJQqi60A7oU,1421
47
48
  flyte/_internal/controllers/remote/_controller.py,sha256=IbCRMTbQrNz96zjSZo2KHDmB0nW3dwT8VlWLu4zElGQ,19462
48
49
  flyte/_internal/controllers/remote/_core.py,sha256=2dka1rDnA8Ui_qhfE1ymZuN8E2BYQPn123h_eMixSiM,18091
49
- flyte/_internal/controllers/remote/_informer.py,sha256=JC35aHbEdwBN7cwDKbQj6koPUypTapYyK0wKxOBRBCo,14191
50
+ flyte/_internal/controllers/remote/_informer.py,sha256=StiPcQLLW0h36uEBhKsupMY79EeFCKA3QQzvv2IyvRo,14188
50
51
  flyte/_internal/controllers/remote/_service_protocol.py,sha256=B9qbIg6DiGeac-iSccLmX_AL2xUgX4ezNUOiAbSy4V0,1357
51
52
  flyte/_internal/imagebuild/__init__.py,sha256=cLXVxkAyFpbdC1y-k3Rb6FRW9f_xpoRQWVn__G9IqKs,354
52
53
  flyte/_internal/imagebuild/docker_builder.py,sha256=bkr2fs9jInTq8jqU8ka7NGvp0RPfYhbTfX1RqtqTvvs,13986
@@ -57,12 +58,12 @@ flyte/_internal/resolvers/_task_module.py,sha256=jwy1QYygUK7xmpCZLt1SPTfJCkfox3C
57
58
  flyte/_internal/resolvers/common.py,sha256=ADQLRoyGsJ4vuUkitffMGrMKKjy0vpk6X53g4FuKDLc,993
58
59
  flyte/_internal/resolvers/default.py,sha256=nX4DHUYod1nRvEsl_vSgutQVEdExu2xL8pRkyi4VWbY,981
59
60
  flyte/_internal/runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- flyte/_internal/runtime/convert.py,sha256=ThvyrR4EnuNu6i1rhgeKy259UMpbn_tmFY7YCBDNlh4,9122
61
+ flyte/_internal/runtime/convert.py,sha256=0ttgaC8GrRkM2nXuG0K-7Kcg6nFsKWC9BG2LSEzgWzM,9325
61
62
  flyte/_internal/runtime/entrypoints.py,sha256=Kyi19i7LYk7YM3ZV_Y4FXGt5Pc1tIftGkIDohopblyY,5127
62
63
  flyte/_internal/runtime/io.py,sha256=Lgdy4iPjlKjUO-V_AkoPZff6lywaFjZUG-PErRukmx4,4248
63
64
  flyte/_internal/runtime/resources_serde.py,sha256=tvMMv3l6cZEt_cfs7zVE_Kqs5qh-_r7fsEPxb6xMxMk,4812
64
- flyte/_internal/runtime/task_serde.py,sha256=985eItmPsnA17CQdRXknjVDBK8wzOx4956AUuVjLsM8,9772
65
- flyte/_internal/runtime/taskrunner.py,sha256=74rnpABxEjqA7ZWxGZ1bXNU3rRT8Ba2utkuKXVpTwY4,7321
65
+ flyte/_internal/runtime/task_serde.py,sha256=wN7lsusEUuEQE4-jPh0f_sTFZisH76o1VlMMXHC7etI,13012
66
+ flyte/_internal/runtime/taskrunner.py,sha256=rHWS4t5qgZnzGdGrs0_O0sSs_PVGoE1CNPDb-fTwwmo,7332
66
67
  flyte/_internal/runtime/types_serde.py,sha256=EjRh9Yypx9-20XXQprtNgp766LeQVRoYWtY6XPGMZQg,1813
67
68
  flyte/_protos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
69
  flyte/_protos/common/authorization_pb2.py,sha256=6G7CAfq_Vq1qrm8JFkAnMAj0AaEipiX7MkjA7nk91-M,6707
@@ -134,25 +135,26 @@ flyte/_utils/coro_management.py,sha256=_JTt9x9fOc_1OSe03DSheYoKOvlonBB_4WNCS9XSa
134
135
  flyte/_utils/file_handling.py,sha256=iU4TxW--fCho_Eg5xTMODn96P03SxzF-V-5f-7bZAZY,2233
135
136
  flyte/_utils/helpers.py,sha256=45ZC2OSNKS66DkTvif8W8x7MH4KxluvAyn0a92mKRqM,4366
136
137
  flyte/_utils/lazy_module.py,sha256=fvXPjvZLzCfcI8Vzs4pKedUDdY0U_RQ1ZVrp9b8qBQY,1994
138
+ flyte/_utils/org_discovery.py,sha256=80TAUg2VUGvUZtTOPlPpEYnNqJANdv_J-i41NjP9NrY,1055
137
139
  flyte/_utils/uv_script_parser.py,sha256=PxqD8lSMi6xv0uDd1s8LKB2IPZr4ttZJCUweqlyMTKk,1483
138
140
  flyte/cli/__init__.py,sha256=M02O-UGqQlA8JJ_jyWRiwQhTNc5CJJ7x9J7fNxTxBT0,52
139
141
  flyte/cli/_abort.py,sha256=lTftDmVXEIrFz1XAASCqWbXQEQDqRdTCJqY7izk2USI,593
140
- flyte/cli/_common.py,sha256=dwZ5OPz3x8-8uVtMiV1HpqA1MaoBJZH8yBON-axFSZs,10795
141
- flyte/cli/_create.py,sha256=DFdNemGqNVdlgDxcIqMmZJBF1zPtAHeWO1XeT2caEPs,4087
142
+ flyte/cli/_common.py,sha256=CPGQlEvQZ8-MWEw9C610ti-s55HYvLYl313MFvI0eWY,10777
143
+ flyte/cli/_create.py,sha256=GO_7qEOW1udDuHnZWTUMPqDyVLW_K2RKT-d3Qswpf6s,4273
142
144
  flyte/cli/_delete.py,sha256=qq5A9d6vXdYvYz-SECXiC6LU5rAzahNTZKiKacOtcZ4,545
143
145
  flyte/cli/_deploy.py,sha256=owGe_RVwC73p3dOPWYSo442OVuZyagF8LKTvC57xubQ,4466
144
146
  flyte/cli/_gen.py,sha256=vlE5l8UR1zz4RSdaRyUfYFvGR0TLxGcTYcP4dhA3Pvg,5458
145
147
  flyte/cli/_get.py,sha256=Pl9nHVHzRQT8IG3k_VAMJ2Xvaq9URsovm96op_153os,9843
146
- flyte/cli/_params.py,sha256=fs6fNBRGYXZMmjjcySi3U1O_pQNgCnW9ko89KCcS6nU,19450
147
- flyte/cli/_run.py,sha256=zRu4DTO__BVsLgpSLUbYR1Twvzc_2zivUhcviymCRf0,7884
148
- flyte/cli/main.py,sha256=PJUQ6slm1CcwIfeP6pbJKlPuyOqXxb_K8PjnZb8sbhw,4450
148
+ flyte/cli/_params.py,sha256=cDeTvjOQP8EydVJUrncLeAxUaHvGorJyDvMSrAxapmM,19466
149
+ flyte/cli/_run.py,sha256=dkuf6PfmizFU1-RWX_9TsTcGuUNDpjY7f6ok90nZ2iM,7889
150
+ flyte/cli/main.py,sha256=P5a0Q4pKVKnc9QMdbdfp9I5ReGVykVCN-cUy0gURpLI,4287
149
151
  flyte/config/__init__.py,sha256=MiwEYK5Iv7MRR22z61nzbsbvZ9Q6MdmAU_g9If1Pmb8,144
150
152
  flyte/config/_config.py,sha256=QE3T0W8xOULjJaqDMdMF90f9gFVjGR6h8QPOLsyqjYw,9831
151
153
  flyte/config/_internal.py,sha256=Bj0uzn3PYgxKbzM-q2GKXxp7Y6cyzhPzUB-Y2i6cQKo,2836
152
154
  flyte/config/_reader.py,sha256=c16jm0_IYxwEAjXENtllLeO_sT5Eg2RNLG4UjnAv_x4,7157
153
155
  flyte/connectors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
156
  flyte/extras/__init__.py,sha256=FhB0uK7H1Yo5De9vOuF7UGnezTKncj3u2Wo5uQdWN0g,74
155
- flyte/extras/_container.py,sha256=kMrYPmfnDFxPmFhI9cZeoBKzQ96jMCO4l4FpwV1b0PA,11202
157
+ flyte/extras/_container.py,sha256=7fg43UScXevb9QdiyZLyf0xFrL5L3GkPvUWKQLl4R98,10939
156
158
  flyte/io/__init__.py,sha256=F7hlpin_1JJjsdFZSn7_jQgltPzsjETX1DCYGz-ELqI,629
157
159
  flyte/io/_dir.py,sha256=rih9CY1YjNX05bcAu5LG62Xoyij5GXAlv7jLyVF0je8,15310
158
160
  flyte/io/_file.py,sha256=kp5700SKPy5htmMhm4hE2ybb99Ykny1b0Kwm3huCWXs,15572
@@ -161,7 +163,7 @@ flyte/io/_structured_dataset/basic_dfs.py,sha256=77aYFrFigPC7cjM6UjCbU26REtXmwIB
161
163
  flyte/io/_structured_dataset/structured_dataset.py,sha256=ddRjz36RhNxIy0gakzdLStBzoo4cAOgXbNqiqt5YhMI,52645
162
164
  flyte/remote/__init__.py,sha256=zBWV88VF-L8430xVrOyk07EmLsOKhOUMVBsqFUDtO6Q,565
163
165
  flyte/remote/_console.py,sha256=avmELJPx8nQMAVPrHlh6jEIRPjrMwFpdZjJsWOOa9rE,660
164
- flyte/remote/_data.py,sha256=DPK85gB6M71RjxqIh1Q5PdZ9xcJ0m1w_3cT2lAO0r7w,5795
166
+ flyte/remote/_data.py,sha256=B5nMF_o_ePRuG-V4IrTXctXXYn7uEJqUNs_5unX-2fo,5846
165
167
  flyte/remote/_logs.py,sha256=EOXg4OS8yYclsT6NASgOLMo0TA2sZpKb2MWZXpWBPuI,6404
166
168
  flyte/remote/_project.py,sha256=dTBYqORDAbLvh9WnPO1Ytuzw2vxNYZwwNsKE2_b0o14,2807
167
169
  flyte/remote/_run.py,sha256=9euHjYRX-xyxXuhn0MunYb9dmgl0FMU3a-FZNjJA4F8,31057
@@ -203,10 +205,10 @@ flyte/types/_interface.py,sha256=mY7mb8v2hJPGk7AU99gdOWl4_jArA1VFtjYGlE31SK0,953
203
205
  flyte/types/_pickle.py,sha256=PjdR66OTDMZ3OYq6GvM_Ua0cIo5t2XQaIjmpJ9xo4Ys,4050
204
206
  flyte/types/_renderer.py,sha256=ygcCo5l60lHufyQISFddZfWwLlQ8kJAKxUT_XnR_6dY,4818
205
207
  flyte/types/_string_literals.py,sha256=NlG1xV8RSA-sZ-n-IFQCAsdB6jXJOAKkHWtnopxVVDk,4231
206
- flyte/types/_type_engine.py,sha256=3PiRPYtE0UmEpTfwwcFWaiVmG1XOfXQl3Pj4v2zClNk,93602
208
+ flyte/types/_type_engine.py,sha256=oX906WSQ-e8E1X1vwdMcqiQi2fUUFY9A4wVZZf2yoaw,93667
207
209
  flyte/types/_utils.py,sha256=pbts9E1_2LTdLygAY0UYTLYJ8AsN3BZyviSXvrtcutc,2626
208
- flyte-0.2.0b10.dist-info/METADATA,sha256=XALFwwiy3iCSCTVj80DPGhfL8gfPIVUOsyAMmbpNzac,4811
209
- flyte-0.2.0b10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
210
- flyte-0.2.0b10.dist-info/entry_points.txt,sha256=MIq2z5dBurdCJfpXfMKzgBv7sJOakKRYxr8G0cMiTrg,75
211
- flyte-0.2.0b10.dist-info/top_level.txt,sha256=7dkyFbikvA12LEZEqawx8oDG1CMod6hTliPj7iWzgYo,6
212
- flyte-0.2.0b10.dist-info/RECORD,,
210
+ flyte-0.2.0b11.dist-info/METADATA,sha256=a3P-yCWvVVslOcR357eSJVKR4WzzebAZCQKcinxd78A,4811
211
+ flyte-0.2.0b11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
212
+ flyte-0.2.0b11.dist-info/entry_points.txt,sha256=MIq2z5dBurdCJfpXfMKzgBv7sJOakKRYxr8G0cMiTrg,75
213
+ flyte-0.2.0b11.dist-info/top_level.txt,sha256=7dkyFbikvA12LEZEqawx8oDG1CMod6hTliPj7iWzgYo,6
214
+ flyte-0.2.0b11.dist-info/RECORD,,