clarifai 10.3.0__tar.gz → 10.3.2__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.3.0/clarifai.egg-info → clarifai-10.3.2}/PKG-INFO +20 -3
  2. {clarifai-10.3.0 → clarifai-10.3.2}/README.md +19 -2
  3. clarifai-10.3.2/VERSION +1 -0
  4. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/input.py +32 -9
  5. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/model.py +355 -36
  6. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/search.py +90 -15
  7. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/constants/model.py +1 -0
  8. clarifai-10.3.2/clarifai/constants/search.py +3 -0
  9. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/features.py +4 -0
  10. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/image.py +25 -2
  11. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/loaders/coco_captions.py +7 -2
  12. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/loaders/coco_detection.py +7 -2
  13. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/text.py +2 -0
  14. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/README.md +3 -0
  15. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/upload.py +65 -68
  16. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/docs/cli.md +17 -6
  17. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/rag/rag.py +1 -1
  18. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/rag/utils.py +2 -2
  19. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/versions.py +1 -1
  20. {clarifai-10.3.0 → clarifai-10.3.2/clarifai.egg-info}/PKG-INFO +20 -3
  21. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_app.py +1 -1
  22. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_search.py +17 -3
  23. clarifai-10.3.0/VERSION +0 -1
  24. clarifai-10.3.0/clarifai/constants/search.py +0 -2
  25. {clarifai-10.3.0 → clarifai-10.3.2}/LICENSE +0 -0
  26. {clarifai-10.3.0 → clarifai-10.3.2}/MANIFEST.in +0 -0
  27. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/__init__.py +0 -0
  28. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/cli.py +0 -0
  29. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/__init__.py +0 -0
  30. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/app.py +0 -0
  31. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/auth/__init__.py +0 -0
  32. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/auth/helper.py +0 -0
  33. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/auth/register.py +0 -0
  34. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/auth/stub.py +0 -0
  35. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/base.py +0 -0
  36. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/dataset.py +0 -0
  37. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/lister.py +0 -0
  38. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/module.py +0 -0
  39. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/user.py +0 -0
  40. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/client/workflow.py +0 -0
  41. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/constants/dataset.py +0 -0
  42. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/constants/input.py +0 -0
  43. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/constants/rag.py +0 -0
  44. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/constants/workflow.py +0 -0
  45. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/__init__.py +0 -0
  46. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/export/__init__.py +0 -0
  47. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/export/inputs_annotations.py +0 -0
  48. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/__init__.py +0 -0
  49. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/base.py +0 -0
  50. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/loaders/README.md +0 -0
  51. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/loaders/__init__.py +0 -0
  52. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/loaders/imagenet_classification.py +0 -0
  53. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/loaders/xview_detection.py +0 -0
  54. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/datasets/upload/utils.py +0 -0
  55. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/errors.py +0 -0
  56. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/__init__.py +0 -0
  57. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/api.py +0 -0
  58. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/__init__.py +0 -0
  59. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/__init__.py +0 -0
  60. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/_utils.py +0 -0
  61. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/base.py +0 -0
  62. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/build.py +0 -0
  63. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/clarifai_clis.py +0 -0
  64. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/create.py +0 -0
  65. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/example_cli.py +0 -0
  66. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/cli/login.py +0 -0
  67. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/constants.py +0 -0
  68. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/docs/concepts.md +0 -0
  69. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/docs/dependencies.md +0 -0
  70. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/docs/inference_parameters.md +0 -0
  71. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/docs/model_types.md +0 -0
  72. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/__init__.py +0 -0
  73. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/base.py +0 -0
  74. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/config.py +0 -0
  75. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/inference_parameter.py +0 -0
  76. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/multimodal-embedder.yaml +0 -0
  77. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/text-classifier.yaml +0 -0
  78. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/text-embedder.yaml +0 -0
  79. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/text-to-image.yaml +0 -0
  80. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/text-to-text.yaml +0 -0
  81. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/visual-classifier.yaml +0 -0
  82. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/visual-detector.yaml +0 -0
  83. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/visual-embedder.yaml +0 -0
  84. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/model_types_config/visual-segmenter.yaml +0 -0
  85. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/output.py +0 -0
  86. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/triton/__init__.py +0 -0
  87. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/triton/serializer.py +0 -0
  88. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/triton/triton_config.py +0 -0
  89. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/model_config/triton/wrappers.py +0 -0
  90. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/repo_build/__init__.py +0 -0
  91. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/repo_build/build.py +0 -0
  92. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/repo_build/static_files/_requirements.txt +0 -0
  93. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/repo_build/static_files/base_test.py +0 -0
  94. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/repo_build/static_files/inference.py +0 -0
  95. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/repo_build/static_files/sample_clarifai_config.yaml +0 -0
  96. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/repo_build/static_files/test.py +0 -0
  97. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/repo_build/static_files/triton/model.py +0 -0
  98. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/models/model_serving/utils.py +0 -0
  99. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/modules/README.md +0 -0
  100. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/modules/__init__.py +0 -0
  101. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/modules/css.py +0 -0
  102. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/modules/pages.py +0 -0
  103. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/modules/style.css +0 -0
  104. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/rag/__init__.py +0 -0
  105. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/schema/search.py +0 -0
  106. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/urls/helper.py +0 -0
  107. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/utils/__init__.py +0 -0
  108. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/utils/evaluation/__init__.py +0 -0
  109. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/utils/evaluation/helpers.py +0 -0
  110. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/utils/evaluation/main.py +0 -0
  111. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/utils/evaluation/testset_annotation_parser.py +0 -0
  112. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/utils/logging.py +0 -0
  113. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/utils/misc.py +0 -0
  114. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/utils/model_train.py +0 -0
  115. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/workflows/__init__.py +0 -0
  116. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/workflows/export.py +0 -0
  117. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/workflows/utils.py +0 -0
  118. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai/workflows/validate.py +0 -0
  119. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai.egg-info/SOURCES.txt +0 -0
  120. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai.egg-info/dependency_links.txt +0 -0
  121. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai.egg-info/entry_points.txt +0 -0
  122. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai.egg-info/requires.txt +0 -0
  123. {clarifai-10.3.0 → clarifai-10.3.2}/clarifai.egg-info/top_level.txt +0 -0
  124. {clarifai-10.3.0 → clarifai-10.3.2}/pyproject.toml +0 -0
  125. {clarifai-10.3.0 → clarifai-10.3.2}/requirements.txt +0 -0
  126. {clarifai-10.3.0 → clarifai-10.3.2}/setup.cfg +0 -0
  127. {clarifai-10.3.0 → clarifai-10.3.2}/setup.py +0 -0
  128. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_auth.py +0 -0
  129. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_data_upload.py +0 -0
  130. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_eval.py +0 -0
  131. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_misc.py +0 -0
  132. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_model_predict.py +0 -0
  133. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_model_train.py +0 -0
  134. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_modules.py +0 -0
  135. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_rag.py +0 -0
  136. {clarifai-10.3.0 → clarifai-10.3.2}/tests/test_stub.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clarifai
3
- Version: 10.3.0
3
+ Version: 10.3.2
4
4
  Summary: Clarifai Python SDK
5
5
  Home-page: https://github.com/Clarifai/clarifai-python
6
6
  Author: Clarifai
@@ -83,6 +83,7 @@ Give the repo a star ⭐
83
83
  * [Smart Image Search](#smart-image-search)
84
84
  * [Smart Text Search](#smart-text-search)
85
85
  * [Filters](#filters)
86
+ * [Pagination](#pagination)
86
87
  * **[Retrieval Augmented Generation (RAG)](#retrieval-augmented-generation-rag)**
87
88
  * **[More Examples](#pushpin-more-examples)**
88
89
 
@@ -163,13 +164,13 @@ dataset = app.create_dataset(dataset_id="demo_dataset")
163
164
  # execute data upload to Clarifai app dataset
164
165
  from clarifai.datasets.upload.laoders.coco_detection import COCODetectionDataLoader
165
166
  coco_dataloader = COCODetectionDataLoader("images_dir", "coco_annotation_filepath")
166
- dataset.upload_dataset(dataloader=coco_dataloader, get_upload_status=True, log_warnings =True)
167
+ dataset.upload_dataset(dataloader=coco_dataloader, get_upload_status=True)
167
168
 
168
169
 
169
170
  #Try upload and record the failed outputs in log file.
170
171
  from clarifai.datasets.upload.utils import load_module_dataloader
171
172
  cifar_dataloader = load_module_dataloader('./image_classification/cifar10')
172
- dataset.upload_dataset(dataloader=cifar_dataloader, get_upload_status=True, log_warnings =True)
173
+ dataset.upload_dataset(dataloader=cifar_dataloader, log_warnings =True)
173
174
 
174
175
  #Retry upload from logs for `upload_dataset`
175
176
  dataset.retry_upload_from_logs(dataloader=cifar_dataloader, log_file_path='log_file.log',
@@ -478,6 +479,22 @@ Input filters allows to filter by input_type, status of inputs and by inputs_dat
478
479
  results = search.query(filters=[{'input_types': ['image', 'text']}])
479
480
  ```
480
481
 
482
+ #### Pagination
483
+
484
+ Below is an example of using Search with Pagination.
485
+
486
+ ```python
487
+ # Note: CLARIFAI_PAT must be set as env variable.
488
+ from clarifai.client.search import Search
489
+ search = Search(user_id="user_id", app_id="app_id", metric="cosine", pagination=True)
490
+
491
+ # Search by image url
492
+ results = search.query(ranks=[{"image_url": "https://samples.clarifai.com/metro-north.jpg"}],page_no=2,per_page=5)
493
+
494
+ for data in results:
495
+ print(data.hits[0].input.data.image.url)
496
+ ```
497
+
481
498
  ## Retrieval Augmented Generation (RAG)
482
499
 
483
500
  You can setup and start your RAG pipeline in 4 lines of code. The setup method automatically creates a new app and the necessary components under the hood. By default it uses the [mistral-7B-Instruct](https://clarifai.com/mistralai/completion/models/mistral-7B-Instruct) model.
@@ -48,6 +48,7 @@ Give the repo a star ⭐
48
48
  * [Smart Image Search](#smart-image-search)
49
49
  * [Smart Text Search](#smart-text-search)
50
50
  * [Filters](#filters)
51
+ * [Pagination](#pagination)
51
52
  * **[Retrieval Augmented Generation (RAG)](#retrieval-augmented-generation-rag)**
52
53
  * **[More Examples](#pushpin-more-examples)**
53
54
 
@@ -128,13 +129,13 @@ dataset = app.create_dataset(dataset_id="demo_dataset")
128
129
  # execute data upload to Clarifai app dataset
129
130
  from clarifai.datasets.upload.laoders.coco_detection import COCODetectionDataLoader
130
131
  coco_dataloader = COCODetectionDataLoader("images_dir", "coco_annotation_filepath")
131
- dataset.upload_dataset(dataloader=coco_dataloader, get_upload_status=True, log_warnings =True)
132
+ dataset.upload_dataset(dataloader=coco_dataloader, get_upload_status=True)
132
133
 
133
134
 
134
135
  #Try upload and record the failed outputs in log file.
135
136
  from clarifai.datasets.upload.utils import load_module_dataloader
136
137
  cifar_dataloader = load_module_dataloader('./image_classification/cifar10')
137
- dataset.upload_dataset(dataloader=cifar_dataloader, get_upload_status=True, log_warnings =True)
138
+ dataset.upload_dataset(dataloader=cifar_dataloader, log_warnings =True)
138
139
 
139
140
  #Retry upload from logs for `upload_dataset`
140
141
  dataset.retry_upload_from_logs(dataloader=cifar_dataloader, log_file_path='log_file.log',
@@ -443,6 +444,22 @@ Input filters allows to filter by input_type, status of inputs and by inputs_dat
443
444
  results = search.query(filters=[{'input_types': ['image', 'text']}])
444
445
  ```
445
446
 
447
+ #### Pagination
448
+
449
+ Below is an example of using Search with Pagination.
450
+
451
+ ```python
452
+ # Note: CLARIFAI_PAT must be set as env variable.
453
+ from clarifai.client.search import Search
454
+ search = Search(user_id="user_id", app_id="app_id", metric="cosine", pagination=True)
455
+
456
+ # Search by image url
457
+ results = search.query(ranks=[{"image_url": "https://samples.clarifai.com/metro-north.jpg"}],page_no=2,per_page=5)
458
+
459
+ for data in results:
460
+ print(data.hits[0].input.data.image.url)
461
+ ```
462
+
446
463
  ## Retrieval Augmented Generation (RAG)
447
464
 
448
465
  You can setup and start your RAG pipeline in 4 lines of code. The setup method automatically creates a new app and the necessary components under the hood. By default it uses the [mistral-7B-Instruct](https://clarifai.com/mistralai/completion/models/mistral-7B-Instruct) model.
@@ -0,0 +1 @@
1
+ 10.3.2
@@ -72,6 +72,7 @@ class Inputs(Lister, BaseClient):
72
72
  text_pb: Text = None,
73
73
  geo_info: List = None,
74
74
  labels: List = None,
75
+ label_ids: List = None,
75
76
  metadata: Struct = None) -> Input:
76
77
  """Create input proto for image data type.
77
78
  Args:
@@ -82,7 +83,8 @@ class Inputs(Lister, BaseClient):
82
83
  audio_pb (Audio): The audio proto to be used for the input.
83
84
  text_pb (Text): The text proto to be used for the input.
84
85
  geo_info (list): A list of longitude and latitude for the geo point.
85
- labels (list): A list of labels for the input.
86
+ labels (list): A list of label names for the input.
87
+ label_ids (list): A list of label ids for the input.
86
88
  metadata (Struct): A Struct of metadata for the input.
87
89
  Returns:
88
90
  Input: An Input object for the specified input ID.
@@ -90,14 +92,26 @@ class Inputs(Lister, BaseClient):
90
92
  assert geo_info is None or isinstance(
91
93
  geo_info, list), "geo_info must be a list of longitude and latitude"
92
94
  assert labels is None or isinstance(labels, list), "labels must be a list of strings"
95
+ assert label_ids is None or isinstance(label_ids, list), "label_ids must be a list of strings"
93
96
  assert metadata is None or isinstance(metadata, Struct), "metadata must be a Struct"
94
97
  geo_pb = resources_pb2.Geo(geo_point=resources_pb2.GeoPoint(
95
98
  longitude=geo_info[0], latitude=geo_info[1])) if geo_info else None
96
- concepts=[
99
+ if labels:
100
+ if not label_ids:
101
+ concepts=[
97
102
  resources_pb2.Concept(
98
103
  id=f"id-{''.join(_label.split(' '))}", name=_label, value=1.)\
99
104
  for _label in labels
100
- ]if labels else None
105
+ ]
106
+ else:
107
+ assert len(labels) == len(label_ids), "labels and label_ids must be of the same length"
108
+ concepts=[
109
+ resources_pb2.Concept(
110
+ id=label_id, name=_label, value=1.)\
111
+ for label_id, _label in zip(label_ids, labels)
112
+ ]
113
+ else:
114
+ concepts = None
101
115
 
102
116
  if dataset_id:
103
117
  return resources_pb2.Input(
@@ -467,13 +481,14 @@ class Inputs(Lister, BaseClient):
467
481
  return input_protos
468
482
 
469
483
  @staticmethod
470
- def get_bbox_proto(input_id: str, label: str, bbox: List) -> Annotation:
484
+ def get_bbox_proto(input_id: str, label: str, bbox: List, label_id: str = None) -> Annotation:
471
485
  """Create an annotation proto for each bounding box, label input pair.
472
486
 
473
487
  Args:
474
488
  input_id (str): The input ID for the annotation to create.
475
- label (str): annotation label
489
+ label (str): annotation label name
476
490
  bbox (List): a list of a single bbox's coordinates. # bbox ordering: [xmin, ymin, xmax, ymax]
491
+ label_id (str): annotation label ID
477
492
 
478
493
  Returns:
479
494
  An annotation object for the specified input ID.
@@ -500,19 +515,22 @@ class Inputs(Lister, BaseClient):
500
515
  data=resources_pb2.Data(concepts=[
501
516
  resources_pb2.Concept(
502
517
  id=f"id-{''.join(label.split(' '))}", name=label, value=1.)
518
+ if not label_id else resources_pb2.Concept(id=label_id, name=label, value=1.)
503
519
  ]))
504
520
  ]))
505
521
 
506
522
  return input_annot_proto
507
523
 
508
524
  @staticmethod
509
- def get_mask_proto(input_id: str, label: str, polygons: List[List[float]]) -> Annotation:
525
+ def get_mask_proto(input_id: str, label: str, polygons: List[List[float]],
526
+ label_id: str = None) -> Annotation:
510
527
  """Create an annotation proto for each polygon box, label input pair.
511
528
 
512
529
  Args:
513
530
  input_id (str): The input ID for the annotation to create.
514
- label (str): annotation label
531
+ label (str): annotation label name
515
532
  polygons (List): Polygon x,y points iterable
533
+ label_id (str): annotation label ID
516
534
 
517
535
  Returns:
518
536
  An annotation object for the specified input ID.
@@ -537,6 +555,7 @@ class Inputs(Lister, BaseClient):
537
555
  data=resources_pb2.Data(concepts=[
538
556
  resources_pb2.Concept(
539
557
  id=f"id-{''.join(label.split(' '))}", name=label, value=1.)
558
+ if not label_id else resources_pb2.Concept(id=label_id, name=label, value=1.)
540
559
  ]))
541
560
  ]))
542
561
 
@@ -726,16 +745,20 @@ class Inputs(Lister, BaseClient):
726
745
  request = service_pb2.PostAnnotationsRequest(
727
746
  user_app_id=self.user_app_id, annotations=batch_annot)
728
747
  response = self._grpc_request(self.STUB.PostAnnotations, request)
748
+ response_dict = MessageToDict(response)
729
749
  if response.status.code != status_code_pb2.SUCCESS:
730
750
  try:
731
- self.logger.warning(f"Post annotations failed, status: {response.annotations[0].status}")
751
+ for annot in response_dict["annotations"]:
752
+ if annot['status']['code'] != status_code_pb2.ANNOTATION_SUCCESS:
753
+ self.logger.warning(f"Post annotations failed, status: {annot['status']}")
732
754
  except Exception:
733
- self.logger.warning(f"Post annotations failed, status: {response.status.details}")
755
+ self.logger.warning(f"Post annotations failed due to {response.status}")
734
756
  finally:
735
757
  retry_upload.extend(batch_annot)
736
758
  else:
737
759
  if show_log:
738
760
  self.logger.info("\nAnnotations Uploaded\n%s", response.status)
761
+
739
762
  return retry_upload
740
763
 
741
764
  def _upload_batch(self, inputs: List[Input]) -> List[Input]: