truefoundry 0.5.3rc4__py3-none-any.whl → 0.5.3rc5__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.

Files changed (47) hide show
  1. truefoundry/__init__.py +10 -1
  2. truefoundry/autodeploy/cli.py +2 -2
  3. truefoundry/cli/__main__.py +0 -4
  4. truefoundry/cli/util.py +12 -3
  5. truefoundry/common/auth_service_client.py +7 -4
  6. truefoundry/common/constants.py +3 -1
  7. truefoundry/common/credential_provider.py +7 -8
  8. truefoundry/common/exceptions.py +11 -7
  9. truefoundry/common/request_utils.py +96 -14
  10. truefoundry/common/servicefoundry_client.py +31 -29
  11. truefoundry/common/session.py +93 -0
  12. truefoundry/common/storage_provider_utils.py +331 -0
  13. truefoundry/common/utils.py +9 -9
  14. truefoundry/common/warnings.py +21 -0
  15. truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +8 -20
  16. truefoundry/deploy/cli/commands/deploy_command.py +4 -4
  17. truefoundry/deploy/lib/clients/servicefoundry_client.py +13 -14
  18. truefoundry/deploy/lib/dao/application.py +2 -2
  19. truefoundry/deploy/lib/dao/workspace.py +1 -1
  20. truefoundry/deploy/lib/session.py +1 -1
  21. truefoundry/deploy/v2/lib/deploy.py +2 -2
  22. truefoundry/deploy/v2/lib/deploy_workflow.py +1 -1
  23. truefoundry/deploy/v2/lib/patched_models.py +70 -4
  24. truefoundry/deploy/v2/lib/source.py +2 -1
  25. truefoundry/gateway/cli/cli.py +1 -22
  26. truefoundry/gateway/lib/entities.py +3 -8
  27. truefoundry/gateway/lib/models.py +0 -38
  28. truefoundry/ml/artifact/truefoundry_artifact_repo.py +33 -297
  29. truefoundry/ml/clients/servicefoundry_client.py +36 -15
  30. truefoundry/ml/exceptions.py +2 -1
  31. truefoundry/ml/log_types/artifacts/artifact.py +3 -2
  32. truefoundry/ml/log_types/artifacts/model.py +6 -5
  33. truefoundry/ml/log_types/artifacts/utils.py +2 -2
  34. truefoundry/ml/mlfoundry_api.py +6 -38
  35. truefoundry/ml/mlfoundry_run.py +6 -15
  36. truefoundry/ml/model_framework.py +2 -1
  37. truefoundry/ml/session.py +69 -97
  38. truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +42 -9
  39. truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +126 -7
  40. {truefoundry-0.5.3rc4.dist-info → truefoundry-0.5.3rc5.dist-info}/METADATA +1 -1
  41. {truefoundry-0.5.3rc4.dist-info → truefoundry-0.5.3rc5.dist-info}/RECORD +43 -44
  42. truefoundry/deploy/lib/auth/servicefoundry_session.py +0 -61
  43. truefoundry/gateway/lib/client.py +0 -51
  44. truefoundry/ml/clients/entities.py +0 -8
  45. truefoundry/ml/clients/utils.py +0 -122
  46. {truefoundry-0.5.3rc4.dist-info → truefoundry-0.5.3rc5.dist-info}/WHEEL +0 -0
  47. {truefoundry-0.5.3rc4.dist-info → truefoundry-0.5.3rc5.dist-info}/entry_points.txt +0 -0
@@ -13,6 +13,7 @@ from truefoundry.common.constants import (
13
13
  TFY_INTERNAL_SIGNED_URL_SERVER_TOKEN_ENV_KEY,
14
14
  )
15
15
  from truefoundry.common.request_utils import requests_retry_session
16
+ from truefoundry.common.storage_provider_utils import MultiPartUploadStorageProvider
16
17
  from truefoundry.pydantic_v1 import BaseModel, Field
17
18
  from truefoundry.workflow.remote_filesystem.logger import log_time, logger
18
19
 
@@ -20,6 +21,9 @@ LOG_PREFIX = "[tfy][fs]"
20
21
  DEFAULT_TTL = ENV_VARS.TFY_INTERNAL_SIGNED_URL_SERVER_DEFAULT_TTL
21
22
  MAX_TIMEOUT = ENV_VARS.TFY_INTERNAL_SIGNED_URL_SERVER_MAX_TIMEOUT
22
23
  REQUEST_TIMEOUT = ENV_VARS.TFY_INTERNAL_SIGNED_URL_REQUEST_TIMEOUT
24
+ MULTIPART_UPLOAD_FINALIZE_SIGNED_URL_TIMEOUT = (
25
+ ENV_VARS.TFY_INTERNAL_MULTIPART_UPLOAD_FINALIZE_SIGNED_URL_TIMEOUT
26
+ )
23
27
 
24
28
 
25
29
  class SignedURLAPIResponseDto(BaseModel):
@@ -36,6 +40,18 @@ class SignedURLExistsAPIResponseDto(BaseModel):
36
40
  exists: bool
37
41
 
38
42
 
43
+ class PartSignedUrl(BaseModel):
44
+ partNumber: int
45
+ signedUrl: str
46
+
47
+
48
+ class SignedURLMultipartUploadAPIResponseDto(BaseModel):
49
+ uploadId: str
50
+ partSignedUrls: List[PartSignedUrl]
51
+ finalizeSignedUrl: str
52
+ storageProvider: MultiPartUploadStorageProvider
53
+
54
+
39
55
  class FileInfo(BaseModel):
40
56
  path: str
41
57
  is_directory: bool = Field(..., alias="isDirectory")
@@ -56,6 +72,7 @@ class SignedURLServerEndpoint(str, Enum):
56
72
  EXISTS = "/v1/exists"
57
73
  IS_DIRECTORY = "/v1/is-dir"
58
74
  LIST_FILES = "/v1/list-files"
75
+ CREATE_MUTLIPART_UPLOAD = "/v1/multipart-upload"
59
76
 
60
77
 
61
78
  class SignedURLClient:
@@ -98,9 +115,9 @@ class SignedURLClient:
98
115
  self,
99
116
  endpoint: str,
100
117
  method: str = "GET",
101
- payload: Optional[Dict] = None,
102
- headers: Optional[Dict] = None,
103
- ) -> Dict:
118
+ payload: Optional[Dict[str, Any]] = None,
119
+ headers: Optional[Dict[str, Any]] = None,
120
+ ) -> Dict[str, Any]:
104
121
  """Internal method to handle requests to the signed URL server."""
105
122
  url = urljoin(self.base_url, endpoint)
106
123
  try:
@@ -116,9 +133,9 @@ class SignedURLClient:
116
133
  def _make_server_api_call(
117
134
  self,
118
135
  endpoint: SignedURLServerEndpoint,
119
- params: Optional[Dict] = None,
120
- headers: Optional[Dict] = None,
121
- ) -> Dict:
136
+ params: Optional[Dict[str, Any]] = None,
137
+ headers: Optional[Dict[str, Any]] = None,
138
+ ) -> Dict[str, Any]:
122
139
  """Get a signed URL for the specified operation and URI."""
123
140
  query_string = urlencode(params or {})
124
141
  endpoint_with_params = f"{endpoint.value}?{query_string}"
@@ -131,7 +148,7 @@ class SignedURLClient:
131
148
  self,
132
149
  signed_url: str,
133
150
  data: Union[bytes, io.BufferedReader],
134
- headers: Optional[Dict] = None,
151
+ headers: Optional[Dict[str, Any]] = None,
135
152
  ) -> None:
136
153
  """
137
154
  Upload data to the specified storage path using a signed URL.
@@ -190,12 +207,28 @@ class SignedURLClient:
190
207
  )
191
208
  return storage_uri
192
209
 
210
+ def create_multipart_upload(
211
+ self, storage_uri: str, num_parts: int
212
+ ) -> SignedURLMultipartUploadAPIResponseDto:
213
+ response = self._make_server_api_call(
214
+ endpoint=SignedURLServerEndpoint.CREATE_MUTLIPART_UPLOAD,
215
+ params={
216
+ "path": storage_uri,
217
+ "numParts": num_parts,
218
+ "partExpiryInSeconds": self.ttl,
219
+ "finalizationExpiryInSeconds": MULTIPART_UPLOAD_FINALIZE_SIGNED_URL_TIMEOUT,
220
+ },
221
+ headers=self.signed_url_server_headers,
222
+ )
223
+
224
+ return SignedURLMultipartUploadAPIResponseDto.parse_obj(response)
225
+
193
226
  @log_time(prefix=LOG_PREFIX)
194
227
  def _download_file(
195
228
  self,
196
229
  signed_url: str,
197
230
  local_path: Optional[str] = None,
198
- headers: Optional[Dict] = None,
231
+ headers: Optional[Dict[str, Any]] = None,
199
232
  ) -> Optional[bytes]:
200
233
  """Common method to download a file using a signed URL."""
201
234
  try:
@@ -237,7 +270,7 @@ class SignedURLClient:
237
270
  return local_path
238
271
 
239
272
  @log_time(prefix=LOG_PREFIX)
240
- def download_to_bytes(self, storage_uri: str) -> bytes:
273
+ def download_to_bytes(self, storage_uri: str) -> Optional[bytes]:
241
274
  """Download a file from the specified storage path and return it as bytes."""
242
275
  response = self._make_server_api_call(
243
276
  endpoint=SignedURLServerEndpoint.READ,
@@ -2,18 +2,44 @@
2
2
  # pylint: disable=W0223
3
3
  import io
4
4
  import os
5
+ from concurrent.futures import FIRST_EXCEPTION, Future, ThreadPoolExecutor, wait
5
6
  from pathlib import Path
6
- from typing import Optional
7
+ from threading import Event
8
+ from typing import List, Optional, Tuple
7
9
 
8
10
  from fsspec.spec import DEFAULT_CALLBACK, AbstractBufferedFile, AbstractFileSystem
9
11
 
10
12
  from truefoundry.common.constants import ENV_VARS
11
- from truefoundry.workflow.remote_filesystem.logger import log_time
13
+ from truefoundry.common.storage_provider_utils import (
14
+ MultiPartUpload,
15
+ SignedURL,
16
+ _FileMultiPartInfo,
17
+ decide_file_parts,
18
+ s3_compatible_multipart_upload,
19
+ )
20
+ from truefoundry.workflow.remote_filesystem.logger import log_time, logger
12
21
  from truefoundry.workflow.remote_filesystem.tfy_signed_url_client import (
13
22
  LOG_PREFIX,
14
23
  SignedURLClient,
24
+ SignedURLMultipartUploadAPIResponseDto,
15
25
  )
16
26
 
27
+ MULTIPART_SUPPORTED_PROVIDERS = ["s3"]
28
+
29
+
30
+ def _add_file_for_upload(
31
+ local_file: str,
32
+ remote_path: str,
33
+ files_for_normal_upload: List[Tuple[str, str, _FileMultiPartInfo]],
34
+ files_for_multipart_upload: List[Tuple[str, str, _FileMultiPartInfo]],
35
+ multipart_upload_allowed: bool,
36
+ ):
37
+ multipart_info = decide_file_parts(local_file, multipart_upload_allowed)
38
+ if multipart_info.num_parts == 1:
39
+ files_for_normal_upload.append((remote_path, local_file, multipart_info))
40
+ else:
41
+ files_for_multipart_upload.append((remote_path, local_file, multipart_info))
42
+
17
43
 
18
44
  class SignedURLFileSystem(AbstractFileSystem):
19
45
  def __init__(
@@ -100,7 +126,13 @@ class SignedURLFileSystem(AbstractFileSystem):
100
126
  maxdepth=None,
101
127
  **kwargs,
102
128
  ):
129
+ files_for_normal_upload: List[Tuple[str, str, _FileMultiPartInfo]] = []
130
+ files_for_multipart_upload: List[Tuple[str, str, _FileMultiPartInfo]] = []
103
131
  local_path = Path(lpath)
132
+ multipart_upload_allowed = (
133
+ self.protocol in MULTIPART_SUPPORTED_PROVIDERS
134
+ and not ENV_VARS.TFY_ARTIFACTS_DISABLE_MULTIPART_UPLOAD
135
+ )
104
136
  if local_path.is_dir():
105
137
  if not recursive:
106
138
  raise ValueError(
@@ -127,15 +159,102 @@ class SignedURLFileSystem(AbstractFileSystem):
127
159
  for file in files:
128
160
  local_file_path = Path(root) / file
129
161
  remote_file_path = f"{remote_dir}/{file}"
130
- self.client.upload(
131
- file_path=str(local_file_path),
132
- storage_uri=remote_file_path,
162
+ _add_file_for_upload(
163
+ local_file=str(local_file_path),
164
+ remote_path=str(remote_file_path),
165
+ files_for_normal_upload=files_for_normal_upload,
166
+ files_for_multipart_upload=files_for_multipart_upload,
167
+ multipart_upload_allowed=multipart_upload_allowed,
133
168
  )
134
- return None
135
169
  else:
136
170
  if rpath.endswith("/"):
137
171
  rpath = os.path.join(rpath, local_path.name)
138
- return self.client.upload(file_path=lpath, storage_uri=rpath)
172
+ _add_file_for_upload(
173
+ local_file=str(lpath),
174
+ remote_path=str(rpath),
175
+ files_for_normal_upload=files_for_normal_upload,
176
+ files_for_multipart_upload=files_for_multipart_upload,
177
+ multipart_upload_allowed=multipart_upload_allowed,
178
+ )
179
+ return self._upload(
180
+ files_for_normal_upload=files_for_normal_upload,
181
+ files_for_multipart_upload=files_for_multipart_upload,
182
+ )
183
+
184
+ def _upload(
185
+ self,
186
+ files_for_normal_upload: List[Tuple[str, str, _FileMultiPartInfo]],
187
+ files_for_multipart_upload: List[Tuple[str, str, _FileMultiPartInfo]],
188
+ ):
189
+ abort_event = Event()
190
+ with ThreadPoolExecutor(
191
+ max_workers=ENV_VARS.TFY_ARTIFACTS_UPLOAD_MAX_WORKERS
192
+ ) as executor:
193
+ futures: List[Future] = []
194
+ for remote_path, local_path, _ in files_for_normal_upload:
195
+ futures.append(
196
+ executor.submit(
197
+ self.client.upload,
198
+ file_path=local_path,
199
+ storage_uri=remote_path,
200
+ )
201
+ )
202
+
203
+ done, not_done = wait(futures, return_when=FIRST_EXCEPTION)
204
+ if len(not_done) > 0:
205
+ abort_event.set()
206
+ for future in not_done:
207
+ future.cancel()
208
+ for future in done:
209
+ if future.exception() is not None:
210
+ raise future.exception()
211
+
212
+ for remote_path, local_path, multipart_info in files_for_multipart_upload:
213
+ self._multipart_upload(
214
+ local_file=local_path,
215
+ artifact_path=remote_path,
216
+ multipart_info=multipart_info,
217
+ executor=executor,
218
+ abort_event=abort_event,
219
+ )
220
+
221
+ def _multipart_upload(
222
+ self,
223
+ local_file: str,
224
+ artifact_path: str,
225
+ multipart_info: _FileMultiPartInfo,
226
+ executor: ThreadPoolExecutor,
227
+ abort_event: Optional[Event] = None,
228
+ ):
229
+ logger.info(
230
+ "Uploading %s to %s using multipart upload",
231
+ local_file,
232
+ artifact_path,
233
+ )
234
+
235
+ multipart_upload: SignedURLMultipartUploadAPIResponseDto = (
236
+ self.client.create_multipart_upload(
237
+ storage_uri=artifact_path,
238
+ num_parts=multipart_info.num_parts,
239
+ )
240
+ )
241
+ s3_compatible_multipart_upload(
242
+ multipart_upload=MultiPartUpload(
243
+ storage_provider=multipart_upload.storageProvider,
244
+ part_signed_urls=[
245
+ SignedURL(signed_url=url.signedUrl)
246
+ for url in multipart_upload.partSignedUrls
247
+ ],
248
+ s3_compatible_upload_id=multipart_upload.uploadId,
249
+ finalize_signed_url=SignedURL(
250
+ signed_url=multipart_upload.finalizeSignedUrl
251
+ ),
252
+ ),
253
+ local_file=local_file,
254
+ executor=executor,
255
+ multipart_info=multipart_info,
256
+ abort_event=abort_event,
257
+ )
139
258
 
140
259
  @log_time(prefix=LOG_PREFIX)
141
260
  def isdir(self, path):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: truefoundry
3
- Version: 0.5.3rc4
3
+ Version: 0.5.3rc5
4
4
  Summary: Truefoundry CLI
5
5
  Author: Abhishek Choudhary
6
6
  Author-email: abhishek@truefoundry.com
@@ -1,11 +1,11 @@
1
- truefoundry/__init__.py,sha256=jynqfY0pDmcaXlxewDnMQC5CYAIW9JFjptBrw7y76rY,81
1
+ truefoundry/__init__.py,sha256=Go9M0PvV9kYX8dhldJzpH0RAYB_Pc1kVOxfNlsps89c,321
2
2
  truefoundry/autodeploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  truefoundry/autodeploy/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  truefoundry/autodeploy/agents/base.py,sha256=lYw6bKhfCWff5BbtXXn2k4MjMbRIUkOwPBjRT70iXE8,6420
5
5
  truefoundry/autodeploy/agents/developer.py,sha256=tO9vmgGjoaqK4rX-DFCyMrViFC2Oqofd89WoXqsEm-A,4142
6
6
  truefoundry/autodeploy/agents/project_identifier.py,sha256=KlF7FwrGHDCjF3y3-YaCDxZ8kE34s6XPBagXhG2U1aM,4520
7
7
  truefoundry/autodeploy/agents/tester.py,sha256=lqvVBuVcFRvGZnSLAUF2r-1-Yti20o_cbybU19IlSXo,2418
8
- truefoundry/autodeploy/cli.py,sha256=1VnDAP9ylM6l00v0Ko5KL6_Dr7bL_voeAPdbEvWvU3Y,14215
8
+ truefoundry/autodeploy/cli.py,sha256=9ZxKu_MGIpraMzaW4ZyuQZhlKIQYE3biBrBV4S1h6Fo,14167
9
9
  truefoundry/autodeploy/constants.py,sha256=vTh2nA7cjqghqbW2rNh3FbtcIk2scdAWZuuQCmVBO80,1273
10
10
  truefoundry/autodeploy/exception.py,sha256=fa_ZyTDUKiMKG2Uayynk1yWcEMsuVluqk2GtV4tfTPU,158
11
11
  truefoundry/autodeploy/logger.py,sha256=tkV2UKcOTFl5nz0cn4eRbzxF-2CZd8b7MK9vnhaflYw,325
@@ -24,23 +24,26 @@ truefoundry/autodeploy/utils/client.py,sha256=PvbSkfgAjAogGjisinqmh4mP4svowxAC0I
24
24
  truefoundry/autodeploy/utils/diff.py,sha256=Ef8Y-VffDKel_-q-GxRam6gqiv8qTLMcqVg6iifXfcA,5358
25
25
  truefoundry/autodeploy/utils/pydantic_compat.py,sha256=hEAUy5kLjhPdzw7yGZ2iXGMXbbMVXVlGzIofmyHafXQ,412
26
26
  truefoundry/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- truefoundry/cli/__main__.py,sha256=mYgMZRvI3sBP3_6DA0WwtFUZQTV3r8gJpMFvMJb-OOE,3692
27
+ truefoundry/cli/__main__.py,sha256=0nEwE0UkFagCO5ctGcqEThdmBT2fN8MVcr0ERItnsNQ,3483
28
28
  truefoundry/cli/commands/pat.py,sha256=0rm95ny1b3KfeBJSRWh1M4lR46ERnp96ovUZKu-P5Ss,602
29
29
  truefoundry/cli/config.py,sha256=tf8w4UfVzcC6eYkENvuuCPYt_V3sqVpO1bclORV9tAk,206
30
30
  truefoundry/cli/console.py,sha256=9-dMy4YPisCJQziRKTg8Qa0UJnOGl1soiUnJjsnLDvE,242
31
31
  truefoundry/cli/const.py,sha256=dVHPo1uAiDSSMXwXoT2mR5kNQjExT98QNVRz98Hz_Ts,510
32
32
  truefoundry/cli/display_util.py,sha256=vypx4FQImmDwl2QAj7GpjwlpvG3VFhqoNPvCkBzGqNg,3120
33
- truefoundry/cli/util.py,sha256=yA8sie7TBTOu-5QFf2zEFWYEKYcBCaV6o1gtctj1dtI,3390
33
+ truefoundry/cli/util.py,sha256=gLSKts2js8ThKXV19p2ENv5seSf12PrUemUsveNmcGY,3717
34
34
  truefoundry/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- truefoundry/common/auth_service_client.py,sha256=RRiGUqITxeVYwKZLc923zJP-61UAvFtVlMaG2HJBvXc,7940
36
- truefoundry/common/constants.py,sha256=VbwTn5nzdUnG8u50_dnq_zWwcLf5PXFinhhSogsOAys,2667
35
+ truefoundry/common/auth_service_client.py,sha256=N3YxKlx63r6cPZqbgb2lqBOPI69ShB7D7RCIq4FSCjc,7949
36
+ truefoundry/common/constants.py,sha256=WQjylPv7xTVYURv4zicJUHYL73Gv3c3i6Iw4oy9Lhg4,2744
37
37
  truefoundry/common/credential_file_manager.py,sha256=1yEk1Zm2xS4G0VDFwKSZ4w0VUrcPWQ1nJnoBaz9xyKA,4251
38
- truefoundry/common/credential_provider.py,sha256=Aht7hFLsnyRgMR34dRbzln7dor0WYSeA8ej8ApNmnKM,4148
38
+ truefoundry/common/credential_provider.py,sha256=R666i1ADKb2ldwEVh9lnaFcPaa4q3vAscIX3MX1UiFA,4097
39
39
  truefoundry/common/entities.py,sha256=8O-EGPk4PKqnyoFMKUTxISCU19rz0KBnfRDJU695DhY,3797
40
- truefoundry/common/exceptions.py,sha256=ePpiQ_zmWe4e94gOgeMiyP_AZnKwjEBfyXsB5ScGYcI,329
41
- truefoundry/common/request_utils.py,sha256=5xw4YGUcMf71Ncal3OfFCa-PoWDIvG3hYGCDa4Da4OI,2854
42
- truefoundry/common/servicefoundry_client.py,sha256=2fxmgCM-ckFHpnm6n_mL-5Z8RWN_q-dYVvFC29bkYSg,3120
43
- truefoundry/common/utils.py,sha256=H87mfvqSE9OSRRdX-G9m3_JvWLVtkNuLmsFsvJHMczc,6098
40
+ truefoundry/common/exceptions.py,sha256=jkU0N7hV_P-EhXeud4I5vuB9glXXZSWPf8LcH04mSbw,459
41
+ truefoundry/common/request_utils.py,sha256=e9qrAQ1MutU7JALDKcucmNd0KQEVBqgW3yx0w1zeHIU,5700
42
+ truefoundry/common/servicefoundry_client.py,sha256=295ZXOEM46lXZP59O04XFTDCsZLtz3MssXRDMk2x9hg,3169
43
+ truefoundry/common/session.py,sha256=BiTJ2WEzLkTvzpqy67xX3fXgiKH_ltzzmQdFG7xUtwI,2904
44
+ truefoundry/common/storage_provider_utils.py,sha256=yURhMw8k0FLFvaviRHDiifhvc6GnuQwGMC9Qd2uM440,10934
45
+ truefoundry/common/utils.py,sha256=sZyg-vpShVXvnrwnINrdsyWJR3FHMUBiOB1CslYdQTo,6072
46
+ truefoundry/common/warnings.py,sha256=rs6BHwk7imQYedo07iwh3TWEOywAR3Lqhj0AY4khByg,504
44
47
  truefoundry/deploy/__init__.py,sha256=p14_yIJw2bcaKW3c1DTaoM7UwfHvt2T_MfeFlZIz1g4,2359
45
48
  truefoundry/deploy/auto_gen/models.py,sha256=3_GTdaYE95piMzhbM4SvMSQhP4UGWDGpJnLxERjYHGw,82555
46
49
  truefoundry/deploy/builder/__init__.py,sha256=1qjHMNBE1poRCZW0WrG46dFM1f1IlivD5352qzsioMU,4953
@@ -49,7 +52,7 @@ truefoundry/deploy/builder/builders/dockerfile.py,sha256=AXXTziCkaqIhuM_bwyD1vT1
49
52
  truefoundry/deploy/builder/builders/tfy_notebook_buildpack/__init__.py,sha256=x_GwRFKz-Kb4-ZlxOFjBlr0mTgUDe_hVeG4dsIbHo8c,1796
50
53
  truefoundry/deploy/builder/builders/tfy_notebook_buildpack/dockerfile_template.py,sha256=rQgdvKmAT9HArVW4TAG5yd2QTKRs3S5LJ9RQbc_EkHE,2518
51
54
  truefoundry/deploy/builder/builders/tfy_python_buildpack/__init__.py,sha256=9r1PYahn-HfzpMth6NkvJoycmmHQpSl0vIVZxWF12xI,1864
52
- truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py,sha256=lQxEl7VNv9pCSTcaGe-ARicd5481RmRtVX5U6G18ptY,9429
55
+ truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py,sha256=X9mKH7SGZLGZGvY0S2aPB3sgWdSR9TY4eVXtqz_idEA,8973
53
56
  truefoundry/deploy/builder/constants.py,sha256=amUkHoHvVKzGv0v_knfiioRuKiJM0V0xW0diERgWiI0,508
54
57
  truefoundry/deploy/builder/docker_service.py,sha256=OI8efqK0Gnoii8bcHihpA2StwHVzsMREfBk7NvMR4hY,3950
55
58
  truefoundry/deploy/builder/utils.py,sha256=D68-bqM0NQx-Elg-56mtkENyVyg9faZ9tgTmBuo1Sjs,1076
@@ -60,7 +63,7 @@ truefoundry/deploy/cli/commands/build_command.py,sha256=zJBywMatbpUlXx5O2aqpEVmP
60
63
  truefoundry/deploy/cli/commands/build_logs_command.py,sha256=DE_yprQQ6PrhOQo3xsYxGWQrXSopzSYDkt3hWB4n728,2790
61
64
  truefoundry/deploy/cli/commands/create_command.py,sha256=rCajvQvAfZU10nDZOYpRACbAATH1zj52ihTWrhnLLUc,1829
62
65
  truefoundry/deploy/cli/commands/delete_command.py,sha256=JMibxvt1rsZ8sODa0jI1e6vavjN8Pv04ttVFURSTKTw,2362
63
- truefoundry/deploy/cli/commands/deploy_command.py,sha256=B5taHuy2qRJEwco78kroMEAj6uf2_UMYatqb4Rn2-ko,3986
66
+ truefoundry/deploy/cli/commands/deploy_command.py,sha256=YW4OG-5ZD1BZn82ckrNInNRHWxVOwaUjHhRTgfCEUCU,3890
64
67
  truefoundry/deploy/cli/commands/deploy_init_command.py,sha256=g-jBfrEmhZ0TDWsyqPDn4K6q33EqJSGmBTt1eMYig-w,600
65
68
  truefoundry/deploy/cli/commands/get_command.py,sha256=HZQGWib-qrS0RdzctRDwDLfMGu0wqWkAM1u26cTZlsc,5944
66
69
  truefoundry/deploy/cli/commands/list_command.py,sha256=zKu_JWY35eMIzgSNFYtmwi2uezZ4k-8yk3C1Vqsvshc,4470
@@ -79,40 +82,38 @@ truefoundry/deploy/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
79
82
  truefoundry/deploy/io/output_callback.py,sha256=V2YwUFec4G4a67lM4r-x_64AqdOVNo_9sTdfQWLlvi0,604
80
83
  truefoundry/deploy/io/rich_output_callback.py,sha256=TJLiRD-EnFVwgcepxR7WN0koKqW1X2DevETPhNPi_nU,829
81
84
  truefoundry/deploy/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- truefoundry/deploy/lib/auth/servicefoundry_session.py,sha256=5TCYPunAygtn5mb0mp_VcWKEalKMKPbyWMWer-Vty2g,1916
83
85
  truefoundry/deploy/lib/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=zx9c-TjQRzMDKGCa-wDvXEX_8FcWH1QlVif2SjxgLxs,27136
86
+ truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=l4KaHJmmTC3pP5hbnHuPhDH-MPs7KQBtTtfmmfyyBDI,27020
85
87
  truefoundry/deploy/lib/const.py,sha256=Wg0GDnfFu-g1fJr4lU80NH2ULw0R0dYjV7LnW-PbOeM,173
86
88
  truefoundry/deploy/lib/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
- truefoundry/deploy/lib/dao/application.py,sha256=xUqF34abde71YZo9gkR-WvVJi1C6nBeGBNw4kL5FdIo,9226
89
+ truefoundry/deploy/lib/dao/application.py,sha256=oMszpueXPUfTUuN_XdKwoRjQyqAgWHhZ-10cbprCVdM,9226
88
90
  truefoundry/deploy/lib/dao/apply.py,sha256=Jadfa3DcbIRz-Bb4Tlixed179HLDnmDXOlrvSxfEgQ0,3021
89
91
  truefoundry/deploy/lib/dao/version.py,sha256=AtdW_4O1DPUKdfv2qy6iUJsZ_95vM6z0AqeEy3WDKs8,1130
90
- truefoundry/deploy/lib/dao/workspace.py,sha256=KZA8QrlOTecFLAi4Xt0qJ0hNwQL76UYsTKJgZbsA_5s,2349
92
+ truefoundry/deploy/lib/dao/workspace.py,sha256=6YvfCgWDzAULI3Q6JswyZmP1CwJ5rM-ANsIFkbQia0Q,2349
91
93
  truefoundry/deploy/lib/logs_utils.py,sha256=SQxRv3jDDmgHdOUMhlMaAPGYskybnBUMpst7QU_i_sc,1469
92
94
  truefoundry/deploy/lib/messages.py,sha256=nhp0bCYf_XpUM68hTq5lBY-__vtEyV2uP7NgnJXJ_Vg,925
93
95
  truefoundry/deploy/lib/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
96
  truefoundry/deploy/lib/model/entity.py,sha256=3YRdyvMYI1aUXUu2tB5b5lZWwpxKdAhjpT79gzTCZGo,8373
95
- truefoundry/deploy/lib/session.py,sha256=Vg6rCA315T0yS0xG4ayJ84Ia_9ZfibH8utOSwPBMAmw,4953
97
+ truefoundry/deploy/lib/session.py,sha256=rNMkdzZejrxq5gTYTqJ-nGm869JzdlhHzaJQvINTQ4U,4953
96
98
  truefoundry/deploy/lib/util.py,sha256=J7r8San2wKo48A7-BlH2-OKTlBO67zlPjLEhMsL8os0,1059
97
99
  truefoundry/deploy/lib/win32.py,sha256=1RcvPTdlOAJ48rt8rCbE2Ufha2ztRqBAE9dueNXArrY,5009
98
100
  truefoundry/deploy/python_deploy_codegen.py,sha256=qJHH1BJQII9e6PhkcRFYiE_3De7_VMMm8nM4AX5Eq1o,6513
99
101
  truefoundry/deploy/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
102
  truefoundry/deploy/v2/lib/__init__.py,sha256=WEiVMZXOVljzEE3tpGJil14liIn_PCDoACJ6b3tZ6sI,188
101
- truefoundry/deploy/v2/lib/deploy.py,sha256=HIcY3SzQ5lWl7avuuKi3J0Z-PBES6Sf4hgMK-m6_53U,11990
102
- truefoundry/deploy/v2/lib/deploy_workflow.py,sha256=hgAhd1EGwFLz319Vs-WNXHDJmbKjdgkGPzDnBD1Up1k,12579
103
+ truefoundry/deploy/v2/lib/deploy.py,sha256=oK5yTlrhzKNTGZckwuBzu8Q_pxQYgBVcdA-KB-SbzCI,11990
104
+ truefoundry/deploy/v2/lib/deploy_workflow.py,sha256=6Y4PNhd5PCc_4TjpcIZPkr6FCm3BNIQ_SsJTvpUu7a0,12579
103
105
  truefoundry/deploy/v2/lib/deployable_patched_models.py,sha256=MROgMxhn9hDEAKwJSWl3iz12tUVvRKzEtqF2QUT6dAk,3343
104
106
  truefoundry/deploy/v2/lib/models.py,sha256=pSolLMTArDuYpeNsmeeS5DWliloN_iCDfZSpRllMHUg,1120
105
- truefoundry/deploy/v2/lib/patched_models.py,sha256=NTU8J_CwdvEuF9zNXwFyN3suOp_196Wrm75DDy5qcXE,14184
106
- truefoundry/deploy/v2/lib/source.py,sha256=VHKuFREiixUP40D3Mrz-TA70spu1M0RbCzl--qwlFaY,9263
107
+ truefoundry/deploy/v2/lib/patched_models.py,sha256=YDM75pdUPdMFgH2G8ZNbztalLIiMcHVHBHt7cLWmiDg,16050
108
+ truefoundry/deploy/v2/lib/source.py,sha256=tzMSOTrTH3dJzICjo8gI8iY6n0-ckktP3Dh7bVK-nTI,9344
107
109
  truefoundry/gateway/__init__.py,sha256=HvAMuk60-fuZcMmdOtozHrUaH_JcbEHxpMSlS9ci4ls,41
108
- truefoundry/gateway/cli/cli.py,sha256=SPEHNP210QtK7G97KOOP6t6QBxgCq2YUezgx65QZToM,1715
109
- truefoundry/gateway/lib/client.py,sha256=6E9gTl_rOCwcrx5fJkUzbZqacJmgXtSXd1mcmDk9bCA,1717
110
- truefoundry/gateway/lib/entities.py,sha256=DoYS9QAKjiVao-CH9j9LVUPlVFdeHqJ3xC7-pYhmAyM,918
111
- truefoundry/gateway/lib/models.py,sha256=0JUsLt2oNf0bBea_03ndDmUkZhNqvMmixh8zgxaH2lk,2600
110
+ truefoundry/gateway/cli/cli.py,sha256=9raS6Nq_CNzagEPpbKICwUZ01zMoqmZINKMB9m_gJRE,908
111
+ truefoundry/gateway/lib/entities.py,sha256=1P9YjrMoHbg58M57Pq-HlsT1ISHRyyX4JxK-o4of6cY,695
112
+ truefoundry/gateway/lib/models.py,sha256=TXOur51tuYkq4Xil-icNVaVH-7xZbdOUyqS8N9295dg,876
112
113
  truefoundry/logger.py,sha256=u-YCNjg5HBwE70uQcpjIG64Ghos-K2ulTWaxC03BSj4,714
113
114
  truefoundry/ml/__init__.py,sha256=ssUEIs8BixPWxynKoeSh-dkRl6AtLXG0PBGYnUR5Az8,2217
114
115
  truefoundry/ml/artifact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
- truefoundry/ml/artifact/truefoundry_artifact_repo.py,sha256=FksxhUpRHb9pgWZmAB16DhXqkAL6UIAPA1S3RJUApQU,46201
116
+ truefoundry/ml/artifact/truefoundry_artifact_repo.py,sha256=myDpr3RZzEkd_UG9C3rZ4UKEFxXopO5HMVJNpNDiuAo,37737
116
117
  truefoundry/ml/autogen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
118
  truefoundry/ml/autogen/client/__init__.py,sha256=42Y8v6C1oDlngKCaDODi9k3q-9MPMiqO8jGe39y5QJM,20097
118
119
  truefoundry/ml/autogen/client/api/__init__.py,sha256=NyMBxBmIzB1o5LzZZwz9LiydHB3-hPqc_sevsnY6Jrw,746
@@ -326,22 +327,20 @@ truefoundry/ml/cli/commands/download.py,sha256=N9MhsEQ3U24v_OmnMZT8Q4SoAi38Sm7a2
326
327
  truefoundry/ml/cli/commands/model_init.py,sha256=9fHCernmQswjEhREzdrnKxwCCWkgmFrpL29H52Sd1gQ,2663
327
328
  truefoundry/ml/cli/utils.py,sha256=j6_mZ4Spn114mz3P4QQ8jx0tmorXIuyQnHXVUSDvZi4,1035
328
329
  truefoundry/ml/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
- truefoundry/ml/clients/entities.py,sha256=sNP4DnAVdQoMfc06s0r3VTzKHTo7jmxAOuTlQOVmsMs,151
330
- truefoundry/ml/clients/servicefoundry_client.py,sha256=nmKrWBd7P0VEDGjPHZ8_scX3Xo9tv3wZSWlTIBwGptU,1597
331
- truefoundry/ml/clients/utils.py,sha256=c0LdC8moejs-Zm30hu1sCqifLEmqhdq4SfZ_m0nUIDk,4402
330
+ truefoundry/ml/clients/servicefoundry_client.py,sha256=Rx-tjiDxNwUgOCDITjtL0vmZcQgJjh_tUdReE23TKIk,2363
332
331
  truefoundry/ml/constants.py,sha256=vDq72d4C9FSWqr9MMdjgTF4TuyNFApvo_6RVsSeAjB4,2837
333
332
  truefoundry/ml/entities.py,sha256=si5GAqZsWzKu5MPrU4Hk6se7bebHOYhTiNw69ai-Uk8,1485
334
333
  truefoundry/ml/enums.py,sha256=arqDkF8duU_oVLFeYMhcfWYbF6Nq5mmjwupJMIheyXM,1790
335
- truefoundry/ml/exceptions.py,sha256=8aJm2NYtAWWsRLu4MbzaoOqHsQZ6RjOFwBWQWqb6qrc,244
334
+ truefoundry/ml/exceptions.py,sha256=QpDJSWmF7dIsByS0qOQbQZ_jytdNTzkHDDO3BxhTSo0,332
336
335
  truefoundry/ml/git_info.py,sha256=jvAVm9ilqivnGq8qJdUvYdd8Siv0PLtqurB-PXsS5ho,2023
337
336
  truefoundry/ml/internal_namespace.py,sha256=QcqMHp6-C2im2H_02hlhi01EIcr1HhNaZprszs13EMU,1790
338
337
  truefoundry/ml/log_types/__init__.py,sha256=g4u4D4Jaj0aBK5GtrLV88-qThKZR9pSZ17vFEkN-LmM,125
339
- truefoundry/ml/log_types/artifacts/artifact.py,sha256=VC0KbcHty1fblybUvGVcfDGFcINfLgT2LByyvPcS1Ro,21565
338
+ truefoundry/ml/log_types/artifacts/artifact.py,sha256=qz657N5WosBNBqqEtZ9hWatvIoa9_0MipudYH9r3Bq0,21657
340
339
  truefoundry/ml/log_types/artifacts/constants.py,sha256=qKxQ5mMvJE4j83BvGW3qNTKunxCiBg_EEjTdgbgJtyE,1036
341
340
  truefoundry/ml/log_types/artifacts/dataset.py,sha256=a4dxd2EN8p7Ci-cLGGiDOboN3t0395_XhWE1dmTw1Q4,13112
342
341
  truefoundry/ml/log_types/artifacts/general_artifact.py,sha256=B4XErLr-m6RmQWtxMTu3wlFRFcqSwPYp6J0OL4Ng6L0,3179
343
- truefoundry/ml/log_types/artifacts/model.py,sha256=p9cB3_0MSZkVyq8G2pyNWl1F3qICTazQlq6VCSzOV3s,24194
344
- truefoundry/ml/log_types/artifacts/utils.py,sha256=8mmahc1b6wvrA_E795h9ynRfhYRIdci7LRGN8U6ySm8,7516
342
+ truefoundry/ml/log_types/artifacts/model.py,sha256=J-_v_ertSKQPThx6I9ivLUlCJUHPZJ71X8V0VgaIBAU,24319
343
+ truefoundry/ml/log_types/artifacts/utils.py,sha256=MuPk6by8jIt7LepB1fqUC8emQBSxrTGJmIel7rbMBAc,7533
345
344
  truefoundry/ml/log_types/image/__init__.py,sha256=fcOq8yQnNj1rkLcPeIjLXBpdA1WIeiPsXOlAAvMxx7M,76
346
345
  truefoundry/ml/log_types/image/constants.py,sha256=wLtGEOA4T5fZHSlOXPuNDLX3lpbCtwlvGKPFk_1fah0,255
347
346
  truefoundry/ml/log_types/image/image.py,sha256=qQnAVgErAq4Jn6wXFFpaveOd52zcjUuomUCqNRxO2io,12478
@@ -351,11 +350,11 @@ truefoundry/ml/log_types/plot.py,sha256=HuYvvRA5r8V0xAIuuqMME2IHb9d3SfGHUiuEkOP3
351
350
  truefoundry/ml/log_types/pydantic_base.py,sha256=eBlw_AEyAz4iJKDP4zgJOCFWcldwQqpf7FADW1jzIQY,272
352
351
  truefoundry/ml/log_types/utils.py,sha256=xjJ21jdPScvFmw3TbVh5NCzbzJwaqiXJyiiT4xxX1EI,335
353
352
  truefoundry/ml/logger.py,sha256=VT-BF3BnBYTWVq87O58F0c8uXMu94gYzsiFlGY3_7Ao,458
354
- truefoundry/ml/mlfoundry_api.py,sha256=avuGgjbRnQXk774Vd3Dx7n99bbrOkL9pob9DI-vNvWE,62368
355
- truefoundry/ml/mlfoundry_run.py,sha256=scHjdjojRGbE4ZZlByZTFrcBTamRbm_JGidaSX9Gi9o,44601
356
- truefoundry/ml/model_framework.py,sha256=GAGu6bW8L4f8uvukOITB0bJOm1BSWzxC1MJxUGmpOqQ,18882
353
+ truefoundry/ml/mlfoundry_api.py,sha256=ofIbFimPI7u301KFxdbmWbJT0AIinbRMQyCwX7hbPzs,61543
354
+ truefoundry/ml/mlfoundry_run.py,sha256=M-0FkZYDxwv5EZUDtVqiV8JxC_3BWR80N7Kp4Yj7bPY,44291
355
+ truefoundry/ml/model_framework.py,sha256=JGmzdG7o5P6CJr5EYTUOmuly53FfhpoNVqKrhfijAVg,18972
357
356
  truefoundry/ml/run_utils.py,sha256=0W208wSLUrbdfk2pjNcZlkUi9bNxG2JORqoe-5rVqHI,2423
358
- truefoundry/ml/session.py,sha256=F83GTC5WwGBjnJ69Ct8MqMnlutYc56JCc6YhEY1Wl-A,5394
357
+ truefoundry/ml/session.py,sha256=eQo1zG5nd0-8Ok68uEBCQDPAWYeJkpzqHak-DQX1ENU,4553
359
358
  truefoundry/ml/validation_utils.py,sha256=J5atNhcJLvKj64ralSV9Y5Fv1Rt4SE237ICdP9-7sP4,12149
360
359
  truefoundry/pydantic_v1.py,sha256=jSuhGtz0Mbk1qYu8jJ1AcnIDK4oxUsdhALc4spqstmM,345
361
360
  truefoundry/version.py,sha256=bqiT4Q-VWrTC6P4qfK43mez-Ppf-smWfrl6DcwV7mrw,137
@@ -370,11 +369,11 @@ truefoundry/workflow/map_task.py,sha256=2m3qGXQ90k9LdS45q8dqCCECc3qr8t2m_LMCVd1m
370
369
  truefoundry/workflow/python_task.py,sha256=SRXRLC4vdBqGjhkwuaY39LEWN6iPCpJAuW17URRdWTY,1128
371
370
  truefoundry/workflow/remote_filesystem/__init__.py,sha256=LQ95ViEjJ7Ts4JcCGOxMPs7NZmQdZ4bTiq6qXtsjUhE,206
372
371
  truefoundry/workflow/remote_filesystem/logger.py,sha256=em2l7D6sw7xTLDP0kQSLpgfRRCLpN14Qw85TN7ujQcE,1022
373
- truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=5mBCIc-ON7VSTzdyczeADgqSX5oJgso5gq2yT2AQqTY,11085
374
- truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=Hf6Dk6Fu6P7DqsK5ULgraf9DStjgigf-kjaRAMBW-RU,8680
372
+ truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=xcT0wQmQlgzcj0nP3tJopyFSVWT1uv3nhiTIuwfXYeg,12342
373
+ truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=nSGPZu0Gyd_jz0KsEE-7w_BmnTD8CVF1S8cUJoxaCbc,13305
375
374
  truefoundry/workflow/task.py,sha256=ToitYiKcNzFCtOVQwz1W8sRjbR97eVS7vQBdbgUQtKg,1779
376
375
  truefoundry/workflow/workflow.py,sha256=WaTqUjhwfAXDWu4E5ehuwAxrCbDJkoAf1oWmR2E9Qy0,4575
377
- truefoundry-0.5.3rc4.dist-info/METADATA,sha256=qPTGfmHQVmxxL_jBbf7CJI6fDI1LkOpkSfeBXSqLRpY,2887
378
- truefoundry-0.5.3rc4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
379
- truefoundry-0.5.3rc4.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
380
- truefoundry-0.5.3rc4.dist-info/RECORD,,
376
+ truefoundry-0.5.3rc5.dist-info/METADATA,sha256=pJtlnztVvgBPT53hHtnRD-mp0EzV6iTNPFKlEDvH2oc,2887
377
+ truefoundry-0.5.3rc5.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
378
+ truefoundry-0.5.3rc5.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
379
+ truefoundry-0.5.3rc5.dist-info/RECORD,,
@@ -1,61 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Optional
4
-
5
- from truefoundry.common.credential_provider import (
6
- CredentialProvider,
7
- EnvCredentialProvider,
8
- FileCredentialProvider,
9
- )
10
- from truefoundry.common.entities import UserInfo
11
- from truefoundry.common.utils import relogin_error_message
12
- from truefoundry.logger import logger
13
-
14
- ACTIVE_SESSION: Optional[ServiceFoundrySession] = None
15
-
16
-
17
- class ServiceFoundrySession:
18
- def __init__(self) -> None:
19
- self._cred_provider = self._get_cred_provider()
20
- self._user_info: UserInfo = self._cred_provider.token.to_user_info()
21
-
22
- global ACTIVE_SESSION
23
- if (ACTIVE_SESSION is None) or (
24
- ACTIVE_SESSION
25
- and ACTIVE_SESSION.base_url != self.base_url
26
- and ACTIVE_SESSION.user_info != self.user_info
27
- ):
28
- logger.info(
29
- "Logged in to %r as %r (%s)",
30
- self.base_url,
31
- self.user_info.user_id,
32
- self.user_info.email or self.user_info.user_type.value,
33
- )
34
- ACTIVE_SESSION = self
35
-
36
- @staticmethod
37
- def _get_cred_provider() -> CredentialProvider:
38
- final_cred_provider = None
39
- for cred_provider in [EnvCredentialProvider, FileCredentialProvider]:
40
- if cred_provider.can_provide():
41
- final_cred_provider = cred_provider()
42
- break
43
- if final_cred_provider is None:
44
- raise Exception(
45
- relogin_error_message(
46
- "No active session found. Perhaps you are not logged in?",
47
- )
48
- )
49
- return final_cred_provider
50
-
51
- @property
52
- def access_token(self) -> str:
53
- return self._cred_provider.token.access_token
54
-
55
- @property
56
- def base_url(self) -> str:
57
- return self._cred_provider.base_url
58
-
59
- @property
60
- def user_info(self) -> UserInfo:
61
- return self._user_info
@@ -1,51 +0,0 @@
1
- from typing import Literal, Optional
2
-
3
- import requests
4
-
5
- from truefoundry.common.constants import GATEWAY_SERVER_RELATIVE_PATH
6
- from truefoundry.common.credential_provider import (
7
- CredentialProvider,
8
- EnvCredentialProvider,
9
- FileCredentialProvider,
10
- )
11
-
12
-
13
- class GatewayServiceClient:
14
- def __init__(
15
- self,
16
- credential_provider: Optional[CredentialProvider] = None,
17
- host: Optional[str] = None,
18
- ) -> None:
19
- if credential_provider is None:
20
- if EnvCredentialProvider.can_provide():
21
- credential_provider = EnvCredentialProvider()
22
- elif FileCredentialProvider.can_provide():
23
- credential_provider = FileCredentialProvider()
24
- else:
25
- raise Exception(
26
- "No credentials found. Please login using `tfy login` or set TFY_API_KEY environment variable"
27
- )
28
-
29
- self._credential_provider = credential_provider
30
- self._host = credential_provider.base_url
31
-
32
- def _get_header(self):
33
- return {
34
- "Authorization": f"Bearer {self._credential_provider.token.access_token}"
35
- }
36
-
37
- @property
38
- def _base_url(self) -> str:
39
- return f"{self._host}/{GATEWAY_SERVER_RELATIVE_PATH}"
40
-
41
- def generate_code(
42
- self, model_id: str, inference_type: Literal["chat", "completion", "embedding"]
43
- ) -> str:
44
- url = f"{self._base_url}/api/inference/openai/generate-code-snippet"
45
- data = {
46
- "model": model_id,
47
- "playground_endpoint": self._base_url,
48
- "inference_type": inference_type,
49
- }
50
- response = requests.post(url, headers=self._get_header(), json=data)
51
- return response.json()
@@ -1,8 +0,0 @@
1
- from typing import Optional
2
-
3
- from truefoundry.pydantic_v1 import BaseModel
4
-
5
-
6
- class HostCreds(BaseModel):
7
- host: str
8
- token: Optional[str] = None