label-studio-sdk 1.0.10__tar.gz → 1.0.12__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.

Potentially problematic release.


This version of label-studio-sdk might be problematic. Click here for more details.

Files changed (369) hide show
  1. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/PKG-INFO +3 -2
  2. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/pyproject.toml +4 -2
  3. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/__init__.py +21 -1
  4. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/json_schema.py +5 -0
  5. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/base_client.py +8 -0
  6. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/converter.py +22 -0
  7. label_studio_sdk-1.0.12/src/label_studio_sdk/converter/exports/brush_to_coco.py +332 -0
  8. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/main.py +14 -0
  9. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/client_wrapper.py +34 -15
  10. label_studio_sdk-1.0.12/src/label_studio_sdk/errors/__init__.py +8 -0
  11. label_studio_sdk-1.0.12/src/label_studio_sdk/errors/not_found_error.py +9 -0
  12. label_studio_sdk-1.0.12/src/label_studio_sdk/errors/unauthorized_error.py +9 -0
  13. label_studio_sdk-1.0.12/src/label_studio_sdk/jwt_settings/client.py +259 -0
  14. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/control_tags.py +15 -2
  15. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/interface.py +80 -1
  16. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/object_tags.py +2 -2
  17. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/__init__.py +2 -1
  18. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/client.py +4 -0
  19. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/exports/client_ext.py +106 -40
  20. label_studio_sdk-1.0.12/src/label_studio_sdk/projects/pauses/client.py +704 -0
  21. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/types/projects_update_response.py +10 -0
  22. label_studio_sdk-1.0.12/src/label_studio_sdk/prompts/indicators/__init__.py +2 -0
  23. label_studio_sdk-1.0.12/src/label_studio_sdk/prompts/versions/__init__.py +2 -0
  24. label_studio_sdk-1.0.12/src/label_studio_sdk/tokens/__init__.py +2 -0
  25. label_studio_sdk-1.0.12/src/label_studio_sdk/tokens/client.py +610 -0
  26. label_studio_sdk-1.0.12/src/label_studio_sdk/tokens/client_ext.py +94 -0
  27. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/__init__.py +14 -0
  28. label_studio_sdk-1.0.12/src/label_studio_sdk/types/access_token_response.py +22 -0
  29. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/annotation.py +2 -1
  30. label_studio_sdk-1.0.12/src/label_studio_sdk/types/annotation_completed_by.py +6 -0
  31. label_studio_sdk-1.0.12/src/label_studio_sdk/types/api_token_response.py +32 -0
  32. label_studio_sdk-1.0.12/src/label_studio_sdk/types/jwt_settings_response.py +32 -0
  33. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/model_provider_connection_provider.py +1 -1
  34. label_studio_sdk-1.0.12/src/label_studio_sdk/types/pause.py +34 -0
  35. label_studio_sdk-1.0.12/src/label_studio_sdk/types/pause_paused_by.py +5 -0
  36. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/project.py +10 -0
  37. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt_version_provider.py +1 -1
  38. label_studio_sdk-1.0.12/src/label_studio_sdk/types/rotate_token_response.py +22 -0
  39. label_studio_sdk-1.0.10/src/label_studio_sdk/errors/__init__.py +0 -6
  40. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/LICENSE +0 -0
  41. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/README.md +0 -0
  42. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/__init__.py +0 -0
  43. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/eval/categorical.py +0 -0
  44. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/__init__.py +0 -0
  45. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/core/__init__.py +0 -0
  46. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/core/label_config.py +0 -0
  47. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/__init__.py +0 -0
  48. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/exceptions.py +0 -0
  49. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/io.py +0 -0
  50. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/core/utils/params.py +0 -0
  51. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/etl/__init__.py +0 -0
  52. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/etl/beam.py +0 -0
  53. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/etl/example.py +0 -0
  54. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/etl/registry.py +0 -0
  55. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/__init__.py +0 -0
  56. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/label_studio_tools/postprocessing/video.py +0 -0
  57. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_extensions/pager_ext.py +0 -0
  58. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_legacy/__init__.py +0 -0
  59. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_legacy/client.py +0 -0
  60. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_legacy/exceptions.py +0 -0
  61. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_legacy/project.py +0 -0
  62. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_legacy/schema/label_config_schema.json +0 -0
  63. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_legacy/users.py +0 -0
  64. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_legacy/utils.py +0 -0
  65. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/_legacy/workspaces.py +0 -0
  66. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/__init__.py +0 -0
  67. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/client.py +0 -0
  68. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/__init__.py +0 -0
  69. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_filters.py +0 -0
  70. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_filters_conjunction.py +0 -0
  71. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item.py +0 -0
  72. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_filter.py +0 -0
  73. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_operator.py +0 -0
  74. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_filters_items_item_value.py +0 -0
  75. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_id.py +0 -0
  76. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_ordering_item.py +0 -0
  77. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_selected_items.py +0 -0
  78. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_selected_items_excluded.py +0 -0
  79. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/actions/types/actions_create_request_selected_items_included.py +0 -0
  80. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/annotations/__init__.py +0 -0
  81. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/annotations/client.py +0 -0
  82. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/annotations/types/__init__.py +0 -0
  83. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/annotations/types/annotations_create_bulk_request_selected_items.py +0 -0
  84. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/annotations/types/annotations_create_bulk_response_item.py +0 -0
  85. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/client.py +0 -0
  86. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/comments/__init__.py +0 -0
  87. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/comments/client.py +0 -0
  88. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/__init__.py +0 -0
  89. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/audio.py +0 -0
  90. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/brush.py +0 -0
  91. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/exports/__init__.py +0 -0
  92. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/exports/csv.py +0 -0
  93. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/exports/csv2.py +0 -0
  94. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/funsd.py +0 -0
  95. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/imports/__init__.py +0 -0
  96. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/imports/coco.py +0 -0
  97. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/imports/colors.py +0 -0
  98. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/imports/label_config.py +0 -0
  99. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/imports/pathtrack.py +0 -0
  100. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/imports/yolo.py +0 -0
  101. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/converter/utils.py +0 -0
  102. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/__init__.py +0 -0
  103. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/api_error.py +0 -0
  104. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/datetime_utils.py +0 -0
  105. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/file.py +0 -0
  106. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/http_client.py +0 -0
  107. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/jsonable_encoder.py +0 -0
  108. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/pagination.py +0 -0
  109. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/pydantic_utilities.py +0 -0
  110. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/query_encoder.py +0 -0
  111. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/remove_none_from_dict.py +0 -0
  112. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/request_options.py +0 -0
  113. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/core/serialization.py +0 -0
  114. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/data_manager.py +0 -0
  115. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/environment.py +0 -0
  116. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/errors/bad_request_error.py +0 -0
  117. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/errors/internal_server_error.py +0 -0
  118. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/__init__.py +0 -0
  119. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/azure/__init__.py +0 -0
  120. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/azure/client.py +0 -0
  121. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/azure/types/__init__.py +0 -0
  122. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/azure/types/azure_create_response.py +0 -0
  123. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/azure/types/azure_update_response.py +0 -0
  124. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/client.py +0 -0
  125. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/gcs/__init__.py +0 -0
  126. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/gcs/client.py +0 -0
  127. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/gcs/types/__init__.py +0 -0
  128. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/gcs/types/gcs_create_response.py +0 -0
  129. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/gcs/types/gcs_update_response.py +0 -0
  130. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/local/__init__.py +0 -0
  131. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/local/client.py +0 -0
  132. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/local/types/__init__.py +0 -0
  133. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/local/types/local_create_response.py +0 -0
  134. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/local/types/local_update_response.py +0 -0
  135. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/redis/__init__.py +0 -0
  136. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/redis/client.py +0 -0
  137. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/redis/types/__init__.py +0 -0
  138. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/redis/types/redis_create_response.py +0 -0
  139. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/redis/types/redis_update_response.py +0 -0
  140. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/s3/__init__.py +0 -0
  141. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/s3/client.py +0 -0
  142. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/s3/types/__init__.py +0 -0
  143. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/s3/types/s3create_response.py +0 -0
  144. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/s3/types/s3update_response.py +0 -0
  145. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/s3s/__init__.py +0 -0
  146. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/s3s/client.py +0 -0
  147. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/types/__init__.py +0 -0
  148. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/export_storage/types/export_storage_list_types_response_item.py +0 -0
  149. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/files/__init__.py +0 -0
  150. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/files/client.py +0 -0
  151. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/__init__.py +0 -0
  152. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/azure/__init__.py +0 -0
  153. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/azure/client.py +0 -0
  154. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/azure/types/__init__.py +0 -0
  155. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/azure/types/azure_create_response.py +0 -0
  156. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/azure/types/azure_update_response.py +0 -0
  157. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/client.py +0 -0
  158. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/gcs/__init__.py +0 -0
  159. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/gcs/client.py +0 -0
  160. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/gcs/types/__init__.py +0 -0
  161. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/gcs/types/gcs_create_response.py +0 -0
  162. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/gcs/types/gcs_update_response.py +0 -0
  163. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/local/__init__.py +0 -0
  164. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/local/client.py +0 -0
  165. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/local/types/__init__.py +0 -0
  166. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/local/types/local_create_response.py +0 -0
  167. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/local/types/local_update_response.py +0 -0
  168. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/redis/__init__.py +0 -0
  169. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/redis/client.py +0 -0
  170. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/redis/types/__init__.py +0 -0
  171. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/redis/types/redis_create_response.py +0 -0
  172. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/redis/types/redis_update_response.py +0 -0
  173. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/s3/__init__.py +0 -0
  174. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/s3/client.py +0 -0
  175. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/s3/types/__init__.py +0 -0
  176. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/s3/types/s3create_response.py +0 -0
  177. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/s3/types/s3update_response.py +0 -0
  178. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/s3s/__init__.py +0 -0
  179. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/s3s/client.py +0 -0
  180. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/types/__init__.py +0 -0
  181. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/import_storage/types/import_storage_list_types_response_item.py +0 -0
  182. {label_studio_sdk-1.0.10/src/label_studio_sdk/model_providers → label_studio_sdk-1.0.12/src/label_studio_sdk/jwt_settings}/__init__.py +0 -0
  183. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/__init__.py +0 -0
  184. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/base.py +0 -0
  185. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/create.py +0 -0
  186. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/data_examples.json +0 -0
  187. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/label_tags.py +0 -0
  188. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/objects.py +0 -0
  189. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/label_interface/region.py +0 -0
  190. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/__init__.py +0 -0
  191. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/client.py +0 -0
  192. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/types/__init__.py +0 -0
  193. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/types/ml_create_request_auth_method.py +0 -0
  194. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/types/ml_create_response.py +0 -0
  195. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/types/ml_create_response_auth_method.py +0 -0
  196. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/types/ml_update_request_auth_method.py +0 -0
  197. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/types/ml_update_response.py +0 -0
  198. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/ml/types/ml_update_response_auth_method.py +0 -0
  199. {label_studio_sdk-1.0.10/src/label_studio_sdk/predictions → label_studio_sdk-1.0.12/src/label_studio_sdk/model_providers}/__init__.py +0 -0
  200. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/model_providers/client.py +0 -0
  201. {label_studio_sdk-1.0.10/src/label_studio_sdk/prompts/indicators → label_studio_sdk-1.0.12/src/label_studio_sdk/predictions}/__init__.py +0 -0
  202. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/predictions/client.py +0 -0
  203. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/client_ext.py +0 -0
  204. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/exports/__init__.py +0 -0
  205. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/exports/client.py +0 -0
  206. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/exports/types/__init__.py +0 -0
  207. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/exports/types/exports_convert_response.py +0 -0
  208. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/exports/types/exports_list_formats_response_item.py +0 -0
  209. {label_studio_sdk-1.0.10/src/label_studio_sdk/prompts/versions → label_studio_sdk-1.0.12/src/label_studio_sdk/projects/pauses}/__init__.py +0 -0
  210. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/types/__init__.py +0 -0
  211. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/types/projects_create_response.py +0 -0
  212. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/types/projects_import_tasks_response.py +0 -0
  213. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/projects/types/projects_list_response.py +0 -0
  214. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/__init__.py +0 -0
  215. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/client.py +0 -0
  216. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/indicators/client.py +0 -0
  217. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/runs/__init__.py +0 -0
  218. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/runs/client.py +0 -0
  219. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/runs/types/__init__.py +0 -0
  220. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/runs/types/runs_list_request_project_subset.py +0 -0
  221. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/types/__init__.py +0 -0
  222. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/types/prompts_batch_failed_predictions_request_failed_predictions_item.py +0 -0
  223. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/types/prompts_batch_failed_predictions_response.py +0 -0
  224. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/types/prompts_batch_predictions_request_results_item.py +0 -0
  225. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/types/prompts_batch_predictions_response.py +0 -0
  226. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/prompts/versions/client.py +0 -0
  227. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/py.typed +0 -0
  228. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/tasks/__init__.py +0 -0
  229. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/tasks/client.py +0 -0
  230. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/tasks/client_ext.py +0 -0
  231. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/tasks/types/__init__.py +0 -0
  232. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/tasks/types/tasks_list_request_fields.py +0 -0
  233. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/tasks/types/tasks_list_response.py +0 -0
  234. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/annotation_filter_options.py +0 -0
  235. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/annotation_last_action.py +0 -0
  236. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/annotations_dm_field.py +0 -0
  237. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/annotations_dm_field_last_action.py +0 -0
  238. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/azure_blob_export_storage.py +0 -0
  239. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/azure_blob_export_storage_status.py +0 -0
  240. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/azure_blob_import_storage.py +0 -0
  241. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/azure_blob_import_storage_status.py +0 -0
  242. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/base_task.py +0 -0
  243. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/base_task_file_upload.py +0 -0
  244. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/base_task_updated_by.py +0 -0
  245. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/base_user.py +0 -0
  246. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/comment.py +0 -0
  247. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/comment_created_by.py +0 -0
  248. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/converted_format.py +0 -0
  249. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/converted_format_status.py +0 -0
  250. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/data_manager_task_serializer.py +0 -0
  251. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/data_manager_task_serializer_annotators_item.py +0 -0
  252. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/data_manager_task_serializer_drafts_item.py +0 -0
  253. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/data_manager_task_serializer_predictions_item.py +0 -0
  254. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/export.py +0 -0
  255. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/export_format.py +0 -0
  256. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/export_snapshot.py +0 -0
  257. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/export_snapshot_status.py +0 -0
  258. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/export_status.py +0 -0
  259. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/file_upload.py +0 -0
  260. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/filter.py +0 -0
  261. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/filter_group.py +0 -0
  262. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/gcs_export_storage.py +0 -0
  263. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/gcs_export_storage_status.py +0 -0
  264. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/gcs_import_storage.py +0 -0
  265. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/gcs_import_storage_status.py +0 -0
  266. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/inference_run.py +0 -0
  267. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/inference_run_cost_estimate.py +0 -0
  268. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/inference_run_created_by.py +0 -0
  269. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/inference_run_organization.py +0 -0
  270. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/inference_run_project_subset.py +0 -0
  271. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/inference_run_status.py +0 -0
  272. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/key_indicator_value.py +0 -0
  273. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/key_indicators.py +0 -0
  274. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/key_indicators_item.py +0 -0
  275. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/key_indicators_item_additional_kpis_item.py +0 -0
  276. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/key_indicators_item_extra_kpis_item.py +0 -0
  277. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/local_files_export_storage.py +0 -0
  278. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/local_files_export_storage_status.py +0 -0
  279. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/local_files_import_storage.py +0 -0
  280. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/local_files_import_storage_status.py +0 -0
  281. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/ml_backend.py +0 -0
  282. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/ml_backend_auth_method.py +0 -0
  283. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/ml_backend_state.py +0 -0
  284. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/model_provider_connection.py +0 -0
  285. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/model_provider_connection_budget_reset_period.py +0 -0
  286. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/model_provider_connection_created_by.py +0 -0
  287. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/model_provider_connection_organization.py +0 -0
  288. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/model_provider_connection_scope.py +0 -0
  289. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prediction.py +0 -0
  290. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/project_import.py +0 -0
  291. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/project_import_status.py +0 -0
  292. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/project_label_config.py +0 -0
  293. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/project_sampling.py +0 -0
  294. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/project_skip_queue.py +0 -0
  295. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt.py +0 -0
  296. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt_associated_projects_item.py +0 -0
  297. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt_associated_projects_item_id.py +0 -0
  298. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt_created_by.py +0 -0
  299. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt_organization.py +0 -0
  300. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt_version.py +0 -0
  301. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt_version_created_by.py +0 -0
  302. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/prompt_version_organization.py +0 -0
  303. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/redis_export_storage.py +0 -0
  304. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/redis_export_storage_status.py +0 -0
  305. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/redis_import_storage.py +0 -0
  306. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/redis_import_storage_status.py +0 -0
  307. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/refined_prompt_response.py +0 -0
  308. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/refined_prompt_response_refinement_status.py +0 -0
  309. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/s3export_storage.py +0 -0
  310. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/s3export_storage_status.py +0 -0
  311. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/s3import_storage.py +0 -0
  312. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/s3import_storage_status.py +0 -0
  313. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/s3s_export_storage.py +0 -0
  314. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/s3s_import_storage.py +0 -0
  315. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/s3s_import_storage_status.py +0 -0
  316. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/serialization_option.py +0 -0
  317. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/serialization_options.py +0 -0
  318. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/task.py +0 -0
  319. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/task_annotators_item.py +0 -0
  320. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/task_comment_authors_item.py +0 -0
  321. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/task_filter_options.py +0 -0
  322. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/user_simple.py +0 -0
  323. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/view.py +0 -0
  324. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/webhook.py +0 -0
  325. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/webhook_actions_item.py +0 -0
  326. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/webhook_serializer_for_update.py +0 -0
  327. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/webhook_serializer_for_update_actions_item.py +0 -0
  328. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/types/workspace.py +0 -0
  329. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/users/__init__.py +0 -0
  330. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/users/client.py +0 -0
  331. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/users/types/__init__.py +0 -0
  332. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/users/types/users_get_token_response.py +0 -0
  333. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/users/types/users_reset_token_response.py +0 -0
  334. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/version.py +0 -0
  335. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/versions/__init__.py +0 -0
  336. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/versions/client.py +0 -0
  337. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/versions/types/__init__.py +0 -0
  338. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/versions/types/versions_get_response.py +0 -0
  339. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/versions/types/versions_get_response_edition.py +0 -0
  340. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/__init__.py +0 -0
  341. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/client.py +0 -0
  342. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/__init__.py +0 -0
  343. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_create_request_data.py +0 -0
  344. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_create_request_data_filters.py +0 -0
  345. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_create_request_data_filters_conjunction.py +0 -0
  346. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item.py +0 -0
  347. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_filter.py +0 -0
  348. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_operator.py +0 -0
  349. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_create_request_data_filters_items_item_value.py +0 -0
  350. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_create_request_data_ordering_item.py +0 -0
  351. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_update_request_data.py +0 -0
  352. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_update_request_data_filters.py +0 -0
  353. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_update_request_data_filters_conjunction.py +0 -0
  354. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item.py +0 -0
  355. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_filter.py +0 -0
  356. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_operator.py +0 -0
  357. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_update_request_data_filters_items_item_value.py +0 -0
  358. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/views/types/views_update_request_data_ordering_item.py +0 -0
  359. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/webhooks/__init__.py +0 -0
  360. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/webhooks/client.py +0 -0
  361. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/webhooks/types/__init__.py +0 -0
  362. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/webhooks/types/webhooks_update_request_actions_item.py +0 -0
  363. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/workspaces/__init__.py +0 -0
  364. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/workspaces/client.py +0 -0
  365. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/workspaces/members/__init__.py +0 -0
  366. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/workspaces/members/client.py +0 -0
  367. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/workspaces/members/types/__init__.py +0 -0
  368. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/workspaces/members/types/members_create_response.py +0 -0
  369. {label_studio_sdk-1.0.10 → label_studio_sdk-1.0.12}/src/label_studio_sdk/workspaces/members/types/members_list_response_item.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: label-studio-sdk
3
- Version: 1.0.10
3
+ Version: 1.0.12
4
4
  Summary:
5
5
  Requires-Python: >=3.9,<4
6
6
  Classifier: Intended Audience :: Developers
@@ -28,10 +28,11 @@ Requires-Dist: jsf (>=0.11.2,<0.12.0)
28
28
  Requires-Dist: jsonschema (>=4.23.0)
29
29
  Requires-Dist: lxml (>=4.2.5)
30
30
  Requires-Dist: nltk (>=3.9.1,<4.0.0)
31
- Requires-Dist: numpy (>=1.26.4,<2.0.0)
31
+ Requires-Dist: numpy (>=1.26.4,<3.0.0)
32
32
  Requires-Dist: pandas (>=0.24.0)
33
33
  Requires-Dist: pydantic (>=1.9.2)
34
34
  Requires-Dist: pydantic-core (>=2.18.2,<3.0.0)
35
+ Requires-Dist: pyjwt (>=2.10.1,<3.0.0)
35
36
  Requires-Dist: requests (>=2.22.0)
36
37
  Requires-Dist: requests-mock (==1.12.1)
37
38
  Requires-Dist: typing_extensions (>=4.0.0)
@@ -3,7 +3,7 @@ name = "label-studio-sdk"
3
3
 
4
4
  [tool.poetry]
5
5
  name = "label-studio-sdk"
6
- version = "1.0.10"
6
+ version = "1.0.12"
7
7
  description = ""
8
8
  readme = "README.md"
9
9
  authors = []
@@ -44,10 +44,11 @@ jsf = "^0.11.2"
44
44
  jsonschema = ">=4.23.0"
45
45
  lxml = ">=4.2.5"
46
46
  nltk = "^3.9.1"
47
- numpy = ">=1.26.4,<2.0.0"
47
+ numpy = ">=1.26.4,<3.0.0"
48
48
  pandas = ">=0.24.0"
49
49
  pydantic = ">= 1.9.2"
50
50
  pydantic-core = "^2.18.2"
51
+ pyjwt = "^2.10.1"
51
52
  requests = ">=2.22.0"
52
53
  requests-mock = "1.12.1"
53
54
  typing_extensions = ">= 4.0.0"
@@ -60,6 +61,7 @@ pytest = "^7.4.0"
60
61
  pytest-asyncio = "^0.23.5"
61
62
  python-dateutil = "^2.9.0"
62
63
  types-python-dateutil = "^2.9.0.20240316"
64
+ respx = "^0.22.0"
63
65
  ruff = "^0.5.6"
64
66
 
65
67
  [tool.pytest.ini_options]
@@ -1,11 +1,14 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
3
  from .types import (
4
+ AccessTokenResponse,
4
5
  Annotation,
6
+ AnnotationCompletedBy,
5
7
  AnnotationFilterOptions,
6
8
  AnnotationLastAction,
7
9
  AnnotationsDmField,
8
10
  AnnotationsDmFieldLastAction,
11
+ ApiTokenResponse,
9
12
  AzureBlobExportStorage,
10
13
  AzureBlobExportStorageStatus,
11
14
  AzureBlobImportStorage,
@@ -40,6 +43,7 @@ from .types import (
40
43
  InferenceRunOrganization,
41
44
  InferenceRunProjectSubset,
42
45
  InferenceRunStatus,
46
+ JwtSettingsResponse,
43
47
  KeyIndicatorValue,
44
48
  KeyIndicators,
45
49
  KeyIndicatorsItem,
@@ -58,6 +62,8 @@ from .types import (
58
62
  ModelProviderConnectionOrganization,
59
63
  ModelProviderConnectionProvider,
60
64
  ModelProviderConnectionScope,
65
+ Pause,
66
+ PausePausedBy,
61
67
  Prediction,
62
68
  Project,
63
69
  ProjectImport,
@@ -80,6 +86,7 @@ from .types import (
80
86
  RedisImportStorageStatus,
81
87
  RefinedPromptResponse,
82
88
  RefinedPromptResponseRefinementStatus,
89
+ RotateTokenResponse,
83
90
  S3ExportStorage,
84
91
  S3ExportStorageStatus,
85
92
  S3ImportStorage,
@@ -101,7 +108,7 @@ from .types import (
101
108
  WebhookSerializerForUpdateActionsItem,
102
109
  Workspace,
103
110
  )
104
- from .errors import BadRequestError, InternalServerError
111
+ from .errors import BadRequestError, InternalServerError, NotFoundError, UnauthorizedError
105
112
  from . import (
106
113
  actions,
107
114
  annotations,
@@ -109,12 +116,14 @@ from . import (
109
116
  export_storage,
110
117
  files,
111
118
  import_storage,
119
+ jwt_settings,
112
120
  ml,
113
121
  model_providers,
114
122
  predictions,
115
123
  projects,
116
124
  prompts,
117
125
  tasks,
126
+ tokens,
118
127
  users,
119
128
  versions,
120
129
  views,
@@ -180,6 +189,7 @@ from .views import (
180
189
  from .webhooks import WebhooksUpdateRequestActionsItem
181
190
 
182
191
  __all__ = [
192
+ "AccessTokenResponse",
183
193
  "ActionsCreateRequestFilters",
184
194
  "ActionsCreateRequestFiltersConjunction",
185
195
  "ActionsCreateRequestFiltersItemsItem",
@@ -192,12 +202,14 @@ __all__ = [
192
202
  "ActionsCreateRequestSelectedItemsExcluded",
193
203
  "ActionsCreateRequestSelectedItemsIncluded",
194
204
  "Annotation",
205
+ "AnnotationCompletedBy",
195
206
  "AnnotationFilterOptions",
196
207
  "AnnotationLastAction",
197
208
  "AnnotationsCreateBulkRequestSelectedItems",
198
209
  "AnnotationsCreateBulkResponseItem",
199
210
  "AnnotationsDmField",
200
211
  "AnnotationsDmFieldLastAction",
212
+ "ApiTokenResponse",
201
213
  "AsyncLabelStudio",
202
214
  "AzureBlobExportStorage",
203
215
  "AzureBlobExportStorageStatus",
@@ -238,6 +250,7 @@ __all__ = [
238
250
  "InferenceRunProjectSubset",
239
251
  "InferenceRunStatus",
240
252
  "InternalServerError",
253
+ "JwtSettingsResponse",
241
254
  "KeyIndicatorValue",
242
255
  "KeyIndicators",
243
256
  "KeyIndicatorsItem",
@@ -264,6 +277,9 @@ __all__ = [
264
277
  "ModelProviderConnectionOrganization",
265
278
  "ModelProviderConnectionProvider",
266
279
  "ModelProviderConnectionScope",
280
+ "NotFoundError",
281
+ "Pause",
282
+ "PausePausedBy",
267
283
  "Prediction",
268
284
  "Project",
269
285
  "ProjectImport",
@@ -294,6 +310,7 @@ __all__ = [
294
310
  "RedisImportStorageStatus",
295
311
  "RefinedPromptResponse",
296
312
  "RefinedPromptResponseRefinementStatus",
313
+ "RotateTokenResponse",
297
314
  "S3ExportStorage",
298
315
  "S3ExportStorageStatus",
299
316
  "S3ImportStorage",
@@ -309,6 +326,7 @@ __all__ = [
309
326
  "TaskFilterOptions",
310
327
  "TasksListRequestFields",
311
328
  "TasksListResponse",
329
+ "UnauthorizedError",
312
330
  "UserSimple",
313
331
  "UsersGetTokenResponse",
314
332
  "UsersResetTokenResponse",
@@ -344,12 +362,14 @@ __all__ = [
344
362
  "export_storage",
345
363
  "files",
346
364
  "import_storage",
365
+ "jwt_settings",
347
366
  "ml",
348
367
  "model_providers",
349
368
  "predictions",
350
369
  "projects",
351
370
  "prompts",
352
371
  "tasks",
372
+ "tokens",
353
373
  "users",
354
374
  "versions",
355
375
  "views",
@@ -2,6 +2,7 @@ import json
2
2
  import types
3
3
  import sys
4
4
  import functools
5
+ import logging
5
6
  from typing import Type, Dict, Any, Tuple, Generator
6
7
  from pathlib import Path
7
8
  from tempfile import TemporaryDirectory
@@ -11,6 +12,8 @@ from datamodel_code_generator.parser.jsonschema import JsonSchemaParser
11
12
  from pydantic import BaseModel
12
13
  from contextlib import contextmanager
13
14
 
15
+ logger = logging.getLogger(__name__)
16
+
14
17
 
15
18
  @functools.lru_cache(maxsize=128)
16
19
  def _generate_model_code(json_schema_str: str, class_name: str = 'MyModel') -> str:
@@ -65,6 +68,7 @@ def json_schema_to_pydantic(json_schema: dict, class_name: str = 'MyModel') -> G
65
68
  json_schema_str = json.dumps(json_schema)
66
69
 
67
70
  # Generate Pydantic model code from the JSON schema string
71
+ logger.debug(f"Generating Pydantic model code from json schema: {json_schema_str}")
68
72
  model_code: str = _generate_model_code(json_schema_str, class_name)
69
73
 
70
74
  # Create a unique module name using the id of the JSON schema string
@@ -79,6 +83,7 @@ def json_schema_to_pydantic(json_schema: dict, class_name: str = 'MyModel') -> G
79
83
  # Add the new module to sys.modules to make it importable
80
84
  # This is necessary to avoid Pydantic errors related to undefined models
81
85
  sys.modules[module_name] = mod
86
+ logger.debug(f"Generated Pydantic model: {model_class}")
82
87
  yield model_class
83
88
  finally:
84
89
  if module_name in sys.modules:
@@ -23,6 +23,8 @@ from .prompts.client import PromptsClient
23
23
  from .model_providers.client import ModelProvidersClient
24
24
  from .comments.client import CommentsClient
25
25
  from .workspaces.client import WorkspacesClient
26
+ from .tokens.client import TokensClient
27
+ from .jwt_settings.client import JwtSettingsClient
26
28
  from .core.client_wrapper import AsyncClientWrapper
27
29
  from .annotations.client import AsyncAnnotationsClient
28
30
  from .users.client import AsyncUsersClient
@@ -41,6 +43,8 @@ from .prompts.client import AsyncPromptsClient
41
43
  from .model_providers.client import AsyncModelProvidersClient
42
44
  from .comments.client import AsyncCommentsClient
43
45
  from .workspaces.client import AsyncWorkspacesClient
46
+ from .tokens.client import AsyncTokensClient
47
+ from .jwt_settings.client import AsyncJwtSettingsClient
44
48
 
45
49
 
46
50
  class LabelStudioBase:
@@ -122,6 +126,8 @@ class LabelStudioBase:
122
126
  self.model_providers = ModelProvidersClient(client_wrapper=self._client_wrapper)
123
127
  self.comments = CommentsClient(client_wrapper=self._client_wrapper)
124
128
  self.workspaces = WorkspacesClient(client_wrapper=self._client_wrapper)
129
+ self.tokens = TokensClient(client_wrapper=self._client_wrapper)
130
+ self.jwt_settings = JwtSettingsClient(client_wrapper=self._client_wrapper)
125
131
 
126
132
 
127
133
  class AsyncLabelStudioBase:
@@ -203,6 +209,8 @@ class AsyncLabelStudioBase:
203
209
  self.model_providers = AsyncModelProvidersClient(client_wrapper=self._client_wrapper)
204
210
  self.comments = AsyncCommentsClient(client_wrapper=self._client_wrapper)
205
211
  self.workspaces = AsyncWorkspacesClient(client_wrapper=self._client_wrapper)
212
+ self.tokens = AsyncTokensClient(client_wrapper=self._client_wrapper)
213
+ self.jwt_settings = AsyncJwtSettingsClient(client_wrapper=self._client_wrapper)
206
214
 
207
215
 
208
216
  def _get_base_url(*, base_url: typing.Optional[str] = None, environment: LabelStudioEnvironment) -> str:
@@ -59,6 +59,7 @@ class Format(Enum):
59
59
  YOLO_WITH_IMAGES = 14
60
60
  COCO_WITH_IMAGES = 15
61
61
  YOLO_OBB_WITH_IMAGES = 16
62
+ BRUSH_TO_COCO = 17
62
63
 
63
64
  def __str__(self):
64
65
  return self.name
@@ -167,6 +168,13 @@ class Converter(object):
167
168
  "format expected by NVIDIA NeMo models.",
168
169
  "link": "https://labelstud.io/guide/export.html#ASR-MANIFEST",
169
170
  "tags": ["speech recognition"],
171
+ },
172
+ Format.BRUSH_TO_COCO: {
173
+
174
+ "title": "Brush labels to COCO",
175
+ "description": "Export your brush labels as COCO format for segmentation tasks. Converts RLE encoded masks to COCO polygons.",
176
+ "link": "https://labelstud.io/guide/export.html#COCO",
177
+ "tags": ["image segmentation", "brush annotations"],
170
178
  },
171
179
  }
172
180
 
@@ -293,6 +301,19 @@ class Converter(object):
293
301
  upload_dir=self.upload_dir,
294
302
  download_resources=self.download_resources,
295
303
  )
304
+ elif format == Format.BRUSH_TO_COCO:
305
+ items = (
306
+ self.iter_from_dir(input_data)
307
+ if is_dir
308
+ else self.iter_from_json_file(input_data)
309
+ )
310
+ from label_studio_sdk.converter.exports.brush_to_coco import convert_to_coco
311
+ image_dir = kwargs.get("image_dir")
312
+ convert_to_coco(
313
+ items,
314
+ output_data,
315
+ output_image_dir=image_dir
316
+ )
296
317
 
297
318
  def _get_data_keys_and_output_tags(self, output_tags=None):
298
319
  data_keys = set()
@@ -376,6 +397,7 @@ class Converter(object):
376
397
  ):
377
398
  all_formats.remove(Format.BRUSH_TO_NUMPY.name)
378
399
  all_formats.remove(Format.BRUSH_TO_PNG.name)
400
+ all_formats.remove(Format.BRUSH_TO_COCO.name)
379
401
  if not (
380
402
  ("Audio" in input_tag_types or "AudioPlus" in input_tag_types)
381
403
  and "TextArea" in output_tag_types
@@ -0,0 +1,332 @@
1
+ """
2
+ Convert brush annotations and polygon annotations to COCO format.
3
+ This module handles RLE encoded brush masks and converts them to COCO segmentation format.
4
+ """
5
+ import logging
6
+ import random
7
+ import io
8
+ import os
9
+ import json
10
+ import numpy as np
11
+ import cv2
12
+ from copy import deepcopy
13
+ from datetime import datetime
14
+
15
+ from label_studio_sdk.converter.utils import ensure_dir, get_annotator
16
+ import label_studio_sdk.converter.brush as brush_module
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ def generate_random_color():
22
+ """Generates a random hex color for category visualization"""
23
+ return '#{:02x}{:02x}{:02x}'.format(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
24
+
25
+
26
+ def flatten(item):
27
+ """Flatten nested lists for segmentation format"""
28
+ if isinstance(item, list):
29
+ for subitem in item:
30
+ yield from flatten(subitem)
31
+ else:
32
+ yield item
33
+
34
+
35
+ def generate_contour_from_rle(rle, original_width, original_height):
36
+ """Convert RLE encoded masks to COCO segmentation format
37
+
38
+ Args:
39
+ rle: RLE encoded mask data
40
+ original_width: Width of the original image
41
+ original_height: Height of the original image
42
+
43
+ Returns:
44
+ tuple: (segmentation, bbox_list, area_list) in COCO format
45
+ """
46
+ # Ensure rle is bytes, not string
47
+ if isinstance(rle, str):
48
+ rle = rle.encode('utf-8')
49
+
50
+ # Decode RLE
51
+ try:
52
+ rle_binary = brush_module.decode_rle(rle)
53
+ except Exception as e:
54
+ logger.warning(f"Failed to decode RLE: {e}")
55
+ return [], [], []
56
+
57
+ # Reshape to image dimensions with 4 channels (RGBA)
58
+ try:
59
+ reshaped_image = np.reshape(rle_binary, [original_height, original_width, 4])
60
+ except Exception as e:
61
+ logger.warning(f"Failed to reshape RLE data: {e}")
62
+ return [], [], []
63
+
64
+ # Use only the alpha channel for contour detection
65
+ alpha_channel = np.array(reshaped_image[:, :, 3]).astype('uint8')
66
+
67
+ # Find contours
68
+ contours, _ = cv2.findContours(
69
+ alpha_channel, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
70
+ )
71
+
72
+ segmentation = []
73
+ bbox_list = []
74
+ area_list = []
75
+ for contour in contours:
76
+ # OpenCV contours are in format [[[x1,y1]], [[x2,y2]], ...],
77
+ # we need to convert to a flat list [x1,y1,x2,y2,...]
78
+ contour_points = [point[0] for point in contour]
79
+
80
+ # Flatten to a single list
81
+ contour_flat = []
82
+ for point in contour_points:
83
+ contour_flat.extend(point.tolist())
84
+
85
+ # Check if we have at least 3 points (6 coordinates) for a valid polygon
86
+ if len(contour_points) >= 3:
87
+ segmentation.append(contour_flat)
88
+
89
+ x, y, w, h = cv2.boundingRect(contour)
90
+ bbox_list.append([x, y, w, h]) # Format: [top-left x, top-left y, width, height]
91
+
92
+ # Compute the area of the contour
93
+ area = cv2.contourArea(contour)
94
+ area_list.append(int(area))
95
+
96
+ return segmentation, bbox_list, area_list
97
+
98
+
99
+ def generate_contour_from_polygon(points, original_width, original_height):
100
+ """Convert polygon annotations to COCO segmentation format
101
+
102
+ Args:
103
+ points: List of [x, y] points in percentage format
104
+ original_width: Width of the original image
105
+ original_height: Height of the original image
106
+
107
+ Returns:
108
+ tuple: (segmentation, bbox, area) in COCO format
109
+ """
110
+ # Convert from percentage to absolute coordinates
111
+ modified_points = [
112
+ [round(x * original_width / 100), round(y * original_height / 100)]
113
+ for x, y in points
114
+ ]
115
+
116
+ # Initialize lists
117
+ segmentation = [list(flatten(modified_points))]
118
+
119
+ # Convert points to a NumPy array and reshape for OpenCV
120
+ contour = np.array(modified_points, dtype=np.float32).reshape((-1, 1, 2))
121
+
122
+ # Calculate bounding box
123
+ bbox = cv2.boundingRect(contour)
124
+ bbox = [int(coordinate) for coordinate in bbox]
125
+
126
+ # Compute the area of the contour
127
+ area = cv2.contourArea(contour)
128
+
129
+ return segmentation, bbox, int(area)
130
+
131
+
132
+ def convert_to_coco(items, output_dir, output_image_dir=None):
133
+ """Convert Label Studio annotations to COCO format
134
+
135
+ Args:
136
+ items: Iterable of annotation items
137
+ output_dir: Directory where to save the resulting COCO JSON
138
+ output_image_dir: Optional directory for images
139
+
140
+ Returns:
141
+ Path to the generated COCO JSON file
142
+ """
143
+ ensure_dir(output_dir)
144
+ output_file = os.path.join(output_dir, "result_coco.json")
145
+
146
+ if output_image_dir is not None:
147
+ ensure_dir(output_image_dir)
148
+ else:
149
+ output_image_dir = os.path.join(output_dir, "images")
150
+ os.makedirs(output_image_dir, exist_ok=True)
151
+
152
+ # Initialize COCO JSON structure
153
+ coco_data = {
154
+ 'images': [],
155
+ 'annotations': [],
156
+ 'categories': [],
157
+ 'info': {
158
+ 'year': datetime.now().year,
159
+ 'version': '1.0',
160
+ 'description': 'Converted from Label Studio',
161
+ 'contributor': 'Label Studio Converter',
162
+ 'date_created': str(datetime.now()),
163
+ }
164
+ }
165
+
166
+ category_map = {} # To track unique categories
167
+ annotation_id = 0
168
+
169
+ # Process each item
170
+ for image_id, item in enumerate(items):
171
+ # Extract image information
172
+ image_path = None
173
+ for key, value in item['input'].items():
174
+ if isinstance(value, str) and any(value.lower().endswith(ext) for ext in ['.jpg', '.jpeg', '.png', '.gif', '.bmp']):
175
+ image_path = value
176
+ break
177
+
178
+ if not image_path:
179
+ logger.warning(f"No image path found for item {item.get('id')}. Skipping.")
180
+ continue
181
+
182
+ image_info = {
183
+ 'id': image_id,
184
+ 'file_name': os.path.basename(image_path),
185
+ 'path': image_path,
186
+ 'width': None, # Will be filled from annotations
187
+ 'height': None # Will be filled from annotations
188
+ }
189
+
190
+ # Skip tasks without annotations
191
+ if not item['output']:
192
+ logger.warning(f"No annotations found for item {item.get('id')}")
193
+ continue
194
+
195
+ valid_annotations = False
196
+
197
+ # Process all annotations
198
+ for output_key, annotations in item['output'].items():
199
+ for annotation in annotations:
200
+ # Get image dimensions from the first annotation
201
+ if image_info['width'] is None and 'original_width' in annotation:
202
+ image_info['width'] = annotation['original_width']
203
+ image_info['height'] = annotation['original_height']
204
+
205
+ # Identify annotation type and extract labels
206
+ annotation_type = annotation.get('type', '').lower()
207
+ labels = []
208
+
209
+ if 'brushlabels' in annotation:
210
+ labels = annotation['brushlabels']
211
+ type_key = 'brushlabels'
212
+ elif 'polygonlabels' in annotation:
213
+ labels = annotation['polygonlabels']
214
+ type_key = 'polygonlabels'
215
+ elif 'rectanglelabels' in annotation:
216
+ labels = annotation['rectanglelabels']
217
+ type_key = 'rectanglelabels'
218
+ elif 'labels' in annotation:
219
+ labels = annotation['labels']
220
+ type_key = 'labels'
221
+ else:
222
+ logger.debug(f"Unsupported annotation type: {annotation_type}")
223
+ continue
224
+
225
+ # Process each label
226
+ for label in labels:
227
+ # Add new categories to the map
228
+ if label not in category_map:
229
+ category_id = len(category_map) + 1
230
+ category_map[label] = category_id
231
+ coco_data['categories'].append({
232
+ 'id': category_id,
233
+ 'name': label,
234
+ 'supercategory': '',
235
+ 'color': generate_random_color(),
236
+ 'metadata': {}
237
+ })
238
+
239
+ category_id = category_map[label]
240
+
241
+ # Convert annotation based on type
242
+ if 'rle' in annotation and type_key == 'brushlabels':
243
+
244
+ # check required keys exist
245
+ if not all(k in annotation for k in ['rle', 'original_width', 'original_height']):
246
+ logger.warning(f"Missing required keys for RLE annotation. Skipping.")
247
+ continue
248
+
249
+ # Process brush annotation (RLE encoded mask)
250
+ segmentations, bboxes, areas = generate_contour_from_rle(
251
+ annotation['rle'],
252
+ annotation['original_width'],
253
+ annotation['original_height']
254
+ )
255
+
256
+ # Create separate annotation for each contour
257
+ for i, (segmentation, bbox, area) in enumerate(zip(segmentations, bboxes, areas)):
258
+ coco_annotation = {
259
+ 'id': annotation_id,
260
+ 'image_id': image_id,
261
+ 'category_id': category_id,
262
+ 'segmentation': [segmentation], # COCO format requires double nesting
263
+ 'area': area,
264
+ 'bbox': bbox,
265
+ 'iscrowd': 0,
266
+ 'annotator': get_annotator(item, "unknown")
267
+ }
268
+ coco_data['annotations'].append(coco_annotation)
269
+ annotation_id += 1
270
+ valid_annotations = True
271
+
272
+ elif 'points' in annotation and type_key == 'polygonlabels':
273
+ # check required keys exist
274
+ if not all(k in annotation for k in ['points', 'original_width', 'original_height']):
275
+ logger.warning(f"Missing required keys for polygon annotation. Skipping.")
276
+ continue
277
+ # Process polygon annotation
278
+ segmentation, bbox, area = generate_contour_from_polygon(
279
+ annotation['points'],
280
+ annotation['original_width'],
281
+ annotation['original_height']
282
+ )
283
+
284
+ coco_annotation = {
285
+ 'id': annotation_id,
286
+ 'image_id': image_id,
287
+ 'category_id': category_id,
288
+ 'segmentation': segmentation,
289
+ 'area': area,
290
+ 'bbox': bbox,
291
+ 'iscrowd': 0,
292
+ 'annotator': get_annotator(item, "unknown")
293
+ }
294
+ coco_data['annotations'].append(coco_annotation)
295
+ annotation_id += 1
296
+ valid_annotations = True
297
+
298
+ elif annotation_type == 'rectanglelabels' or type_key == 'labels':
299
+ # check required keys exist
300
+ if not all(k in annotation for k in ['x', 'y', 'width', 'height', 'original_width', 'original_height']):
301
+ logger.warning(f"Missing required keys for rectangle annotation. Skipping.")
302
+ continue
303
+
304
+ # Convert from percentage to absolute coordinates
305
+ x = annotation['x'] * annotation['original_width'] / 100
306
+ y = annotation['y'] * annotation['original_height'] / 100
307
+ w = annotation['width'] * annotation['original_width'] / 100
308
+ h = annotation['height'] * annotation['original_height'] / 100
309
+
310
+ coco_annotation = {
311
+ 'id': annotation_id,
312
+ 'image_id': image_id,
313
+ 'category_id': category_id,
314
+ 'segmentation': [], # Empty for bounding boxes
315
+ 'area': w * h,
316
+ 'bbox': [x, y, w, h],
317
+ 'iscrowd': 0,
318
+ 'annotator': get_annotator(item, "unknown")
319
+ }
320
+ coco_data['annotations'].append(coco_annotation)
321
+ annotation_id += 1
322
+ valid_annotations = True
323
+
324
+ # Add image to the dataset if it has valid dimensions
325
+ if image_info['width'] is not None and image_info['height'] is not None and valid_annotations:
326
+ coco_data['images'].append(image_info)
327
+
328
+ # Write COCO JSON to file
329
+ with io.open(output_file, 'w', encoding='utf8') as f:
330
+ json.dump(coco_data, f, indent=2, ensure_ascii=False)
331
+
332
+ return output_file
@@ -79,6 +79,12 @@ def get_export_args(parser):
79
79
  default=True,
80
80
  help="Set this flag if your annotations are in one JSON file instead of multiple JSON files from directory",
81
81
  )
82
+ parser.add_argument(
83
+ "--brush-to-coco",
84
+ dest="brush_to_coco",
85
+ action="store_true",
86
+ help="If set, brush annotations will be converted to COCO format"
87
+ )
82
88
 
83
89
 
84
90
  def get_all_args():
@@ -158,6 +164,14 @@ def export(args):
158
164
  c.convert_to_yolo(
159
165
  args.input, args.output, is_dir=not args.heartex_format, is_obb=True
160
166
  )
167
+ elif args.format == Format.BRUSH_TO_COCO:
168
+ c.convert(
169
+ args.input,
170
+ args.output,
171
+ Format.BRUSH_TO_COCO,
172
+ output_image_dir=args.image_dir,
173
+ is_dir=not args.heartex_format,
174
+ )
161
175
  else:
162
176
  raise FormatNotSupportedError()
163
177