Skip to content

Commit a2b022f

Browse files
authored
Merge branch 'master' into DEVX-217-cleanup-repo
2 parents cf55388 + 834db2d commit a2b022f

14 files changed

+188
-41
lines changed

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9.10.0
1+
9.10.2

clarifai/client/app.py

+16-9
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def list_datasets(self, page_no: int = None,
8383
for dataset_info in all_datasets_info:
8484
if 'version' in list(dataset_info.keys()):
8585
del dataset_info['version']['metrics']
86-
yield Dataset(**dataset_info)
86+
yield Dataset(base_url=self.base, **dataset_info)
8787

8888
def list_models(self,
8989
filter_by: Dict[str, Any] = {},
@@ -124,7 +124,7 @@ def list_models(self,
124124
if only_in_app:
125125
if model_info['app_id'] != self.id:
126126
continue
127-
yield Model(**model_info)
127+
yield Model(base_url=self.base, **model_info)
128128

129129
def list_workflows(self,
130130
filter_by: Dict[str, Any] = {},
@@ -163,7 +163,7 @@ def list_workflows(self,
163163
if only_in_app:
164164
if workflow_info['app_id'] != self.id:
165165
continue
166-
yield Workflow(**workflow_info)
166+
yield Workflow(base_url=self.base, **workflow_info)
167167

168168
def list_modules(self,
169169
filter_by: Dict[str, Any] = {},
@@ -202,7 +202,7 @@ def list_modules(self,
202202
if only_in_app:
203203
if module_info['app_id'] != self.id:
204204
continue
205-
yield Module(**module_info)
205+
yield Module(base_url=self.base, **module_info)
206206

207207
def list_installed_module_versions(self,
208208
filter_by: Dict[str, Any] = {},
@@ -237,7 +237,8 @@ def list_installed_module_versions(self,
237237
for imv_info in all_imv_infos:
238238
del imv_info['deploy_url']
239239
del imv_info['installed_module_version_id'] # TODO: remove this after the backend fix
240-
yield Module(module_id=imv_info['module_version']['module_id'], **imv_info)
240+
yield Module(
241+
module_id=imv_info['module_version']['module_id'], base_url=self.base, **imv_info)
241242

242243
def list_concepts(self, page_no: int = None,
243244
per_page: int = None) -> Generator[Concept, None, None]:
@@ -302,7 +303,7 @@ def create_dataset(self, dataset_id: str, **kwargs) -> Dataset:
302303
if response.status.code != status_code_pb2.SUCCESS:
303304
raise Exception(response.status)
304305
self.logger.info("\nDataset created\n%s", response.status)
305-
kwargs.update({'app_id': self.id, 'user_id': self.user_id})
306+
kwargs.update({'app_id': self.id, 'user_id': self.user_id, 'base_url': self.base})
306307

307308
return Dataset(dataset_id=dataset_id, **kwargs)
308309

@@ -330,7 +331,8 @@ def create_model(self, model_id: str, **kwargs) -> Model:
330331
kwargs.update({
331332
'app_id': self.id,
332333
'user_id': self.user_id,
333-
'model_type_id': response.model.model_type_id
334+
'model_type_id': response.model.model_type_id,
335+
'base_url': self.base
334336
})
335337

336338
return Model(model_id=model_id, **kwargs)
@@ -423,6 +425,7 @@ def create_workflow(self,
423425
display_workflow_tree(dict_response["workflows"][0]["nodes"])
424426
kwargs = self.process_response_keys(dict_response[list(dict_response.keys())[1]][0],
425427
"workflow")
428+
kwargs.update({'base_url': self.base})
426429

427430
return Workflow(**kwargs)
428431

@@ -450,7 +453,7 @@ def create_module(self, module_id: str, description: str, **kwargs) -> Module:
450453
if response.status.code != status_code_pb2.SUCCESS:
451454
raise Exception(response.status)
452455
self.logger.info("\nModule created\n%s", response.status)
453-
kwargs.update({'app_id': self.id, 'user_id': self.user_id})
456+
kwargs.update({'app_id': self.id, 'user_id': self.user_id, 'base_url': self.base})
454457

455458
return Module(module_id=module_id, **kwargs)
456459

@@ -477,6 +480,7 @@ def dataset(self, dataset_id: str, **kwargs) -> Dataset:
477480
kwargs = self.process_response_keys(dict_response[list(dict_response.keys())[1]],
478481
list(dict_response.keys())[1])
479482
kwargs['version'] = response.dataset.version if response.dataset.version else None
483+
kwargs.update({'base_url': self.base})
480484
return Dataset(**kwargs)
481485

482486
def model(self, model_id: str, model_version_id: str = "", **kwargs) -> Model:
@@ -512,6 +516,7 @@ def model(self, model_id: str, model_version_id: str = "", **kwargs) -> Model:
512516
kwargs = self.process_response_keys(dict_response['model'], 'model')
513517
kwargs[
514518
'model_version'] = response.model.model_version if response.model.model_version else None
519+
kwargs.update({'base_url': self.base})
515520

516521
return Model(**kwargs)
517522

@@ -537,6 +542,7 @@ def workflow(self, workflow_id: str, **kwargs) -> Workflow:
537542
dict_response = MessageToDict(response, preserving_proto_field_name=True)
538543
kwargs = self.process_response_keys(dict_response[list(dict_response.keys())[1]],
539544
list(dict_response.keys())[1])
545+
kwargs.update({'base_url': self.base})
540546

541547
return Workflow(**kwargs)
542548

@@ -563,6 +569,7 @@ def module(self, module_id: str, module_version_id: str = "", **kwargs) -> Modul
563569
raise Exception(response.status)
564570
dict_response = MessageToDict(response, preserving_proto_field_name=True)
565571
kwargs = self.process_response_keys(dict_response['module'], 'module')
572+
kwargs.update({'base_url': self.base})
566573

567574
return Module(**kwargs)
568575

@@ -572,7 +579,7 @@ def inputs(self,):
572579
Returns:
573580
Inputs: An input object.
574581
"""
575-
return Inputs(self.user_id, self.id)
582+
return Inputs(self.user_id, self.id, base_url=self.base)
576583

577584
def delete_dataset(self, dataset_id: str) -> None:
578585
"""Deletes an dataset for the user.

clarifai/client/dataset.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ def create_version(self, **kwargs) -> 'Dataset':
9393
'dataset_id': self.id,
9494
'app_id': self.app_id,
9595
'user_id': self.user_id,
96-
'version': response.dataset_versions[0]
96+
'version': response.dataset_versions[0],
97+
'base_url': self.base
9798
})
9899
return Dataset(**kwargs)
99100

@@ -155,7 +156,8 @@ def list_versions(self, page_no: int = None,
155156
'dataset_id': self.id,
156157
'app_id': self.app_id,
157158
'user_id': self.user_id,
158-
'version': resources_pb2.DatasetVersion(**dataset_version_info)
159+
'version': resources_pb2.DatasetVersion(**dataset_version_info),
160+
'base_url': self.base
159161
}
160162
yield Dataset(**kwargs)
161163

clarifai/client/model.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ def create_version(self, **kwargs) -> 'Model':
329329
dict_response = MessageToDict(response, preserving_proto_field_name=True)
330330
kwargs = self.process_response_keys(dict_response['model'], 'model')
331331

332-
return Model(**kwargs)
332+
return Model(base_url=self.base, **kwargs)
333333

334334
def list_versions(self, page_no: int = None,
335335
per_page: int = None) -> Generator['Model', None, None]:
@@ -371,7 +371,10 @@ def list_versions(self, page_no: int = None,
371371
del model_version_info['train_info']['dataset']['version']['metrics']
372372
except KeyError:
373373
pass
374-
yield Model(model_id=self.id, **dict(self.kwargs, model_version=model_version_info))
374+
yield Model(
375+
model_id=self.id,
376+
base_url=self.base,
377+
**dict(self.kwargs, model_version=model_version_info))
375378

376379
def predict(self, inputs: List[Input], inference_params: Dict = {}, output_config: Dict = {}):
377380
"""Predicts the model based on the given inputs.

clarifai/client/module.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,10 @@ def list_versions(self, page_no: int = None,
7676
for module_version_info in all_module_versions_info:
7777
module_version_info['id'] = module_version_info['module_version_id']
7878
del module_version_info['module_version_id']
79-
yield Module(module_id=self.id, **dict(self.kwargs, module_version=module_version_info))
79+
yield Module(
80+
module_id=self.id,
81+
base_url=self.base,
82+
**dict(self.kwargs, module_version=module_version_info))
8083

8184
def __getattr__(self, name):
8285
return getattr(self.module_info, name)

clarifai/client/search.py

+22-7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from math import ceil
12
from typing import Any, Callable, Dict, Generator
23

34
from clarifai_grpc.grpc.api import resources_pb2, service_pb2
@@ -41,11 +42,12 @@ def __init__(self,
4142
self.app_id = app_id
4243
self.metric_distance = dict(cosine="COSINE_DISTANCE", euclidean="EUCLIDEAN_DISTANCE")[metric]
4344
self.data_proto = resources_pb2.Data()
45+
self.top_k = top_k
4446

4547
self.inputs = Inputs(user_id=self.user_id, app_id=self.app_id)
4648
self.rank_filter_schema = get_schema()
4749
BaseClient.__init__(self, user_id=self.user_id, app_id=self.app_id, base=base_url)
48-
Lister.__init__(self, page_size=top_k)
50+
Lister.__init__(self, page_size=1000)
4951

5052
def _get_annot_proto(self, **kwargs):
5153
"""Get an Annotation proto message based on keyword arguments.
@@ -120,7 +122,7 @@ def _get_input_proto(self, **kwargs):
120122
self.data_proto.video.CopyFrom(resources_pb2.Video())
121123
self.input_proto.data.CopyFrom(self.data_proto)
122124
elif key == "input_dataset_ids":
123-
self.input_proto.dataset_ids = value
125+
self.input_proto.dataset_ids.extend(value)
124126
elif key == "input_status_code":
125127
self.input_proto.status.code = value
126128
else:
@@ -156,18 +158,31 @@ def list_all_pages_generator(
156158
Yields:
157159
response_dict: The next item in the listing.
158160
"""
161+
max_pages = ceil(self.top_k / self.default_page_size)
162+
total_hits = 0
159163
page = 1
160-
request_data['pagination'] = service_pb2.Pagination(page=page, per_page=self.default_page_size)
161-
while True:
162-
request_data['pagination'].page = page
164+
while (page <= max_pages):
165+
if (page == max_pages):
166+
per_page = self.top_k - total_hits
167+
else:
168+
per_page = self.default_page_size
169+
request_data['pagination'] = service_pb2.Pagination(page=page, per_page=per_page)
163170
response = self._grpc_request(endpoint, proto_message(**request_data))
164171
dict_response = MessageToDict(response, preserving_proto_field_name=True)
165172
if response.status.code != status_code_pb2.SUCCESS:
166-
raise Exception(f"Listing failed with response {response!r}")
173+
if "page * perPage cannot exceed" in str(response.status.details):
174+
msg = (f"Your top_k is set to {self.top_k}. "
175+
f"The current pagination settings exceed the limit. Please reach out to "
176+
f"[email protected] to request an increase for your use case.\n"
177+
f"req_id: {response.status.req_id}")
178+
raise UserError(msg)
179+
else:
180+
raise Exception(f"Listing failed with response {response!r}")
167181

168182
if 'hits' not in list(dict_response.keys()):
169183
break
170184
page += 1
185+
total_hits += per_page
171186
yield response
172187

173188
def query(self, ranks=[{}], filters=[{}]):
@@ -188,7 +203,7 @@ def query(self, ranks=[{}], filters=[{}]):
188203
189204
Vector search over inputs
190205
>>> from clarifai.client.search import Search
191-
>>> search = Search(user_id='user_id', app_id='app_id', top_k=10, metric='cosine')
206+
>>> search = Search(user_id='user_id', app_id='app_id', top_k=1, metric='cosine')
192207
>>> res = search.query(ranks=[{'image_url': 'https://samples.clarifai.com/dog.tiff'}])
193208
194209
Note: For more detailed search examples, please refer to [examples](https://github.com/Clarifai/examples/tree/main/search).

clarifai/client/user.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def list_apps(self, filter_by: Dict[str, Any] = {}, page_no: int = None,
5757
per_page=per_page,
5858
page_no=page_no)
5959
for app_info in all_apps_info:
60-
yield App(**app_info)
60+
yield App(base_url=self.base, **app_info)
6161

6262
def list_runners(self, filter_by: Dict[str, Any] = {}, page_no: int = None,
6363
per_page: int = None) -> Generator[Runner, None, None]:
@@ -89,7 +89,7 @@ def list_runners(self, filter_by: Dict[str, Any] = {}, page_no: int = None,
8989
page_no=page_no)
9090

9191
for runner_info in all_runners_info:
92-
yield Runner(check_runner_exists=False, **runner_info)
92+
yield Runner(check_runner_exists=False, base_url=self.base, **runner_info)
9393

9494
def create_app(self, app_id: str, base_workflow: str = 'Empty', **kwargs) -> App:
9595
"""Creates an app for the user.
@@ -115,7 +115,7 @@ def create_app(self, app_id: str, base_workflow: str = 'Empty', **kwargs) -> App
115115
if response.status.code != status_code_pb2.SUCCESS:
116116
raise Exception(response.status)
117117
self.logger.info("\nApp created\n%s", response.status)
118-
kwargs.update({'user_id': self.id})
118+
kwargs.update({'user_id': self.id, 'base_url': self.base})
119119
return App(app_id=app_id, **kwargs)
120120

121121
def create_runner(self, runner_id: str, labels: List[str], description: str) -> Runner:
@@ -151,7 +151,8 @@ def create_runner(self, runner_id: str, labels: List[str], description: str) ->
151151
user_id=self.id,
152152
labels=labels,
153153
description=description,
154-
check_runner_exists=False)
154+
check_runner_exists=False,
155+
base_url=self.base)
155156

156157
def app(self, app_id: str, **kwargs) -> App:
157158
"""Returns an App object for the specified app ID.
@@ -174,6 +175,7 @@ def app(self, app_id: str, **kwargs) -> App:
174175
raise Exception(response.status)
175176

176177
kwargs['user_id'] = self.id
178+
kwargs.update({'base_url': self.base})
177179
return App(app_id=app_id, **kwargs)
178180

179181
def runner(self, runner_id: str) -> Runner:
@@ -202,7 +204,7 @@ def runner(self, runner_id: str) -> Runner:
202204
kwargs = self.process_response_keys(dict_response[list(dict_response.keys())[1]],
203205
list(dict_response.keys())[1])
204206

205-
return Runner(check_runner_exists=False, **kwargs)
207+
return Runner(check_runner_exists=False, base_url=self.base, **kwargs)
206208

207209
def delete_app(self, app_id: str) -> None:
208210
"""Deletes an app for the user.

clarifai/client/workflow.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,10 @@ def list_versions(self, page_no: int = None,
184184
for workflow_version_info in all_workflow_versions_info:
185185
workflow_version_info['id'] = workflow_version_info['workflow_version_id']
186186
del workflow_version_info['workflow_version_id']
187-
yield Workflow(workflow_id=self.id, **dict(self.kwargs, version=workflow_version_info))
187+
yield Workflow(
188+
workflow_id=self.id,
189+
base_url=self.base,
190+
**dict(self.kwargs, version=workflow_version_info))
188191

189192
def export(self, out_path: str):
190193
"""Exports the workflow to a yaml file.

clarifai/versions.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import os
22

3-
CLIENT_VERSION = "9.10.0"
3+
CLIENT_VERSION = "9.10.2"
44
OS_VER = os.sys.platform
55
PYTHON_VERSION = '.'.join(
66
map(str, [os.sys.version_info.major, os.sys.version_info.minor, os.sys.version_info.micro]))

requirements.txt

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
clarifai-grpc==9.10.0
2-
pandas==1.3.5
3-
numpy==1.22.0
2+
pandas>=1.3.5
3+
numpy>=1.22.0
44
tqdm>=4.65.0
55
omegaconf==2.2.3
6-
pycocotools==2.0.6
76
opencv-python==4.7.0.68
87
tritonclient==2.34.0
9-
rich==13.4.2
8+
rich>=13.4.2
109
pytest==7.4.1
11-
PyYAML==6.0.1
10+
PyYAML>=6.0.1
1211
schema==0.7.5
12+
Pillow>=9.5.0

setup.py

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
license="Apache 2.0",
3535
python_requires='>=3.8',
3636
install_requires=install_requires,
37+
extras_require={
38+
'all': ["pycocotools==2.0.6"],
39+
},
3740
entry_points={
3841
"console_scripts": [
3942
"clarifai-model-upload-init = clarifai.models.model_serving.cli.repository:model_upload_init",

tests/test_app.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def test_create_app(self):
7575

7676
def test_create_search(self, create_app):
7777
search = create_app.search()
78-
assert search.default_page_size == DEFAULT_TOP_K and search.metric_distance == "COSINE_DISTANCE"
78+
assert search.top_k == DEFAULT_TOP_K and search.metric_distance == "COSINE_DISTANCE"
7979

8080
def test_create_dataset(self, create_app):
8181
dataset = create_app.create_dataset(CREATE_DATASET_ID)

0 commit comments

Comments
 (0)