flyte 2.0.0b19__py3-none-any.whl → 2.0.0b20__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.

@@ -54,7 +54,5 @@ def create_remote_controller(
54
54
 
55
55
  controller = RemoteController(
56
56
  client_coro=client_coro,
57
- workers=10,
58
- max_system_retries=5,
59
57
  )
60
58
  return controller
@@ -117,9 +117,8 @@ class RemoteController(Controller):
117
117
  def __init__(
118
118
  self,
119
119
  client_coro: Awaitable[ClientSet],
120
- workers: int,
121
- max_system_retries: int,
122
- default_parent_concurrency: int = 100,
120
+ workers: int = 20,
121
+ max_system_retries: int = 10,
123
122
  ):
124
123
  """ """
125
124
  super().__init__(
@@ -127,6 +126,7 @@ class RemoteController(Controller):
127
126
  workers=workers,
128
127
  max_system_retries=max_system_retries,
129
128
  )
129
+ default_parent_concurrency = int(os.getenv("_F_P_CNC", "100"))
130
130
  self._default_parent_concurrency = default_parent_concurrency
131
131
  self._parent_action_semaphore: DefaultDict[str, asyncio.Semaphore] = defaultdict(
132
132
  lambda: asyncio.Semaphore(default_parent_concurrency)
@@ -1,12 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import os
4
5
  import sys
5
6
  import threading
6
7
  from asyncio import Event
7
8
  from typing import Awaitable, Coroutine, Optional
8
9
 
9
10
  import grpc.aio
11
+ from aiolimiter import AsyncLimiter
10
12
  from google.protobuf.wrappers_pb2 import StringValue
11
13
 
12
14
  import flyte.errors
@@ -32,10 +34,10 @@ class Controller:
32
34
  def __init__(
33
35
  self,
34
36
  client_coro: Awaitable[ClientSet],
35
- workers: int = 2,
36
- max_system_retries: int = 5,
37
+ workers: int = 20,
38
+ max_system_retries: int = 10,
37
39
  resource_log_interval_sec: float = 10.0,
38
- min_backoff_on_err_sec: float = 0.1,
40
+ min_backoff_on_err_sec: float = 0.5,
39
41
  thread_wait_timeout_sec: float = 5.0,
40
42
  enqueue_timeout_sec: float = 5.0,
41
43
  ):
@@ -53,14 +55,17 @@ class Controller:
53
55
  self._running = False
54
56
  self._resource_log_task = None
55
57
  self._workers = workers
56
- self._max_retries = max_system_retries
58
+ self._max_retries = int(os.getenv("_F_MAX_RETRIES", max_system_retries))
57
59
  self._resource_log_interval = resource_log_interval_sec
58
60
  self._min_backoff_on_err = min_backoff_on_err_sec
61
+ self._max_backoff_on_err = float(os.getenv("_F_MAX_BFF_ON_ERR", "10.0"))
59
62
  self._thread_wait_timeout = thread_wait_timeout_sec
60
63
  self._client_coro = client_coro
61
64
  self._failure_event: Event | None = None
62
65
  self._enqueue_timeout = enqueue_timeout_sec
63
66
  self._informer_start_wait_timeout = thread_wait_timeout_sec
67
+ max_qps = int(os.getenv("_F_MAX_QPS", "100"))
68
+ self._rate_limiter = AsyncLimiter(max_qps, 1.0)
64
69
 
65
70
  # Thread management
66
71
  self._thread = None
@@ -194,15 +199,16 @@ class Controller:
194
199
  # We will wait for this to signal that the thread is ready
195
200
  # Signal the main thread that we're ready
196
201
  logger.debug("Background thread initialization complete")
197
- self._thread_ready.set()
198
202
  if sys.version_info >= (3, 11):
199
203
  async with asyncio.TaskGroup() as tg:
200
204
  for i in range(self._workers):
201
- tg.create_task(self._bg_run())
205
+ tg.create_task(self._bg_run(f"worker-{i}"))
206
+ self._thread_ready.set()
202
207
  else:
203
208
  tasks = []
204
209
  for i in range(self._workers):
205
- tasks.append(asyncio.create_task(self._bg_run()))
210
+ tasks.append(asyncio.create_task(self._bg_run(f"worker-{i}")))
211
+ self._thread_ready.set()
206
212
  await asyncio.gather(*tasks)
207
213
 
208
214
  def _bg_thread_target(self):
@@ -221,6 +227,7 @@ class Controller:
221
227
  except Exception as e:
222
228
  logger.error(f"Controller thread encountered an exception: {e}")
223
229
  self._set_exception(e)
230
+ self._failure_event.set()
224
231
  finally:
225
232
  if self._loop and self._loop.is_running():
226
233
  self._loop.close()
@@ -292,21 +299,22 @@ class Controller:
292
299
  started = action.is_started()
293
300
  action.mark_cancelled()
294
301
  if started:
295
- logger.info(f"Cancelling action: {action.name}")
296
- try:
297
- # TODO add support when the queue service supports aborting actions
298
- # await self._queue_service.AbortQueuedAction(
299
- # queue_service_pb2.AbortQueuedActionRequest(action_id=action.action_id),
300
- # wait_for_ready=True,
301
- # )
302
- logger.info(f"Successfully cancelled action: {action.name}")
303
- except grpc.aio.AioRpcError as e:
304
- if e.code() in [
305
- grpc.StatusCode.NOT_FOUND,
306
- grpc.StatusCode.FAILED_PRECONDITION,
307
- ]:
308
- logger.info(f"Action {action.name} not found, assumed completed or cancelled.")
309
- return
302
+ async with self._rate_limiter:
303
+ logger.info(f"Cancelling action: {action.name}")
304
+ try:
305
+ # TODO add support when the queue service supports aborting actions
306
+ # await self._queue_service.AbortQueuedAction(
307
+ # queue_service_pb2.AbortQueuedActionRequest(action_id=action.action_id),
308
+ # wait_for_ready=True,
309
+ # )
310
+ logger.info(f"Successfully cancelled action: {action.name}")
311
+ except grpc.aio.AioRpcError as e:
312
+ if e.code() in [
313
+ grpc.StatusCode.NOT_FOUND,
314
+ grpc.StatusCode.FAILED_PRECONDITION,
315
+ ]:
316
+ logger.info(f"Action {action.name} not found, assumed completed or cancelled.")
317
+ return
310
318
  else:
311
319
  # If the action is not started, we have to ensure it does not get launched
312
320
  logger.info(f"Action {action.name} is not started, no need to cancel.")
@@ -320,56 +328,69 @@ class Controller:
320
328
  Attempt to launch an action.
321
329
  """
322
330
  if not action.is_started():
323
- task: queue_service_pb2.TaskAction | None = None
324
- trace: queue_service_pb2.TraceAction | None = None
325
- if action.type == "task":
326
- if action.task is None:
327
- raise flyte.errors.RuntimeSystemError(
328
- "NoTaskSpec", "Task Spec not found, cannot launch Task Action."
331
+ async with self._rate_limiter:
332
+ task: queue_service_pb2.TaskAction | None = None
333
+ trace: queue_service_pb2.TraceAction | None = None
334
+ if action.type == "task":
335
+ if action.task is None:
336
+ raise flyte.errors.RuntimeSystemError(
337
+ "NoTaskSpec", "Task Spec not found, cannot launch Task Action."
338
+ )
339
+ cache_key = None
340
+ logger.info(f"Action {action.name} has cache version {action.cache_key}")
341
+ if action.cache_key:
342
+ cache_key = StringValue(value=action.cache_key)
343
+
344
+ task = queue_service_pb2.TaskAction(
345
+ id=task_definition_pb2.TaskIdentifier(
346
+ version=action.task.task_template.id.version,
347
+ org=action.task.task_template.id.org,
348
+ project=action.task.task_template.id.project,
349
+ domain=action.task.task_template.id.domain,
350
+ name=action.task.task_template.id.name,
351
+ ),
352
+ spec=action.task,
353
+ cache_key=cache_key,
329
354
  )
330
- cache_key = None
331
- logger.info(f"Action {action.name} has cache version {action.cache_key}")
332
- if action.cache_key:
333
- cache_key = StringValue(value=action.cache_key)
334
-
335
- task = queue_service_pb2.TaskAction(
336
- id=task_definition_pb2.TaskIdentifier(
337
- version=action.task.task_template.id.version,
338
- org=action.task.task_template.id.org,
339
- project=action.task.task_template.id.project,
340
- domain=action.task.task_template.id.domain,
341
- name=action.task.task_template.id.name,
342
- ),
343
- spec=action.task,
344
- cache_key=cache_key,
345
- )
346
- elif action.type == "trace":
347
- trace = action.trace
348
-
349
- logger.debug(f"Attempting to launch action: {action.name}")
350
- try:
351
- await self._queue_service.EnqueueAction(
352
- queue_service_pb2.EnqueueActionRequest(
353
- action_id=action.action_id,
354
- parent_action_name=action.parent_action_name,
355
- task=task,
356
- trace=trace,
357
- input_uri=action.inputs_uri,
358
- run_output_base=action.run_output_base,
359
- group=action.group.name if action.group else None,
360
- # Subject is not used in the current implementation
361
- ),
362
- wait_for_ready=True,
363
- timeout=self._enqueue_timeout,
364
- )
365
- logger.info(f"Successfully launched action: {action.name}")
366
- except grpc.aio.AioRpcError as e:
367
- if e.code() == grpc.StatusCode.ALREADY_EXISTS:
368
- logger.info(f"Action {action.name} already exists, continuing to monitor.")
369
- return
370
- logger.exception(f"Failed to launch action: {action.name} backing off...")
371
- logger.debug(f"Action details: {action}")
372
- raise e
355
+ elif action.type == "trace":
356
+ trace = action.trace
357
+
358
+ logger.debug(f"Attempting to launch action: {action.name}")
359
+ try:
360
+ await self._queue_service.EnqueueAction(
361
+ queue_service_pb2.EnqueueActionRequest(
362
+ action_id=action.action_id,
363
+ parent_action_name=action.parent_action_name,
364
+ task=task,
365
+ trace=trace,
366
+ input_uri=action.inputs_uri,
367
+ run_output_base=action.run_output_base,
368
+ group=action.group.name if action.group else None,
369
+ # Subject is not used in the current implementation
370
+ ),
371
+ wait_for_ready=True,
372
+ timeout=self._enqueue_timeout,
373
+ )
374
+ logger.info(f"Successfully launched action: {action.name}")
375
+ except grpc.aio.AioRpcError as e:
376
+ if e.code() == grpc.StatusCode.ALREADY_EXISTS:
377
+ logger.info(f"Action {action.name} already exists, continuing to monitor.")
378
+ return
379
+ if e.code() in [
380
+ grpc.StatusCode.FAILED_PRECONDITION,
381
+ grpc.StatusCode.INVALID_ARGUMENT,
382
+ grpc.StatusCode.NOT_FOUND,
383
+ ]:
384
+ raise flyte.errors.RuntimeSystemError(
385
+ e.code().name, f"Precondition failed: {e.details()}"
386
+ ) from e
387
+ # For all other errors, we will retry with backoff
388
+ logger.exception(
389
+ f"Failed to launch action: {action.name}, Code: {e.code()}, "
390
+ f"Details {e.details()} backing off..."
391
+ )
392
+ logger.debug(f"Action details: {action}")
393
+ raise flyte.errors.SlowDownError(f"Failed to launch action: {e.details()}") from e
373
394
 
374
395
  @log
375
396
  async def _bg_process(self, action: Action):
@@ -397,35 +418,42 @@ class Controller:
397
418
  await asyncio.sleep(self._resource_log_interval)
398
419
 
399
420
  @log
400
- async def _bg_run(self):
421
+ async def _bg_run(self, worker_id: str):
401
422
  """Run loop with resource status logging"""
423
+ logger.info(f"Worker {worker_id} started")
402
424
  while self._running:
403
425
  logger.debug(f"{threading.current_thread().name} Waiting for resource")
404
426
  action = await self._shared_queue.get()
405
427
  logger.debug(f"{threading.current_thread().name} Got resource {action.name}")
406
428
  try:
407
429
  await self._bg_process(action)
408
- except Exception as e:
409
- logger.error(f"Error in controller loop: {e}")
410
- # TODO we need a better way of handling backoffs currently the entire worker coroutine backs off
411
- await asyncio.sleep(self._min_backoff_on_err)
412
- action.increment_retries()
430
+ except flyte.errors.SlowDownError as e:
431
+ action.retries += 1
413
432
  if action.retries > self._max_retries:
414
- err = flyte.errors.RuntimeSystemError(
415
- code=type(e).__name__,
416
- message=f"Controller failed, system retries {action.retries}"
417
- f" crossed threshold {self._max_retries}",
418
- )
419
- err.__cause__ = e
420
- action.set_client_error(err)
421
- informer = await self._informers.get(
422
- run_name=action.run_name,
423
- parent_action_name=action.parent_action_name,
424
- )
425
- if informer:
426
- await informer.fire_completion_event(action.name)
427
- else:
428
- await self._shared_queue.put(action)
433
+ raise
434
+ backoff = min(self._min_backoff_on_err * (2 ** (action.retries - 1)), self._max_backoff_on_err)
435
+ logger.warning(
436
+ f"[{worker_id}] Backing off for {backoff} [retry {action.retries}/{self._max_retries}] "
437
+ f"on action {action.name} due to error: {e}"
438
+ )
439
+ await asyncio.sleep(backoff)
440
+ logger.warning(f"[{worker_id}] Retrying action {action.name} after backoff")
441
+ await self._shared_queue.put(action)
442
+ except Exception as e:
443
+ logger.error(f"[{worker_id}] Error in controller loop: {e}")
444
+ err = flyte.errors.RuntimeSystemError(
445
+ code=type(e).__name__,
446
+ message=f"Controller failed, system retries {action.retries} crossed threshold {self._max_retries}",
447
+ worker=worker_id,
448
+ )
449
+ err.__cause__ = e
450
+ action.set_client_error(err)
451
+ informer = await self._informers.get(
452
+ run_name=action.run_name,
453
+ parent_action_name=action.parent_action_name,
454
+ )
455
+ if informer:
456
+ await informer.fire_completion_event(action.name)
429
457
  finally:
430
458
  self._shared_queue.task_done()
431
459
 
@@ -132,8 +132,10 @@ class Informer:
132
132
  parent_action_name: str,
133
133
  shared_queue: Queue,
134
134
  client: Optional[StateService] = None,
135
- watch_backoff_interval_sec: float = 1.0,
135
+ min_watch_backoff: float = 1.0,
136
+ max_watch_backoff: float = 30.0,
136
137
  watch_conn_timeout_sec: float = 5.0,
138
+ max_watch_retries: int = 10,
137
139
  ):
138
140
  self.name = self.mkname(run_name=run_id.name, parent_action_name=parent_action_name)
139
141
  self.parent_action_name = parent_action_name
@@ -144,8 +146,10 @@ class Informer:
144
146
  self._running = False
145
147
  self._watch_task: asyncio.Task | None = None
146
148
  self._ready = asyncio.Event()
147
- self._watch_backoff_interval_sec = watch_backoff_interval_sec
149
+ self._min_watch_backoff = min_watch_backoff
150
+ self._max_watch_backoff = max_watch_backoff
148
151
  self._watch_conn_timeout_sec = watch_conn_timeout_sec
152
+ self._max_watch_retries = max_watch_retries
149
153
 
150
154
  @classmethod
151
155
  def mkname(cls, *, run_name: str, parent_action_name: str) -> str:
@@ -211,13 +215,16 @@ class Informer:
211
215
  """
212
216
  # sentinel = False
213
217
  retries = 0
214
- max_retries = 5
215
218
  last_exc = None
216
219
  while self._running:
217
- if retries >= max_retries:
218
- logger.error(f"Informer watch failure retries crossed threshold {retries}/{max_retries}, exiting!")
220
+ if retries >= self._max_watch_retries:
221
+ logger.error(
222
+ f"Informer watch failure retries crossed threshold {retries}/{self._max_watch_retries}, exiting!"
223
+ )
219
224
  raise last_exc
220
225
  try:
226
+ if retries >= 1:
227
+ logger.warning(f"Informer watch retrying, attempt {retries}/{self._max_watch_retries}")
221
228
  watcher = self._client.Watch(
222
229
  state_service_pb2.WatchRequest(
223
230
  parent_action_id=identifier_pb2.ActionIdentifier(
@@ -252,7 +259,9 @@ class Informer:
252
259
  logger.exception(f"Watch error: {self.name}", exc_info=e)
253
260
  last_exc = e
254
261
  retries += 1
255
- await asyncio.sleep(self._watch_backoff_interval_sec)
262
+ backoff = min(self._min_watch_backoff * (2**retries), self._max_watch_backoff)
263
+ logger.warning(f"Watch for {self.name} failed, retrying in {backoff} seconds...")
264
+ await asyncio.sleep(backoff)
256
265
 
257
266
  @log
258
267
  async def start(self, timeout: Optional[float] = None) -> asyncio.Task:
flyte/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.0.0b19'
32
- __version_tuple__ = version_tuple = (2, 0, 0, 'b19')
31
+ __version__ = version = '2.0.0b20'
32
+ __version_tuple__ = version_tuple = (2, 0, 0, 'b20')
33
33
 
34
- __commit_id__ = commit_id = 'g172a8c6b7'
34
+ __commit_id__ = commit_id = 'g5109b02e4'
flyte/errors.py CHANGED
@@ -223,3 +223,12 @@ class RunAbortedError(RuntimeUserError):
223
223
 
224
224
  def __init__(self, message: str):
225
225
  super().__init__("RunAbortedError", message, "user")
226
+
227
+
228
+ class SlowDownError(RuntimeUserError):
229
+ """
230
+ This error is raised when the user tries to access a resource that does not exist or is invalid.
231
+ """
232
+
233
+ def __init__(self, message: str):
234
+ super().__init__("SlowDownError", message, "user")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flyte
3
- Version: 2.0.0b19
3
+ Version: 2.0.0b20
4
4
  Summary: Add your description here
5
5
  Author-email: Ketan Umare <kumare3@users.noreply.github.com>
6
6
  Requires-Python: >=3.10
@@ -24,6 +24,7 @@ Requires-Dist: toml>=0.10.2
24
24
  Requires-Dist: async-lru>=2.0.5
25
25
  Requires-Dist: mashumaro
26
26
  Requires-Dist: dataclasses_json
27
+ Requires-Dist: aiolimiter>=1.2.1
27
28
  Dynamic: license-file
28
29
 
29
30
  # Flyte 2 SDK 🚀
@@ -25,8 +25,8 @@ flyte/_task_plugins.py,sha256=9MH3nFPOH_e8_92BT4sFk4oyAnj6GJFvaPYWaraX7yE,1037
25
25
  flyte/_timeout.py,sha256=zx5sFcbYmjJAJbZWSGzzX-BpC9HC7Jfs35T7vVhKwkk,1571
26
26
  flyte/_tools.py,sha256=lB3OiJSAhxzSMCYjLUF6nZjlFsmNpaRXtr3_Fefcxbg,747
27
27
  flyte/_trace.py,sha256=-BIprs2MbupWl3vsC_Pn33SV3fSVku1rUIsnwfmrIy0,5204
28
- flyte/_version.py,sha256=nQUNxDZJt__tA11kox5MN0Qw8wDm85cQSW36nTZmT7s,722
29
- flyte/errors.py,sha256=utl0biQhyYbNdkddVsJAGbGZgUPka_DYnUaHTlQL-Jc,6451
28
+ flyte/_version.py,sha256=DHBNTfUVjKbnarRHJH69S1E8D0BHxMGpAixhCbYE448,722
29
+ flyte/errors.py,sha256=k1-pgz7xm4syViJmPwp7ZDusmqcrlM2uZKrl0com_9I,6707
30
30
  flyte/extend.py,sha256=GB4ZedGzKa30vYWRVPOdxEeK62xnUVFY4z2tD6H9eEw,376
31
31
  flyte/models.py,sha256=dtaQyU4PhtEr5L39xwiPDVKSYuYKaArRfRNliIfPUf8,16207
32
32
  flyte/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -50,12 +50,12 @@ flyte/_internal/__init__.py,sha256=vjXgGzAAjy609YFkAy9_RVPuUlslsHSJBXCLNTVnqOY,1
50
50
  flyte/_internal/controllers/__init__.py,sha256=yNALzu-3YVii_D_GlrBoWUpL4PTLYUa7oIKnA7hbee0,4296
51
51
  flyte/_internal/controllers/_local_controller.py,sha256=lXFvmxd_ctinJ5z4Fd_bZW0_LcOn0vc12F1try6uYgg,7308
52
52
  flyte/_internal/controllers/_trace.py,sha256=ywFg_M2nGrCKYLbh4iVdsVlRtPT1K2S-XZMvDJU8AKU,1499
53
- flyte/_internal/controllers/remote/__init__.py,sha256=9_azH1eHLqY6VULpDugXi7Kf1kK1ODqEnsQ_3wM6IqU,1919
53
+ flyte/_internal/controllers/remote/__init__.py,sha256=EkDZ4gpp715M5CMnwpFh9s04jkWowndF9RqhXJ34yRA,1869
54
54
  flyte/_internal/controllers/remote/_action.py,sha256=zYilKk3yq2jOxUm258xd4TRl1o3T2la4PXFc0xjcytI,7301
55
55
  flyte/_internal/controllers/remote/_client.py,sha256=HPbzbfaWZVv5wpOvKNtFXR6COiZDwd1cUJQqi60A7oU,1421
56
- flyte/_internal/controllers/remote/_controller.py,sha256=IZ74-PdpsDplRAMutvlwFVzrSjQdJJ-naUb2d2SLXKM,25175
57
- flyte/_internal/controllers/remote/_core.py,sha256=A7GX-V8LqFoF0Llfvxy3xmrRsiIHSJv2z2gdFWTHs48,19053
58
- flyte/_internal/controllers/remote/_informer.py,sha256=w4p29_dzS_ns762eNBljvnbJLgCm36d1Ogo2ZkgV1yg,14418
56
+ flyte/_internal/controllers/remote/_controller.py,sha256=Mp65OvENDfJ0CpwoAhb1ndCdrJ2hMIccwI0_t8xD7uU,25209
57
+ flyte/_internal/controllers/remote/_core.py,sha256=5qIGFNTilJwtYLQ_KQoawLQ172ih-uH6MfrQKVXqd8k,20828
58
+ flyte/_internal/controllers/remote/_informer.py,sha256=M2uqfe0oz9ySkYK94UFLoTPRt9UoaYQKzmy4lrVOchY,14912
59
59
  flyte/_internal/controllers/remote/_service_protocol.py,sha256=B9qbIg6DiGeac-iSccLmX_AL2xUgX4ezNUOiAbSy4V0,1357
60
60
  flyte/_internal/imagebuild/__init__.py,sha256=dwXdJ1jMhw9RF8itF7jkPLanvX1yCviSns7hE5eoIts,102
61
61
  flyte/_internal/imagebuild/docker_builder.py,sha256=qzKqicgGpWB6wC2DYTc4yh5LJT_hbQ7nacIqnx4bkOQ,21595
@@ -238,11 +238,11 @@ flyte/types/_renderer.py,sha256=ygcCo5l60lHufyQISFddZfWwLlQ8kJAKxUT_XnR_6dY,4818
238
238
  flyte/types/_string_literals.py,sha256=NlG1xV8RSA-sZ-n-IFQCAsdB6jXJOAKkHWtnopxVVDk,4231
239
239
  flyte/types/_type_engine.py,sha256=IwBdBXr3sso2Y-ZMiIBmXmczfI7GyJMpThXDuQiOqco,94951
240
240
  flyte/types/_utils.py,sha256=pbts9E1_2LTdLygAY0UYTLYJ8AsN3BZyviSXvrtcutc,2626
241
- flyte-2.0.0b19.data/scripts/debug.py,sha256=hnX2tlv9QbqckoT5CJ3c3apJj3tGDpsrdV7ZAsE7j34,911
242
- flyte-2.0.0b19.data/scripts/runtime.py,sha256=CoMgKQ_pBifnHsNF1MlBGmMrenrKXuMIHTLRF7MKDfA,6193
243
- flyte-2.0.0b19.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
244
- flyte-2.0.0b19.dist-info/METADATA,sha256=EYDtynzbTo44xv8-onc7OLPeT1giPi5XcW_k_b2SrII,10012
245
- flyte-2.0.0b19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
246
- flyte-2.0.0b19.dist-info/entry_points.txt,sha256=MIq2z5dBurdCJfpXfMKzgBv7sJOakKRYxr8G0cMiTrg,75
247
- flyte-2.0.0b19.dist-info/top_level.txt,sha256=7dkyFbikvA12LEZEqawx8oDG1CMod6hTliPj7iWzgYo,6
248
- flyte-2.0.0b19.dist-info/RECORD,,
241
+ flyte-2.0.0b20.data/scripts/debug.py,sha256=hnX2tlv9QbqckoT5CJ3c3apJj3tGDpsrdV7ZAsE7j34,911
242
+ flyte-2.0.0b20.data/scripts/runtime.py,sha256=CoMgKQ_pBifnHsNF1MlBGmMrenrKXuMIHTLRF7MKDfA,6193
243
+ flyte-2.0.0b20.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
244
+ flyte-2.0.0b20.dist-info/METADATA,sha256=J44ZHZJFMHKtBfaCx69-eDwqCklCBSgS64uKMJqtfz4,10045
245
+ flyte-2.0.0b20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
246
+ flyte-2.0.0b20.dist-info/entry_points.txt,sha256=MIq2z5dBurdCJfpXfMKzgBv7sJOakKRYxr8G0cMiTrg,75
247
+ flyte-2.0.0b20.dist-info/top_level.txt,sha256=7dkyFbikvA12LEZEqawx8oDG1CMod6hTliPj7iWzgYo,6
248
+ flyte-2.0.0b20.dist-info/RECORD,,