clarifai 11.6.5__py3-none-any.whl → 11.6.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/cli/base.py +28 -16
- clarifai/cli/model.py +55 -8
- clarifai/client/model_client.py +20 -1
- clarifai/runners/server.py +23 -1
- clarifai/runners/utils/model_utils.py +4 -4
- clarifai/utils/cli.py +38 -30
- {clarifai-11.6.5.dist-info → clarifai-11.6.6.dist-info}/METADATA +2 -2
- {clarifai-11.6.5.dist-info → clarifai-11.6.6.dist-info}/RECORD +13 -13
- {clarifai-11.6.5.dist-info → clarifai-11.6.6.dist-info}/WHEEL +0 -0
- {clarifai-11.6.5.dist-info → clarifai-11.6.6.dist-info}/entry_points.txt +0 -0
- {clarifai-11.6.5.dist-info → clarifai-11.6.6.dist-info}/licenses/LICENSE +0 -0
- {clarifai-11.6.5.dist-info → clarifai-11.6.6.dist-info}/top_level.txt +0 -0
clarifai/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "11.6.
|
1
|
+
__version__ = "11.6.6"
|
clarifai/cli/base.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import getpass
|
1
2
|
import json
|
2
3
|
import os
|
3
4
|
import sys
|
@@ -71,33 +72,44 @@ def login(ctx, api_url, user_id):
|
|
71
72
|
"""Login command to set PAT and other configurations."""
|
72
73
|
from clarifai.utils.cli import validate_context_auth
|
73
74
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
'personal access token value (default: "ENVVAR" to get out of env var rather than config): ',
|
78
|
-
'ENVVAR',
|
75
|
+
click.echo('> To authenticate, you\'ll need a Personal Access Token (PAT).')
|
76
|
+
click.echo(
|
77
|
+
'> You can create one from your account settings: https://clarifai.com/settings/security\n'
|
79
78
|
)
|
80
79
|
|
81
|
-
#
|
80
|
+
# Securely input PAT
|
81
|
+
pat = getpass.getpass('Enter your Personal Access Token: ')
|
82
|
+
|
83
|
+
# Input user_id if not supplied
|
84
|
+
if not user_id:
|
85
|
+
user_id = click.prompt('Enter your Clarifai user ID', type=str)
|
86
|
+
|
87
|
+
# Progress indicator
|
88
|
+
click.echo('\n> Verifying token...')
|
82
89
|
validate_context_auth(pat, user_id, api_url)
|
83
90
|
|
91
|
+
# Context naming
|
92
|
+
default_context_name = 'default'
|
93
|
+
click.echo('\n> Let\'s save these credentials to a new context.')
|
94
|
+
click.echo('> You can have multiple contexts to easily switch between accounts or projects.\n')
|
95
|
+
context_name = click.prompt("Enter a name for this context", default=default_context_name)
|
96
|
+
|
97
|
+
# Save context
|
84
98
|
context = Context(
|
85
|
-
|
99
|
+
context_name,
|
86
100
|
CLARIFAI_API_BASE=api_url,
|
87
101
|
CLARIFAI_USER_ID=user_id,
|
88
102
|
CLARIFAI_PAT=pat,
|
89
103
|
)
|
90
104
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
ctx.obj.contexts[context.name] = context
|
95
|
-
ctx.obj.current_context = context.name
|
96
|
-
|
105
|
+
ctx.obj.contexts[context_name] = context
|
106
|
+
ctx.obj.current_context = context_name
|
97
107
|
ctx.obj.to_yaml()
|
98
|
-
|
99
|
-
|
100
|
-
)
|
108
|
+
click.secho('✅ Success! You are now logged in.', fg='green')
|
109
|
+
click.echo(f'Credentials saved to the \'{context_name}\' context.\n')
|
110
|
+
click.echo('💡 To switch contexts later, use `clarifai config use-context <name>`.')
|
111
|
+
|
112
|
+
logger.info(f"Login successful for user '{user_id}' in context '{context_name}'")
|
101
113
|
|
102
114
|
|
103
115
|
def pat_display(pat):
|
clarifai/cli/model.py
CHANGED
@@ -9,6 +9,7 @@ from clarifai.utils.cli import (
|
|
9
9
|
check_ollama_installed,
|
10
10
|
check_requirements_installed,
|
11
11
|
customize_ollama_model,
|
12
|
+
parse_requirements,
|
12
13
|
validate_context,
|
13
14
|
)
|
14
15
|
from clarifai.utils.constants import (
|
@@ -83,7 +84,14 @@ def model():
|
|
83
84
|
required=False,
|
84
85
|
)
|
85
86
|
def init(
|
86
|
-
model_path,
|
87
|
+
model_path,
|
88
|
+
model_type_id,
|
89
|
+
github_pat,
|
90
|
+
github_url,
|
91
|
+
toolkit,
|
92
|
+
model_name,
|
93
|
+
port,
|
94
|
+
context_length,
|
87
95
|
):
|
88
96
|
"""Initialize a new model directory structure.
|
89
97
|
|
@@ -99,6 +107,13 @@ def init(
|
|
99
107
|
branch to clone from.
|
100
108
|
|
101
109
|
MODEL_PATH: Path where to create the model directory structure. If not specified, the current directory is used by default.
|
110
|
+
MODEL_TYPE_ID: Type of model to create. If not specified, defaults to "text-to-text" for text models.
|
111
|
+
GITHUB_PAT: GitHub Personal Access Token for authentication when cloning private repositories.
|
112
|
+
GITHUB_URL: GitHub repository URL or "repo" format to clone a repository from. If provided, the entire repository contents will be copied to the target directory instead of using default templates.
|
113
|
+
TOOLKIT: Toolkit to use for model initialization. Currently supports "ollama".
|
114
|
+
MODEL_NAME: Model name to configure when using --toolkit. For ollama toolkit, this sets the Ollama model to use (e.g., "llama3.1", "mistral", etc.).
|
115
|
+
PORT: Port to run the Ollama server on. Defaults to 23333.
|
116
|
+
CONTEXT_LENGTH: Context length for the Ollama model. Defaults to 8192.
|
102
117
|
"""
|
103
118
|
# Resolve the absolute path
|
104
119
|
model_path = os.path.abspath(model_path)
|
@@ -509,8 +524,13 @@ def run_locally(model_path, port, mode, keep_env, keep_image, skip_dockerfile=Fa
|
|
509
524
|
show_default=True,
|
510
525
|
help="The number of threads to use. On community plan, the compute time allocation is drained at a rate proportional to the number of threads.",
|
511
526
|
) # pylint: disable=range-builtin-not-iterating
|
527
|
+
@click.option(
|
528
|
+
'--verbose',
|
529
|
+
is_flag=True,
|
530
|
+
help='Show detailed logs including Ollama server output. By default, Ollama logs are suppressed.',
|
531
|
+
)
|
512
532
|
@click.pass_context
|
513
|
-
def local_runner(ctx, model_path, pool_size):
|
533
|
+
def local_runner(ctx, model_path, pool_size, verbose):
|
514
534
|
"""Run the model as a local runner to help debug your model connected to the API or to
|
515
535
|
leverage local compute resources manually. This relies on many variables being present in the env
|
516
536
|
of the currently selected context. If they are not present then default values will be used to
|
@@ -552,7 +572,23 @@ def local_runner(ctx, model_path, pool_size):
|
|
552
572
|
from clarifai.runners.server import serve
|
553
573
|
|
554
574
|
validate_context(ctx)
|
555
|
-
|
575
|
+
builder = ModelBuilder(model_path, download_validation_only=True)
|
576
|
+
logger.info("> Checking local runner requirements...")
|
577
|
+
if not check_requirements_installed(model_path):
|
578
|
+
logger.error(f"Requirements not installed for model at {model_path}.")
|
579
|
+
raise click.Abort()
|
580
|
+
|
581
|
+
# Post check while running `clarifai model local-runner` we check if the toolkit is ollama
|
582
|
+
dependencies = parse_requirements(model_path)
|
583
|
+
if "ollama" in dependencies or builder.config.get('toolkit', {}).get('provider') == 'ollama':
|
584
|
+
logger.info("Verifying Ollama installation...")
|
585
|
+
if not check_ollama_installed():
|
586
|
+
logger.error(
|
587
|
+
"Ollama application is not installed. Please install it from `https://ollama.com/` to use the Ollama toolkit."
|
588
|
+
)
|
589
|
+
raise click.Abort()
|
590
|
+
|
591
|
+
logger.info("> Verifying local runner setup...")
|
556
592
|
logger.info(f"Current context: {ctx.obj.current.name}")
|
557
593
|
user_id = ctx.obj.current.user_id
|
558
594
|
logger.info(f"Current user_id: {user_id}")
|
@@ -693,8 +729,12 @@ def local_runner(ctx, model_path, pool_size):
|
|
693
729
|
if len(model_versions) == 0:
|
694
730
|
logger.warning("No model versions found. Creating a new version for local runner.")
|
695
731
|
version = model.create_version(pretrained_model_config={"local_dev": True}).model_version
|
732
|
+
ctx.obj.current.CLARIFAI_MODEL_VERSION_ID = version.id
|
733
|
+
ctx.obj.to_yaml()
|
696
734
|
else:
|
697
735
|
version = model_versions[0].model_version
|
736
|
+
ctx.obj.current.CLARIFAI_MODEL_VERSION_ID = version.id
|
737
|
+
ctx.obj.to_yaml() # save to yaml file.
|
698
738
|
|
699
739
|
logger.info(f"Current model version {version.id}")
|
700
740
|
|
@@ -796,10 +836,6 @@ def local_runner(ctx, model_path, pool_size):
|
|
796
836
|
|
797
837
|
logger.info(f"Current deployment_id: {deployment_id}")
|
798
838
|
|
799
|
-
logger.info(
|
800
|
-
f"Full url for the model:\n{ctx.obj.current.ui}/users/{user_id}/apps/{app_id}/models/{model.id}/versions/{version.id}"
|
801
|
-
)
|
802
|
-
|
803
839
|
# Now that we have all the context in ctx.obj, we need to update the config.yaml in
|
804
840
|
# the model_path directory with the model object containing user_id, app_id, model_id, version_id
|
805
841
|
config_file = os.path.join(model_path, 'config.yaml')
|
@@ -837,6 +873,16 @@ def local_runner(ctx, model_path, pool_size):
|
|
837
873
|
)
|
838
874
|
raise click.Abort()
|
839
875
|
|
876
|
+
try:
|
877
|
+
logger.info("Customizing Ollama model with provided parameters...")
|
878
|
+
customize_ollama_model(
|
879
|
+
model_path=model_path,
|
880
|
+
verbose=True if verbose else False,
|
881
|
+
)
|
882
|
+
except Exception as e:
|
883
|
+
logger.error(f"Failed to customize Ollama model: {e}")
|
884
|
+
raise click.Abort()
|
885
|
+
|
840
886
|
# don't mock for local runner since you need the dependencies to run the code anyways.
|
841
887
|
method_signatures = builder.get_method_signatures(mocking=False)
|
842
888
|
|
@@ -861,7 +907,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
861
907
|
f"Playground: To chat with your model, visit:\n{ctx.obj.current.ui}/playground?model={model.id}__{version.id}&user_id={user_id}&app_id={app_id}"
|
862
908
|
)
|
863
909
|
|
864
|
-
logger.info("
|
910
|
+
logger.info("✅ Starting local runner...")
|
865
911
|
|
866
912
|
# This reads the config.yaml from the model_path so we alter it above first.
|
867
913
|
serve(
|
@@ -874,6 +920,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
874
920
|
runner_id=runner_id,
|
875
921
|
base_url=ctx.obj.current.api_base,
|
876
922
|
pat=ctx.obj.current.pat,
|
923
|
+
context=ctx.obj.current,
|
877
924
|
)
|
878
925
|
|
879
926
|
|
clarifai/client/model_client.py
CHANGED
@@ -76,7 +76,22 @@ class ModelClient:
|
|
76
76
|
def __getattr__(self, name):
|
77
77
|
if not self._defined:
|
78
78
|
self.fetch()
|
79
|
-
|
79
|
+
try:
|
80
|
+
return self.__getattribute__(name)
|
81
|
+
except AttributeError as e:
|
82
|
+
# Provide helpful error message with available methods
|
83
|
+
available_methods = []
|
84
|
+
if self._method_signatures:
|
85
|
+
available_methods = list(self._method_signatures.keys())
|
86
|
+
|
87
|
+
error_msg = f"'{self.__class__.__name__}' object has no attribute '{name}'"
|
88
|
+
|
89
|
+
if available_methods:
|
90
|
+
error_msg += f". Available methods: {available_methods}"
|
91
|
+
raise AttributeError(error_msg) from e
|
92
|
+
else:
|
93
|
+
error_msg += ". This model is a non-pythonic model. Please use the old inference methods i.e. predict_by_url, predict_by_bytes, etc."
|
94
|
+
raise Exception(error_msg) from e
|
80
95
|
|
81
96
|
def _fetch_signatures(self):
|
82
97
|
'''
|
@@ -148,6 +163,10 @@ class ModelClient:
|
|
148
163
|
self._define_compatability_functions()
|
149
164
|
return
|
150
165
|
if response.status.code != status_code_pb2.SUCCESS:
|
166
|
+
if response.outputs[0].status.description.startswith("cannot identify image file"):
|
167
|
+
raise Exception(
|
168
|
+
"Failed to fetch method signatures from model and backup method. This model is a non-pythonic model. Please use the old inference methods i.e. predict_by_url, predict_by_bytes, etc."
|
169
|
+
)
|
151
170
|
raise Exception(f"Model failed with response {response!r}")
|
152
171
|
self._method_signatures = signatures_from_json(response.outputs[0].data.text.raw)
|
153
172
|
|
clarifai/runners/server.py
CHANGED
@@ -92,6 +92,7 @@ def serve(
|
|
92
92
|
runner_id: str = os.environ.get("CLARIFAI_RUNNER_ID", None),
|
93
93
|
base_url: str = os.environ.get("CLARIFAI_API_BASE", "https://api.clarifai.com"),
|
94
94
|
pat: str = os.environ.get("CLARIFAI_PAT", None),
|
95
|
+
context=None, # This is the current context object that contains user_id, app_id, model_id, etc.
|
95
96
|
):
|
96
97
|
builder = ModelBuilder(model_path, download_validation_only=True)
|
97
98
|
|
@@ -133,7 +134,28 @@ def serve(
|
|
133
134
|
pat=pat,
|
134
135
|
num_parallel_polls=num_threads,
|
135
136
|
)
|
136
|
-
|
137
|
+
method_signatures = builder.get_method_signatures(mocking=False)
|
138
|
+
from clarifai.runners.utils import code_script
|
139
|
+
|
140
|
+
snippet = code_script.generate_client_script(
|
141
|
+
method_signatures,
|
142
|
+
user_id=context.user_id,
|
143
|
+
app_id=context.app_id,
|
144
|
+
model_id=context.model_id,
|
145
|
+
deployment_id=context.deployment_id,
|
146
|
+
base_url=context.api_base,
|
147
|
+
)
|
148
|
+
logger.info("✅ Your model is running locally and is ready for requests from the API...\n")
|
149
|
+
logger.info(
|
150
|
+
f"> Code Snippet: To call your model via the API, use this code snippet:\n{snippet}"
|
151
|
+
)
|
152
|
+
logger.info(
|
153
|
+
f"> Playground: To chat with your model, visit: {context.ui}/playground?model={context.model_id}__{context.model_version_id}&user_id={context.user_id}&app_id={context.app_id}\n"
|
154
|
+
)
|
155
|
+
logger.info(
|
156
|
+
f"> API URL: To call your model via the API, use this model URL: {context.ui}/users/{context.user_id}/apps/{context.app_id}/models/{context.model_id}\n"
|
157
|
+
)
|
158
|
+
logger.info("Press CTRL+C to stop the runner.\n")
|
137
159
|
runner.start() # start the runner to fetch work from the API.
|
138
160
|
|
139
161
|
|
@@ -68,13 +68,13 @@ def kill_process_tree(parent_pid, include_parent: bool = True, skip_pid: int = N
|
|
68
68
|
logger.warning(f"Failed to kill parent process {parent_pid}: {e}")
|
69
69
|
|
70
70
|
|
71
|
-
def execute_shell_command(
|
72
|
-
command: str,
|
73
|
-
) -> subprocess.Popen:
|
71
|
+
def execute_shell_command(command: str, stdout=None, stderr=subprocess.STDOUT) -> subprocess.Popen:
|
74
72
|
"""Execute a shell command and return its process handle.
|
75
73
|
|
76
74
|
Args:
|
77
75
|
command (str): The shell command to execute.
|
76
|
+
stdout : Verbose logging control,
|
77
|
+
stderr : Verbose error logging control
|
78
78
|
|
79
79
|
Returns:
|
80
80
|
subprocess.Popen: Process handle for the executed command.
|
@@ -90,7 +90,7 @@ def execute_shell_command(
|
|
90
90
|
parts = shlex.split(command)
|
91
91
|
|
92
92
|
try:
|
93
|
-
process = subprocess.Popen(parts, text=True, stderr=
|
93
|
+
process = subprocess.Popen(parts, text=True, stdout=stdout, stderr=stderr)
|
94
94
|
|
95
95
|
return process
|
96
96
|
except subprocess.SubprocessError as e:
|
clarifai/utils/cli.py
CHANGED
@@ -4,6 +4,7 @@ import pkgutil
|
|
4
4
|
import sys
|
5
5
|
import typing as t
|
6
6
|
from collections import defaultdict
|
7
|
+
from pathlib import Path
|
7
8
|
from typing import OrderedDict
|
8
9
|
|
9
10
|
import click
|
@@ -205,28 +206,21 @@ def validate_context_auth(pat: str, user_id: str, api_base: str = None):
|
|
205
206
|
logger.info("✅ Context is valid")
|
206
207
|
|
207
208
|
except Exception as e:
|
208
|
-
error_msg = str(e)
|
209
|
-
|
210
209
|
# Check for common authentication errors and provide user-friendly messages
|
211
|
-
|
212
|
-
logger.error(f"Invalid PAT token or incorrect user ID '{user_id}': {error_msg}")
|
213
|
-
elif "UNAUTHENTICATED" in error_msg:
|
214
|
-
logger.error(f"Invalid PAT token or user ID: {error_msg}")
|
215
|
-
elif "SSL" in error_msg or "certificate" in error_msg:
|
216
|
-
logger.error(f"SSL/Certificate error: {error_msg}")
|
217
|
-
elif "Connection" in error_msg or "timeout" in error_msg:
|
218
|
-
logger.error(f"Network connection error: {error_msg}")
|
219
|
-
else:
|
220
|
-
logger.error(f"❌ Validation failed: \n{error_msg}")
|
221
|
-
logger.error("Please check your credentials and try again.")
|
210
|
+
logger.error("❌ Authentication failed. Please check your token and user ID.")
|
222
211
|
raise click.Abort() # Exit without saving the configuration
|
223
212
|
|
224
213
|
|
225
|
-
def customize_ollama_model(
|
214
|
+
def customize_ollama_model(
|
215
|
+
model_path, model_name=None, port=None, context_length=None, verbose=False
|
216
|
+
):
|
226
217
|
"""Customize the Ollama model name in the cloned template files.
|
227
218
|
Args:
|
228
219
|
model_path: Path to the cloned model directory
|
229
|
-
model_name: The model name to set (e.g., 'llama3.1', 'mistral')
|
220
|
+
model_name: The model name to set (e.g., 'llama3.1', 'mistral') - optional
|
221
|
+
port: Port for Ollama server - optional
|
222
|
+
context_length: Context length for the model - optional
|
223
|
+
verbose: Whether to enable verbose logging - optional (defaults to False)
|
230
224
|
|
231
225
|
"""
|
232
226
|
model_py_path = os.path.join(model_path, "1", "model.py")
|
@@ -256,6 +250,12 @@ def customize_ollama_model(model_path, model_name, port, context_length):
|
|
256
250
|
"context_length = '8192'", f"context_length = '{context_length}'"
|
257
251
|
)
|
258
252
|
|
253
|
+
verbose_str = str(verbose)
|
254
|
+
if "VERBOSE_OLLAMA = True" in content:
|
255
|
+
content = content.replace("VERBOSE_OLLAMA = True", f"VERBOSE_OLLAMA = {verbose_str}")
|
256
|
+
elif "VERBOSE_OLLAMA = False" in content:
|
257
|
+
content = content.replace("VERBOSE_OLLAMA = False", f"VERBOSE_OLLAMA = {verbose_str}")
|
258
|
+
|
259
259
|
# Write the modified content back to model.py
|
260
260
|
with open(model_py_path, 'w') as file:
|
261
261
|
file.write(content)
|
@@ -297,28 +297,35 @@ def _is_package_installed(package_name):
|
|
297
297
|
return False
|
298
298
|
|
299
299
|
|
300
|
-
def
|
301
|
-
"""
|
302
|
-
import
|
303
|
-
from pathlib import Path
|
300
|
+
def parse_requirements(model_path: str):
|
301
|
+
"""Parse requirements.txt in the model directory and return a dictionary of dependencies."""
|
302
|
+
from packaging.requirements import Requirement
|
304
303
|
|
305
304
|
requirements_path = Path(model_path) / "requirements.txt"
|
306
305
|
|
307
306
|
if not requirements_path.exists():
|
308
307
|
logger.warning(f"requirements.txt not found at {requirements_path}")
|
309
|
-
return
|
308
|
+
return []
|
309
|
+
|
310
|
+
deps = {}
|
311
|
+
for line in requirements_path.read_text().splitlines():
|
312
|
+
line = line.strip()
|
313
|
+
if not line or line.startswith("#"):
|
314
|
+
continue
|
315
|
+
try:
|
316
|
+
req = Requirement(line)
|
317
|
+
deps[req.name] = str(req.specifier) if req.specifier else None
|
318
|
+
except Exception as e:
|
319
|
+
logger.warning(f"⚠️ Could not parse line: {line!r} — {e}")
|
320
|
+
return deps
|
310
321
|
|
311
|
-
try:
|
312
|
-
package_pattern = re.compile(r'^([a-zA-Z0-9_-]+)')
|
313
322
|
|
323
|
+
def check_requirements_installed(model_path):
|
324
|
+
"""Check if all dependencies in requirements.txt are installed."""
|
325
|
+
|
326
|
+
try:
|
314
327
|
# Getting package name and version (for logging)
|
315
|
-
requirements =
|
316
|
-
(match.group(1), pack)
|
317
|
-
for line in requirements_path.read_text().splitlines()
|
318
|
-
if (pack := line.strip())
|
319
|
-
and not line.startswith('#')
|
320
|
-
and (match := package_pattern.match(line))
|
321
|
-
]
|
328
|
+
requirements = parse_requirements(model_path)
|
322
329
|
|
323
330
|
if not requirements:
|
324
331
|
logger.info("No dependencies found in requirements.txt")
|
@@ -328,7 +335,7 @@ def check_requirements_installed(model_path):
|
|
328
335
|
|
329
336
|
missing = [
|
330
337
|
full_req
|
331
|
-
for package_name, full_req in requirements
|
338
|
+
for package_name, full_req in requirements.items()
|
332
339
|
if not _is_package_installed(package_name)
|
333
340
|
]
|
334
341
|
|
@@ -341,6 +348,7 @@ def check_requirements_installed(model_path):
|
|
341
348
|
f"❌ {len(missing)} of {len(requirements)} required packages are missing in the current environment"
|
342
349
|
)
|
343
350
|
logger.error("\n".join(f" - {pkg}" for pkg in missing))
|
351
|
+
requirements_path = Path(model_path) / "requirements.txt"
|
344
352
|
logger.warning(f"To install: pip install -r {requirements_path}")
|
345
353
|
return False
|
346
354
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: clarifai
|
3
|
-
Version: 11.6.
|
3
|
+
Version: 11.6.6
|
4
4
|
Home-page: https://github.com/Clarifai/clarifai-python
|
5
5
|
Author: Clarifai
|
6
6
|
Author-email: support@clarifai.com
|
@@ -19,7 +19,7 @@ Classifier: Operating System :: OS Independent
|
|
19
19
|
Requires-Python: >=3.8
|
20
20
|
Description-Content-Type: text/markdown
|
21
21
|
License-File: LICENSE
|
22
|
-
Requires-Dist: clarifai-grpc>=11.6.
|
22
|
+
Requires-Dist: clarifai-grpc>=11.6.6
|
23
23
|
Requires-Dist: clarifai-protocol>=0.0.25
|
24
24
|
Requires-Dist: numpy>=1.22.0
|
25
25
|
Requires-Dist: tqdm>=4.65.0
|
@@ -1,14 +1,14 @@
|
|
1
|
-
clarifai/__init__.py,sha256=
|
1
|
+
clarifai/__init__.py,sha256=mVLEiG__Ii2PYSH7bCreLYlUkICRXJABUKqCK4CzxWE,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
|
5
5
|
clarifai/cli/README.md,sha256=u-7Mgg1ZrygEokXS3RJepddq3GjhkSVkdUzXvxnCoIE,2633
|
6
6
|
clarifai/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
7
|
clarifai/cli/__main__.py,sha256=7nPbLW7Jr2shkgMPvnxpn4xYGMvIcnqluJ69t9w4H_k,74
|
8
|
-
clarifai/cli/base.py,sha256=
|
8
|
+
clarifai/cli/base.py,sha256=drFJ7HpZu05eTzY8w_kDMoadDYDLWMGpoKl5MLHPXRw,9565
|
9
9
|
clarifai/cli/compute_cluster.py,sha256=8Xss0Obrp6l1XuxJe0luOqU_pf8vXGDRi6jyIe8qR6k,2282
|
10
10
|
clarifai/cli/deployment.py,sha256=9C4I6_kyMxRkWl6h681wc79-3mAtDHtTUaxRv05OZMs,4262
|
11
|
-
clarifai/cli/model.py,sha256=
|
11
|
+
clarifai/cli/model.py,sha256=r_-loAszX8vOYlW1YI7TgNA4CFPZy4dicqtywoZ39R8,43546
|
12
12
|
clarifai/cli/nodepool.py,sha256=H6OIdUW_EiyDUwZogzEDoYmVwEjLMsgoDlPyE7gjIuU,4245
|
13
13
|
clarifai/cli/pipeline.py,sha256=smWPCK9kLCqnjTCb3w8BAeiAcowY20Bdxfk-OCzCi0I,10601
|
14
14
|
clarifai/cli/pipeline_step.py,sha256=Unrq63w5rjwyhHHmRhV-enztO1HuVTnimAXltNCotQs,3814
|
@@ -25,7 +25,7 @@ clarifai/client/deployment.py,sha256=QBf0tzkKBEpzNgmOEmWUJMOlVWdFEFc70Y44o8y75Gs
|
|
25
25
|
clarifai/client/input.py,sha256=jpX47qwn7aUBBIEuSSLHF5jk70XaWEh0prD065c9b-E,51205
|
26
26
|
clarifai/client/lister.py,sha256=1YEm2suNxPaJO4x9V5szgD_YX6N_00vgSO-7m0HagY8,2208
|
27
27
|
clarifai/client/model.py,sha256=DeB-es6rp0FJQVY46oO2eR_-Ux5tTmkM_qYsN1X6WcE,90793
|
28
|
-
clarifai/client/model_client.py,sha256=
|
28
|
+
clarifai/client/model_client.py,sha256=pyPg1C3gb5Q3_DXmMmOB5AeORR1IDaaM7n0LGc3ciLk,38217
|
29
29
|
clarifai/client/module.py,sha256=jLViQYvVV3FmRN_ivvbk83uwsx7CgYGeEx4dYAr6yD4,4537
|
30
30
|
clarifai/client/nodepool.py,sha256=Qjk_-GfjtdlQdR5hHh28kRENW7rLi6zNqxeFYf7dioc,16473
|
31
31
|
clarifai/client/pipeline.py,sha256=Hy3qnSX1pcoi-OAtdzr-qxkRYi1CxsaUzsfS3GDtETM,14358
|
@@ -71,7 +71,7 @@ clarifai/rag/__init__.py,sha256=wu3PzAzo7uqgrEzuaC9lY_3gj1HFiR3GU3elZIKTT5g,40
|
|
71
71
|
clarifai/rag/rag.py,sha256=EG3GoFrHFCmA70Tz49_0Jo1-3WIaHSgWGHecPeErcdc,14170
|
72
72
|
clarifai/rag/utils.py,sha256=_gVZdABuMnraCKViLruV75x0F3IpgFXN6amYSGE5_xc,4462
|
73
73
|
clarifai/runners/__init__.py,sha256=wXLaSljH7qLeJCrZdKEnlQh2tNqTQAIZKWOu2rZ6wGs,279
|
74
|
-
clarifai/runners/server.py,sha256=
|
74
|
+
clarifai/runners/server.py,sha256=7grR4PDwXsp9cLpT8rSOfK-YuhzbC7xBI_1C5XJmLas,6016
|
75
75
|
clarifai/runners/dockerfile_template/Dockerfile.template,sha256=nEnIMqzhAXDbd0Ht7QQm0U7AVPIHWQD6kYnFZ0TKJUM,2428
|
76
76
|
clarifai/runners/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
77
77
|
clarifai/runners/models/dummy_openai_model.py,sha256=pcmAVbqTTGG4J3BLVjKfvM_SQ-GET_XexIUdLcr9Zvo,8373
|
@@ -94,7 +94,7 @@ clarifai/runners/utils/const.py,sha256=MK7lTzzJKbOiyiUtG_jlJXfz_xNKMn5LjkQ9vjbtt
|
|
94
94
|
clarifai/runners/utils/data_utils.py,sha256=HRpMYR2O0OiDpXXhOManLHTeomC4bFnXMHVAiT_12yE,20856
|
95
95
|
clarifai/runners/utils/loader.py,sha256=K5Y8MPbIe5STw2gDnrL8KqFgKNxEo7bz-RV0ip1T4PM,10900
|
96
96
|
clarifai/runners/utils/method_signatures.py,sha256=qdHaO8ZIgP6BBXXMhMPhcQ46dse-XMP2t4VJCNG7O3Q,18335
|
97
|
-
clarifai/runners/utils/model_utils.py,sha256=
|
97
|
+
clarifai/runners/utils/model_utils.py,sha256=MCYhV_00anptIO1Qtxgzn3DlGI2UHV0ESFT3wLNcAMM,6413
|
98
98
|
clarifai/runners/utils/openai_convertor.py,sha256=ZlIrvvfHttD_DavLvmKZdL8gNq_TQvQtZVnYamwdWz4,8248
|
99
99
|
clarifai/runners/utils/pipeline_validation.py,sha256=RWWWUA3mNCXHCSNpuofMGfXfWEYe7LrYKwIc-1VFvQs,6444
|
100
100
|
clarifai/runners/utils/serializers.py,sha256=pI7GqMTC0T3Lu_X8v8TO4RiplO-gC_49Ns37jYwsPtg,7908
|
@@ -104,7 +104,7 @@ clarifai/runners/utils/data_types/data_types.py,sha256=UBHTNPshr94qUs2KqkYis0VlA
|
|
104
104
|
clarifai/schema/search.py,sha256=o9-ct8ulLZByB3RCVwZWPgaDwdcW7cM5s-g8oyAz89s,2421
|
105
105
|
clarifai/urls/helper.py,sha256=z6LnLGgLHxD8scFtyRdxqYIRJNhxqPkfLe53UtTLUBY,11727
|
106
106
|
clarifai/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
107
|
-
clarifai/utils/cli.py,sha256
|
107
|
+
clarifai/utils/cli.py,sha256=yhYzDwGro03IheGuamuMWwz9EtUG-u7oQU20koQHAog,11883
|
108
108
|
clarifai/utils/config.py,sha256=jMSWYxJfp_D8eoGqz-HTdsngn5bg_1ymjLidYz6rdLA,7073
|
109
109
|
clarifai/utils/constants.py,sha256=klcdSiVccrdJVRXL9qq08p2lWL3KerXcQOTIG6y9298,2414
|
110
110
|
clarifai/utils/logging.py,sha256=0we53uTqUvzrulC86whu-oeWNxn1JjJL0OQ98Bwf9vo,15198
|
@@ -119,9 +119,9 @@ clarifai/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
119
119
|
clarifai/workflows/export.py,sha256=HvUYG9N_-UZoRR0-_tdGbZ950_AeBqawSppgUxQebR0,1913
|
120
120
|
clarifai/workflows/utils.py,sha256=ESL3INcouNcLKCh-nMpfXX-YbtCzX7tz7hT57_RGQ3M,2079
|
121
121
|
clarifai/workflows/validate.py,sha256=UhmukyHkfxiMFrPPeBdUTiCOHQT5-shqivlBYEyKTlU,2931
|
122
|
-
clarifai-11.6.
|
123
|
-
clarifai-11.6.
|
124
|
-
clarifai-11.6.
|
125
|
-
clarifai-11.6.
|
126
|
-
clarifai-11.6.
|
127
|
-
clarifai-11.6.
|
122
|
+
clarifai-11.6.6.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
|
123
|
+
clarifai-11.6.6.dist-info/METADATA,sha256=ZwllUqn2p05P26cjQLMD3uAvhMBkzJXCjPjv_E9iKNM,22737
|
124
|
+
clarifai-11.6.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
125
|
+
clarifai-11.6.6.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
|
126
|
+
clarifai-11.6.6.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
|
127
|
+
clarifai-11.6.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|