truefoundry 0.5.3rc1__py3-none-any.whl → 0.5.3rc3__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 (35) hide show
  1. truefoundry/autodeploy/agents/base.py +1 -1
  2. truefoundry/autodeploy/agents/developer.py +1 -1
  3. truefoundry/autodeploy/agents/project_identifier.py +1 -1
  4. truefoundry/autodeploy/agents/tester.py +1 -1
  5. truefoundry/autodeploy/tools/base.py +2 -1
  6. truefoundry/autodeploy/tools/commit.py +1 -1
  7. truefoundry/autodeploy/tools/docker_build.py +1 -1
  8. truefoundry/autodeploy/tools/docker_run.py +1 -1
  9. truefoundry/autodeploy/tools/file_type_counts.py +1 -1
  10. truefoundry/autodeploy/tools/list_files.py +1 -1
  11. truefoundry/autodeploy/tools/read_file.py +1 -2
  12. truefoundry/autodeploy/tools/send_request.py +1 -1
  13. truefoundry/autodeploy/tools/write_file.py +1 -1
  14. truefoundry/cli/__main__.py +4 -0
  15. truefoundry/cli/commands/pat.py +24 -0
  16. truefoundry/deploy/lib/clients/servicefoundry_client.py +24 -1
  17. truefoundry/gateway/__init__.py +1 -0
  18. truefoundry/gateway/cli/cli.py +30 -0
  19. truefoundry/gateway/lib/entities.py +28 -0
  20. truefoundry/gateway/lib/models.py +29 -0
  21. truefoundry/ml/autogen/client/__init__.py +3 -0
  22. truefoundry/ml/autogen/client/api/mlfoundry_artifacts_api.py +147 -0
  23. truefoundry/ml/autogen/client/models/__init__.py +3 -0
  24. truefoundry/ml/autogen/client/models/artifact_version_manifest.py +7 -1
  25. truefoundry/ml/autogen/client/models/get_artifact_tags_response_dto.py +65 -0
  26. truefoundry/ml/autogen/client/models/model_version_manifest.py +7 -0
  27. truefoundry/ml/autogen/client_README.md +2 -0
  28. truefoundry/ml/autogen/entities/artifacts.py +12 -1
  29. truefoundry/ml/log_types/artifacts/artifact.py +36 -4
  30. truefoundry/ml/log_types/artifacts/model.py +49 -9
  31. truefoundry/ml/model_framework.py +3 -2
  32. {truefoundry-0.5.3rc1.dist-info → truefoundry-0.5.3rc3.dist-info}/METADATA +1 -1
  33. {truefoundry-0.5.3rc1.dist-info → truefoundry-0.5.3rc3.dist-info}/RECORD +35 -29
  34. {truefoundry-0.5.3rc1.dist-info → truefoundry-0.5.3rc3.dist-info}/WHEEL +0 -0
  35. {truefoundry-0.5.3rc1.dist-info → truefoundry-0.5.3rc3.dist-info}/entry_points.txt +0 -0
@@ -17,12 +17,12 @@ from openai.types.chat.chat_completion_user_message_param import (
17
17
  ChatCompletionUserMessageParam,
18
18
  )
19
19
  from openai.types.shared_params.function_definition import FunctionDefinition
20
- from pydantic import BaseModel, ValidationError
21
20
 
22
21
  from truefoundry.autodeploy.constants import AUTODEPLOY_MODEL_NAME
23
22
  from truefoundry.autodeploy.logger import logger
24
23
  from truefoundry.autodeploy.tools import Event, RequestEvent, Tool
25
24
  from truefoundry.autodeploy.utils.pydantic_compat import model_dump, model_json_schema
25
+ from truefoundry.pydantic_v1 import BaseModel, ValidationError
26
26
 
27
27
 
28
28
  def llm(
@@ -4,7 +4,6 @@ from typing import Dict, Optional
4
4
 
5
5
  import docker
6
6
  from openai import OpenAI
7
- from pydantic import Field
8
7
 
9
8
  from truefoundry.autodeploy.agents.base import Agent
10
9
  from truefoundry.autodeploy.agents.project_identifier import ProjectIdentifier
@@ -18,6 +17,7 @@ from truefoundry.autodeploy.tools import (
18
17
  RequestEvent,
19
18
  ResponseEvent,
20
19
  )
20
+ from truefoundry.pydantic_v1 import Field
21
21
 
22
22
 
23
23
  class Developer(Agent):
@@ -4,7 +4,6 @@ import enum
4
4
  from typing import List, Optional
5
5
 
6
6
  from openai import OpenAI
7
- from pydantic import Field
8
7
  from rich.console import Console
9
8
 
10
9
  from truefoundry.autodeploy.agents.base import Agent
@@ -16,6 +15,7 @@ from truefoundry.autodeploy.tools import (
16
15
  RequestEvent,
17
16
  ResponseEvent,
18
17
  )
18
+ from truefoundry.pydantic_v1 import Field
19
19
 
20
20
 
21
21
  class ComponentType(str, enum.Enum):
@@ -4,7 +4,6 @@ from typing import Dict, Optional
4
4
 
5
5
  import docker
6
6
  from openai import OpenAI
7
- from pydantic import Field
8
7
  from rich.console import Console
9
8
 
10
9
  from truefoundry.autodeploy.agents.base import Agent
@@ -16,6 +15,7 @@ from truefoundry.autodeploy.tools import (
16
15
  ResponseEvent,
17
16
  SendRequest,
18
17
  )
18
+ from truefoundry.pydantic_v1 import Field
19
19
 
20
20
 
21
21
  class Tester(Agent):
@@ -2,9 +2,10 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any, ClassVar, Generator, Optional, Protocol, Type
4
4
 
5
- from pydantic import BaseModel
6
5
  from rich.console import Console
7
6
 
7
+ from truefoundry.pydantic_v1 import BaseModel
8
+
8
9
 
9
10
  class Event(BaseModel):
10
11
  def render(self, _: Console) -> Optional[Any]: ...
@@ -4,7 +4,6 @@ import os
4
4
  import tempfile
5
5
  from typing import Any, Generator, Optional
6
6
 
7
- from pydantic import Field
8
7
  from rich.console import Console
9
8
  from rich.padding import Padding
10
9
  from rich.prompt import Confirm
@@ -20,6 +19,7 @@ from truefoundry.autodeploy.tools.base import (
20
19
  from truefoundry.autodeploy.utils.client import get_git_binary
21
20
  from truefoundry.autodeploy.utils.diff import LLMDiff
22
21
  from truefoundry.autodeploy.utils.pydantic_compat import model_dump
22
+ from truefoundry.pydantic_v1 import Field
23
23
 
24
24
 
25
25
  class CommitConfirmation(Event):
@@ -6,7 +6,6 @@ from typing import Any, Generator, Iterable, Optional
6
6
 
7
7
  import docker
8
8
  from docker.models.images import BuildError, json_stream
9
- from pydantic import Field
10
9
  from rich.console import Console, ConsoleOptions, RenderResult
11
10
  from rich.padding import Padding
12
11
  from rich.text import Text
@@ -19,6 +18,7 @@ from truefoundry.autodeploy.tools.base import (
19
18
  Rule,
20
19
  Tool,
21
20
  )
21
+ from truefoundry.pydantic_v1 import Field
22
22
 
23
23
 
24
24
  class DockerBuildLog(Event):
@@ -5,7 +5,6 @@ from typing import Any, Dict, Generator, List, Optional
5
5
 
6
6
  import docker
7
7
  import requests
8
- from pydantic import Field
9
8
  from rich.console import Console, ConsoleOptions, RenderResult
10
9
  from rich.padding import Padding
11
10
  from rich.text import Text
@@ -18,6 +17,7 @@ from truefoundry.autodeploy.tools.base import (
18
17
  Rule,
19
18
  Tool,
20
19
  )
20
+ from truefoundry.pydantic_v1 import Field
21
21
 
22
22
 
23
23
  class DockerRunLog(Event):
@@ -5,7 +5,6 @@ from collections import Counter
5
5
  from typing import Any, Dict, Generator
6
6
 
7
7
  import gitignorefile
8
- from pydantic import Field
9
8
  from rich.console import Console
10
9
  from rich.table import Table
11
10
 
@@ -17,6 +16,7 @@ from truefoundry.autodeploy.tools.base import (
17
16
  Rule,
18
17
  Tool,
19
18
  )
19
+ from truefoundry.pydantic_v1 import Field
20
20
 
21
21
 
22
22
  class ShowFileCount(Event):
@@ -5,7 +5,6 @@ from fnmatch import fnmatch
5
5
  from typing import Any, Generator, List, Optional
6
6
 
7
7
  import gitignorefile
8
- from pydantic import Field
9
8
 
10
9
  from truefoundry.autodeploy.tools.base import (
11
10
  Event,
@@ -15,6 +14,7 @@ from truefoundry.autodeploy.tools.base import (
15
14
  Rule,
16
15
  Tool,
17
16
  )
17
+ from truefoundry.pydantic_v1 import Field
18
18
 
19
19
 
20
20
  class ListFiles(Tool):
@@ -3,8 +3,6 @@ from __future__ import annotations
3
3
  import os
4
4
  from typing import Any, Generator, List, Optional
5
5
 
6
- from pydantic import BaseModel, Field
7
-
8
6
  from truefoundry.autodeploy.constants import MAX_FILE_SIZE_READ
9
7
  from truefoundry.autodeploy.tools.base import (
10
8
  Event,
@@ -14,6 +12,7 @@ from truefoundry.autodeploy.tools.base import (
14
12
  Rule,
15
13
  Tool,
16
14
  )
15
+ from truefoundry.pydantic_v1 import BaseModel, Field
17
16
 
18
17
 
19
18
  class Line(BaseModel):
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  from typing import Any, Generator, Optional
4
4
 
5
5
  import requests
6
- from pydantic import Field
7
6
 
8
7
  from truefoundry.autodeploy.tools.base import (
9
8
  Event,
@@ -13,6 +12,7 @@ from truefoundry.autodeploy.tools.base import (
13
12
  Rule,
14
13
  Tool,
15
14
  )
15
+ from truefoundry.pydantic_v1 import Field
16
16
 
17
17
 
18
18
  class SendRequest(Tool):
@@ -4,12 +4,12 @@ from __future__ import annotations
4
4
  import os
5
5
  from typing import Optional
6
6
 
7
- from pydantic import BaseModel, Field
8
7
  from rich.console import Console
9
8
  from rich.prompt import Confirm
10
9
 
11
10
  from truefoundry.autodeploy.tools.base import Tool
12
11
  from truefoundry.autodeploy.utils.diff import Diff
12
+ from truefoundry.pydantic_v1 import BaseModel, Field
13
13
 
14
14
  INTERACTIVE_SESSION = True
15
15
 
@@ -4,6 +4,7 @@ import sys
4
4
  import rich_click as click
5
5
 
6
6
  from truefoundry import logger
7
+ from truefoundry.cli.commands.pat import get_generate_pat_command
7
8
  from truefoundry.cli.config import CliConfig
8
9
  from truefoundry.cli.const import GROUP_CLS
9
10
  from truefoundry.cli.util import setup_rich_click
@@ -21,6 +22,7 @@ from truefoundry.deploy.cli.commands import (
21
22
  get_terminate_command,
22
23
  get_trigger_command,
23
24
  )
25
+ from truefoundry.gateway.cli.cli import get_gateway_cli
24
26
  from truefoundry.ml.cli.cli import get_ml_cli
25
27
  from truefoundry.version import __version__
26
28
 
@@ -88,6 +90,8 @@ def create_truefoundry_cli() -> click.MultiCommand:
88
90
  cli.add_command(get_trigger_command())
89
91
  cli.add_command(get_terminate_command())
90
92
  cli.add_command(get_ml_cli())
93
+ cli.add_command(get_gateway_cli())
94
+ cli.add_command(get_generate_pat_command())
91
95
 
92
96
  if not (sys.platform.startswith("win32") or sys.platform.startswith("cygwin")):
93
97
  cli.add_command(get_patch_command())
@@ -0,0 +1,24 @@
1
+ import click
2
+
3
+ from truefoundry.cli.console import console
4
+ from truefoundry.cli.const import COMMAND_CLS
5
+ from truefoundry.deploy.lib.clients.servicefoundry_client import (
6
+ ServiceFoundryServiceClient,
7
+ )
8
+
9
+
10
+ @click.command(cls=COMMAND_CLS, name="generate-api-key")
11
+ @click.option(
12
+ "--name",
13
+ required=True,
14
+ help="Name for the API key",
15
+ )
16
+ def generate_pat(name: str):
17
+ """Generate a new Personal Access Token with specified name"""
18
+ client = ServiceFoundryServiceClient()
19
+ pat = client.create_pat(name)
20
+ console.print(pat)
21
+
22
+
23
+ def get_generate_pat_command():
24
+ return generate_pat
@@ -4,7 +4,7 @@ import json
4
4
  import os
5
5
  import time
6
6
  from datetime import datetime, timezone
7
- from typing import TYPE_CHECKING, Any, Dict, List, Optional
7
+ from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional
8
8
  from urllib.parse import urljoin
9
9
 
10
10
  import requests
@@ -43,6 +43,7 @@ from truefoundry.deploy.v2.lib.models import (
43
43
  BuildResponse,
44
44
  DeploymentFqnResponse,
45
45
  )
46
+ from truefoundry.gateway.lib.entities import ProviderModels
46
47
  from truefoundry.logger import logger
47
48
  from truefoundry.pydantic_v1 import parse_obj_as
48
49
 
@@ -708,3 +709,25 @@ class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
708
709
  )
709
710
  response_data = request_handling(response)
710
711
  return response_data
712
+
713
+ def get_gateway_models(
714
+ self, model_type: Optional[Literal["chat", "completion", "embedding"]] = None
715
+ ) -> ProviderModels:
716
+ url = f"{self._api_server_url}/{VERSION_PREFIX}/llm-gateway/model/enabled"
717
+ params = {}
718
+ if model_type:
719
+ params["modelType"] = model_type
720
+ response = session_with_retries().get(
721
+ url, headers=self._get_header(), params=params
722
+ )
723
+ response = request_handling(response)
724
+ return parse_obj_as(ProviderModels, response)
725
+
726
+ def create_pat(self, name: str):
727
+ url = f"{self._api_server_url}/{VERSION_PREFIX}/service-account/pat"
728
+ body = {"name": name}
729
+ response = session_with_retries().post(
730
+ url, headers=self._get_header(), json=body
731
+ )
732
+ response = request_handling(response)
733
+ return response
@@ -0,0 +1 @@
1
+ """Gateway module for Truefoundry CLI"""
@@ -0,0 +1,30 @@
1
+ import click
2
+
3
+ from truefoundry.cli.const import COMMAND_CLS, GROUP_CLS
4
+ from truefoundry.cli.display_util import print_entity_list
5
+ from truefoundry.gateway.lib.models import list_models
6
+
7
+
8
+ def get_gateway_cli():
9
+ @click.group(cls=GROUP_CLS, help="Commands to interact with TrueFoundry Gateway")
10
+ def gateway(): ...
11
+
12
+ @gateway.group("list", cls=GROUP_CLS, help="List gateway resources")
13
+ def list_group():
14
+ """List gateway resources"""
15
+ pass
16
+
17
+ @list_group.command(
18
+ "models", cls=COMMAND_CLS, help="List available models filtered by type"
19
+ )
20
+ @click.option(
21
+ "--type",
22
+ "model_type",
23
+ type=click.Choice(["chat", "completion", "embedding"]),
24
+ help="Filter models by type",
25
+ )
26
+ def list_models_cli(model_type: str):
27
+ enabled_models = list_models(model_type)
28
+ print_entity_list("Models", enabled_models)
29
+
30
+ return gateway
@@ -0,0 +1,28 @@
1
+ from typing import Any, Dict, List, Optional, Union
2
+
3
+ from truefoundry.pydantic_v1 import BaseModel
4
+
5
+
6
+ class GatewayModel(BaseModel):
7
+ id: str
8
+ name: str
9
+ provider: str
10
+ model_id: Optional[str]
11
+ provider_account_name: str
12
+ tfy_application_id: Optional[str] = None
13
+ enabled: bool = True
14
+ types: Union[str, List[str]] = ""
15
+ created_by: str
16
+ tenant_name: str
17
+ model_fqn: str
18
+
19
+ def list_row_data(self) -> Dict[str, Any]:
20
+ return {
21
+ "model_id": self.model_fqn,
22
+ "provider": self.provider,
23
+ "provider_model_id": self.model_id,
24
+ }
25
+
26
+
27
+ class ProviderModels(BaseModel):
28
+ __root__: Dict[str, Dict[str, List[GatewayModel]]]
@@ -0,0 +1,29 @@
1
+ from typing import List, Literal, Optional
2
+
3
+ from truefoundry.deploy.lib.clients.servicefoundry_client import (
4
+ ServiceFoundryServiceClient,
5
+ )
6
+ from truefoundry.gateway.lib.entities import GatewayModel
7
+
8
+
9
+ def list_models(
10
+ model_type: Optional[Literal["chat", "completion", "embedding"]] = None,
11
+ ) -> List[GatewayModel]:
12
+ """List available models filtered by type
13
+
14
+ Args:
15
+ model_type (Optional[str], optional): Filter models by type ('chat' or 'completion'). Defaults to None.
16
+
17
+ Returns:
18
+ List: List of enabled models
19
+ """
20
+ client = ServiceFoundryServiceClient()
21
+ models = client.get_gateway_models(model_type)
22
+
23
+ enabled_models = []
24
+ for _, accounts in models.__root__.items():
25
+ for _, model_list in accounts.items():
26
+ for model in model_list:
27
+ enabled_models.append(model)
28
+
29
+ return enabled_models
@@ -184,6 +184,9 @@ from truefoundry.ml.autogen.client.models.finalize_artifact_version_request_dto
184
184
  FinalizeArtifactVersionRequestDto,
185
185
  )
186
186
  from truefoundry.ml.autogen.client.models.framework import Framework
187
+ from truefoundry.ml.autogen.client.models.get_artifact_tags_response_dto import (
188
+ GetArtifactTagsResponseDto,
189
+ )
187
190
  from truefoundry.ml.autogen.client.models.get_experiment_response_dto import (
188
191
  GetExperimentResponseDto,
189
192
  )
@@ -79,6 +79,9 @@ from truefoundry.ml.autogen.client.models.export_deployment_files_request_dto im
79
79
  from truefoundry.ml.autogen.client.models.finalize_artifact_version_request_dto import (
80
80
  FinalizeArtifactVersionRequestDto,
81
81
  )
82
+ from truefoundry.ml.autogen.client.models.get_artifact_tags_response_dto import (
83
+ GetArtifactTagsResponseDto,
84
+ )
82
85
  from truefoundry.ml.autogen.client.models.get_signed_url_for_dataset_write_request_dto import (
83
86
  GetSignedURLForDatasetWriteRequestDto,
84
87
  )
@@ -5338,6 +5341,150 @@ class MlfoundryArtifactsApi:
5338
5341
  _request_auth=_params.get("_request_auth"),
5339
5342
  )
5340
5343
 
5344
+ @validate_arguments
5345
+ def get_tags_for_artifact_get(
5346
+ self, artifact_id: StrictStr, **kwargs
5347
+ ) -> GetArtifactTagsResponseDto: # noqa: E501
5348
+ """Get Tags For Artifact # noqa: E501
5349
+
5350
+ This method makes a synchronous HTTP request by default. To make an
5351
+ asynchronous HTTP request, please pass async_req=True
5352
+
5353
+ >>> thread = api.get_tags_for_artifact_get(artifact_id, async_req=True)
5354
+ >>> result = thread.get()
5355
+
5356
+ :param artifact_id: (required)
5357
+ :type artifact_id: str
5358
+ :param async_req: Whether to execute the request asynchronously.
5359
+ :type async_req: bool, optional
5360
+ :param _request_timeout: timeout setting for this request.
5361
+ If one number provided, it will be total request
5362
+ timeout. It can also be a pair (tuple) of
5363
+ (connection, read) timeouts.
5364
+ :return: Returns the result object.
5365
+ If the method is called asynchronously,
5366
+ returns the request thread.
5367
+ :rtype: GetArtifactTagsResponseDto
5368
+ """
5369
+ kwargs["_return_http_data_only"] = True
5370
+ if "_preload_content" in kwargs:
5371
+ message = "Error! Please call the get_tags_for_artifact_get_with_http_info method with `_preload_content` instead and obtain raw data from ApiResponse.raw_data" # noqa: E501
5372
+ raise ValueError(message)
5373
+ return self.get_tags_for_artifact_get_with_http_info(artifact_id, **kwargs) # noqa: E501
5374
+
5375
+ @validate_arguments
5376
+ def get_tags_for_artifact_get_with_http_info(
5377
+ self, artifact_id: StrictStr, **kwargs
5378
+ ) -> ApiResponse: # noqa: E501
5379
+ """Get Tags For Artifact # noqa: E501
5380
+
5381
+ This method makes a synchronous HTTP request by default. To make an
5382
+ asynchronous HTTP request, please pass async_req=True
5383
+
5384
+ >>> thread = api.get_tags_for_artifact_get_with_http_info(artifact_id, async_req=True)
5385
+ >>> result = thread.get()
5386
+
5387
+ :param artifact_id: (required)
5388
+ :type artifact_id: str
5389
+ :param async_req: Whether to execute the request asynchronously.
5390
+ :type async_req: bool, optional
5391
+ :param _preload_content: if False, the ApiResponse.data will
5392
+ be set to none and raw_data will store the
5393
+ HTTP response body without reading/decoding.
5394
+ Default is True.
5395
+ :type _preload_content: bool, optional
5396
+ :param _return_http_data_only: response data instead of ApiResponse
5397
+ object with status code, headers, etc
5398
+ :type _return_http_data_only: bool, optional
5399
+ :param _request_timeout: timeout setting for this request. If one
5400
+ number provided, it will be total request
5401
+ timeout. It can also be a pair (tuple) of
5402
+ (connection, read) timeouts.
5403
+ :param _request_auth: set to override the auth_settings for an a single
5404
+ request; this effectively ignores the authentication
5405
+ in the spec for a single request.
5406
+ :type _request_auth: dict, optional
5407
+ :type _content_type: string, optional: force content-type for the request
5408
+ :return: Returns the result object.
5409
+ If the method is called asynchronously,
5410
+ returns the request thread.
5411
+ :rtype: tuple(GetArtifactTagsResponseDto, status_code(int), headers(HTTPHeaderDict))
5412
+ """
5413
+
5414
+ _params = locals()
5415
+
5416
+ _all_params = ["artifact_id"]
5417
+ _all_params.extend(
5418
+ [
5419
+ "async_req",
5420
+ "_return_http_data_only",
5421
+ "_preload_content",
5422
+ "_request_timeout",
5423
+ "_request_auth",
5424
+ "_content_type",
5425
+ "_headers",
5426
+ ]
5427
+ )
5428
+
5429
+ # validate the arguments
5430
+ for _key, _val in _params["kwargs"].items():
5431
+ if _key not in _all_params:
5432
+ raise ApiTypeError(
5433
+ "Got an unexpected keyword argument '%s'"
5434
+ " to method get_tags_for_artifact_get" % _key
5435
+ )
5436
+ _params[_key] = _val
5437
+ del _params["kwargs"]
5438
+
5439
+ _collection_formats = {}
5440
+
5441
+ # process the path parameters
5442
+ _path_params = {}
5443
+
5444
+ # process the query parameters
5445
+ _query_params = []
5446
+ if _params.get("artifact_id") is not None: # noqa: E501
5447
+ _query_params.append(("artifact_id", _params["artifact_id"]))
5448
+
5449
+ # process the header parameters
5450
+ _header_params = dict(_params.get("_headers", {}))
5451
+ # process the form parameters
5452
+ _form_params = []
5453
+ _files = {}
5454
+ # process the body parameter
5455
+ _body_params = None
5456
+ # set the HTTP header `Accept`
5457
+ _header_params["Accept"] = self.api_client.select_header_accept(
5458
+ ["application/json"]
5459
+ ) # noqa: E501
5460
+
5461
+ # authentication setting
5462
+ _auth_settings = ["HTTPBearer", "APIKeyCookie"] # noqa: E501
5463
+
5464
+ _response_types_map = {
5465
+ "200": "GetArtifactTagsResponseDto",
5466
+ "422": "HTTPValidationError",
5467
+ }
5468
+
5469
+ return self.api_client.call_api(
5470
+ "/api/2.0/mlflow/mlfoundry-artifacts/artifacts/get-tags",
5471
+ "GET",
5472
+ _path_params,
5473
+ _query_params,
5474
+ _header_params,
5475
+ body=_body_params,
5476
+ post_params=_form_params,
5477
+ files=_files,
5478
+ response_types_map=_response_types_map,
5479
+ auth_settings=_auth_settings,
5480
+ async_req=_params.get("async_req"),
5481
+ _return_http_data_only=_params.get("_return_http_data_only"), # noqa: E501
5482
+ _preload_content=_params.get("_preload_content", True),
5483
+ _request_timeout=_params.get("_request_timeout"),
5484
+ collection_formats=_collection_formats,
5485
+ _request_auth=_params.get("_request_auth"),
5486
+ )
5487
+
5341
5488
  @validate_arguments
5342
5489
  def list_artifact_versions_post(
5343
5490
  self,
@@ -155,6 +155,9 @@ from truefoundry.ml.autogen.client.models.finalize_artifact_version_request_dto
155
155
  FinalizeArtifactVersionRequestDto,
156
156
  )
157
157
  from truefoundry.ml.autogen.client.models.framework import Framework
158
+ from truefoundry.ml.autogen.client.models.get_artifact_tags_response_dto import (
159
+ GetArtifactTagsResponseDto,
160
+ )
158
161
  from truefoundry.ml.autogen.client.models.get_experiment_response_dto import (
159
162
  GetExperimentResponseDto,
160
163
  )
@@ -24,6 +24,7 @@ from truefoundry.pydantic_v1 import (
24
24
  Field,
25
25
  StrictStr,
26
26
  conint,
27
+ conlist,
27
28
  constr,
28
29
  validator,
29
30
  )
@@ -42,12 +43,16 @@ class ArtifactVersionManifest(BaseModel):
42
43
  default=...,
43
44
  description="+label=Metadata +docs=Metadata for the artifact or model version +usage=Metadata for the artifact or model version +uiType=JsonInput",
44
45
  )
46
+ tags: Optional[conlist(constr(strict=True, max_length=128))] = Field(
47
+ default=None,
48
+ description="+label=Tags +usage=Tags for the artifact or model version +docs=Tags for the artifact or model version",
49
+ )
45
50
  type: Optional[StrictStr] = "artifact-version"
46
51
  source: Source = Field(...)
47
52
  step: Optional[conint(strict=True, ge=0)] = Field(
48
53
  default=0, description="+label=Step"
49
54
  )
50
- __properties = ["description", "metadata", "type", "source", "step"]
55
+ __properties = ["description", "metadata", "tags", "type", "source", "step"]
51
56
 
52
57
  @validator("type")
53
58
  def type_validate_enum(cls, value):
@@ -99,6 +104,7 @@ class ArtifactVersionManifest(BaseModel):
99
104
  {
100
105
  "description": obj.get("description"),
101
106
  "metadata": obj.get("metadata"),
107
+ "tags": obj.get("tags"),
102
108
  "type": obj.get("type")
103
109
  if obj.get("type") is not None
104
110
  else "artifact-version",
@@ -0,0 +1,65 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ FastAPI
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+ from __future__ import annotations
15
+
16
+ import json
17
+ import pprint
18
+ import re # noqa: F401
19
+
20
+ from truefoundry.pydantic_v1 import BaseModel, Field, StrictStr, conlist
21
+
22
+
23
+ class GetArtifactTagsResponseDto(BaseModel):
24
+ """
25
+ GetArtifactTagsResponseDto
26
+ """
27
+
28
+ tags: conlist(StrictStr) = Field(...)
29
+ __properties = ["tags"]
30
+
31
+ class Config:
32
+ """Pydantic configuration"""
33
+
34
+ allow_population_by_field_name = True
35
+ validate_assignment = True
36
+
37
+ def to_str(self) -> str:
38
+ """Returns the string representation of the model using alias"""
39
+ return pprint.pformat(self.dict(by_alias=True))
40
+
41
+ def to_json(self) -> str:
42
+ """Returns the JSON representation of the model using alias"""
43
+ return json.dumps(self.to_dict())
44
+
45
+ @classmethod
46
+ def from_json(cls, json_str: str) -> GetArtifactTagsResponseDto:
47
+ """Create an instance of GetArtifactTagsResponseDto from a JSON string"""
48
+ return cls.from_dict(json.loads(json_str))
49
+
50
+ def to_dict(self):
51
+ """Returns the dictionary representation of the model using alias"""
52
+ _dict = self.dict(by_alias=True, exclude={}, exclude_none=True)
53
+ return _dict
54
+
55
+ @classmethod
56
+ def from_dict(cls, obj: dict) -> GetArtifactTagsResponseDto:
57
+ """Create an instance of GetArtifactTagsResponseDto from a dict"""
58
+ if obj is None:
59
+ return None
60
+
61
+ if not isinstance(obj, dict):
62
+ return GetArtifactTagsResponseDto.parse_obj(obj)
63
+
64
+ _obj = GetArtifactTagsResponseDto.parse_obj({"tags": obj.get("tags")})
65
+ return _obj
@@ -28,6 +28,7 @@ from truefoundry.pydantic_v1 import (
28
28
  Field,
29
29
  StrictStr,
30
30
  conint,
31
+ conlist,
31
32
  constr,
32
33
  validator,
33
34
  )
@@ -46,6 +47,10 @@ class ModelVersionManifest(BaseModel):
46
47
  default=...,
47
48
  description="+label=Metadata +docs=Metadata for the artifact or model version +usage=Metadata for the artifact or model version +uiType=JsonInput",
48
49
  )
50
+ tags: Optional[conlist(constr(strict=True, max_length=128))] = Field(
51
+ default=None,
52
+ description="+label=Tags +usage=Tags for the artifact or model version +docs=Tags for the artifact or model version",
53
+ )
49
54
  type: Optional[StrictStr] = "model-version"
50
55
  source: Source1 = Field(...)
51
56
  framework: Optional[Framework] = None
@@ -56,6 +61,7 @@ class ModelVersionManifest(BaseModel):
56
61
  __properties = [
57
62
  "description",
58
63
  "metadata",
64
+ "tags",
59
65
  "type",
60
66
  "source",
61
67
  "framework",
@@ -119,6 +125,7 @@ class ModelVersionManifest(BaseModel):
119
125
  {
120
126
  "description": obj.get("description"),
121
127
  "metadata": obj.get("metadata"),
128
+ "tags": obj.get("tags"),
122
129
  "type": obj.get("type")
123
130
  if obj.get("type") is not None
124
131
  else "model-version",
@@ -121,6 +121,7 @@ Class | Method | HTTP request | Description
121
121
  *MlfoundryArtifactsApi* | [**get_signed_urls_for_dataset_write_post**](truefoundry/ml/autogen/client/docs/MlfoundryArtifactsApi.md#get_signed_urls_for_dataset_write_post) | **POST** /api/2.0/mlflow/mlfoundry-artifacts/datasets/get-signed-urls-for-write | Get Signed Urls For Dataset Write
122
122
  *MlfoundryArtifactsApi* | [**get_signed_urls_for_read_post**](truefoundry/ml/autogen/client/docs/MlfoundryArtifactsApi.md#get_signed_urls_for_read_post) | **POST** /api/2.0/mlflow/mlfoundry-artifacts/artifact-versions/get-signed-urls-for-read | Get Signed Urls For Read
123
123
  *MlfoundryArtifactsApi* | [**get_signed_urls_for_write_post**](truefoundry/ml/autogen/client/docs/MlfoundryArtifactsApi.md#get_signed_urls_for_write_post) | **POST** /api/2.0/mlflow/mlfoundry-artifacts/artifact-versions/get-signed-urls-for-write | Get Signed Urls For Write
124
+ *MlfoundryArtifactsApi* | [**get_tags_for_artifact_get**](truefoundry/ml/autogen/client/docs/MlfoundryArtifactsApi.md#get_tags_for_artifact_get) | **GET** /api/2.0/mlflow/mlfoundry-artifacts/artifacts/get-tags | Get Tags For Artifact
124
125
  *MlfoundryArtifactsApi* | [**list_artifact_versions_post**](truefoundry/ml/autogen/client/docs/MlfoundryArtifactsApi.md#list_artifact_versions_post) | **POST** /api/2.0/mlflow/mlfoundry-artifacts/artifact-versions/list | List Artifact Versions
125
126
  *MlfoundryArtifactsApi* | [**list_artifacts_post**](truefoundry/ml/autogen/client/docs/MlfoundryArtifactsApi.md#list_artifacts_post) | **POST** /api/2.0/mlflow/mlfoundry-artifacts/artifacts/list | List Artifacts
126
127
  *MlfoundryArtifactsApi* | [**list_datasets_post**](truefoundry/ml/autogen/client/docs/MlfoundryArtifactsApi.md#list_datasets_post) | **POST** /api/2.0/mlflow/mlfoundry-artifacts/datasets/list | List Datasets
@@ -219,6 +220,7 @@ Class | Method | HTTP request | Description
219
220
  - [FileInfoDto](truefoundry/ml/autogen/client/docs/FileInfoDto.md)
220
221
  - [FinalizeArtifactVersionRequestDto](truefoundry/ml/autogen/client/docs/FinalizeArtifactVersionRequestDto.md)
221
222
  - [Framework](truefoundry/ml/autogen/client/docs/Framework.md)
223
+ - [GetArtifactTagsResponseDto](truefoundry/ml/autogen/client/docs/GetArtifactTagsResponseDto.md)
222
224
  - [GetExperimentResponseDto](truefoundry/ml/autogen/client/docs/GetExperimentResponseDto.md)
223
225
  - [GetLatestRunLogResponseDto](truefoundry/ml/autogen/client/docs/GetLatestRunLogResponseDto.md)
224
226
  - [GetMetricHistoryResponse](truefoundry/ml/autogen/client/docs/GetMetricHistoryResponse.md)
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: artifacts.json
3
- # timestamp: 2024-12-09T09:04:12+00:00
3
+ # timestamp: 2024-12-16T06:57:32+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -58,6 +58,17 @@ class BaseArtifactVersion(BaseModel):
58
58
  ...,
59
59
  description="+label=Metadata\n+docs=Metadata for the artifact or model version\n+usage=Metadata for the artifact or model version\n+uiType=JsonInput",
60
60
  )
61
+ tags: Optional[
62
+ List[
63
+ constr(
64
+ regex=r"^(?!^\d+$)(?!.*[._-]{2,})[a-zA-Z0-9]+([._-][a-zA-Z0-9]+)*$",
65
+ max_length=128,
66
+ )
67
+ ]
68
+ ] = Field(
69
+ None,
70
+ description="+label=Tags\n+usage=Tags for the artifact or model version\n+docs=Tags for the artifact or model version",
71
+ )
61
72
 
62
73
 
63
74
  class MimeType(str, Enum):
@@ -5,11 +5,10 @@ import os
5
5
  import tempfile
6
6
  import typing
7
7
  import uuid
8
+ import warnings
8
9
  from pathlib import Path
9
10
  from typing import TYPE_CHECKING, Any, Dict, List, NamedTuple, Optional, Union
10
11
 
11
- from pydantic import StrictStr
12
-
13
12
  from truefoundry.ml.artifact.truefoundry_artifact_repo import (
14
13
  ArtifactIdentifier,
15
14
  MlFoundryArtifactsRepository,
@@ -43,7 +42,7 @@ from truefoundry.ml.log_types.artifacts.utils import (
43
42
  )
44
43
  from truefoundry.ml.logger import logger
45
44
  from truefoundry.ml.session import _get_api_client
46
- from truefoundry.pydantic_v1 import BaseModel, Extra
45
+ from truefoundry.pydantic_v1 import BaseModel, Extra, StrictStr
47
46
 
48
47
  if TYPE_CHECKING:
49
48
  from truefoundry.ml.mlfoundry_run import MlFoundryRun
@@ -84,6 +83,7 @@ class ArtifactVersion:
84
83
  self._deleted = False
85
84
  self._description: str = ""
86
85
  self._metadata: Dict[str, Any] = {}
86
+ self._tags: List[str] = []
87
87
  self._set_mutable_attrs()
88
88
 
89
89
  @classmethod
@@ -131,9 +131,13 @@ class ArtifactVersion:
131
131
  manifest = self._artifact_version.manifest.actual_instance
132
132
  self._description = manifest.description or ""
133
133
  self._metadata = copy.deepcopy(manifest.metadata)
134
+ self._tags = copy.deepcopy(manifest.tags or [])
134
135
  else:
135
136
  self._description = self._artifact_version.description or ""
136
- self._metadata = copy.deepcopy(self._artifact_version.artifact_metadata)
137
+ self._metadata = copy.deepcopy(
138
+ self._artifact_version.artifact_metadata or {}
139
+ )
140
+ self._tags = []
137
141
 
138
142
  def _refetch_artifact_version(self, reset_mutable_attrs: bool = True):
139
143
  _artifact_version = (
@@ -205,6 +209,33 @@ class ArtifactVersion:
205
209
  _validate_artifact_metadata(value)
206
210
  self._metadata = copy.deepcopy(value)
207
211
 
212
+ @property
213
+ def tags(self) -> List[str]:
214
+ """
215
+ Get tags for the current model version
216
+ """
217
+ if not self._artifact_version.manifest:
218
+ warnings.warn(
219
+ message="This model version was created using an older serialization format. tags do not exist, returning empty list",
220
+ category=DeprecationWarning,
221
+ stacklevel=2,
222
+ )
223
+ return self._tags
224
+
225
+ @tags.setter
226
+ def tags(self, value: List[str]):
227
+ """
228
+ Set the tags for current model version
229
+ """
230
+ if not self._artifact_version.manifest:
231
+ warnings.warn(
232
+ message="This model version was created using an older serialization format. Tags will not be updated",
233
+ category=DeprecationWarning,
234
+ stacklevel=2,
235
+ )
236
+ return
237
+ self._tags = copy.deepcopy(value)
238
+
208
239
  @property
209
240
  def created_at(self) -> Optional[datetime.datetime]:
210
241
  """Get the time at which artifact was created"""
@@ -367,6 +398,7 @@ class ArtifactVersion:
367
398
  assert isinstance(manifest, ArtifactVersionManifest)
368
399
  manifest.description = self.description
369
400
  manifest.metadata = self.metadata
401
+ manifest.tags = self.tags
370
402
  else:
371
403
  manifest = None
372
404
  try:
@@ -8,7 +8,7 @@ import typing
8
8
  import uuid
9
9
  import warnings
10
10
  from pathlib import Path
11
- from typing import TYPE_CHECKING, Any, Dict, Optional, Union
11
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
12
12
 
13
13
  from truefoundry.ml.artifact.truefoundry_artifact_repo import (
14
14
  ArtifactIdentifier,
@@ -52,7 +52,7 @@ from truefoundry.ml.model_framework import (
52
52
  auto_update_model_framework_details,
53
53
  )
54
54
  from truefoundry.ml.session import _get_api_client
55
- from truefoundry.pydantic_v1 import BaseModel, Extra
55
+ from truefoundry.pydantic_v1 import BaseModel, Extra, parse_obj_as
56
56
 
57
57
  if TYPE_CHECKING:
58
58
  import numpy as np
@@ -108,6 +108,7 @@ class ModelVersion:
108
108
  self._metadata: Dict[str, Any] = {}
109
109
  self._environment: Optional[ModelVersionEnvironment] = None
110
110
  self._framework: Optional[ModelFrameworkType] = None
111
+ self._tags: List[str] = []
111
112
  self._set_mutable_attrs()
112
113
 
113
114
  @classmethod
@@ -147,21 +148,26 @@ class ModelVersion:
147
148
 
148
149
  def _set_mutable_attrs(self):
149
150
  if self._model_version.manifest:
150
- self._description = self._model_version.manifest.description or ""
151
- self._metadata = copy.deepcopy(self._model_version.manifest.metadata)
152
- self._environment = copy.deepcopy(self._model_version.manifest.environment)
151
+ manifest = self._model_version.manifest
152
+ self._description = manifest.description or ""
153
+ self._metadata = copy.deepcopy(manifest.metadata)
154
+ self._environment = copy.deepcopy(manifest.environment)
153
155
  self._framework = (
154
- copy.deepcopy(self._model_version.manifest.framework.actual_instance)
155
- if self._model_version.manifest.framework
156
+ parse_obj_as(
157
+ ModelFrameworkType, manifest.framework.actual_instance.to_dict()
158
+ )
159
+ if manifest.framework
156
160
  else None
157
161
  )
162
+ self._tags = copy.deepcopy(self._model_version.manifest.tags) or []
158
163
  else:
159
164
  self._description = self._model_version.description or ""
160
- self._metadata = copy.deepcopy(self._model_version.artifact_metadata)
165
+ self._metadata = copy.deepcopy(self._model_version.artifact_metadata or {})
161
166
  self._environment = None
162
167
  self._framework = _ModelFramework.to_model_framework_type(
163
168
  self._model_version.model_framework
164
169
  )
170
+ self._tags = []
165
171
 
166
172
  def _refetch_model_version(self, reset_mutable_attrs: bool = True):
167
173
  _model_version = self._mlfoundry_artifacts_api.get_model_version_get(
@@ -231,13 +237,46 @@ class ModelVersion:
231
237
  _validate_artifact_metadata(value)
232
238
  self._metadata = copy.deepcopy(value)
233
239
 
240
+ @property
241
+ def tags(self) -> List[str]:
242
+ """
243
+ Get tags for the current artifact version
244
+ """
245
+ if not self._model_version.manifest:
246
+ warnings.warn(
247
+ message="This model version was created using an older serialization format. tags do not exist, returning empty list",
248
+ category=DeprecationWarning,
249
+ stacklevel=2,
250
+ )
251
+ return self._tags
252
+
253
+ @tags.setter
254
+ def tags(self, value: List[str]):
255
+ """
256
+ Set the tags for current artifact version
257
+ """
258
+ if not self._model_version.manifest:
259
+ warnings.warn(
260
+ message="This model version was created using an older serialization format. Tags will not be updated",
261
+ category=DeprecationWarning,
262
+ stacklevel=2,
263
+ )
264
+ return
265
+ self._tags = copy.deepcopy(value)
266
+
234
267
  @property
235
268
  def environment(self) -> Optional[ModelVersionEnvironment]:
236
269
  """Get the environment details for the model"""
270
+ if not self._model_version.manifest:
271
+ warnings.warn(
272
+ message="This model version was created using an older serialization format. environment does not exist, returning None",
273
+ category=DeprecationWarning,
274
+ stacklevel=2,
275
+ )
237
276
  return self._environment
238
277
 
239
278
  @environment.setter
240
- def environment(self, value: Optional[Dict[str, Any]]):
279
+ def environment(self, value: Optional[ModelVersionEnvironment]):
241
280
  """set the environment details for the model"""
242
281
  if not self._model_version.manifest:
243
282
  warnings.warn(
@@ -449,6 +488,7 @@ class ModelVersion:
449
488
  self._model_version.manifest.framework = (
450
489
  Framework.from_dict(self.framework.dict()) if self.framework else None
451
490
  )
491
+ self._model_version.manifest.tags = self.tags
452
492
  try:
453
493
  _model_version = self._mlfoundry_artifacts_api.update_model_version_post(
454
494
  update_model_version_request_dto=UpdateModelVersionRequestDto(
@@ -20,7 +20,8 @@ from truefoundry.common.utils import (
20
20
  get_python_version_major_minor,
21
21
  list_pip_packages_installed,
22
22
  )
23
- from truefoundry.ml.autogen.client import (
23
+ from truefoundry.ml.autogen.client import ( # type: ignore[attr-defined]
24
+ ModelVersionEnvironment,
24
25
  SklearnSerializationFormat,
25
26
  XGBoostSerializationFormat,
26
27
  )
@@ -344,7 +345,7 @@ def _fetch_framework_specific_pip_packages(
344
345
 
345
346
 
346
347
  def auto_update_environment_details(
347
- environment: autogen_artifacts.ModelVersionEnvironment,
348
+ environment: ModelVersionEnvironment,
348
349
  framework: Optional[ModelFrameworkType],
349
350
  ):
350
351
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: truefoundry
3
- Version: 0.5.3rc1
3
+ Version: 0.5.3rc3
4
4
  Summary: Truefoundry CLI
5
5
  Author: Abhishek Choudhary
6
6
  Author-email: abhishek@truefoundry.com
@@ -1,30 +1,31 @@
1
1
  truefoundry/__init__.py,sha256=jynqfY0pDmcaXlxewDnMQC5CYAIW9JFjptBrw7y76rY,81
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
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
8
  truefoundry/autodeploy/cli.py,sha256=1VnDAP9ylM6l00v0Ko5KL6_Dr7bL_voeAPdbEvWvU3Y,14215
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
26
26
  truefoundry/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- truefoundry/cli/__main__.py,sha256=0nEwE0UkFagCO5ctGcqEThdmBT2fN8MVcr0ERItnsNQ,3483
27
+ truefoundry/cli/__main__.py,sha256=mYgMZRvI3sBP3_6DA0WwtFUZQTV3r8gJpMFvMJb-OOE,3692
28
+ truefoundry/cli/commands/pat.py,sha256=0rm95ny1b3KfeBJSRWh1M4lR46ERnp96ovUZKu-P5Ss,602
28
29
  truefoundry/cli/config.py,sha256=tf8w4UfVzcC6eYkENvuuCPYt_V3sqVpO1bclORV9tAk,206
29
30
  truefoundry/cli/console.py,sha256=9-dMy4YPisCJQziRKTg8Qa0UJnOGl1soiUnJjsnLDvE,242
30
31
  truefoundry/cli/const.py,sha256=dVHPo1uAiDSSMXwXoT2mR5kNQjExT98QNVRz98Hz_Ts,510
@@ -80,7 +81,7 @@ truefoundry/deploy/io/rich_output_callback.py,sha256=TJLiRD-EnFVwgcepxR7WN0koKqW
80
81
  truefoundry/deploy/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
82
  truefoundry/deploy/lib/auth/servicefoundry_session.py,sha256=5TCYPunAygtn5mb0mp_VcWKEalKMKPbyWMWer-Vty2g,1916
82
83
  truefoundry/deploy/lib/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=yhHsHo9T0mTbum7X2sOuNVf-am1AdtzyK0KBQkdC0io,26212
84
+ truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=zx9c-TjQRzMDKGCa-wDvXEX_8FcWH1QlVif2SjxgLxs,27136
84
85
  truefoundry/deploy/lib/const.py,sha256=Wg0GDnfFu-g1fJr4lU80NH2ULw0R0dYjV7LnW-PbOeM,173
85
86
  truefoundry/deploy/lib/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
87
  truefoundry/deploy/lib/dao/application.py,sha256=xUqF34abde71YZo9gkR-WvVJi1C6nBeGBNw4kL5FdIo,9226
@@ -103,12 +104,16 @@ truefoundry/deploy/v2/lib/deployable_patched_models.py,sha256=MROgMxhn9hDEAKwJSW
103
104
  truefoundry/deploy/v2/lib/models.py,sha256=pSolLMTArDuYpeNsmeeS5DWliloN_iCDfZSpRllMHUg,1120
104
105
  truefoundry/deploy/v2/lib/patched_models.py,sha256=NTU8J_CwdvEuF9zNXwFyN3suOp_196Wrm75DDy5qcXE,14184
105
106
  truefoundry/deploy/v2/lib/source.py,sha256=VHKuFREiixUP40D3Mrz-TA70spu1M0RbCzl--qwlFaY,9263
107
+ truefoundry/gateway/__init__.py,sha256=HvAMuk60-fuZcMmdOtozHrUaH_JcbEHxpMSlS9ci4ls,41
108
+ truefoundry/gateway/cli/cli.py,sha256=9raS6Nq_CNzagEPpbKICwUZ01zMoqmZINKMB9m_gJRE,908
109
+ truefoundry/gateway/lib/entities.py,sha256=1P9YjrMoHbg58M57Pq-HlsT1ISHRyyX4JxK-o4of6cY,695
110
+ truefoundry/gateway/lib/models.py,sha256=TXOur51tuYkq4Xil-icNVaVH-7xZbdOUyqS8N9295dg,876
106
111
  truefoundry/logger.py,sha256=u-YCNjg5HBwE70uQcpjIG64Ghos-K2ulTWaxC03BSj4,714
107
112
  truefoundry/ml/__init__.py,sha256=ssUEIs8BixPWxynKoeSh-dkRl6AtLXG0PBGYnUR5Az8,2217
108
113
  truefoundry/ml/artifact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
114
  truefoundry/ml/artifact/truefoundry_artifact_repo.py,sha256=FksxhUpRHb9pgWZmAB16DhXqkAL6UIAPA1S3RJUApQU,46201
110
115
  truefoundry/ml/autogen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
- truefoundry/ml/autogen/client/__init__.py,sha256=Da3NzHW9aCi9zjQZteTm1aPTuyHDVqrFDtzwsdqIPbc,19981
116
+ truefoundry/ml/autogen/client/__init__.py,sha256=42Y8v6C1oDlngKCaDODi9k3q-9MPMiqO8jGe39y5QJM,20097
112
117
  truefoundry/ml/autogen/client/api/__init__.py,sha256=NyMBxBmIzB1o5LzZZwz9LiydHB3-hPqc_sevsnY6Jrw,746
113
118
  truefoundry/ml/autogen/client/api/auth_api.py,sha256=zpWzJhUmW6HHMY_atlUf0B25k77E1kue2hmix5I5Ih0,7017
114
119
  truefoundry/ml/autogen/client/api/deprecated_api.py,sha256=mu5x_skNcwz8v1Tr6VP72-tVP7pmBV9muyKy_2NH3F0,38824
@@ -116,14 +121,14 @@ truefoundry/ml/autogen/client/api/experiments_api.py,sha256=mRKS8qGzcFJUpTWjfQoF
116
121
  truefoundry/ml/autogen/client/api/generate_code_snippet_api.py,sha256=C8iABP-pYIyIoTlL8PFi3ZBG_6B_dkQf09eErNeoj7A,22316
117
122
  truefoundry/ml/autogen/client/api/health_api.py,sha256=IAPhRAo9CLUT5ipVR1fCf-qDx57UR0wg5ekhtUl8lug,11554
118
123
  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
124
+ truefoundry/ml/autogen/client/api/mlfoundry_artifacts_api.py,sha256=Ze2mSkXH1IxUB6Zs3C8ISYwzpKfPXgGvdKgjmEa-XRA,319720
120
125
  truefoundry/ml/autogen/client/api/run_artifacts_api.py,sha256=x-vVnY2LEFChZxiiFauswRWwFz6Qqh30PKXjzuTvxmc,8799
121
126
  truefoundry/ml/autogen/client/api/runs_api.py,sha256=-aghrZ2VYuZOw_vBtOzWDsnK7Ji29oZQxK2CLRgyo2w,119232
122
127
  truefoundry/ml/autogen/client/api_client.py,sha256=M31IycWorn10FYS8WbO_Whaipr0tVu2pVWFCfbS7XCo,29167
123
128
  truefoundry/ml/autogen/client/api_response.py,sha256=KRyvecPMXF05PaxILHZ8JHoP4rgKBjKONMgG83aU-rM,844
124
129
  truefoundry/ml/autogen/client/configuration.py,sha256=V1oaEnxt-NfpaNmp-EZpf2glovzVhM2coWYt8HBNB4M,15723
125
130
  truefoundry/ml/autogen/client/exceptions.py,sha256=XbCbDHhYT3BVejdoGNPgEa4oS56ypkwFdxk1iOc_tFY,5355
126
- truefoundry/ml/autogen/client/models/__init__.py,sha256=4mkEcTiiMIGu16f2idqmFFaeT3T7E1qDIorrhhXReEk,18603
131
+ truefoundry/ml/autogen/client/models/__init__.py,sha256=ZtmxIyFDWPGywDB8p-VZO73Cl_WkGcl4fVzEB9UHsTc,18719
127
132
  truefoundry/ml/autogen/client/models/add_custom_metrics_to_model_version_request_dto.py,sha256=_ISDspicTGjBCYYXubKfRYYSSQVyW3AvG-jFh47-Zfc,2163
128
133
  truefoundry/ml/autogen/client/models/add_features_to_model_version_request_dto.py,sha256=OT1-98DyWNfAHz_EgD2gMX2XkrGQ4Re945fhoAl8qSE,2099
129
134
  truefoundry/ml/autogen/client/models/agent.py,sha256=lUAbs092yo9hZmqzX6atKebDNf1uEwTf5jLvjOdvoeM,3872
@@ -135,7 +140,7 @@ truefoundry/ml/autogen/client/models/artifact_dto.py,sha256=JWL8_sITJJXbxywcfRj4
135
140
  truefoundry/ml/autogen/client/models/artifact_response_dto.py,sha256=T_HLjkHnqiO1bnSXiCUOlwDEHGz89mlUNhBq0SJTapo,2226
136
141
  truefoundry/ml/autogen/client/models/artifact_type.py,sha256=LBXGYUoesmL5J-0xzCR8jBST3bjb6HY86RmqSGvytRs,828
137
142
  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
143
+ truefoundry/ml/autogen/client/models/artifact_version_manifest.py,sha256=lzoIGTRplPIcXlO5Brq6DoCn1HCnzmxJmd9dPvZ3Nq4,3907
139
144
  truefoundry/ml/autogen/client/models/artifact_version_response_dto.py,sha256=JmiSYdPYG-ki6LCBeF7NtihdQ2LPiHld8cSPivY2GmQ,2421
140
145
  truefoundry/ml/autogen/client/models/artifact_version_serialization_format.py,sha256=2Qfgq1nykn0_mKNEJzOxhQwHm_95WIr9wJcHLeFWXQM,774
141
146
  truefoundry/ml/autogen/client/models/artifact_version_status.py,sha256=iIcomqhuaJkZH2rT3e6IjQutM79t9hEshW-RCIMKHEY,780
@@ -186,6 +191,7 @@ truefoundry/ml/autogen/client/models/fast_ai_framework.py,sha256=GwVoMbIzYhr4srF
186
191
  truefoundry/ml/autogen/client/models/file_info_dto.py,sha256=7oc8venicsFVk8zT9wHNhHnZGtFkFlqimFnS7ozGL9k,2156
187
192
  truefoundry/ml/autogen/client/models/finalize_artifact_version_request_dto.py,sha256=tkPcNjI0_qhX-D3m6AXqLzdmo9_K0tFBtbPDeg0Zo7U,3818
188
193
  truefoundry/ml/autogen/client/models/framework.py,sha256=W_KrqH1qKRvlrssCCWFIlmPaeAw0eiM6VqS3pbdlMXU,14720
194
+ truefoundry/ml/autogen/client/models/get_artifact_tags_response_dto.py,sha256=zS5eBxBqzm-f5dt4GspLJvVmq_RWTtZmZTXFV8rqbX0,1883
189
195
  truefoundry/ml/autogen/client/models/get_experiment_response_dto.py,sha256=FhJpoUeRbZV1s1KR3Y07Kv6U4enLbbgdpGbguT9us0A,2923
190
196
  truefoundry/ml/autogen/client/models/get_latest_run_log_response_dto.py,sha256=g5NG252VzjGHiA-w5nhxmZxGrowJO9XCHDQTjf8y2KE,2266
191
197
  truefoundry/ml/autogen/client/models/get_metric_history_response.py,sha256=rTchO8o4sjGsNaZj8TW-VGtGGxsOBjUGzgaAWNtBZ-k,2428
@@ -244,7 +250,7 @@ truefoundry/ml/autogen/client/models/model_response_dto.py,sha256=osrTxfygkuhxWj
244
250
  truefoundry/ml/autogen/client/models/model_server.py,sha256=N5mcWmnX0KzTMtTH8A9h_FmiQcMld3B8CXD_UYeDKaA,700
245
251
  truefoundry/ml/autogen/client/models/model_version_dto.py,sha256=9Mh4d8V33gEGYr4sys5lYYDA3bHKajR3oAZLZMAy_io,7094
246
252
  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
253
+ truefoundry/ml/autogen/client/models/model_version_manifest.py,sha256=pZysfaTZmew4MxhtH4MTnwCQWRt43JvqU3ii5gBgm9w,4955
248
254
  truefoundry/ml/autogen/client/models/model_version_response_dto.py,sha256=D6XOCyggxqTkbePuypqYSHYh1PYeDv7R_J32q61sDM0,2320
249
255
  truefoundry/ml/autogen/client/models/multi_part_upload_dto.py,sha256=Ckq405vud8RQmMyKCJQJBlW5iXO7Y2mlgo8eVkiMvxg,3738
250
256
  truefoundry/ml/autogen/client/models/multi_part_upload_response_dto.py,sha256=VjH0kvl7rMjgDHjYGHnsh7KsZ5-qn-k3ksdGLJ49nIM,2431
@@ -305,8 +311,8 @@ truefoundry/ml/autogen/client/models/xg_boost_framework.py,sha256=a0EHzncxe_hSFU
305
311
  truefoundry/ml/autogen/client/models/xg_boost_model_schema.py,sha256=QKJkiERNqF8UiolX2FjvhkUkUlUgDoo3CpTYPAdCxV8,2735
306
312
  truefoundry/ml/autogen/client/models/xg_boost_serialization_format.py,sha256=wFFSH0Z9MP8eT_fysHfUu4iqdjEZART-HxTH4e4gNI8,872
307
313
  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
314
+ truefoundry/ml/autogen/client_README.md,sha256=Dr3x2Lm10JIWsLlRBZuDsE4Y4T1XzIpsychLjZfr89Q,37262
315
+ truefoundry/ml/autogen/entities/artifacts.py,sha256=COkzHpmqzXpEttH2UstIO8p7WN3zz_tyAG63r66i-9w,20652
310
316
  truefoundry/ml/autogen/models/__init__.py,sha256=--TGRea9SQBWFfwtcl3ekb1XGfFTdEkQGSG8a2SJ60I,187
311
317
  truefoundry/ml/autogen/models/exceptions.py,sha256=q3n7FGBrg_hUy1UyoefhMnhcXUAaqXlLIGHoOVzn_d8,1390
312
318
  truefoundry/ml/autogen/models/schema.py,sha256=IhpO9qbygLqEamP3NIt3m90SseJXCOm1ZTqNbNbW-M0,55772
@@ -329,11 +335,11 @@ truefoundry/ml/exceptions.py,sha256=8aJm2NYtAWWsRLu4MbzaoOqHsQZ6RjOFwBWQWqb6qrc,
329
335
  truefoundry/ml/git_info.py,sha256=jvAVm9ilqivnGq8qJdUvYdd8Siv0PLtqurB-PXsS5ho,2023
330
336
  truefoundry/ml/internal_namespace.py,sha256=QcqMHp6-C2im2H_02hlhi01EIcr1HhNaZprszs13EMU,1790
331
337
  truefoundry/ml/log_types/__init__.py,sha256=g4u4D4Jaj0aBK5GtrLV88-qThKZR9pSZ17vFEkN-LmM,125
332
- truefoundry/ml/log_types/artifacts/artifact.py,sha256=6X4lO23DwM7yTgUOY4RRoYMrf9m2AbiBBo2WftS2-dc,20457
338
+ truefoundry/ml/log_types/artifacts/artifact.py,sha256=VC0KbcHty1fblybUvGVcfDGFcINfLgT2LByyvPcS1Ro,21565
333
339
  truefoundry/ml/log_types/artifacts/constants.py,sha256=qKxQ5mMvJE4j83BvGW3qNTKunxCiBg_EEjTdgbgJtyE,1036
334
340
  truefoundry/ml/log_types/artifacts/dataset.py,sha256=a4dxd2EN8p7Ci-cLGGiDOboN3t0395_XhWE1dmTw1Q4,13112
335
341
  truefoundry/ml/log_types/artifacts/general_artifact.py,sha256=B4XErLr-m6RmQWtxMTu3wlFRFcqSwPYp6J0OL4Ng6L0,3179
336
- truefoundry/ml/log_types/artifacts/model.py,sha256=sOqMptIpr2YRv7VC6AntFDvDUg5eQLsS7jQ_4TUB5Ds,22724
342
+ truefoundry/ml/log_types/artifacts/model.py,sha256=p9cB3_0MSZkVyq8G2pyNWl1F3qICTazQlq6VCSzOV3s,24194
337
343
  truefoundry/ml/log_types/artifacts/utils.py,sha256=8mmahc1b6wvrA_E795h9ynRfhYRIdci7LRGN8U6ySm8,7516
338
344
  truefoundry/ml/log_types/image/__init__.py,sha256=fcOq8yQnNj1rkLcPeIjLXBpdA1WIeiPsXOlAAvMxx7M,76
339
345
  truefoundry/ml/log_types/image/constants.py,sha256=wLtGEOA4T5fZHSlOXPuNDLX3lpbCtwlvGKPFk_1fah0,255
@@ -346,7 +352,7 @@ truefoundry/ml/log_types/utils.py,sha256=xjJ21jdPScvFmw3TbVh5NCzbzJwaqiXJyiiT4xx
346
352
  truefoundry/ml/logger.py,sha256=VT-BF3BnBYTWVq87O58F0c8uXMu94gYzsiFlGY3_7Ao,458
347
353
  truefoundry/ml/mlfoundry_api.py,sha256=avuGgjbRnQXk774Vd3Dx7n99bbrOkL9pob9DI-vNvWE,62368
348
354
  truefoundry/ml/mlfoundry_run.py,sha256=scHjdjojRGbE4ZZlByZTFrcBTamRbm_JGidaSX9Gi9o,44601
349
- truefoundry/ml/model_framework.py,sha256=xHmVFI3Xcd6z6BH9TyZY8kFiw3Fp70423_M_wTYxd5Y,18841
355
+ truefoundry/ml/model_framework.py,sha256=GAGu6bW8L4f8uvukOITB0bJOm1BSWzxC1MJxUGmpOqQ,18882
350
356
  truefoundry/ml/run_utils.py,sha256=0W208wSLUrbdfk2pjNcZlkUi9bNxG2JORqoe-5rVqHI,2423
351
357
  truefoundry/ml/session.py,sha256=F83GTC5WwGBjnJ69Ct8MqMnlutYc56JCc6YhEY1Wl-A,5394
352
358
  truefoundry/ml/validation_utils.py,sha256=J5atNhcJLvKj64ralSV9Y5Fv1Rt4SE237ICdP9-7sP4,12149
@@ -367,7 +373,7 @@ truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=5mBCIc-ON
367
373
  truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=Hf6Dk6Fu6P7DqsK5ULgraf9DStjgigf-kjaRAMBW-RU,8680
368
374
  truefoundry/workflow/task.py,sha256=ToitYiKcNzFCtOVQwz1W8sRjbR97eVS7vQBdbgUQtKg,1779
369
375
  truefoundry/workflow/workflow.py,sha256=WaTqUjhwfAXDWu4E5ehuwAxrCbDJkoAf1oWmR2E9Qy0,4575
370
- truefoundry-0.5.3rc1.dist-info/METADATA,sha256=Sqr8OAIAxQccpWW5gHpOqhDxf4MWaIjlstHnzaC8GEw,2887
371
- truefoundry-0.5.3rc1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
372
- truefoundry-0.5.3rc1.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
373
- truefoundry-0.5.3rc1.dist-info/RECORD,,
376
+ truefoundry-0.5.3rc3.dist-info/METADATA,sha256=zuoxLW-MzlfmWPLCP8J2NF8eydbOKPu_LNhKouhQi_0,2887
377
+ truefoundry-0.5.3rc3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
378
+ truefoundry-0.5.3rc3.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
379
+ truefoundry-0.5.3rc3.dist-info/RECORD,,