clarifai 11.4.3rc1__py3-none-any.whl → 11.4.5__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.
Files changed (155) hide show
  1. clarifai/__init__.py +1 -1
  2. clarifai/cli/base.py +1 -2
  3. clarifai/cli/model.py +0 -2
  4. clarifai/client/app.py +2 -1
  5. clarifai/client/auth/helper.py +6 -4
  6. clarifai/client/compute_cluster.py +2 -1
  7. clarifai/client/dataset.py +2 -1
  8. clarifai/client/deployment.py +2 -1
  9. clarifai/client/input.py +2 -1
  10. clarifai/client/model.py +2 -1
  11. clarifai/client/model_client.py +2 -2
  12. clarifai/client/module.py +2 -1
  13. clarifai/client/nodepool.py +2 -1
  14. clarifai/client/runner.py +2 -1
  15. clarifai/client/search.py +2 -1
  16. clarifai/client/user.py +2 -1
  17. clarifai/client/workflow.py +2 -1
  18. clarifai/runners/__init__.py +2 -0
  19. clarifai/runners/models/dummy_openai_model.py +197 -0
  20. clarifai/runners/models/mcp_class.py +19 -39
  21. clarifai/runners/models/model_builder.py +46 -42
  22. clarifai/runners/models/openai_class.py +219 -0
  23. clarifai/runners/utils/code_script.py +41 -15
  24. clarifai/runners/utils/data_types/data_types.py +48 -0
  25. clarifai/runners/utils/data_utils.py +67 -43
  26. clarifai/runners/utils/method_signatures.py +0 -20
  27. clarifai/runners/utils/openai_convertor.py +103 -0
  28. clarifai/urls/helper.py +80 -12
  29. clarifai/utils/config.py +1 -1
  30. clarifai/utils/constants.py +4 -0
  31. {clarifai-11.4.3rc1.dist-info → clarifai-11.4.5.dist-info}/METADATA +13 -2
  32. clarifai-11.4.5.dist-info/RECORD +114 -0
  33. {clarifai-11.4.3rc1.dist-info → clarifai-11.4.5.dist-info}/WHEEL +1 -1
  34. clarifai/__pycache__/__init__.cpython-312.pyc +0 -0
  35. clarifai/__pycache__/__init__.cpython-39.pyc +0 -0
  36. clarifai/__pycache__/errors.cpython-312.pyc +0 -0
  37. clarifai/__pycache__/errors.cpython-39.pyc +0 -0
  38. clarifai/__pycache__/versions.cpython-312.pyc +0 -0
  39. clarifai/__pycache__/versions.cpython-39.pyc +0 -0
  40. clarifai/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  41. clarifai/cli/__pycache__/base.cpython-312.pyc +0 -0
  42. clarifai/cli/__pycache__/compute_cluster.cpython-312.pyc +0 -0
  43. clarifai/cli/__pycache__/deployment.cpython-312.pyc +0 -0
  44. clarifai/cli/__pycache__/model.cpython-312.pyc +0 -0
  45. clarifai/cli/__pycache__/nodepool.cpython-312.pyc +0 -0
  46. clarifai/client/__pycache__/__init__.cpython-312.pyc +0 -0
  47. clarifai/client/__pycache__/__init__.cpython-39.pyc +0 -0
  48. clarifai/client/__pycache__/app.cpython-312.pyc +0 -0
  49. clarifai/client/__pycache__/app.cpython-39.pyc +0 -0
  50. clarifai/client/__pycache__/base.cpython-312.pyc +0 -0
  51. clarifai/client/__pycache__/base.cpython-39.pyc +0 -0
  52. clarifai/client/__pycache__/compute_cluster.cpython-312.pyc +0 -0
  53. clarifai/client/__pycache__/dataset.cpython-312.pyc +0 -0
  54. clarifai/client/__pycache__/deployment.cpython-312.pyc +0 -0
  55. clarifai/client/__pycache__/input.cpython-312.pyc +0 -0
  56. clarifai/client/__pycache__/lister.cpython-312.pyc +0 -0
  57. clarifai/client/__pycache__/model.cpython-312.pyc +0 -0
  58. clarifai/client/__pycache__/model_client.cpython-312.pyc +0 -0
  59. clarifai/client/__pycache__/module.cpython-312.pyc +0 -0
  60. clarifai/client/__pycache__/nodepool.cpython-312.pyc +0 -0
  61. clarifai/client/__pycache__/runner.cpython-312.pyc +0 -0
  62. clarifai/client/__pycache__/search.cpython-312.pyc +0 -0
  63. clarifai/client/__pycache__/user.cpython-312.pyc +0 -0
  64. clarifai/client/__pycache__/workflow.cpython-312.pyc +0 -0
  65. clarifai/client/auth/__pycache__/__init__.cpython-312.pyc +0 -0
  66. clarifai/client/auth/__pycache__/__init__.cpython-39.pyc +0 -0
  67. clarifai/client/auth/__pycache__/helper.cpython-312.pyc +0 -0
  68. clarifai/client/auth/__pycache__/helper.cpython-39.pyc +0 -0
  69. clarifai/client/auth/__pycache__/register.cpython-312.pyc +0 -0
  70. clarifai/client/auth/__pycache__/register.cpython-39.pyc +0 -0
  71. clarifai/client/auth/__pycache__/stub.cpython-312.pyc +0 -0
  72. clarifai/client/auth/__pycache__/stub.cpython-39.pyc +0 -0
  73. clarifai/constants/__pycache__/base.cpython-312.pyc +0 -0
  74. clarifai/constants/__pycache__/base.cpython-39.pyc +0 -0
  75. clarifai/constants/__pycache__/dataset.cpython-312.pyc +0 -0
  76. clarifai/constants/__pycache__/input.cpython-312.pyc +0 -0
  77. clarifai/constants/__pycache__/model.cpython-312.pyc +0 -0
  78. clarifai/constants/__pycache__/rag.cpython-312.pyc +0 -0
  79. clarifai/constants/__pycache__/search.cpython-312.pyc +0 -0
  80. clarifai/constants/__pycache__/workflow.cpython-312.pyc +0 -0
  81. clarifai/datasets/__pycache__/__init__.cpython-312.pyc +0 -0
  82. clarifai/datasets/export/__pycache__/__init__.cpython-312.pyc +0 -0
  83. clarifai/datasets/export/__pycache__/inputs_annotations.cpython-312.pyc +0 -0
  84. clarifai/datasets/upload/__pycache__/__init__.cpython-312.pyc +0 -0
  85. clarifai/datasets/upload/__pycache__/base.cpython-312.pyc +0 -0
  86. clarifai/datasets/upload/__pycache__/features.cpython-312.pyc +0 -0
  87. clarifai/datasets/upload/__pycache__/image.cpython-312.pyc +0 -0
  88. clarifai/datasets/upload/__pycache__/multimodal.cpython-312.pyc +0 -0
  89. clarifai/datasets/upload/__pycache__/text.cpython-312.pyc +0 -0
  90. clarifai/datasets/upload/__pycache__/utils.cpython-312.pyc +0 -0
  91. clarifai/datasets/upload/loaders/__pycache__/__init__.cpython-312.pyc +0 -0
  92. clarifai/datasets/upload/loaders/__pycache__/coco_detection.cpython-312.pyc +0 -0
  93. clarifai/datasets/upload/loaders/__pycache__/imagenet_classification.cpython-312.pyc +0 -0
  94. clarifai/modules/__pycache__/__init__.cpython-312.pyc +0 -0
  95. clarifai/modules/__pycache__/css.cpython-312.pyc +0 -0
  96. clarifai/rag/__pycache__/__init__.cpython-312.pyc +0 -0
  97. clarifai/rag/__pycache__/rag.cpython-312.pyc +0 -0
  98. clarifai/rag/__pycache__/utils.cpython-312.pyc +0 -0
  99. clarifai/runners/__pycache__/__init__.cpython-312.pyc +0 -0
  100. clarifai/runners/__pycache__/__init__.cpython-39.pyc +0 -0
  101. clarifai/runners/__pycache__/server.cpython-312.pyc +0 -0
  102. clarifai/runners/models/__pycache__/__init__.cpython-312.pyc +0 -0
  103. clarifai/runners/models/__pycache__/__init__.cpython-39.pyc +0 -0
  104. clarifai/runners/models/__pycache__/base_typed_model.cpython-312.pyc +0 -0
  105. clarifai/runners/models/__pycache__/mcp_class.cpython-312.pyc +0 -0
  106. clarifai/runners/models/__pycache__/model_builder.cpython-312.pyc +0 -0
  107. clarifai/runners/models/__pycache__/model_builder.cpython-39.pyc +0 -0
  108. clarifai/runners/models/__pycache__/model_class.cpython-312.pyc +0 -0
  109. clarifai/runners/models/__pycache__/model_run_locally.cpython-312.pyc +0 -0
  110. clarifai/runners/models/__pycache__/model_runner.cpython-312.pyc +0 -0
  111. clarifai/runners/models/__pycache__/model_servicer.cpython-312.pyc +0 -0
  112. clarifai/runners/models/__pycache__/test_model_builder.cpython-312-pytest-8.3.5.pyc +0 -0
  113. clarifai/runners/models/base_typed_model.py +0 -238
  114. clarifai/runners/models/example_mcp_server.py +0 -44
  115. clarifai/runners/models/mcp_class.py~ +0 -149
  116. clarifai/runners/models/test_model_builder.py +0 -89
  117. clarifai/runners/utils/__pycache__/__init__.cpython-312.pyc +0 -0
  118. clarifai/runners/utils/__pycache__/code_script.cpython-312.pyc +0 -0
  119. clarifai/runners/utils/__pycache__/const.cpython-312.pyc +0 -0
  120. clarifai/runners/utils/__pycache__/data_handler.cpython-312.pyc +0 -0
  121. clarifai/runners/utils/__pycache__/data_types.cpython-312.pyc +0 -0
  122. clarifai/runners/utils/__pycache__/data_utils.cpython-312.pyc +0 -0
  123. clarifai/runners/utils/__pycache__/loader.cpython-312.pyc +0 -0
  124. clarifai/runners/utils/__pycache__/method_signatures.cpython-312.pyc +0 -0
  125. clarifai/runners/utils/__pycache__/serializers.cpython-312.pyc +0 -0
  126. clarifai/runners/utils/__pycache__/url_fetcher.cpython-312.pyc +0 -0
  127. clarifai/runners/utils/data_handler.py +0 -231
  128. clarifai/runners/utils/data_types/__pycache__/__init__.cpython-312.pyc +0 -0
  129. clarifai/runners/utils/data_types/__pycache__/data_types.cpython-312.pyc +0 -0
  130. clarifai/schema/__pycache__/search.cpython-312.pyc +0 -0
  131. clarifai/urls/__pycache__/helper.cpython-312.pyc +0 -0
  132. clarifai/utils/__pycache__/__init__.cpython-312.pyc +0 -0
  133. clarifai/utils/__pycache__/__init__.cpython-39.pyc +0 -0
  134. clarifai/utils/__pycache__/cli.cpython-312.pyc +0 -0
  135. clarifai/utils/__pycache__/config.cpython-312.pyc +0 -0
  136. clarifai/utils/__pycache__/constants.cpython-312.pyc +0 -0
  137. clarifai/utils/__pycache__/constants.cpython-39.pyc +0 -0
  138. clarifai/utils/__pycache__/logging.cpython-312.pyc +0 -0
  139. clarifai/utils/__pycache__/logging.cpython-39.pyc +0 -0
  140. clarifai/utils/__pycache__/misc.cpython-312.pyc +0 -0
  141. clarifai/utils/__pycache__/misc.cpython-39.pyc +0 -0
  142. clarifai/utils/__pycache__/model_train.cpython-312.pyc +0 -0
  143. clarifai/utils/__pycache__/protobuf.cpython-312.pyc +0 -0
  144. clarifai/utils/config.py~ +0 -145
  145. clarifai/utils/evaluation/__pycache__/__init__.cpython-312.pyc +0 -0
  146. clarifai/utils/evaluation/__pycache__/helpers.cpython-312.pyc +0 -0
  147. clarifai/utils/evaluation/__pycache__/main.cpython-312.pyc +0 -0
  148. clarifai/workflows/__pycache__/__init__.cpython-312.pyc +0 -0
  149. clarifai/workflows/__pycache__/export.cpython-312.pyc +0 -0
  150. clarifai/workflows/__pycache__/utils.cpython-312.pyc +0 -0
  151. clarifai/workflows/__pycache__/validate.cpython-312.pyc +0 -0
  152. clarifai-11.4.3rc1.dist-info/RECORD +0 -230
  153. {clarifai-11.4.3rc1.dist-info → clarifai-11.4.5.dist-info}/entry_points.txt +0 -0
  154. {clarifai-11.4.3rc1.dist-info → clarifai-11.4.5.dist-info/licenses}/LICENSE +0 -0
  155. {clarifai-11.4.3rc1.dist-info → clarifai-11.4.5.dist-info}/top_level.txt +0 -0
@@ -1,63 +1,89 @@
1
+ import base64
1
2
  import json
2
3
  import math
3
4
  import operator
4
5
  from io import BytesIO
5
- from typing import List
6
+ from typing import Dict, List
6
7
 
8
+ import requests
7
9
  from clarifai_grpc.grpc.api import resources_pb2
8
10
  from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeEnumOption, ModelTypeRangeInfo
9
11
  from clarifai_grpc.grpc.api.resources_pb2 import ModelTypeField as ParamProto
10
- from PIL import Image
12
+ from PIL import Image as PILImage
11
13
 
12
- from clarifai.runners.utils.data_types import MessageData
14
+ from clarifai.runners.utils.data_types import Audio, Image, MessageData, Video
13
15
 
14
16
 
15
- def image_to_bytes(img: Image.Image, format="JPEG") -> bytes:
17
+ def image_to_bytes(img: PILImage.Image, format="JPEG") -> bytes:
16
18
  buffered = BytesIO()
17
19
  img.save(buffered, format=format)
18
20
  img_str = buffered.getvalue()
19
21
  return img_str
20
22
 
21
23
 
22
- def bytes_to_image(bytes_img) -> Image.Image:
23
- img = Image.open(BytesIO(bytes_img))
24
+ def bytes_to_image(bytes_img) -> PILImage.Image:
25
+ img = PILImage.open(BytesIO(bytes_img))
24
26
  return img
25
27
 
26
28
 
27
- def is_openai_chat_format(messages):
28
- """
29
- Verify if the given argument follows the OpenAI chat messages format.
30
-
31
- Args:
32
- messages (list): A list of dictionaries representing chat messages.
33
-
34
- Returns:
35
- bool: True if valid, False otherwise.
36
- """
37
- if not isinstance(messages, list):
38
- return False
39
-
40
- valid_roles = {"system", "user", "assistant", "function"}
41
-
42
- for msg in messages:
43
- if not isinstance(msg, dict):
44
- return False
45
- if "role" not in msg or "content" not in msg:
46
- return False
47
- if msg["role"] not in valid_roles:
48
- return False
49
-
50
- content = msg["content"]
51
-
52
- # Content should be either a string (text message) or a multimodal list
53
- if isinstance(content, str):
54
- continue # Valid text message
55
-
56
- elif isinstance(content, list):
57
- for item in content:
58
- if not isinstance(item, dict):
59
- return False
60
- return True
29
+ def process_image(image: Image) -> Dict:
30
+ """Convert Clarifai Image object to OpenAI image format."""
31
+
32
+ if image.bytes:
33
+ b64_img = image.to_base64_str()
34
+ return {'type': 'image_url', 'image_url': {'url': f"data:image/jpeg;base64,{b64_img}"}}
35
+ elif image.url:
36
+ return {'type': 'image_url', 'image_url': {'url': image.url}}
37
+ else:
38
+ raise ValueError("Image must contain either bytes or URL")
39
+
40
+
41
+ def process_audio(audio: Audio) -> Dict:
42
+ """Convert Clarifai Audio object to OpenAI audio format."""
43
+
44
+ if audio.bytes:
45
+ audio = audio.to_base64_str()
46
+ audio = {
47
+ "type": "input_audio",
48
+ "input_audio": {"data": audio, "format": "wav"},
49
+ }
50
+ elif audio.url:
51
+ response = requests.get(audio.url)
52
+ if response.status_code != 200:
53
+ raise ValueError(f"Failed to fetch audio from URL: {audio.url}")
54
+ audio_base64_str = base64.b64encode(response.content).decode('utf-8')
55
+ audio = {
56
+ "type": "input_audio",
57
+ "input_audio": {"data": audio_base64_str, "format": "wav"},
58
+ }
59
+ else:
60
+ raise ValueError("Audio must contain either bytes or URL")
61
+
62
+ return audio
63
+
64
+
65
+ def process_video(video: Video) -> Dict:
66
+ """Convert Clarifai Video object to OpenAI video format."""
67
+
68
+ if video.bytes:
69
+ video = "data:video/mp4;base64," + video.to_base64_str()
70
+ video = {
71
+ "type": "video_url",
72
+ "video_url": {"url": video},
73
+ }
74
+ elif video.url:
75
+ response = requests.get(video.url)
76
+ if response.status_code != 200:
77
+ raise ValueError(f"Failed to fetch video from URL: {video.url}")
78
+ video_base64_str = base64.b64encode(response.content).decode('utf-8')
79
+ video = {
80
+ "type": "video_url",
81
+ "video_url": {"url": video_base64_str},
82
+ }
83
+ else:
84
+ raise ValueError("Video must contain either bytes or URL")
85
+
86
+ return video
61
87
 
62
88
 
63
89
  class Param(MessageData):
@@ -294,9 +320,7 @@ class Param(MessageData):
294
320
  proto.model_type_range_info.CopyFrom(range_info)
295
321
  proto.is_param = self.is_param
296
322
 
297
- if self.default is not None:
298
- proto = self.set_default(proto, self.default)
299
-
323
+ proto = self.set_default(proto, self.default)
300
324
  return proto
301
325
 
302
326
  @classmethod
@@ -74,32 +74,12 @@ def build_function_signature(func):
74
74
  assert method_type in ('UNARY_UNARY', 'UNARY_STREAMING', 'STREAMING_STREAMING')
75
75
  # method_signature.method_type = method_type
76
76
  method_signature.description = inspect.cleandoc(func.__doc__ or '')
77
- # method_signature.annotations_json = json.dumps(_get_annotations_source(func))
78
77
 
79
78
  method_signature.input_fields.extend(input_sigs)
80
79
  method_signature.output_fields.append(output_sig)
81
80
  return method_signature
82
81
 
83
82
 
84
- # def _get_annotations_source(func):
85
- # """Extracts raw annotation strings from the function source."""
86
- # source = inspect.getsource(func) # Get function source code
87
- # source = textwrap.dedent(source) # Dedent source code
88
- # tree = ast.parse(source) # Parse into AST
89
- # func_node = next(node for node in tree.body
90
- # if isinstance(node, ast.FunctionDef)) # Get function node
91
-
92
- # annotations = {}
93
- # for arg in func_node.args.args: # Process arguments
94
- # if arg.annotation:
95
- # annotations[arg.arg] = ast.unparse(arg.annotation) # Get raw annotation string
96
-
97
- # if func_node.returns: # Process return type
98
- # annotations["return"] = ast.unparse(func_node.returns)
99
-
100
- # return annotations
101
-
102
-
103
83
  def _process_input_field(field: resources_pb2.ModelTypeField) -> str:
104
84
  base_type = _get_base_type(field)
105
85
  if field.iterator:
@@ -1,5 +1,9 @@
1
1
  import time
2
2
  import uuid
3
+ from typing import Dict, List
4
+
5
+ from clarifai.runners.utils.data_types import Audio, Image, Video
6
+ from clarifai.runners.utils.data_utils import process_audio, process_image, process_video
3
7
 
4
8
 
5
9
  def generate_id():
@@ -164,3 +168,102 @@ def openai_to_hf_messages(openai_messages):
164
168
  hf_messages.append({'role': role, 'content': hf_content})
165
169
 
166
170
  return hf_messages
171
+
172
+
173
+ def build_openai_messages(
174
+ prompt: str = None,
175
+ image: Image = None,
176
+ images: List[Image] = None,
177
+ audio: Audio = None,
178
+ audios: List[Audio] = None,
179
+ video: Video = None,
180
+ videos: List[Video] = None,
181
+ messages: List[Dict] = None,
182
+ ) -> List[Dict]:
183
+ """
184
+ Construct OpenAI-compatible messages from input components.
185
+ Args:
186
+ prompt (str): The prompt text.
187
+ image (Image): Clarifai Image object.
188
+ images (List[Image]): List of Clarifai Image objects.
189
+ audio (Audio): Clarifai Audio object.
190
+ audios (List[Audio]): List of Clarifai Audio objects.
191
+ video (Video): Clarifai Video object.
192
+ videos (List[Video]): List of Clarifai Video objects.
193
+ messages (List[Dict]): List of chat messages.
194
+ Returns:
195
+ List[Dict]: Formatted chat messages.
196
+ """
197
+
198
+ openai_messages = []
199
+ # Add previous conversation history
200
+ if messages and is_openai_chat_format(messages):
201
+ openai_messages.extend(messages)
202
+
203
+ content = []
204
+ if prompt.strip():
205
+ # Build content array for current message
206
+ content.append({'type': 'text', 'text': prompt})
207
+ # Add single image if present
208
+ if image:
209
+ content.append(process_image(image))
210
+ # Add multiple images if present
211
+ if images:
212
+ for img in images:
213
+ content.append(process_image(img))
214
+ # Add single audio if present
215
+ if audio:
216
+ content.append(process_audio(audio))
217
+ # Add multiple audios if present
218
+ if audios:
219
+ for audio in audios:
220
+ content.append(process_audio(audio))
221
+ # Add single video if present
222
+ if video:
223
+ content.append(process_video(video))
224
+ # Add multiple videos if present
225
+ if videos:
226
+ for video in videos:
227
+ content.append(process_video(video))
228
+
229
+ if content:
230
+ # Append complete user message
231
+ openai_messages.append({'role': 'user', 'content': content})
232
+
233
+ return openai_messages
234
+
235
+
236
+ def is_openai_chat_format(messages):
237
+ """
238
+ Verify if the given argument follows the OpenAI chat messages format.
239
+
240
+ Args:
241
+ messages (list): A list of dictionaries representing chat messages.
242
+
243
+ Returns:
244
+ bool: True if valid, False otherwise.
245
+ """
246
+ if not isinstance(messages, list):
247
+ return False
248
+
249
+ valid_roles = {"system", "user", "assistant", "function"}
250
+
251
+ for msg in messages:
252
+ if not isinstance(msg, dict):
253
+ return False
254
+ if "role" not in msg or "content" not in msg:
255
+ return False
256
+ if msg["role"] not in valid_roles:
257
+ return False
258
+
259
+ content = msg["content"]
260
+
261
+ # Content should be either a string (text message) or a multimodal list
262
+ if isinstance(content, str):
263
+ continue # Valid text message
264
+
265
+ elif isinstance(content, list):
266
+ for item in content:
267
+ if not isinstance(item, dict):
268
+ return False
269
+ return True
clarifai/urls/helper.py CHANGED
@@ -1,10 +1,25 @@
1
+ import os
2
+ from collections import namedtuple
1
3
  from urllib.parse import urlparse
2
4
 
5
+ from clarifai.utils.constants import DEFAULT_BASE, DEFAULT_UI
6
+
7
+ # To help with using ClarifaiUrlHelper with defaults as ClarifaiUrlHelper()
8
+ auth_obj = namedtuple("auth", ["ui", "base"])
9
+ default_auth = auth_obj(
10
+ ui=os.environ.get("CLARIFAI_UI", DEFAULT_UI),
11
+ base=os.environ.get("CLARIFAI_API_BASE", DEFAULT_BASE),
12
+ )
13
+
3
14
 
4
15
  class ClarifaiUrlHelper(object):
5
16
  """Lots of helper functionality for dealing with urls around modules."""
6
17
 
7
- def __init__(self, auth, module_manager_imv_id="module_manager_install"):
18
+ def __init__(
19
+ self,
20
+ auth=default_auth,
21
+ module_manager_imv_id: str = "module_manager_install",
22
+ ):
8
23
  """
9
24
  Args:
10
25
  auth: a ClarifaiAuthHelper object.
@@ -13,13 +28,17 @@ class ClarifaiUrlHelper(object):
13
28
  self._module_manager_imv_id = module_manager_imv_id
14
29
 
15
30
  @property
16
- def auth(self):
17
- return self._auth
31
+ def ui(self):
32
+ return self._auth.ui
33
+
34
+ @property
35
+ def base(self):
36
+ return self._auth.base
18
37
 
19
38
  def module_ui_url(self, user_id, app_id, module_id, module_version_id):
20
39
  """This is the path to the module in community."""
21
40
  return "%s/%s/%s/modules/%s/versions/%s" % (
22
- self.auth.ui,
41
+ self.ui,
23
42
  user_id,
24
43
  app_id,
25
44
  module_id,
@@ -30,7 +49,7 @@ class ClarifaiUrlHelper(object):
30
49
  """This is a url that allows for installation of the module from the community at 'module_url'
31
50
  into the destination app_id of the destination user_id."""
32
51
  return "%s/%s/%s/installed_module_versions/%s/install?install=%s" % (
33
- self.auth.ui,
52
+ self.ui,
34
53
  dest_user_id,
35
54
  dest_app_id,
36
55
  self._module_manager_imv_id,
@@ -39,22 +58,51 @@ class ClarifaiUrlHelper(object):
39
58
 
40
59
  def imv_ui_url(self, dest_user_id, dest_app_id, imv_id):
41
60
  return "%s/%s/%s/installed_module_versions/%s" % (
42
- self.auth.ui,
61
+ self.ui,
43
62
  dest_user_id,
44
63
  dest_app_id,
45
64
  imv_id,
46
65
  )
47
66
 
48
- def clarifai_url(self, user_id, app_id, resource_type, resource_id, version_id: str = None):
49
- """This is the path to the resource in community.
67
+ def api_url(self, user_id, app_id, resource_type, resource_id, version_id: str = None):
68
+ """This is the path to the resource in the API.
69
+
70
+ Example:
71
+ https://api.clarifai.com/v2/zeiler/app/modules/module1/versions/2
72
+ https://api.clarifai.com/v2/zeiler/app/models/model1/versions/2
73
+ https://api.clarifai.com/v2/zeiler/app/concepts/concept1
74
+ https://api.clarifai.com/v2/zeiler/app/workflows/workflow1
75
+ https://api.clarifai.com/v2/zeiler/app/tasks/task1
76
+ https://api.clarifai.com/v2/zeiler/app/installed_module_versions/module_manager_install
50
77
 
51
78
  Args:
52
79
  user_id: the author of the resource.
53
80
  app_id: the author's app the resource was created in.
54
- resource_type: the type of resource. One of "modules", "models", "concepts", "inputs", "workflows", "tasks", "installed_module_versions"
81
+ resource_type: the type of resource. One of "modules", "models", "concepts", "inputs", "workflows", "tasks"
55
82
  resource_id: the resource ID
56
- version_id: the version of the resource.
57
83
  """
84
+ self._validate_resource_type(resource_type)
85
+ if version_id is None:
86
+ return "%s/v2/users/%s/apps/%s/%s/%s" % (
87
+ self.base,
88
+ user_id,
89
+ app_id,
90
+ resource_type,
91
+ resource_id,
92
+ )
93
+
94
+ if resource_type in ["concepts", "tasks", "installed_module_versions"]:
95
+ raise ValueError(f"{resource_type} do not have versions.")
96
+ return "%s/v2/users/%s/apps/%s/%s/%s/versions/%s" % (
97
+ self.base,
98
+ user_id,
99
+ app_id,
100
+ resource_type,
101
+ resource_id,
102
+ version_id,
103
+ )
104
+
105
+ def _validate_resource_type(self, resource_type):
58
106
  if resource_type not in [
59
107
  "modules",
60
108
  "models",
@@ -68,10 +116,30 @@ class ClarifaiUrlHelper(object):
68
116
  "resource_type must be one of modules, models, concepts, inputs, workflows, tasks, installed_module_versions but was %s"
69
117
  % resource_type
70
118
  )
119
+
120
+ def clarifai_url(self, user_id, app_id, resource_type, resource_id, version_id: str = None):
121
+ """This is the path to the resource in community UI.
122
+
123
+ Example:
124
+ https://clarifai.com/zeiler/modules/module1/versions/2
125
+ https://clarifai.com/zeiler/models/model1/versions/2
126
+ https://clarifai.com/zeiler/concepts/concept1
127
+ https://clarifai.com/zeiler/workflows/workflow1
128
+ https://clarifai.com/zeiler/tasks/task1
129
+ https://clarifai.com/zeiler/installed_module_versions/module_manager_install
130
+
131
+ Args:
132
+ user_id: the author of the resource.
133
+ app_id: the author's app the resource was created in.
134
+ resource_type: the type of resource. One of "modules", "models", "concepts", "inputs", "workflows", "tasks", "installed_module_versions"
135
+ resource_id: the resource ID
136
+ version_id: the version of the resource.
137
+ """
138
+ self._validate_resource_type(resource_type)
71
139
  if version_id is None:
72
- return "%s/%s/%s/%s/%s" % (self.auth.ui, user_id, app_id, resource_type, resource_id)
140
+ return "%s/%s/%s/%s/%s" % (self.ui, user_id, app_id, resource_type, resource_id)
73
141
  return "%s/%s/%s/%s/%s/versions/%s" % (
74
- self.auth.ui,
142
+ self.ui,
75
143
  user_id,
76
144
  app_id,
77
145
  resource_type,
clarifai/utils/config.py CHANGED
@@ -113,7 +113,7 @@ class Context(OrderedDict):
113
113
  Config.from_yaml().current.print_env_vars()
114
114
 
115
115
  """
116
- for k, v in self['env'].items():
116
+ for k, v in sorted(self['env'].items()):
117
117
  if isinstance(v, dict):
118
118
  continue
119
119
  envvar_name = k.upper()
@@ -1,5 +1,9 @@
1
1
  import os
2
2
 
3
+ DEFAULT_UI = os.environ.get("CLARIFAI_UI", "https://clarifai.com")
4
+ DEFAULT_BASE = os.environ.get("CLARIFAI_API_BASE", "https://api.clarifai.com")
5
+
6
+
3
7
  CLARIFAI_PAT_ENV_VAR = "CLARIFAI_PAT"
4
8
  CLARIFAI_SESSION_TOKEN_ENV_VAR = "CLARIFAI_SESSION_TOKEN"
5
9
  CLARIFAI_USER_ID_ENV_VAR = "CLARIFAI_USER_ID"
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: clarifai
3
- Version: 11.4.3rc1
3
+ Version: 11.4.5
4
4
  Home-page: https://github.com/Clarifai/clarifai-python
5
5
  Author: Clarifai
6
6
  Author-email: support@clarifai.com
@@ -33,6 +33,17 @@ Requires-Dist: requests>=2.32.3
33
33
  Requires-Dist: aiohttp>=3.10.0
34
34
  Provides-Extra: all
35
35
  Requires-Dist: pycocotools>=2.0.7; extra == "all"
36
+ Dynamic: author
37
+ Dynamic: author-email
38
+ Dynamic: classifier
39
+ Dynamic: description
40
+ Dynamic: description-content-type
41
+ Dynamic: home-page
42
+ Dynamic: license
43
+ Dynamic: license-file
44
+ Dynamic: provides-extra
45
+ Dynamic: requires-dist
46
+ Dynamic: requires-python
36
47
 
37
48
  <h1 align="center">
38
49
  <a href="https://www.clarifai.com/"><img alt="Clarifai" title="Clarifai" src="https://github.com/user-attachments/assets/623b883b-7fe5-4b95-bbfa-8691f5779af4"></a>
@@ -0,0 +1,114 @@
1
+ clarifai/__init__.py,sha256=kV7nbYrWnc8FLLQtKI_7asjBj6k3ELmICuzhSmhU4Mk,23
2
+ clarifai/cli.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ clarifai/errors.py,sha256=GXa6D4v_L404J83jnRNFPH7s-1V9lk7w6Ws99f1g-AY,2772
4
+ clarifai/versions.py,sha256=ecSuEB_nOL2XSoYHDw2n23XUbm_KPOGjudMXmQrGdS8,224
5
+ clarifai/cli/README.md,sha256=YGApHfeUyu5P0Pdth-mqQCQftWHDxz6bugDlvDXDhOE,1942
6
+ clarifai/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ clarifai/cli/__main__.py,sha256=7nPbLW7Jr2shkgMPvnxpn4xYGMvIcnqluJ69t9w4H_k,74
8
+ clarifai/cli/base.py,sha256=Rk87oliNs3q-pVX2ubyjycgo4Gtd0hcDSgr9MqDxyko,8227
9
+ clarifai/cli/compute_cluster.py,sha256=8Xss0Obrp6l1XuxJe0luOqU_pf8vXGDRi6jyIe8qR6k,2282
10
+ clarifai/cli/deployment.py,sha256=9C4I6_kyMxRkWl6h681wc79-3mAtDHtTUaxRv05OZMs,4262
11
+ clarifai/cli/model.py,sha256=M1O0QCdIyTcn2GzrkROAtgWR-8SX2WV9nz0l84rkiG4,27375
12
+ clarifai/cli/nodepool.py,sha256=H6OIdUW_EiyDUwZogzEDoYmVwEjLMsgoDlPyE7gjIuU,4245
13
+ clarifai/client/__init__.py,sha256=NhpNFRJY6mTi8ca-5hUeTEmYeDKHDNXY48FN63pDuos,703
14
+ clarifai/client/app.py,sha256=D0FG9v07g1dExLnQsYt0OQjsJCkVvuw76BOpcqaCzfM,41380
15
+ clarifai/client/base.py,sha256=zOmB5HJP_-NmF2BPka14W7VUeJ1OF-fNxeacLsaRj3E,8775
16
+ clarifai/client/compute_cluster.py,sha256=ViPyh-FibXL1J0ypsVOTaQnR1ymKohmZEuA13RwA-hc,10254
17
+ clarifai/client/dataset.py,sha256=OgdpZkQ_vYmRxL8-qphcNozpvPV1bWTlte9Jv6UkKb8,35299
18
+ clarifai/client/deployment.py,sha256=QBf0tzkKBEpzNgmOEmWUJMOlVWdFEFc70Y44o8y75Gs,2875
19
+ clarifai/client/input.py,sha256=jpX47qwn7aUBBIEuSSLHF5jk70XaWEh0prD065c9b-E,51205
20
+ clarifai/client/lister.py,sha256=1YEm2suNxPaJO4x9V5szgD_YX6N_00vgSO-7m0HagY8,2208
21
+ clarifai/client/model.py,sha256=XptnbfvNnaRCvv6Sdc7hfZnEPL8z9_-nFB3OmKujfAE,86267
22
+ clarifai/client/model_client.py,sha256=XOrrm1xOZt62eLX5KbvV-zKSpK4EJOPUTUrGnH8z_KE,22392
23
+ clarifai/client/module.py,sha256=jLViQYvVV3FmRN_ivvbk83uwsx7CgYGeEx4dYAr6yD4,4537
24
+ clarifai/client/nodepool.py,sha256=Y5zQ0JLdTjAp2TmVnx7AAOwaB2YUslk3nl7s6BQ90FQ,16415
25
+ clarifai/client/runner.py,sha256=5xCiqByGGscfNm0IjHelhDTx8-9l8G0C3HL-3YZogK8,2253
26
+ clarifai/client/search.py,sha256=3LLfATrdU43a0mRNITmJV-E53bhfafZkYsbwkTtlnyU,15661
27
+ clarifai/client/user.py,sha256=VqY5j75wJqw1AeaWpZLvbNfSjQHGQm_bdjknDjX_fQY,18394
28
+ clarifai/client/workflow.py,sha256=Bqh8lAmJcSbviJebckchTxucYlU11UQEhFSov7elpsk,13417
29
+ clarifai/client/auth/__init__.py,sha256=7EwR0NrozkAUwpUnCsqXvE_p0wqx_SelXlSpKShKJK0,136
30
+ clarifai/client/auth/helper.py,sha256=kHBi8GTX19EUiD9n_QgCqilv127TDIpP0_o5MMtzFdY,15167
31
+ clarifai/client/auth/register.py,sha256=pyY-Kg_64WpN6rXz1SyEzfqL14BS4yADtuYMxLJ4jx4,554
32
+ clarifai/client/auth/stub.py,sha256=pU4FYeghooCBZmCRyNTdDfJaVe4WyeRBqE3xVwfmMTY,5388
33
+ clarifai/constants/base.py,sha256=ogmFSZYoF0YhGjHg5aiOc3MLqPr_poKAls6xaD0_C3U,89
34
+ clarifai/constants/dataset.py,sha256=9saFE_VxCTCMlPTQbOU4KM_SzN_TQjwsrsFnpsc_Epo,556
35
+ clarifai/constants/input.py,sha256=WcHwToUVIK9ItAhDefaSohQHCLNeR55PSjZ0BFnoZ3U,28
36
+ clarifai/constants/model.py,sha256=ghcdvKIbx-g22H9RwxmMfUt1CrKz5Oa-iTExt0VpUVU,463
37
+ clarifai/constants/rag.py,sha256=WcHwToUVIK9ItAhDefaSohQHCLNeR55PSjZ0BFnoZ3U,28
38
+ clarifai/constants/search.py,sha256=yYEqTaFg-KdnpJE_Ytp-EPVHIIC395iNtZrpVlLIf4o,101
39
+ clarifai/constants/workflow.py,sha256=cECq1xdvf44MCdtK2AbkiuuwhyL-6OWZdQfYbsLKy_o,33
40
+ clarifai/datasets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ clarifai/datasets/export/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ clarifai/datasets/export/inputs_annotations.py,sha256=1PFjIw30dRO9NSUa_yvox_07W30tlAnrk4mEAVgfXBY,10980
43
+ clarifai/datasets/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ clarifai/datasets/upload/base.py,sha256=8b13tmAokgZVH0d-HRpU-O15Swa46eJy2Fp6zU7jQkU,2441
45
+ clarifai/datasets/upload/features.py,sha256=Yy0MP1F_ev2IbWnEyXDLt5SaEb11bXSUu5ux8tD1oxY,2115
46
+ clarifai/datasets/upload/image.py,sha256=0Fs02KK1WuDE24RAJ2ZOdktva1iOqzE25J9jJJYJUDk,10122
47
+ clarifai/datasets/upload/multimodal.py,sha256=IZYjmyxVJpNjwyNyzptQENZcCKDbdTU_t70QSdK23Ec,2762
48
+ clarifai/datasets/upload/text.py,sha256=L2IEbickNhZcmrhbBfQciCXQf4JPcqWulRWJ7HDpJLc,2482
49
+ clarifai/datasets/upload/utils.py,sha256=VdTn7AqIWB8D60rX9YD4T-4fi-7xMEocHATJvvaPjxQ,10508
50
+ clarifai/datasets/upload/loaders/README.md,sha256=aNRutSCTzLp2ruIZx74ZkN5AxpzwKOxMa7OzabnKpwg,2980
51
+ clarifai/datasets/upload/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ clarifai/datasets/upload/loaders/coco_captions.py,sha256=v6e8lh6BCUFOlurnvDfBEY-drl6JhpIE9nt2Qnz7XQ8,1623
53
+ clarifai/datasets/upload/loaders/coco_detection.py,sha256=0FsGV84MT0IkerXoe9hdxQSr9wd96j9cPOne-rhzBPw,3190
54
+ clarifai/datasets/upload/loaders/imagenet_classification.py,sha256=w2Tiot_YK0QYiyAVbWSxoKthZgUsRo9LiWWY2lVzPrQ,2247
55
+ clarifai/datasets/upload/loaders/xview_detection.py,sha256=dukodZRdyVH-s5MtmCDtKwseKGwSCWAK2Uwuwa6kJu4,8035
56
+ clarifai/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
+ clarifai/models/api.py,sha256=YhbGqZMC5mH_ZqnbaEmgfJdrIhSkLevpWih8ZqC3BL4,12193
58
+ clarifai/modules/README.md,sha256=mx8pVx6cPp-pP4LcFPT_nX3ngGmhygVK0WiXeD3cbIo,367
59
+ clarifai/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
+ clarifai/modules/css.py,sha256=Jg67jXo2mZoGQp7M-At74ywyk4cN90s-aJTLjfqsaB4,2176
61
+ clarifai/modules/pages.py,sha256=DZVO7YjIjYQdUyHYF-zxLkc5qkYC5KNnUxGiKQGo3Uk,1509
62
+ clarifai/modules/style.css,sha256=j7FNPZVhLPj35vvBksAJ90RuX5sLuqzDR5iM2WIEhiA,6073
63
+ clarifai/rag/__init__.py,sha256=wu3PzAzo7uqgrEzuaC9lY_3gj1HFiR3GU3elZIKTT5g,40
64
+ clarifai/rag/rag.py,sha256=EG3GoFrHFCmA70Tz49_0Jo1-3WIaHSgWGHecPeErcdc,14170
65
+ clarifai/rag/utils.py,sha256=_gVZdABuMnraCKViLruV75x0F3IpgFXN6amYSGE5_xc,4462
66
+ clarifai/runners/__init__.py,sha256=CQhpUOj_x-oV9xEUKdL-hi3A1BQAtPUv-FFOev4a96w,281
67
+ clarifai/runners/server.py,sha256=9qVAs8pRHmtyY0RCNIQ1uP8nqDADIFZ03LnkoDt1h4U,4692
68
+ clarifai/runners/dockerfile_template/Dockerfile.template,sha256=5cjv7U8PmWa3DB_5B1CqSYh_6GE0E0np52TIAa7EIDE,2312
69
+ clarifai/runners/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ clarifai/runners/models/dummy_openai_model.py,sha256=nbE6ZnLDUfor9omN536jMk64ZOi5OnwJqgvI93wTKqY,7220
71
+ clarifai/runners/models/mcp_class.py,sha256=7uwCMade0LMMBq7vczhPf4Kxdmh8Rj0R7Pg3pPxYdjQ,6386
72
+ clarifai/runners/models/model_builder.py,sha256=PiqPyTGPSKsYvOQNpBzs4e1_wuEbtE-P3yEkLE4Py10,49231
73
+ clarifai/runners/models/model_class.py,sha256=OHVd0tMOXDyl9v1vWeHOmYGx_dvP77N4zlLGMyTakag,15575
74
+ clarifai/runners/models/model_run_locally.py,sha256=6-6WjEKc0ba3gAv4wOLdMs2XOzS3b-2bZHJS0wdVqJY,20088
75
+ clarifai/runners/models/model_runner.py,sha256=SccX-RxTgruSpQaM21uMSl-z1x6fOa13fQZMQW8NNRY,7297
76
+ clarifai/runners/models/model_servicer.py,sha256=rRd_fNEXwqiBSzTUtPI2r07EBdcCPd8tcSPHeqTe0_I,3445
77
+ clarifai/runners/models/openai_class.py,sha256=bD5Th_Pgu8RRP0OsraWClDUtbrB9-bygfIBRpzWfOac,8074
78
+ clarifai/runners/models/visual_classifier_class.py,sha256=f9ZP8KFamMUdMpUG3AlL9nVCdcggy_E5n9RJY3ixR1U,2739
79
+ clarifai/runners/models/visual_detector_class.py,sha256=ky4oFAkGCKPpGPdgaOso-n6D3HcmnbKee_8hBsNiV8U,2883
80
+ clarifai/runners/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ clarifai/runners/utils/code_script.py,sha256=u8rN-Av7V8ZZK61P6wu6WOFkUDjU2gc0B8Z53Y6FEWQ,11137
82
+ clarifai/runners/utils/const.py,sha256=Q4Ps6gIEJCyTdQCfmT6PaS61WHmhT25XigV1NugWz-E,1544
83
+ clarifai/runners/utils/data_utils.py,sha256=4M4n-cGprBEBV5UkgOWaUlVfZ3WBTmegdffGQ3SfYCU,20750
84
+ clarifai/runners/utils/loader.py,sha256=K5Y8MPbIe5STw2gDnrL8KqFgKNxEo7bz-RV0ip1T4PM,10900
85
+ clarifai/runners/utils/method_signatures.py,sha256=qdHaO8ZIgP6BBXXMhMPhcQ46dse-XMP2t4VJCNG7O3Q,18335
86
+ clarifai/runners/utils/openai_convertor.py,sha256=ZlIrvvfHttD_DavLvmKZdL8gNq_TQvQtZVnYamwdWz4,8248
87
+ clarifai/runners/utils/serializers.py,sha256=pI7GqMTC0T3Lu_X8v8TO4RiplO-gC_49Ns37jYwsPtg,7908
88
+ clarifai/runners/utils/url_fetcher.py,sha256=Segkvi-ktPa3-koOpUu8DNZeWOaK6G82Ya9b7_oIKwo,1778
89
+ clarifai/runners/utils/data_types/__init__.py,sha256=iBtmPkIoLK9ew6ZiXElGt2YBBTDLEA0fmxE_eOYzvhk,478
90
+ clarifai/runners/utils/data_types/data_types.py,sha256=UBHTNPshr94qUs2KqkYis0VlArm23rcSG_EyO_Uetgc,19823
91
+ clarifai/schema/search.py,sha256=o9-ct8ulLZByB3RCVwZWPgaDwdcW7cM5s-g8oyAz89s,2421
92
+ clarifai/urls/helper.py,sha256=UshKiEnBAZfMyoWiM3Xx6USXEYmXRFTd4kNpuQSQQM8,7868
93
+ clarifai/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ clarifai/utils/cli.py,sha256=7lHajIsWzyEU7jfgH1nykwYG63wcHCZ3ep7a6amWZH4,5413
95
+ clarifai/utils/config.py,sha256=AguQ4UPFxNwDT8hTBrdV4grQ0t4m-pW2V9XKxBWfnNg,5177
96
+ clarifai/utils/constants.py,sha256=RYfDVFpaW7V5ISIvY7uvu5nqTvQ2NEwFOd0dcCytyGk,2030
97
+ clarifai/utils/logging.py,sha256=0we53uTqUvzrulC86whu-oeWNxn1JjJL0OQ98Bwf9vo,15198
98
+ clarifai/utils/misc.py,sha256=x7JP8oxU672Z9yAav47Y1anFiL4RD8WvlKBHMVlbyZM,3137
99
+ clarifai/utils/model_train.py,sha256=0XSAoTkSsrwf4f-W9yw2mkXZtkal7LBLJSoi86CFCn4,9250
100
+ clarifai/utils/protobuf.py,sha256=VMhnNsPuWQ16VarKm8BOr5zccXMe26UlrxdJxIzEZNM,6220
101
+ clarifai/utils/evaluation/__init__.py,sha256=PYkurUrXrGevByj7RFb6CoU1iC7fllyQSfnnlo9WnY8,69
102
+ clarifai/utils/evaluation/helpers.py,sha256=0t6eIDXeZEoiVvnmHTnsIF_-v4BzrQW1hFaqc_psifU,21079
103
+ clarifai/utils/evaluation/main.py,sha256=N_sfRuMjHrUeuWN0Pzms65M1PbkQkgYg3WoQVaDR1Jw,17764
104
+ clarifai/utils/evaluation/testset_annotation_parser.py,sha256=Nmodfi5BYFYEbybWcC8tmU5-wtwRBsWIbnpd3OvKSmA,5414
105
+ clarifai/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
+ clarifai/workflows/export.py,sha256=Oq3RVNKvv1iH46U6oIjXa-MXWJ4sTlXr_NSfwoxr3H4,2149
107
+ clarifai/workflows/utils.py,sha256=ESL3INcouNcLKCh-nMpfXX-YbtCzX7tz7hT57_RGQ3M,2079
108
+ clarifai/workflows/validate.py,sha256=UhmukyHkfxiMFrPPeBdUTiCOHQT5-shqivlBYEyKTlU,2931
109
+ clarifai-11.4.5.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
110
+ clarifai-11.4.5.dist-info/METADATA,sha256=5wUGZgaAVSm1sGoBaaBp8Lq6shX5SrkHuYkAhSND000,22398
111
+ clarifai-11.4.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
112
+ clarifai-11.4.5.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
113
+ clarifai-11.4.5.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
114
+ clarifai-11.4.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
Binary file
Binary file