truefoundry 0.5.2__py3-none-any.whl → 0.5.3__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 (63) hide show
  1. truefoundry/__init__.py +10 -1
  2. truefoundry/autodeploy/agents/base.py +1 -1
  3. truefoundry/autodeploy/agents/developer.py +1 -1
  4. truefoundry/autodeploy/agents/project_identifier.py +1 -1
  5. truefoundry/autodeploy/agents/tester.py +1 -1
  6. truefoundry/autodeploy/cli.py +2 -2
  7. truefoundry/autodeploy/tools/base.py +2 -1
  8. truefoundry/autodeploy/tools/commit.py +1 -1
  9. truefoundry/autodeploy/tools/docker_build.py +1 -1
  10. truefoundry/autodeploy/tools/docker_run.py +1 -1
  11. truefoundry/autodeploy/tools/file_type_counts.py +1 -1
  12. truefoundry/autodeploy/tools/list_files.py +1 -1
  13. truefoundry/autodeploy/tools/read_file.py +1 -2
  14. truefoundry/autodeploy/tools/send_request.py +1 -1
  15. truefoundry/autodeploy/tools/write_file.py +1 -1
  16. truefoundry/cli/util.py +12 -3
  17. truefoundry/common/auth_service_client.py +7 -4
  18. truefoundry/common/constants.py +3 -0
  19. truefoundry/common/credential_provider.py +7 -8
  20. truefoundry/common/exceptions.py +11 -7
  21. truefoundry/common/request_utils.py +96 -14
  22. truefoundry/common/servicefoundry_client.py +31 -29
  23. truefoundry/common/session.py +93 -0
  24. truefoundry/common/storage_provider_utils.py +331 -0
  25. truefoundry/common/utils.py +9 -9
  26. truefoundry/common/warnings.py +21 -0
  27. truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +8 -21
  28. truefoundry/deploy/cli/commands/deploy_command.py +4 -4
  29. truefoundry/deploy/lib/clients/servicefoundry_client.py +13 -14
  30. truefoundry/deploy/lib/dao/application.py +2 -2
  31. truefoundry/deploy/lib/dao/workspace.py +1 -1
  32. truefoundry/deploy/lib/session.py +1 -1
  33. truefoundry/deploy/v2/lib/deploy.py +2 -2
  34. truefoundry/deploy/v2/lib/deploy_workflow.py +1 -1
  35. truefoundry/deploy/v2/lib/patched_models.py +70 -4
  36. truefoundry/deploy/v2/lib/source.py +2 -1
  37. truefoundry/ml/artifact/truefoundry_artifact_repo.py +33 -297
  38. truefoundry/ml/autogen/client/__init__.py +3 -0
  39. truefoundry/ml/autogen/client/api/mlfoundry_artifacts_api.py +149 -0
  40. truefoundry/ml/autogen/client/models/__init__.py +3 -0
  41. truefoundry/ml/autogen/client/models/artifact_version_manifest.py +25 -1
  42. truefoundry/ml/autogen/client/models/get_artifact_version_aliases_response_dto.py +67 -0
  43. truefoundry/ml/autogen/client/models/model_version_manifest.py +18 -0
  44. truefoundry/ml/autogen/client_README.md +2 -0
  45. truefoundry/ml/autogen/entities/artifacts.py +7 -1
  46. truefoundry/ml/clients/servicefoundry_client.py +36 -15
  47. truefoundry/ml/exceptions.py +2 -1
  48. truefoundry/ml/log_types/artifacts/artifact.py +37 -4
  49. truefoundry/ml/log_types/artifacts/model.py +51 -10
  50. truefoundry/ml/log_types/artifacts/utils.py +2 -2
  51. truefoundry/ml/mlfoundry_api.py +6 -38
  52. truefoundry/ml/mlfoundry_run.py +6 -15
  53. truefoundry/ml/model_framework.py +5 -3
  54. truefoundry/ml/session.py +69 -97
  55. truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +42 -9
  56. truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +126 -7
  57. {truefoundry-0.5.2.dist-info → truefoundry-0.5.3.dist-info}/METADATA +2 -2
  58. {truefoundry-0.5.2.dist-info → truefoundry-0.5.3.dist-info}/RECORD +60 -59
  59. {truefoundry-0.5.2.dist-info → truefoundry-0.5.3.dist-info}/WHEEL +1 -1
  60. truefoundry/deploy/lib/auth/servicefoundry_session.py +0 -61
  61. truefoundry/ml/clients/entities.py +0 -8
  62. truefoundry/ml/clients/utils.py +0 -122
  63. {truefoundry-0.5.2.dist-info → truefoundry-0.5.3.dist-info}/entry_points.txt +0 -0
@@ -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
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: truefoundry
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: Truefoundry CLI
5
5
  Author: Abhishek Choudhary
6
6
  Author-email: abhishek@truefoundry.com
@@ -1,25 +1,25 @@
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
- truefoundry/autodeploy/agents/base.py,sha256=woCry229x7WX0IZmBopW_e_NB76aCLQRLXZBs2QBklk,6405
5
- truefoundry/autodeploy/agents/developer.py,sha256=Fh-EJDT3wPwCPYsrxRNtanyKMiZxhK73LHb-5Kpmh0A,4127
6
- truefoundry/autodeploy/agents/project_identifier.py,sha256=dm1A6MHNA-0Sc48y7dYpSA7e4uvw3Wi8AADSs-JcOZs,4505
7
- truefoundry/autodeploy/agents/tester.py,sha256=Hp1bul8Xd6qZPdUDUPqQwwHF7bsPQ5tK7x6gaBuX0NI,2403
8
- truefoundry/autodeploy/cli.py,sha256=1VnDAP9ylM6l00v0Ko5KL6_Dr7bL_voeAPdbEvWvU3Y,14215
4
+ truefoundry/autodeploy/agents/base.py,sha256=lYw6bKhfCWff5BbtXXn2k4MjMbRIUkOwPBjRT70iXE8,6420
5
+ truefoundry/autodeploy/agents/developer.py,sha256=tO9vmgGjoaqK4rX-DFCyMrViFC2Oqofd89WoXqsEm-A,4142
6
+ truefoundry/autodeploy/agents/project_identifier.py,sha256=KlF7FwrGHDCjF3y3-YaCDxZ8kE34s6XPBagXhG2U1aM,4520
7
+ truefoundry/autodeploy/agents/tester.py,sha256=lqvVBuVcFRvGZnSLAUF2r-1-Yti20o_cbybU19IlSXo,2418
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
12
12
  truefoundry/autodeploy/tools/__init__.py,sha256=9zJiC1d4bv9EL-p5XTCa9fAQ6ZKV--AbgeLz9bBBkyQ,875
13
13
  truefoundry/autodeploy/tools/ask.py,sha256=MxUFLP7rjpdJ85gCc3El0wUqTZDjpjAw7WOTdV4LLWE,856
14
- truefoundry/autodeploy/tools/base.py,sha256=eS30LQhUjQkRhFqHmdor7HgWA9kcwFVCfAWEimO0Y_0,779
15
- truefoundry/autodeploy/tools/commit.py,sha256=bB5kqAY5rEvfc7ZHtdueXusGznAbk58xqvzSKAXzbSE,6036
16
- truefoundry/autodeploy/tools/docker_build.py,sha256=TwSvmxrjBkI7PcPhjIzsc8oTA6fWzPIIpkMv2zMpb-E,4000
17
- truefoundry/autodeploy/tools/docker_run.py,sha256=8skvqF9zmZSIBbWkmJsmOyQRVz8ttw1SVjPhjGwDq24,5061
18
- truefoundry/autodeploy/tools/file_type_counts.py,sha256=RAiArWx2q1WBALJq6LKN8XMrtwecZiQrD6VtAdmTuvE,2354
19
- truefoundry/autodeploy/tools/list_files.py,sha256=mBhpnL0zY3Va2RM8Uuap-2G5Z-QPelSKp6O38K4DbGI,2642
20
- truefoundry/autodeploy/tools/read_file.py,sha256=uejLuCB9Tjki0-Ud_mk5fuo9nmKRHYHYqqzCTE1nuyo,2254
21
- truefoundry/autodeploy/tools/send_request.py,sha256=0Si6tdNEK152GUUkLPKKfV6K5vaS8kPw2FKIstRJKAA,1688
22
- truefoundry/autodeploy/tools/write_file.py,sha256=EcYetnJ4X-NWsd_CdYUKfOnAdz2XXiRukTzJfb_GzFs,3130
14
+ truefoundry/autodeploy/tools/base.py,sha256=Ltzj2d6DO1gUMx_qSt2c2Zq91MJ5V4FJXpZwl4T3F8M,795
15
+ truefoundry/autodeploy/tools/commit.py,sha256=MXqPnCnMHagvimSCCBGYsAbNdl7k1pf05BBBRjOP8b8,6051
16
+ truefoundry/autodeploy/tools/docker_build.py,sha256=tAG62G1bk-kYrbRykieXxU48nkOlv3IcAv25k6zdTz8,4015
17
+ truefoundry/autodeploy/tools/docker_run.py,sha256=PuiIvF41_L3JJN_EyoU-PAr2YkZEu0C9XX0ABcTFoJk,5076
18
+ truefoundry/autodeploy/tools/file_type_counts.py,sha256=DUcULN0S2qIrZKTTTfz7GXeRy6RKtHSIeVkeECeEQZw,2369
19
+ truefoundry/autodeploy/tools/list_files.py,sha256=HNZdsz-m-Jxf5yrf2bn7kRplIsNACP69Ozd4bpjlGMk,2657
20
+ truefoundry/autodeploy/tools/read_file.py,sha256=ZpgTNef2-plWEoX4UHcVFVzHmNGoqZrvVUn1OVY_rrE,2268
21
+ truefoundry/autodeploy/tools/send_request.py,sha256=Ea6MG0esSik7ZtWNIx9yTHlKJ593CQc11bET_YeRZgc,1703
22
+ truefoundry/autodeploy/tools/write_file.py,sha256=tSO8LEwVJZbF17zva7FWE426_-C8pB5FVwc1vClpFjY,3145
23
23
  truefoundry/autodeploy/utils/client.py,sha256=PvbSkfgAjAogGjisinqmh4mP4svowxAC0IwzEQz3Ai0,453
24
24
  truefoundry/autodeploy/utils/diff.py,sha256=Ef8Y-VffDKel_-q-GxRam6gqiv8qTLMcqVg6iifXfcA,5358
25
25
  truefoundry/autodeploy/utils/pydantic_compat.py,sha256=hEAUy5kLjhPdzw7yGZ2iXGMXbbMVXVlGzIofmyHafXQ,412
@@ -29,17 +29,20 @@ truefoundry/cli/config.py,sha256=tf8w4UfVzcC6eYkENvuuCPYt_V3sqVpO1bclORV9tAk,206
29
29
  truefoundry/cli/console.py,sha256=9-dMy4YPisCJQziRKTg8Qa0UJnOGl1soiUnJjsnLDvE,242
30
30
  truefoundry/cli/const.py,sha256=dVHPo1uAiDSSMXwXoT2mR5kNQjExT98QNVRz98Hz_Ts,510
31
31
  truefoundry/cli/display_util.py,sha256=vypx4FQImmDwl2QAj7GpjwlpvG3VFhqoNPvCkBzGqNg,3120
32
- truefoundry/cli/util.py,sha256=yA8sie7TBTOu-5QFf2zEFWYEKYcBCaV6o1gtctj1dtI,3390
32
+ truefoundry/cli/util.py,sha256=gLSKts2js8ThKXV19p2ENv5seSf12PrUemUsveNmcGY,3717
33
33
  truefoundry/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- truefoundry/common/auth_service_client.py,sha256=RRiGUqITxeVYwKZLc923zJP-61UAvFtVlMaG2HJBvXc,7940
35
- truefoundry/common/constants.py,sha256=Pxksh1MMjz9WAKV6wCcq1wu9uawzZGMe9RU9FrLOZbQ,2626
34
+ truefoundry/common/auth_service_client.py,sha256=N3YxKlx63r6cPZqbgb2lqBOPI69ShB7D7RCIq4FSCjc,7949
35
+ truefoundry/common/constants.py,sha256=WQjylPv7xTVYURv4zicJUHYL73Gv3c3i6Iw4oy9Lhg4,2744
36
36
  truefoundry/common/credential_file_manager.py,sha256=1yEk1Zm2xS4G0VDFwKSZ4w0VUrcPWQ1nJnoBaz9xyKA,4251
37
- truefoundry/common/credential_provider.py,sha256=Aht7hFLsnyRgMR34dRbzln7dor0WYSeA8ej8ApNmnKM,4148
37
+ truefoundry/common/credential_provider.py,sha256=R666i1ADKb2ldwEVh9lnaFcPaa4q3vAscIX3MX1UiFA,4097
38
38
  truefoundry/common/entities.py,sha256=8O-EGPk4PKqnyoFMKUTxISCU19rz0KBnfRDJU695DhY,3797
39
- truefoundry/common/exceptions.py,sha256=ePpiQ_zmWe4e94gOgeMiyP_AZnKwjEBfyXsB5ScGYcI,329
40
- truefoundry/common/request_utils.py,sha256=5xw4YGUcMf71Ncal3OfFCa-PoWDIvG3hYGCDa4Da4OI,2854
41
- truefoundry/common/servicefoundry_client.py,sha256=2fxmgCM-ckFHpnm6n_mL-5Z8RWN_q-dYVvFC29bkYSg,3120
42
- truefoundry/common/utils.py,sha256=H87mfvqSE9OSRRdX-G9m3_JvWLVtkNuLmsFsvJHMczc,6098
39
+ truefoundry/common/exceptions.py,sha256=jkU0N7hV_P-EhXeud4I5vuB9glXXZSWPf8LcH04mSbw,459
40
+ truefoundry/common/request_utils.py,sha256=e9qrAQ1MutU7JALDKcucmNd0KQEVBqgW3yx0w1zeHIU,5700
41
+ truefoundry/common/servicefoundry_client.py,sha256=295ZXOEM46lXZP59O04XFTDCsZLtz3MssXRDMk2x9hg,3169
42
+ truefoundry/common/session.py,sha256=BiTJ2WEzLkTvzpqy67xX3fXgiKH_ltzzmQdFG7xUtwI,2904
43
+ truefoundry/common/storage_provider_utils.py,sha256=yURhMw8k0FLFvaviRHDiifhvc6GnuQwGMC9Qd2uM440,10934
44
+ truefoundry/common/utils.py,sha256=sZyg-vpShVXvnrwnINrdsyWJR3FHMUBiOB1CslYdQTo,6072
45
+ truefoundry/common/warnings.py,sha256=rs6BHwk7imQYedo07iwh3TWEOywAR3Lqhj0AY4khByg,504
43
46
  truefoundry/deploy/__init__.py,sha256=p14_yIJw2bcaKW3c1DTaoM7UwfHvt2T_MfeFlZIz1g4,2359
44
47
  truefoundry/deploy/auto_gen/models.py,sha256=3_GTdaYE95piMzhbM4SvMSQhP4UGWDGpJnLxERjYHGw,82555
45
48
  truefoundry/deploy/builder/__init__.py,sha256=1qjHMNBE1poRCZW0WrG46dFM1f1IlivD5352qzsioMU,4953
@@ -48,7 +51,7 @@ truefoundry/deploy/builder/builders/dockerfile.py,sha256=AXXTziCkaqIhuM_bwyD1vT1
48
51
  truefoundry/deploy/builder/builders/tfy_notebook_buildpack/__init__.py,sha256=x_GwRFKz-Kb4-ZlxOFjBlr0mTgUDe_hVeG4dsIbHo8c,1796
49
52
  truefoundry/deploy/builder/builders/tfy_notebook_buildpack/dockerfile_template.py,sha256=rQgdvKmAT9HArVW4TAG5yd2QTKRs3S5LJ9RQbc_EkHE,2518
50
53
  truefoundry/deploy/builder/builders/tfy_python_buildpack/__init__.py,sha256=9r1PYahn-HfzpMth6NkvJoycmmHQpSl0vIVZxWF12xI,1864
51
- truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py,sha256=xa5Y-xf9WzXTJwbp5NnlvJu-g57KeSuy8XNGlW7z9rk,9462
54
+ truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py,sha256=X9mKH7SGZLGZGvY0S2aPB3sgWdSR9TY4eVXtqz_idEA,8973
52
55
  truefoundry/deploy/builder/constants.py,sha256=amUkHoHvVKzGv0v_knfiioRuKiJM0V0xW0diERgWiI0,508
53
56
  truefoundry/deploy/builder/docker_service.py,sha256=OI8efqK0Gnoii8bcHihpA2StwHVzsMREfBk7NvMR4hY,3950
54
57
  truefoundry/deploy/builder/utils.py,sha256=D68-bqM0NQx-Elg-56mtkENyVyg9faZ9tgTmBuo1Sjs,1076
@@ -59,7 +62,7 @@ truefoundry/deploy/cli/commands/build_command.py,sha256=zJBywMatbpUlXx5O2aqpEVmP
59
62
  truefoundry/deploy/cli/commands/build_logs_command.py,sha256=DE_yprQQ6PrhOQo3xsYxGWQrXSopzSYDkt3hWB4n728,2790
60
63
  truefoundry/deploy/cli/commands/create_command.py,sha256=rCajvQvAfZU10nDZOYpRACbAATH1zj52ihTWrhnLLUc,1829
61
64
  truefoundry/deploy/cli/commands/delete_command.py,sha256=JMibxvt1rsZ8sODa0jI1e6vavjN8Pv04ttVFURSTKTw,2362
62
- truefoundry/deploy/cli/commands/deploy_command.py,sha256=B5taHuy2qRJEwco78kroMEAj6uf2_UMYatqb4Rn2-ko,3986
65
+ truefoundry/deploy/cli/commands/deploy_command.py,sha256=YW4OG-5ZD1BZn82ckrNInNRHWxVOwaUjHhRTgfCEUCU,3890
63
66
  truefoundry/deploy/cli/commands/deploy_init_command.py,sha256=g-jBfrEmhZ0TDWsyqPDn4K6q33EqJSGmBTt1eMYig-w,600
64
67
  truefoundry/deploy/cli/commands/get_command.py,sha256=HZQGWib-qrS0RdzctRDwDLfMGu0wqWkAM1u26cTZlsc,5944
65
68
  truefoundry/deploy/cli/commands/list_command.py,sha256=zKu_JWY35eMIzgSNFYtmwi2uezZ4k-8yk3C1Vqsvshc,4470
@@ -78,37 +81,36 @@ truefoundry/deploy/io/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
78
81
  truefoundry/deploy/io/output_callback.py,sha256=V2YwUFec4G4a67lM4r-x_64AqdOVNo_9sTdfQWLlvi0,604
79
82
  truefoundry/deploy/io/rich_output_callback.py,sha256=TJLiRD-EnFVwgcepxR7WN0koKqW1X2DevETPhNPi_nU,829
80
83
  truefoundry/deploy/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- truefoundry/deploy/lib/auth/servicefoundry_session.py,sha256=5TCYPunAygtn5mb0mp_VcWKEalKMKPbyWMWer-Vty2g,1916
82
84
  truefoundry/deploy/lib/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=yhHsHo9T0mTbum7X2sOuNVf-am1AdtzyK0KBQkdC0io,26212
85
+ truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=E1AZo3KmvvXoCQV4Z7A8Iy_iPH8HethHPR-xnAImEEE,26096
84
86
  truefoundry/deploy/lib/const.py,sha256=Wg0GDnfFu-g1fJr4lU80NH2ULw0R0dYjV7LnW-PbOeM,173
85
87
  truefoundry/deploy/lib/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
- truefoundry/deploy/lib/dao/application.py,sha256=xUqF34abde71YZo9gkR-WvVJi1C6nBeGBNw4kL5FdIo,9226
88
+ truefoundry/deploy/lib/dao/application.py,sha256=oMszpueXPUfTUuN_XdKwoRjQyqAgWHhZ-10cbprCVdM,9226
87
89
  truefoundry/deploy/lib/dao/apply.py,sha256=Jadfa3DcbIRz-Bb4Tlixed179HLDnmDXOlrvSxfEgQ0,3021
88
90
  truefoundry/deploy/lib/dao/version.py,sha256=AtdW_4O1DPUKdfv2qy6iUJsZ_95vM6z0AqeEy3WDKs8,1130
89
- truefoundry/deploy/lib/dao/workspace.py,sha256=KZA8QrlOTecFLAi4Xt0qJ0hNwQL76UYsTKJgZbsA_5s,2349
91
+ truefoundry/deploy/lib/dao/workspace.py,sha256=6YvfCgWDzAULI3Q6JswyZmP1CwJ5rM-ANsIFkbQia0Q,2349
90
92
  truefoundry/deploy/lib/logs_utils.py,sha256=SQxRv3jDDmgHdOUMhlMaAPGYskybnBUMpst7QU_i_sc,1469
91
93
  truefoundry/deploy/lib/messages.py,sha256=nhp0bCYf_XpUM68hTq5lBY-__vtEyV2uP7NgnJXJ_Vg,925
92
94
  truefoundry/deploy/lib/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
95
  truefoundry/deploy/lib/model/entity.py,sha256=3YRdyvMYI1aUXUu2tB5b5lZWwpxKdAhjpT79gzTCZGo,8373
94
- truefoundry/deploy/lib/session.py,sha256=Vg6rCA315T0yS0xG4ayJ84Ia_9ZfibH8utOSwPBMAmw,4953
96
+ truefoundry/deploy/lib/session.py,sha256=rNMkdzZejrxq5gTYTqJ-nGm869JzdlhHzaJQvINTQ4U,4953
95
97
  truefoundry/deploy/lib/util.py,sha256=J7r8San2wKo48A7-BlH2-OKTlBO67zlPjLEhMsL8os0,1059
96
98
  truefoundry/deploy/lib/win32.py,sha256=1RcvPTdlOAJ48rt8rCbE2Ufha2ztRqBAE9dueNXArrY,5009
97
99
  truefoundry/deploy/python_deploy_codegen.py,sha256=qJHH1BJQII9e6PhkcRFYiE_3De7_VMMm8nM4AX5Eq1o,6513
98
100
  truefoundry/deploy/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
101
  truefoundry/deploy/v2/lib/__init__.py,sha256=WEiVMZXOVljzEE3tpGJil14liIn_PCDoACJ6b3tZ6sI,188
100
- truefoundry/deploy/v2/lib/deploy.py,sha256=HIcY3SzQ5lWl7avuuKi3J0Z-PBES6Sf4hgMK-m6_53U,11990
101
- truefoundry/deploy/v2/lib/deploy_workflow.py,sha256=hgAhd1EGwFLz319Vs-WNXHDJmbKjdgkGPzDnBD1Up1k,12579
102
+ truefoundry/deploy/v2/lib/deploy.py,sha256=oK5yTlrhzKNTGZckwuBzu8Q_pxQYgBVcdA-KB-SbzCI,11990
103
+ truefoundry/deploy/v2/lib/deploy_workflow.py,sha256=6Y4PNhd5PCc_4TjpcIZPkr6FCm3BNIQ_SsJTvpUu7a0,12579
102
104
  truefoundry/deploy/v2/lib/deployable_patched_models.py,sha256=MROgMxhn9hDEAKwJSWl3iz12tUVvRKzEtqF2QUT6dAk,3343
103
105
  truefoundry/deploy/v2/lib/models.py,sha256=pSolLMTArDuYpeNsmeeS5DWliloN_iCDfZSpRllMHUg,1120
104
- truefoundry/deploy/v2/lib/patched_models.py,sha256=NTU8J_CwdvEuF9zNXwFyN3suOp_196Wrm75DDy5qcXE,14184
105
- truefoundry/deploy/v2/lib/source.py,sha256=VHKuFREiixUP40D3Mrz-TA70spu1M0RbCzl--qwlFaY,9263
106
+ truefoundry/deploy/v2/lib/patched_models.py,sha256=YDM75pdUPdMFgH2G8ZNbztalLIiMcHVHBHt7cLWmiDg,16050
107
+ truefoundry/deploy/v2/lib/source.py,sha256=tzMSOTrTH3dJzICjo8gI8iY6n0-ckktP3Dh7bVK-nTI,9344
106
108
  truefoundry/logger.py,sha256=u-YCNjg5HBwE70uQcpjIG64Ghos-K2ulTWaxC03BSj4,714
107
109
  truefoundry/ml/__init__.py,sha256=ssUEIs8BixPWxynKoeSh-dkRl6AtLXG0PBGYnUR5Az8,2217
108
110
  truefoundry/ml/artifact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
- truefoundry/ml/artifact/truefoundry_artifact_repo.py,sha256=FksxhUpRHb9pgWZmAB16DhXqkAL6UIAPA1S3RJUApQU,46201
111
+ truefoundry/ml/artifact/truefoundry_artifact_repo.py,sha256=myDpr3RZzEkd_UG9C3rZ4UKEFxXopO5HMVJNpNDiuAo,37737
110
112
  truefoundry/ml/autogen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
- truefoundry/ml/autogen/client/__init__.py,sha256=Da3NzHW9aCi9zjQZteTm1aPTuyHDVqrFDtzwsdqIPbc,19981
113
+ truefoundry/ml/autogen/client/__init__.py,sha256=28MIn6pjqHZlnjuljt-kgrR7Dw07It7khbMZm3dlQlY,20118
112
114
  truefoundry/ml/autogen/client/api/__init__.py,sha256=NyMBxBmIzB1o5LzZZwz9LiydHB3-hPqc_sevsnY6Jrw,746
113
115
  truefoundry/ml/autogen/client/api/auth_api.py,sha256=zpWzJhUmW6HHMY_atlUf0B25k77E1kue2hmix5I5Ih0,7017
114
116
  truefoundry/ml/autogen/client/api/deprecated_api.py,sha256=mu5x_skNcwz8v1Tr6VP72-tVP7pmBV9muyKy_2NH3F0,38824
@@ -116,14 +118,14 @@ truefoundry/ml/autogen/client/api/experiments_api.py,sha256=mRKS8qGzcFJUpTWjfQoF
116
118
  truefoundry/ml/autogen/client/api/generate_code_snippet_api.py,sha256=C8iABP-pYIyIoTlL8PFi3ZBG_6B_dkQf09eErNeoj7A,22316
117
119
  truefoundry/ml/autogen/client/api/health_api.py,sha256=IAPhRAo9CLUT5ipVR1fCf-qDx57UR0wg5ekhtUl8lug,11554
118
120
  truefoundry/ml/autogen/client/api/metrics_api.py,sha256=q3L38eD-2hu4_9YvcSdnWDYXD2V8il-X9reinOAABek,14908
119
- truefoundry/ml/autogen/client/api/mlfoundry_artifacts_api.py,sha256=5FSOinHzGTbNh-F6KdpxFlVwPrtKVKn4jzr4Dwp9bpw,313554
121
+ truefoundry/ml/autogen/client/api/mlfoundry_artifacts_api.py,sha256=i3OaGysy3Th-ZVqJ6HenSn7W7cQkRUDS_G5D28tk6e4,319913
120
122
  truefoundry/ml/autogen/client/api/run_artifacts_api.py,sha256=x-vVnY2LEFChZxiiFauswRWwFz6Qqh30PKXjzuTvxmc,8799
121
123
  truefoundry/ml/autogen/client/api/runs_api.py,sha256=-aghrZ2VYuZOw_vBtOzWDsnK7Ji29oZQxK2CLRgyo2w,119232
122
124
  truefoundry/ml/autogen/client/api_client.py,sha256=M31IycWorn10FYS8WbO_Whaipr0tVu2pVWFCfbS7XCo,29167
123
125
  truefoundry/ml/autogen/client/api_response.py,sha256=KRyvecPMXF05PaxILHZ8JHoP4rgKBjKONMgG83aU-rM,844
124
126
  truefoundry/ml/autogen/client/configuration.py,sha256=V1oaEnxt-NfpaNmp-EZpf2glovzVhM2coWYt8HBNB4M,15723
125
127
  truefoundry/ml/autogen/client/exceptions.py,sha256=XbCbDHhYT3BVejdoGNPgEa4oS56ypkwFdxk1iOc_tFY,5355
126
- truefoundry/ml/autogen/client/models/__init__.py,sha256=4mkEcTiiMIGu16f2idqmFFaeT3T7E1qDIorrhhXReEk,18603
128
+ truefoundry/ml/autogen/client/models/__init__.py,sha256=m2SztLLPzl_aifXj8-aFFl_gqkArLijw0ZLabOFOdCM,18740
127
129
  truefoundry/ml/autogen/client/models/add_custom_metrics_to_model_version_request_dto.py,sha256=_ISDspicTGjBCYYXubKfRYYSSQVyW3AvG-jFh47-Zfc,2163
128
130
  truefoundry/ml/autogen/client/models/add_features_to_model_version_request_dto.py,sha256=OT1-98DyWNfAHz_EgD2gMX2XkrGQ4Re945fhoAl8qSE,2099
129
131
  truefoundry/ml/autogen/client/models/agent.py,sha256=lUAbs092yo9hZmqzX6atKebDNf1uEwTf5jLvjOdvoeM,3872
@@ -135,7 +137,7 @@ truefoundry/ml/autogen/client/models/artifact_dto.py,sha256=JWL8_sITJJXbxywcfRj4
135
137
  truefoundry/ml/autogen/client/models/artifact_response_dto.py,sha256=T_HLjkHnqiO1bnSXiCUOlwDEHGz89mlUNhBq0SJTapo,2226
136
138
  truefoundry/ml/autogen/client/models/artifact_type.py,sha256=LBXGYUoesmL5J-0xzCR8jBST3bjb6HY86RmqSGvytRs,828
137
139
  truefoundry/ml/autogen/client/models/artifact_version_dto.py,sha256=GXjjKycpsEgJ60V2hAfL4NMxM2gZKLP2qV2yBb9WgdM,6174
138
- truefoundry/ml/autogen/client/models/artifact_version_manifest.py,sha256=3_r-Xsc1OwydVeh9nORAnKegkI73fGgJw4AzKzj0UPQ,3617
140
+ truefoundry/ml/autogen/client/models/artifact_version_manifest.py,sha256=AOg17pPxbOuqmSLCBj_us4_heijpr_k-CZWnl87RExw,4829
139
141
  truefoundry/ml/autogen/client/models/artifact_version_response_dto.py,sha256=JmiSYdPYG-ki6LCBeF7NtihdQ2LPiHld8cSPivY2GmQ,2421
140
142
  truefoundry/ml/autogen/client/models/artifact_version_serialization_format.py,sha256=2Qfgq1nykn0_mKNEJzOxhQwHm_95WIr9wJcHLeFWXQM,774
141
143
  truefoundry/ml/autogen/client/models/artifact_version_status.py,sha256=iIcomqhuaJkZH2rT3e6IjQutM79t9hEshW-RCIMKHEY,780
@@ -186,6 +188,7 @@ truefoundry/ml/autogen/client/models/fast_ai_framework.py,sha256=GwVoMbIzYhr4srF
186
188
  truefoundry/ml/autogen/client/models/file_info_dto.py,sha256=7oc8venicsFVk8zT9wHNhHnZGtFkFlqimFnS7ozGL9k,2156
187
189
  truefoundry/ml/autogen/client/models/finalize_artifact_version_request_dto.py,sha256=tkPcNjI0_qhX-D3m6AXqLzdmo9_K0tFBtbPDeg0Zo7U,3818
188
190
  truefoundry/ml/autogen/client/models/framework.py,sha256=W_KrqH1qKRvlrssCCWFIlmPaeAw0eiM6VqS3pbdlMXU,14720
191
+ truefoundry/ml/autogen/client/models/get_artifact_version_aliases_response_dto.py,sha256=W064ced8EQCeyJLpKikEtkCzuiqUDwNjS56sh7Mc3yg,2029
189
192
  truefoundry/ml/autogen/client/models/get_experiment_response_dto.py,sha256=FhJpoUeRbZV1s1KR3Y07Kv6U4enLbbgdpGbguT9us0A,2923
190
193
  truefoundry/ml/autogen/client/models/get_latest_run_log_response_dto.py,sha256=g5NG252VzjGHiA-w5nhxmZxGrowJO9XCHDQTjf8y2KE,2266
191
194
  truefoundry/ml/autogen/client/models/get_metric_history_response.py,sha256=rTchO8o4sjGsNaZj8TW-VGtGGxsOBjUGzgaAWNtBZ-k,2428
@@ -244,7 +247,7 @@ truefoundry/ml/autogen/client/models/model_response_dto.py,sha256=osrTxfygkuhxWj
244
247
  truefoundry/ml/autogen/client/models/model_server.py,sha256=N5mcWmnX0KzTMtTH8A9h_FmiQcMld3B8CXD_UYeDKaA,700
245
248
  truefoundry/ml/autogen/client/models/model_version_dto.py,sha256=9Mh4d8V33gEGYr4sys5lYYDA3bHKajR3oAZLZMAy_io,7094
246
249
  truefoundry/ml/autogen/client/models/model_version_environment.py,sha256=wTayQjMen24eJCqXQugzoXLANY5NXdVsAvZSh-QIhJA,2827
247
- truefoundry/ml/autogen/client/models/model_version_manifest.py,sha256=gRsrZzfLm1cHk5cbHmYQtShXGLLxPKcxRMPDWCqWTZc,4657
250
+ truefoundry/ml/autogen/client/models/model_version_manifest.py,sha256=UrusTkY39LBGpVfjIt0xG-zbnSIa6zVfqzxMXOQGOPI,5822
248
251
  truefoundry/ml/autogen/client/models/model_version_response_dto.py,sha256=D6XOCyggxqTkbePuypqYSHYh1PYeDv7R_J32q61sDM0,2320
249
252
  truefoundry/ml/autogen/client/models/multi_part_upload_dto.py,sha256=Ckq405vud8RQmMyKCJQJBlW5iXO7Y2mlgo8eVkiMvxg,3738
250
253
  truefoundry/ml/autogen/client/models/multi_part_upload_response_dto.py,sha256=VjH0kvl7rMjgDHjYGHnsh7KsZ5-qn-k3ksdGLJ49nIM,2431
@@ -305,8 +308,8 @@ truefoundry/ml/autogen/client/models/xg_boost_framework.py,sha256=a0EHzncxe_hSFU
305
308
  truefoundry/ml/autogen/client/models/xg_boost_model_schema.py,sha256=QKJkiERNqF8UiolX2FjvhkUkUlUgDoo3CpTYPAdCxV8,2735
306
309
  truefoundry/ml/autogen/client/models/xg_boost_serialization_format.py,sha256=wFFSH0Z9MP8eT_fysHfUu4iqdjEZART-HxTH4e4gNI8,872
307
310
  truefoundry/ml/autogen/client/rest.py,sha256=9goba8qHjQuVx5O_yRaTKu7PvBnb7r7swfy3dwuTEgk,14281
308
- truefoundry/ml/autogen/client_README.md,sha256=9g4j_zKjNJleHNZu_N15KaFRsCAspWI_xMzuHkgq6iQ,36930
309
- truefoundry/ml/autogen/entities/artifacts.py,sha256=tH_gCB-w2A4Yq8kJck9vLVCQ1CxnIKVzBhDWMdH3Uho,20294
311
+ truefoundry/ml/autogen/client_README.md,sha256=qrAp9e6D4rKZETpvJry0U8Yn2ZkxDHMA9NUNsfmO_JY,37326
312
+ truefoundry/ml/autogen/entities/artifacts.py,sha256=jLBQk5OYpdhXwwLEIAQLkT-ttZbg522FBWHvgwOCQGQ,20995
310
313
  truefoundry/ml/autogen/models/__init__.py,sha256=--TGRea9SQBWFfwtcl3ekb1XGfFTdEkQGSG8a2SJ60I,187
311
314
  truefoundry/ml/autogen/models/exceptions.py,sha256=q3n7FGBrg_hUy1UyoefhMnhcXUAaqXlLIGHoOVzn_d8,1390
312
315
  truefoundry/ml/autogen/models/schema.py,sha256=IhpO9qbygLqEamP3NIt3m90SseJXCOm1ZTqNbNbW-M0,55772
@@ -319,22 +322,20 @@ truefoundry/ml/cli/commands/download.py,sha256=N9MhsEQ3U24v_OmnMZT8Q4SoAi38Sm7a2
319
322
  truefoundry/ml/cli/commands/model_init.py,sha256=9fHCernmQswjEhREzdrnKxwCCWkgmFrpL29H52Sd1gQ,2663
320
323
  truefoundry/ml/cli/utils.py,sha256=j6_mZ4Spn114mz3P4QQ8jx0tmorXIuyQnHXVUSDvZi4,1035
321
324
  truefoundry/ml/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
322
- truefoundry/ml/clients/entities.py,sha256=sNP4DnAVdQoMfc06s0r3VTzKHTo7jmxAOuTlQOVmsMs,151
323
- truefoundry/ml/clients/servicefoundry_client.py,sha256=nmKrWBd7P0VEDGjPHZ8_scX3Xo9tv3wZSWlTIBwGptU,1597
324
- truefoundry/ml/clients/utils.py,sha256=c0LdC8moejs-Zm30hu1sCqifLEmqhdq4SfZ_m0nUIDk,4402
325
+ truefoundry/ml/clients/servicefoundry_client.py,sha256=Rx-tjiDxNwUgOCDITjtL0vmZcQgJjh_tUdReE23TKIk,2363
325
326
  truefoundry/ml/constants.py,sha256=vDq72d4C9FSWqr9MMdjgTF4TuyNFApvo_6RVsSeAjB4,2837
326
327
  truefoundry/ml/entities.py,sha256=si5GAqZsWzKu5MPrU4Hk6se7bebHOYhTiNw69ai-Uk8,1485
327
328
  truefoundry/ml/enums.py,sha256=arqDkF8duU_oVLFeYMhcfWYbF6Nq5mmjwupJMIheyXM,1790
328
- truefoundry/ml/exceptions.py,sha256=8aJm2NYtAWWsRLu4MbzaoOqHsQZ6RjOFwBWQWqb6qrc,244
329
+ truefoundry/ml/exceptions.py,sha256=QpDJSWmF7dIsByS0qOQbQZ_jytdNTzkHDDO3BxhTSo0,332
329
330
  truefoundry/ml/git_info.py,sha256=jvAVm9ilqivnGq8qJdUvYdd8Siv0PLtqurB-PXsS5ho,2023
330
331
  truefoundry/ml/internal_namespace.py,sha256=QcqMHp6-C2im2H_02hlhi01EIcr1HhNaZprszs13EMU,1790
331
332
  truefoundry/ml/log_types/__init__.py,sha256=g4u4D4Jaj0aBK5GtrLV88-qThKZR9pSZ17vFEkN-LmM,125
332
- truefoundry/ml/log_types/artifacts/artifact.py,sha256=6X4lO23DwM7yTgUOY4RRoYMrf9m2AbiBBo2WftS2-dc,20457
333
+ truefoundry/ml/log_types/artifacts/artifact.py,sha256=b7GXYQx6MVI5qnPIS96xGqwwWVKGY4LYrEU9pCKkU_Y,21772
333
334
  truefoundry/ml/log_types/artifacts/constants.py,sha256=qKxQ5mMvJE4j83BvGW3qNTKunxCiBg_EEjTdgbgJtyE,1036
334
335
  truefoundry/ml/log_types/artifacts/dataset.py,sha256=a4dxd2EN8p7Ci-cLGGiDOboN3t0395_XhWE1dmTw1Q4,13112
335
336
  truefoundry/ml/log_types/artifacts/general_artifact.py,sha256=B4XErLr-m6RmQWtxMTu3wlFRFcqSwPYp6J0OL4Ng6L0,3179
336
- truefoundry/ml/log_types/artifacts/model.py,sha256=sOqMptIpr2YRv7VC6AntFDvDUg5eQLsS7jQ_4TUB5Ds,22724
337
- truefoundry/ml/log_types/artifacts/utils.py,sha256=8mmahc1b6wvrA_E795h9ynRfhYRIdci7LRGN8U6ySm8,7516
337
+ truefoundry/ml/log_types/artifacts/model.py,sha256=UfGKJA9ywDtXEIH6E-VfdjvlQNdaKO-Kv76KaTZOVkA,24413
338
+ truefoundry/ml/log_types/artifacts/utils.py,sha256=MuPk6by8jIt7LepB1fqUC8emQBSxrTGJmIel7rbMBAc,7533
338
339
  truefoundry/ml/log_types/image/__init__.py,sha256=fcOq8yQnNj1rkLcPeIjLXBpdA1WIeiPsXOlAAvMxx7M,76
339
340
  truefoundry/ml/log_types/image/constants.py,sha256=wLtGEOA4T5fZHSlOXPuNDLX3lpbCtwlvGKPFk_1fah0,255
340
341
  truefoundry/ml/log_types/image/image.py,sha256=qQnAVgErAq4Jn6wXFFpaveOd52zcjUuomUCqNRxO2io,12478
@@ -344,11 +345,11 @@ truefoundry/ml/log_types/plot.py,sha256=HuYvvRA5r8V0xAIuuqMME2IHb9d3SfGHUiuEkOP3
344
345
  truefoundry/ml/log_types/pydantic_base.py,sha256=eBlw_AEyAz4iJKDP4zgJOCFWcldwQqpf7FADW1jzIQY,272
345
346
  truefoundry/ml/log_types/utils.py,sha256=xjJ21jdPScvFmw3TbVh5NCzbzJwaqiXJyiiT4xxX1EI,335
346
347
  truefoundry/ml/logger.py,sha256=VT-BF3BnBYTWVq87O58F0c8uXMu94gYzsiFlGY3_7Ao,458
347
- truefoundry/ml/mlfoundry_api.py,sha256=avuGgjbRnQXk774Vd3Dx7n99bbrOkL9pob9DI-vNvWE,62368
348
- truefoundry/ml/mlfoundry_run.py,sha256=scHjdjojRGbE4ZZlByZTFrcBTamRbm_JGidaSX9Gi9o,44601
349
- truefoundry/ml/model_framework.py,sha256=xHmVFI3Xcd6z6BH9TyZY8kFiw3Fp70423_M_wTYxd5Y,18841
348
+ truefoundry/ml/mlfoundry_api.py,sha256=ofIbFimPI7u301KFxdbmWbJT0AIinbRMQyCwX7hbPzs,61543
349
+ truefoundry/ml/mlfoundry_run.py,sha256=M-0FkZYDxwv5EZUDtVqiV8JxC_3BWR80N7Kp4Yj7bPY,44291
350
+ truefoundry/ml/model_framework.py,sha256=JGmzdG7o5P6CJr5EYTUOmuly53FfhpoNVqKrhfijAVg,18972
350
351
  truefoundry/ml/run_utils.py,sha256=0W208wSLUrbdfk2pjNcZlkUi9bNxG2JORqoe-5rVqHI,2423
351
- truefoundry/ml/session.py,sha256=F83GTC5WwGBjnJ69Ct8MqMnlutYc56JCc6YhEY1Wl-A,5394
352
+ truefoundry/ml/session.py,sha256=eQo1zG5nd0-8Ok68uEBCQDPAWYeJkpzqHak-DQX1ENU,4553
352
353
  truefoundry/ml/validation_utils.py,sha256=J5atNhcJLvKj64ralSV9Y5Fv1Rt4SE237ICdP9-7sP4,12149
353
354
  truefoundry/pydantic_v1.py,sha256=jSuhGtz0Mbk1qYu8jJ1AcnIDK4oxUsdhALc4spqstmM,345
354
355
  truefoundry/version.py,sha256=bqiT4Q-VWrTC6P4qfK43mez-Ppf-smWfrl6DcwV7mrw,137
@@ -363,11 +364,11 @@ truefoundry/workflow/map_task.py,sha256=2m3qGXQ90k9LdS45q8dqCCECc3qr8t2m_LMCVd1m
363
364
  truefoundry/workflow/python_task.py,sha256=SRXRLC4vdBqGjhkwuaY39LEWN6iPCpJAuW17URRdWTY,1128
364
365
  truefoundry/workflow/remote_filesystem/__init__.py,sha256=LQ95ViEjJ7Ts4JcCGOxMPs7NZmQdZ4bTiq6qXtsjUhE,206
365
366
  truefoundry/workflow/remote_filesystem/logger.py,sha256=em2l7D6sw7xTLDP0kQSLpgfRRCLpN14Qw85TN7ujQcE,1022
366
- truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=5mBCIc-ON7VSTzdyczeADgqSX5oJgso5gq2yT2AQqTY,11085
367
- truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=Hf6Dk6Fu6P7DqsK5ULgraf9DStjgigf-kjaRAMBW-RU,8680
367
+ truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=xcT0wQmQlgzcj0nP3tJopyFSVWT1uv3nhiTIuwfXYeg,12342
368
+ truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=nSGPZu0Gyd_jz0KsEE-7w_BmnTD8CVF1S8cUJoxaCbc,13305
368
369
  truefoundry/workflow/task.py,sha256=ToitYiKcNzFCtOVQwz1W8sRjbR97eVS7vQBdbgUQtKg,1779
369
370
  truefoundry/workflow/workflow.py,sha256=WaTqUjhwfAXDWu4E5ehuwAxrCbDJkoAf1oWmR2E9Qy0,4575
370
- truefoundry-0.5.2.dist-info/METADATA,sha256=6hHSeJgoWF54g-W-F9zKjBcHi1irRbByE2aTXb-3qPo,2884
371
- truefoundry-0.5.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
372
- truefoundry-0.5.2.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
373
- truefoundry-0.5.2.dist-info/RECORD,,
371
+ truefoundry-0.5.3.dist-info/METADATA,sha256=zCd6nLACzS6uWBVJbXOpJOL7H0RWjvsj70Eo1s1prhc,2884
372
+ truefoundry-0.5.3.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
373
+ truefoundry-0.5.3.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
374
+ truefoundry-0.5.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 2.0.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -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,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
@@ -1,122 +0,0 @@
1
- import json
2
- from contextlib import contextmanager
3
- from typing import Any, Optional
4
- from urllib.parse import urljoin
5
-
6
- import requests
7
-
8
- from truefoundry.common.request_utils import requests_retry_session
9
- from truefoundry.ml.clients.entities import HostCreds
10
- from truefoundry.ml.exceptions import MlFoundryException
11
-
12
-
13
- # TODO: This will be moved later to truefoundry.common.request_utils
14
- def _make_url(host: str, endpoint: str) -> str:
15
- if endpoint.startswith("/"):
16
- raise ValueError("`endpoint` must not start with a leading slash (/)")
17
- return urljoin(host, endpoint)
18
-
19
-
20
- def _http_request(
21
- *, method: str, url: str, token: Optional[str] = None, session=requests, **kwargs
22
- ) -> requests.Response:
23
- headers = kwargs.pop("headers", {}) or {}
24
- if token is not None:
25
- headers["Authorization"] = f"Bearer {token}"
26
- return session.request(method=method, url=url, headers=headers, **kwargs)
27
-
28
-
29
- def http_request(
30
- *, method: str, host_creds: HostCreds, endpoint: str, session=requests, **kwargs
31
- ) -> requests.Response:
32
- url = _make_url(host=host_creds.host, endpoint=endpoint)
33
- return _http_request(
34
- method=method, url=url, token=host_creds.token, session=session, **kwargs
35
- )
36
-
37
-
38
- def http_request_safe(
39
- *, method: str, host_creds: HostCreds, endpoint: str, session=requests, **kwargs
40
- ) -> Any:
41
- url = _make_url(host=host_creds.host, endpoint=endpoint)
42
- try:
43
- response = _http_request(
44
- method=method, url=url, token=host_creds.token, session=session, **kwargs
45
- )
46
- response.raise_for_status()
47
- try:
48
- return response.json()
49
- except json.JSONDecodeError as je:
50
- raise MlFoundryException(
51
- f"Failed to parse response as json. Response: {response.text}"
52
- ) from je
53
- except requests.exceptions.ConnectionError as ce:
54
- raise MlFoundryException("Failed to connect to TrueFoundry") from ce
55
- except requests.exceptions.Timeout as te:
56
- raise MlFoundryException(f"Request to {url} timed out") from te
57
- except requests.exceptions.HTTPError as he:
58
- raise MlFoundryException(
59
- f"Request to {url} with status code {he.response.status_code}. Response: {he.response.text}",
60
- status_code=he.response.status_code,
61
- ) from he
62
- except Exception as e:
63
- raise MlFoundryException(
64
- f"Request to {url} failed with an unknown error"
65
- ) from e
66
-
67
-
68
- @contextmanager
69
- def cloud_storage_http_request(
70
- *,
71
- method,
72
- url,
73
- session=None,
74
- timeout=None,
75
- **kwargs,
76
- ):
77
- """
78
- Performs an HTTP PUT/GET request using Python's `requests` module with automatic retry.
79
- """
80
- session = session or requests_retry_session(retries=5, backoff_factor=0.5)
81
- kwargs["headers"] = kwargs.get("headers", {}) or {}
82
- if "blob.core.windows.net" in url:
83
- kwargs["headers"].update({"x-ms-blob-type": "BlockBlob"})
84
- if method.lower() not in ("put", "get"):
85
- raise ValueError(f"Illegal http method: {method}")
86
- try:
87
- yield _http_request(
88
- method=method, url=url, session=session, timeout=timeout, **kwargs
89
- )
90
- except Exception as e:
91
- raise MlFoundryException(
92
- f"API request failed with exception {str(e)}"
93
- ) from None
94
-
95
-
96
- def augmented_raise_for_status(response):
97
- try:
98
- response.raise_for_status()
99
- except requests.exceptions.HTTPError as he:
100
- raise MlFoundryException(
101
- f"Request with status code {he.response.status_code}. Response: {he.response.text}",
102
- status_code=he.response.status_code,
103
- ) from he
104
-
105
-
106
- def download_file_using_http_uri(http_uri, download_path, chunk_size=100_000_000):
107
- """
108
- Downloads a file specified using the `http_uri` to a local `download_path`. This function
109
- uses a `chunk_size` to ensure an OOM error is not raised a large file is downloaded.
110
-
111
- Note : This function is meant to download files using presigned urls from various cloud
112
- providers.
113
- """
114
- with cloud_storage_http_request(
115
- method="get", url=http_uri, stream=True
116
- ) as response:
117
- augmented_raise_for_status(response)
118
- with open(download_path, "wb") as output_file:
119
- for chunk in response.iter_content(chunk_size=chunk_size):
120
- if not chunk:
121
- break
122
- output_file.write(chunk)