clarifai 11.5.4__py3-none-any.whl → 11.5.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.
clarifai/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "11.5.4"
1
+ __version__ = "11.5.5"
clarifai/client/model.py CHANGED
@@ -528,7 +528,10 @@ class Model(Lister, BaseClient):
528
528
  inference_params = kwargs.get('inference_params', {})
529
529
  output_config = kwargs.get('output_config', {})
530
530
  return self.client._predict_by_proto(
531
- inputs=inputs, inference_params=inference_params, output_config=output_config
531
+ inputs=inputs,
532
+ # method_name="PostModelOutputs",
533
+ inference_params=inference_params,
534
+ output_config=output_config,
532
535
  )
533
536
 
534
537
  return self.client.predict(*args, **kwargs)
@@ -457,8 +457,8 @@ class ModelBuilder:
457
457
  Returns the method signatures for the model class in YAML format.
458
458
  """
459
459
  model_class = self.load_model_class(mocking=True)
460
- method_info = model_class._get_method_info()
461
- signatures = {method.name: method.signature for method in method_info.values()}
460
+ method_infos = model_class._get_method_infos()
461
+ signatures = {method.name: method.signature for method in method_infos.values()}
462
462
  return signatures_to_yaml(signatures)
463
463
 
464
464
  def get_method_signatures(self, mocking=True):
@@ -472,8 +472,8 @@ class ModelBuilder:
472
472
  list: A list of method signatures for the model class.
473
473
  """
474
474
  model_class = self.load_model_class(mocking=mocking)
475
- method_info = model_class._get_method_info()
476
- signatures = [method.signature for method in method_info.values()]
475
+ method_infos = model_class._get_method_infos()
476
+ signatures = [method.signature for method in method_infos.values()]
477
477
  return signatures
478
478
 
479
479
  @property
@@ -1,6 +1,5 @@
1
1
  import inspect
2
2
  import itertools
3
- import logging
4
3
  import os
5
4
  import traceback
6
5
  from abc import ABC
@@ -20,11 +19,16 @@ from clarifai.runners.utils.method_signatures import (
20
19
  serialize,
21
20
  signatures_to_json,
22
21
  )
22
+ from clarifai.runners.utils.model_utils import is_proto_style_method
23
+ from clarifai.utils.logging import logger
23
24
 
24
25
  _METHOD_INFO_ATTR = '_cf_method_info'
25
26
 
26
27
  _RAISE_EXCEPTIONS = os.getenv("RAISE_EXCEPTIONS", "false").lower() in ("true", "1")
27
28
 
29
+ FALLBACK_METHOD_PROTO = 'PostModelOutputs'
30
+ FALLBACK_METHOD_PYTHON = 'predict'
31
+
28
32
 
29
33
  class ModelClass(ABC):
30
34
  '''
@@ -69,8 +73,12 @@ class ModelClass(ABC):
69
73
  """Load the model."""
70
74
 
71
75
  def _handle_get_signatures_request(self) -> service_pb2.MultiOutputResponse:
72
- methods = self._get_method_info()
73
- signatures = {method.name: method.signature for method in methods.values()}
76
+ methods = self._get_method_infos()
77
+ signatures = {
78
+ method.name: method.signature
79
+ for method in methods.values()
80
+ if method.signature is not None
81
+ }
74
82
  resp = service_pb2.MultiOutputResponse(
75
83
  status=status_pb2.Status(code=status_code_pb2.SUCCESS)
76
84
  )
@@ -99,18 +107,61 @@ class ModelClass(ABC):
99
107
  outputs = []
100
108
  try:
101
109
  # TODO add method name field to proto
102
- method_name = 'predict'
110
+ # to support old callers who might not pass in the method name we have a few defaults.
111
+ # first we look for a PostModelOutputs method that is implemented as protos and use that
112
+ # if it exists.
113
+ # if not we default to 'predict'.
114
+ method_name = None
103
115
  if len(request.inputs) > 0 and '_method_name' in request.inputs[0].data.metadata:
104
116
  method_name = request.inputs[0].data.metadata['_method_name']
117
+ if method_name is None and FALLBACK_METHOD_PROTO in self._get_method_infos():
118
+ _info = self._get_method_infos(FALLBACK_METHOD_PROTO)
119
+ if _info.proto_method:
120
+ method_name = FALLBACK_METHOD_PROTO
121
+ if method_name is None:
122
+ method_name = FALLBACK_METHOD_PYTHON
105
123
  if (
106
124
  method_name == '_GET_SIGNATURES'
107
125
  ): # special case to fetch signatures, TODO add endpoint for this
108
126
  return self._handle_get_signatures_request()
109
- if method_name not in self._get_method_info():
127
+ if method_name not in self._get_method_infos():
110
128
  raise ValueError(f"Method {method_name} not found in model class")
111
129
  method = getattr(self, method_name)
112
- method_info = method._cf_method_info
130
+ method_info = self._get_method_infos(method_name)
113
131
  signature = method_info.signature
132
+ proto_method = method_info.proto_method
133
+
134
+ # If this is an old predict(proto) -> proto method, just call it and return
135
+ # the response.
136
+ if proto_method:
137
+ out_proto = method(request)
138
+ # if we already have out_proto.status.code set then return
139
+ if out_proto.status.code != status_code_pb2.ZERO:
140
+ return out_proto
141
+
142
+ successes = [
143
+ out.status.code == status_code_pb2.SUCCESS for out in out_proto.outputs
144
+ ]
145
+ if all(successes):
146
+ # If all outputs are successful, we can return the response.
147
+ out_proto.status.CopyFrom(
148
+ status_pb2.Status(code=status_code_pb2.SUCCESS, description='Success')
149
+ )
150
+ return out_proto
151
+ if any(successes):
152
+ # If some outputs are successful and some are not, we return a mixed status.
153
+ out_proto.status.CopyFrom(
154
+ status_pb2.Status(
155
+ code=status_code_pb2.MIXED_STATUS, description='Mixed Status'
156
+ )
157
+ )
158
+ return out_proto
159
+ # If all outputs are failures, we return a failure status.
160
+ out_proto.status.CopyFrom(
161
+ status_pb2.Status(code=status_code_pb2.FAILURE, description='Failed')
162
+ )
163
+ return out_proto
164
+
114
165
  python_param_types = method_info.python_param_types
115
166
  for input in request.inputs:
116
167
  # check if input is in old format
@@ -121,6 +172,7 @@ class ModelClass(ABC):
121
172
  input.data, signature.input_fields
122
173
  )
123
174
  input.data.CopyFrom(new_data)
175
+
124
176
  # convert inputs to python types
125
177
  inputs = self._convert_input_protos_to_python(
126
178
  request.inputs, signature.input_fields, python_param_types
@@ -148,7 +200,7 @@ class ModelClass(ABC):
148
200
  except Exception as e:
149
201
  if _RAISE_EXCEPTIONS:
150
202
  raise
151
- logging.exception("Error in predict")
203
+ logger.exception("Error in predict")
152
204
  return service_pb2.MultiOutputResponse(
153
205
  status=status_pb2.Status(
154
206
  code=status_code_pb2.FAILURE,
@@ -165,7 +217,7 @@ class ModelClass(ABC):
165
217
  if len(request.inputs) > 0 and '_method_name' in request.inputs[0].data.metadata:
166
218
  method_name = request.inputs[0].data.metadata['_method_name']
167
219
  method = getattr(self, method_name)
168
- method_info = method._cf_method_info
220
+ method_info = self._get_method_infos(method_name)
169
221
  signature = method_info.signature
170
222
  python_param_types = method_info.python_param_types
171
223
  for input in request.inputs:
@@ -207,7 +259,7 @@ class ModelClass(ABC):
207
259
  except Exception as e:
208
260
  if _RAISE_EXCEPTIONS:
209
261
  raise
210
- logging.exception("Error in generate")
262
+ logger.exception("Error in generate")
211
263
  yield service_pb2.MultiOutputResponse(
212
264
  status=status_pb2.Status(
213
265
  code=status_code_pb2.FAILURE,
@@ -227,7 +279,7 @@ class ModelClass(ABC):
227
279
  if len(request.inputs) > 0 and '_method_name' in request.inputs[0].data.metadata:
228
280
  method_name = request.inputs[0].data.metadata['_method_name']
229
281
  method = getattr(self, method_name)
230
- method_info = method._cf_method_info
282
+ method_info = self._get_method_infos(method_name)
231
283
  signature = method_info.signature
232
284
  python_param_types = method_info.python_param_types
233
285
 
@@ -282,7 +334,7 @@ class ModelClass(ABC):
282
334
  except Exception as e:
283
335
  if _RAISE_EXCEPTIONS:
284
336
  raise
285
- logging.exception("Error in stream")
337
+ logger.exception("Error in stream")
286
338
  yield service_pb2.MultiOutputResponse(
287
339
  status=status_pb2.Status(
288
340
  code=status_code_pb2.FAILURE,
@@ -359,28 +411,44 @@ class ModelClass(ABC):
359
411
  continue
360
412
  methods[name] = method_info
361
413
  # check for generic predict(request) -> response, etc. methods
362
- # for name in ('predict', 'generate', 'stream'):
363
- # if hasattr(cls, name):
364
- # method = getattr(cls, name)
365
- # if not hasattr(method, _METHOD_INFO_ATTR): # not already put in registry
366
- # methods[name] = _MethodInfo(method)
414
+ # older models never had generate or stream so don't bother with them.
415
+ for name in [FALLBACK_METHOD_PROTO]: # , 'GenerateModelOutputs', 'StreamModelOutputs'):
416
+ if hasattr(cls, name) and name not in methods:
417
+ method = getattr(cls, name)
418
+ if not callable(method):
419
+ continue
420
+ if is_proto_style_method(method):
421
+ # If this is a proto-style method, we can add it to the registry as a special case.
422
+ methods[name] = _MethodInfo(method, proto_method=True)
367
423
  # set method table for this class in the registry
368
424
  return methods
369
425
 
370
426
  @classmethod
371
- def _get_method_info(cls, func_name=None):
427
+ def _get_method_infos(cls, func_name=None):
428
+ # FIXME: this is a re-use of the _METHOD_INFO_ATTR attribute to store the method info
429
+ # for all methods on the class. Should use a different attribute name to avoid confusion.
372
430
  if not hasattr(cls, _METHOD_INFO_ATTR):
373
431
  setattr(cls, _METHOD_INFO_ATTR, cls._register_model_methods())
374
- method_info = getattr(cls, _METHOD_INFO_ATTR)
432
+ method_infos = getattr(cls, _METHOD_INFO_ATTR)
375
433
  if func_name:
376
- return method_info[func_name]
377
- return method_info
434
+ return method_infos[func_name]
435
+ return method_infos
378
436
 
379
437
 
380
438
  class _MethodInfo:
381
- def __init__(self, method):
439
+ def __init__(self, method, proto_method=False):
440
+ """Initialize a MethodInfo instance.
441
+
442
+ Args:
443
+ method: The method to wrap.
444
+ old_method: If True, this is an old proto-style method that returns a proto directly.
445
+ """
382
446
  self.name = method.__name__
383
- self.signature = build_function_signature(method)
447
+ self.proto_method = proto_method
448
+ if not proto_method:
449
+ self.signature = build_function_signature(method)
450
+ else:
451
+ self.signature = None
384
452
  self.python_param_types = {
385
453
  p.name: p.annotation
386
454
  for p in inspect.signature(method).parameters.values()
@@ -108,9 +108,19 @@ class ModelRunner(BaseRunner, HealthProbeRequestHandler):
108
108
  ensure_urls_downloaded(request, auth_helper=self._auth_helper)
109
109
 
110
110
  resp = self.model.predict_wrapper(request)
111
- if resp.status.code != status_code_pb2.SUCCESS:
111
+ # if we have any non-successful code already it's an error we can return.
112
+ if (
113
+ resp.status.code != status_code_pb2.SUCCESS
114
+ and resp.status.code != status_code_pb2.ZERO
115
+ ):
112
116
  return service_pb2.RunnerItemOutput(multi_output_response=resp)
113
- successes = [o.status.code == status_code_pb2.SUCCESS for o in resp.outputs]
117
+ successes = []
118
+ for output in resp.outputs:
119
+ if not output.HasField('status') or not output.status.code:
120
+ raise Exception(
121
+ "Output must have a status code, please check the model implementation."
122
+ )
123
+ successes.append(output.status.code == status_code_pb2.SUCCESS)
114
124
  if all(successes):
115
125
  status = status_pb2.Status(
116
126
  code=status_code_pb2.SUCCESS,
@@ -141,7 +151,11 @@ class ModelRunner(BaseRunner, HealthProbeRequestHandler):
141
151
  ensure_urls_downloaded(request, auth_helper=self._auth_helper)
142
152
 
143
153
  for resp in self.model.generate_wrapper(request):
144
- if resp.status.code != status_code_pb2.SUCCESS:
154
+ # if we have any non-successful code already it's an error we can return.
155
+ if (
156
+ resp.status.code != status_code_pb2.SUCCESS
157
+ and resp.status.code != status_code_pb2.ZERO
158
+ ):
145
159
  yield service_pb2.RunnerItemOutput(multi_output_response=resp)
146
160
  continue
147
161
  successes = []
@@ -174,10 +188,12 @@ class ModelRunner(BaseRunner, HealthProbeRequestHandler):
174
188
  self, runner_item_iterator: Iterator[service_pb2.RunnerItem]
175
189
  ) -> Iterator[service_pb2.RunnerItemOutput]:
176
190
  # Call the generate() method the underlying model implements.
177
- for resp in self.model.stream_wrapper(
178
- pmo_iterator(runner_item_iterator, self._auth_helper)
179
- ):
180
- if resp.status.code != status_code_pb2.SUCCESS:
191
+ for resp in self.model.stream_wrapper(pmo_iterator(runner_item_iterator)):
192
+ # if we have any non-successful code already it's an error we can return.
193
+ if (
194
+ resp.status.code != status_code_pb2.SUCCESS
195
+ and resp.status.code != status_code_pb2.ZERO
196
+ ):
181
197
  yield service_pb2.RunnerItemOutput(multi_output_response=resp)
182
198
  continue
183
199
  successes = []
@@ -18,7 +18,9 @@ def has_signature_method(
18
18
  :param method_signatures: List of MethodSignature objects to search in.
19
19
  :return: True if a method with the given name exists, False otherwise.
20
20
  """
21
- return any(method_signature.name == name for method_signature in method_signatures)
21
+ return any(
22
+ method_signature.name == name for method_signature in method_signatures if method_signature
23
+ )
22
24
 
23
25
 
24
26
  def generate_client_script(
@@ -153,6 +155,8 @@ model = Model("{model_ui_url}",
153
155
  # Generate method signatures
154
156
  method_signatures_str = []
155
157
  for method_signature in method_signatures:
158
+ if method_signature is None:
159
+ continue
156
160
  method_name = method_signature.name
157
161
  client_script_str = f'response = model.{method_name}('
158
162
  annotations = _get_annotations_source(method_signature)
@@ -1,3 +1,4 @@
1
+ import inspect
1
2
  import os
2
3
  import shlex
3
4
  import signal
@@ -8,6 +9,7 @@ import time
8
9
 
9
10
  import psutil
10
11
  import requests
12
+ from clarifai_grpc.grpc.api import service_pb2
11
13
 
12
14
  from clarifai.utils.logging import logger
13
15
 
@@ -133,3 +135,50 @@ def wait_for_server(base_url: str, timeout: int = None) -> None:
133
135
  raise TimeoutError("Server did not become ready within timeout period")
134
136
  except requests.exceptions.RequestException:
135
137
  time.sleep(1)
138
+
139
+
140
+ def is_proto_style_method(method):
141
+ """
142
+ Determines if the given method is likely an old-style proto method:
143
+ - Has a 'request' parameter after 'self'
144
+ - Optionally, returns a known proto response type
145
+ """
146
+ try:
147
+ sig = inspect.signature(method)
148
+ params = list(sig.parameters.values())
149
+
150
+ # Must have at least 'self' and one argument
151
+ if len(params) < 2:
152
+ return False
153
+
154
+ # First parameter should be 'self'
155
+ if params[0].name != 'self':
156
+ return False
157
+ # Second param typically should be named 'request'
158
+ request_param = params[1]
159
+ if request_param.name != 'request':
160
+ return False
161
+ # Optionally: check annotation is a proto type
162
+ # (If signature is incomplete, this part will gracefully fall through)
163
+ return_annotation = sig.return_annotation
164
+ # If type annotation is available, check it's PostModelOutputsRequest
165
+ if (
166
+ request_param.annotation != inspect.Parameter.empty
167
+ and request_param.annotation != service_pb2.PostModelOutputsRequest
168
+ ):
169
+ return False
170
+ # If return annotation is available, check it's MultiOutputResponse
171
+ if (
172
+ return_annotation != inspect.Signature.empty
173
+ and return_annotation != service_pb2.MultiOutputResponse
174
+ ):
175
+ return False
176
+ if (
177
+ request_param.annotation is inspect.Parameter.empty
178
+ and return_annotation is inspect.Signature.empty
179
+ ):
180
+ return True # signature OK, even if signature is empty
181
+ return True
182
+
183
+ except (ValueError, TypeError):
184
+ return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clarifai
3
- Version: 11.5.4
3
+ Version: 11.5.5
4
4
  Home-page: https://github.com/Clarifai/clarifai-python
5
5
  Author: Clarifai
6
6
  Author-email: support@clarifai.com
@@ -32,7 +32,7 @@ Requires-Dist: click>=8.1.7
32
32
  Requires-Dist: requests>=2.32.3
33
33
  Requires-Dist: aiohttp>=3.10.0
34
34
  Requires-Dist: uv==0.7.12
35
- Requires-Dist: ruff==0.11.4
35
+ Requires-Dist: psutil==7.0.0
36
36
  Provides-Extra: all
37
37
  Requires-Dist: pycocotools>=2.0.7; extra == "all"
38
38
  Dynamic: author
@@ -1,4 +1,4 @@
1
- clarifai/__init__.py,sha256=dX3Oi94KTZEq35Tm3ca-zFtWYOWbwopKBoxPCzh9NFo,23
1
+ clarifai/__init__.py,sha256=OF6Ppf-NDN6b_03eNnRsnEEmYm8mHwco3nReiqZIKq8,23
2
2
  clarifai/cli.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  clarifai/errors.py,sha256=GXa6D4v_L404J83jnRNFPH7s-1V9lk7w6Ws99f1g-AY,2772
4
4
  clarifai/versions.py,sha256=ecSuEB_nOL2XSoYHDw2n23XUbm_KPOGjudMXmQrGdS8,224
@@ -24,7 +24,7 @@ clarifai/client/dataset.py,sha256=OgdpZkQ_vYmRxL8-qphcNozpvPV1bWTlte9Jv6UkKb8,35
24
24
  clarifai/client/deployment.py,sha256=QBf0tzkKBEpzNgmOEmWUJMOlVWdFEFc70Y44o8y75Gs,2875
25
25
  clarifai/client/input.py,sha256=jpX47qwn7aUBBIEuSSLHF5jk70XaWEh0prD065c9b-E,51205
26
26
  clarifai/client/lister.py,sha256=1YEm2suNxPaJO4x9V5szgD_YX6N_00vgSO-7m0HagY8,2208
27
- clarifai/client/model.py,sha256=Oh2zCa7XA_pBAEx9D8ME81H_BBqD7wJYoeB5CEjlI5E,89989
27
+ clarifai/client/model.py,sha256=8D_L6nuL4_hBAKgwseYhoAeKS9u3ky0zczkcJghxFe8,90072
28
28
  clarifai/client/model_client.py,sha256=4gIS0mKBdiNMA1x_6Wo6H7WbfLsmQix64EpONcQjQV4,37129
29
29
  clarifai/client/module.py,sha256=jLViQYvVV3FmRN_ivvbk83uwsx7CgYGeEx4dYAr6yD4,4537
30
30
  clarifai/client/nodepool.py,sha256=Y5zQ0JLdTjAp2TmVnx7AAOwaB2YUslk3nl7s6BQ90FQ,16415
@@ -75,10 +75,10 @@ clarifai/runners/dockerfile_template/Dockerfile.template,sha256=DUH7F0-uLOV0LTjn
75
75
  clarifai/runners/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  clarifai/runners/models/dummy_openai_model.py,sha256=pcmAVbqTTGG4J3BLVjKfvM_SQ-GET_XexIUdLcr9Zvo,8373
77
77
  clarifai/runners/models/mcp_class.py,sha256=RdKn7rW4vYol0VRDZiLTSMfkqjLhO1ijXAQ0Rq0Jfnw,6647
78
- clarifai/runners/models/model_builder.py,sha256=D47H1zm3_Xr-nlPYb_1dY8dxlMiM93kU4QYGEtyxK88,63403
79
- clarifai/runners/models/model_class.py,sha256=-euUF-eHUi4KXR_e1pIwvToDZ13CM6TSz2FolzildjM,16069
78
+ clarifai/runners/models/model_builder.py,sha256=QgGYruFVUS-xfva-wdGaZT0zpLbbc3dkYqOoYSM_jyU,63409
79
+ clarifai/runners/models/model_class.py,sha256=2yAXPsRFIjmyo8n9XUu-YaMOxyRpeVg_MJo4IAo0kRU,19365
80
80
  clarifai/runners/models/model_run_locally.py,sha256=6-6WjEKc0ba3gAv4wOLdMs2XOzS3b-2bZHJS0wdVqJY,20088
81
- clarifai/runners/models/model_runner.py,sha256=CE5UkxW8wCm-g8dn_i1TNkZDORpOGRoVwZK-Uk75Xws,8407
81
+ clarifai/runners/models/model_runner.py,sha256=tZTX1XKMlniJEmd1WMjcwGfej5NCWqv23HZ4xrG8YV8,9153
82
82
  clarifai/runners/models/model_servicer.py,sha256=415RqiXCPH-1WgFHrtZMDH1nb8gaQDpVlrQ_tvtbjOg,4523
83
83
  clarifai/runners/models/openai_class.py,sha256=aXlk5W6LWkh-A4eZYi74DeLW0i_86_9DYYGxpJHXI0w,6688
84
84
  clarifai/runners/models/visual_classifier_class.py,sha256=1ZoLfCT2crrgRbejjTMAIwpTRgQMiH9N9yflOVpFxSg,2721
@@ -88,12 +88,12 @@ clarifai/runners/pipeline_steps/pipeline_step_builder.py,sha256=E6Ce3b0RolYLMJHa
88
88
  clarifai/runners/pipelines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
89
  clarifai/runners/pipelines/pipeline_builder.py,sha256=z_bCwjwQPFa_1AYkorhh5r6t6r5hC5K2D8Z1LTEzIpg,12801
90
90
  clarifai/runners/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- clarifai/runners/utils/code_script.py,sha256=4wkInN_7MgCvMt9KLJA5_13iF5UFdeQLEhs0T5GvsHQ,13830
91
+ clarifai/runners/utils/code_script.py,sha256=RxN4UOBIa61WW1U5y-gC-dwr_tY8ZAKr1nR8sySNWt4,13922
92
92
  clarifai/runners/utils/const.py,sha256=MK7lTzzJKbOiyiUtG_jlJXfz_xNKMn5LjkQ9vjbttXE,1538
93
93
  clarifai/runners/utils/data_utils.py,sha256=HRpMYR2O0OiDpXXhOManLHTeomC4bFnXMHVAiT_12yE,20856
94
94
  clarifai/runners/utils/loader.py,sha256=K5Y8MPbIe5STw2gDnrL8KqFgKNxEo7bz-RV0ip1T4PM,10900
95
95
  clarifai/runners/utils/method_signatures.py,sha256=qdHaO8ZIgP6BBXXMhMPhcQ46dse-XMP2t4VJCNG7O3Q,18335
96
- clarifai/runners/utils/model_utils.py,sha256=Cn3_89ZMhIR6f61H-btcK_Luwq0CMAx5fMxPxwngo68,4530
96
+ clarifai/runners/utils/model_utils.py,sha256=eTIGOZpt0icOGfVnmYM9yO9g7CTsb_plLkzvJIH1QRo,6288
97
97
  clarifai/runners/utils/openai_convertor.py,sha256=ZlIrvvfHttD_DavLvmKZdL8gNq_TQvQtZVnYamwdWz4,8248
98
98
  clarifai/runners/utils/pipeline_validation.py,sha256=RWWWUA3mNCXHCSNpuofMGfXfWEYe7LrYKwIc-1VFvQs,6444
99
99
  clarifai/runners/utils/serializers.py,sha256=pI7GqMTC0T3Lu_X8v8TO4RiplO-gC_49Ns37jYwsPtg,7908
@@ -118,9 +118,9 @@ clarifai/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
118
118
  clarifai/workflows/export.py,sha256=HvUYG9N_-UZoRR0-_tdGbZ950_AeBqawSppgUxQebR0,1913
119
119
  clarifai/workflows/utils.py,sha256=ESL3INcouNcLKCh-nMpfXX-YbtCzX7tz7hT57_RGQ3M,2079
120
120
  clarifai/workflows/validate.py,sha256=UhmukyHkfxiMFrPPeBdUTiCOHQT5-shqivlBYEyKTlU,2931
121
- clarifai-11.5.4.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
122
- clarifai-11.5.4.dist-info/METADATA,sha256=9PlKYam9cZ_1StX7ECiTXQMpS1ci4LjgvKhNi59W-8c,22736
123
- clarifai-11.5.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
- clarifai-11.5.4.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
125
- clarifai-11.5.4.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
126
- clarifai-11.5.4.dist-info/RECORD,,
121
+ clarifai-11.5.5.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
122
+ clarifai-11.5.5.dist-info/METADATA,sha256=SkHXmknF4MRdxN2h9_8tqq-ZZid1avN-WisUenwU6ak,22737
123
+ clarifai-11.5.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
+ clarifai-11.5.5.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
125
+ clarifai-11.5.5.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
126
+ clarifai-11.5.5.dist-info/RECORD,,