clarifai 11.2.4rc2__py3-none-any.whl → 11.2.4rc3__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 CHANGED
@@ -1 +1 @@
1
- __version__ = "11.2.4rc2"
1
+ __version__ = "11.2.4rc3"
@@ -23,7 +23,6 @@ from clarifai.runners.utils.const import (
23
23
  DEFAULT_DOWNLOAD_CHECKPOINT_WHEN, DEFAULT_PYTHON_VERSION, DEFAULT_RUNTIME_DOWNLOAD_PATH,
24
24
  PYTHON_BASE_IMAGE, TORCH_BASE_IMAGE)
25
25
  from clarifai.runners.utils.loader import HuggingFaceLoader
26
- from clarifai.runners.utils import data_utils
27
26
  from clarifai.runners.utils.method_signatures import signatures_to_yaml
28
27
  from clarifai.urls.helper import ClarifaiUrlHelper
29
28
  from clarifai.utils.logging import logger
@@ -337,16 +336,6 @@ class ModelBuilder:
337
336
  method_info = model_class._get_method_info()
338
337
  signatures = [method.signature for method in method_info.values()]
339
338
  return signatures
340
-
341
- def get_methods_defaults(self):
342
- """
343
- Returns the inference parameters for the model class.
344
- """
345
- model_class = self.load_model_class(mocking=True)
346
- method_info = model_class._get_method_info()
347
- python_param_defaults = [method.python_param_types for method in method_info.values()]
348
- return python_param_defaults
349
-
350
339
 
351
340
  @property
352
341
  def client(self):
@@ -633,58 +622,14 @@ class ModelBuilder:
633
622
  concepts = config.get('concepts')
634
623
  logger.info(f"Updated config.yaml with {len(concepts)} concepts.")
635
624
 
636
- def filled_params_specs_with_inference_params(self, method_signatures: list[resources_pb2.MethodSignature], methods_defaults) -> list[resources_pb2.ModelTypeField]:
637
- """
638
- Fills the params_specs with the inference params.
639
- """
640
- inference_params = set()
641
- for i, method_defaults in enumerate(methods_defaults):
642
- for name, default in method_defaults.items():
643
- if isinstance(default, data_utils.InputField):
644
- if i==0:
645
- inference_params.add(name)
646
- else:
647
- # if field.name not in inference_params then remove from inference_params
648
- if name not in inference_params:
649
- inference_params.remove(field.name)
650
- output=[]
651
- for signature in method_signatures:
652
- for field in signature.input_fields:
653
- if field.name in inference_params:
654
- field.path = field.name
655
- if field.type == resources_pb2.ModelTypeField.DataType.STR:
656
- field.default_value= str(field.default)
657
- field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.STRING
658
- elif field.type == resources_pb2.ModelTypeField.DataType.INT:
659
- field.default_value= int(field.default)
660
- field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.NUMBER
661
- elif field.type == resources_pb2.ModelTypeField.DataType.FLOAT:
662
- field.default_value= float(field.default)
663
- field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.NUMBER
664
- elif field.type == resources_pb2.ModelTypeField.DataType.BOOL:
665
- field.default_value= bool(field.default)
666
- field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.BOOLEAN
667
- else:
668
- field.default_value= field.default
669
- field.field_type = resources_pb2.ModelTypeField.ModelTypeFieldType.STRING
670
- output.append(field)
671
- return output
672
-
673
-
674
625
  def get_model_version_proto(self):
675
626
  signatures = self.get_method_signatures()
676
- methods_defaults = self.get_methods_defaults()
677
-
678
627
  model_version_proto = resources_pb2.ModelVersion(
679
628
  pretrained_model_config=resources_pb2.PretrainedModelConfig(),
680
629
  inference_compute_info=self.inference_compute_info,
681
630
  method_signatures=signatures,
682
- output_info= resources_pb2.OutputInfo(
683
- params_specs=self.filled_params_specs_with_inference_params(signatures, methods_defaults),
684
- )
685
631
  )
686
632
 
687
-
688
633
  model_type_id = self.config.get('model').get('model_type_id')
689
634
  if model_type_id in CONCEPTS_REQUIRED_MODEL_TYPE:
690
635
 
@@ -354,9 +354,4 @@ class _MethodInfo:
354
354
  for p in inspect.signature(method).parameters.values()
355
355
  if p.annotation != inspect.Parameter.empty
356
356
  }
357
- self.python_param_defaults = {
358
- p.name: p.default
359
- for p in inspect.signature(method).parameters.values()
360
- if p.default != inspect.Parameter.empty
361
- }
362
357
  self.python_param_types.pop('self', None)
@@ -180,42 +180,40 @@ class InputField(MessageData):
180
180
 
181
181
  @classmethod
182
182
  def get_default(cls, proto):
183
- default_str = proto.default
184
- default = None
185
- import json
183
+ default_str = proto.default
184
+ default = None
185
+ import json
186
+ try:
187
+ # Attempt to parse as JSON first (for complex types)
188
+ return json.loads(default_str)
189
+ except json.JSONDecodeError:
190
+ pass
191
+ # Check for boolean values stored as "True" or "False"
192
+ if proto.type == resources_pb2.ModelTypeField.DataType.BOOL:
186
193
  try:
187
- # Attempt to parse as JSON first (for complex types)
188
- return json.loads(default_str)
189
- except json.JSONDecodeError:
190
- pass
191
- # Check for boolean values stored as "True" or "False"
192
- if proto.type == resources_pb2.ModelTypeField.DataType.BOOL:
193
- try:
194
- default = bool(default_str)
195
- except ValueError:
196
- pass
197
- # Try to parse as integer
198
- elif proto.type == resources_pb2.ModelTypeField.DataType.INT:
199
- try:
200
- default = int(default_str)
201
- except ValueError:
202
- pass
203
-
204
- # Try to parse as float
205
- elif proto.type == resources_pb2.ModelTypeField.DataType.FLOAT:
206
- try:
207
- default = float(default_str)
208
- except ValueError:
209
- pass
210
- elif proto.type == resources_pb2.ModelTypeField.DataType.STR:
211
- default = default_str
212
-
213
- if default is None:
214
- # If all parsing fails, return the string value
215
- default = default_str
216
- return default
217
-
194
+ default = bool(default_str)
195
+ except ValueError:
196
+ pass
197
+ # Try to parse as integer
198
+ elif proto.type == resources_pb2.ModelTypeField.DataType.INT:
199
+ try:
200
+ default = int(default_str)
201
+ except ValueError:
202
+ pass
218
203
 
204
+ # Try to parse as float
205
+ elif proto.type == resources_pb2.ModelTypeField.DataType.FLOAT:
206
+ try:
207
+ default = float(default_str)
208
+ except ValueError:
209
+ pass
210
+ elif proto.type == resources_pb2.ModelTypeField.DataType.STR:
211
+ default = default_str
212
+
213
+ if default is None:
214
+ # If all parsing fails, return the string value
215
+ default = default_str
216
+ return default
219
217
 
220
218
 
221
219
  class DataConverter:
@@ -1,7 +1,7 @@
1
1
  import collections.abc as abc
2
2
  import inspect
3
- import logging
4
3
  import json
4
+ import logging
5
5
  from collections import namedtuple
6
6
  from typing import Dict, List, Tuple, get_args, get_origin
7
7
 
@@ -1,44 +1,54 @@
1
1
  import time
2
2
  import uuid
3
3
 
4
+
4
5
  def generate_id():
5
- return f"chatcmpl-{uuid.uuid4().hex}"
6
+ return f"chatcmpl-{uuid.uuid4().hex}"
7
+
6
8
 
7
9
  def _format_non_streaming_response(
8
10
  generated_text,
9
11
  model="custom-model",
10
12
  id=None,
11
13
  created=None,
12
- usage=None,
14
+ prompt_tokens=None,
15
+ completion_tokens=None,
13
16
  finish_reason="stop",
14
17
  ):
15
- if id is None:
16
- id = generate_id()
17
- if created is None:
18
- created = int(time.time())
19
-
20
- response = {
21
- "id": id,
22
- "object": "chat.completion",
23
- "created": created,
24
- "model": model,
25
- "choices": [
26
- {
27
- "index": 0,
28
- "message": {
29
- "role": "assistant",
30
- "content": generated_text,
31
- },
32
- "finish_reason": finish_reason,
33
- "logprobs": None,
34
- }
35
- ],
18
+ if id is None:
19
+ id = generate_id()
20
+ if created is None:
21
+ created = int(time.time())
22
+
23
+ response = {
24
+ "id":
25
+ id,
26
+ "object":
27
+ "chat.completion",
28
+ "created":
29
+ created,
30
+ "model":
31
+ model,
32
+ "choices": [{
33
+ "index": 0,
34
+ "message": {
35
+ "role": "assistant",
36
+ "content": generated_text,
37
+ },
38
+ "finish_reason": finish_reason,
39
+ "logprobs": None,
40
+ }],
41
+ }
42
+
43
+ if prompt_tokens is not None and completion_tokens is not None:
44
+ response["usage"] = {
45
+ "prompt_tokens": prompt_tokens,
46
+ "completion_tokens": completion_tokens,
47
+ "total_tokens": prompt_tokens + completion_tokens,
36
48
  }
37
-
38
- if usage is not None:
39
- response["usage"] = usage
40
-
41
- return response
49
+
50
+ return response
51
+
42
52
 
43
53
  def _format_streaming_response(
44
54
  generated_chunks,
@@ -47,181 +57,111 @@ def _format_streaming_response(
47
57
  created=None,
48
58
  finish_reason="stop",
49
59
  ):
50
- if id is None:
51
- id = generate_id()
52
- if created is None:
53
- created = int(time.time())
54
-
55
- for chunk in generated_chunks:
56
- yield {
57
- "id": id,
58
- "object": "chat.completion.chunk",
59
- "created": created,
60
- "model": model,
61
- "choices": [
62
- {
63
- "index": 0,
64
- "delta": {
65
- "content": chunk,
66
- },
67
- "finish_reason": None,
68
- "logprobs": None,
69
- }
70
- ],
71
- }
72
-
73
- # Final chunk indicating completion
60
+ if id is None:
61
+ id = generate_id()
62
+ if created is None:
63
+ created = int(time.time())
64
+
65
+ for chunk in generated_chunks:
74
66
  yield {
75
- "id": id,
76
- "object": "chat.completion.chunk",
77
- "created": created,
78
- "model": model,
79
- "choices": [
80
- {
81
- "index": 0,
82
- "delta": {},
83
- "finish_reason": finish_reason,
84
- "logprobs": None,
85
- }
86
- ],
67
+ "id":
68
+ id,
69
+ "object":
70
+ "chat.completion.chunk",
71
+ "created":
72
+ created,
73
+ "model":
74
+ model,
75
+ "choices": [{
76
+ "index": 0,
77
+ "delta": {
78
+ "content": chunk,
79
+ },
80
+ "finish_reason": None,
81
+ "logprobs": None,
82
+ }],
87
83
  }
88
84
 
89
- def openai_response_format(
85
+ # Final chunk indicating completion
86
+ yield {
87
+ "id": id,
88
+ "object": "chat.completion.chunk",
89
+ "created": created,
90
+ "model": model,
91
+ "choices": [{
92
+ "index": 0,
93
+ "delta": {},
94
+ "finish_reason": finish_reason,
95
+ "logprobs": None,
96
+ }],
97
+ }
98
+
99
+
100
+ def openai_response(
90
101
  generated_text,
91
102
  model="custom-model",
92
103
  id=None,
93
104
  created=None,
94
- usage=None,
105
+ prompt_tokens=None,
106
+ completion_tokens=None,
95
107
  finish_reason="stop",
96
108
  stream=True,
97
109
  ):
98
- if stream:
99
- return _format_streaming_response(
100
- generated_text, model, id, created, finish_reason
101
- )
102
- else:
103
- return _format_non_streaming_response(
104
- generated_text, model, id, created, usage, finish_reason
105
- )
106
- from typing import List, Dict, Union, Optional
107
- import base64
108
- from PIL import Image
109
- import io
110
-
111
- def openai_to_hf_chat_messages(
112
- messages: List[Dict[str, str]],
113
- tokenizer: Optional[object] = None
114
- ) -> List[Dict[str, Union[str, Dict]]]:
115
- """
116
- Converts OpenAI-style chat messages into Hugging Face chat template format.
117
-
118
- Args:
119
- messages: List of OpenAI-style messages (e.g., [{"role": "user", "content": "Hello"}]).
120
- model_family: Optional model family (e.g., "llava", "llama") for special handling.
121
- tokenizer: Optional tokenizer to check for chat template support.
122
-
123
- Returns:
124
- List of messages in Hugging Face chat format.
125
- """
126
- hf_messages = []
127
-
128
- for msg in messages:
129
- role = msg["role"]
130
- content = msg["content"]
131
-
132
- # Handle multimodal content (e.g., images in OpenAI format)
133
- if isinstance(content, list):
134
- # OpenAI-style multimodal: [{"type": "text", "text": "..."}, {"type": "image_url", "image_url": "..."}]
135
- new_content = []
136
- for item in content:
137
- if item["type"] == "text":
138
- new_content.append(item["text"])
139
- elif item["type"] == "image_url":
140
- # Handle image (extract base64 or URL)
141
- image_url = item["image_url"]["url"]
142
- if image_url.startswith("data:image"):
143
- # Base64-encoded image
144
- image_data = image_url.split(",")[1]
145
- image_bytes = base64.b64decode(image_data)
146
- image = Image.open(io.BytesIO(image_bytes))
147
- new_content.append({"image": image})
148
- else:
149
- # URL (model must handle downloads)
150
- new_content.append({"url": image_url})
151
- content = " ".join(new_content) if all(isinstance(c, str) for c in new_content) else new_content
152
- elif not isinstance(content, str):
153
- raise ValueError(f"Unsupported content type: {type(content)}")
154
-
155
- # Add to HF messages
156
- hf_messages.append({"role": role, "content": content})
157
-
158
- # Apply model-specific adjustments
159
- if tokenizer is not None and hasattr(tokenizer, "apply_chat_template"):
160
- # Let Hugging Face tokenizer handle further formatting if needed
161
- try:
162
- return tokenizer.apply_chat_template(hf_messages, tokenize=False)
163
- except:
164
- pass # Fall back to manual formatting
165
-
166
- return hf_messages
167
-
168
- def convert_openai_to_hf_messages(openai_messages):
169
- """
110
+ if stream:
111
+ return _format_streaming_response(generated_text, model, id, created, finish_reason)
112
+ else:
113
+ return _format_non_streaming_response(generated_text, model, id, created, prompt_tokens,
114
+ completion_tokens, finish_reason)
115
+
116
+
117
+ def openai_to_hf_messages(openai_messages):
118
+ """
170
119
  Converts OpenAI-style chat messages into a format compatible with Hugging Face's
171
120
  `tokenizer.apply_chat_template()` function, supporting all modalities (text, images, etc.).
172
-
121
+
173
122
  Args:
174
123
  openai_messages (list): List of OpenAI-style messages, where each message is a dict with
175
124
  'role' (str) and 'content' (str or list of parts).
176
-
125
+
177
126
  Returns:
178
127
  list: Hugging Face-compatible messages. Each message is a dict with 'role' and 'content'.
179
128
  Content is a string (text-only) or a list of parts (multimodal).
180
129
  """
181
- hf_messages = []
182
- for msg in openai_messages:
183
- role = msg['role']
184
- content = msg['content']
185
-
186
- if isinstance(content, list):
187
- # Handle multimodal content (e.g., text + images)
188
- converted_content = []
189
- for part in content:
190
- if part['type'] == 'text':
191
- converted_content.append({'type': 'text', 'text': part['text']})
192
- elif part['type'] == 'image_url':
193
- # Handle image (extract base64 or URL)
194
- image_url = part["image_url"]["url"]
195
- if image_url.startswith("data:image"):
196
- # Base64-encoded image
197
- b64_img = image_url.split(",")[1]
198
- converted_content.append({
199
- 'type': 'image',
200
- 'base64': b64_img
201
- })
202
- else:
203
- # URL (model must handle downloads)
204
- converted_content.append({
205
- 'type': 'image',
206
- 'url': image_url
207
- })
208
- elif part['type'] == 'video_url':
209
- video_url = part["video_url"]["url"]
210
- if video_url.startswith("data:video"):
211
- ValueError("Base64 video data is not supported in HF format.")
212
- else:
213
- # URL (model must handle downloads)
214
- converted_content.append({
215
- 'type': 'video',
216
- 'url': video_url
217
- })
218
- else:
219
- raise ValueError(f"Unsupported content type: {part['type']} for conversion.")
220
- hf_content = converted_content
130
+ hf_messages = []
131
+ for msg in openai_messages:
132
+ role = msg['role']
133
+ content = msg['content']
134
+
135
+ if isinstance(content, list):
136
+ # Handle multimodal content (e.g., text + images)
137
+ converted_content = []
138
+ for part in content:
139
+ if part['type'] == 'text':
140
+ converted_content.append({'type': 'text', 'text': part['text']})
141
+ elif part['type'] == 'image_url':
142
+ # Handle image (extract base64 or URL)
143
+ image_url = part["image_url"]["url"]
144
+ if image_url.startswith("data:image"):
145
+ # Base64-encoded image
146
+ b64_img = image_url.split(",")[1]
147
+ converted_content.append({'type': 'image', 'base64': b64_img})
148
+ else:
149
+ # URL (model must handle downloads)
150
+ converted_content.append({'type': 'image', 'url': image_url})
151
+ elif part['type'] == 'video_url':
152
+ video_url = part["video_url"]["url"]
153
+ if video_url.startswith("data:video"):
154
+ ValueError("Base64 video data is not supported in HF format.")
155
+ else:
156
+ # URL (model must handle downloads)
157
+ converted_content.append({'type': 'video', 'url': video_url})
221
158
  else:
222
- # Text-only content (string)
223
- hf_content = content
224
-
225
- hf_messages.append({'role': role, 'content': hf_content})
226
-
227
- return hf_messages
159
+ raise ValueError(f"Unsupported content type: {part['type']} for conversion.")
160
+ hf_content = converted_content
161
+ else:
162
+ # Text-only content (string)
163
+ hf_content = content
164
+
165
+ hf_messages.append({'role': role, 'content': hf_content})
166
+
167
+ return hf_messages
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.1
2
2
  Name: clarifai
3
- Version: 11.2.4rc2
3
+ Version: 11.2.4rc3
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -35,17 +35,6 @@ Requires-Dist: requests>=2.32.3
35
35
  Requires-Dist: aiohttp>=3.10.0
36
36
  Provides-Extra: all
37
37
  Requires-Dist: pycocotools==2.0.6; extra == "all"
38
- Dynamic: author
39
- Dynamic: author-email
40
- Dynamic: classifier
41
- Dynamic: description
42
- Dynamic: description-content-type
43
- Dynamic: home-page
44
- Dynamic: license
45
- Dynamic: provides-extra
46
- Dynamic: requires-dist
47
- Dynamic: requires-python
48
- Dynamic: summary
49
38
 
50
39
  <h1 align="center">
51
40
  <a href="https://www.clarifai.com/"><img alt="Clarifai" title="Clarifai" src="https://github.com/user-attachments/assets/623b883b-7fe5-4b95-bbfa-8691f5779af4"></a>
@@ -1,4 +1,4 @@
1
- clarifai/__init__.py,sha256=MifEmQdTShs6F9sPHBKRleuDIhSTAInWoN8okWqMJPs,26
1
+ clarifai/__init__.py,sha256=JujgM2t-mATi_SX1natNHTB73fM8G_c1vcI4bMKtqWs,26
2
2
  clarifai/cli.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  clarifai/errors.py,sha256=RwzTajwds51wLD0MVlMC5kcpBnzRpreDLlazPSBZxrg,2605
4
4
  clarifai/versions.py,sha256=jctnczzfGk_S3EnVqb2FjRKfSREkNmvNEwAAa_VoKiQ,222
@@ -138,8 +138,8 @@ clarifai/runners/dockerfile_template/Dockerfile.nim,sha256=CSdUAehj3uOwminioLnT5
138
138
  clarifai/runners/dockerfile_template/Dockerfile.template,sha256=5cjv7U8PmWa3DB_5B1CqSYh_6GE0E0np52TIAa7EIDE,2312
139
139
  clarifai/runners/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
140
  clarifai/runners/models/base_typed_model.py,sha256=0QCWxch8CcyJSKvE1D4PILd2RSnQZHTmx4DXlQQ6dpo,7856
141
- clarifai/runners/models/model_builder.py,sha256=6ezRfKxXYI7jwWUiXdsy2L72Q3dvarqikvQuE5ZraVQ,38849
142
- clarifai/runners/models/model_class.py,sha256=j3oyOCmh-XfFg3UhdquMZ-DxrNSlOGnFlQMNT3fNQSI,14920
141
+ clarifai/runners/models/model_builder.py,sha256=vIUZII9n5wL0SGV4xR6wfsdRvrMv4pSHr6P-KdYpikI,36343
142
+ clarifai/runners/models/model_class.py,sha256=2l7AZ2MrwR8tMIIV7KQSagZIzSwydyIFUOu0uFo-4gI,14742
143
143
  clarifai/runners/models/model_class_refract.py,sha256=HxuozxSW7ag5yWCPxjNwgLArQ6dORhyGXlnpPaZz2-c,3211
144
144
  clarifai/runners/models/model_run_locally.py,sha256=H7FKUBzZ_EPPj1b6P59qbOYr3mUJjJTlD5gavH5e80o,17746
145
145
  clarifai/runners/models/model_runner.py,sha256=T4Qn_x0vky7XdeS54bvipzEmKZMra1tQdAu_u01yyjc,6503
@@ -161,11 +161,11 @@ clarifai/runners/utils/const.py,sha256=9qnOC1Bt6SGLQ9XCQEQ6519XhW4gzcztsV1Rgej67
161
161
  clarifai/runners/utils/data_handler.py,sha256=b7k6MWYPXSgjrfw6wsDf82xFYa0D7UjYmjE4mw5HzHM,8499
162
162
  clarifai/runners/utils/data_handler_refract.py,sha256=3M-V4hkOoF-9Ix4hE6ocXWiTJPc9dewtu6FMtddd-jQ,6343
163
163
  clarifai/runners/utils/data_types.py,sha256=CtcYoW4EFE1EG6JkcP2rcRast9Eac8hFoYRHHCuwl2w,12432
164
- clarifai/runners/utils/data_utils.py,sha256=BuIxcQOudFEle8V6ZvycrYd-6X0i__EQbXxKKF1n7mA,12911
164
+ clarifai/runners/utils/data_utils.py,sha256=ODlBS3USrQM52ZARpoST7yK-CQnxV_myIruAy0oOxS8,12797
165
165
  clarifai/runners/utils/loader.py,sha256=Sl0m29RDtMPx2cIiSbbDFtKHQj2ktXQ5CnkvaHi-zDc,8804
166
166
  clarifai/runners/utils/logger.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
- clarifai/runners/utils/method_signatures.py,sha256=HypEj1EN7pzRPzn-KUu1oOZcKlwfarvYTZXUZ-DEEYQ,18509
168
- clarifai/runners/utils/openai_convertor.py,sha256=tFFNkjcdsNi73DfT_JOqdZZAu8fDYQwpbToWcr62OOw,7650
167
+ clarifai/runners/utils/method_signatures.py,sha256=aMf6CNhrZ48Gy0mbjg3sz7o3kVmIbPiEtKZk8S5D06Q,18509
168
+ clarifai/runners/utils/openai_convertor.py,sha256=qRhq_nGacaLFD_-8oAbPaDhGZJVMtKbgb2A4X7FlhD0,4564
169
169
  clarifai/runners/utils/openai_format.py,sha256=vOrpgqVWmQZGGFANZf0hmR_ksZXsr2-S9WUxvkG5lZs,1980
170
170
  clarifai/runners/utils/serializers.py,sha256=S4sRsOVvH191vAGTRTAAdwLlQwlK4T5QVRDGPptg9nQ,7191
171
171
  clarifai/runners/utils/url_fetcher.py,sha256=v_8JOWmkyFAzsBulsieKX7Nfjy1Yg7wGSZeqfEvw2cg,1640
@@ -233,9 +233,9 @@ clarifai/workflows/__pycache__/__init__.cpython-39.pyc,sha256=9nA--jULSW7OFrYOcs
233
233
  clarifai/workflows/__pycache__/export.cpython-310.pyc,sha256=phEGwi2gAojCUhRTqjZVeTDn7Gk6LCVBeSTjAj4m9iY,2418
234
234
  clarifai/workflows/__pycache__/utils.cpython-310.pyc,sha256=M9_KTM7GOOS5SPrWwAzqHDqyGvgKi3xuSGvyw6MNf-I,1925
235
235
  clarifai/workflows/__pycache__/validate.cpython-310.pyc,sha256=c18Jgp_-CAm8RD_tmUpDCPoqZeexaoWELG0yBzb9rjw,2149
236
- clarifai-11.2.4rc2.dist-info/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
237
- clarifai-11.2.4rc2.dist-info/METADATA,sha256=2NQ4ajyyei0MMGHMBZimPeO7qxqoxMfMvlq1TaNzLRI,22453
238
- clarifai-11.2.4rc2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
239
- clarifai-11.2.4rc2.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
240
- clarifai-11.2.4rc2.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
241
- clarifai-11.2.4rc2.dist-info/RECORD,,
236
+ clarifai-11.2.4rc3.dist-info/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
237
+ clarifai-11.2.4rc3.dist-info/METADATA,sha256=rHJD6tV9a8RvcifQFuQAfGWKLD-m_6A45Yc9796WRfI,22215
238
+ clarifai-11.2.4rc3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
239
+ clarifai-11.2.4rc3.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
240
+ clarifai-11.2.4rc3.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
241
+ clarifai-11.2.4rc3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: bdist_wheel (0.45.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5