clarifai 11.2.1__py3-none-any.whl → 11.2.3__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/utils/cli.py CHANGED
@@ -2,16 +2,13 @@ import importlib
2
2
  import os
3
3
  import pkgutil
4
4
  import sys
5
+ import typing as t
6
+ from collections import defaultdict
7
+ from typing import OrderedDict
5
8
 
6
9
  import click
7
10
  import yaml
8
-
9
- from rich.console import Console
10
- from rich.panel import Panel
11
- from rich.style import Style
12
- from rich.text import Text
13
-
14
- from clarifai.utils.logging import logger
11
+ from tabulate import tabulate
15
12
 
16
13
 
17
14
  def from_yaml(filename: str):
@@ -31,19 +28,6 @@ def dump_yaml(data, filename: str):
31
28
  click.echo(f"Error writing YAML file: {e}", err=True)
32
29
 
33
30
 
34
- def set_base_url(env):
35
- environments = {
36
- 'prod': 'https://api.clarifai.com',
37
- 'staging': 'https://api-staging.clarifai.com',
38
- 'dev': 'https://api-dev.clarifai.com'
39
- }
40
-
41
- if env in environments:
42
- return environments[env]
43
- else:
44
- raise ValueError("Invalid environment. Please choose from 'prod', 'staging', 'dev'.")
45
-
46
-
47
31
  # Dynamically find and import all command modules from the cli directory
48
32
  def load_command_modules():
49
33
  package_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'cli')
@@ -53,27 +37,132 @@ def load_command_modules():
53
37
  importlib.import_module(f'clarifai.cli.{module_name}')
54
38
 
55
39
 
56
- def display_co_resources(response, resource_type):
40
+ def display_co_resources(response,
41
+ custom_columns={
42
+ 'ID': lambda c: c.id,
43
+ 'USER_ID': lambda c: c.user_id,
44
+ 'DESCRIPTION': lambda c: c.description,
45
+ }):
57
46
  """Display compute orchestration resources listing results using rich."""
58
47
 
59
- console = Console()
60
- panel = Panel(
61
- Text(f"List of {resource_type}s", justify="center"),
62
- title="",
63
- style=Style(color="blue", bold=True),
64
- border_style="green",
65
- width=60)
66
- console.print(panel)
67
- for indx, item in enumerate(list(response)):
68
- panel = Panel(
69
- "\n".join([f"{'ID'}: {item.id}", f"{'Description'}: {item.description}"]),
70
- title=f"{resource_type} {(indx + 1)}",
71
- border_style="green",
72
- width=60)
73
- console.print(panel)
48
+ formatter = TableFormatter(custom_columns)
49
+ print(formatter.format(list(response), fmt="plain"))
50
+
51
+
52
+ class TableFormatter:
53
+
54
+ def __init__(self, custom_columns: OrderedDict):
55
+ """
56
+ Initializes the TableFormatter with column headers and custom column mappings.
57
+
58
+ :param headers: List of column headers for the table.
59
+ """
60
+ self.custom_columns = custom_columns
61
+
62
+ def format(self, objects, fmt='plain'):
63
+ """
64
+ Formats a list of objects into a table with custom columns.
65
+
66
+ :param objects: List of objects to format into a table.
67
+ :return: A string representing the table.
68
+ """
69
+ # Prepare the rows by applying the custom column functions to each object
70
+ rows = []
71
+ for obj in objects:
72
+ # row = [self.custom_columns[header](obj) for header in self.headers]
73
+ row = [f(obj) for f in self.custom_columns.values()]
74
+ rows.append(row)
75
+
76
+ # Create the table
77
+ table = tabulate(rows, headers=self.custom_columns.keys(), tablefmt=fmt)
78
+ return table
79
+
80
+
81
+ class AliasedGroup(click.Group):
82
+
83
+ def __init__(self,
84
+ name: t.Optional[str] = None,
85
+ commands: t.Optional[t.Union[t.MutableMapping[str, click.Command], t.Sequence[
86
+ click.Command]]] = None,
87
+ **attrs: t.Any) -> None:
88
+ super().__init__(name, commands, **attrs)
89
+ self.alias_map = {}
90
+ self.command_to_aliases = defaultdict(list)
91
+
92
+ def add_alias(self, cmd: click.Command, alias: str) -> None:
93
+ self.alias_map[alias] = cmd
94
+ if alias != cmd.name:
95
+ self.command_to_aliases[cmd].append(alias)
96
+
97
+ def command(self, aliases=None, *args,
98
+ **kwargs) -> t.Callable[[t.Callable[..., t.Any]], click.Command]:
99
+ cmd_decorator = super().command(*args, **kwargs)
100
+ if aliases is None:
101
+ aliases = []
102
+
103
+ def aliased_decorator(f):
104
+ cmd = cmd_decorator(f)
105
+ if cmd.name:
106
+ self.add_alias(cmd, cmd.name)
107
+ for alias in aliases:
108
+ self.add_alias(cmd, alias)
109
+ return cmd
110
+
111
+ f = None
112
+ if args and callable(args[0]):
113
+ (f,) = args
114
+ if f is not None:
115
+ return aliased_decorator(f)
116
+ return aliased_decorator
117
+
118
+ def group(self, aliases=None, *args,
119
+ **kwargs) -> t.Callable[[t.Callable[..., t.Any]], click.Group]:
120
+ cmd_decorator = super().group(*args, **kwargs)
121
+ if aliases is None:
122
+ aliases = []
123
+
124
+ def aliased_decorator(f):
125
+ cmd = cmd_decorator(f)
126
+ if cmd.name:
127
+ self.add_alias(cmd, cmd.name)
128
+ for alias in aliases:
129
+ self.add_alias(cmd, alias)
130
+ return cmd
131
+
132
+ f = None
133
+ if args and callable(args[0]):
134
+ (f,) = args
135
+ if f is not None:
136
+ return aliased_decorator(f)
137
+ return aliased_decorator
138
+
139
+ def get_command(self, ctx: click.Context, cmd_name: str) -> t.Optional[click.Command]:
140
+ rv = click.Group.get_command(self, ctx, cmd_name)
141
+ if rv is not None:
142
+ return rv
143
+ return self.alias_map.get(cmd_name)
144
+
145
+ def format_commands(self, ctx, formatter):
146
+ sub_commands = self.list_commands(ctx)
147
+
148
+ rows = []
149
+ for sub_command in sub_commands:
150
+ cmd = self.get_command(ctx, sub_command)
151
+ if cmd is None or getattr(cmd, 'hidden', False):
152
+ continue
153
+ if cmd in self.command_to_aliases:
154
+ aliases = ', '.join(self.command_to_aliases[cmd])
155
+ sub_command = f'{sub_command} ({aliases})'
156
+ cmd_help = cmd.help
157
+ rows.append((sub_command, cmd_help))
158
+
159
+ if rows:
160
+ with formatter.section("Commands"):
161
+ formatter.write_dl(rows)
74
162
 
75
163
 
76
164
  def validate_context(ctx):
165
+ from clarifai.utils.logging import logger
77
166
  if ctx.obj == {}:
78
167
  logger.error("CLI config file missing. Run `clarifai login` to set up the CLI config.")
79
168
  sys.exit(1)
@@ -0,0 +1,105 @@
1
+ import os
2
+ from collections import OrderedDict
3
+ from dataclasses import dataclass, field
4
+
5
+ import yaml
6
+
7
+ from clarifai.utils.constants import DEFAULT_CONFIG
8
+
9
+
10
+ class Context(OrderedDict):
11
+ """
12
+ A context which has a name and a set of key-values as a dict under env.
13
+
14
+ You can access the keys directly.
15
+ """
16
+
17
+ def __init__(self, name, **kwargs):
18
+ self['name'] = name
19
+ # when loading from config we may have the env: section in yaml already so we get it here.
20
+ if 'env' in kwargs:
21
+ self['env'] = kwargs['env']
22
+ else: # when consructing as Context(name, key=value) we set it here.
23
+ self['env'] = kwargs
24
+
25
+ def __getattr__(self, key):
26
+ try:
27
+ if key == 'name':
28
+ return self[key]
29
+ if key == 'env':
30
+ raise AttributeError("Don't access .env directly")
31
+
32
+ # Allow accessing CLARIFAI_PAT type env var names from config as .pat
33
+ envvar_name = 'CLARIFAI_' + key.upper()
34
+ env = self['env']
35
+ if envvar_name in env:
36
+ value = env[envvar_name]
37
+ if value == "ENVVAR":
38
+ return os.environ[envvar_name]
39
+ else:
40
+ value = env[key]
41
+
42
+ if isinstance(value, dict):
43
+ return Context(value)
44
+
45
+ return value
46
+ except KeyError as e:
47
+ raise AttributeError(f"'{type(self).__name__}' object has no attribute '{key}'") from e
48
+
49
+ def __setattr__(self, key, value):
50
+ if key == "name":
51
+ self['name'] = value
52
+ else:
53
+ self['env'][key] = value
54
+
55
+ def __delattr__(self, key):
56
+ try:
57
+ del self['env'][key]
58
+ except KeyError as e:
59
+ raise AttributeError(f"'{type(self).__name__}' object has no attribute '{key}'") from e
60
+
61
+ def to_serializable_dict(self):
62
+ return dict(self['env'])
63
+
64
+
65
+ @dataclass
66
+ class Config():
67
+ current_context: str
68
+ filename: str
69
+ contexts: OrderedDict[str, Context] = field(default_factory=OrderedDict)
70
+
71
+ def __post_init__(self):
72
+ for k, v in self.contexts.items():
73
+ if 'name' not in v:
74
+ v['name'] = k
75
+ self.contexts = {k: Context(**v) for k, v in self.contexts.items()}
76
+
77
+ @classmethod
78
+ def from_yaml(cls, filename: str = DEFAULT_CONFIG):
79
+ with open(filename, 'r') as f:
80
+ cfg = yaml.safe_load(f)
81
+ return cls(**cfg, filename=filename)
82
+
83
+ def to_dict(self):
84
+ return {
85
+ 'current_context': self.current_context,
86
+ 'contexts': {k: v.to_serializable_dict()
87
+ for k, v in self.contexts.items()}
88
+ }
89
+
90
+ def to_yaml(self, filename: str = None):
91
+ if filename is None:
92
+ filename = self.filename
93
+ dir = os.path.dirname(filename)
94
+ if len(dir):
95
+ os.makedirs(dir, exist_ok=True)
96
+ _dict = self.to_dict()
97
+ for k, v in _dict['contexts'].items():
98
+ v.pop('name', None)
99
+ with open(filename, 'w') as f:
100
+ yaml.safe_dump(_dict, f)
101
+
102
+ @property
103
+ def current(self) -> Context:
104
+ """ get the current Context """
105
+ return self.contexts[self.current_context]
@@ -1,3 +1,7 @@
1
+ import os
2
+
1
3
  CLARIFAI_PAT_ENV_VAR = "CLARIFAI_PAT"
2
4
  CLARIFAI_SESSION_TOKEN_ENV_VAR = "CLARIFAI_SESSION_TOKEN"
3
5
  CLARIFAI_USER_ID_ENV_VAR = "CLARIFAI_USER_ID"
6
+
7
+ DEFAULT_CONFIG = f'{os.environ["HOME"]}/.config/clarifai/config'
clarifai/utils/logging.py CHANGED
@@ -10,15 +10,6 @@ import traceback
10
10
  from collections import defaultdict
11
11
  from typing import Any, Dict, List, Optional, Union
12
12
 
13
- from rich import print as rprint
14
- from rich.console import Console
15
- from rich.logging import RichHandler
16
- from rich.table import Table
17
- from rich.traceback import install
18
- from rich.tree import Tree
19
-
20
- install()
21
-
22
13
  # The default logger to use throughout the SDK is defined at bottom of this file.
23
14
 
24
15
  # For the json logger.
@@ -29,6 +20,20 @@ FIELD_BLACKLIST = [
29
20
  'msg', 'message', 'account', 'levelno', 'created', 'threadName', 'name', 'processName',
30
21
  'module', 'funcName', 'msecs', 'relativeCreated', 'pathname', 'args', 'thread', 'process'
31
22
  ]
23
+ COLORS = {
24
+ 'ARGUMENTS': '\033[90m', # Gray
25
+ 'DEBUG': '\033[90m', # Gray
26
+ 'INFO': '\033[32m', # Green
27
+ 'WARNING': '\033[33m', # Yellow
28
+ 'ERROR': '\033[31m', # Red
29
+ 'CRITICAL': '\033[31m', # Red
30
+ 'TIME': '\033[34m',
31
+ 'RESET': '\033[0m'
32
+ }
33
+ LOG_FORMAT = f"[%(levelname)s] {COLORS.get('TIME')}%(asctime)s{COLORS.get('RESET')} %(message)s |" \
34
+ f"{COLORS.get('ARGUMENTS')} " \
35
+ f"%(optional_args)s " \
36
+ f"thread=%(thread)d {COLORS.get('RESET')}"
32
37
 
33
38
  # Create thread local storage that the format() call below uses.
34
39
  # This is only used by the json_logger in the appropriate CLARIFAI_DEPLOY levels.
@@ -59,6 +64,9 @@ def get_req_id_from_context():
59
64
 
60
65
  def display_workflow_tree(nodes_data: List[Dict]) -> None:
61
66
  """Displays a tree of the workflow nodes."""
67
+ from rich import print as rprint
68
+ from rich.tree import Tree
69
+
62
70
  # Create a mapping of node_id to the list of node_ids that are connected to it.
63
71
  node_adj_mapping = defaultdict(list)
64
72
  # Create a mapping of node_id to the node data info.
@@ -104,8 +112,10 @@ def display_workflow_tree(nodes_data: List[Dict]) -> None:
104
112
  rprint(tree)
105
113
 
106
114
 
107
- def table_from_dict(data: List[Dict], column_names: List[str], title: str = "") -> Table:
115
+ def table_from_dict(data: List[Dict], column_names: List[str],
116
+ title: str = "") -> 'rich.Table': #noqa F821
108
117
  """Use this function for printing tables from a list of dicts."""
118
+ from rich.table import Table
109
119
  table = Table(title=title, show_lines=False, show_header=True, header_style="blue")
110
120
  for column_name in column_names:
111
121
  table.add_column(column_name)
@@ -134,23 +144,18 @@ def _configure_logger(name: str, logger_level: Union[int, str] = logging.NOTSET)
134
144
  # If ENABLE_JSON_LOGGER is not set, then use json logger if in k8s.
135
145
  enabled_json = os.getenv('ENABLE_JSON_LOGGER', None)
136
146
  in_k8s = 'KUBERNETES_SERVICE_HOST' in os.environ
147
+ handler = logging.StreamHandler()
148
+ handler.setLevel(logger_level)
137
149
  if enabled_json == 'true' or (in_k8s and enabled_json != 'false'):
138
150
  # Add the json handler and formatter
139
- handler = logging.StreamHandler()
140
151
  formatter = JsonFormatter()
141
152
  handler.setFormatter(formatter)
142
- logger.addHandler(handler)
143
153
  else:
144
- # Add the new rich handler and formatter
145
- try:
146
- width, _ = os.get_terminal_size()
147
- except OSError:
148
- width = 255
149
- handler = RichHandler(
150
- rich_tracebacks=True, log_time_format="%Y-%m-%d %H:%M:%S.%f", console=Console(width=width))
151
- formatter = logging.Formatter('%(message)s')
154
+ # create formatter and add it to the handlers
155
+ formatter = TerminalFormatter(LOG_FORMAT)
152
156
  handler.setFormatter(formatter)
153
- logger.addHandler(handler)
157
+ # add the handlers to the logger
158
+ logger.addHandler(handler)
154
159
 
155
160
 
156
161
  def get_logger(logger_level: Union[int, str] = logging.NOTSET,
@@ -207,6 +212,8 @@ def display_concept_relations_tree(relations_dict: Dict[str, Any]) -> None:
207
212
  Args:
208
213
  relations_dict (dict): A dict of concept relations info.
209
214
  """
215
+ from rich import print as rprint
216
+ from rich.tree import Tree
210
217
  for parent, children in relations_dict.items():
211
218
  tree = Tree(parent)
212
219
  for child in children:
@@ -372,5 +379,41 @@ class JsonFormatter(logging.Formatter):
372
379
  )
373
380
 
374
381
 
382
+ class TerminalFormatter(logging.Formatter):
383
+ """ If you have fields in your Formatter (see setup_logger where we setup the format strings) then
384
+ you can set them on the record using a filter. We do that for req_id here which is a request
385
+ specific field. This allows us to find requests easily between services.
386
+ """
387
+
388
+ def format(self, record):
389
+ record.optional_args = []
390
+
391
+ user_id = getattr(thread_log_info, 'user_id', None)
392
+ if user_id is not None:
393
+ record.optional_args.append("user_id=" + user_id)
394
+
395
+ app_id = getattr(thread_log_info, 'app_id', None)
396
+ if app_id is not None:
397
+ record.optional_args.append("app_id=" + app_id)
398
+
399
+ req_id = getattr(thread_log_info, 'req_id', None)
400
+ if req_id is not None:
401
+ record.optional_args.append("req_id=" + req_id)
402
+
403
+ record.optional_args = " ".join(record.optional_args)
404
+
405
+ color_code = COLORS.get(record.levelname, '')
406
+
407
+ record.levelname = f"{color_code}{record.levelname}{COLORS.get('RESET')}"
408
+ record.msg = f"{color_code}{str(record.msg)}{COLORS.get('RESET')}"
409
+
410
+ return super(TerminalFormatter, self).format(record)
411
+
412
+ def formatTime(self, record, datefmt=None):
413
+ # Note we didn't go with UTC here as it's easier to understand time in your time zone.
414
+ # The json logger leverages UTC though.
415
+ return datetime.datetime.fromtimestamp(record.created).strftime('%H:%M:%S.%f')
416
+
417
+
375
418
  # the default logger for the SDK.
376
419
  logger = get_logger(logger_level=os.environ.get("LOG_LEVEL", "INFO"), name="clarifai")
clarifai/utils/misc.py CHANGED
@@ -12,6 +12,8 @@ RETRYABLE_CODES = [
12
12
  status_code_pb2.MODEL_BUSY_PLEASE_RETRY
13
13
  ]
14
14
 
15
+ DEFAULT_CONFIG = f'{os.environ["HOME"]}/.config/clarifai/config'
16
+
15
17
 
16
18
  def status_is_retryable(status_code: int) -> bool:
17
19
  """Check if a status code is retryable."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clarifai
3
- Version: 11.2.1
3
+ Version: 11.2.3
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -21,7 +21,7 @@ Requires-Python: >=3.8
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
23
  Requires-Dist: clarifai-grpc>=11.2.6
24
- Requires-Dist: clarifai-protocol>=0.0.20
24
+ Requires-Dist: clarifai-protocol>=0.0.21
25
25
  Requires-Dist: numpy>=1.22.0
26
26
  Requires-Dist: tqdm>=4.65.0
27
27
  Requires-Dist: rich>=13.4.2
@@ -1,20 +1,20 @@
1
- clarifai/__init__.py,sha256=R3NVFNSpKk1o0N9GhBBuvfPhVFPrY5oLJJk5xhzNpGY,23
1
+ clarifai/__init__.py,sha256=cMulojaj2PqKzdUooqsKg8CUvyqheI7pr_8Y-DBZwsQ,23
2
2
  clarifai/cli.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  clarifai/errors.py,sha256=RwzTajwds51wLD0MVlMC5kcpBnzRpreDLlazPSBZxrg,2605
4
4
  clarifai/versions.py,sha256=jctnczzfGk_S3EnVqb2FjRKfSREkNmvNEwAAa_VoKiQ,222
5
5
  clarifai/cli/README.md,sha256=YGApHfeUyu5P0Pdth-mqQCQftWHDxz6bugDlvDXDhOE,1942
6
6
  clarifai/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  clarifai/cli/__main__.py,sha256=utJ2F40cl0jPHcYdTlGZRqpPfZ0CtVYB-8Ft0b2fWD4,72
8
- clarifai/cli/base.py,sha256=SOAic4T6Hg7VJJ-UDdjTuTNI1Hu_YANmzW_giUjK24o,3853
9
- clarifai/cli/compute_cluster.py,sha256=v77YUbZjmXbTq0wCmcUJ8TzYSfFEtB1na87-iZuG21Q,1921
10
- clarifai/cli/deployment.py,sha256=Vv92Qo7Q3UmMiCdrGQ4qNVNVzfcDyl-GB6B7kx8gyFw,2597
11
- clarifai/cli/model.py,sha256=PR-A7V3D78iAjNx2hNeputiWuIyINrx2SJmjKtfMoQ4,12079
12
- clarifai/cli/nodepool.py,sha256=eYo3l9NMSwjeFzsuwKSYVkR1FdZ7_NcCdNvzGsBBMzY,3139
8
+ clarifai/cli/base.py,sha256=ZG1Ial89wGVqt4bSFYmIoRH_OZtw2yxlq3Ihp9e025U,7592
9
+ clarifai/cli/compute_cluster.py,sha256=dma_dgzSg5pYQcxlWhoKYdMFPO2KS7HzsN81ploNB-E,2083
10
+ clarifai/cli/deployment.py,sha256=wBWkYfLr6W73LScF6NlQM-reXWUP38VfAudltjpnFpk,3822
11
+ clarifai/cli/model.py,sha256=4n9CmpKOHXY1KxEzhmUy6l5hhU5u_mKhatLXY0L3LVo,12064
12
+ clarifai/cli/nodepool.py,sha256=7nTNd9T-UEPFE36vbxwdUHu2B3NECbN-lSTb_DQYw18,3874
13
13
  clarifai/client/__init__.py,sha256=xI1U0l5AZdRThvQAXCLsd9axxyFzXXJ22m8LHqVjQRU,662
14
- clarifai/client/app.py,sha256=6pckYme1urV2YJjLIYfeZ-vH0Z5YSQa51jzIMcEfwug,38342
14
+ clarifai/client/app.py,sha256=FnKvKksYZwdry0e4Obh-trdSO1mv6QcVAa3kzKiQMpU,38340
15
15
  clarifai/client/base.py,sha256=hSHOqkXbSKyaRDeylMMnkhUHCAHhEqno4KI0CXGziBA,7536
16
16
  clarifai/client/compute_cluster.py,sha256=EvW9TJjPvInUlggfg1A98sxoWH8_PY5rCVXZhsj6ac0,8705
17
- clarifai/client/dataset.py,sha256=y3zKT_VhP1gyN3OO-b3cPeW21ZXyKbQ7ZJkEG06bsTU,32096
17
+ clarifai/client/dataset.py,sha256=6DqfXQtiHoOJq0vPw2fz5ATo5zxQMmlhKG9IBwhnXeU,32078
18
18
  clarifai/client/deployment.py,sha256=w7Y6pA1rYG4KRK1SwusRZc2sQRXlG8wezuVdzSWpCo0,2586
19
19
  clarifai/client/input.py,sha256=obMAHMDU1OwfXZ8KraOnGFlWzlW-3F7Ob_2lcOQMlhY,46339
20
20
  clarifai/client/lister.py,sha256=03KGMvs5RVyYqxLsSrWhNc34I8kiF1Ph0NeyEwu7nMU,2082
@@ -27,7 +27,7 @@ clarifai/client/workflow.py,sha256=5VjZ2D8cudLznR8yhrwNawOmjxUhkJllZMKM6pn-4gs,1
27
27
  clarifai/client/auth/__init__.py,sha256=7EwR0NrozkAUwpUnCsqXvE_p0wqx_SelXlSpKShKJK0,136
28
28
  clarifai/client/auth/helper.py,sha256=Ngw5IDkOWvnOz5YwViVk55z3mC52MyezLc0G3WxLqok,14643
29
29
  clarifai/client/auth/register.py,sha256=2CMdBsoVLoTfjyksE6j7BM2tiEc73WKYvxnwDDgNn1k,536
30
- clarifai/client/auth/stub.py,sha256=xy4-fV0W8keCgXld4eOVzFQEIKxOktNwtL5bLztReug,4940
30
+ clarifai/client/auth/stub.py,sha256=FrA5QpEFY4sK6fvPVhTg19ROLHkYSRo343nNqiVE7xw,4963
31
31
  clarifai/constants/base.py,sha256=ogmFSZYoF0YhGjHg5aiOc3MLqPr_poKAls6xaD0_C3U,89
32
32
  clarifai/constants/dataset.py,sha256=vjK3IlgXu31HycuvjRSzEQSqhU6xfj5TIgo6IpyUWoc,609
33
33
  clarifai/constants/input.py,sha256=WcHwToUVIK9ItAhDefaSohQHCLNeR55PSjZ0BFnoZ3U,28
@@ -66,24 +66,25 @@ clarifai/runners/server.py,sha256=xHDLdhQApCgYG19QOKXqJNCGNyw1Vsvobq3UdryDrVc,41
66
66
  clarifai/runners/dockerfile_template/Dockerfile.template,sha256=5cjv7U8PmWa3DB_5B1CqSYh_6GE0E0np52TIAa7EIDE,2312
67
67
  clarifai/runners/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  clarifai/runners/models/base_typed_model.py,sha256=0QCWxch8CcyJSKvE1D4PILd2RSnQZHTmx4DXlQQ6dpo,7856
69
- clarifai/runners/models/model_builder.py,sha256=YCnZsAIE0CB-M0c2cvdEzY4O11I80STshd36dqDAN2Q,32565
69
+ clarifai/runners/models/model_builder.py,sha256=eL7gLgdJjsHrJy2Omu0XiGoACBl3CwCZan4SSEiUmG8,33984
70
70
  clarifai/runners/models/model_class.py,sha256=9JSPAr4U4K7xI0kSl-q0mHB06zknm2OR-8XIgBCto94,1611
71
- clarifai/runners/models/model_run_locally.py,sha256=hSkXrln4q1_EEtRyGH5g0nMg-ieGWmamD7cI5YV_qIk,20550
71
+ clarifai/runners/models/model_run_locally.py,sha256=qwWJ4UvvMx3ktbwIwjoucJ725TxRbK9CDa5ZMiy6vJM,20592
72
72
  clarifai/runners/models/model_runner.py,sha256=PyxwK-33hLlhkD07tTXkjWZ_iNlZHl9_8AZ2W7WfExI,6097
73
73
  clarifai/runners/models/model_servicer.py,sha256=jtQmtGeQlvQ5ttMvVw7CMnNzq-rLkTaxR2IWF9SnHwk,2808
74
74
  clarifai/runners/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- clarifai/runners/utils/const.py,sha256=bwj-Pcw558-pasdIFbNhnkn-9oiCdojYH1fNTTUG2gU,1048
75
+ clarifai/runners/utils/const.py,sha256=9qnOC1Bt6SGLQ9XCQEQ6519XhW4gzcztsV1Rgej67Vw,1055
76
76
  clarifai/runners/utils/data_handler.py,sha256=sxy9zlAgI6ETuxCQhUgEXAn2GCsaW1GxpK6GTaMne0g,6966
77
77
  clarifai/runners/utils/data_utils.py,sha256=R1iQ82TuQ9JwxCJk8yEB1Lyb0BYVhVbWJI9YDi1zGOs,318
78
- clarifai/runners/utils/loader.py,sha256=SgNHMwRmCCymFQm8aDp73NmIUHhM-N60CBlTKbPzmVc,7470
78
+ clarifai/runners/utils/loader.py,sha256=Sl0m29RDtMPx2cIiSbbDFtKHQj2ktXQ5CnkvaHi-zDc,8804
79
79
  clarifai/runners/utils/url_fetcher.py,sha256=v_8JOWmkyFAzsBulsieKX7Nfjy1Yg7wGSZeqfEvw2cg,1640
80
80
  clarifai/schema/search.py,sha256=JjTi8ammJgZZ2OGl4K6tIA4zEJ1Fr2ASZARXavI1j5c,2448
81
81
  clarifai/urls/helper.py,sha256=tjoMGGHuWX68DUB0pk4MEjrmFsClUAQj2jmVEM_Sy78,4751
82
82
  clarifai/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- clarifai/utils/cli.py,sha256=P29JalmKQLQBWqbW2_bumCLNSUUo8APtLXD8zS0dcIk,2160
84
- clarifai/utils/constants.py,sha256=MG_iHnSwNEyUZOpvsrTicNwaT4CIjmlK_Ixk_qqEX8g,142
85
- clarifai/utils/logging.py,sha256=CVy8OsLrlbg-b8qe88kb1yO_9wi9wRYfF-QkIaN9xE8,11936
86
- clarifai/utils/misc.py,sha256=4aNOHPTNdX-WGxuNab8qKePoCMUnscd-aN_dQEIVSWk,2933
83
+ clarifai/utils/cli.py,sha256=FUFJJb8Jzohpt132JE43xHNzWtX0N8fbWROxJISfCM0,5072
84
+ clarifai/utils/config.py,sha256=MxuQ1U4EOT4yVOEcRyv3OUPnoY_A_J5cZKHJGiuuo30,2883
85
+ clarifai/utils/constants.py,sha256=fdCmw8fjgo8eoWu85t95ZoRTrgXC5_XVXFyB8_VQTtw,219
86
+ clarifai/utils/logging.py,sha256=I2Sj1X-phYcINXe4-pW22Tq6Sz5PlwcxYQh7zORBbeM,13634
87
+ clarifai/utils/misc.py,sha256=gensDjU5pV44iFzUzmM_Lf6PZX63GFxRXJX91esEjAg,2999
87
88
  clarifai/utils/model_train.py,sha256=Mndqy5GNu7kjQHjDyNVyamL0hQFLGSHcWhOuPyOvr1w,8005
88
89
  clarifai/utils/evaluation/__init__.py,sha256=PYkurUrXrGevByj7RFb6CoU1iC7fllyQSfnnlo9WnY8,69
89
90
  clarifai/utils/evaluation/helpers.py,sha256=aZeHLI7oSmU5YDWQp5GdkYW5qbHx37nV9xwunKTAwWM,18549
@@ -93,9 +94,9 @@ clarifai/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
93
94
  clarifai/workflows/export.py,sha256=vICRhIreqDSShxLKjHNM2JwzKsf1B4fdXB0ciMcA70k,1945
94
95
  clarifai/workflows/utils.py,sha256=nGeB_yjVgUO9kOeKTg4OBBaBz-AwXI3m-huSVj-9W18,1924
95
96
  clarifai/workflows/validate.py,sha256=yJq03MaJqi5AK3alKGJJBR89xmmjAQ31sVufJUiOqY8,2556
96
- clarifai-11.2.1.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
97
- clarifai-11.2.1.dist-info/METADATA,sha256=te276wArqCAEYdsF-LYLQSTxMZiPtAVO_a2lEQngFNU,22472
98
- clarifai-11.2.1.dist-info/WHEEL,sha256=DK49LOLCYiurdXXOXwGJm6U4DkHkg4lcxjhqwRa0CP4,91
99
- clarifai-11.2.1.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
100
- clarifai-11.2.1.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
101
- clarifai-11.2.1.dist-info/RECORD,,
97
+ clarifai-11.2.3.dist-info/licenses/LICENSE,sha256=mUqF_d12-qE2n41g7C5_sq-BMLOcj6CNN-jevr15YHU,555
98
+ clarifai-11.2.3.dist-info/METADATA,sha256=7YnU6nLN-FgtfIPvDfv-qMUvS8B93f86eYrZFC4S-V0,22472
99
+ clarifai-11.2.3.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
100
+ clarifai-11.2.3.dist-info/entry_points.txt,sha256=X9FZ4Z-i_r2Ud1RpZ9sNIFYuu_-9fogzCMCRUD9hyX0,51
101
+ clarifai-11.2.3.dist-info/top_level.txt,sha256=wUMdCQGjkxaynZ6nZ9FAnvBUCgp5RJUVFSy2j-KYo0s,9
102
+ clarifai-11.2.3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.0.2)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5