clarifai 11.7.5__py3-none-any.whl → 11.8.0__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.
@@ -72,6 +72,17 @@ class HuggingFaceLoader:
72
72
  else:
73
73
  self.ignore_patterns = ignore_file_patterns
74
74
 
75
+ repo_files_to_download = self.get_repo_files_list(
76
+ allowed_file_patterns=allowed_file_patterns,
77
+ ignore_file_patterns=self.ignore_patterns,
78
+ )
79
+ total_size = self.get_huggingface_checkpoint_total_size(
80
+ self.repo_id, checkpoint_files_list=repo_files_to_download
81
+ )
82
+ total_size = total_size / (1024**2)
83
+ logger.info(f"Total download size: {total_size:.2f} MB")
84
+
85
+ logger.info("Downloading model checkpoints...")
75
86
  snapshot_download(
76
87
  repo_id=self.repo_id,
77
88
  local_dir=checkpoint_path,
@@ -134,9 +145,7 @@ class HuggingFaceLoader:
134
145
  else:
135
146
  return repo_exists(self.repo_id)
136
147
 
137
- def validate_download(
138
- self, checkpoint_path: str, allowed_file_patterns: list, ignore_file_patterns: list
139
- ):
148
+ def get_repo_files_list(self, allowed_file_patterns: list, ignore_file_patterns: list):
140
149
  # check if model exists on HF
141
150
  try:
142
151
  from huggingface_hub import list_repo_files
@@ -169,6 +178,14 @@ class HuggingFaceLoader:
169
178
  return any(fnmatch.fnmatch(file_path, pattern) for pattern in patterns)
170
179
 
171
180
  repo_files = [f for f in repo_files if not should_ignore(f)]
181
+ return repo_files
182
+
183
+ def validate_download(
184
+ self, checkpoint_path: str, allowed_file_patterns: list, ignore_file_patterns: list
185
+ ):
186
+ repo_files = self.get_repo_files_list(
187
+ allowed_file_patterns=allowed_file_patterns, ignore_file_patterns=ignore_file_patterns
188
+ )
172
189
 
173
190
  # Check if downloaded files match the files we expect (ignoring ignored patterns)
174
191
  checkpoint_dir_files = []
@@ -258,13 +275,14 @@ class HuggingFaceLoader:
258
275
  return labels
259
276
 
260
277
  @staticmethod
261
- def get_huggingface_checkpoint_total_size(repo_name):
278
+ def get_huggingface_checkpoint_total_size(repo_name, checkpoint_files_list=None):
262
279
  """
263
280
  Fetches the JSON data for a Hugging Face model using the API with `?blobs=true`.
264
281
  Calculates the total size from the JSON output.
265
282
 
266
283
  Args:
267
284
  repo_name (str): The name of the model on Hugging Face Hub. e.g. "casperhansen/llama-3-8b-instruct-awq"
285
+ checkpoint_files_list (list, optional): A list of specific files to include in the size calculation. If None, all files are included.
268
286
 
269
287
  Returns:
270
288
  int: The total size in bytes.
@@ -282,6 +300,8 @@ class HuggingFaceLoader:
282
300
 
283
301
  total_size = 0
284
302
  for file in data['siblings']:
303
+ if checkpoint_files_list and (file['rfilename'] not in checkpoint_files_list):
304
+ continue
285
305
  total_size += file['size']
286
306
  return total_size
287
307
  except Exception as e:
clarifai/utils/misc.py CHANGED
@@ -221,6 +221,26 @@ def clone_github_repo(repo_url, target_dir, github_pat=None, branch=None):
221
221
  return False
222
222
 
223
223
 
224
+ def get_list_of_files_to_download(
225
+ downloader, owner, repo, folder_path, branch, files_to_download, depth=1
226
+ ):
227
+ data = downloader.get_folder_contents(owner, repo, folder_path, branch=branch)
228
+ for point in data:
229
+ if (point['type'] == 'dir') and (depth > 0):
230
+ files_to_download = get_list_of_files_to_download(
231
+ downloader,
232
+ owner,
233
+ repo,
234
+ point['path'],
235
+ branch,
236
+ files_to_download,
237
+ depth=(depth - 1),
238
+ )
239
+ else:
240
+ files_to_download.append(point['path'])
241
+ return files_to_download
242
+
243
+
224
244
  class GitHubDownloader:
225
245
  def __init__(
226
246
  self, max_retries: int = 3, backoff_factor: float = 0.3, github_token: str = None
clarifai/utils/secrets.py CHANGED
@@ -1,8 +1,9 @@
1
1
  import os
2
2
  import time
3
+ from contextlib import contextmanager
3
4
  from pathlib import Path
4
5
  from threading import Thread
5
- from typing import Any, Callable, Optional
6
+ from typing import Any, Callable, Dict, List, Optional
6
7
 
7
8
  from clarifai_grpc.grpc.api import resources_pb2, service_pb2
8
9
  from google.protobuf import struct_pb2
@@ -165,6 +166,100 @@ def inject_secrets(request: Optional[service_pb2.PostModelOutputsRequest]) -> No
165
166
  return
166
167
 
167
168
 
169
+ def extract_req_secrets(
170
+ request: Optional[service_pb2.PostModelOutputsRequest],
171
+ ) -> List[Dict[str, Any]]:
172
+ """Extract request-type secrets from the model parameters.
173
+
174
+ Args:
175
+ request: The PostModelOutputsRequest containing the model parameters
176
+
177
+ Returns:
178
+ list: request-type secrets with env_var and value fields
179
+ """
180
+ if not request or not request.HasField("model"):
181
+ return []
182
+
183
+ if not (
184
+ request.model.HasField("model_version")
185
+ and request.model.model_version.HasField("output_info")
186
+ and request.model.model_version.output_info.HasField("params")
187
+ ):
188
+ return []
189
+
190
+ try:
191
+ params_dict = MessageToDict(request.model.model_version.output_info.params)
192
+ secrets_array = params_dict.get("secrets", [])
193
+
194
+ req_secrets = []
195
+ for secret in secrets_array:
196
+ if isinstance(secret, dict) and secret.get("secret_type") == "req":
197
+ secret_id = secret.get("id")
198
+ env_var = secret.get("env_var")
199
+ value = secret.get("value")
200
+ if env_var and value:
201
+ req_secrets.append({"env_var": env_var, "value": str(value)})
202
+ else:
203
+ logger.warning(
204
+ f"Invalid req-type secret missing env_var or value: {secret_id}"
205
+ )
206
+ return req_secrets
207
+ except Exception as e:
208
+ logger.error(f"Error extracting req secrets: {e}")
209
+ return []
210
+
211
+
212
+ @contextmanager
213
+ def temporary_env_vars(env_vars: Dict[str, str]):
214
+ """Context manager to temporarily set environment variables and restore them after.
215
+
216
+ Args:
217
+ env_vars: Dictionary of environment variable names and values to set
218
+ """
219
+ if not env_vars:
220
+ yield
221
+ return
222
+
223
+ original_values = {}
224
+ for key in env_vars.keys():
225
+ original_values[key] = os.environ.get(key)
226
+
227
+ try:
228
+ for key, value in env_vars.items():
229
+ os.environ[key] = value
230
+ logger.debug(f"Temporarily set environment variable: {key}")
231
+ yield
232
+ finally:
233
+ # Restore original environment state
234
+ for key, original_value in original_values.items():
235
+ if original_value is None:
236
+ if key in os.environ:
237
+ del os.environ[key]
238
+ logger.debug(f"Removed temporary environment variable: {key}")
239
+ else:
240
+ os.environ[key] = original_value
241
+ logger.debug(f"Restored environment variable: {key}")
242
+
243
+
244
+ @contextmanager
245
+ def req_secrets_context(request: Optional[service_pb2.PostModelOutputsRequest]):
246
+ """Context manager to handle request-type secrets during model prediction.
247
+
248
+ Args:
249
+ request: The PostModelOutputsRequest to extract secrets from
250
+ """
251
+ req_secrets = extract_req_secrets(request)
252
+
253
+ if not req_secrets:
254
+ yield
255
+ return
256
+
257
+ env_vars = {secret["env_var"]: secret["value"] for secret in req_secrets}
258
+ logger.debug(f"Setting {len(env_vars)} request-type secrets as environment variables")
259
+ with temporary_env_vars(env_vars):
260
+ yield
261
+
262
+
168
263
  def get_secrets(
169
264
  request: Optional[service_pb2.PostModelOutputsRequest],
170
265
  ) -> dict[str, Any]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clarifai
3
- Version: 11.7.5
3
+ Version: 11.8.0
4
4
  Home-page: https://github.com/Clarifai/clarifai-python
5
5
  Author: Clarifai
6
6
  Author-email: support@clarifai.com
@@ -1,21 +1,21 @@
1
- clarifai/__init__.py,sha256=erhK1A34wNw9UWhmdvXBUqJEX6p8t92dFVsXt-teneQ,23
1
+ clarifai/__init__.py,sha256=i-ilTWt69mdcN4GqSDKAmTIOlguLxG2mm9Xhzz2U_aw,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
5
5
  clarifai/cli/README.md,sha256=Rm0Sk61u7PrWQBgA6idv0R6ldJGhnVHSlIF2rVzRk8g,3428
6
6
  clarifai/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  clarifai/cli/__main__.py,sha256=7nPbLW7Jr2shkgMPvnxpn4xYGMvIcnqluJ69t9w4H_k,74
8
- clarifai/cli/base.py,sha256=l1WpCM9URk7mkYmHNpnZYtihbTTmMpBB5oBo9IwgeEo,10677
8
+ clarifai/cli/base.py,sha256=FQEEmi3a9_LBOmM_-X4EYdpAmDK1UljTxrHOIIsOZbM,10696
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=Hyp68_RTLkH-Ja_XtExu-vTPwXUSIHYXq7nyMW6RA-U,43030
11
+ clarifai/cli/model.py,sha256=afThcvpEy7ni8zezel-UjvoJkALbVLQEI4WDZIdyDL0,47948
12
12
  clarifai/cli/nodepool.py,sha256=H6OIdUW_EiyDUwZogzEDoYmVwEjLMsgoDlPyE7gjIuU,4245
13
- clarifai/cli/pipeline.py,sha256=9ZWVLokXHxqXy0g1_1ACuRX20ckrzyKwnsFfuJZm6Nw,13130
13
+ clarifai/cli/pipeline.py,sha256=MmyPaVX1XsIZlrYTrT7Ctd71ao_d3ZWkuF_fv_NJS8s,13944
14
14
  clarifai/cli/pipeline_step.py,sha256=dvoC2vAsDcxOCy88VV0X42PG22_7JSu9sfBVsk-Cix4,6133
15
15
  clarifai/cli/templates/__init__.py,sha256=HbMlZuYOMyVJde73ijNAevmSRUpIttGlHdwyO4W-JOs,44
16
16
  clarifai/cli/templates/model_templates.py,sha256=f3fvXTwHLBExjSOpdcEgp7X1CH28jjzpLFKljWi5arQ,9793
17
17
  clarifai/cli/templates/pipeline_step_templates.py,sha256=w1IJghF_4wWyEmHR1925N0hpGKocy3G7ezhxTH-0XCc,1716
18
- clarifai/cli/templates/pipeline_templates.py,sha256=l7-0yj1aw4jVZb0xjuhc9sW9LJfG3qaGqgwt7bLURCc,4462
18
+ clarifai/cli/templates/pipeline_templates.py,sha256=iLVxkmd0usc7jervTZTFzLwRVVF_623RszGW-oIuPDw,4234
19
19
  clarifai/client/__init__.py,sha256=MWEG_jTGn6UWbGCznsZxObJ5h65k2igD1462qID2pgI,840
20
20
  clarifai/client/app.py,sha256=8_Y5esptlFSGW2WS0uly9IBop37hJVpxnhs-vBIZrtc,47205
21
21
  clarifai/client/base.py,sha256=aduMVVSPUSQ-MsDpj4yuHmCTUNbCTPt76dhRZ14euVg,10284
@@ -28,7 +28,7 @@ clarifai/client/model.py,sha256=CQP5UiHaLR2hHcG1nU-ac_utN9ZXalOzbOqaICa0VyQ,9201
28
28
  clarifai/client/model_client.py,sha256=pyPg1C3gb5Q3_DXmMmOB5AeORR1IDaaM7n0LGc3ciLk,38217
29
29
  clarifai/client/module.py,sha256=jLViQYvVV3FmRN_ivvbk83uwsx7CgYGeEx4dYAr6yD4,4537
30
30
  clarifai/client/nodepool.py,sha256=0E8-VgNMpdx2sAGotS3ZwfeUc9k3DBa3QJEJ1wKroVA,16700
31
- clarifai/client/pipeline.py,sha256=Kawnp16iWwty4TZGDbZvU_G5PJzCXQqf50Dc-AYLaAI,14880
31
+ clarifai/client/pipeline.py,sha256=R2DAaph-vlVJO_49PMfGXZ_1Prnd0vdkcgksnqK1jJA,15731
32
32
  clarifai/client/pipeline_step.py,sha256=_R0PhVCspAQatCss-0O0O9p9CpvU_y9cSSEeUp_7cV0,2765
33
33
  clarifai/client/runner.py,sha256=5xCiqByGGscfNm0IjHelhDTx8-9l8G0C3HL-3YZogK8,2253
34
34
  clarifai/client/search.py,sha256=3LLfATrdU43a0mRNITmJV-E53bhfafZkYsbwkTtlnyU,15661
@@ -72,28 +72,28 @@ clarifai/rag/__init__.py,sha256=wu3PzAzo7uqgrEzuaC9lY_3gj1HFiR3GU3elZIKTT5g,40
72
72
  clarifai/rag/rag.py,sha256=EG3GoFrHFCmA70Tz49_0Jo1-3WIaHSgWGHecPeErcdc,14170
73
73
  clarifai/rag/utils.py,sha256=_gVZdABuMnraCKViLruV75x0F3IpgFXN6amYSGE5_xc,4462
74
74
  clarifai/runners/__init__.py,sha256=wXLaSljH7qLeJCrZdKEnlQh2tNqTQAIZKWOu2rZ6wGs,279
75
- clarifai/runners/server.py,sha256=ZsPx9xInP6b_-KnH6M__PyVnU7Jlj1Iec6ycS6hPnGI,12453
75
+ clarifai/runners/server.py,sha256=qTWpFw01UqdVHSUSKojnnC7P-jKx6dQvPs0C4vJCOw4,12442
76
76
  clarifai/runners/dockerfile_template/Dockerfile.template,sha256=nEnIMqzhAXDbd0Ht7QQm0U7AVPIHWQD6kYnFZ0TKJUM,2428
77
77
  clarifai/runners/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
78
  clarifai/runners/models/dummy_openai_model.py,sha256=LfAJu173uTEYsN6xpaJ6TyimohyTooX16H6YYk9qVLs,8636
79
79
  clarifai/runners/models/mcp_class.py,sha256=RdKn7rW4vYol0VRDZiLTSMfkqjLhO1ijXAQ0Rq0Jfnw,6647
80
- clarifai/runners/models/model_builder.py,sha256=sG28Skk1FmHk6OY50T2n3aGVlFvWYJ4MtObozgz8kL0,70957
80
+ clarifai/runners/models/model_builder.py,sha256=uHEbUs-madANZIjroCbdWFrD6ss9jtLQNIrLgrqEaJA,75881
81
81
  clarifai/runners/models/model_class.py,sha256=Ndh437BNMkpFBo6B108GuKL8sGYaGnSplZ6FxOgd_v8,20010
82
82
  clarifai/runners/models/model_run_locally.py,sha256=6-6WjEKc0ba3gAv4wOLdMs2XOzS3b-2bZHJS0wdVqJY,20088
83
- clarifai/runners/models/model_runner.py,sha256=91Phib3REIkrf9hRVjEfUJq2DR4yl_HA9SdUAEmg_3o,12238
83
+ clarifai/runners/models/model_runner.py,sha256=bZeqIGvoR6t9kzI7ko5Wh2sB8DiT-HcCgFwTqgeu_JY,14573
84
84
  clarifai/runners/models/model_servicer.py,sha256=ZNF5rFI76YCmXXQIrz4wacPMtlFfl2KRsmPw29luGKI,4729
85
- clarifai/runners/models/openai_class.py,sha256=v3R1CoUIeS9dh9jhGH7G7Jih9DLXkHvieQLjMtC4Gas,8892
85
+ clarifai/runners/models/openai_class.py,sha256=MYnL7_U4_m5FX3CoVaTd6B9Qminh-q4pYizZQsV3zSk,9557
86
86
  clarifai/runners/models/visual_classifier_class.py,sha256=1ZoLfCT2crrgRbejjTMAIwpTRgQMiH9N9yflOVpFxSg,2721
87
87
  clarifai/runners/models/visual_detector_class.py,sha256=ky4oFAkGCKPpGPdgaOso-n6D3HcmnbKee_8hBsNiV8U,2883
88
88
  clarifai/runners/pipeline_steps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
- clarifai/runners/pipeline_steps/pipeline_step_builder.py,sha256=X2xWg4QM4kX3cr8JkG1RmAiVE8-XH8XbomjmXa16zmY,21333
89
+ clarifai/runners/pipeline_steps/pipeline_step_builder.py,sha256=jcbs3ntbeyUiAaPh00Pscni4uJopbqVNVJblUX1pYVc,21808
90
90
  clarifai/runners/pipelines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
91
  clarifai/runners/pipelines/pipeline_builder.py,sha256=0FBjb8l7mWlCwBsBLkHM3znNQB9HPLEOYrrE53ntjCE,13810
92
92
  clarifai/runners/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
93
  clarifai/runners/utils/code_script.py,sha256=zZ5xjd13z2oV4CUWgMU0w6J6dRr01Kl2K-8pPyw0MiY,14346
94
94
  clarifai/runners/utils/const.py,sha256=MK7lTzzJKbOiyiUtG_jlJXfz_xNKMn5LjkQ9vjbttXE,1538
95
95
  clarifai/runners/utils/data_utils.py,sha256=HRpMYR2O0OiDpXXhOManLHTeomC4bFnXMHVAiT_12yE,20856
96
- clarifai/runners/utils/loader.py,sha256=C6mI-9SgmdFM18Rcra7UuisE8ErHa5WlSxsM-SKucnA,10931
96
+ clarifai/runners/utils/loader.py,sha256=hQwdRKRLgrunDzLTiqjz2qVdxiL8WQ04PUSwrh-JWZ0,12077
97
97
  clarifai/runners/utils/method_signatures.py,sha256=qdHaO8ZIgP6BBXXMhMPhcQ46dse-XMP2t4VJCNG7O3Q,18335
98
98
  clarifai/runners/utils/model_utils.py,sha256=MCYhV_00anptIO1Qtxgzn3DlGI2UHV0ESFT3wLNcAMM,6413
99
99
  clarifai/runners/utils/openai_convertor.py,sha256=ZlIrvvfHttD_DavLvmKZdL8gNq_TQvQtZVnYamwdWz4,8248
@@ -109,10 +109,10 @@ clarifai/utils/cli.py,sha256=xTenEXjhWV-lpTqlfeRO4WNakT5QszNi8GO4yH4qcMs,13184
109
109
  clarifai/utils/config.py,sha256=dENYtcWW7Il5MInvIaYe0MZn0hW1fbIb0Lzk8rQ_geQ,7671
110
110
  clarifai/utils/constants.py,sha256=klcdSiVccrdJVRXL9qq08p2lWL3KerXcQOTIG6y9298,2414
111
111
  clarifai/utils/logging.py,sha256=0we53uTqUvzrulC86whu-oeWNxn1JjJL0OQ98Bwf9vo,15198
112
- clarifai/utils/misc.py,sha256=ld7_lls4CrjHzKchsSgJs4T-rVpUVEzRy4MDWBEQlyA,22812
112
+ clarifai/utils/misc.py,sha256=ATj4RR6S06GeLE0X4tMU4bmTz4Sz4j2WemTddsnSfMI,23458
113
113
  clarifai/utils/model_train.py,sha256=0XSAoTkSsrwf4f-W9yw2mkXZtkal7LBLJSoi86CFCn4,9250
114
114
  clarifai/utils/protobuf.py,sha256=VMhnNsPuWQ16VarKm8BOr5zccXMe26UlrxdJxIzEZNM,6220
115
- clarifai/utils/secrets.py,sha256=HAnkEXp16lPGpm19D6Aw0i-_aOWsGgQF8Vvej45_rVA,8076
115
+ clarifai/utils/secrets.py,sha256=nmdgHpjVvx93eSXvk8NbOikj7JsFu5tnqXNMj-0qDBA,11253
116
116
  clarifai/utils/evaluation/__init__.py,sha256=PYkurUrXrGevByj7RFb6CoU1iC7fllyQSfnnlo9WnY8,69
117
117
  clarifai/utils/evaluation/helpers.py,sha256=0t6eIDXeZEoiVvnmHTnsIF_-v4BzrQW1hFaqc_psifU,21079
118
118
  clarifai/utils/evaluation/main.py,sha256=N_sfRuMjHrUeuWN0Pzms65M1PbkQkgYg3WoQVaDR1Jw,17764
@@ -121,9 +121,9 @@ clarifai/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
121
121
  clarifai/workflows/export.py,sha256=HvUYG9N_-UZoRR0-_tdGbZ950_AeBqawSppgUxQebR0,1913
122
122
  clarifai/workflows/utils.py,sha256=ESL3INcouNcLKCh-nMpfXX-YbtCzX7tz7hT57_RGQ3M,2079
123
123
  clarifai/workflows/validate.py,sha256=UhmukyHkfxiMFrPPeBdUTiCOHQT5-shqivlBYEyKTlU,2931
124
- clarifai-11.7.5.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
125
- clarifai-11.7.5.dist-info/METADATA,sha256=Qjd46_GmGcDLY3tSkVUHPFq_i8rMcH6m946D-ElGqYE,23161
126
- clarifai-11.7.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
127
- clarifai-11.7.5.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
128
- clarifai-11.7.5.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
129
- clarifai-11.7.5.dist-info/RECORD,,
124
+ clarifai-11.8.0.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
125
+ clarifai-11.8.0.dist-info/METADATA,sha256=7bi487EKBn-zOSchR-9uC-l7j5-1KsWWNfbXQpjHaZk,23161
126
+ clarifai-11.8.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
127
+ clarifai-11.8.0.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
128
+ clarifai-11.8.0.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
129
+ clarifai-11.8.0.dist-info/RECORD,,