flyte 0.0.1b3__py3-none-any.whl → 0.2.0a0__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.

Files changed (319) hide show
  1. flyte/__init__.py +20 -4
  2. flyte/_bin/runtime.py +33 -7
  3. flyte/_build.py +3 -2
  4. flyte/_cache/cache.py +1 -2
  5. flyte/_code_bundle/_packaging.py +1 -1
  6. flyte/_code_bundle/_utils.py +0 -16
  7. flyte/_code_bundle/bundle.py +43 -12
  8. flyte/_context.py +8 -2
  9. flyte/_deploy.py +56 -15
  10. flyte/_environment.py +45 -4
  11. flyte/_excepthook.py +37 -0
  12. flyte/_group.py +2 -1
  13. flyte/_image.py +8 -4
  14. flyte/_initialize.py +112 -254
  15. flyte/_interface.py +3 -3
  16. flyte/_internal/controllers/__init__.py +19 -6
  17. flyte/_internal/controllers/_local_controller.py +83 -8
  18. flyte/_internal/controllers/_trace.py +2 -1
  19. flyte/_internal/controllers/remote/__init__.py +27 -7
  20. flyte/_internal/controllers/remote/_action.py +7 -2
  21. flyte/_internal/controllers/remote/_client.py +5 -1
  22. flyte/_internal/controllers/remote/_controller.py +159 -26
  23. flyte/_internal/controllers/remote/_core.py +13 -5
  24. flyte/_internal/controllers/remote/_informer.py +4 -4
  25. flyte/_internal/controllers/remote/_service_protocol.py +6 -6
  26. flyte/_internal/imagebuild/docker_builder.py +12 -1
  27. flyte/_internal/imagebuild/image_builder.py +16 -11
  28. flyte/_internal/runtime/convert.py +164 -21
  29. flyte/_internal/runtime/entrypoints.py +1 -1
  30. flyte/_internal/runtime/io.py +3 -3
  31. flyte/_internal/runtime/task_serde.py +140 -20
  32. flyte/_internal/runtime/taskrunner.py +4 -3
  33. flyte/_internal/runtime/types_serde.py +1 -1
  34. flyte/_logging.py +12 -1
  35. flyte/_map.py +215 -0
  36. flyte/_pod.py +19 -0
  37. flyte/_protos/common/list_pb2.py +3 -3
  38. flyte/_protos/common/list_pb2.pyi +2 -0
  39. flyte/_protos/logs/dataplane/payload_pb2.py +28 -24
  40. flyte/_protos/logs/dataplane/payload_pb2.pyi +11 -2
  41. flyte/_protos/workflow/common_pb2.py +27 -0
  42. flyte/_protos/workflow/common_pb2.pyi +14 -0
  43. flyte/_protos/workflow/environment_pb2.py +29 -0
  44. flyte/_protos/workflow/environment_pb2.pyi +12 -0
  45. flyte/_protos/workflow/queue_service_pb2.py +40 -41
  46. flyte/_protos/workflow/queue_service_pb2.pyi +35 -30
  47. flyte/_protos/workflow/queue_service_pb2_grpc.py +15 -15
  48. flyte/_protos/workflow/run_definition_pb2.py +61 -61
  49. flyte/_protos/workflow/run_definition_pb2.pyi +8 -4
  50. flyte/_protos/workflow/run_service_pb2.py +20 -24
  51. flyte/_protos/workflow/run_service_pb2.pyi +2 -6
  52. flyte/_protos/workflow/state_service_pb2.py +36 -28
  53. flyte/_protos/workflow/state_service_pb2.pyi +19 -15
  54. flyte/_protos/workflow/state_service_pb2_grpc.py +28 -28
  55. flyte/_protos/workflow/task_definition_pb2.py +29 -22
  56. flyte/_protos/workflow/task_definition_pb2.pyi +21 -5
  57. flyte/_protos/workflow/task_service_pb2.py +27 -11
  58. flyte/_protos/workflow/task_service_pb2.pyi +29 -1
  59. flyte/_protos/workflow/task_service_pb2_grpc.py +34 -0
  60. flyte/_run.py +166 -95
  61. flyte/_task.py +110 -28
  62. flyte/_task_environment.py +55 -72
  63. flyte/_trace.py +6 -14
  64. flyte/_utils/__init__.py +6 -0
  65. flyte/_utils/async_cache.py +139 -0
  66. flyte/_utils/coro_management.py +0 -2
  67. flyte/_utils/helpers.py +45 -19
  68. flyte/_utils/org_discovery.py +57 -0
  69. flyte/_version.py +2 -2
  70. flyte/cli/__init__.py +3 -0
  71. flyte/cli/_abort.py +28 -0
  72. flyte/{_cli → cli}/_common.py +73 -23
  73. flyte/cli/_create.py +145 -0
  74. flyte/{_cli → cli}/_delete.py +4 -4
  75. flyte/{_cli → cli}/_deploy.py +26 -14
  76. flyte/cli/_gen.py +163 -0
  77. flyte/{_cli → cli}/_get.py +98 -23
  78. {union/_cli → flyte/cli}/_params.py +106 -147
  79. flyte/{_cli → cli}/_run.py +99 -20
  80. flyte/cli/main.py +166 -0
  81. flyte/config/__init__.py +3 -0
  82. flyte/config/_config.py +216 -0
  83. flyte/config/_internal.py +64 -0
  84. flyte/config/_reader.py +207 -0
  85. flyte/errors.py +29 -0
  86. flyte/extras/_container.py +33 -43
  87. flyte/io/__init__.py +17 -1
  88. flyte/io/_dir.py +2 -2
  89. flyte/io/_file.py +3 -4
  90. flyte/io/{structured_dataset → _structured_dataset}/basic_dfs.py +1 -1
  91. flyte/io/{structured_dataset → _structured_dataset}/structured_dataset.py +1 -1
  92. flyte/{_datastructures.py → models.py} +56 -7
  93. flyte/remote/__init__.py +2 -1
  94. flyte/remote/_client/_protocols.py +2 -0
  95. flyte/remote/_client/auth/_auth_utils.py +14 -0
  96. flyte/remote/_client/auth/_channel.py +34 -3
  97. flyte/remote/_client/auth/_token_client.py +3 -3
  98. flyte/remote/_client/controlplane.py +13 -13
  99. flyte/remote/_console.py +1 -1
  100. flyte/remote/_data.py +10 -6
  101. flyte/remote/_logs.py +89 -29
  102. flyte/remote/_project.py +8 -9
  103. flyte/remote/_run.py +228 -131
  104. flyte/remote/_secret.py +12 -12
  105. flyte/remote/_task.py +179 -15
  106. flyte/report/_report.py +4 -4
  107. flyte/storage/__init__.py +5 -0
  108. flyte/storage/_config.py +233 -0
  109. flyte/storage/_storage.py +23 -3
  110. flyte/syncify/__init__.py +56 -0
  111. flyte/syncify/_api.py +371 -0
  112. flyte/types/__init__.py +23 -0
  113. flyte/types/_interface.py +22 -7
  114. flyte/{io/pickle/transformer.py → types/_pickle.py} +2 -1
  115. flyte/types/_type_engine.py +95 -18
  116. flyte-0.2.0a0.dist-info/METADATA +249 -0
  117. flyte-0.2.0a0.dist-info/RECORD +218 -0
  118. {flyte-0.0.1b3.dist-info → flyte-0.2.0a0.dist-info}/entry_points.txt +1 -1
  119. flyte/_api_commons.py +0 -3
  120. flyte/_cli/__init__.py +0 -0
  121. flyte/_cli/_create.py +0 -42
  122. flyte/_cli/main.py +0 -72
  123. flyte/_internal/controllers/pbhash.py +0 -39
  124. flyte/io/_dataframe.py +0 -0
  125. flyte/io/pickle/__init__.py +0 -0
  126. flyte-0.0.1b3.dist-info/METADATA +0 -179
  127. flyte-0.0.1b3.dist-info/RECORD +0 -390
  128. union/__init__.py +0 -54
  129. union/_api_commons.py +0 -3
  130. union/_bin/__init__.py +0 -0
  131. union/_bin/runtime.py +0 -113
  132. union/_build.py +0 -25
  133. union/_cache/__init__.py +0 -12
  134. union/_cache/cache.py +0 -141
  135. union/_cache/defaults.py +0 -9
  136. union/_cache/policy_function_body.py +0 -42
  137. union/_cli/__init__.py +0 -0
  138. union/_cli/_common.py +0 -263
  139. union/_cli/_create.py +0 -40
  140. union/_cli/_delete.py +0 -23
  141. union/_cli/_deploy.py +0 -120
  142. union/_cli/_get.py +0 -162
  143. union/_cli/_run.py +0 -150
  144. union/_cli/main.py +0 -72
  145. union/_code_bundle/__init__.py +0 -8
  146. union/_code_bundle/_ignore.py +0 -113
  147. union/_code_bundle/_packaging.py +0 -187
  148. union/_code_bundle/_utils.py +0 -342
  149. union/_code_bundle/bundle.py +0 -176
  150. union/_context.py +0 -146
  151. union/_datastructures.py +0 -295
  152. union/_deploy.py +0 -185
  153. union/_doc.py +0 -29
  154. union/_docstring.py +0 -26
  155. union/_environment.py +0 -43
  156. union/_group.py +0 -31
  157. union/_hash.py +0 -23
  158. union/_image.py +0 -760
  159. union/_initialize.py +0 -585
  160. union/_interface.py +0 -84
  161. union/_internal/__init__.py +0 -3
  162. union/_internal/controllers/__init__.py +0 -77
  163. union/_internal/controllers/_local_controller.py +0 -77
  164. union/_internal/controllers/pbhash.py +0 -39
  165. union/_internal/controllers/remote/__init__.py +0 -40
  166. union/_internal/controllers/remote/_action.py +0 -131
  167. union/_internal/controllers/remote/_client.py +0 -43
  168. union/_internal/controllers/remote/_controller.py +0 -169
  169. union/_internal/controllers/remote/_core.py +0 -341
  170. union/_internal/controllers/remote/_informer.py +0 -260
  171. union/_internal/controllers/remote/_service_protocol.py +0 -44
  172. union/_internal/imagebuild/__init__.py +0 -11
  173. union/_internal/imagebuild/docker_builder.py +0 -416
  174. union/_internal/imagebuild/image_builder.py +0 -243
  175. union/_internal/imagebuild/remote_builder.py +0 -0
  176. union/_internal/resolvers/__init__.py +0 -0
  177. union/_internal/resolvers/_task_module.py +0 -31
  178. union/_internal/resolvers/common.py +0 -24
  179. union/_internal/resolvers/default.py +0 -27
  180. union/_internal/runtime/__init__.py +0 -0
  181. union/_internal/runtime/convert.py +0 -163
  182. union/_internal/runtime/entrypoints.py +0 -121
  183. union/_internal/runtime/io.py +0 -136
  184. union/_internal/runtime/resources_serde.py +0 -134
  185. union/_internal/runtime/task_serde.py +0 -202
  186. union/_internal/runtime/taskrunner.py +0 -179
  187. union/_internal/runtime/types_serde.py +0 -53
  188. union/_logging.py +0 -124
  189. union/_protos/__init__.py +0 -0
  190. union/_protos/common/authorization_pb2.py +0 -66
  191. union/_protos/common/authorization_pb2.pyi +0 -106
  192. union/_protos/common/identifier_pb2.py +0 -71
  193. union/_protos/common/identifier_pb2.pyi +0 -82
  194. union/_protos/common/identity_pb2.py +0 -48
  195. union/_protos/common/identity_pb2.pyi +0 -72
  196. union/_protos/common/identity_pb2_grpc.py +0 -4
  197. union/_protos/common/list_pb2.py +0 -36
  198. union/_protos/common/list_pb2.pyi +0 -69
  199. union/_protos/common/list_pb2_grpc.py +0 -4
  200. union/_protos/common/policy_pb2.py +0 -37
  201. union/_protos/common/policy_pb2.pyi +0 -27
  202. union/_protos/common/policy_pb2_grpc.py +0 -4
  203. union/_protos/common/role_pb2.py +0 -37
  204. union/_protos/common/role_pb2.pyi +0 -51
  205. union/_protos/common/role_pb2_grpc.py +0 -4
  206. union/_protos/common/runtime_version_pb2.py +0 -28
  207. union/_protos/common/runtime_version_pb2.pyi +0 -24
  208. union/_protos/common/runtime_version_pb2_grpc.py +0 -4
  209. union/_protos/logs/dataplane/payload_pb2.py +0 -96
  210. union/_protos/logs/dataplane/payload_pb2.pyi +0 -168
  211. union/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
  212. union/_protos/secret/definition_pb2.py +0 -49
  213. union/_protos/secret/definition_pb2.pyi +0 -93
  214. union/_protos/secret/definition_pb2_grpc.py +0 -4
  215. union/_protos/secret/payload_pb2.py +0 -62
  216. union/_protos/secret/payload_pb2.pyi +0 -94
  217. union/_protos/secret/payload_pb2_grpc.py +0 -4
  218. union/_protos/secret/secret_pb2.py +0 -38
  219. union/_protos/secret/secret_pb2.pyi +0 -6
  220. union/_protos/secret/secret_pb2_grpc.py +0 -198
  221. union/_protos/validate/validate/validate_pb2.py +0 -76
  222. union/_protos/workflow/node_execution_service_pb2.py +0 -26
  223. union/_protos/workflow/node_execution_service_pb2.pyi +0 -4
  224. union/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
  225. union/_protos/workflow/queue_service_pb2.py +0 -75
  226. union/_protos/workflow/queue_service_pb2.pyi +0 -103
  227. union/_protos/workflow/queue_service_pb2_grpc.py +0 -172
  228. union/_protos/workflow/run_definition_pb2.py +0 -100
  229. union/_protos/workflow/run_definition_pb2.pyi +0 -256
  230. union/_protos/workflow/run_definition_pb2_grpc.py +0 -4
  231. union/_protos/workflow/run_logs_service_pb2.py +0 -41
  232. union/_protos/workflow/run_logs_service_pb2.pyi +0 -28
  233. union/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
  234. union/_protos/workflow/run_service_pb2.py +0 -133
  235. union/_protos/workflow/run_service_pb2.pyi +0 -173
  236. union/_protos/workflow/run_service_pb2_grpc.py +0 -412
  237. union/_protos/workflow/state_service_pb2.py +0 -58
  238. union/_protos/workflow/state_service_pb2.pyi +0 -69
  239. union/_protos/workflow/state_service_pb2_grpc.py +0 -138
  240. union/_protos/workflow/task_definition_pb2.py +0 -72
  241. union/_protos/workflow/task_definition_pb2.pyi +0 -65
  242. union/_protos/workflow/task_definition_pb2_grpc.py +0 -4
  243. union/_protos/workflow/task_service_pb2.py +0 -44
  244. union/_protos/workflow/task_service_pb2.pyi +0 -31
  245. union/_protos/workflow/task_service_pb2_grpc.py +0 -104
  246. union/_resources.py +0 -226
  247. union/_retry.py +0 -32
  248. union/_reusable_environment.py +0 -25
  249. union/_run.py +0 -374
  250. union/_secret.py +0 -61
  251. union/_task.py +0 -354
  252. union/_task_environment.py +0 -186
  253. union/_timeout.py +0 -47
  254. union/_tools.py +0 -27
  255. union/_utils/__init__.py +0 -11
  256. union/_utils/asyn.py +0 -119
  257. union/_utils/file_handling.py +0 -71
  258. union/_utils/helpers.py +0 -46
  259. union/_utils/lazy_module.py +0 -54
  260. union/_utils/uv_script_parser.py +0 -49
  261. union/_version.py +0 -21
  262. union/connectors/__init__.py +0 -0
  263. union/errors.py +0 -128
  264. union/extras/__init__.py +0 -5
  265. union/extras/_container.py +0 -263
  266. union/io/__init__.py +0 -11
  267. union/io/_dataframe.py +0 -0
  268. union/io/_dir.py +0 -425
  269. union/io/_file.py +0 -418
  270. union/io/pickle/__init__.py +0 -0
  271. union/io/pickle/transformer.py +0 -117
  272. union/io/structured_dataset/__init__.py +0 -122
  273. union/io/structured_dataset/basic_dfs.py +0 -219
  274. union/io/structured_dataset/structured_dataset.py +0 -1057
  275. union/py.typed +0 -0
  276. union/remote/__init__.py +0 -23
  277. union/remote/_client/__init__.py +0 -0
  278. union/remote/_client/_protocols.py +0 -129
  279. union/remote/_client/auth/__init__.py +0 -12
  280. union/remote/_client/auth/_authenticators/__init__.py +0 -0
  281. union/remote/_client/auth/_authenticators/base.py +0 -391
  282. union/remote/_client/auth/_authenticators/client_credentials.py +0 -73
  283. union/remote/_client/auth/_authenticators/device_code.py +0 -120
  284. union/remote/_client/auth/_authenticators/external_command.py +0 -77
  285. union/remote/_client/auth/_authenticators/factory.py +0 -200
  286. union/remote/_client/auth/_authenticators/pkce.py +0 -515
  287. union/remote/_client/auth/_channel.py +0 -184
  288. union/remote/_client/auth/_client_config.py +0 -83
  289. union/remote/_client/auth/_default_html.py +0 -32
  290. union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
  291. union/remote/_client/auth/_grpc_utils/auth_interceptor.py +0 -204
  292. union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +0 -144
  293. union/remote/_client/auth/_keyring.py +0 -154
  294. union/remote/_client/auth/_token_client.py +0 -258
  295. union/remote/_client/auth/errors.py +0 -16
  296. union/remote/_client/controlplane.py +0 -86
  297. union/remote/_data.py +0 -149
  298. union/remote/_logs.py +0 -74
  299. union/remote/_project.py +0 -86
  300. union/remote/_run.py +0 -820
  301. union/remote/_secret.py +0 -132
  302. union/remote/_task.py +0 -193
  303. union/report/__init__.py +0 -3
  304. union/report/_report.py +0 -178
  305. union/report/_template.html +0 -124
  306. union/storage/__init__.py +0 -24
  307. union/storage/_remote_fs.py +0 -34
  308. union/storage/_storage.py +0 -247
  309. union/storage/_utils.py +0 -5
  310. union/types/__init__.py +0 -11
  311. union/types/_renderer.py +0 -162
  312. union/types/_string_literals.py +0 -120
  313. union/types/_type_engine.py +0 -2131
  314. union/types/_utils.py +0 -80
  315. /union/_protos/common/authorization_pb2_grpc.py → /flyte/_protos/workflow/common_pb2_grpc.py +0 -0
  316. /union/_protos/common/identifier_pb2_grpc.py → /flyte/_protos/workflow/environment_pb2_grpc.py +0 -0
  317. /flyte/io/{structured_dataset → _structured_dataset}/__init__.py +0 -0
  318. {flyte-0.0.1b3.dist-info → flyte-0.2.0a0.dist-info}/WHEEL +0 -0
  319. {flyte-0.0.1b3.dist-info → flyte-0.2.0a0.dist-info}/top_level.txt +0 -0
flyte/remote/_logs.py CHANGED
@@ -3,25 +3,33 @@ from collections import deque
3
3
  from dataclasses import dataclass
4
4
  from typing import AsyncGenerator, AsyncIterator
5
5
 
6
+ import grpc
6
7
  from rich.console import Console
7
8
  from rich.live import Live
8
9
  from rich.panel import Panel
9
10
  from rich.text import Text
10
11
 
11
- from flyte._api_commons import syncer
12
- from flyte._initialize import get_client, requires_client
12
+ from flyte._initialize import ensure_client, get_client
13
13
  from flyte._protos.logs.dataplane import payload_pb2
14
14
  from flyte._protos.workflow import run_definition_pb2, run_logs_service_pb2
15
+ from flyte.errors import LogsNotYetAvailableError
16
+ from flyte.syncify import syncify
15
17
 
18
+ style_map = {
19
+ payload_pb2.LogLineOriginator.SYSTEM: "bold magenta",
20
+ payload_pb2.LogLineOriginator.USER: "cyan",
21
+ payload_pb2.LogLineOriginator.UNKNOWN: "light red",
22
+ }
16
23
 
17
- def _format_line(logline: payload_pb2.LogLine, show_ts: bool) -> Text:
18
- style_map = {
19
- payload_pb2.LogLineOriginator.SYSTEM: "bold magenta",
20
- payload_pb2.LogLineOriginator.USER: "cyan",
21
- payload_pb2.LogLineOriginator.UNKNOWN: "light red",
22
- }
24
+
25
+ def _format_line(logline: payload_pb2.LogLine, show_ts: bool, filter_system: bool) -> Text | None:
26
+ if filter_system:
27
+ if logline.originator == payload_pb2.LogLineOriginator.SYSTEM:
28
+ return None
23
29
  style = style_map.get(logline.originator, "")
24
30
  if "flyte" in logline.message and "flyte.errors" not in logline.message:
31
+ if filter_system:
32
+ return None
25
33
  style = "dim"
26
34
  ts = ""
27
35
  if show_ts:
@@ -34,7 +42,15 @@ class AsyncLogViewer:
34
42
  A class to view logs asynchronously in the console or terminal or jupyter notebook.
35
43
  """
36
44
 
37
- def __init__(self, log_source: AsyncIterator, max_lines: int = 30, name: str = "Logs", show_ts: bool = False):
45
+ def __init__(
46
+ self,
47
+ log_source: AsyncIterator,
48
+ max_lines: int = 30,
49
+ name: str = "Logs",
50
+ show_ts: bool = False,
51
+ filter_system: bool = False,
52
+ panel: bool = False,
53
+ ):
38
54
  self.console = Console()
39
55
  self.log_source = log_source
40
56
  self.max_lines = max_lines
@@ -42,47 +58,81 @@ class AsyncLogViewer:
42
58
  self.name = name
43
59
  self.show_ts = show_ts
44
60
  self.total_lines = 0
61
+ self.filter_flyte = filter_system
62
+ self.panel = panel
45
63
 
46
- def _render(self):
64
+ def _render(self) -> Panel | Text:
47
65
  log_text = Text()
48
66
  for line in self.lines:
49
67
  log_text.append(line)
50
- return Panel(log_text, title=self.name, border_style="yellow")
68
+ if self.panel:
69
+ return Panel(log_text, title=self.name, border_style="yellow")
70
+ return log_text
51
71
 
52
72
  async def run(self):
53
- with Live(self._render(), refresh_per_second=10, console=self.console) as live:
73
+ with Live(self._render(), refresh_per_second=20, console=self.console) as live:
54
74
  try:
55
75
  async for logline in self.log_source:
56
- formatted = _format_line(logline, show_ts=self.show_ts)
57
- self.lines.append(formatted)
76
+ formatted = _format_line(logline, show_ts=self.show_ts, filter_system=self.filter_flyte)
77
+ if formatted:
78
+ self.lines.append(formatted)
58
79
  self.total_lines += 1
59
80
  live.update(self._render())
60
81
  except asyncio.CancelledError:
61
82
  pass
83
+ except KeyboardInterrupt:
84
+ pass
85
+ except StopAsyncIteration:
86
+ self.console.print("[dim]Log stream ended.[/dim]")
87
+ except LogsNotYetAvailableError as e:
88
+ self.console.print(f"[red]Error:[/red] {e}")
89
+ live.update("")
62
90
  self.console.print(f"Scrolled {self.total_lines} lines of logs.")
63
91
 
64
92
 
65
93
  @dataclass
66
94
  class Logs:
95
+ @syncify
67
96
  @classmethod
68
- @requires_client
69
- @syncer.wrap
70
97
  async def tail(
71
- cls, action_id: run_definition_pb2.ActionIdentifier, attempt: int = 1
98
+ cls,
99
+ action_id: run_definition_pb2.ActionIdentifier,
100
+ attempt: int = 1,
101
+ retry: int = 3,
72
102
  ) -> AsyncGenerator[payload_pb2.LogLine, None]:
73
103
  """
74
104
  Tail the logs for a given action ID and attempt.
75
105
  :param action_id: The action ID to tail logs for.
76
106
  :param attempt: The attempt number (default is 0).
77
107
  """
78
- resp = get_client().logs_service.TailLogs(
79
- run_logs_service_pb2.TailLogsRequest(action_id=action_id, attempt=attempt)
80
- )
81
- async for log_set in resp:
82
- if log_set.logs:
83
- for log in log_set.logs:
84
- for line in log.lines:
85
- yield line
108
+ ensure_client()
109
+ retries = 0
110
+ while True:
111
+ try:
112
+ resp = get_client().logs_service.TailLogs(
113
+ run_logs_service_pb2.TailLogsRequest(action_id=action_id, attempt=attempt)
114
+ )
115
+ async for log_set in resp:
116
+ if log_set.logs:
117
+ for log in log_set.logs:
118
+ for line in log.lines:
119
+ yield line
120
+ return
121
+ except asyncio.CancelledError:
122
+ return
123
+ except KeyboardInterrupt:
124
+ return
125
+ except StopAsyncIteration:
126
+ return
127
+ except grpc.aio.AioRpcError as e:
128
+ retries += 1
129
+ if retries >= retry:
130
+ if e.code() == grpc.StatusCode.NOT_FOUND:
131
+ raise LogsNotYetAvailableError(
132
+ f"Log stream not available for action {action_id.name} in run {action_id.run.name}."
133
+ )
134
+ else:
135
+ await asyncio.sleep(1)
86
136
 
87
137
  @classmethod
88
138
  async def create_viewer(
@@ -92,6 +142,8 @@ class Logs:
92
142
  max_lines: int = 30,
93
143
  show_ts: bool = False,
94
144
  raw: bool = False,
145
+ filter_system: bool = False,
146
+ panel: bool = False,
95
147
  ):
96
148
  """
97
149
  Create a log viewer for a given action ID and attempt.
@@ -101,16 +153,24 @@ class Logs:
101
153
  and keep only max_lines in view.
102
154
  :param show_ts: Whether to show timestamps in the logs.
103
155
  :param raw: if True, return the raw log lines instead of a viewer.
156
+ :param filter_system: Whether to filter log lines based on system logs.
157
+ :param panel: Whether to use a panel for the log viewer. only applicable if raw is False.
104
158
  """
159
+ if attempt < 1:
160
+ raise ValueError("Attempt number must be greater than 0.")
105
161
  if raw:
106
162
  console = Console()
107
- async for line in cls.tail.aio(cls, action_id=action_id, attempt=attempt):
108
- console.print(_format_line(line, show_ts=show_ts), end="")
163
+ async for line in cls.tail.aio(action_id=action_id, attempt=attempt):
164
+ line_text = _format_line(line, show_ts=show_ts, filter_system=filter_system)
165
+ if line_text:
166
+ console.print(line_text, end="")
109
167
  return
110
168
  viewer = AsyncLogViewer(
111
- log_source=cls.tail.aio(cls, action_id=action_id, attempt=attempt),
169
+ log_source=cls.tail.aio(action_id=action_id, attempt=attempt),
112
170
  max_lines=max_lines,
113
171
  show_ts=show_ts,
114
- name=f"{action_id.run.name}:{action_id.name}",
172
+ name=f"{action_id.run.name}:{action_id.name} ({attempt})",
173
+ filter_system=filter_system,
174
+ panel=panel,
115
175
  )
116
176
  await viewer.run()
flyte/remote/_project.py CHANGED
@@ -1,14 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
- import typing
4
3
  from dataclasses import dataclass
5
- from typing import AsyncGenerator, Literal, Tuple
4
+ from typing import AsyncIterator, Iterator, Literal, Tuple, Union
6
5
 
7
6
  import rich.repr
8
7
  from flyteidl.admin import common_pb2, project_pb2
9
8
 
10
- from flyte._api_commons import syncer
11
- from flyte._initialize import get_client, get_common_config, requires_client
9
+ from flyte._initialize import ensure_client, get_client, get_common_config
10
+ from flyte.syncify import syncify
12
11
 
13
12
 
14
13
  @dataclass
@@ -19,9 +18,8 @@ class Project:
19
18
 
20
19
  _pb2: project_pb2.Project
21
20
 
21
+ @syncify
22
22
  @classmethod
23
- @requires_client
24
- @syncer.wrap
25
23
  async def get(cls, name: str, org: str | None = None) -> Project:
26
24
  """
27
25
  Get a run by its ID or name. If both are provided, the ID will take precedence.
@@ -29,6 +27,7 @@ class Project:
29
27
  :param name: The name of the project.
30
28
  :param org: The organization of the project (if applicable).
31
29
  """
30
+ ensure_client()
32
31
  service = get_client().project_domain_service # type: ignore
33
32
  resp = await service.GetProject(
34
33
  project_pb2.ProjectGetRequest(
@@ -38,14 +37,13 @@ class Project:
38
37
  )
39
38
  return cls(resp)
40
39
 
40
+ @syncify
41
41
  @classmethod
42
- @requires_client
43
- @syncer.wrap
44
42
  async def listall(
45
43
  cls,
46
44
  filters: str | None = None,
47
45
  sort_by: Tuple[str, Literal["asc", "desc"]] | None = None,
48
- ) -> typing.Union[typing.Iterator[Project], AsyncGenerator[Project, None]]:
46
+ ) -> Union[AsyncIterator[Project], Iterator[Project]]:
49
47
  """
50
48
  Get a run by its ID or name. If both are provided, the ID will take precedence.
51
49
 
@@ -53,6 +51,7 @@ class Project:
53
51
  :param sort_by: The sorting criteria for the project list, in the format (field, order).
54
52
  :return: An iterator of projects.
55
53
  """
54
+ ensure_client()
56
55
  token = None
57
56
  sort_by = sort_by or ("created_at", "asc")
58
57
  sort_pb2 = common_pb2.Sort(