clarifai 10.5.4__tar.gz → 10.7.0__tar.gz

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.
Files changed (136) hide show
  1. {clarifai-10.5.4 → clarifai-10.7.0}/MANIFEST.in +1 -1
  2. {clarifai-10.5.4/clarifai.egg-info → clarifai-10.7.0}/PKG-INFO +2 -2
  3. clarifai-10.7.0/clarifai/__init__.py +1 -0
  4. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/app.py +26 -0
  5. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/base.py +5 -0
  6. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/search.py +28 -42
  7. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/user.py +33 -0
  8. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/versions.py +2 -1
  9. {clarifai-10.5.4 → clarifai-10.7.0/clarifai.egg-info}/PKG-INFO +2 -2
  10. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai.egg-info/SOURCES.txt +0 -1
  11. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai.egg-info/requires.txt +1 -1
  12. {clarifai-10.5.4 → clarifai-10.7.0}/requirements.txt +1 -1
  13. {clarifai-10.5.4 → clarifai-10.7.0}/setup.py +7 -2
  14. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_app.py +28 -0
  15. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_search.py +10 -0
  16. clarifai-10.5.4/VERSION +0 -1
  17. clarifai-10.5.4/clarifai/workflows/__init__.py +0 -0
  18. {clarifai-10.5.4 → clarifai-10.7.0}/LICENSE +0 -0
  19. {clarifai-10.5.4 → clarifai-10.7.0}/README.md +0 -0
  20. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/cli.py +0 -0
  21. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/__init__.py +0 -0
  22. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/auth/__init__.py +0 -0
  23. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/auth/helper.py +0 -0
  24. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/auth/register.py +0 -0
  25. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/auth/stub.py +0 -0
  26. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/dataset.py +0 -0
  27. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/input.py +0 -0
  28. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/lister.py +0 -0
  29. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/model.py +0 -0
  30. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/module.py +0 -0
  31. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/client/workflow.py +0 -0
  32. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/constants/dataset.py +0 -0
  33. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/constants/input.py +0 -0
  34. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/constants/model.py +0 -0
  35. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/constants/rag.py +0 -0
  36. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/constants/search.py +0 -0
  37. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/constants/workflow.py +0 -0
  38. {clarifai-10.5.4/clarifai → clarifai-10.7.0/clarifai/datasets}/__init__.py +0 -0
  39. {clarifai-10.5.4/clarifai/datasets → clarifai-10.7.0/clarifai/datasets/export}/__init__.py +0 -0
  40. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/export/inputs_annotations.py +0 -0
  41. {clarifai-10.5.4/clarifai/datasets/export → clarifai-10.7.0/clarifai/datasets/upload}/__init__.py +0 -0
  42. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/base.py +0 -0
  43. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/features.py +0 -0
  44. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/image.py +0 -0
  45. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/loaders/README.md +0 -0
  46. {clarifai-10.5.4/clarifai/datasets/upload → clarifai-10.7.0/clarifai/datasets/upload/loaders}/__init__.py +0 -0
  47. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/loaders/coco_captions.py +0 -0
  48. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/loaders/coco_detection.py +0 -0
  49. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/loaders/imagenet_classification.py +0 -0
  50. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/loaders/xview_detection.py +0 -0
  51. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/text.py +0 -0
  52. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/datasets/upload/utils.py +0 -0
  53. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/errors.py +0 -0
  54. {clarifai-10.5.4/clarifai/datasets/upload/loaders → clarifai-10.7.0/clarifai/models}/__init__.py +0 -0
  55. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/api.py +0 -0
  56. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/README.md +0 -0
  57. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/__init__.py +0 -0
  58. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/__init__.py +0 -0
  59. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/_utils.py +0 -0
  60. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/base.py +0 -0
  61. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/build.py +0 -0
  62. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/clarifai_clis.py +0 -0
  63. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/create.py +0 -0
  64. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/example_cli.py +0 -0
  65. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/login.py +0 -0
  66. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/cli/upload.py +0 -0
  67. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/constants.py +0 -0
  68. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/docs/cli.md +0 -0
  69. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/docs/concepts.md +0 -0
  70. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/docs/dependencies.md +0 -0
  71. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/docs/inference_parameters.md +0 -0
  72. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/docs/model_types.md +0 -0
  73. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/__init__.py +0 -0
  74. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/base.py +0 -0
  75. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/config.py +0 -0
  76. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/inference_parameter.py +0 -0
  77. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/multimodal-embedder.yaml +0 -0
  78. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/text-classifier.yaml +0 -0
  79. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/text-embedder.yaml +0 -0
  80. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/text-to-image.yaml +0 -0
  81. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/text-to-text.yaml +0 -0
  82. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/visual-classifier.yaml +0 -0
  83. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/visual-detector.yaml +0 -0
  84. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/visual-embedder.yaml +0 -0
  85. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/model_types_config/visual-segmenter.yaml +0 -0
  86. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/output.py +0 -0
  87. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/triton/__init__.py +0 -0
  88. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/triton/serializer.py +0 -0
  89. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/triton/triton_config.py +0 -0
  90. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/model_config/triton/wrappers.py +0 -0
  91. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/repo_build/__init__.py +0 -0
  92. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/repo_build/build.py +0 -0
  93. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/repo_build/static_files/_requirements.txt +0 -0
  94. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/repo_build/static_files/base_test.py +0 -0
  95. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/repo_build/static_files/inference.py +0 -0
  96. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/repo_build/static_files/sample_clarifai_config.yaml +0 -0
  97. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/repo_build/static_files/test.py +0 -0
  98. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/repo_build/static_files/triton/model.py +0 -0
  99. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/models/model_serving/utils.py +0 -0
  100. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/modules/README.md +0 -0
  101. {clarifai-10.5.4/clarifai/models → clarifai-10.7.0/clarifai/modules}/__init__.py +0 -0
  102. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/modules/css.py +0 -0
  103. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/modules/pages.py +0 -0
  104. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/modules/style.css +0 -0
  105. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/rag/__init__.py +0 -0
  106. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/rag/rag.py +0 -0
  107. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/rag/utils.py +0 -0
  108. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/schema/search.py +0 -0
  109. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/urls/helper.py +0 -0
  110. {clarifai-10.5.4/clarifai/modules → clarifai-10.7.0/clarifai/utils}/__init__.py +0 -0
  111. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/utils/constants.py +0 -0
  112. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/utils/evaluation/__init__.py +0 -0
  113. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/utils/evaluation/helpers.py +0 -0
  114. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/utils/evaluation/main.py +0 -0
  115. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/utils/evaluation/testset_annotation_parser.py +0 -0
  116. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/utils/logging.py +0 -0
  117. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/utils/misc.py +0 -0
  118. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/utils/model_train.py +0 -0
  119. {clarifai-10.5.4/clarifai/utils → clarifai-10.7.0/clarifai/workflows}/__init__.py +0 -0
  120. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/workflows/export.py +0 -0
  121. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/workflows/utils.py +0 -0
  122. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai/workflows/validate.py +0 -0
  123. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai.egg-info/dependency_links.txt +0 -0
  124. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai.egg-info/entry_points.txt +0 -0
  125. {clarifai-10.5.4 → clarifai-10.7.0}/clarifai.egg-info/top_level.txt +0 -0
  126. {clarifai-10.5.4 → clarifai-10.7.0}/pyproject.toml +0 -0
  127. {clarifai-10.5.4 → clarifai-10.7.0}/setup.cfg +0 -0
  128. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_auth.py +0 -0
  129. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_data_upload.py +0 -0
  130. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_eval.py +0 -0
  131. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_misc.py +0 -0
  132. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_model_predict.py +0 -0
  133. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_model_train.py +0 -0
  134. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_modules.py +0 -0
  135. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_rag.py +0 -0
  136. {clarifai-10.5.4 → clarifai-10.7.0}/tests/test_stub.py +0 -0
@@ -1,4 +1,4 @@
1
1
  global-include *.css
2
2
  include clarifai/modules/style.css
3
3
  recursive-include clarifai *
4
- include VERSION requirements.txt
4
+ include requirements.txt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clarifai
3
- Version: 10.5.4
3
+ Version: 10.7.0
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -20,7 +20,7 @@ Classifier: Operating System :: OS Independent
20
20
  Requires-Python: >=3.8
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
- Requires-Dist: clarifai-grpc>=10.5.0
23
+ Requires-Dist: clarifai-grpc>=10.7.0
24
24
  Requires-Dist: numpy>=1.22.0
25
25
  Requires-Dist: tqdm>=4.65.0
26
26
  Requires-Dist: tritonclient>=2.34.0
@@ -0,0 +1 @@
1
+ __version__ = "10.7.0"
@@ -592,6 +592,32 @@ class App(Lister, BaseClient):
592
592
  """
593
593
  return Inputs.from_auth_helper(self.auth_helper)
594
594
 
595
+ def patch_dataset(self, dataset_id: str, action: str = 'merge', **kwargs) -> Dataset:
596
+ """Patches a dataset for the app.
597
+
598
+ Args:
599
+ dataset_id (str): The dataset ID for the dataset to create.
600
+ action (str): The action to perform on the dataset (merge/overwrite/remove).
601
+ **kwargs: Additional keyword arguments to be passed to patch the Dataset.
602
+
603
+ Returns:
604
+ Dataset: A Dataset object for the specified dataset ID.
605
+ """
606
+ if "visibility" in kwargs:
607
+ kwargs["visibility"] = resources_pb2.Visibility(gettable=kwargs["visibility"])
608
+ if "image_url" in kwargs:
609
+ kwargs["image"] = resources_pb2.Image(url=kwargs.pop("image_url"))
610
+ request = service_pb2.PatchDatasetsRequest(
611
+ user_app_id=self.user_app_id,
612
+ datasets=[resources_pb2.Dataset(id=dataset_id, **kwargs)],
613
+ action=action)
614
+ response = self._grpc_request(self.STUB.PatchDatasets, request)
615
+ if response.status.code != status_code_pb2.SUCCESS:
616
+ raise Exception(response.status)
617
+ self.logger.info("\nDataset patched\n%s", response.status)
618
+
619
+ return Dataset.from_auth_helper(self.auth_helper, dataset_id=dataset_id, **kwargs)
620
+
595
621
  def delete_dataset(self, dataset_id: str) -> None:
596
622
  """Deletes an dataset for the user.
597
623
 
@@ -1,6 +1,7 @@
1
1
  from datetime import datetime
2
2
  from typing import Any, Callable
3
3
 
4
+ from clarifai_grpc.grpc.api import resources_pb2
4
5
  from google.protobuf import struct_pb2
5
6
  from google.protobuf.timestamp_pb2 import Timestamp
6
7
  from google.protobuf.wrappers_pb2 import BoolValue
@@ -176,6 +177,10 @@ class BaseClient:
176
177
  continue
177
178
  elif key == 'size':
178
179
  value = int(value)
180
+ elif key == 'image_info':
181
+ value = resources_pb2.ImageInfo(**value)
182
+ elif key == 'hosted_image_info':
183
+ continue
179
184
  elif key in ['metadata']:
180
185
  if isinstance(value, dict) and value != {}:
181
186
  value_s = struct_pb2.Struct()
@@ -277,7 +277,8 @@ class Search(Lister, BaseClient):
277
277
  Get successful inputs of type image or text
278
278
  >>> from clarifai.client.search import Search
279
279
  >>> search = Search(user_id='user_id', app_id='app_id', top_k=10, metric='cosine')
280
- >>> res = search.query(filters=[{'input_types': ['image', 'text']}, {'input_status_code': 30000}])
280
+ # This performs OR operation on input_types and input_status_code
281
+ >>> res = search.query(filters=[{'input_types': ['image', 'text'], 'input_status_code': 30000}])
281
282
 
282
283
  Vector search over inputs
283
284
  >>> from clarifai.client.search import Search
@@ -298,43 +299,27 @@ class Search(Lister, BaseClient):
298
299
  raise UserError(f"Invalid rank or filter input: {err}")
299
300
 
300
301
  # For each rank, create a Rank proto message
301
- rank_annot_proto = []
302
+ # For ranks it only allows resources_pb2.Annotation proto, so no need of splitting protos into annotation and input.
303
+ all_ranks = []
302
304
  for rank_dict in ranks:
303
- rank_annot_proto.append(self._get_annot_proto(**rank_dict))
304
- all_ranks = [resources_pb2.Rank(annotation=rank_annot) for rank_annot in rank_annot_proto]
305
-
306
- # Calls PostInputsSearches for annotation ranks, input filters
307
- if any(["input" in k for k in filters[0].keys()]):
308
- filters_input_proto = []
309
- for filter_dict in filters:
310
- filters_input_proto.append(self._get_input_proto(**filter_dict))
311
- all_filters = [
312
- resources_pb2.Filter(input=filter_input) for filter_input in filters_input_proto
313
- ]
314
- request_data = dict(
315
- user_app_id=self.user_app_id,
316
- searches=[
317
- resources_pb2.Search(
318
- query=resources_pb2.Query(ranks=all_ranks, filters=all_filters),
319
- algorithm=self.algorithm,
320
- metric=self.metric_distance)
321
- ])
322
- if self.pagination:
323
- return self._list_all_pages_generator(self.STUB.PostInputsSearches,
324
- service_pb2.PostInputsSearchesRequest, request_data,
325
- page_no, per_page)
326
- return self._list_topk_generator(self.STUB.PostInputsSearches,
327
- service_pb2.PostInputsSearchesRequest, request_data)
328
-
329
- # Calls PostAnnotationsSearches for annotation ranks, filters
330
- filters_annot_proto = []
331
- for filter_dict in filters:
332
- filters_annot_proto.append(self._get_annot_proto(**filter_dict))
333
-
334
- all_filters = [
335
- resources_pb2.Filter(annotation=filter_annot) for filter_annot in filters_annot_proto
336
- ]
337
-
305
+ rank_annot_proto = self._get_annot_proto(**rank_dict)
306
+ all_ranks.append(resources_pb2.Rank(annotation=rank_annot_proto))
307
+
308
+ all_filters = []
309
+ # check for filters which is compatible with input proto
310
+ for each_filter in filters:
311
+ input_dict = {
312
+ key: each_filter.pop(key)
313
+ for key in ['input_types', 'input_dataset_ids', 'input_status_code']
314
+ if key in each_filter
315
+ }
316
+
317
+ all_filters.append(
318
+ resources_pb2.Filter(
319
+ annotation=self._get_annot_proto(**each_filter),
320
+ input=self._get_input_proto(**input_dict)))
321
+
322
+ # Create a PostInputsSearchesRequest proto message
338
323
  request_data = dict(
339
324
  user_app_id=self.user_app_id,
340
325
  searches=[
@@ -343,9 +328,10 @@ class Search(Lister, BaseClient):
343
328
  algorithm=self.algorithm,
344
329
  metric=self.metric_distance)
345
330
  ])
331
+ # Calls PostInputsSearches for annotation ranks, input filters
346
332
  if self.pagination:
347
- return self._list_all_pages_generator(self.STUB.PostAnnotationsSearches,
348
- service_pb2.PostAnnotationsSearchesRequest,
349
- request_data, page_no, per_page)
350
- return self._list_topk_generator(self.STUB.PostAnnotationsSearches,
351
- service_pb2.PostAnnotationsSearchesRequest, request_data)
333
+ return self._list_all_pages_generator(self.STUB.PostInputsSearches,
334
+ service_pb2.PostInputsSearchesRequest, request_data,
335
+ page_no, per_page)
336
+ return self._list_topk_generator(self.STUB.PostInputsSearches,
337
+ service_pb2.PostInputsSearchesRequest, request_data)
@@ -3,6 +3,7 @@ from typing import Any, Dict, Generator, List
3
3
  from clarifai_grpc.grpc.api import resources_pb2, service_pb2
4
4
  from clarifai_grpc.grpc.api.status import status_code_pb2
5
5
  from google.protobuf.json_format import MessageToDict
6
+ from google.protobuf.wrappers_pb2 import BoolValue
6
7
 
7
8
  from clarifai.client.app import App
8
9
  from clarifai.client.base import BaseClient
@@ -222,6 +223,38 @@ class User(Lister, BaseClient):
222
223
 
223
224
  return dict(self.auth_helper, check_runner_exists=False, **kwargs)
224
225
 
226
+ def patch_app(self, app_id: str, action: str = 'overwrite', **kwargs) -> App:
227
+ """Patch an app for the user.
228
+
229
+ Args:
230
+ app_id (str): The app ID for the app to patch.
231
+ action (str): The action to perform on the app (overwrite/remove).
232
+ **kwargs: Additional keyword arguments to be passed to patch the App.
233
+
234
+ Returns:
235
+ App: Patched App object for the specified app ID.
236
+ """
237
+ if "base_workflow" in kwargs:
238
+ kwargs["default_workflow"] = resources_pb2.Workflow(
239
+ id=kwargs.pop("base_workflow"), app_id="main", user_id="clarifai")
240
+ if "visibility" in kwargs:
241
+ kwargs["visibility"] = resources_pb2.Visibility(gettable=kwargs["visibility"])
242
+ if "image_url" in kwargs:
243
+ kwargs["image"] = resources_pb2.Image(url=kwargs.pop("image_url"))
244
+ if "is_template" in kwargs:
245
+ kwargs["is_template"] = BoolValue(value=kwargs["is_template"])
246
+ request = service_pb2.PatchAppRequest(
247
+ user_app_id=resources_pb2.UserAppIDSet(user_id=self.id, app_id=app_id),
248
+ app=resources_pb2.App(id=app_id, **kwargs),
249
+ action=action,
250
+ reindex=False)
251
+ response = self._grpc_request(self.STUB.PatchApp, request)
252
+ if response.status.code != status_code_pb2.SUCCESS:
253
+ raise Exception(response.status)
254
+ self.logger.info("\nApp patched\n%s", response.status)
255
+
256
+ return App.from_auth_helper(auth=self.auth_helper, app_id=app_id)
257
+
225
258
  def delete_app(self, app_id: str) -> None:
226
259
  """Deletes an app for the user.
227
260
 
@@ -1,6 +1,7 @@
1
1
  import os
2
+ from clarifai import __version__
2
3
 
3
- CLIENT_VERSION = "10.5.4"
4
+ CLIENT_VERSION = __version__
4
5
  OS_VER = os.sys.platform
5
6
  PYTHON_VERSION = '.'.join(
6
7
  map(str, [os.sys.version_info.major, os.sys.version_info.minor, os.sys.version_info.micro]))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clarifai
3
- Version: 10.5.4
3
+ Version: 10.7.0
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -20,7 +20,7 @@ Classifier: Operating System :: OS Independent
20
20
  Requires-Python: >=3.8
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
- Requires-Dist: clarifai-grpc>=10.5.0
23
+ Requires-Dist: clarifai-grpc>=10.7.0
24
24
  Requires-Dist: numpy>=1.22.0
25
25
  Requires-Dist: tqdm>=4.65.0
26
26
  Requires-Dist: tritonclient>=2.34.0
@@ -1,7 +1,6 @@
1
1
  LICENSE
2
2
  MANIFEST.in
3
3
  README.md
4
- VERSION
5
4
  pyproject.toml
6
5
  requirements.txt
7
6
  setup.py
@@ -1,4 +1,4 @@
1
- clarifai-grpc>=10.5.0
1
+ clarifai-grpc>=10.7.0
2
2
  numpy>=1.22.0
3
3
  tqdm>=4.65.0
4
4
  tritonclient>=2.34.0
@@ -1,4 +1,4 @@
1
- clarifai-grpc>=10.5.0
1
+ clarifai-grpc>=10.7.0
2
2
  numpy>=1.22.0
3
3
  tqdm>=4.65.0
4
4
  tritonclient>=2.34.0
@@ -1,10 +1,15 @@
1
+ import re
2
+
1
3
  import setuptools
2
4
 
3
5
  with open("README.md", "r") as fh:
4
6
  long_description = fh.read()
5
7
 
6
- with open("VERSION", "r") as f:
7
- version = f.read().strip()
8
+ with open("./clarifai/__init__.py") as f:
9
+ content = f.read()
10
+ _search_version = re.search(r'__version__\s*=\s*[\'"]([^\'"]*)[\'"]', content)
11
+ assert _search_version
12
+ version = _search_version.group(1)
8
13
 
9
14
  with open("requirements.txt", "r") as fh:
10
15
  install_requires = fh.read().split('\n')
@@ -22,6 +22,9 @@ CREATE_DATASET_ID = f"ci_test_dataset_{NOW}"
22
22
  CREATE_MODULE_ID = f"ci_test_module_{NOW}"
23
23
  CREATE_RUNNER_ID = f"ci_test_runner_{NOW}"
24
24
 
25
+ #assets
26
+ IMAGE_URL = "https://samples.clarifai.com/metro-north.jpg"
27
+
25
28
  CLARIFAI_PAT = os.environ["CLARIFAI_PAT"]
26
29
 
27
30
 
@@ -124,6 +127,31 @@ class TestApp:
124
127
  assert os.path.exists('tests/output_demo.zip') is True
125
128
  os.remove('tests/output_demo.zip')
126
129
 
130
+ def test_patch_app(self, caplog):
131
+ with caplog.at_level(logging.INFO):
132
+ User(user_id=CREATE_APP_USER_ID).patch_app(
133
+ app_id=CREATE_APP_ID,
134
+ action='overwrite',
135
+ default_language='en',
136
+ base_workflow='Universal',
137
+ description='App Patching Test',
138
+ is_template=True,
139
+ visibility=10,
140
+ notes='App Patching Notes Test',
141
+ image_url=IMAGE_URL)
142
+ assert "SUCCESS" in caplog.text
143
+
144
+ def test_patch_dataset(self, create_app, caplog):
145
+ with caplog.at_level(logging.INFO):
146
+ create_app.patch_dataset(
147
+ dataset_id=CREATE_DATASET_ID,
148
+ action='merge',
149
+ description='App Patching Test',
150
+ visibility=10,
151
+ notes='App Patching Notes Test',
152
+ image_url=IMAGE_URL)
153
+ assert "SUCCESS" in caplog.text
154
+
127
155
  def test_delete_dataset(self, create_app, caplog):
128
156
  with caplog.at_level(logging.INFO):
129
157
  create_app.delete_dataset(CREATE_DATASET_ID)
@@ -114,6 +114,8 @@ class TestAnnotationSearch:
114
114
  user_id=CREATE_APP_USER_ID, app_id=CREATE_APP_ID, top_k=1, metric="euclidean")
115
115
  cls.search_with_pagination = Search(
116
116
  user_id=CREATE_APP_USER_ID, app_id=CREATE_APP_ID, metric="euclidean", pagination=True)
117
+ cls.search_deduplicate = Search(
118
+ user_id=CREATE_APP_USER_ID, app_id=CREATE_APP_ID, top_k=2, metric="euclidean")
117
119
  cls.upload_data()
118
120
 
119
121
  @classmethod
@@ -212,5 +214,13 @@ class TestAnnotationSearch:
212
214
  with pytest.raises(UserError):
213
215
  _ = self.search.query(filters=[{"input_id": "test"}])
214
216
 
217
+ def test_rank_search_deduplicate(self):
218
+ query = self.search_deduplicate.query(ranks=[{
219
+ "image_url": "https://samples.clarifai.com/dog.tiff"
220
+ }])
221
+ for q in query:
222
+ assert len(q.hits) == 2
223
+ assert q.hits[0].input.id != q.hits[1].input.id
224
+
215
225
  def teardown_class(cls):
216
226
  cls.client.delete_app(app_id=CREATE_APP_ID)
clarifai-10.5.4/VERSION DELETED
@@ -1 +0,0 @@
1
- 10.5.4
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes