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 +1 -1
- clarifai/client/model.py +4 -1
- clarifai/runners/models/model_builder.py +9 -4
- clarifai/runners/models/model_class.py +114 -31
- clarifai/runners/models/model_runner.py +23 -7
- clarifai/runners/models/openai_class.py +1 -0
- clarifai/runners/utils/code_script.py +5 -1
- clarifai/runners/utils/model_utils.py +49 -0
- {clarifai-11.5.4.dist-info → clarifai-11.5.6.dist-info}/METADATA +2 -2
- {clarifai-11.5.4.dist-info → clarifai-11.5.6.dist-info}/RECORD +14 -14
- {clarifai-11.5.4.dist-info → clarifai-11.5.6.dist-info}/WHEEL +0 -0
- {clarifai-11.5.4.dist-info → clarifai-11.5.6.dist-info}/entry_points.txt +0 -0
- {clarifai-11.5.4.dist-info → clarifai-11.5.6.dist-info}/licenses/LICENSE +0 -0
- {clarifai-11.5.4.dist-info → clarifai-11.5.6.dist-info}/top_level.txt +0 -0
clarifai/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "11.5.
|
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,
|
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
|
-
|
461
|
-
signatures = {method.name: method.signature for method in
|
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
|
-
|
476
|
-
signatures = [method.signature for method in
|
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
|
-
"""
|
65
|
-
|
66
|
-
|
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.
|
73
|
-
signatures = {
|
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
|
-
|
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.
|
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 =
|
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
|
-
|
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 =
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
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
|
-
#
|
363
|
-
#
|
364
|
-
|
365
|
-
|
366
|
-
|
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
|
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
|
-
|
447
|
+
method_infos = getattr(cls, _METHOD_INFO_ATTR)
|
375
448
|
if func_name:
|
376
|
-
return
|
377
|
-
return
|
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.
|
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
|
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 = [
|
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
|
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
|
-
|
179
|
-
|
180
|
-
|
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(
|
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.
|
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:
|
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=
|
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=
|
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=
|
79
|
-
clarifai/runners/models/model_class.py,sha256
|
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=
|
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=
|
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=
|
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=
|
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.
|
122
|
-
clarifai-11.5.
|
123
|
-
clarifai-11.5.
|
124
|
-
clarifai-11.5.
|
125
|
-
clarifai-11.5.
|
126
|
-
clarifai-11.5.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|