clarifai 11.2.3rc3__py3-none-any.whl → 11.2.3rc5__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.3rc3"
1
+ __version__ = "11.2.3rc5"
@@ -71,6 +71,37 @@ class ModelClass(ABC):
71
71
  output.data.text.raw = signatures_to_json(signatures)
72
72
  return resp
73
73
 
74
+ def _is_data_set(self, data_msg):
75
+ # Singular message fields
76
+ singular_fields = [
77
+ "image", "video", "metadata", "geo", "text", "audio", "ndarray"
78
+ ]
79
+ for field in singular_fields:
80
+ if data_msg.HasField(field):
81
+ return True
82
+
83
+ # Repeated fields
84
+ repeated_fields = [
85
+ "concepts", "colors", "clusters", "embeddings", "regions", "frames",
86
+ "tracks", "time_segments", "hits", "heatmaps", "parts"
87
+ ]
88
+ for field in repeated_fields:
89
+ if getattr(data_msg, field): # checks if the list is not empty
90
+ return True
91
+
92
+ # Scalar fields (proto3 default: 0 for numbers, empty for strings/bytes, False for bool)
93
+ if (
94
+ data_msg.int_value != 0 or
95
+ data_msg.float_value != 0.0 or
96
+ data_msg.bytes_value != b"" or
97
+ data_msg.bool_value is True or
98
+ data_msg.string_value != ""
99
+ ):
100
+ return True
101
+
102
+ return False
103
+
104
+
74
105
  def _convert_input_data_to_new_format(
75
106
  self, data: resources_pb2.Data,
76
107
  input_fields: List[resources_pb2.ModelTypeField]) -> resources_pb2.Data:
@@ -78,97 +109,88 @@ class ModelClass(ABC):
78
109
  new_data = resources_pb2.Data()
79
110
  for field in input_fields:
80
111
  part_data = self._convert_field(data, field)
81
- part = new_data.parts.add()
82
- part.id = field.name
83
- part.data.CopyFrom(part_data)
112
+ if self._is_data_set(part_data):
113
+ # if the field is set, add it to the new data part
114
+ part = new_data.parts.add()
115
+ part.id = field.name
116
+ part.data.CopyFrom(part_data)
117
+ else:
118
+ if field.required:
119
+ raise ValueError(f"Field {field.name} is required but not set")
84
120
  return new_data
85
121
 
86
122
  def _convert_field(self, old_data: resources_pb2.Data,
87
123
  field: resources_pb2.ModelTypeField) -> resources_pb2.Data:
88
124
  data_type = field.type
125
+ new_data = resources_pb2.Data()
89
126
  if data_type == resources_pb2.ModelTypeField.DataType.STR:
90
- new_data = resources_pb2.Data()
91
- new_data.string_value = old_data.text.raw
127
+ if old_data.HasField('text'):
128
+ new_data.string_value = old_data.text.raw
92
129
  return new_data
93
130
  elif data_type == resources_pb2.ModelTypeField.DataType.IMAGE:
94
- new_data = resources_pb2.Data()
95
- new_data.image.CopyFrom(old_data.image)
131
+ if old_data.HasField('image'):
132
+ new_data.image.CopyFrom(old_data.image)
96
133
  return new_data
97
134
  elif data_type == resources_pb2.ModelTypeField.DataType.VIDEO:
98
- new_data = resources_pb2.Data()
99
- new_data.video.CopyFrom(old_data.video)
135
+ if old_data.HasField('video'):
136
+ new_data.video.CopyFrom(old_data.video)
100
137
  return new_data
101
138
  elif data_type == resources_pb2.ModelTypeField.DataType.BOOL:
102
- new_data = resources_pb2.Data()
103
- new_data.bool_value = old_data.bool_value
139
+ if old_data.HasField('bool_value'):
140
+ new_data.bool_value = old_data.bool_value
104
141
  return new_data
105
142
  elif data_type == resources_pb2.ModelTypeField.DataType.INT:
106
- new_data = resources_pb2.Data()
107
- new_data.int_value = old_data.int_value
143
+ if old_data.HasField('int_value'):
144
+ new_data.int_value = old_data.int_value
108
145
  return new_data
109
146
  elif data_type == resources_pb2.ModelTypeField.DataType.FLOAT:
110
- new_data = resources_pb2.Data()
111
- new_data.float_value = old_data.float_value
147
+ if old_data.HasField('float_value'):
148
+ new_data.float_value = old_data.float_value
112
149
  return new_data
113
150
  elif data_type == resources_pb2.ModelTypeField.DataType.BYTES:
114
- new_data = resources_pb2.Data()
115
- new_data.bytes_value = old_data.bytes_value
151
+ if old_data.HasField('bytes_value'):
152
+ new_data.bytes_value = old_data.bytes_value
116
153
  return new_data
117
154
  elif data_type == resources_pb2.ModelTypeField.DataType.NDARRAY:
118
- new_data = resources_pb2.Data()
119
- new_data.ndarray.CopyFrom(old_data.ndarray)
120
- return new_data
121
- elif data_type == resources_pb2.ModelTypeField.DataType.JSON_DATA:
122
- new_data = resources_pb2.Data()
123
- struct_dict = old_data.text.raw
124
- new_data.string_value = json.dumps(struct_dict)
155
+ if old_data.HasField('ndarray'):
156
+ new_data.ndarray.CopyFrom(old_data.ndarray)
125
157
  return new_data
126
158
  elif data_type == resources_pb2.ModelTypeField.DataType.TEXT:
127
- new_data = resources_pb2.Data()
128
- new_data.text.CopyFrom(old_data.text)
159
+ if old_data.HasField('text'):
160
+ new_data.text.CopyFrom(old_data.text)
161
+ return new_data
162
+ elif data_type == resources_pb2.ModelTypeField.DataType.AUDIO:
163
+ if old_data.HasField('audio'):
164
+ new_data.audio.CopyFrom(old_data.audio)
129
165
  return new_data
130
166
  elif data_type == resources_pb2.ModelTypeField.DataType.CONCEPT:
131
- new_data = resources_pb2.Data()
132
- new_data.concepts.extend(old_data.concepts)
167
+ if old_data.concepts:
168
+ new_data.concepts.extend(old_data.concepts)
133
169
  return new_data
134
170
  elif data_type == resources_pb2.ModelTypeField.DataType.REGION:
135
- new_data = resources_pb2.Data()
136
- new_data.regions.extend(old_data.regions)
171
+ if old_data.regions:
172
+ new_data.regions.extend(old_data.regions)
137
173
  return new_data
138
174
  elif data_type == resources_pb2.ModelTypeField.DataType.FRAME:
139
- new_data = resources_pb2.Data()
140
- new_data.frames.extend(old_data.frames)
141
- return new_data
142
- elif data_type == resources_pb2.ModelTypeField.DataType.AUDIO:
143
- new_data = resources_pb2.Data()
144
- new_data.audio.CopyFrom(old_data.audio)
175
+ if old_data.frames:
176
+ new_data.frames.extend(old_data.frames)
145
177
  return new_data
146
178
  elif data_type == resources_pb2.ModelTypeField.DataType.LIST:
147
179
  new_data = resources_pb2.Data()
148
180
  if not field.type_args:
149
181
  raise ValueError("LIST type requires type_args")
150
182
  element_field = field.type_args[0]
151
- element_data = self._convert_field(old_data, element_field)
152
- part = new_data.parts.add()
153
- part.data.CopyFrom(element_data)
154
- return new_data
155
- elif data_type == resources_pb2.ModelTypeField.DataType.TUPLE:
156
- new_data = resources_pb2.Data()
157
- for element_field in field.type_args:
183
+ if element_field in (resources_pb2.ModelTypeField.DataType.CONCEPT,
184
+ resources_pb2.ModelTypeField.DataType.REGION,
185
+ resources_pb2.ModelTypeField.DataType.FRAME):
186
+ # convert to new format
158
187
  element_data = self._convert_field(old_data, element_field)
159
- part = new_data.parts.add()
160
- part.data.CopyFrom(element_data)
161
- return new_data
162
- elif data_type == resources_pb2.ModelTypeField.DataType.NAMED_FIELDS:
163
- new_data = resources_pb2.Data()
164
- for named_field in field.type_args:
165
- part_data = self._convert_field(old_data, named_field)
166
- part = new_data.parts.add()
167
- part.id = named_field.name
168
- part.data.CopyFrom(part_data)
169
- return new_data
188
+ # part = new_data.parts.add()
189
+ # part.data.CopyFrom(element_data)
190
+ return element_data
170
191
  else:
171
- raise ValueError(f"Unsupported data type: {data_type}")
192
+ return new_data
193
+ # raise ValueError(f"Unsupported data type: {data_type}")
172
194
 
173
195
  def is_old_format(self, data: resources_pb2.Data) -> bool:
174
196
  """Check if the Data proto is in the old format (without parts)."""
@@ -195,6 +217,17 @@ class ModelClass(ABC):
195
217
 
196
218
  return False
197
219
 
220
+ def _convert_output_data_to_old_format(self, data: resources_pb2.Data) -> resources_pb2.Data:
221
+ """Convert output data to old format."""
222
+ old_data = resources_pb2.Data()
223
+ part_data = data.parts[0].data
224
+ # Handle text.raw specially (common case for text outputs)
225
+ old_data = part_data
226
+ if old_data.string_value:
227
+ old_data.text.raw = old_data.string_value
228
+
229
+ return old_data
230
+
198
231
  def _batch_predict(self, method, inputs: List[Dict[str, Any]]) -> List[Any]:
199
232
  """Batch predict method for multiple inputs."""
200
233
  outputs = []
@@ -228,7 +261,8 @@ class ModelClass(ABC):
228
261
  python_param_types = method_info.python_param_types
229
262
  for input in request.inputs:
230
263
  # check if input is in old format
231
- if self.is_old_format(input.data):
264
+ is_convert = self.is_old_format(input.data)
265
+ if is_convert:
232
266
  # convert to new format
233
267
  new_data = self._convert_input_data_to_new_format(input.data, signature.input_fields)
234
268
  input.data.CopyFrom(new_data)
@@ -238,11 +272,15 @@ class ModelClass(ABC):
238
272
  if len(inputs) == 1:
239
273
  inputs = inputs[0]
240
274
  output = method(**inputs)
241
- outputs.append(self._convert_output_to_proto(output, signature.output_fields))
275
+ outputs.append(
276
+ self._convert_output_to_proto(
277
+ output, signature.output_fields, convert_old_format=is_convert))
242
278
  else:
243
279
  outputs = self._batch_predict(method, inputs)
244
280
  outputs = [
245
- self._convert_output_to_proto(output, signature.output_fields) for output in outputs
281
+ self._convert_output_to_proto(
282
+ output, signature.output_fields, convert_old_format=is_convert)
283
+ for output in outputs
246
284
  ]
247
285
 
248
286
  return service_pb2.MultiOutputResponse(
@@ -269,7 +307,8 @@ class ModelClass(ABC):
269
307
  python_param_types = method_info.python_param_types
270
308
  for input in request.inputs:
271
309
  # check if input is in old format
272
- if self.is_old_format(input.data):
310
+ is_convert = self.is_old_format(input.data)
311
+ if is_convert:
273
312
  # convert to new format
274
313
  new_data = self._convert_input_data_to_new_format(input.data, signature.input_fields)
275
314
  input.data.CopyFrom(new_data)
@@ -279,7 +318,11 @@ class ModelClass(ABC):
279
318
  inputs = inputs[0]
280
319
  for output in method(**inputs):
281
320
  resp = service_pb2.MultiOutputResponse()
282
- self._convert_output_to_proto(output, signature.output_fields, proto=resp.outputs.add())
321
+ self._convert_output_to_proto(
322
+ output,
323
+ signature.output_fields,
324
+ proto=resp.outputs.add(),
325
+ convert_old_format=is_convert)
283
326
  resp.status.code = status_code_pb2.SUCCESS
284
327
  yield resp
285
328
  else:
@@ -287,7 +330,10 @@ class ModelClass(ABC):
287
330
  resp = service_pb2.MultiOutputResponse()
288
331
  for output in outputs:
289
332
  self._convert_output_to_proto(
290
- output, signature.output_fields, proto=resp.outputs.add())
333
+ output,
334
+ signature.output_fields,
335
+ proto=resp.outputs.add(),
336
+ convert_old_format=is_convert)
291
337
  resp.status.code = status_code_pb2.SUCCESS
292
338
  yield resp
293
339
  except Exception as e:
@@ -322,7 +368,8 @@ class ModelClass(ABC):
322
368
 
323
369
  for input in request.inputs:
324
370
  # check if input is in old format
325
- if self.is_old_format(input.data):
371
+ is_convert = self.is_old_format(input.data)
372
+ if is_convert:
326
373
  # convert to new format
327
374
  new_data = self._convert_input_data_to_new_format(input.data, signature.input_fields)
328
375
  input.data.CopyFrom(new_data)
@@ -349,7 +396,11 @@ class ModelClass(ABC):
349
396
 
350
397
  for output in method(**kwargs):
351
398
  resp = service_pb2.MultiOutputResponse()
352
- self._convert_output_to_proto(output, signature.output_fields, proto=resp.outputs.add())
399
+ self._convert_output_to_proto(
400
+ output,
401
+ signature.output_fields,
402
+ proto=resp.outputs.add(),
403
+ convert_old_format=is_convert)
353
404
  resp.status.code = status_code_pb2.SUCCESS
354
405
  yield resp
355
406
  except Exception as e:
@@ -387,10 +438,15 @@ class ModelClass(ABC):
387
438
  def _convert_output_to_proto(self,
388
439
  output: Any,
389
440
  variables_signature: List[resources_pb2.ModelTypeField],
390
- proto=None) -> resources_pb2.Output:
441
+ proto=None,
442
+ convert_old_format=False) -> resources_pb2.Output:
391
443
  if proto is None:
392
444
  proto = resources_pb2.Output()
393
445
  serialize({'return': output}, variables_signature, proto.data, is_output=True)
446
+ if convert_old_format:
447
+ # convert to old format
448
+ data = self._convert_output_data_to_old_format(proto.data)
449
+ proto.data.CopyFrom(data)
394
450
  proto.status.code = status_code_pb2.SUCCESS
395
451
  if hasattr(self, "_prompt_tokens") and self._prompt_tokens is not None:
396
452
  proto.prompt_tokens = self._prompt_tokens
@@ -279,11 +279,6 @@ def serialize(kwargs, signatures, proto=None, is_output=False):
279
279
  raise TypeError('Got a single return value, but expected multiple outputs {%s}' %
280
280
  ', '.join(sig.name for sig in signatures))
281
281
  raise TypeError('Got unexpected key: %s' % ', '.join(unknown))
282
- inline_first_value = False
283
- if (is_output and len(signatures) == 1 and signatures[0].name == 'return' and
284
- len(kwargs) == 1 and 'return' in kwargs):
285
- # if there is only one output, flatten it and return directly
286
- inline_first_value = True
287
282
  for sig_i, sig in enumerate(signatures):
288
283
  if sig.name not in kwargs:
289
284
  if sig.required:
@@ -293,16 +288,10 @@ def serialize(kwargs, signatures, proto=None, is_output=False):
293
288
  serializer = serializer_from_signature(sig)
294
289
  # TODO determine if any (esp the first) var can go in the proto without parts
295
290
  # and whether to put this in the signature or dynamically determine it
296
- if inline_first_value and sig_i == 0 and id(data) not in _ZERO_VALUE_IDS:
297
- # inlined first value; note data must not be empty or 0 to inline, since that
298
- # will correspond to the missing value case (which uses function defaults).
299
- # empty values are put explicitly in parts.
300
- serializer.serialize(proto, data)
301
- else:
302
- # add the part to the proto
303
- part = proto.parts.add()
304
- part.id = sig.name
305
- serializer.serialize(part.data, data)
291
+ # add the part to the proto
292
+ part = proto.parts.add()
293
+ part.id = sig.name
294
+ serializer.serialize(part.data, data)
306
295
  return proto
307
296
 
308
297
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: clarifai
3
- Version: 11.2.3rc3
3
+ Version: 11.2.3rc5
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -1,4 +1,4 @@
1
- clarifai/__init__.py,sha256=2zBVkS5dR4EMffWHJr4_I4tyosXNQb0xw_nK3IvbK9k,26
1
+ clarifai/__init__.py,sha256=3owdEcoZvJ80nDEku3Fx06-8DotYBYlixS7OPTQzrAY,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
@@ -139,7 +139,7 @@ clarifai/runners/dockerfile_template/Dockerfile.template,sha256=5cjv7U8PmWa3DB_5
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
141
  clarifai/runners/models/model_builder.py,sha256=vJXYrxBwuayanMquAPwFOv9z7U5EQ2aIdppl8DfTGgQ,36900
142
- clarifai/runners/models/model_class.py,sha256=LO0CRs_xUoBr2Av1u3vVJ01doVS8VKwa_LRjz9Dgq2M,18726
142
+ clarifai/runners/models/model_class.py,sha256=xVjcs6j3QhwHH73XVE4KUuHCrzXvC_snbw4_eeSfjuc,20436
143
143
  clarifai/runners/models/model_class_refract.py,sha256=HxuozxSW7ag5yWCPxjNwgLArQ6dORhyGXlnpPaZz2-c,3211
144
144
  clarifai/runners/models/model_run_locally.py,sha256=m5uLlXpWVGuQIJv-XBt-sHGx1gD8w6d77f9b85DOZqs,18170
145
145
  clarifai/runners/models/model_runner.py,sha256=T4Qn_x0vky7XdeS54bvipzEmKZMra1tQdAu_u01yyjc,6503
@@ -164,7 +164,7 @@ clarifai/runners/utils/data_types.py,sha256=bFRKVl2s6Mmx0bQn_lKwbqxBET9wtIEf0Tk6
164
164
  clarifai/runners/utils/data_utils.py,sha256=RoPsi5szPvYLxU5DSO0ZmF-zA33QH7mJpQhZ7It4Y4Q,5289
165
165
  clarifai/runners/utils/loader.py,sha256=SgNHMwRmCCymFQm8aDp73NmIUHhM-N60CBlTKbPzmVc,7470
166
166
  clarifai/runners/utils/logger.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
- clarifai/runners/utils/method_signatures.py,sha256=J264OWYrrbUYp9FrXT9l_T1AUXG3NI-PlJWa2ehjJsQ,18739
167
+ clarifai/runners/utils/method_signatures.py,sha256=mr0d0hs-og2icwZn7DmiZqzOMnEqY-ZBW0mheselsZE,18134
168
168
  clarifai/runners/utils/serializers.py,sha256=S4sRsOVvH191vAGTRTAAdwLlQwlK4T5QVRDGPptg9nQ,7191
169
169
  clarifai/runners/utils/url_fetcher.py,sha256=v_8JOWmkyFAzsBulsieKX7Nfjy1Yg7wGSZeqfEvw2cg,1640
170
170
  clarifai/runners/utils/__pycache__/__init__.cpython-310.pyc,sha256=0GGbXIecXlOZmQKMCkSRhEBY_a1zvoimv-mHG4pJuNA,167
@@ -230,9 +230,9 @@ clarifai/workflows/__pycache__/__init__.cpython-39.pyc,sha256=9nA--jULSW7OFrYOcs
230
230
  clarifai/workflows/__pycache__/export.cpython-310.pyc,sha256=phEGwi2gAojCUhRTqjZVeTDn7Gk6LCVBeSTjAj4m9iY,2418
231
231
  clarifai/workflows/__pycache__/utils.cpython-310.pyc,sha256=M9_KTM7GOOS5SPrWwAzqHDqyGvgKi3xuSGvyw6MNf-I,1925
232
232
  clarifai/workflows/__pycache__/validate.cpython-310.pyc,sha256=c18Jgp_-CAm8RD_tmUpDCPoqZeexaoWELG0yBzb9rjw,2149
233
- clarifai-11.2.3rc3.dist-info/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
234
- clarifai-11.2.3rc3.dist-info/METADATA,sha256=jLjz9-an2BjoqoHh-kN120yOw0_jDCrPPPDnVgEjn6U,22453
235
- clarifai-11.2.3rc3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
236
- clarifai-11.2.3rc3.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
237
- clarifai-11.2.3rc3.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
238
- clarifai-11.2.3rc3.dist-info/RECORD,,
233
+ clarifai-11.2.3rc5.dist-info/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
234
+ clarifai-11.2.3rc5.dist-info/METADATA,sha256=XLjcksPpc2jWTJiBK1Za4ilNuX_W4zjmzPL3JTIfMMc,22453
235
+ clarifai-11.2.3rc5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
236
+ clarifai-11.2.3rc5.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
237
+ clarifai-11.2.3rc5.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
238
+ clarifai-11.2.3rc5.dist-info/RECORD,,