clarifai 11.5.1__py3-none-any.whl → 11.5.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- clarifai/__init__.py +1 -1
- clarifai/cli/model.py +42 -1
- clarifai/cli/pipeline.py +137 -0
- clarifai/cli/pipeline_step.py +104 -0
- clarifai/cli/templates/__init__.py +1 -0
- clarifai/cli/templates/pipeline_step_templates.py +64 -0
- clarifai/cli/templates/pipeline_templates.py +150 -0
- clarifai/client/auth/helper.py +46 -21
- clarifai/client/auth/register.py +5 -0
- clarifai/client/auth/stub.py +116 -12
- clarifai/client/base.py +9 -0
- clarifai/client/model.py +111 -7
- clarifai/client/model_client.py +355 -6
- clarifai/client/user.py +81 -0
- clarifai/runners/models/model_builder.py +52 -9
- clarifai/runners/pipeline_steps/__init__.py +0 -0
- clarifai/runners/pipeline_steps/pipeline_step_builder.py +510 -0
- clarifai/runners/pipelines/__init__.py +0 -0
- clarifai/runners/pipelines/pipeline_builder.py +313 -0
- clarifai/runners/utils/code_script.py +40 -7
- clarifai/runners/utils/const.py +2 -2
- clarifai/runners/utils/model_utils.py +135 -0
- clarifai/runners/utils/pipeline_validation.py +153 -0
- {clarifai-11.5.1.dist-info → clarifai-11.5.3.dist-info}/METADATA +1 -1
- {clarifai-11.5.1.dist-info → clarifai-11.5.3.dist-info}/RECORD +30 -19
- /clarifai/cli/{model_templates.py → templates/model_templates.py} +0 -0
- {clarifai-11.5.1.dist-info → clarifai-11.5.3.dist-info}/WHEEL +0 -0
- {clarifai-11.5.1.dist-info → clarifai-11.5.3.dist-info}/entry_points.txt +0 -0
- {clarifai-11.5.1.dist-info → clarifai-11.5.3.dist-info}/licenses/LICENSE +0 -0
- {clarifai-11.5.1.dist-info → clarifai-11.5.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,153 @@
|
|
1
|
+
"""Pipeline configuration validation utilities."""
|
2
|
+
|
3
|
+
import re
|
4
|
+
from typing import Any, Dict, List
|
5
|
+
|
6
|
+
import yaml
|
7
|
+
|
8
|
+
|
9
|
+
class PipelineConfigValidator:
|
10
|
+
"""Validator for pipeline configuration files."""
|
11
|
+
|
12
|
+
# Regex patterns for templateRef validation
|
13
|
+
TEMPLATE_REF_WITH_VERSION_PATTERN = re.compile(
|
14
|
+
r'^users/([^/]+)/apps/([^/]+)/pipeline-steps/([^/]+)/versions/([^/]+)$'
|
15
|
+
)
|
16
|
+
TEMPLATE_REF_WITHOUT_VERSION_PATTERN = re.compile(
|
17
|
+
r'^users/([^/]+)/apps/([^/]+)/pipeline-steps/([^/]+)$'
|
18
|
+
)
|
19
|
+
|
20
|
+
@classmethod
|
21
|
+
def validate_config(cls, config: Dict[str, Any]) -> None:
|
22
|
+
"""Validate the pipeline configuration."""
|
23
|
+
cls._validate_pipeline_section(config)
|
24
|
+
cls._validate_orchestration_spec(config)
|
25
|
+
|
26
|
+
@classmethod
|
27
|
+
def _validate_pipeline_section(cls, config: Dict[str, Any]) -> None:
|
28
|
+
"""Validate the pipeline section of the config."""
|
29
|
+
if "pipeline" not in config:
|
30
|
+
raise ValueError("'pipeline' section not found in config.yaml")
|
31
|
+
|
32
|
+
pipeline = config["pipeline"]
|
33
|
+
required_fields = ["id", "user_id", "app_id"]
|
34
|
+
|
35
|
+
for field in required_fields:
|
36
|
+
if field not in pipeline:
|
37
|
+
raise ValueError(f"'{field}' not found in pipeline section of config.yaml")
|
38
|
+
if not pipeline[field]:
|
39
|
+
raise ValueError(f"'{field}' cannot be empty in config.yaml")
|
40
|
+
|
41
|
+
# Validate step_directories if present
|
42
|
+
if "step_directories" in pipeline:
|
43
|
+
if not isinstance(pipeline["step_directories"], list):
|
44
|
+
raise ValueError("'step_directories' must be a list")
|
45
|
+
|
46
|
+
# Validate orchestration_spec is present
|
47
|
+
if "orchestration_spec" not in pipeline:
|
48
|
+
raise ValueError("'orchestration_spec' not found in pipeline section")
|
49
|
+
|
50
|
+
@classmethod
|
51
|
+
def _validate_orchestration_spec(cls, config: Dict[str, Any]) -> None:
|
52
|
+
"""Validate the orchestration spec contains valid Argo workflow."""
|
53
|
+
pipeline = config["pipeline"]
|
54
|
+
orchestration_spec = pipeline["orchestration_spec"]
|
55
|
+
|
56
|
+
if "argo_orchestration_spec" not in orchestration_spec:
|
57
|
+
raise ValueError("'argo_orchestration_spec' not found in orchestration_spec")
|
58
|
+
|
59
|
+
argo_spec_str = orchestration_spec["argo_orchestration_spec"]
|
60
|
+
|
61
|
+
try:
|
62
|
+
argo_spec = yaml.safe_load(argo_spec_str)
|
63
|
+
except yaml.YAMLError as e:
|
64
|
+
raise ValueError(f"Invalid YAML in argo_orchestration_spec: {e}")
|
65
|
+
|
66
|
+
cls._validate_argo_workflow(argo_spec)
|
67
|
+
|
68
|
+
@classmethod
|
69
|
+
def _validate_argo_workflow(cls, argo_spec: Dict[str, Any]) -> None:
|
70
|
+
"""Validate the Argo workflow structure."""
|
71
|
+
# Basic Argo workflow validation
|
72
|
+
if not isinstance(argo_spec, dict):
|
73
|
+
raise ValueError("argo_orchestration_spec must be a valid YAML object")
|
74
|
+
|
75
|
+
required_fields = ["apiVersion", "kind", "spec"]
|
76
|
+
for field in required_fields:
|
77
|
+
if field not in argo_spec:
|
78
|
+
raise ValueError(f"'{field}' not found in argo_orchestration_spec")
|
79
|
+
|
80
|
+
if argo_spec["apiVersion"] != "argoproj.io/v1alpha1":
|
81
|
+
raise ValueError("argo_orchestration_spec must have apiVersion 'argoproj.io/v1alpha1'")
|
82
|
+
|
83
|
+
if argo_spec["kind"] != "Workflow":
|
84
|
+
raise ValueError("argo_orchestration_spec must have kind 'Workflow'")
|
85
|
+
|
86
|
+
# Validate templates and steps
|
87
|
+
spec = argo_spec["spec"]
|
88
|
+
if "templates" not in spec:
|
89
|
+
raise ValueError("'templates' not found in argo_orchestration_spec.spec")
|
90
|
+
|
91
|
+
cls._validate_argo_templates(spec["templates"])
|
92
|
+
|
93
|
+
@classmethod
|
94
|
+
def _validate_argo_templates(cls, templates: List[Dict[str, Any]]) -> None:
|
95
|
+
"""Validate Argo workflow templates."""
|
96
|
+
for template in templates:
|
97
|
+
if "steps" in template:
|
98
|
+
for step_group in template["steps"]:
|
99
|
+
for step in step_group:
|
100
|
+
if "templateRef" in step:
|
101
|
+
template_ref = step["templateRef"]
|
102
|
+
cls._validate_template_ref(template_ref)
|
103
|
+
|
104
|
+
@classmethod
|
105
|
+
def _validate_template_ref(cls, template_ref: Dict[str, Any]) -> None:
|
106
|
+
"""Validate a templateRef in the Argo workflow."""
|
107
|
+
if "name" not in template_ref or "template" not in template_ref:
|
108
|
+
raise ValueError("templateRef must have both 'name' and 'template' fields")
|
109
|
+
|
110
|
+
name = template_ref["name"]
|
111
|
+
template = template_ref["template"]
|
112
|
+
|
113
|
+
if name != template:
|
114
|
+
raise ValueError(f"templateRef name '{name}' must match template '{template}'")
|
115
|
+
|
116
|
+
# Check if it matches either pattern
|
117
|
+
if not (
|
118
|
+
cls.TEMPLATE_REF_WITH_VERSION_PATTERN.match(name)
|
119
|
+
or cls.TEMPLATE_REF_WITHOUT_VERSION_PATTERN.match(name)
|
120
|
+
):
|
121
|
+
raise ValueError(
|
122
|
+
f"templateRef name '{name}' must match either pattern:\n"
|
123
|
+
f" - users/{{user_id}}/apps/{{app_id}}/pipeline-steps/{{step_id}}\n"
|
124
|
+
f" - users/{{user_id}}/apps/{{app_id}}/pipeline-steps/{{step_id}}/versions/{{version_id}}"
|
125
|
+
)
|
126
|
+
|
127
|
+
@classmethod
|
128
|
+
def get_pipeline_steps_without_versions(cls, config: Dict[str, Any]) -> List[str]:
|
129
|
+
"""Get list of pipeline step names that don't have versions in templateRef."""
|
130
|
+
pipeline = config["pipeline"]
|
131
|
+
orchestration_spec = pipeline["orchestration_spec"]
|
132
|
+
argo_spec_str = orchestration_spec["argo_orchestration_spec"]
|
133
|
+
argo_spec = yaml.safe_load(argo_spec_str)
|
134
|
+
|
135
|
+
steps_without_versions = []
|
136
|
+
|
137
|
+
for template in argo_spec["spec"]["templates"]:
|
138
|
+
if "steps" in template:
|
139
|
+
for step_group in template["steps"]:
|
140
|
+
for step in step_group:
|
141
|
+
if "templateRef" in step:
|
142
|
+
template_ref = step["templateRef"]
|
143
|
+
name = template_ref["name"]
|
144
|
+
|
145
|
+
# Check if it's without version
|
146
|
+
if cls.TEMPLATE_REF_WITHOUT_VERSION_PATTERN.match(name):
|
147
|
+
# Extract step name
|
148
|
+
parts = name.split('/')
|
149
|
+
step_name = parts[-1] # Last part is the step name
|
150
|
+
if step_name not in steps_without_versions:
|
151
|
+
steps_without_versions.append(step_name)
|
152
|
+
|
153
|
+
return steps_without_versions
|
@@ -1,4 +1,4 @@
|
|
1
|
-
clarifai/__init__.py,sha256=
|
1
|
+
clarifai/__init__.py,sha256=GnS54jaOx5YkZd_HH8VH8I061jKN-JUULYPBgILv7jA,23
|
2
2
|
clarifai/cli.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
clarifai/errors.py,sha256=GXa6D4v_L404J83jnRNFPH7s-1V9lk7w6Ws99f1g-AY,2772
|
4
4
|
clarifai/versions.py,sha256=ecSuEB_nOL2XSoYHDw2n23XUbm_KPOGjudMXmQrGdS8,224
|
@@ -8,29 +8,34 @@ clarifai/cli/__main__.py,sha256=7nPbLW7Jr2shkgMPvnxpn4xYGMvIcnqluJ69t9w4H_k,74
|
|
8
8
|
clarifai/cli/base.py,sha256=mzfAHRhon6tKntpxk241GD-Sjrb2-V99nAOasElLuuw,8254
|
9
9
|
clarifai/cli/compute_cluster.py,sha256=8Xss0Obrp6l1XuxJe0luOqU_pf8vXGDRi6jyIe8qR6k,2282
|
10
10
|
clarifai/cli/deployment.py,sha256=9C4I6_kyMxRkWl6h681wc79-3mAtDHtTUaxRv05OZMs,4262
|
11
|
-
clarifai/cli/model.py,sha256=
|
12
|
-
clarifai/cli/model_templates.py,sha256=_ZonIBnY9KKSJY31KZbUys_uN_k_Txu7Dip12KWfmSU,9633
|
11
|
+
clarifai/cli/model.py,sha256=71u7JS0xnxQOLp3s9cKGbT1hyhf1CIVxMeFMU2fiLTM,31553
|
13
12
|
clarifai/cli/nodepool.py,sha256=H6OIdUW_EiyDUwZogzEDoYmVwEjLMsgoDlPyE7gjIuU,4245
|
13
|
+
clarifai/cli/pipeline.py,sha256=M8gW72IB5hx1OIf0pOytZhnw50euPnXxW4vuZ9Fqyqw,5477
|
14
|
+
clarifai/cli/pipeline_step.py,sha256=eOxU4MdPBuB01A00Rz6m9THLyTaTLOTKwGwSVyegkyI,3808
|
15
|
+
clarifai/cli/templates/__init__.py,sha256=HbMlZuYOMyVJde73ijNAevmSRUpIttGlHdwyO4W-JOs,44
|
16
|
+
clarifai/cli/templates/model_templates.py,sha256=_ZonIBnY9KKSJY31KZbUys_uN_k_Txu7Dip12KWfmSU,9633
|
17
|
+
clarifai/cli/templates/pipeline_step_templates.py,sha256=HU1BoU7wG71MviQAvyecxT_qo70XhTtPGYtoIQ-U-l0,1663
|
18
|
+
clarifai/cli/templates/pipeline_templates.py,sha256=mfHrEoRxICIv00zxfgIct2IpxcMmZ6zjHG8WLF1TPcI,4409
|
14
19
|
clarifai/client/__init__.py,sha256=NhpNFRJY6mTi8ca-5hUeTEmYeDKHDNXY48FN63pDuos,703
|
15
20
|
clarifai/client/app.py,sha256=1M9XDsPWIEsj0g-mgIeZ9Mvkt85UHSbrv6pEr-QKfNg,41423
|
16
|
-
clarifai/client/base.py,sha256=
|
21
|
+
clarifai/client/base.py,sha256=rXQlB0BXbKLOgLVJW_2axYh0Vd_F0BbgJE_DXTQoG4U,9109
|
17
22
|
clarifai/client/compute_cluster.py,sha256=ViPyh-FibXL1J0ypsVOTaQnR1ymKohmZEuA13RwA-hc,10254
|
18
23
|
clarifai/client/dataset.py,sha256=OgdpZkQ_vYmRxL8-qphcNozpvPV1bWTlte9Jv6UkKb8,35299
|
19
24
|
clarifai/client/deployment.py,sha256=QBf0tzkKBEpzNgmOEmWUJMOlVWdFEFc70Y44o8y75Gs,2875
|
20
25
|
clarifai/client/input.py,sha256=jpX47qwn7aUBBIEuSSLHF5jk70XaWEh0prD065c9b-E,51205
|
21
26
|
clarifai/client/lister.py,sha256=1YEm2suNxPaJO4x9V5szgD_YX6N_00vgSO-7m0HagY8,2208
|
22
|
-
clarifai/client/model.py,sha256=
|
23
|
-
clarifai/client/model_client.py,sha256=
|
27
|
+
clarifai/client/model.py,sha256=Oh2zCa7XA_pBAEx9D8ME81H_BBqD7wJYoeB5CEjlI5E,89989
|
28
|
+
clarifai/client/model_client.py,sha256=4gIS0mKBdiNMA1x_6Wo6H7WbfLsmQix64EpONcQjQV4,37129
|
24
29
|
clarifai/client/module.py,sha256=jLViQYvVV3FmRN_ivvbk83uwsx7CgYGeEx4dYAr6yD4,4537
|
25
30
|
clarifai/client/nodepool.py,sha256=Y5zQ0JLdTjAp2TmVnx7AAOwaB2YUslk3nl7s6BQ90FQ,16415
|
26
31
|
clarifai/client/runner.py,sha256=5xCiqByGGscfNm0IjHelhDTx8-9l8G0C3HL-3YZogK8,2253
|
27
32
|
clarifai/client/search.py,sha256=3LLfATrdU43a0mRNITmJV-E53bhfafZkYsbwkTtlnyU,15661
|
28
|
-
clarifai/client/user.py,sha256=
|
33
|
+
clarifai/client/user.py,sha256=YDAXSOh7ACsvCjVctugiTu8MXFN_TDBoXuEKGXv_uHg,21997
|
29
34
|
clarifai/client/workflow.py,sha256=Bqh8lAmJcSbviJebckchTxucYlU11UQEhFSov7elpsk,13417
|
30
35
|
clarifai/client/auth/__init__.py,sha256=7EwR0NrozkAUwpUnCsqXvE_p0wqx_SelXlSpKShKJK0,136
|
31
|
-
clarifai/client/auth/helper.py,sha256=
|
32
|
-
clarifai/client/auth/register.py,sha256=
|
33
|
-
clarifai/client/auth/stub.py,sha256=
|
36
|
+
clarifai/client/auth/helper.py,sha256=h6R4zsDEY6C1VmcxjYrIsFPOO_ujEjRR_JtpQ5WVuo4,16117
|
37
|
+
clarifai/client/auth/register.py,sha256=xIg1OoZ_GGnc0KQKII-R6q_cKN1JXW3BGcU2eyS-Kkc,871
|
38
|
+
clarifai/client/auth/stub.py,sha256=nKod8eNWaBnmsaNZ59dEt42TTcwC9mMgCzEMYPZggxc,9537
|
34
39
|
clarifai/constants/base.py,sha256=ogmFSZYoF0YhGjHg5aiOc3MLqPr_poKAls6xaD0_C3U,89
|
35
40
|
clarifai/constants/dataset.py,sha256=9saFE_VxCTCMlPTQbOU4KM_SzN_TQjwsrsFnpsc_Epo,556
|
36
41
|
clarifai/constants/input.py,sha256=WcHwToUVIK9ItAhDefaSohQHCLNeR55PSjZ0BFnoZ3U,28
|
@@ -70,7 +75,7 @@ clarifai/runners/dockerfile_template/Dockerfile.template,sha256=DUH7F0-uLOV0LTjn
|
|
70
75
|
clarifai/runners/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
71
76
|
clarifai/runners/models/dummy_openai_model.py,sha256=pcmAVbqTTGG4J3BLVjKfvM_SQ-GET_XexIUdLcr9Zvo,8373
|
72
77
|
clarifai/runners/models/mcp_class.py,sha256=RdKn7rW4vYol0VRDZiLTSMfkqjLhO1ijXAQ0Rq0Jfnw,6647
|
73
|
-
clarifai/runners/models/model_builder.py,sha256=
|
78
|
+
clarifai/runners/models/model_builder.py,sha256=D47H1zm3_Xr-nlPYb_1dY8dxlMiM93kU4QYGEtyxK88,63403
|
74
79
|
clarifai/runners/models/model_class.py,sha256=-euUF-eHUi4KXR_e1pIwvToDZ13CM6TSz2FolzildjM,16069
|
75
80
|
clarifai/runners/models/model_run_locally.py,sha256=6-6WjEKc0ba3gAv4wOLdMs2XOzS3b-2bZHJS0wdVqJY,20088
|
76
81
|
clarifai/runners/models/model_runner.py,sha256=SccX-RxTgruSpQaM21uMSl-z1x6fOa13fQZMQW8NNRY,7297
|
@@ -78,13 +83,19 @@ clarifai/runners/models/model_servicer.py,sha256=rRd_fNEXwqiBSzTUtPI2r07EBdcCPd8
|
|
78
83
|
clarifai/runners/models/openai_class.py,sha256=aXlk5W6LWkh-A4eZYi74DeLW0i_86_9DYYGxpJHXI0w,6688
|
79
84
|
clarifai/runners/models/visual_classifier_class.py,sha256=1ZoLfCT2crrgRbejjTMAIwpTRgQMiH9N9yflOVpFxSg,2721
|
80
85
|
clarifai/runners/models/visual_detector_class.py,sha256=ky4oFAkGCKPpGPdgaOso-n6D3HcmnbKee_8hBsNiV8U,2883
|
86
|
+
clarifai/runners/pipeline_steps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
|
+
clarifai/runners/pipeline_steps/pipeline_step_builder.py,sha256=E6Ce3b0RolYLMJHaUrKukphD7ndNZafZ8gIsaONiYUk,21047
|
88
|
+
clarifai/runners/pipelines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
89
|
+
clarifai/runners/pipelines/pipeline_builder.py,sha256=z_bCwjwQPFa_1AYkorhh5r6t6r5hC5K2D8Z1LTEzIpg,12801
|
81
90
|
clarifai/runners/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
82
|
-
clarifai/runners/utils/code_script.py,sha256=
|
83
|
-
clarifai/runners/utils/const.py,sha256=
|
91
|
+
clarifai/runners/utils/code_script.py,sha256=4wkInN_7MgCvMt9KLJA5_13iF5UFdeQLEhs0T5GvsHQ,13830
|
92
|
+
clarifai/runners/utils/const.py,sha256=MK7lTzzJKbOiyiUtG_jlJXfz_xNKMn5LjkQ9vjbttXE,1538
|
84
93
|
clarifai/runners/utils/data_utils.py,sha256=HRpMYR2O0OiDpXXhOManLHTeomC4bFnXMHVAiT_12yE,20856
|
85
94
|
clarifai/runners/utils/loader.py,sha256=K5Y8MPbIe5STw2gDnrL8KqFgKNxEo7bz-RV0ip1T4PM,10900
|
86
95
|
clarifai/runners/utils/method_signatures.py,sha256=qdHaO8ZIgP6BBXXMhMPhcQ46dse-XMP2t4VJCNG7O3Q,18335
|
96
|
+
clarifai/runners/utils/model_utils.py,sha256=Cn3_89ZMhIR6f61H-btcK_Luwq0CMAx5fMxPxwngo68,4530
|
87
97
|
clarifai/runners/utils/openai_convertor.py,sha256=ZlIrvvfHttD_DavLvmKZdL8gNq_TQvQtZVnYamwdWz4,8248
|
98
|
+
clarifai/runners/utils/pipeline_validation.py,sha256=RWWWUA3mNCXHCSNpuofMGfXfWEYe7LrYKwIc-1VFvQs,6444
|
88
99
|
clarifai/runners/utils/serializers.py,sha256=pI7GqMTC0T3Lu_X8v8TO4RiplO-gC_49Ns37jYwsPtg,7908
|
89
100
|
clarifai/runners/utils/url_fetcher.py,sha256=Segkvi-ktPa3-koOpUu8DNZeWOaK6G82Ya9b7_oIKwo,1778
|
90
101
|
clarifai/runners/utils/data_types/__init__.py,sha256=iBtmPkIoLK9ew6ZiXElGt2YBBTDLEA0fmxE_eOYzvhk,478
|
@@ -107,9 +118,9 @@ clarifai/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
107
118
|
clarifai/workflows/export.py,sha256=HvUYG9N_-UZoRR0-_tdGbZ950_AeBqawSppgUxQebR0,1913
|
108
119
|
clarifai/workflows/utils.py,sha256=ESL3INcouNcLKCh-nMpfXX-YbtCzX7tz7hT57_RGQ3M,2079
|
109
120
|
clarifai/workflows/validate.py,sha256=UhmukyHkfxiMFrPPeBdUTiCOHQT5-shqivlBYEyKTlU,2931
|
110
|
-
clarifai-11.5.
|
111
|
-
clarifai-11.5.
|
112
|
-
clarifai-11.5.
|
113
|
-
clarifai-11.5.
|
114
|
-
clarifai-11.5.
|
115
|
-
clarifai-11.5.
|
121
|
+
clarifai-11.5.3.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
|
122
|
+
clarifai-11.5.3.dist-info/METADATA,sha256=9lNeftFBxjiGsh8zvuKItgl4nh8P0c15fdgxUkiiiEg,22736
|
123
|
+
clarifai-11.5.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
124
|
+
clarifai-11.5.3.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
|
125
|
+
clarifai-11.5.3.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
|
126
|
+
clarifai-11.5.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|