truefoundry 0.12.0rc2__py3-none-any.whl → 0.12.1__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/common/constants.py +27 -18
- truefoundry/ml/log_types/artifacts/artifact.py +2 -0
- truefoundry/ml/log_types/artifacts/constants.py +4 -1
- truefoundry/ml/log_types/artifacts/model.py +2 -0
- truefoundry/ml/log_types/artifacts/utils.py +52 -14
- {truefoundry-0.12.0rc2.dist-info → truefoundry-0.12.1.dist-info}/METADATA +1 -1
- {truefoundry-0.12.0rc2.dist-info → truefoundry-0.12.1.dist-info}/RECORD +9 -9
- {truefoundry-0.12.0rc2.dist-info → truefoundry-0.12.1.dist-info}/WHEEL +0 -0
- {truefoundry-0.12.0rc2.dist-info → truefoundry-0.12.1.dist-info}/entry_points.txt +0 -0
truefoundry/common/constants.py
CHANGED
|
@@ -36,11 +36,16 @@ class TrueFoundrySdkEnv(BaseSettings):
|
|
|
36
36
|
# Note: Every field in this class should have a default value
|
|
37
37
|
# Never expect the user to set these values
|
|
38
38
|
|
|
39
|
+
# For local development, this enables further configuration via _TFYServersConfig
|
|
40
|
+
TFY_CLI_LOCAL_DEV_MODE: bool = False
|
|
41
|
+
|
|
39
42
|
# These two are not meant to be used directly. See the TFY_HOST and TFY_API_KEY properties below
|
|
40
43
|
TFY_HOST_: Optional[str] = Field(default=None, env=TFY_HOST_ENV_KEY)
|
|
41
44
|
TFY_API_KEY_: Optional[SecretStr] = Field(default=None, env=TFY_API_KEY_ENV_KEY)
|
|
42
45
|
|
|
43
|
-
|
|
46
|
+
##############################
|
|
47
|
+
# Internal Signed URL Server #
|
|
48
|
+
##############################
|
|
44
49
|
TFY_INTERNAL_SIGNED_URL_SERVER_HOST: Optional[str] = Field(
|
|
45
50
|
default=None, env=TFY_INTERNAL_SIGNED_URL_SERVER_HOST_ENV_KEY
|
|
46
51
|
)
|
|
@@ -55,32 +60,42 @@ class TrueFoundrySdkEnv(BaseSettings):
|
|
|
55
60
|
TFY_INTERNAL_SIGNED_URL_REQUEST_TIMEOUT: int = 3600 # default: 1 hour
|
|
56
61
|
TFY_INTERNAL_SIGNED_URL_CLIENT_LOG_LEVEL: str = "WARNING"
|
|
57
62
|
|
|
58
|
-
|
|
63
|
+
#############
|
|
64
|
+
# Artifacts #
|
|
65
|
+
#############
|
|
59
66
|
TFY_ARTIFACTS_DOWNLOAD_CHUNK_SIZE_BYTES: int = 100 * 1000 * 1000
|
|
60
67
|
TFY_ARTIFACTS_DOWNLOAD_MAX_WORKERS: int = max(min(32, (os.cpu_count() or 2) * 2), 4)
|
|
61
68
|
TFY_ARTIFACTS_UPLOAD_MAX_WORKERS: int = max(min(32, (os.cpu_count() or 2) * 2), 4)
|
|
62
69
|
TFY_ARTIFACTS_DISABLE_MULTIPART_UPLOAD: bool = False
|
|
63
70
|
TFY_ARTIFACTS_DOWNLOAD_FSYNC_CHUNKS: bool = False
|
|
64
71
|
|
|
65
|
-
|
|
72
|
+
#############
|
|
73
|
+
# TFY Build #
|
|
74
|
+
#############
|
|
75
|
+
# For customizing the images and packages used for builds
|
|
66
76
|
TFY_PYTHONBUILD_PYTHON_IMAGE_REPO: str = "public.ecr.aws/docker/library/python"
|
|
67
|
-
|
|
68
|
-
# TODO(gw): Use another image with more linient rate limits
|
|
69
|
-
TFY_SPARK_BUILD_SPARK_IMAGE_REPO: str = "public.ecr.aws/bitnami/spark"
|
|
70
|
-
|
|
71
|
-
TFY_TASK_PYSPARK_BUILD_SPARK_IMAGE_REPO: str = "public.ecr.aws/bitnami/spark"
|
|
72
|
-
|
|
73
|
-
# For local development, this enables futher configuration via _TFYServersConfig
|
|
74
|
-
TFY_CLI_LOCAL_DEV_MODE: bool = False
|
|
75
|
-
|
|
76
77
|
TFY_PYTHON_BUILD_PACKAGE_MANAGER: PythonPackageManager = PythonPackageManager.UV
|
|
77
78
|
TFY_PYTHON_BUILD_UV_IMAGE_REPO: str = "ghcr.io/astral-sh/uv"
|
|
78
79
|
TFY_PYTHON_BUILD_UV_IMAGE_TAG: str = "latest"
|
|
80
|
+
TFY_PYTHON_BUILD_POETRY_VERSION: str = Field(
|
|
81
|
+
default="2.0", env="TFY_PYTHON_BUILD_POETRY_VERSION"
|
|
82
|
+
)
|
|
83
|
+
TFY_PYTHON_BUILD_LATEST_POETRY_MAJOR_VERSION: int = Field(
|
|
84
|
+
default=2, env="TFY_PYTHON_BUILD_LATEST_POETRY_MAJOR_VERSION"
|
|
85
|
+
)
|
|
86
|
+
TFY_SPARK_BUILD_SPARK_IMAGE_REPO: str = "public.ecr.aws/bitnami/spark"
|
|
87
|
+
TFY_TASK_PYSPARK_BUILD_SPARK_IMAGE_REPO: str = "public.ecr.aws/bitnami/spark"
|
|
79
88
|
|
|
89
|
+
##############
|
|
90
|
+
# OpenAI API #
|
|
91
|
+
##############
|
|
80
92
|
# Global Constants for OpenAI Integration
|
|
81
93
|
OPENAI_API_KEY: Optional[str] = Field(default=None, env=OPENAI_API_KEY_KEY)
|
|
82
94
|
OPENAI_MODEL: Optional[str] = Field(default=None, env=OPENAI_MODEL_KEY)
|
|
83
95
|
|
|
96
|
+
###########
|
|
97
|
+
# TFY Ask #
|
|
98
|
+
###########
|
|
84
99
|
# Ask Command Specific Environment Variables for TrueFoundry
|
|
85
100
|
TFY_ASK_OPENAI_API_KEY: Optional[str] = Field(
|
|
86
101
|
default=None, env=TFY_ASK_OPENAI_API_KEY_KEY
|
|
@@ -94,12 +109,6 @@ class TrueFoundrySdkEnv(BaseSettings):
|
|
|
94
109
|
)
|
|
95
110
|
TFY_ASK_SYSTEM_PROMPT_NAME: str = Field(default="tfy-ask-k8s-prompt")
|
|
96
111
|
TFY_INTERNAL_ASK_CONFIG_OVERRIDE_FILE: Optional[str] = Field(default=None)
|
|
97
|
-
TFY_PYTHON_BUILD_POETRY_VERSION: str = Field(
|
|
98
|
-
default="2.0", env="TFY_PYTHON_BUILD_POETRY_VERSION"
|
|
99
|
-
)
|
|
100
|
-
TFY_PYTHON_BUILD_LATEST_POETRY_MAJOR_VERSION: int = Field(
|
|
101
|
-
default=2, env="TFY_PYTHON_BUILD_LATEST_POETRY_MAJOR_VERSION"
|
|
102
|
-
)
|
|
103
112
|
|
|
104
113
|
# This is a hack to fresh read the env vars because people can end up importing this file
|
|
105
114
|
# before setting the correct env vars. E.g. in notebook environments.
|
|
@@ -40,6 +40,7 @@ from truefoundry.ml.log_types.artifacts.utils import (
|
|
|
40
40
|
calculate_total_size,
|
|
41
41
|
get_autogen_type,
|
|
42
42
|
set_tfy_internal_metadata,
|
|
43
|
+
set_user_artifact_metadata,
|
|
43
44
|
)
|
|
44
45
|
from truefoundry.ml.logger import logger
|
|
45
46
|
from truefoundry.ml.session import _get_api_client
|
|
@@ -458,6 +459,7 @@ def _log_artifact_version_helper(
|
|
|
458
459
|
|
|
459
460
|
metadata = metadata or {}
|
|
460
461
|
metadata = set_tfy_internal_metadata(metadata)
|
|
462
|
+
metadata = set_user_artifact_metadata(metadata)
|
|
461
463
|
|
|
462
464
|
_validate_description(description)
|
|
463
465
|
_validate_artifact_metadata(metadata)
|
|
@@ -26,7 +26,7 @@ following:
|
|
|
26
26
|
from truefoundry.ml import get_client
|
|
27
27
|
from truefoundry.ml import ModelVersion, ModelSchema, Feature, FeatureValueType, PredictionValueType
|
|
28
28
|
client = get_client()
|
|
29
|
-
model_version = ModelVersion(fqn="{fqn}")
|
|
29
|
+
model_version = ModelVersion.from_fqn(fqn="{fqn}")
|
|
30
30
|
model_version = ModelSchema(...) # or schema in dictionary format {{"features": [...], "prediction": ...}}
|
|
31
31
|
model_version.update()
|
|
32
32
|
```
|
|
@@ -36,3 +36,6 @@ ARTIFACT_METADATA_TRUEFOUNDRY_KEY = ".truefoundry"
|
|
|
36
36
|
TFY_INTERNAL_APPLICATION_ID_ENV_VAR = "TFY_INTERNAL_APPLICATION_ID"
|
|
37
37
|
TFY_INTERNAL_APPLICATION_VERSION_ENV_VAR = "TFY_INTERNAL_APPLICATION_VERSION"
|
|
38
38
|
TFY_INTERNAL_JOB_RUN_NAME_ENV_VAR = "TFY_INTERNAL_JOB_RUN_NAME"
|
|
39
|
+
TFY_ARTIFACTS_ADDITIONAL_USER_METADATA_ENV_VAR = (
|
|
40
|
+
"TFY_ARTIFACTS_ADDITIONAL_USER_METADATA"
|
|
41
|
+
)
|
|
@@ -47,6 +47,7 @@ from truefoundry.ml.log_types.artifacts.utils import (
|
|
|
47
47
|
calculate_total_size,
|
|
48
48
|
get_autogen_type,
|
|
49
49
|
set_tfy_internal_metadata,
|
|
50
|
+
set_user_artifact_metadata,
|
|
50
51
|
)
|
|
51
52
|
from truefoundry.ml.model_framework import (
|
|
52
53
|
ModelFrameworkType,
|
|
@@ -547,6 +548,7 @@ def _log_model_version( # noqa: C901
|
|
|
547
548
|
total_size = None
|
|
548
549
|
metadata = metadata or {}
|
|
549
550
|
metadata = set_tfy_internal_metadata(metadata)
|
|
551
|
+
metadata = set_user_artifact_metadata(metadata)
|
|
550
552
|
|
|
551
553
|
_validate_description(description)
|
|
552
554
|
_validate_artifact_metadata(metadata)
|
|
@@ -10,6 +10,7 @@ from truefoundry.ml.exceptions import MlFoundryException
|
|
|
10
10
|
from truefoundry.ml.log_types.artifacts.constants import (
|
|
11
11
|
ARTIFACT_METADATA_TRUEFOUNDRY_KEY,
|
|
12
12
|
DESCRIPTION_MAX_LENGTH,
|
|
13
|
+
TFY_ARTIFACTS_ADDITIONAL_USER_METADATA_ENV_VAR,
|
|
13
14
|
TFY_INTERNAL_APPLICATION_ID_ENV_VAR,
|
|
14
15
|
TFY_INTERNAL_APPLICATION_VERSION_ENV_VAR,
|
|
15
16
|
TFY_INTERNAL_JOB_RUN_NAME_ENV_VAR,
|
|
@@ -237,16 +238,8 @@ def get_autogen_type(parent_type: Type[BaseModel], field_name: str) -> Type[Base
|
|
|
237
238
|
|
|
238
239
|
|
|
239
240
|
def set_tfy_internal_metadata(metadata: Dict[str, Any]) -> Dict[str, Any]:
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
elif not isinstance(metadata[ARTIFACT_METADATA_TRUEFOUNDRY_KEY], dict):
|
|
243
|
-
return metadata
|
|
244
|
-
|
|
245
|
-
tfy_metadata = metadata[ARTIFACT_METADATA_TRUEFOUNDRY_KEY]
|
|
246
|
-
created_by_key = "created_by"
|
|
247
|
-
if created_by_key not in tfy_metadata:
|
|
248
|
-
tfy_metadata[created_by_key] = {}
|
|
249
|
-
elif not isinstance(tfy_metadata[created_by_key], dict):
|
|
241
|
+
tfy_metadata = metadata.setdefault(ARTIFACT_METADATA_TRUEFOUNDRY_KEY, {})
|
|
242
|
+
if not isinstance(tfy_metadata, dict):
|
|
250
243
|
return metadata
|
|
251
244
|
|
|
252
245
|
tfy_internal_metadata = {
|
|
@@ -254,8 +247,53 @@ def set_tfy_internal_metadata(metadata: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
254
247
|
"application_version": os.environ.get(TFY_INTERNAL_APPLICATION_VERSION_ENV_VAR),
|
|
255
248
|
"job_run_name": os.environ.get(TFY_INTERNAL_JOB_RUN_NAME_ENV_VAR),
|
|
256
249
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
250
|
+
tfy_internal_metadata = {
|
|
251
|
+
k: v for k, v in tfy_internal_metadata.items() if v is not None
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if tfy_internal_metadata:
|
|
255
|
+
created_by_key = "created_by"
|
|
256
|
+
created_by_metadata = tfy_metadata.setdefault(created_by_key, {})
|
|
257
|
+
if created_by_key in tfy_metadata and not isinstance(created_by_metadata, dict):
|
|
258
|
+
return metadata
|
|
259
|
+
for key, value in tfy_internal_metadata.items():
|
|
260
|
+
if key not in created_by_metadata:
|
|
261
|
+
created_by_metadata[key] = value
|
|
262
|
+
return metadata
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _merge_dicts_recursively(
|
|
266
|
+
src: Dict[str, Any], dest: Dict[str, Any], overwrite: bool = False
|
|
267
|
+
) -> Dict[str, Any]:
|
|
268
|
+
for key, value in src.items():
|
|
269
|
+
if key not in dest:
|
|
270
|
+
dest[key] = value
|
|
271
|
+
else:
|
|
272
|
+
if isinstance(value, dict) and isinstance(dest[key], dict):
|
|
273
|
+
_merge_dicts_recursively(value, dest[key], overwrite=overwrite)
|
|
274
|
+
elif overwrite:
|
|
275
|
+
dest[key] = value
|
|
276
|
+
return dest
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def set_user_artifact_metadata(metadata: Dict[str, Any]) -> Dict[str, Any]:
|
|
280
|
+
_user_metadata = os.environ.get(TFY_ARTIFACTS_ADDITIONAL_USER_METADATA_ENV_VAR)
|
|
281
|
+
if not _user_metadata:
|
|
282
|
+
return metadata
|
|
283
|
+
|
|
284
|
+
try:
|
|
285
|
+
user_metadata = json.loads(_user_metadata)
|
|
286
|
+
except ValueError:
|
|
287
|
+
logger.warning(
|
|
288
|
+
"Content of `TFY_ARTIFACTS_ADDITIONAL_USER_METADATA` environment variable is not valid json, cannot add to metadata"
|
|
289
|
+
)
|
|
290
|
+
return metadata
|
|
291
|
+
|
|
292
|
+
if not isinstance(user_metadata, dict):
|
|
293
|
+
logger.warning(
|
|
294
|
+
"Content of `TFY_ARTIFACTS_ADDITIONAL_USER_METADATA` environment variable is not a dictionary, cannot add to metadata"
|
|
295
|
+
)
|
|
296
|
+
return metadata
|
|
297
|
+
|
|
298
|
+
metadata = _merge_dicts_recursively(user_metadata, metadata, overwrite=False)
|
|
261
299
|
return metadata
|
|
@@ -40,7 +40,7 @@ truefoundry/cli/display_util.py,sha256=9vzN3mbQqU6OhS7qRUiMRana4PTHa4sDTA0Hn7OVj
|
|
|
40
40
|
truefoundry/cli/util.py,sha256=kEjC20-n_jwxZV9jq-78CxDk4xAySxAoYIXTxZfJzLM,5423
|
|
41
41
|
truefoundry/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
42
|
truefoundry/common/auth_service_client.py,sha256=N3YxKlx63r6cPZqbgb2lqBOPI69ShB7D7RCIq4FSCjc,7949
|
|
43
|
-
truefoundry/common/constants.py,sha256
|
|
43
|
+
truefoundry/common/constants.py,sha256=-oZRizJixgt7nKAtGoFyHN23sIbe1UqLkYVAyEYacbM,5203
|
|
44
44
|
truefoundry/common/credential_file_manager.py,sha256=1yEk1Zm2xS4G0VDFwKSZ4w0VUrcPWQ1nJnoBaz9xyKA,4251
|
|
45
45
|
truefoundry/common/credential_provider.py,sha256=_OhJ2XFlDaVsrUO-FyywxctcGGqDdC2pgcvwEKqQD0Q,4071
|
|
46
46
|
truefoundry/common/entities.py,sha256=b4R6ss06-ygDS3C4Tqa_GOq5LFKDYbt7x4Mghnfz6yo,4007
|
|
@@ -365,12 +365,12 @@ truefoundry/ml/log_types/plot.py,sha256=LDh4uy6z2P_a2oPM2lc85c0lt8utVvunohzeMawF
|
|
|
365
365
|
truefoundry/ml/log_types/pydantic_base.py,sha256=eBlw_AEyAz4iJKDP4zgJOCFWcldwQqpf7FADW1jzIQY,272
|
|
366
366
|
truefoundry/ml/log_types/utils.py,sha256=xjJ21jdPScvFmw3TbVh5NCzbzJwaqiXJyiiT4xxX1EI,335
|
|
367
367
|
truefoundry/ml/log_types/artifacts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
368
|
-
truefoundry/ml/log_types/artifacts/artifact.py,sha256=
|
|
369
|
-
truefoundry/ml/log_types/artifacts/constants.py,sha256=
|
|
368
|
+
truefoundry/ml/log_types/artifacts/artifact.py,sha256=Ra2R5BYuLhvLlxaCIwzoluZ7SrnZTSz-H8H9z_0c23E,20024
|
|
369
|
+
truefoundry/ml/log_types/artifacts/constants.py,sha256=BU4tpFQ7p3rNUkSvQXZNGRJB1QjkrQW2eRspUG9HOTs,1405
|
|
370
370
|
truefoundry/ml/log_types/artifacts/dataset.py,sha256=OgWIoT59AhMw8P01FfvUKbJ3EL6HQf_Xw8X4E3Ff5Sg,13172
|
|
371
371
|
truefoundry/ml/log_types/artifacts/general_artifact.py,sha256=yr-SQ2fhUR_sE1MB5zoHHYpGC8tizH_-t3lhsxCAULU,2747
|
|
372
|
-
truefoundry/ml/log_types/artifacts/model.py,sha256=
|
|
373
|
-
truefoundry/ml/log_types/artifacts/utils.py,sha256=
|
|
372
|
+
truefoundry/ml/log_types/artifacts/model.py,sha256=lGxj2cl0q_dgBGJTTOvIA2mUYio32x3uL-IssPa-UpU,24995
|
|
373
|
+
truefoundry/ml/log_types/artifacts/utils.py,sha256=AXSBMUjAb8hm0Wbnj6a8UZbLs5gIWNIkp1RJReNtnGM,10639
|
|
374
374
|
truefoundry/ml/log_types/image/__init__.py,sha256=fcOq8yQnNj1rkLcPeIjLXBpdA1WIeiPsXOlAAvMxx7M,76
|
|
375
375
|
truefoundry/ml/log_types/image/constants.py,sha256=wLtGEOA4T5fZHSlOXPuNDLX3lpbCtwlvGKPFk_1fah0,255
|
|
376
376
|
truefoundry/ml/log_types/image/image.py,sha256=sa0tBHdyluC8bELXY16E0HgFrUDnDBxHrteix4BFXcs,12479
|
|
@@ -387,7 +387,7 @@ truefoundry/workflow/remote_filesystem/__init__.py,sha256=LQ95ViEjJ7Ts4JcCGOxMPs
|
|
|
387
387
|
truefoundry/workflow/remote_filesystem/logger.py,sha256=em2l7D6sw7xTLDP0kQSLpgfRRCLpN14Qw85TN7ujQcE,1022
|
|
388
388
|
truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=xcT0wQmQlgzcj0nP3tJopyFSVWT1uv3nhiTIuwfXYeg,12342
|
|
389
389
|
truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=nSGPZu0Gyd_jz0KsEE-7w_BmnTD8CVF1S8cUJoxaCbc,13305
|
|
390
|
-
truefoundry-0.12.
|
|
391
|
-
truefoundry-0.12.
|
|
392
|
-
truefoundry-0.12.
|
|
393
|
-
truefoundry-0.12.
|
|
390
|
+
truefoundry-0.12.1.dist-info/METADATA,sha256=vlWYE5rhOSxQxqxoaiJO-obasmN55g_pCwaQDZBZ0O8,2796
|
|
391
|
+
truefoundry-0.12.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
392
|
+
truefoundry-0.12.1.dist-info/entry_points.txt,sha256=xVjn7RMN-MW2-9f7YU-bBdlZSvvrwzhpX1zmmRmsNPU,98
|
|
393
|
+
truefoundry-0.12.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|