clarifai 11.1.7rc2__py3-none-any.whl → 11.2.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.
Files changed (155) hide show
  1. clarifai/__init__.py +1 -1
  2. clarifai/cli/base.py +16 -3
  3. clarifai/cli/model.py +0 -25
  4. clarifai/client/model.py +393 -157
  5. clarifai/runners/__init__.py +7 -2
  6. clarifai/runners/dockerfile_template/Dockerfile.template +0 -3
  7. clarifai/runners/models/model_builder.py +11 -38
  8. clarifai/runners/models/model_class.py +28 -262
  9. clarifai/runners/models/model_run_locally.py +80 -15
  10. clarifai/runners/models/model_runner.py +0 -2
  11. clarifai/runners/models/model_servicer.py +2 -11
  12. clarifai/runners/utils/data_handler.py +210 -271
  13. {clarifai-11.1.7rc2.dist-info → clarifai-11.2.0.dist-info}/METADATA +17 -5
  14. clarifai-11.2.0.dist-info/RECORD +101 -0
  15. {clarifai-11.1.7rc2.dist-info → clarifai-11.2.0.dist-info}/WHEEL +1 -1
  16. clarifai/__pycache__/__init__.cpython-310.pyc +0 -0
  17. clarifai/__pycache__/__init__.cpython-39.pyc +0 -0
  18. clarifai/__pycache__/errors.cpython-310.pyc +0 -0
  19. clarifai/__pycache__/versions.cpython-310.pyc +0 -0
  20. clarifai/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  21. clarifai/cli/__pycache__/base.cpython-310.pyc +0 -0
  22. clarifai/cli/__pycache__/base_cli.cpython-310.pyc +0 -0
  23. clarifai/cli/__pycache__/compute_cluster.cpython-310.pyc +0 -0
  24. clarifai/cli/__pycache__/deployment.cpython-310.pyc +0 -0
  25. clarifai/cli/__pycache__/model.cpython-310.pyc +0 -0
  26. clarifai/cli/__pycache__/model_cli.cpython-310.pyc +0 -0
  27. clarifai/cli/__pycache__/nodepool.cpython-310.pyc +0 -0
  28. clarifai/client/__pycache__/__init__.cpython-310.pyc +0 -0
  29. clarifai/client/__pycache__/__init__.cpython-39.pyc +0 -0
  30. clarifai/client/__pycache__/app.cpython-310.pyc +0 -0
  31. clarifai/client/__pycache__/app.cpython-39.pyc +0 -0
  32. clarifai/client/__pycache__/base.cpython-310.pyc +0 -0
  33. clarifai/client/__pycache__/compute_cluster.cpython-310.pyc +0 -0
  34. clarifai/client/__pycache__/dataset.cpython-310.pyc +0 -0
  35. clarifai/client/__pycache__/deployment.cpython-310.pyc +0 -0
  36. clarifai/client/__pycache__/input.cpython-310.pyc +0 -0
  37. clarifai/client/__pycache__/lister.cpython-310.pyc +0 -0
  38. clarifai/client/__pycache__/model.cpython-310.pyc +0 -0
  39. clarifai/client/__pycache__/module.cpython-310.pyc +0 -0
  40. clarifai/client/__pycache__/nodepool.cpython-310.pyc +0 -0
  41. clarifai/client/__pycache__/search.cpython-310.pyc +0 -0
  42. clarifai/client/__pycache__/user.cpython-310.pyc +0 -0
  43. clarifai/client/__pycache__/workflow.cpython-310.pyc +0 -0
  44. clarifai/client/auth/__pycache__/__init__.cpython-310.pyc +0 -0
  45. clarifai/client/auth/__pycache__/helper.cpython-310.pyc +0 -0
  46. clarifai/client/auth/__pycache__/register.cpython-310.pyc +0 -0
  47. clarifai/client/auth/__pycache__/stub.cpython-310.pyc +0 -0
  48. clarifai/client/cli/__init__.py +0 -0
  49. clarifai/client/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  50. clarifai/client/cli/__pycache__/base_cli.cpython-310.pyc +0 -0
  51. clarifai/client/cli/__pycache__/model_cli.cpython-310.pyc +0 -0
  52. clarifai/client/cli/base_cli.py +0 -88
  53. clarifai/client/cli/model_cli.py +0 -29
  54. clarifai/client/model_client.py +0 -447
  55. clarifai/constants/__pycache__/base.cpython-310.pyc +0 -0
  56. clarifai/constants/__pycache__/dataset.cpython-310.pyc +0 -0
  57. clarifai/constants/__pycache__/input.cpython-310.pyc +0 -0
  58. clarifai/constants/__pycache__/model.cpython-310.pyc +0 -0
  59. clarifai/constants/__pycache__/rag.cpython-310.pyc +0 -0
  60. clarifai/constants/__pycache__/search.cpython-310.pyc +0 -0
  61. clarifai/constants/__pycache__/workflow.cpython-310.pyc +0 -0
  62. clarifai/datasets/__pycache__/__init__.cpython-310.pyc +0 -0
  63. clarifai/datasets/__pycache__/__init__.cpython-39.pyc +0 -0
  64. clarifai/datasets/export/__pycache__/__init__.cpython-310.pyc +0 -0
  65. clarifai/datasets/export/__pycache__/__init__.cpython-39.pyc +0 -0
  66. clarifai/datasets/export/__pycache__/inputs_annotations.cpython-310.pyc +0 -0
  67. clarifai/datasets/upload/__pycache__/__init__.cpython-310.pyc +0 -0
  68. clarifai/datasets/upload/__pycache__/__init__.cpython-39.pyc +0 -0
  69. clarifai/datasets/upload/__pycache__/base.cpython-310.pyc +0 -0
  70. clarifai/datasets/upload/__pycache__/features.cpython-310.pyc +0 -0
  71. clarifai/datasets/upload/__pycache__/image.cpython-310.pyc +0 -0
  72. clarifai/datasets/upload/__pycache__/multimodal.cpython-310.pyc +0 -0
  73. clarifai/datasets/upload/__pycache__/text.cpython-310.pyc +0 -0
  74. clarifai/datasets/upload/__pycache__/utils.cpython-310.pyc +0 -0
  75. clarifai/datasets/upload/loaders/__pycache__/__init__.cpython-39.pyc +0 -0
  76. clarifai/models/__pycache__/__init__.cpython-39.pyc +0 -0
  77. clarifai/modules/__pycache__/__init__.cpython-39.pyc +0 -0
  78. clarifai/rag/__pycache__/__init__.cpython-310.pyc +0 -0
  79. clarifai/rag/__pycache__/__init__.cpython-39.pyc +0 -0
  80. clarifai/rag/__pycache__/rag.cpython-310.pyc +0 -0
  81. clarifai/rag/__pycache__/rag.cpython-39.pyc +0 -0
  82. clarifai/rag/__pycache__/utils.cpython-310.pyc +0 -0
  83. clarifai/runners/__pycache__/__init__.cpython-310.pyc +0 -0
  84. clarifai/runners/__pycache__/__init__.cpython-39.pyc +0 -0
  85. clarifai/runners/dockerfile_template/Dockerfile.cpu.template +0 -31
  86. clarifai/runners/dockerfile_template/Dockerfile.cuda.template +0 -42
  87. clarifai/runners/dockerfile_template/Dockerfile.nim +0 -71
  88. clarifai/runners/models/__pycache__/__init__.cpython-310.pyc +0 -0
  89. clarifai/runners/models/__pycache__/__init__.cpython-39.pyc +0 -0
  90. clarifai/runners/models/__pycache__/base_typed_model.cpython-310.pyc +0 -0
  91. clarifai/runners/models/__pycache__/base_typed_model.cpython-39.pyc +0 -0
  92. clarifai/runners/models/__pycache__/model_class.cpython-310.pyc +0 -0
  93. clarifai/runners/models/__pycache__/model_run_locally.cpython-310-pytest-7.1.2.pyc +0 -0
  94. clarifai/runners/models/__pycache__/model_run_locally.cpython-310.pyc +0 -0
  95. clarifai/runners/models/__pycache__/model_runner.cpython-310.pyc +0 -0
  96. clarifai/runners/models/__pycache__/model_upload.cpython-310.pyc +0 -0
  97. clarifai/runners/models/model_class_refract.py +0 -80
  98. clarifai/runners/models/model_upload.py +0 -607
  99. clarifai/runners/models/temp.py +0 -25
  100. clarifai/runners/utils/__pycache__/__init__.cpython-310.pyc +0 -0
  101. clarifai/runners/utils/__pycache__/__init__.cpython-38.pyc +0 -0
  102. clarifai/runners/utils/__pycache__/__init__.cpython-39.pyc +0 -0
  103. clarifai/runners/utils/__pycache__/buffered_stream.cpython-310.pyc +0 -0
  104. clarifai/runners/utils/__pycache__/buffered_stream.cpython-38.pyc +0 -0
  105. clarifai/runners/utils/__pycache__/buffered_stream.cpython-39.pyc +0 -0
  106. clarifai/runners/utils/__pycache__/const.cpython-310.pyc +0 -0
  107. clarifai/runners/utils/__pycache__/constants.cpython-310.pyc +0 -0
  108. clarifai/runners/utils/__pycache__/constants.cpython-38.pyc +0 -0
  109. clarifai/runners/utils/__pycache__/constants.cpython-39.pyc +0 -0
  110. clarifai/runners/utils/__pycache__/data_handler.cpython-310.pyc +0 -0
  111. clarifai/runners/utils/__pycache__/data_handler.cpython-38.pyc +0 -0
  112. clarifai/runners/utils/__pycache__/data_handler.cpython-39.pyc +0 -0
  113. clarifai/runners/utils/__pycache__/data_utils.cpython-310.pyc +0 -0
  114. clarifai/runners/utils/__pycache__/data_utils.cpython-38.pyc +0 -0
  115. clarifai/runners/utils/__pycache__/data_utils.cpython-39.pyc +0 -0
  116. clarifai/runners/utils/__pycache__/grpc_server.cpython-310.pyc +0 -0
  117. clarifai/runners/utils/__pycache__/grpc_server.cpython-38.pyc +0 -0
  118. clarifai/runners/utils/__pycache__/grpc_server.cpython-39.pyc +0 -0
  119. clarifai/runners/utils/__pycache__/health.cpython-310.pyc +0 -0
  120. clarifai/runners/utils/__pycache__/health.cpython-38.pyc +0 -0
  121. clarifai/runners/utils/__pycache__/health.cpython-39.pyc +0 -0
  122. clarifai/runners/utils/__pycache__/loader.cpython-310.pyc +0 -0
  123. clarifai/runners/utils/__pycache__/logging.cpython-310.pyc +0 -0
  124. clarifai/runners/utils/__pycache__/logging.cpython-38.pyc +0 -0
  125. clarifai/runners/utils/__pycache__/logging.cpython-39.pyc +0 -0
  126. clarifai/runners/utils/__pycache__/stream_source.cpython-310.pyc +0 -0
  127. clarifai/runners/utils/__pycache__/stream_source.cpython-39.pyc +0 -0
  128. clarifai/runners/utils/__pycache__/url_fetcher.cpython-310.pyc +0 -0
  129. clarifai/runners/utils/__pycache__/url_fetcher.cpython-38.pyc +0 -0
  130. clarifai/runners/utils/__pycache__/url_fetcher.cpython-39.pyc +0 -0
  131. clarifai/runners/utils/data_handler_refract.py +0 -213
  132. clarifai/runners/utils/data_types.py +0 -427
  133. clarifai/runners/utils/logger.py +0 -0
  134. clarifai/runners/utils/method_signatures.py +0 -472
  135. clarifai/runners/utils/serializers.py +0 -222
  136. clarifai/schema/__pycache__/search.cpython-310.pyc +0 -0
  137. clarifai/urls/__pycache__/helper.cpython-310.pyc +0 -0
  138. clarifai/utils/__pycache__/__init__.cpython-310.pyc +0 -0
  139. clarifai/utils/__pycache__/__init__.cpython-39.pyc +0 -0
  140. clarifai/utils/__pycache__/cli.cpython-310.pyc +0 -0
  141. clarifai/utils/__pycache__/constants.cpython-310.pyc +0 -0
  142. clarifai/utils/__pycache__/logging.cpython-310.pyc +0 -0
  143. clarifai/utils/__pycache__/misc.cpython-310.pyc +0 -0
  144. clarifai/utils/__pycache__/model_train.cpython-310.pyc +0 -0
  145. clarifai/utils/evaluation/__pycache__/__init__.cpython-39.pyc +0 -0
  146. clarifai/utils/evaluation/__pycache__/main.cpython-39.pyc +0 -0
  147. clarifai/workflows/__pycache__/__init__.cpython-310.pyc +0 -0
  148. clarifai/workflows/__pycache__/__init__.cpython-39.pyc +0 -0
  149. clarifai/workflows/__pycache__/export.cpython-310.pyc +0 -0
  150. clarifai/workflows/__pycache__/utils.cpython-310.pyc +0 -0
  151. clarifai/workflows/__pycache__/validate.cpython-310.pyc +0 -0
  152. clarifai-11.1.7rc2.dist-info/RECORD +0 -237
  153. {clarifai-11.1.7rc2.dist-info → clarifai-11.2.0.dist-info}/entry_points.txt +0 -0
  154. {clarifai-11.1.7rc2.dist-info → clarifai-11.2.0.dist-info/licenses}/LICENSE +0 -0
  155. {clarifai-11.1.7rc2.dist-info → clarifai-11.2.0.dist-info}/top_level.txt +0 -0
@@ -1,292 +1,231 @@
1
- import io
2
- from typing import Any
1
+ from typing import Dict, List, Tuple, Union
3
2
 
4
3
  import numpy as np
5
4
  from clarifai_grpc.grpc.api import resources_pb2
6
- from clarifai_grpc.grpc.api.resources_pb2 import Audio as AudioProto
7
- from clarifai_grpc.grpc.api.resources_pb2 import Image as ImageProto
8
- from clarifai_grpc.grpc.api.resources_pb2 import Text as TextProto
9
- from clarifai_grpc.grpc.api.resources_pb2 import Video as VideoProto
10
5
  from clarifai_grpc.grpc.api.status import status_code_pb2, status_pb2
11
- from google.protobuf.json_format import MessageToDict, ParseDict
12
- from google.protobuf.struct_pb2 import Struct
13
- from PIL import Image as PILImage
14
-
15
-
16
- def metadata_to_dict(data: resources_pb2.Data) -> dict:
17
- return MessageToDict(data.metadata)
18
-
19
-
20
- def dict_to_metadata(data: resources_pb2.Data, metadata_dict: dict):
21
- struct = Struct()
22
- ParseDict(metadata_dict, struct)
23
- data.metadata.CopyFrom(struct)
24
-
25
-
26
- def kwargs_to_proto(*args, **kwargs) -> resources_pb2.Data:
27
- """Converts the kwargs to a Clarifai protobuf Data message."""
28
-
29
- kwargs = dict(kwargs)
30
- if any(k.startswith("_arg_") for k in kwargs.keys()):
31
- raise ValueError("Keys starting with '_arg_' are reserved for positional arguments")
32
- for arg_i, arg in enumerate(args):
33
- kwargs[f"_arg_{arg_i}"] = arg
34
-
35
- def _handle_list(target_data, value_list, part_name):
36
- """Handles list values by processing each item into a new part."""
37
- if isinstance(value_list[0], dict):
38
- raise ValueError("List of dictionaries is not supported")
39
-
40
- for item in value_list:
41
- new_part = target_data.parts.add()
42
- _process_value(new_part.data, item, part_name)
43
-
44
- def _process_value(target_data, value, part_name):
45
- """Processes individual values and sets the appropriate proto field."""
46
- if isinstance(value, Text):
47
- target_data.text.CopyFrom(value.to_proto())
48
- elif isinstance(value, Image):
49
- target_data.image.CopyFrom(value.to_proto())
50
- elif isinstance(value, Audio):
51
- target_data.audio.CopyFrom(value.to_proto())
52
- elif isinstance(value, Video):
53
- target_data.video.CopyFrom(value.to_proto())
54
- elif isinstance(value, str):
55
- target_data.text.raw = value
56
- elif isinstance(value, bytes):
57
- target_data.bytes_value = value
58
- elif isinstance(value, int):
59
- target_data.int_value = value
60
- elif isinstance(value, float):
61
- target_data.float_value = value
62
- elif isinstance(value, bool):
63
- target_data.bool_value = value
64
- elif isinstance(value, np.ndarray):
65
- ndarray_proto = resources_pb2.NDArray(
66
- buffer=value.tobytes(), shape=value.shape, dtype=str(value.dtype))
67
- target_data.ndarray.CopyFrom(ndarray_proto)
68
- elif isinstance(value, PILImage.Image):
69
- image = Image.from_pil(value)
70
- target_data.image.CopyFrom(image.to_proto())
71
- else:
72
- raise TypeError(f"Unsupported type {type(value)} for part '{part_name}'")
73
-
74
- data_proto = resources_pb2.Data()
75
- for part_name, part_value in kwargs.items():
76
- part = data_proto.parts.add()
77
- part.id = part_name
78
-
79
- if isinstance(part_value, list):
80
- _handle_list(part.data, part_value, part_name)
81
- elif isinstance(part_value, dict):
82
- dict_to_metadata(part.data, part_value)
83
- else:
84
- _process_value(part.data, part_value, part_name)
85
- return data_proto
86
-
87
-
88
- def proto_to_kwargs(data: resources_pb2.Data) -> dict:
89
- """Converts the Clarifai protobuf Data message to a dictionary."""
90
-
91
- def process_part(part, allow_metadata: bool = True) -> object:
92
- if part.HasField("text"):
93
- return Text.from_proto(part.text).text
94
- elif part.HasField("image"):
95
- return Image(part.image)
96
- elif part.HasField("audio"):
97
- return Audio(part.audio)
98
- elif part.HasField("video"):
99
- return Video(part.video)
100
- elif part.bytes_value != b'':
101
- return part.bytes_value
102
- elif part.int_value != 0:
103
- return part.int_value
104
- elif part.float_value != 0.0:
105
- return part.float_value
106
- elif part.bool_value is not False:
107
- return part.bool_value
108
- elif part.HasField("ndarray"):
109
- ndarray = part.ndarray
110
- return np.frombuffer(ndarray.buffer, dtype=np.dtype(ndarray.dtype)).reshape(ndarray.shape)
111
- elif part.HasField("metadata"):
112
- if not allow_metadata:
113
- raise ValueError("Metadata in list is not supported")
114
- return metadata_to_dict(part)
115
- elif part.parts:
116
- return [process_part(p.data,) for p in part.parts]
117
- else:
118
- raise ValueError(f"Unknown part data: {part}")
119
-
120
- kwargs = {}
121
- part_names = [part.id for part in data.parts]
122
- assert "return" not in part_names, "The key 'return' is reserved"
123
- for part in data.parts:
124
- part_name = part.id
125
- part_data = part.data
126
- kwargs[part_name] = process_part(part_data)
127
- args = [kwargs.pop(f"_arg_{i}") for i in range(len(kwargs)) if f"_arg_{i}" in kwargs]
128
- return args, kwargs
129
-
130
-
131
- class Output:
132
-
133
- def __init__(self, *args, **kwargs: Any):
134
-
135
- if not kwargs:
136
- raise ValueError("Output must have at least one key-value pair")
137
- if isinstance(kwargs, dict):
138
- kwargs = kwargs
139
- else:
140
- raise ValueError("Output must be a dictionary")
141
- self.parts = kwargs
142
- self.args = args
143
-
144
- def __repr__(self):
145
- args_str = ', '.join(repr(arg) for arg in self.args)
146
- kwargs_str = ', '.join(f"{k}={v!r}" for k, v in self.parts.items())
147
- parts = []
148
- if args_str:
149
- parts.append(args_str)
150
- if kwargs_str:
151
- parts.append(kwargs_str)
152
- return f"Output({', '.join(parts)})"
153
-
154
- def to_proto(self) -> resources_pb2.Output:
155
- """Converts the Output instance to a Clarifai protobuf Output message."""
156
- data_proto = kwargs_to_proto(*self.args, **self.parts)
157
-
158
- return resources_pb2.Output(
159
- data=data_proto, status=status_pb2.Status(code=status_code_pb2.SUCCESS))
160
-
161
-
162
- class Text:
163
-
164
- def __init__(self, text: str):
165
- self.text = text
166
-
167
- def to_proto(self) -> TextProto:
168
- return TextProto(raw=self.text)
6
+ from PIL import Image
169
7
 
170
- @classmethod
171
- def from_proto(cls, proto: TextProto) -> "Text":
172
- return cls(proto.raw)
8
+ from clarifai.client.auth.helper import ClarifaiAuthHelper
173
9
 
10
+ from .data_utils import bytes_to_image, image_to_bytes
174
11
 
175
- class Image:
176
12
 
177
- def __init__(self, proto_image: ImageProto):
178
- self.proto = proto_image
13
+ class BaseDataHandler:
179
14
 
180
- @property
181
- def url(self) -> str:
182
- return self.proto.url
15
+ def __init__(self,
16
+ proto: Union[resources_pb2.Input, resources_pb2.Output],
17
+ auth: ClarifaiAuthHelper = None):
18
+ self._proto = proto
19
+ self._auth = auth
183
20
 
184
- @url.setter
185
- def url(self, value: str):
186
- self.proto.url = value
21
+ #
22
+ def to_python(self):
23
+ return dict(text=self.text, image=self.image, audio=self.audio)
187
24
 
25
+ # ---------------- Start get/setters ---------------- #
26
+ # Proto
188
27
  @property
189
- def bytes(self) -> bytes:
190
- return self.proto.base64
191
-
192
- @bytes.setter
193
- def bytes(self, value: bytes):
194
- self.proto.base64 = value
195
-
196
- def __repr__(self) -> str:
197
- attrs = []
198
- if self.url:
199
- attrs.append(f"url={self.url!r}")
200
- if self.bytes:
201
- attrs.append(f"bytes=<{len(self.bytes)} bytes>")
202
- return f"Image({', '.join(attrs)})"
203
-
204
- @classmethod
205
- def from_url(cls, url: str) -> "Image":
206
- proto_image = ImageProto(url=url)
207
- return cls(proto_image)
208
-
209
- @classmethod
210
- def from_pil(cls, pil_image: PILImage.Image) -> "Image":
211
- with io.BytesIO() as output:
212
- pil_image.save(output, format="PNG")
213
- image_bytes = output.getvalue()
214
- proto_image = ImageProto(base64=image_bytes)
215
- return cls(proto_image)
216
-
217
- def to_pil(self) -> PILImage.Image:
218
- return PILImage.open(io.BytesIO(self.proto.base64))
219
-
220
- def to_numpy(self) -> np.ndarray:
221
- # below is very slow, need to find a better way
222
- # return np.array(self.to_pil())
223
- pass
224
-
225
- def to_proto(self) -> ImageProto:
226
- return self.proto
227
-
228
-
229
- class Audio:
230
-
231
- def __init__(self, proto_audio: AudioProto):
232
- self.proto = proto_audio
28
+ def proto(self):
29
+ return self._proto
233
30
 
31
+ # Status
234
32
  @property
235
- def url(self) -> str:
236
- return self.proto.url
33
+ def status(self) -> status_pb2.Status:
34
+ return self._proto.status
237
35
 
238
- @url.setter
239
- def url(self, value: str):
240
- self.proto.url = value
36
+ def set_status(self, code: str, description: str = ""):
37
+ self._proto.status.code = code
38
+ self._proto.status.description = description
241
39
 
40
+ # Text
242
41
  @property
243
- def bytes(self) -> bytes:
244
- return self.proto.base64
245
-
246
- @bytes.setter
247
- def bytes(self, value: bytes):
248
- self.proto.base64 = value
249
-
250
- def __repr__(self) -> str:
251
- attrs = []
252
- if self.url:
253
- attrs.append(f"url={self.url!r}")
254
- if self.bytes:
255
- attrs.append(f"bytes=<{len(self.bytes)} bytes>")
256
- return f"Audio({', '.join(attrs)})"
257
-
258
- def to_proto(self) -> AudioProto:
259
- return self.proto
260
-
261
-
262
- class Video:
42
+ def text(self) -> Union[None, str]:
43
+ data = self._proto.data.text
44
+ text = None
45
+ if data.ByteSize():
46
+ if data.raw:
47
+ text = data.raw
48
+ else:
49
+ raise NotImplementedError
50
+ return text
51
+
52
+ def set_text(self, text: str):
53
+ self._proto.data.text.raw = text
54
+
55
+ # Image
56
+ @property
57
+ def image(self, format: str = "np") -> Union[None, Image.Image, np.ndarray]:
58
+ data = self._proto.data.image
59
+ image = None
60
+ if data.ByteSize():
61
+ data: resources_pb2.Image = data
62
+ if data.base64:
63
+ image = data.base64
64
+ elif data.url:
65
+ raise NotImplementedError
66
+ image = bytes_to_image(image)
67
+ image = image if not format == "np" else np.asarray(image).astype("uint8")
68
+ return image
69
+
70
+ def set_image(self, image: Union[Image.Image, np.ndarray]):
71
+ if isinstance(image, np.ndarray):
72
+ image = Image.fromarray(image)
73
+ self._proto.data.image.base64 = image_to_bytes(image)
74
+
75
+ # Audio
76
+ @property
77
+ def audio(self) -> bytes:
78
+ data = self._proto.data.audio
79
+ audio = None
80
+ if data.ByteSize():
81
+ if data.base64:
82
+ audio = data.base64
83
+ return audio
84
+
85
+ def set_audio(self, audio: bytes):
86
+ self._proto.data.audio.base64 = audio
87
+
88
+ # Bboxes
89
+ @property
90
+ def bboxes(self, real_coord: bool = False, image_width: int = None,
91
+ image_height: int = None) -> Tuple[List, List, List]:
92
+ if real_coord:
93
+ assert (image_height or image_width
94
+ ), "image_height and image_width are required when when return real coordinates"
95
+ xyxy = []
96
+ scores = []
97
+ concepts = []
98
+ for _, each in enumerate(self._proto.data.regions):
99
+ box = each.region_info
100
+ score = each.value
101
+ concept = each.data.concepts[0].id
102
+ x1 = box.left_col
103
+ y1 = box.top_row
104
+ x2 = box.right_col
105
+ y2 = box.bottom_row
106
+ if real_coord:
107
+ x1 = x1 * image_width
108
+ y1 = y1 * image_height
109
+ x2 = x2 * image_width
110
+ y2 = y2 * image_height
111
+ xyxy.append([x1, y1, x2, y2])
112
+ scores.append(score)
113
+ concepts.append(concept)
114
+
115
+ return xyxy, scores, concepts
116
+
117
+ def set_bboxes(self,
118
+ boxes: list,
119
+ scores: list,
120
+ concepts: list,
121
+ real_coord: bool = False,
122
+ image_width: int = None,
123
+ image_height: int = None):
124
+ if real_coord:
125
+ assert (image_height and
126
+ image_width), "image_height and image_width are required when `real_coord` is set"
127
+ bboxes = [[x[1] / image_height, x[0] / image_width, x[3] / image_height, x[2] / image_width]
128
+ for x in boxes] # normalize the bboxes to [0,1] and [y1 x1 y2 x2]
129
+ bboxes = np.clip(bboxes, 0, 1.0)
130
+
131
+ regions = []
132
+ for ith, bbox in enumerate(bboxes):
133
+ score = scores[ith]
134
+ concept = concepts[ith]
135
+ if any([each > 1.0 for each in bbox]):
136
+ assert ValueError(
137
+ "Box coordinates is not normalized between [0, 1]. Please set format_box to True and provide image_height and image_width to normalize"
138
+ )
139
+ region = resources_pb2.RegionInfo(bounding_box=resources_pb2.BoundingBox(
140
+ top_row=bbox[0], # y_min
141
+ left_col=bbox[1], # x_min
142
+ bottom_row=bbox[2], # y_max
143
+ right_col=bbox[3], # x_max
144
+ ))
145
+ data = resources_pb2.Data(concepts=resources_pb2.Concept(id=concept, value=score))
146
+ regions.append(resources_pb2.Region(region_info=region, data=data))
147
+
148
+ self._proto.data.regions = regions
149
+
150
+ # Concepts
151
+ @property
152
+ def concepts(self) -> Dict[str, float]:
153
+ con_scores = {}
154
+ for each in self.proto.data.concepts:
155
+ con_scores.update({each.id: each.value})
156
+ return con_scores
157
+
158
+ def set_concepts(self, concept_score_pairs: Dict[str, float]):
159
+ concepts = []
160
+ for concept, score in concept_score_pairs.items():
161
+ con_score = resources_pb2.Concept(id=concept, name=concept, value=score)
162
+ concepts.append(con_score)
163
+ if concepts:
164
+ self._proto.data.ClearField("concepts")
165
+ for each in concepts:
166
+ self._proto.data.concepts.append(each)
167
+
168
+ # Embeddings
169
+ @property
170
+ def embeddings(self) -> List[List[float]]:
171
+ return [each.vector for each in self.proto.data.embeddings]
263
172
 
264
- def __init__(self, proto_video: VideoProto):
265
- self.proto = proto_video
173
+ def set_embeddings(self, list_vectors: List[List[float]]):
174
+ if list_vectors[0]:
175
+ self._proto.data.ClearField("embeddings")
176
+ for vec in list_vectors:
177
+ self._proto.data.embeddings.append(
178
+ resources_pb2.Embedding(vector=vec, num_dimensions=len(vec)))
266
179
 
267
- @property
268
- def url(self) -> str:
269
- return self.proto.url
180
+ # ---------------- End get/setters ---------------- #
270
181
 
271
- @url.setter
272
- def url(self, value: str):
273
- self.proto.url = value
182
+ # Constructors
183
+ @classmethod
184
+ def from_proto(cls, proto):
185
+ clss = cls(proto=proto)
186
+ return clss
274
187
 
275
- @property
276
- def bytes(self) -> bytes:
277
- return self.proto.base64
278
-
279
- @bytes.setter
280
- def bytes(self, value: bytes):
281
- self.proto.base64 = value
282
-
283
- def __repr__(self) -> str:
284
- attrs = []
285
- if self.url:
286
- attrs.append(f"url={self.url!r}")
287
- if self.bytes:
288
- attrs.append(f"bytes=<{len(self.bytes)} bytes>")
289
- return f"Video({', '.join(attrs)})"
290
-
291
- def to_proto(self) -> VideoProto:
292
- return self.proto
188
+ @classmethod
189
+ def from_data(
190
+ cls,
191
+ status_code: int = status_code_pb2.SUCCESS,
192
+ status_description: str = "",
193
+ text: str = None,
194
+ image: Union[Image.Image, np.ndarray] = None,
195
+ audio: bytes = None,
196
+ boxes: dict = None,
197
+ concepts: Dict[str, float] = {},
198
+ embeddings: List[List[float]] = [],
199
+ ) -> 'OutputDataHandler':
200
+ clss = cls(proto=resources_pb2.Output())
201
+ if isinstance(image, Image.Image) or isinstance(image, np.ndarray):
202
+ clss.set_image(image)
203
+ if text:
204
+ clss.set_text(text)
205
+ if audio:
206
+ clss.set_audio(audio)
207
+ if boxes:
208
+ clss.set_bboxes(**boxes)
209
+ if concepts:
210
+ clss.set_concepts(concepts)
211
+ if embeddings:
212
+ clss.set_embeddings(embeddings)
213
+
214
+ clss.set_status(code=status_code, description=status_description)
215
+ return clss
216
+
217
+
218
+ class InputDataHandler(BaseDataHandler):
219
+
220
+ def __init__(self,
221
+ proto: resources_pb2.Input = resources_pb2.Input(),
222
+ auth: ClarifaiAuthHelper = None):
223
+ super().__init__(proto=proto, auth=auth)
224
+
225
+
226
+ class OutputDataHandler(BaseDataHandler):
227
+
228
+ def __init__(self,
229
+ proto: resources_pb2.Output = resources_pb2.Output(),
230
+ auth: ClarifaiAuthHelper = None):
231
+ super().__init__(proto=proto, auth=auth)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: clarifai
3
- Version: 11.1.7rc2
3
+ Version: 11.2.0
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -20,8 +20,8 @@ Classifier: Operating System :: OS Independent
20
20
  Requires-Python: >=3.8
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
- Requires-Dist: clarifai-grpc>=11.1.3
24
- Requires-Dist: clarifai-protocol>=0.0.16
23
+ Requires-Dist: clarifai-grpc>=11.2.5
24
+ Requires-Dist: clarifai-protocol>=0.0.20
25
25
  Requires-Dist: numpy>=1.22.0
26
26
  Requires-Dist: tqdm>=4.65.0
27
27
  Requires-Dist: rich>=13.4.2
@@ -32,9 +32,21 @@ Requires-Dist: tabulate>=0.9.0
32
32
  Requires-Dist: fsspec>=2024.6.1
33
33
  Requires-Dist: click>=8.1.7
34
34
  Requires-Dist: requests>=2.32.3
35
- Requires-Dist: aiohttp>=3.8.1
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: license-file
46
+ Dynamic: provides-extra
47
+ Dynamic: requires-dist
48
+ Dynamic: requires-python
49
+ Dynamic: summary
38
50
 
39
51
  <h1 align="center">
40
52
  <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,101 @@
1
+ clarifai/__init__.py,sha256=VIaU72qq7Ra35KV6zKPuIujD7yQXELMsD6Ypm1ZDIMU,23
2
+ clarifai/cli.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ clarifai/errors.py,sha256=RwzTajwds51wLD0MVlMC5kcpBnzRpreDLlazPSBZxrg,2605
4
+ clarifai/versions.py,sha256=jctnczzfGk_S3EnVqb2FjRKfSREkNmvNEwAAa_VoKiQ,222
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=utJ2F40cl0jPHcYdTlGZRqpPfZ0CtVYB-8Ft0b2fWD4,72
8
+ clarifai/cli/base.py,sha256=OL8VAaxnCXLf1IMsn4_Ewx0CVEjWGh2qr9Yt-3bvo74,4031
9
+ clarifai/cli/compute_cluster.py,sha256=N2dNQNJEPg9nxsb8x2igEzYuGRzjn7l4kNttjFIxmhI,1827
10
+ clarifai/cli/deployment.py,sha256=sUEuz5-rtozMx8deVcJXLi6lHsP2jc8x3y2MpUAVfqY,2506
11
+ clarifai/cli/model.py,sha256=9tSR_IiyZcSdTwrXOfv36MqaQ_61wLltpwsggh3yE4w,11677
12
+ clarifai/cli/nodepool.py,sha256=yihxS_rIFoBBKzRlqBX8Ab42iPpBMJrJFsk8saph6ms,3049
13
+ clarifai/client/__init__.py,sha256=xI1U0l5AZdRThvQAXCLsd9axxyFzXXJ22m8LHqVjQRU,662
14
+ clarifai/client/app.py,sha256=6pckYme1urV2YJjLIYfeZ-vH0Z5YSQa51jzIMcEfwug,38342
15
+ clarifai/client/base.py,sha256=hSHOqkXbSKyaRDeylMMnkhUHCAHhEqno4KI0CXGziBA,7536
16
+ clarifai/client/compute_cluster.py,sha256=EvW9TJjPvInUlggfg1A98sxoWH8_PY5rCVXZhsj6ac0,8705
17
+ clarifai/client/dataset.py,sha256=y3zKT_VhP1gyN3OO-b3cPeW21ZXyKbQ7ZJkEG06bsTU,32096
18
+ clarifai/client/deployment.py,sha256=w7Y6pA1rYG4KRK1SwusRZc2sQRXlG8wezuVdzSWpCo0,2586
19
+ clarifai/client/input.py,sha256=obMAHMDU1OwfXZ8KraOnGFlWzlW-3F7Ob_2lcOQMlhY,46339
20
+ clarifai/client/lister.py,sha256=03KGMvs5RVyYqxLsSrWhNc34I8kiF1Ph0NeyEwu7nMU,2082
21
+ clarifai/client/model.py,sha256=vb8ETvr_FTgMeQ68Wp5D1dogx6lOEM5cWirkRAV46Wo,88675
22
+ clarifai/client/module.py,sha256=FTkm8s9m-EaTKN7g9MnLhGJ9eETUfKG7aWZ3o1RshYs,4204
23
+ clarifai/client/nodepool.py,sha256=la3vTFrO4LX8zm2eQ5jqf2L0-kQ63Dano8FibadoZbk,10152
24
+ clarifai/client/search.py,sha256=GaPWN6JmTQGZaCHr6U1yv0zqR6wKFl7i9IVLg2ul1CI,14254
25
+ clarifai/client/user.py,sha256=WOv66ww2wx9isIge3V-xTHCkqC6akl2jEGAxzT_Ugfs,17642
26
+ clarifai/client/workflow.py,sha256=5VjZ2D8cudLznR8yhrwNawOmjxUhkJllZMKM6pn-4gs,12170
27
+ clarifai/client/auth/__init__.py,sha256=7EwR0NrozkAUwpUnCsqXvE_p0wqx_SelXlSpKShKJK0,136
28
+ clarifai/client/auth/helper.py,sha256=Ngw5IDkOWvnOz5YwViVk55z3mC52MyezLc0G3WxLqok,14643
29
+ clarifai/client/auth/register.py,sha256=2CMdBsoVLoTfjyksE6j7BM2tiEc73WKYvxnwDDgNn1k,536
30
+ clarifai/client/auth/stub.py,sha256=xy4-fV0W8keCgXld4eOVzFQEIKxOktNwtL5bLztReug,4940
31
+ clarifai/constants/base.py,sha256=ogmFSZYoF0YhGjHg5aiOc3MLqPr_poKAls6xaD0_C3U,89
32
+ clarifai/constants/dataset.py,sha256=vjK3IlgXu31HycuvjRSzEQSqhU6xfj5TIgo6IpyUWoc,609
33
+ clarifai/constants/input.py,sha256=WcHwToUVIK9ItAhDefaSohQHCLNeR55PSjZ0BFnoZ3U,28
34
+ clarifai/constants/model.py,sha256=Um1hLfMFlh5R_vtP3Z6P-o6zon-tdbLcKVIl4PucrV4,438
35
+ clarifai/constants/rag.py,sha256=WcHwToUVIK9ItAhDefaSohQHCLNeR55PSjZ0BFnoZ3U,28
36
+ clarifai/constants/search.py,sha256=yYEqTaFg-KdnpJE_Ytp-EPVHIIC395iNtZrpVlLIf4o,101
37
+ clarifai/constants/workflow.py,sha256=cECq1xdvf44MCdtK2AbkiuuwhyL-6OWZdQfYbsLKy_o,33
38
+ clarifai/datasets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ clarifai/datasets/export/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ clarifai/datasets/export/inputs_annotations.py,sha256=3AtUBrMIjw8H3ehDsJFYcBFoAZ1QKQo1hXTMsHh8f20,10159
41
+ clarifai/datasets/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ clarifai/datasets/upload/base.py,sha256=UIc0ufyIBCrb83_sFpv21L8FshsX4nwsLYQkdlJfzD4,2357
43
+ clarifai/datasets/upload/features.py,sha256=GK69WvUYnks5G26Z5L5XSisBIZILLv7lYhS2y8BJCt0,2031
44
+ clarifai/datasets/upload/image.py,sha256=HlCsfEMu_C4GVecGSv52RUJ6laLW8H64Pfj_FQyX6qg,8580
45
+ clarifai/datasets/upload/multimodal.py,sha256=_NpNQak9KMn0NOiOr48MYnXL0GQZ1LXKhwdYF1HhrHs,2377
46
+ clarifai/datasets/upload/text.py,sha256=dpRMNz49EyKau0kwksEaNV6TLBUf5lSr7t5g3pG2byM,2298
47
+ clarifai/datasets/upload/utils.py,sha256=BerWhq40ZUN30z6VImlc93eZtT-1vI18AMgSOuNzJEM,9647
48
+ clarifai/datasets/upload/loaders/README.md,sha256=aNRutSCTzLp2ruIZx74ZkN5AxpzwKOxMa7OzabnKpwg,2980
49
+ clarifai/datasets/upload/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ clarifai/datasets/upload/loaders/coco_captions.py,sha256=YfuNXplbdoH8N9ph7RyN9MfJTtOcJBG4ie1ow6-mELA,1516
51
+ clarifai/datasets/upload/loaders/coco_detection.py,sha256=_I_yThw435KS9SH7zheBbJDK3zFgjTImBsES__ijjMk,2831
52
+ clarifai/datasets/upload/loaders/imagenet_classification.py,sha256=i7W5F6FTB3LwLmhPgjZHmbCbS3l4LmjsuBFKtjxl1pU,1962
53
+ clarifai/datasets/upload/loaders/xview_detection.py,sha256=hk8cZdYZimm4KOaZvBjYcC6ikURZMn51xmn7pXZT3HE,6052
54
+ clarifai/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ clarifai/models/api.py,sha256=d3FQQlG0mNDLrfEvchqaVcq4Tgb_TqryNnJtwp3c7sE,10961
56
+ clarifai/modules/README.md,sha256=mx8pVx6cPp-pP4LcFPT_nX3ngGmhygVK0WiXeD3cbIo,367
57
+ clarifai/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
+ clarifai/modules/css.py,sha256=kadCEunmyh5h2yf0-4aysE3ZcZ6qaQcxuAgDXS96yF8,2020
59
+ clarifai/modules/pages.py,sha256=iOoM3RNRMgXlV0qBqcdQofxoXo2RuRQh0h9c9BIS0-I,1383
60
+ clarifai/modules/style.css,sha256=j7FNPZVhLPj35vvBksAJ90RuX5sLuqzDR5iM2WIEhiA,6073
61
+ clarifai/rag/__init__.py,sha256=wu3PzAzo7uqgrEzuaC9lY_3gj1HFiR3GU3elZIKTT5g,40
62
+ clarifai/rag/rag.py,sha256=bqUWnfdf91OYMucEK0_rJXDwg0oKjz5c7eda-9CPXu8,12680
63
+ clarifai/rag/utils.py,sha256=yr1jAcbpws4vFGBqlAwPPE7v1DRba48g8gixLFw8OhQ,4070
64
+ clarifai/runners/__init__.py,sha256=FcTqyCvPn9lJFDsi2eGZ-YL8LgPhJmRAS8K5Wobk03s,411
65
+ clarifai/runners/server.py,sha256=xHDLdhQApCgYG19QOKXqJNCGNyw1Vsvobq3UdryDrVc,4132
66
+ clarifai/runners/dockerfile_template/Dockerfile.template,sha256=5cjv7U8PmWa3DB_5B1CqSYh_6GE0E0np52TIAa7EIDE,2312
67
+ clarifai/runners/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
+ clarifai/runners/models/base_typed_model.py,sha256=0QCWxch8CcyJSKvE1D4PILd2RSnQZHTmx4DXlQQ6dpo,7856
69
+ clarifai/runners/models/model_builder.py,sha256=YCnZsAIE0CB-M0c2cvdEzY4O11I80STshd36dqDAN2Q,32565
70
+ clarifai/runners/models/model_class.py,sha256=9JSPAr4U4K7xI0kSl-q0mHB06zknm2OR-8XIgBCto94,1611
71
+ clarifai/runners/models/model_run_locally.py,sha256=BNzn4h6ma6qA_7yeaPheJRoylssHx9ow5NeFRBWXuYg,20442
72
+ clarifai/runners/models/model_runner.py,sha256=PyxwK-33hLlhkD07tTXkjWZ_iNlZHl9_8AZ2W7WfExI,6097
73
+ clarifai/runners/models/model_servicer.py,sha256=jtQmtGeQlvQ5ttMvVw7CMnNzq-rLkTaxR2IWF9SnHwk,2808
74
+ clarifai/runners/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ clarifai/runners/utils/const.py,sha256=bwj-Pcw558-pasdIFbNhnkn-9oiCdojYH1fNTTUG2gU,1048
76
+ clarifai/runners/utils/data_handler.py,sha256=sxy9zlAgI6ETuxCQhUgEXAn2GCsaW1GxpK6GTaMne0g,6966
77
+ clarifai/runners/utils/data_utils.py,sha256=R1iQ82TuQ9JwxCJk8yEB1Lyb0BYVhVbWJI9YDi1zGOs,318
78
+ clarifai/runners/utils/loader.py,sha256=SgNHMwRmCCymFQm8aDp73NmIUHhM-N60CBlTKbPzmVc,7470
79
+ clarifai/runners/utils/url_fetcher.py,sha256=v_8JOWmkyFAzsBulsieKX7Nfjy1Yg7wGSZeqfEvw2cg,1640
80
+ clarifai/schema/search.py,sha256=JjTi8ammJgZZ2OGl4K6tIA4zEJ1Fr2ASZARXavI1j5c,2448
81
+ clarifai/urls/helper.py,sha256=tjoMGGHuWX68DUB0pk4MEjrmFsClUAQj2jmVEM_Sy78,4751
82
+ clarifai/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ clarifai/utils/cli.py,sha256=CdcLsF00KdfA-BgMIbO-u88gUF9Ts1n0TDDZS-oImp8,1949
84
+ clarifai/utils/constants.py,sha256=MG_iHnSwNEyUZOpvsrTicNwaT4CIjmlK_Ixk_qqEX8g,142
85
+ clarifai/utils/logging.py,sha256=CVy8OsLrlbg-b8qe88kb1yO_9wi9wRYfF-QkIaN9xE8,11936
86
+ clarifai/utils/misc.py,sha256=4aNOHPTNdX-WGxuNab8qKePoCMUnscd-aN_dQEIVSWk,2933
87
+ clarifai/utils/model_train.py,sha256=Mndqy5GNu7kjQHjDyNVyamL0hQFLGSHcWhOuPyOvr1w,8005
88
+ clarifai/utils/evaluation/__init__.py,sha256=PYkurUrXrGevByj7RFb6CoU1iC7fllyQSfnnlo9WnY8,69
89
+ clarifai/utils/evaluation/helpers.py,sha256=aZeHLI7oSmU5YDWQp5GdkYW5qbHx37nV9xwunKTAwWM,18549
90
+ clarifai/utils/evaluation/main.py,sha256=sQAuMk0lPclXCYvy_rS7rYteo2xh9Ju13VNvbyGt_VM,15779
91
+ clarifai/utils/evaluation/testset_annotation_parser.py,sha256=iZfLw6oR1qgJ3MHMbOZXcGBLu7btSDn0VqdiAzpIm4g,5002
92
+ clarifai/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
+ clarifai/workflows/export.py,sha256=vICRhIreqDSShxLKjHNM2JwzKsf1B4fdXB0ciMcA70k,1945
94
+ clarifai/workflows/utils.py,sha256=nGeB_yjVgUO9kOeKTg4OBBaBz-AwXI3m-huSVj-9W18,1924
95
+ clarifai/workflows/validate.py,sha256=yJq03MaJqi5AK3alKGJJBR89xmmjAQ31sVufJUiOqY8,2556
96
+ clarifai-11.2.0.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
97
+ clarifai-11.2.0.dist-info/METADATA,sha256=RqwiHt12kWum-svcHdU-cy18o_ie4zH8JYKNtysR0FY,22472
98
+ clarifai-11.2.0.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
99
+ clarifai-11.2.0.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
100
+ clarifai-11.2.0.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
101
+ clarifai-11.2.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (77.0.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
Binary file