truefoundry 0.4.1rc1__py3-none-any.whl → 0.4.2rc2__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 truefoundry might be problematic. Click here for more details.

@@ -8,7 +8,7 @@ from truefoundry.common.constants import VERSION_PREFIX
8
8
  from truefoundry.common.entities import DeviceCode, Token
9
9
  from truefoundry.common.exceptions import BadRequestException
10
10
  from truefoundry.common.request_utils import request_handling, requests_retry_session
11
- from truefoundry.common.utils import poll_for_function
11
+ from truefoundry.common.utils import poll_for_function, relogin_error_message
12
12
  from truefoundry.logger import logger
13
13
 
14
14
 
@@ -16,6 +16,7 @@ class AuthServiceClient(ABC):
16
16
  def __init__(self, tenant_name: str):
17
17
  self._tenant_name = tenant_name
18
18
 
19
+ # TODO (chiragjn): Rename base_url to tfy_host
19
20
  @classmethod
20
21
  def from_base_url(cls, base_url: str) -> "AuthServiceClient":
21
22
  from truefoundry.common.servicefoundry_client import (
@@ -54,7 +55,9 @@ class ServiceFoundryServerAuthServiceClient(AuthServiceClient):
54
55
  if not token.refresh_token:
55
56
  # TODO: Add a way to propagate error messages without traceback to the output interface side
56
57
  raise Exception(
57
- f"Unable to resume login session. Please log in again using `tfy login {host_arg_str} --relogin`"
58
+ relogin_error_message(
59
+ "Unable to resume login session.", host=host_arg_str
60
+ )
58
61
  )
59
62
  url = f"{self._api_server_url}/{VERSION_PREFIX}/oauth2/token"
60
63
  data = {
@@ -70,7 +73,9 @@ class ServiceFoundryServerAuthServiceClient(AuthServiceClient):
70
73
  return Token.parse_obj(response_data)
71
74
  except BadRequestException as ex:
72
75
  raise Exception(
73
- f"Unable to resume login session. Please log in again using `tfy login {host_arg_str} --relogin`"
76
+ relogin_error_message(
77
+ "Unable to resume login session.", host=host_arg_str
78
+ )
74
79
  ) from ex
75
80
 
76
81
  def get_device_code(self) -> DeviceCode:
@@ -127,7 +132,9 @@ class AuthServerServiceClient(AuthServiceClient):
127
132
  if not token.refresh_token:
128
133
  # TODO: Add a way to propagate error messages without traceback to the output interface side
129
134
  raise Exception(
130
- f"Unable to resume login session. Please log in again using `tfy login {host_arg_str} --relogin`"
135
+ relogin_error_message(
136
+ "Unable to resume login session.", host=host_arg_str
137
+ )
131
138
  )
132
139
  url = f"{self._auth_server_url}/api/{VERSION_PREFIX}/oauth/token/refresh"
133
140
  data = {
@@ -141,7 +148,9 @@ class AuthServerServiceClient(AuthServiceClient):
141
148
  return Token.parse_obj(response_data)
142
149
  except BadRequestException as ex:
143
150
  raise Exception(
144
- f"Unable to resume login session. Please log in again using `tfy login {host_arg_str} --relogin`"
151
+ relogin_error_message(
152
+ "Unable to resume login session.", host=host_arg_str
153
+ )
145
154
  ) from ex
146
155
 
147
156
  def get_device_code(self) -> DeviceCode:
@@ -10,6 +10,7 @@ from filelock import FileLock, Timeout
10
10
 
11
11
  from truefoundry.common.constants import CREDENTIAL_FILEPATH
12
12
  from truefoundry.common.entities import CredentialsFileContent
13
+ from truefoundry.common.utils import relogin_error_message
13
14
  from truefoundry.logger import logger
14
15
 
15
16
 
@@ -87,9 +88,9 @@ class CredentialsFileManager:
87
88
  return CredentialsFileContent.parse_file(self._credentials_file_path)
88
89
  except Exception as ex:
89
90
  raise Exception(
90
- "Error while reading the credentials file "
91
- f"{self._credentials_file_path}. Please login again "
92
- "using `tfy login --relogin` or `tfy.login(relogin=True)` function"
91
+ relogin_error_message(
92
+ f"Error while reading the credentials file {self._credentials_file_path}"
93
+ )
93
94
  ) from ex
94
95
 
95
96
  @_ensure_lock_taken
@@ -6,7 +6,7 @@ from truefoundry.common.auth_service_client import AuthServiceClient
6
6
  from truefoundry.common.constants import TFY_API_KEY_ENV_KEY
7
7
  from truefoundry.common.credential_file_manager import CredentialsFileManager
8
8
  from truefoundry.common.entities import CredentialsFileContent, Token
9
- from truefoundry.common.utils import resolve_base_url
9
+ from truefoundry.common.utils import resolve_tfy_host
10
10
  from truefoundry.logger import logger
11
11
 
12
12
  TOKEN_REFRESH_LOCK = threading.RLock()
@@ -17,6 +17,7 @@ class CredentialProvider(ABC):
17
17
  @abstractmethod
18
18
  def token(self) -> Token: ...
19
19
 
20
+ # TODO (chiragjn): Rename base_url to tfy_host
20
21
  @property
21
22
  @abstractmethod
22
23
  def base_url(self) -> str: ...
@@ -34,10 +35,8 @@ class EnvCredentialProvider(CredentialProvider):
34
35
  raise Exception(
35
36
  f"Value of {TFY_API_KEY_ENV_KEY} env var should be non-empty string"
36
37
  )
37
- # TODO: Read host from cred file as well.
38
- base_url = resolve_base_url().strip("/")
39
- self._host = base_url
40
- self._auth_service = AuthServiceClient.from_base_url(base_url=base_url)
38
+ self._host = resolve_tfy_host()
39
+ self._auth_service = AuthServiceClient.from_base_url(base_url=self._host)
41
40
  self._token: Token = Token(access_token=api_key, refresh_token=None) # type: ignore[call-arg]
42
41
 
43
42
  @staticmethod
@@ -68,6 +68,7 @@ def _cached_get_python_sdk_config(api_server_url: str) -> PythonSDKConfig:
68
68
 
69
69
 
70
70
  class ServiceFoundryServiceClient:
71
+ # TODO (chiragjn): Rename base_url to tfy_host
71
72
  def __init__(self, base_url: str):
72
73
  self._base_url = base_url.strip("/")
73
74
  self._api_server_url = append_servicefoundry_path_to_base_url(self._base_url)
@@ -14,6 +14,17 @@ from truefoundry.common.constants import (
14
14
  T = TypeVar("T")
15
15
 
16
16
 
17
+ def relogin_error_message(message: str, host: str = "HOST") -> str:
18
+ suffix = ""
19
+ if host == "HOST":
20
+ suffix = " where HOST is TrueFoundry platform URL"
21
+ return (
22
+ f"{message}\n"
23
+ f"Please login again using `tfy login --host {host} --relogin` "
24
+ f"or `truefoundry.login(host={host!r}, relogin=True)` function" + suffix
25
+ )
26
+
27
+
17
28
  def timed_lru_cache(
18
29
  seconds: int = 300, maxsize: Optional[int] = None
19
30
  ) -> Callable[[Callable[..., T]], Callable[..., T]]:
@@ -42,14 +53,25 @@ def poll_for_function(
42
53
  time.sleep(poll_after_secs)
43
54
 
44
55
 
45
- def resolve_base_url(host: Optional[str] = None) -> str:
46
- if not host and not os.getenv(TFY_HOST_ENV_KEY):
56
+ def validate_tfy_host(tfy_host: str) -> str:
57
+ if not (tfy_host.startswith("https://") or tfy_host.startswith("http://")):
58
+ raise ValueError(
59
+ f"Invalid host {tfy_host!r}. It should start with https:// or http://"
60
+ )
61
+
62
+
63
+ def resolve_tfy_host(tfy_host: Optional[str] = None) -> str:
64
+ if not tfy_host and not os.getenv(TFY_HOST_ENV_KEY):
47
65
  raise ValueError(
48
- f"Either `host` should be provided by --host <value>, or `{TFY_HOST_ENV_KEY}` env must be set"
66
+ f"Either `host` should be provided using `--host <value>`, or `{TFY_HOST_ENV_KEY}` env must be set"
49
67
  )
50
- return host or os.getenv(TFY_HOST_ENV_KEY)
68
+ tfy_host = tfy_host or os.getenv(TFY_HOST_ENV_KEY)
69
+ tfy_host = tfy_host.strip("/")
70
+ validate_tfy_host(tfy_host)
71
+ return tfy_host
51
72
 
52
73
 
74
+ # TODO (chiragjn): Rename base_url to tfy_host
53
75
  def append_servicefoundry_path_to_base_url(base_url: str):
54
76
  if urlsplit(base_url).netloc.startswith("localhost"):
55
77
  return os.getenv(SERVICEFOUNDRY_SERVER_URL_ENV_KEY)
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: application.json
3
- # timestamp: 2024-09-29T10:28:22+00:00
3
+ # timestamp: 2024-10-09T13:00:44+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -363,10 +363,12 @@ class HelmRepo(BaseModel):
363
363
  description="+label=Helm repository URL\n+sort=1\n+message=Needs to be a valid URL.",
364
364
  )
365
365
  chart: str = Field(
366
- ..., description="+label=Chart name\n+sort=2\n+usage=The helm chart name"
366
+ ...,
367
+ description='+label=Chart name\n+sort=2\n+usage=The helm chart name\n+uiType=InputSelect\n+uiProps={"creatable":true, "searchable":true}',
367
368
  )
368
369
  version: str = Field(
369
- ..., description="+label=Version\n+sort=3\n+usage=Helm chart version"
370
+ ...,
371
+ description='+label=Version\n+sort=3\n+usage=Helm chart version\n+uiType=InputSelect\n+uiProps={"creatable":true, "searchable":true}',
370
372
  )
371
373
 
372
374
 
@@ -448,10 +450,14 @@ class JobAlert(BaseModel):
448
450
  +label=Alert
449
451
  """
450
452
 
451
- notification_channel: str = Field(
453
+ notification_channel: constr(min_length=1) = Field(
452
454
  ...,
453
455
  description='+label=Notification Channel\n+usage=Specify the notification channel to send alerts to\n+uiType=IntegrationSelect\n+uiProps={"integrationType":"notification-channel"}\n+sort=660',
454
456
  )
457
+ to_emails: Optional[List[constr(min_length=1)]] = Field(
458
+ None,
459
+ description="+label=To Emails\n+usage=List of recipients' email addresses if the notification channel is Email.\n+docs=Specify the emails to send alerts to\n+sort=665",
460
+ )
455
461
  on_start: bool = Field(
456
462
  False,
457
463
  description="+label=On Start\n+usage=Send an alert when the job starts\n+sort=670",
@@ -1546,7 +1552,7 @@ class SSHServer(BaseWorkbenchInput):
1546
1552
  image: WorkbenchImage
1547
1553
  ssh_public_key: str = Field(
1548
1554
  ...,
1549
- description="+label: SSH Public Key\n+usage=Add Your SSH Public Key, this will be used to authenticate you to the SSH Server. You can find it using `cat ~/.ssh/id_rsa.pub`\n+sort=4",
1555
+ description="+label: SSH Public Key\n+usage=Add Your SSH Public Key, this will be used to authenticate you to the SSH Server. \\\nYou can find it using `cat ~/.ssh/id_rsa.pub` in Mac/Linux or `type $home\\.ssh\\id_rsa.pub` in Windows Powershell. \\\nYou can also generate a new SSH key pair using `ssh-keygen -t rsa` in your local terminal. (same for both Mac/Linux and Windows Powershell)\n+uiType=TextArea\n+sort=4",
1550
1556
  )
1551
1557
 
1552
1558
 
@@ -8,6 +8,7 @@ from truefoundry.common.credential_provider import (
8
8
  FileCredentialProvider,
9
9
  )
10
10
  from truefoundry.common.entities import UserInfo
11
+ from truefoundry.common.utils import relogin_error_message
11
12
  from truefoundry.logger import logger
12
13
 
13
14
  ACTIVE_SESSION: Optional[ServiceFoundrySession] = None
@@ -41,8 +42,9 @@ class ServiceFoundrySession:
41
42
  break
42
43
  if final_cred_provider is None:
43
44
  raise Exception(
44
- "Please login again using `tfy login --relogin`"
45
- "or `tfy.login(relogin=True)` function"
45
+ relogin_error_message(
46
+ "No active session found. Perhaps you are not logged in?",
47
+ )
46
48
  )
47
49
  return final_cred_provider
48
50
 
@@ -76,6 +76,7 @@ def _upload_packaged_code(metadata, package_file):
76
76
 
77
77
 
78
78
  class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
79
+ # TODO (chiragjn): Rename base_url to tfy_host
79
80
  def __init__(self, init_session: bool = True, base_url: Optional[str] = None):
80
81
  self._session: Optional[ServiceFoundrySession] = None
81
82
  if init_session:
@@ -8,7 +8,7 @@ from truefoundry.common.constants import TFY_API_KEY_ENV_KEY, TFY_HOST_ENV_KEY
8
8
  from truefoundry.common.credential_file_manager import CredentialsFileManager
9
9
  from truefoundry.common.credential_provider import EnvCredentialProvider
10
10
  from truefoundry.common.entities import CredentialsFileContent, Token
11
- from truefoundry.common.utils import resolve_base_url
11
+ from truefoundry.common.utils import relogin_error_message, resolve_tfy_host
12
12
  from truefoundry.deploy.io.output_callback import OutputCallBack
13
13
  from truefoundry.deploy.lib.const import (
14
14
  RICH_OUTPUT_CALLBACK,
@@ -43,7 +43,7 @@ def login(
43
43
  "Login will just save the credentials on disk."
44
44
  )
45
45
 
46
- host = resolve_base_url(host).strip("/")
46
+ host = resolve_tfy_host(host)
47
47
 
48
48
  with CredentialsFileManager() as cred_file:
49
49
  if not relogin and cred_file.exists():
@@ -58,10 +58,10 @@ def login(
58
58
  user_info = cred_file_content.to_token().to_user_info()
59
59
  user_name_display_info = user_info.email or user_info.user_type.value
60
60
  output_hook.print_line(
61
- f"Already logged in to {cred_file_content.host!r} as "
62
- f"{user_info.user_id!r} ({user_name_display_info})\n"
63
- "Please use `tfy login --relogin` or `tfy.login(relogin=True)` "
64
- "to force relogin"
61
+ relogin_error_message(
62
+ f"Already logged in to {cred_file_content.host!r} as {user_info.user_id!r} ({user_name_display_info})",
63
+ host=host,
64
+ )
65
65
  )
66
66
  return False
67
67
 
@@ -16,6 +16,7 @@ from truefoundry.ml.run_utils import append_servicefoundry_path_to_tracking_uri
16
16
 
17
17
 
18
18
  class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
19
+ # TODO (chiragjn): Rename tracking_uri to tfy_host
19
20
  def __init__(self, tracking_uri: str, token: Optional[str] = None):
20
21
  super().__init__(base_url=tracking_uri)
21
22
  self.host_creds = HostCreds(
@@ -7,6 +7,7 @@ from typing import Any, Dict, Iterator, List, Optional, Sequence, Tuple, Union
7
7
  import coolname
8
8
  import pandas as pd
9
9
 
10
+ from truefoundry.common.utils import relogin_error_message
10
11
  from truefoundry.ml import constants, env_vars
11
12
  from truefoundry.ml.autogen.client import ( # type: ignore[attr-defined]
12
13
  ArtifactDto,
@@ -213,8 +214,9 @@ class MlFoundry:
213
214
  session = get_active_session()
214
215
  if session is None:
215
216
  raise MlFoundryException(
216
- "No active session found. Perhaps you are not logged in?\n"
217
- "Please log in using `tfy login [--host HOST] --relogin"
217
+ relogin_error_message(
218
+ "No active session found. Perhaps you are not logged in?",
219
+ )
218
220
  )
219
221
  servicefoundry_client = ServiceFoundryServiceClient(
220
222
  tracking_uri=self.get_tracking_uri(),
@@ -19,6 +19,7 @@ from typing import (
19
19
  from urllib.parse import urljoin, urlsplit
20
20
 
21
21
  from truefoundry import version
22
+ from truefoundry.common.utils import relogin_error_message
22
23
  from truefoundry.ml import constants, enums
23
24
  from truefoundry.ml.autogen.client import ( # type: ignore[attr-defined]
24
25
  ArtifactType,
@@ -51,6 +52,8 @@ from truefoundry.ml.run_utils import ParamsType, flatten_dict, process_params
51
52
  from truefoundry.ml.session import ACTIVE_RUNS, _get_api_client, get_active_session
52
53
  from truefoundry.ml.validation_utils import (
53
54
  MAX_ENTITY_KEY_LENGTH,
55
+ MAX_METRICS_PER_BATCH,
56
+ MAX_PARAMS_TAGS_PER_BATCH,
54
57
  _validate_batch_log_data,
55
58
  )
56
59
 
@@ -222,8 +225,9 @@ class MlFoundryRun:
222
225
  session = get_active_session()
223
226
  if session is None:
224
227
  raise MlFoundryException(
225
- "No active session found. Perhaps you are not logged in?\n"
226
- "Please log in using `tfy login [--host HOST] --relogin"
228
+ relogin_error_message(
229
+ "No active session found. Perhaps you are not logged in?",
230
+ )
227
231
  )
228
232
  base_url = "{uri.scheme}://{uri.netloc}/".format(
229
233
  uri=urlsplit(session.tracking_uri)
@@ -636,12 +640,16 @@ class MlFoundryRun:
636
640
  return
637
641
 
638
642
  try:
639
- _validate_batch_log_data(metrics=metrics, params=[], tags=[])
640
- self._runs_api.log_run_batch_post(
641
- log_batch_request_dto=LogBatchRequestDto(
642
- run_id=self.run_id, metrics=metrics, params=[], tags=[]
643
+ for i in range(0, len(metrics), MAX_METRICS_PER_BATCH):
644
+ metrics_batch = metrics[i : i + MAX_METRICS_PER_BATCH]
645
+
646
+ _validate_batch_log_data(metrics=metrics_batch, params=[], tags=[])
647
+
648
+ self._runs_api.log_run_batch_post(
649
+ log_batch_request_dto=LogBatchRequestDto(
650
+ run_id=self.run_id, metrics=metrics_batch, params=[], tags=[]
651
+ )
643
652
  )
644
- )
645
653
  except Exception as e:
646
654
  raise MlFoundryException(str(e)) from e
647
655
 
@@ -723,12 +731,17 @@ class MlFoundryRun:
723
731
  if len(params) == 0:
724
732
  logger.warning("Cannot log empty params dictionary")
725
733
 
726
- _validate_batch_log_data(metrics=[], params=params, tags=[])
727
- self._runs_api.log_run_batch_post(
728
- log_batch_request_dto=LogBatchRequestDto(
729
- run_id=self.run_id, metrics=[], params=params, tags=[]
734
+ for i in range(0, len(params), MAX_PARAMS_TAGS_PER_BATCH):
735
+ params_batch = params[i : i + MAX_PARAMS_TAGS_PER_BATCH]
736
+
737
+ _validate_batch_log_data(metrics=[], params=params_batch, tags=[])
738
+ logger.debug("Logging parameters: %s", params_batch)
739
+
740
+ self._runs_api.log_run_batch_post(
741
+ log_batch_request_dto=LogBatchRequestDto(
742
+ run_id=self.run_id, metrics=[], params=params_batch, tags=[]
743
+ )
730
744
  )
731
- )
732
745
  except Exception as e:
733
746
  raise MlFoundryException(str(e)) from e
734
747
  logger.info("Parameters logged successfully")
@@ -765,11 +778,15 @@ class MlFoundryRun:
765
778
  tags_arr = [
766
779
  RunTagDto(key=key, value=str(value)) for key, value in tags.items()
767
780
  ]
768
- self._runs_api.log_run_batch_post(
769
- log_batch_request_dto=LogBatchRequestDto(
770
- run_id=self.run_id, metrics=[], params=[], tags=tags_arr
781
+ for i in range(0, len(tags_arr), MAX_PARAMS_TAGS_PER_BATCH):
782
+ tags_batch = tags_arr[i : i + MAX_PARAMS_TAGS_PER_BATCH]
783
+
784
+ _validate_batch_log_data(metrics=[], params=[], tags=tags_batch)
785
+ self._runs_api.log_run_batch_post(
786
+ log_batch_request_dto=LogBatchRequestDto(
787
+ run_id=self.run_id, metrics=[], params=[], tags=tags_batch
788
+ )
771
789
  )
772
- )
773
790
  except Exception as e:
774
791
  raise MlFoundryException(str(e)) from e
775
792
  logger.info("Tags set successfully")
truefoundry/ml/session.py CHANGED
@@ -10,6 +10,7 @@ from truefoundry.common.credential_provider import (
10
10
  )
11
11
  from truefoundry.common.entities import Token, UserInfo
12
12
  from truefoundry.common.request_utils import urllib3_retry
13
+ from truefoundry.common.utils import relogin_error_message
13
14
  from truefoundry.ml.autogen.client import ( # type: ignore[attr-defined]
14
15
  ApiClient,
15
16
  Configuration,
@@ -83,6 +84,7 @@ class Session:
83
84
  self._assert_not_closed()
84
85
  return self._user_info
85
86
 
87
+ # TODO (chiragjn): Rename tracking_uri to tfy_host
86
88
  @property
87
89
  def tracking_uri(self) -> str:
88
90
  return self._cred_provider.base_url
@@ -120,8 +122,9 @@ def _get_api_client(
120
122
  return ApiClient()
121
123
  else:
122
124
  raise MlFoundryException(
123
- "No active session found. Perhaps you are not logged in?\n"
124
- "Please log in using `tfy login [--host HOST] --relogin"
125
+ relogin_error_message(
126
+ "No active session found. Perhaps you are not logged in?",
127
+ )
125
128
  )
126
129
 
127
130
  creds = session.get_host_creds()
@@ -144,8 +147,9 @@ def init_session() -> Session:
144
147
  break
145
148
  if final_cred_provider is None:
146
149
  raise MlFoundryException(
147
- "Please login using `tfy login` command "
148
- "or `truefoundry.login()` function call"
150
+ relogin_error_message(
151
+ "No active session found. Perhaps you are not logged in?",
152
+ )
149
153
  )
150
154
  new_session = Session(cred_provider=final_cred_provider)
151
155
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: truefoundry
3
- Version: 0.4.1rc1
3
+ Version: 0.4.2rc2
4
4
  Summary: Truefoundry CLI
5
5
  Author: Abhishek Choudhary
6
6
  Author-email: abhishek@truefoundry.com
@@ -26,17 +26,17 @@ truefoundry/autodeploy/utils/pydantic_compat.py,sha256=hEAUy5kLjhPdzw7yGZ2iXGMXb
26
26
  truefoundry/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  truefoundry/cli/__main__.py,sha256=-NkhYlT3mC5MhtekueKAvCw-sWvguj0LJRpXWzvvFjc,727
28
28
  truefoundry/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- truefoundry/common/auth_service_client.py,sha256=upUTo6VODAaOKtszCQZNWnPpRT8CEhpCq9RLBJ0RrRY,7840
29
+ truefoundry/common/auth_service_client.py,sha256=tZOa0NdATnItsMeTnEnUeTZQIgUJtpU-nvLdWtB4Px8,7978
30
30
  truefoundry/common/constants.py,sha256=kHP5ebp7EMfEYaOC-K8T_XPfYi7mXttYgrXYS8bOgkg,359
31
- truefoundry/common/credential_file_manager.py,sha256=MRn5h9Gm4pxZEF_XT-_b2agMBiqyw0o2SLpq9ty_1lY,4255
32
- truefoundry/common/credential_provider.py,sha256=UHr3tH39wGjhC3XdRUdgW7IZeh0cHSIEYJMVO8B4eyw,4107
31
+ truefoundry/common/credential_file_manager.py,sha256=1yEk1Zm2xS4G0VDFwKSZ4w0VUrcPWQ1nJnoBaz9xyKA,4251
32
+ truefoundry/common/credential_provider.py,sha256=YQ6HKl8ZZFTg48vBZMauEAnM6IrEO3oOzM2DA47N-P0,4071
33
33
  truefoundry/common/entities.py,sha256=8O-EGPk4PKqnyoFMKUTxISCU19rz0KBnfRDJU695DhY,3797
34
34
  truefoundry/common/exceptions.py,sha256=ePpiQ_zmWe4e94gOgeMiyP_AZnKwjEBfyXsB5ScGYcI,329
35
35
  truefoundry/common/request_utils.py,sha256=-ss8033PClJOMJuS5Ue1zCFRVK7ZW9vjtva1b5G9uok,2849
36
- truefoundry/common/servicefoundry_client.py,sha256=ornmmhjSY2y-NJeBcoHPKxX3q9Z9XilcHERFSFk-dSU,2886
37
- truefoundry/common/utils.py,sha256=DbyLQM4WiKxzIStg2Ekv7fLs8amZR0HtsF75uqy8tMc,1741
36
+ truefoundry/common/servicefoundry_client.py,sha256=qYSrsbFH8b7N_2oxlXfbJnWfdqHCBQ1dQ5Rr2tdp3zQ,2937
37
+ truefoundry/common/utils.py,sha256=f5Av8X70vZf6eUK4Axm8q75It2-C-3o3uomA0GrFt_4,2506
38
38
  truefoundry/deploy/__init__.py,sha256=ugawKF2G02EmEXX35oZ2tec12d9oWN28Sf6mtGGIERY,2281
39
- truefoundry/deploy/auto_gen/models.py,sha256=I4-tV2V74mljN7lH606pCD5LArK6MvND_i7Vt_aRI5Q,79952
39
+ truefoundry/deploy/auto_gen/models.py,sha256=AjbjNFwWDTIOjN_E1fSUgP-ej9nsb2OpZPhsnIRAVGs,80621
40
40
  truefoundry/deploy/builder/__init__.py,sha256=a1qR6nicHGcxRaeNTxWRsmDs8zsmXc7j13-I8q0qqVk,4938
41
41
  truefoundry/deploy/builder/builders/__init__.py,sha256=tlFLXqyDaKLd4iZbo4Hcu_8gOmgtL6drnXpbmQ6x1P8,636
42
42
  truefoundry/deploy/builder/builders/dockerfile.py,sha256=AXXTziCkaqIhuM_bwyD1vT1znOwemN1TKgU7eyo-KuM,1522
@@ -88,9 +88,9 @@ truefoundry/deploy/io/output_callback.py,sha256=V2YwUFec4G4a67lM4r-x_64AqdOVNo_9
88
88
  truefoundry/deploy/io/rich_output_callback.py,sha256=TJLiRD-EnFVwgcepxR7WN0koKqW1X2DevETPhNPi_nU,829
89
89
  truefoundry/deploy/json_util.py,sha256=x_-7YYQ4_HUIJ8ofOcclAp9JWhgTWjR9Th6Q0FuRqGk,175
90
90
  truefoundry/deploy/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- truefoundry/deploy/lib/auth/servicefoundry_session.py,sha256=d4M56O_ZftFeDRiyRci11QABU9B1HW2eVOeVIrFvevE,1842
91
+ truefoundry/deploy/lib/auth/servicefoundry_session.py,sha256=5TCYPunAygtn5mb0mp_VcWKEalKMKPbyWMWer-Vty2g,1916
92
92
  truefoundry/deploy/lib/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
- truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=fgou4wjuWJzqQgW7iatbSCvmstSjY0iUJldQK5vsruE,26018
93
+ truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=yzbXnVGmILD5BUMLzCHloJiz7YBWU0OCtrE3V09R9vA,26069
94
94
  truefoundry/deploy/lib/clients/shell_client.py,sha256=tMrc0Ha1DmGtUCJrZD8eusOzfe8R_WIe6AAH7nxL0xA,461
95
95
  truefoundry/deploy/lib/const.py,sha256=FCQfnO7IecB1ikQHdLGNvvubq_iF900C9l5TJtDfvFc,314
96
96
  truefoundry/deploy/lib/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -103,7 +103,7 @@ truefoundry/deploy/lib/logs_utils.py,sha256=SQxRv3jDDmgHdOUMhlMaAPGYskybnBUMpst7
103
103
  truefoundry/deploy/lib/messages.py,sha256=nhp0bCYf_XpUM68hTq5lBY-__vtEyV2uP7NgnJXJ_Vg,925
104
104
  truefoundry/deploy/lib/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
105
  truefoundry/deploy/lib/model/entity.py,sha256=8J8yd98iWtSy8giShdDRNyzbN1UgSXx4XtmZLljdWnE,8552
106
- truefoundry/deploy/lib/session.py,sha256=e0iA-fWPBzxm5JqT4hnfv4NOpYexbrtRLSWLqqVtFzs,4986
106
+ truefoundry/deploy/lib/session.py,sha256=Vg6rCA315T0yS0xG4ayJ84Ia_9ZfibH8utOSwPBMAmw,4953
107
107
  truefoundry/deploy/lib/util.py,sha256=RlL3bjZu5Z0LU_OKYaMVfcMU8k7_rmkAp89_0CrZDLk,1520
108
108
  truefoundry/deploy/lib/win32.py,sha256=1RcvPTdlOAJ48rt8rCbE2Ufha2ztRqBAE9dueNXArrY,5009
109
109
  truefoundry/deploy/python_deploy_codegen.py,sha256=Ok7ufDY2x3aMJv9KpaRqxiS-ZI-kxBWauIUHst-ug7E,4020
@@ -296,7 +296,7 @@ truefoundry/ml/cli/commands/__init__.py,sha256=diDUiRUX4l6TtNLI4iF-ZblczkELM7FRV
296
296
  truefoundry/ml/cli/commands/download.py,sha256=cbz9KijiLKXj4-twlig3xZLTVRNm4fnjwpy0leZr31w,2342
297
297
  truefoundry/ml/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
298
298
  truefoundry/ml/clients/entities.py,sha256=sNP4DnAVdQoMfc06s0r3VTzKHTo7jmxAOuTlQOVmsMs,151
299
- truefoundry/ml/clients/servicefoundry_client.py,sha256=lK7mepLNRHHS65Eebynk5HyCMSxqmduXRHO2k8pTIK0,1680
299
+ truefoundry/ml/clients/servicefoundry_client.py,sha256=w8fgZWZF_JjRpL_ZRmLw1BiI7aqDHnJcAXluBgwft0s,1735
300
300
  truefoundry/ml/clients/utils.py,sha256=c0LdC8moejs-Zm30hu1sCqifLEmqhdq4SfZ_m0nUIDk,4402
301
301
  truefoundry/ml/constants.py,sha256=vDq72d4C9FSWqr9MMdjgTF4TuyNFApvo_6RVsSeAjB4,2837
302
302
  truefoundry/ml/entities.py,sha256=si5GAqZsWzKu5MPrU4Hk6se7bebHOYhTiNw69ai-Uk8,1485
@@ -322,10 +322,10 @@ truefoundry/ml/log_types/plot.py,sha256=oFnXNb2o5fVF0zsnRjvqjSjLaphQWUnQCdw72e2u
322
322
  truefoundry/ml/log_types/pydantic_base.py,sha256=eBlw_AEyAz4iJKDP4zgJOCFWcldwQqpf7FADW1jzIQY,272
323
323
  truefoundry/ml/log_types/utils.py,sha256=xjJ21jdPScvFmw3TbVh5NCzbzJwaqiXJyiiT4xxX1EI,335
324
324
  truefoundry/ml/logger.py,sha256=VT-BF3BnBYTWVq87O58F0c8uXMu94gYzsiFlGY3_7Ao,458
325
- truefoundry/ml/mlfoundry_api.py,sha256=8K8te6aLBpwZ-Qg-ALEROiI5FWgPVycyAi_VZaFaLRg,60801
326
- truefoundry/ml/mlfoundry_run.py,sha256=CTUgf2-kPANie9Kog_rJRvpkDfotVzWTHvBg2ofv_FA,44341
325
+ truefoundry/ml/mlfoundry_api.py,sha256=I2T8tXeAIWpD8EH05fm80mNyX6cs2S1ORI4qoo0HTpQ,60847
326
+ truefoundry/ml/mlfoundry_run.py,sha256=rNJl130iJkpjW3MNoe5-d_J9VJJQBqWHEJCfYeiZCbE,45123
327
327
  truefoundry/ml/run_utils.py,sha256=dzbQ_TGkSCYO-gg8tlr5tglR0p2SIQdy0wl4IEQE5JA,2899
328
- truefoundry/ml/session.py,sha256=gASORQ7TZ3kqAyqG64YPfn5Z8Uo2BjOvfhMmTX-X7uM,5263
328
+ truefoundry/ml/session.py,sha256=_WmaGNiZCwQVmB-brbX-z38nFvuqP8f7jGxfqJoq3TM,5385
329
329
  truefoundry/ml/validation_utils.py,sha256=XBSUd9OoyriWJpT3M5LKz17iWY3yVMr3hM5vdaVjtf0,12082
330
330
  truefoundry/pydantic_v1.py,sha256=jSuhGtz0Mbk1qYu8jJ1AcnIDK4oxUsdhALc4spqstmM,345
331
331
  truefoundry/version.py,sha256=bqiT4Q-VWrTC6P4qfK43mez-Ppf-smWfrl6DcwV7mrw,137
@@ -340,7 +340,7 @@ truefoundry/workflow/map_task.py,sha256=2m3qGXQ90k9LdS45q8dqCCECc3qr8t2m_LMCVd1m
340
340
  truefoundry/workflow/python_task.py,sha256=SRXRLC4vdBqGjhkwuaY39LEWN6iPCpJAuW17URRdWTY,1128
341
341
  truefoundry/workflow/task.py,sha256=ToitYiKcNzFCtOVQwz1W8sRjbR97eVS7vQBdbgUQtKg,1779
342
342
  truefoundry/workflow/workflow.py,sha256=WaTqUjhwfAXDWu4E5ehuwAxrCbDJkoAf1oWmR2E9Qy0,4575
343
- truefoundry-0.4.1rc1.dist-info/METADATA,sha256=Pl4VeIlCAJqjQIsSZtxBKd-1tdkdb9rhKSDmVHhnHJ0,3140
344
- truefoundry-0.4.1rc1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
345
- truefoundry-0.4.1rc1.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
346
- truefoundry-0.4.1rc1.dist-info/RECORD,,
343
+ truefoundry-0.4.2rc2.dist-info/METADATA,sha256=8wBExyVvKXs8p3xYsQf8p6uGf8Mb16m8DK2GlgHt78o,3140
344
+ truefoundry-0.4.2rc2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
345
+ truefoundry-0.4.2rc2.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
346
+ truefoundry-0.4.2rc2.dist-info/RECORD,,