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.

@@ -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
- # Internal Signed URL Server
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
- # Artifacts
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
- # Fo customizing the python image used for building via PythonBuild
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
- if ARTIFACT_METADATA_TRUEFOUNDRY_KEY not in metadata:
241
- metadata[ARTIFACT_METADATA_TRUEFOUNDRY_KEY] = {}
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
- created_by_metadata = tfy_metadata[created_by_key]
258
- for key, value in tfy_internal_metadata.items():
259
- if key not in created_by_metadata and value is not None:
260
- created_by_metadata[key] = value
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: truefoundry
3
- Version: 0.12.0rc2
3
+ Version: 0.12.1
4
4
  Summary: TrueFoundry CLI
5
5
  Author-email: TrueFoundry Team <abhishek@truefoundry.com>
6
6
  Requires-Python: <3.14,>=3.8.1
@@ -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=UdCa5nuBpNldleMsRGKK9F_5jEN93uLFeC3laGKVLzc,5010
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=OXJDaJZLGE8jA-6A8pdApfpbz1x3O-8rIMWUkG_8hYA,19940
369
- truefoundry/ml/log_types/artifacts/constants.py,sha256=7blG13UXSkZVZkN8EDFqaH-a_ZonJA6pI0gwJwkIZ-s,1298
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=j4Gf0TKpi-JCOBqCdkH40pkpDLwvSk04KgQn2sK5fZI,24911
373
- truefoundry/ml/log_types/artifacts/utils.py,sha256=INZhhzl6OaD6qFAyxaLJAhXhFd6wKNujMj-lq2v8p4Q,9340
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.0rc2.dist-info/METADATA,sha256=8S3tYnUbtkB8n3Q3Lh3o6B3wW3uWqkcdjq3dmoCa2w0,2799
391
- truefoundry-0.12.0rc2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
392
- truefoundry-0.12.0rc2.dist-info/entry_points.txt,sha256=xVjn7RMN-MW2-9f7YU-bBdlZSvvrwzhpX1zmmRmsNPU,98
393
- truefoundry-0.12.0rc2.dist-info/RECORD,,
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,,