clarifai 11.5.4__py3-none-any.whl → 11.5.6__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.6"
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
@@ -550,6 +550,11 @@ class ModelBuilder:
550
550
  "inference_compute_info not found in the config file"
551
551
  )
552
552
  inference_compute_info = self.config.get('inference_compute_info')
553
+ # Ensure cpu_limit is a string if it exists and is an int
554
+ if 'cpu_limit' in inference_compute_info and isinstance(
555
+ inference_compute_info['cpu_limit'], int
556
+ ):
557
+ inference_compute_info['cpu_limit'] = str(inference_compute_info['cpu_limit'])
553
558
  return json_format.ParseDict(inference_compute_info, resources_pb2.ComputeInfo())
554
559
 
555
560
  def check_model_exists(self):
@@ -1,7 +1,7 @@
1
1
  import inspect
2
2
  import itertools
3
- import logging
4
3
  import os
4
+ import threading
5
5
  import traceback
6
6
  from abc import ABC
7
7
  from collections import abc
@@ -20,11 +20,16 @@ from clarifai.runners.utils.method_signatures import (
20
20
  serialize,
21
21
  signatures_to_json,
22
22
  )
23
+ from clarifai.runners.utils.model_utils import is_proto_style_method
24
+ from clarifai.utils.logging import logger
23
25
 
24
26
  _METHOD_INFO_ATTR = '_cf_method_info'
25
27
 
26
28
  _RAISE_EXCEPTIONS = os.getenv("RAISE_EXCEPTIONS", "false").lower() in ("true", "1")
27
29
 
30
+ FALLBACK_METHOD_PROTO = 'PostModelOutputs'
31
+ FALLBACK_METHOD_PYTHON = 'predict'
32
+
28
33
 
29
34
  class ModelClass(ABC):
30
35
  '''
@@ -55,22 +60,33 @@ class ModelClass(ABC):
55
60
  yield item.x + ' ' + str(item.y)
56
61
  '''
57
62
 
63
+ def __init__(self):
64
+ super().__init__()
65
+ self._thread_local = threading.local()
66
+
58
67
  @staticmethod
59
68
  def method(func):
60
69
  setattr(func, _METHOD_INFO_ATTR, _MethodInfo(func))
61
70
  return func
62
71
 
63
72
  def set_output_context(self, prompt_tokens=None, completion_tokens=None):
64
- """This is used to set the prompt and completion tokens in the Output proto"""
65
- self._prompt_tokens = prompt_tokens
66
- self._completion_tokens = completion_tokens
73
+ """Set the prompt and completion tokens for the Output proto.
74
+ In batch mode, call this once per output, in order, before returning each output.
75
+ """
76
+ if not hasattr(self._thread_local, 'token_contexts'):
77
+ self._thread_local.token_contexts = []
78
+ self._thread_local.token_contexts.append((prompt_tokens, completion_tokens))
67
79
 
68
80
  def load_model(self):
69
81
  """Load the model."""
70
82
 
71
83
  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()}
84
+ methods = self._get_method_infos()
85
+ signatures = {
86
+ method.name: method.signature
87
+ for method in methods.values()
88
+ if method.signature is not None
89
+ }
74
90
  resp = service_pb2.MultiOutputResponse(
75
91
  status=status_pb2.Status(code=status_code_pb2.SUCCESS)
76
92
  )
@@ -99,18 +115,61 @@ class ModelClass(ABC):
99
115
  outputs = []
100
116
  try:
101
117
  # TODO add method name field to proto
102
- method_name = 'predict'
118
+ # to support old callers who might not pass in the method name we have a few defaults.
119
+ # first we look for a PostModelOutputs method that is implemented as protos and use that
120
+ # if it exists.
121
+ # if not we default to 'predict'.
122
+ method_name = None
103
123
  if len(request.inputs) > 0 and '_method_name' in request.inputs[0].data.metadata:
104
124
  method_name = request.inputs[0].data.metadata['_method_name']
125
+ if method_name is None and FALLBACK_METHOD_PROTO in self._get_method_infos():
126
+ _info = self._get_method_infos(FALLBACK_METHOD_PROTO)
127
+ if _info.proto_method:
128
+ method_name = FALLBACK_METHOD_PROTO
129
+ if method_name is None:
130
+ method_name = FALLBACK_METHOD_PYTHON
105
131
  if (
106
132
  method_name == '_GET_SIGNATURES'
107
133
  ): # special case to fetch signatures, TODO add endpoint for this
108
134
  return self._handle_get_signatures_request()
109
- if method_name not in self._get_method_info():
135
+ if method_name not in self._get_method_infos():
110
136
  raise ValueError(f"Method {method_name} not found in model class")
111
137
  method = getattr(self, method_name)
112
- method_info = method._cf_method_info
138
+ method_info = self._get_method_infos(method_name)
113
139
  signature = method_info.signature
140
+ proto_method = method_info.proto_method
141
+
142
+ # If this is an old predict(proto) -> proto method, just call it and return
143
+ # the response.
144
+ if proto_method:
145
+ out_proto = method(request)
146
+ # if we already have out_proto.status.code set then return
147
+ if out_proto.status.code != status_code_pb2.ZERO:
148
+ return out_proto
149
+
150
+ successes = [
151
+ out.status.code == status_code_pb2.SUCCESS for out in out_proto.outputs
152
+ ]
153
+ if all(successes):
154
+ # If all outputs are successful, we can return the response.
155
+ out_proto.status.CopyFrom(
156
+ status_pb2.Status(code=status_code_pb2.SUCCESS, description='Success')
157
+ )
158
+ return out_proto
159
+ if any(successes):
160
+ # If some outputs are successful and some are not, we return a mixed status.
161
+ out_proto.status.CopyFrom(
162
+ status_pb2.Status(
163
+ code=status_code_pb2.MIXED_STATUS, description='Mixed Status'
164
+ )
165
+ )
166
+ return out_proto
167
+ # If all outputs are failures, we return a failure status.
168
+ out_proto.status.CopyFrom(
169
+ status_pb2.Status(code=status_code_pb2.FAILURE, description='Failed')
170
+ )
171
+ return out_proto
172
+
114
173
  python_param_types = method_info.python_param_types
115
174
  for input in request.inputs:
116
175
  # check if input is in old format
@@ -121,6 +180,7 @@ class ModelClass(ABC):
121
180
  input.data, signature.input_fields
122
181
  )
123
182
  input.data.CopyFrom(new_data)
183
+
124
184
  # convert inputs to python types
125
185
  inputs = self._convert_input_protos_to_python(
126
186
  request.inputs, signature.input_fields, python_param_types
@@ -148,7 +208,7 @@ class ModelClass(ABC):
148
208
  except Exception as e:
149
209
  if _RAISE_EXCEPTIONS:
150
210
  raise
151
- logging.exception("Error in predict")
211
+ logger.exception("Error in predict")
152
212
  return service_pb2.MultiOutputResponse(
153
213
  status=status_pb2.Status(
154
214
  code=status_code_pb2.FAILURE,
@@ -161,11 +221,12 @@ class ModelClass(ABC):
161
221
  self, request: service_pb2.PostModelOutputsRequest
162
222
  ) -> Iterator[service_pb2.MultiOutputResponse]:
163
223
  try:
224
+ assert len(request.inputs) == 1, "Generate requires exactly one input"
164
225
  method_name = 'generate'
165
226
  if len(request.inputs) > 0 and '_method_name' in request.inputs[0].data.metadata:
166
227
  method_name = request.inputs[0].data.metadata['_method_name']
167
228
  method = getattr(self, method_name)
168
- method_info = method._cf_method_info
229
+ method_info = self._get_method_infos(method_name)
169
230
  signature = method_info.signature
170
231
  python_param_types = method_info.python_param_types
171
232
  for input in request.inputs:
@@ -207,7 +268,7 @@ class ModelClass(ABC):
207
268
  except Exception as e:
208
269
  if _RAISE_EXCEPTIONS:
209
270
  raise
210
- logging.exception("Error in generate")
271
+ logger.exception("Error in generate")
211
272
  yield service_pb2.MultiOutputResponse(
212
273
  status=status_pb2.Status(
213
274
  code=status_code_pb2.FAILURE,
@@ -227,7 +288,7 @@ class ModelClass(ABC):
227
288
  if len(request.inputs) > 0 and '_method_name' in request.inputs[0].data.metadata:
228
289
  method_name = request.inputs[0].data.metadata['_method_name']
229
290
  method = getattr(self, method_name)
230
- method_info = method._cf_method_info
291
+ method_info = self._get_method_infos(method_name)
231
292
  signature = method_info.signature
232
293
  python_param_types = method_info.python_param_types
233
294
 
@@ -282,7 +343,7 @@ class ModelClass(ABC):
282
343
  except Exception as e:
283
344
  if _RAISE_EXCEPTIONS:
284
345
  raise
285
- logging.exception("Error in stream")
346
+ logger.exception("Error in stream")
286
347
  yield service_pb2.MultiOutputResponse(
287
348
  status=status_pb2.Status(
288
349
  code=status_code_pb2.FAILURE,
@@ -333,12 +394,18 @@ class ModelClass(ABC):
333
394
  data = DataConverter.convert_output_data_to_old_format(proto.data)
334
395
  proto.data.CopyFrom(data)
335
396
  proto.status.code = status_code_pb2.SUCCESS
336
- if hasattr(self, "_prompt_tokens") and self._prompt_tokens is not None:
337
- proto.prompt_tokens = self._prompt_tokens
338
- if hasattr(self, "_completion_tokens") and self._completion_tokens is not None:
339
- proto.completion_tokens = self._completion_tokens
340
- self._prompt_tokens = None
341
- self._completion_tokens = None
397
+ # Per-output token context support
398
+ token_contexts = getattr(self._thread_local, 'token_contexts', None)
399
+ prompt_tokens = completion_tokens = None
400
+ if token_contexts and len(token_contexts) > 0:
401
+ prompt_tokens, completion_tokens = token_contexts.pop(0)
402
+ # If this was the last, clean up
403
+ if len(token_contexts) == 0:
404
+ del self._thread_local.token_contexts
405
+ if prompt_tokens is not None:
406
+ proto.prompt_tokens = prompt_tokens
407
+ if completion_tokens is not None:
408
+ proto.completion_tokens = completion_tokens
342
409
  return proto
343
410
 
344
411
  @classmethod
@@ -359,28 +426,44 @@ class ModelClass(ABC):
359
426
  continue
360
427
  methods[name] = method_info
361
428
  # 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)
429
+ # older models never had generate or stream so don't bother with them.
430
+ for name in [FALLBACK_METHOD_PROTO]: # , 'GenerateModelOutputs', 'StreamModelOutputs'):
431
+ if hasattr(cls, name) and name not in methods:
432
+ method = getattr(cls, name)
433
+ if not callable(method):
434
+ continue
435
+ if is_proto_style_method(method):
436
+ # If this is a proto-style method, we can add it to the registry as a special case.
437
+ methods[name] = _MethodInfo(method, proto_method=True)
367
438
  # set method table for this class in the registry
368
439
  return methods
369
440
 
370
441
  @classmethod
371
- def _get_method_info(cls, func_name=None):
442
+ def _get_method_infos(cls, func_name=None):
443
+ # FIXME: this is a re-use of the _METHOD_INFO_ATTR attribute to store the method info
444
+ # for all methods on the class. Should use a different attribute name to avoid confusion.
372
445
  if not hasattr(cls, _METHOD_INFO_ATTR):
373
446
  setattr(cls, _METHOD_INFO_ATTR, cls._register_model_methods())
374
- method_info = getattr(cls, _METHOD_INFO_ATTR)
447
+ method_infos = getattr(cls, _METHOD_INFO_ATTR)
375
448
  if func_name:
376
- return method_info[func_name]
377
- return method_info
449
+ return method_infos[func_name]
450
+ return method_infos
378
451
 
379
452
 
380
453
  class _MethodInfo:
381
- def __init__(self, method):
454
+ def __init__(self, method, proto_method=False):
455
+ """Initialize a MethodInfo instance.
456
+
457
+ Args:
458
+ method: The method to wrap.
459
+ old_method: If True, this is an old proto-style method that returns a proto directly.
460
+ """
382
461
  self.name = method.__name__
383
- self.signature = build_function_signature(method)
462
+ self.proto_method = proto_method
463
+ if not proto_method:
464
+ self.signature = build_function_signature(method)
465
+ else:
466
+ self.signature = None
384
467
  self.python_param_types = {
385
468
  p.name: p.annotation
386
469
  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 = []
@@ -34,6 +34,7 @@ class OpenAIModelClass(ModelClass):
34
34
  model = None
35
35
 
36
36
  def __init__(self) -> None:
37
+ super().__init__()
37
38
  if self.client is None:
38
39
  raise NotImplementedError("Subclasses must set the 'client' class attribute")
39
40
  if self.model is None:
@@ -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.6
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=BxuXNC41hShXWv3SgslBYu8ufM3yw21Lbp4jemirGjY,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,12 +75,12 @@ 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=lzXf1H4oQ4l672xHoXSaT4bi0z0vTj3YnziT7RRRLIg,63695
79
+ clarifai/runners/models/model_class.py,sha256=Ndh437BNMkpFBo6B108GuKL8sGYaGnSplZ6FxOgd_v8,20010
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
- clarifai/runners/models/openai_class.py,sha256=aXlk5W6LWkh-A4eZYi74DeLW0i_86_9DYYGxpJHXI0w,6688
83
+ clarifai/runners/models/openai_class.py,sha256=OVYe4dWJPhskyZn53X9yJorzKZA7mjRCqYbu1rzRTFU,6715
84
84
  clarifai/runners/models/visual_classifier_class.py,sha256=1ZoLfCT2crrgRbejjTMAIwpTRgQMiH9N9yflOVpFxSg,2721
85
85
  clarifai/runners/models/visual_detector_class.py,sha256=ky4oFAkGCKPpGPdgaOso-n6D3HcmnbKee_8hBsNiV8U,2883
86
86
  clarifai/runners/pipeline_steps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -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.6.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
122
+ clarifai-11.5.6.dist-info/METADATA,sha256=dE9Pb314d6-aAeFuNetMEyt6GsbveEuJdqnjTbeln7E,22737
123
+ clarifai-11.5.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
+ clarifai-11.5.6.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
125
+ clarifai-11.5.6.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
126
+ clarifai-11.5.6.dist-info/RECORD,,