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.
- truefoundry/__init__.py +10 -1
- truefoundry/autodeploy/cli.py +2 -2
- truefoundry/cli/__main__.py +0 -4
- truefoundry/cli/util.py +12 -3
- truefoundry/common/auth_service_client.py +7 -4
- truefoundry/common/constants.py +3 -1
- truefoundry/common/credential_provider.py +7 -8
- truefoundry/common/exceptions.py +11 -7
- truefoundry/common/request_utils.py +96 -14
- truefoundry/common/servicefoundry_client.py +31 -29
- truefoundry/common/session.py +93 -0
- truefoundry/common/storage_provider_utils.py +331 -0
- truefoundry/common/utils.py +9 -9
- truefoundry/common/warnings.py +21 -0
- truefoundry/deploy/builder/builders/tfy_python_buildpack/dockerfile_template.py +8 -20
- truefoundry/deploy/cli/commands/deploy_command.py +4 -4
- truefoundry/deploy/lib/clients/servicefoundry_client.py +13 -14
- truefoundry/deploy/lib/dao/application.py +2 -2
- truefoundry/deploy/lib/dao/workspace.py +1 -1
- truefoundry/deploy/lib/session.py +1 -1
- truefoundry/deploy/v2/lib/deploy.py +2 -2
- truefoundry/deploy/v2/lib/deploy_workflow.py +1 -1
- truefoundry/deploy/v2/lib/patched_models.py +70 -4
- truefoundry/deploy/v2/lib/source.py +2 -1
- truefoundry/gateway/cli/cli.py +1 -22
- truefoundry/gateway/lib/entities.py +3 -8
- truefoundry/gateway/lib/models.py +0 -38
- truefoundry/ml/artifact/truefoundry_artifact_repo.py +33 -297
- truefoundry/ml/clients/servicefoundry_client.py +36 -15
- truefoundry/ml/exceptions.py +2 -1
- truefoundry/ml/log_types/artifacts/artifact.py +3 -2
- truefoundry/ml/log_types/artifacts/model.py +6 -5
- truefoundry/ml/log_types/artifacts/utils.py +2 -2
- truefoundry/ml/mlfoundry_api.py +6 -38
- truefoundry/ml/mlfoundry_run.py +6 -15
- truefoundry/ml/model_framework.py +2 -1
- truefoundry/ml/session.py +69 -97
- truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py +42 -9
- truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py +126 -7
- {truefoundry-0.5.3rc4.dist-info → truefoundry-0.5.3rc5.dist-info}/METADATA +1 -1
- {truefoundry-0.5.3rc4.dist-info → truefoundry-0.5.3rc5.dist-info}/RECORD +43 -44
- truefoundry/deploy/lib/auth/servicefoundry_session.py +0 -61
- truefoundry/gateway/lib/client.py +0 -51
- truefoundry/ml/clients/entities.py +0 -8
- truefoundry/ml/clients/utils.py +0 -122
- {truefoundry-0.5.3rc4.dist-info → truefoundry-0.5.3rc5.dist-info}/WHEEL +0 -0
- {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
|
|
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.
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
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,11 +1,11 @@
|
|
|
1
|
-
truefoundry/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
36
|
-
truefoundry/common/constants.py,sha256=
|
|
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=
|
|
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=
|
|
41
|
-
truefoundry/common/request_utils.py,sha256=
|
|
42
|
-
truefoundry/common/servicefoundry_client.py,sha256=
|
|
43
|
-
truefoundry/common/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
102
|
-
truefoundry/deploy/v2/lib/deploy_workflow.py,sha256=
|
|
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=
|
|
106
|
-
truefoundry/deploy/v2/lib/source.py,sha256=
|
|
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=
|
|
109
|
-
truefoundry/gateway/lib/
|
|
110
|
-
truefoundry/gateway/lib/
|
|
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=
|
|
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/
|
|
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=
|
|
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=
|
|
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=
|
|
344
|
-
truefoundry/ml/log_types/artifacts/utils.py,sha256=
|
|
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=
|
|
355
|
-
truefoundry/ml/mlfoundry_run.py,sha256=
|
|
356
|
-
truefoundry/ml/model_framework.py,sha256=
|
|
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=
|
|
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=
|
|
374
|
-
truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=
|
|
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.
|
|
378
|
-
truefoundry-0.5.
|
|
379
|
-
truefoundry-0.5.
|
|
380
|
-
truefoundry-0.5.
|
|
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()
|