orca-sdk 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. orca_sdk/__init__.py +19 -0
  2. orca_sdk/_generated_api_client/__init__.py +3 -0
  3. orca_sdk/_generated_api_client/api/__init__.py +193 -0
  4. orca_sdk/_generated_api_client/api/auth/__init__.py +0 -0
  5. orca_sdk/_generated_api_client/api/auth/check_authentication_auth_get.py +128 -0
  6. orca_sdk/_generated_api_client/api/auth/create_api_key_auth_api_key_post.py +170 -0
  7. orca_sdk/_generated_api_client/api/auth/delete_api_key_auth_api_key_name_or_id_delete.py +156 -0
  8. orca_sdk/_generated_api_client/api/auth/delete_org_auth_org_delete.py +130 -0
  9. orca_sdk/_generated_api_client/api/auth/list_api_keys_auth_api_key_get.py +127 -0
  10. orca_sdk/_generated_api_client/api/classification_model/__init__.py +0 -0
  11. orca_sdk/_generated_api_client/api/classification_model/create_evaluation_classification_model_model_name_or_id_evaluation_post.py +183 -0
  12. orca_sdk/_generated_api_client/api/classification_model/create_model_classification_model_post.py +170 -0
  13. orca_sdk/_generated_api_client/api/classification_model/delete_evaluation_classification_model_model_name_or_id_evaluation_task_id_delete.py +168 -0
  14. orca_sdk/_generated_api_client/api/classification_model/delete_model_classification_model_name_or_id_delete.py +154 -0
  15. orca_sdk/_generated_api_client/api/classification_model/get_evaluation_classification_model_model_name_or_id_evaluation_task_id_get.py +170 -0
  16. orca_sdk/_generated_api_client/api/classification_model/get_model_classification_model_name_or_id_get.py +156 -0
  17. orca_sdk/_generated_api_client/api/classification_model/list_evaluations_classification_model_model_name_or_id_evaluation_get.py +161 -0
  18. orca_sdk/_generated_api_client/api/classification_model/list_models_classification_model_get.py +127 -0
  19. orca_sdk/_generated_api_client/api/classification_model/predict_gpu_classification_model_name_or_id_prediction_post.py +190 -0
  20. orca_sdk/_generated_api_client/api/datasource/__init__.py +0 -0
  21. orca_sdk/_generated_api_client/api/datasource/create_datasource_datasource_post.py +167 -0
  22. orca_sdk/_generated_api_client/api/datasource/delete_datasource_datasource_name_or_id_delete.py +156 -0
  23. orca_sdk/_generated_api_client/api/datasource/get_datasource_datasource_name_or_id_get.py +156 -0
  24. orca_sdk/_generated_api_client/api/datasource/list_datasources_datasource_get.py +127 -0
  25. orca_sdk/_generated_api_client/api/default/__init__.py +0 -0
  26. orca_sdk/_generated_api_client/api/default/healthcheck_get.py +118 -0
  27. orca_sdk/_generated_api_client/api/default/healthcheck_gpu_get.py +118 -0
  28. orca_sdk/_generated_api_client/api/finetuned_embedding_model/__init__.py +0 -0
  29. orca_sdk/_generated_api_client/api/finetuned_embedding_model/create_finetuned_embedding_model_finetuned_embedding_model_post.py +168 -0
  30. orca_sdk/_generated_api_client/api/finetuned_embedding_model/delete_finetuned_embedding_model_finetuned_embedding_model_name_or_id_delete.py +156 -0
  31. orca_sdk/_generated_api_client/api/finetuned_embedding_model/embed_with_finetuned_model_gpu_finetuned_embedding_model_name_or_id_embedding_post.py +189 -0
  32. orca_sdk/_generated_api_client/api/finetuned_embedding_model/get_finetuned_embedding_model_finetuned_embedding_model_name_or_id_get.py +156 -0
  33. orca_sdk/_generated_api_client/api/finetuned_embedding_model/list_finetuned_embedding_models_finetuned_embedding_model_get.py +127 -0
  34. orca_sdk/_generated_api_client/api/memoryset/__init__.py +0 -0
  35. orca_sdk/_generated_api_client/api/memoryset/clone_memoryset_memoryset_name_or_id_clone_post.py +181 -0
  36. orca_sdk/_generated_api_client/api/memoryset/create_analysis_memoryset_name_or_id_analysis_post.py +183 -0
  37. orca_sdk/_generated_api_client/api/memoryset/create_memoryset_memoryset_post.py +168 -0
  38. orca_sdk/_generated_api_client/api/memoryset/delete_memories_memoryset_name_or_id_memories_delete_post.py +181 -0
  39. orca_sdk/_generated_api_client/api/memoryset/delete_memory_memoryset_name_or_id_memory_memory_id_delete.py +167 -0
  40. orca_sdk/_generated_api_client/api/memoryset/delete_memoryset_memoryset_name_or_id_delete.py +156 -0
  41. orca_sdk/_generated_api_client/api/memoryset/get_analysis_memoryset_name_or_id_analysis_analysis_task_id_get.py +169 -0
  42. orca_sdk/_generated_api_client/api/memoryset/get_memories_memoryset_name_or_id_memories_get_post.py +188 -0
  43. orca_sdk/_generated_api_client/api/memoryset/get_memory_memoryset_name_or_id_memory_memory_id_get.py +169 -0
  44. orca_sdk/_generated_api_client/api/memoryset/get_memoryset_memoryset_name_or_id_get.py +156 -0
  45. orca_sdk/_generated_api_client/api/memoryset/insert_memories_gpu_memoryset_name_or_id_memory_post.py +184 -0
  46. orca_sdk/_generated_api_client/api/memoryset/list_analyses_memoryset_name_or_id_analysis_get.py +260 -0
  47. orca_sdk/_generated_api_client/api/memoryset/list_memorysets_memoryset_get.py +127 -0
  48. orca_sdk/_generated_api_client/api/memoryset/memoryset_lookup_gpu_memoryset_name_or_id_lookup_post.py +193 -0
  49. orca_sdk/_generated_api_client/api/memoryset/query_memoryset_memoryset_name_or_id_memories_post.py +188 -0
  50. orca_sdk/_generated_api_client/api/memoryset/update_memories_gpu_memoryset_name_or_id_memories_patch.py +191 -0
  51. orca_sdk/_generated_api_client/api/memoryset/update_memory_gpu_memoryset_name_or_id_memory_patch.py +187 -0
  52. orca_sdk/_generated_api_client/api/pretrained_embedding_model/__init__.py +0 -0
  53. orca_sdk/_generated_api_client/api/pretrained_embedding_model/embed_with_pretrained_model_gpu_pretrained_embedding_model_model_name_embedding_post.py +188 -0
  54. orca_sdk/_generated_api_client/api/pretrained_embedding_model/get_pretrained_embedding_model_pretrained_embedding_model_model_name_get.py +157 -0
  55. orca_sdk/_generated_api_client/api/pretrained_embedding_model/list_pretrained_embedding_models_pretrained_embedding_model_get.py +127 -0
  56. orca_sdk/_generated_api_client/api/task/__init__.py +0 -0
  57. orca_sdk/_generated_api_client/api/task/abort_task_task_task_id_abort_delete.py +154 -0
  58. orca_sdk/_generated_api_client/api/task/get_task_status_task_task_id_status_get.py +156 -0
  59. orca_sdk/_generated_api_client/api/task/list_tasks_task_get.py +243 -0
  60. orca_sdk/_generated_api_client/api/telemetry/__init__.py +0 -0
  61. orca_sdk/_generated_api_client/api/telemetry/drop_feedback_category_with_data_telemetry_feedback_category_name_or_id_delete.py +162 -0
  62. orca_sdk/_generated_api_client/api/telemetry/get_feedback_category_telemetry_feedback_category_name_or_id_get.py +156 -0
  63. orca_sdk/_generated_api_client/api/telemetry/get_prediction_telemetry_prediction_prediction_id_get.py +157 -0
  64. orca_sdk/_generated_api_client/api/telemetry/list_feedback_categories_telemetry_feedback_category_get.py +127 -0
  65. orca_sdk/_generated_api_client/api/telemetry/list_predictions_telemetry_prediction_post.py +175 -0
  66. orca_sdk/_generated_api_client/api/telemetry/record_prediction_feedback_telemetry_prediction_feedback_put.py +171 -0
  67. orca_sdk/_generated_api_client/api/telemetry/update_prediction_telemetry_prediction_prediction_id_patch.py +181 -0
  68. orca_sdk/_generated_api_client/client.py +216 -0
  69. orca_sdk/_generated_api_client/errors.py +38 -0
  70. orca_sdk/_generated_api_client/models/__init__.py +159 -0
  71. orca_sdk/_generated_api_client/models/analyze_neighbor_labels_result.py +84 -0
  72. orca_sdk/_generated_api_client/models/api_key_metadata.py +118 -0
  73. orca_sdk/_generated_api_client/models/base_model.py +55 -0
  74. orca_sdk/_generated_api_client/models/body_create_datasource_datasource_post.py +176 -0
  75. orca_sdk/_generated_api_client/models/classification_evaluation_result.py +114 -0
  76. orca_sdk/_generated_api_client/models/clone_labeled_memoryset_request.py +150 -0
  77. orca_sdk/_generated_api_client/models/column_info.py +114 -0
  78. orca_sdk/_generated_api_client/models/column_type.py +14 -0
  79. orca_sdk/_generated_api_client/models/conflict_error_response.py +80 -0
  80. orca_sdk/_generated_api_client/models/create_api_key_request.py +99 -0
  81. orca_sdk/_generated_api_client/models/create_api_key_response.py +126 -0
  82. orca_sdk/_generated_api_client/models/create_labeled_memoryset_request.py +259 -0
  83. orca_sdk/_generated_api_client/models/create_rac_model_request.py +209 -0
  84. orca_sdk/_generated_api_client/models/datasource_metadata.py +142 -0
  85. orca_sdk/_generated_api_client/models/delete_memories_request.py +70 -0
  86. orca_sdk/_generated_api_client/models/embed_request.py +127 -0
  87. orca_sdk/_generated_api_client/models/embedding_finetuning_method.py +9 -0
  88. orca_sdk/_generated_api_client/models/evaluation_request.py +180 -0
  89. orca_sdk/_generated_api_client/models/evaluation_response.py +140 -0
  90. orca_sdk/_generated_api_client/models/feedback_type.py +9 -0
  91. orca_sdk/_generated_api_client/models/field_validation_error.py +103 -0
  92. orca_sdk/_generated_api_client/models/filter_item.py +231 -0
  93. orca_sdk/_generated_api_client/models/filter_item_field_type_0_item.py +15 -0
  94. orca_sdk/_generated_api_client/models/filter_item_field_type_2_item_type_1.py +16 -0
  95. orca_sdk/_generated_api_client/models/filter_item_op.py +16 -0
  96. orca_sdk/_generated_api_client/models/find_duplicates_analysis_result.py +70 -0
  97. orca_sdk/_generated_api_client/models/finetune_embedding_model_request.py +259 -0
  98. orca_sdk/_generated_api_client/models/finetune_embedding_model_request_training_args.py +66 -0
  99. orca_sdk/_generated_api_client/models/finetuned_embedding_model_metadata.py +166 -0
  100. orca_sdk/_generated_api_client/models/get_memories_request.py +70 -0
  101. orca_sdk/_generated_api_client/models/internal_server_error_response.py +80 -0
  102. orca_sdk/_generated_api_client/models/label_class_metrics.py +108 -0
  103. orca_sdk/_generated_api_client/models/label_prediction_memory_lookup.py +274 -0
  104. orca_sdk/_generated_api_client/models/label_prediction_memory_lookup_metadata.py +68 -0
  105. orca_sdk/_generated_api_client/models/label_prediction_result.py +101 -0
  106. orca_sdk/_generated_api_client/models/label_prediction_with_memories_and_feedback.py +232 -0
  107. orca_sdk/_generated_api_client/models/labeled_memory.py +197 -0
  108. orca_sdk/_generated_api_client/models/labeled_memory_insert.py +108 -0
  109. orca_sdk/_generated_api_client/models/labeled_memory_insert_metadata.py +68 -0
  110. orca_sdk/_generated_api_client/models/labeled_memory_lookup.py +258 -0
  111. orca_sdk/_generated_api_client/models/labeled_memory_lookup_metadata.py +68 -0
  112. orca_sdk/_generated_api_client/models/labeled_memory_metadata.py +68 -0
  113. orca_sdk/_generated_api_client/models/labeled_memory_metrics.py +277 -0
  114. orca_sdk/_generated_api_client/models/labeled_memory_update.py +171 -0
  115. orca_sdk/_generated_api_client/models/labeled_memory_update_metadata_type_0.py +68 -0
  116. orca_sdk/_generated_api_client/models/labeled_memoryset_metadata.py +195 -0
  117. orca_sdk/_generated_api_client/models/list_analyses_memoryset_name_or_id_analysis_get_type_type_0.py +9 -0
  118. orca_sdk/_generated_api_client/models/list_memories_request.py +104 -0
  119. orca_sdk/_generated_api_client/models/list_predictions_request.py +234 -0
  120. orca_sdk/_generated_api_client/models/list_predictions_request_sort_item_item_type_0.py +9 -0
  121. orca_sdk/_generated_api_client/models/list_predictions_request_sort_item_item_type_1.py +9 -0
  122. orca_sdk/_generated_api_client/models/lookup_request.py +81 -0
  123. orca_sdk/_generated_api_client/models/memoryset_analysis_request.py +83 -0
  124. orca_sdk/_generated_api_client/models/memoryset_analysis_request_type.py +9 -0
  125. orca_sdk/_generated_api_client/models/memoryset_analysis_response.py +180 -0
  126. orca_sdk/_generated_api_client/models/memoryset_analysis_response_config.py +66 -0
  127. orca_sdk/_generated_api_client/models/memoryset_analysis_response_type.py +9 -0
  128. orca_sdk/_generated_api_client/models/not_found_error_response.py +100 -0
  129. orca_sdk/_generated_api_client/models/not_found_error_response_resource_type_0.py +20 -0
  130. orca_sdk/_generated_api_client/models/prediction_feedback.py +157 -0
  131. orca_sdk/_generated_api_client/models/prediction_feedback_category.py +115 -0
  132. orca_sdk/_generated_api_client/models/prediction_feedback_request.py +122 -0
  133. orca_sdk/_generated_api_client/models/prediction_feedback_result.py +102 -0
  134. orca_sdk/_generated_api_client/models/prediction_request.py +169 -0
  135. orca_sdk/_generated_api_client/models/pretrained_embedding_model_metadata.py +97 -0
  136. orca_sdk/_generated_api_client/models/pretrained_embedding_model_name.py +11 -0
  137. orca_sdk/_generated_api_client/models/rac_head_type.py +11 -0
  138. orca_sdk/_generated_api_client/models/rac_model_metadata.py +191 -0
  139. orca_sdk/_generated_api_client/models/service_unavailable_error_response.py +80 -0
  140. orca_sdk/_generated_api_client/models/task.py +198 -0
  141. orca_sdk/_generated_api_client/models/task_status.py +14 -0
  142. orca_sdk/_generated_api_client/models/task_status_info.py +133 -0
  143. orca_sdk/_generated_api_client/models/unauthenticated_error_response.py +72 -0
  144. orca_sdk/_generated_api_client/models/unauthorized_error_response.py +80 -0
  145. orca_sdk/_generated_api_client/models/unprocessable_input_error_response.py +94 -0
  146. orca_sdk/_generated_api_client/models/update_prediction_request.py +93 -0
  147. orca_sdk/_generated_api_client/py.typed +1 -0
  148. orca_sdk/_generated_api_client/types.py +56 -0
  149. orca_sdk/_utils/__init__.py +0 -0
  150. orca_sdk/_utils/analysis_ui.py +194 -0
  151. orca_sdk/_utils/analysis_ui_style.css +54 -0
  152. orca_sdk/_utils/auth.py +63 -0
  153. orca_sdk/_utils/auth_test.py +31 -0
  154. orca_sdk/_utils/common.py +37 -0
  155. orca_sdk/_utils/data_parsing.py +99 -0
  156. orca_sdk/_utils/data_parsing_test.py +244 -0
  157. orca_sdk/_utils/prediction_result_ui.css +18 -0
  158. orca_sdk/_utils/prediction_result_ui.py +64 -0
  159. orca_sdk/_utils/task.py +73 -0
  160. orca_sdk/classification_model.py +499 -0
  161. orca_sdk/classification_model_test.py +266 -0
  162. orca_sdk/conftest.py +117 -0
  163. orca_sdk/datasource.py +333 -0
  164. orca_sdk/datasource_test.py +95 -0
  165. orca_sdk/embedding_model.py +336 -0
  166. orca_sdk/embedding_model_test.py +173 -0
  167. orca_sdk/labeled_memoryset.py +1154 -0
  168. orca_sdk/labeled_memoryset_test.py +271 -0
  169. orca_sdk/orca_credentials.py +75 -0
  170. orca_sdk/orca_credentials_test.py +37 -0
  171. orca_sdk/telemetry.py +386 -0
  172. orca_sdk/telemetry_test.py +100 -0
  173. orca_sdk-0.1.0.dist-info/METADATA +39 -0
  174. orca_sdk-0.1.0.dist-info/RECORD +175 -0
  175. orca_sdk-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,80 @@
1
+ """
2
+ This file is generated by the openapi-python-client tool via the generate_api_client.py script
3
+
4
+ It is a customized template from the openapi-python-client tool's default template:
5
+ https://github.com/openapi-generators/openapi-python-client/blob/861ef5622f10fc96d240dc9becb0edf94e61446c/openapi_python_client/templates/model.py.jinja
6
+
7
+ The main change is:
8
+ - Fix typing issues
9
+ """
10
+
11
+ # flake8: noqa: C901
12
+
13
+ from typing import Any, Literal, Type, TypeVar, cast
14
+
15
+ from attrs import define as _attrs_define
16
+ from attrs import field as _attrs_field
17
+
18
+ T = TypeVar("T", bound="UnauthorizedErrorResponse")
19
+
20
+
21
+ @_attrs_define
22
+ class UnauthorizedErrorResponse:
23
+ """
24
+ Attributes:
25
+ status_code (Literal[403]):
26
+ reason (str):
27
+ """
28
+
29
+ status_code: Literal[403]
30
+ reason: str
31
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
32
+
33
+ def to_dict(self) -> dict[str, Any]:
34
+ status_code = self.status_code
35
+
36
+ reason = self.reason
37
+
38
+ field_dict: dict[str, Any] = {}
39
+ field_dict.update(self.additional_properties)
40
+ field_dict.update(
41
+ {
42
+ "status_code": status_code,
43
+ "reason": reason,
44
+ }
45
+ )
46
+
47
+ return field_dict
48
+
49
+ @classmethod
50
+ def from_dict(cls: Type[T], src_dict: dict[str, Any]) -> T:
51
+ d = src_dict.copy()
52
+ status_code = cast(Literal[403], d.pop("status_code"))
53
+ if status_code != 403:
54
+ raise ValueError(f"status_code must match const 403, got '{status_code}'")
55
+
56
+ reason = d.pop("reason")
57
+
58
+ unauthorized_error_response = cls(
59
+ status_code=status_code,
60
+ reason=reason,
61
+ )
62
+
63
+ unauthorized_error_response.additional_properties = d
64
+ return unauthorized_error_response
65
+
66
+ @property
67
+ def additional_keys(self) -> list[str]:
68
+ return list(self.additional_properties.keys())
69
+
70
+ def __getitem__(self, key: str) -> Any:
71
+ return self.additional_properties[key]
72
+
73
+ def __setitem__(self, key: str, value: Any) -> None:
74
+ self.additional_properties[key] = value
75
+
76
+ def __delitem__(self, key: str) -> None:
77
+ del self.additional_properties[key]
78
+
79
+ def __contains__(self, key: str) -> bool:
80
+ return key in self.additional_properties
@@ -0,0 +1,94 @@
1
+ """
2
+ This file is generated by the openapi-python-client tool via the generate_api_client.py script
3
+
4
+ It is a customized template from the openapi-python-client tool's default template:
5
+ https://github.com/openapi-generators/openapi-python-client/blob/861ef5622f10fc96d240dc9becb0edf94e61446c/openapi_python_client/templates/model.py.jinja
6
+
7
+ The main change is:
8
+ - Fix typing issues
9
+ """
10
+
11
+ # flake8: noqa: C901
12
+
13
+ from typing import TYPE_CHECKING, Any, List, Literal, Type, TypeVar, cast
14
+
15
+ from attrs import define as _attrs_define
16
+ from attrs import field as _attrs_field
17
+
18
+ if TYPE_CHECKING:
19
+ from ..models.field_validation_error import FieldValidationError
20
+
21
+
22
+ T = TypeVar("T", bound="UnprocessableInputErrorResponse")
23
+
24
+
25
+ @_attrs_define
26
+ class UnprocessableInputErrorResponse:
27
+ """
28
+ Attributes:
29
+ status_code (Literal[422]):
30
+ validation_issues (List['FieldValidationError']):
31
+ """
32
+
33
+ status_code: Literal[422]
34
+ validation_issues: List["FieldValidationError"]
35
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
36
+
37
+ def to_dict(self) -> dict[str, Any]:
38
+ status_code = self.status_code
39
+
40
+ validation_issues = []
41
+ for validation_issues_item_data in self.validation_issues:
42
+ validation_issues_item = validation_issues_item_data.to_dict()
43
+ validation_issues.append(validation_issues_item)
44
+
45
+ field_dict: dict[str, Any] = {}
46
+ field_dict.update(self.additional_properties)
47
+ field_dict.update(
48
+ {
49
+ "status_code": status_code,
50
+ "validation_issues": validation_issues,
51
+ }
52
+ )
53
+
54
+ return field_dict
55
+
56
+ @classmethod
57
+ def from_dict(cls: Type[T], src_dict: dict[str, Any]) -> T:
58
+ from ..models.field_validation_error import FieldValidationError
59
+
60
+ d = src_dict.copy()
61
+ status_code = cast(Literal[422], d.pop("status_code"))
62
+ if status_code != 422:
63
+ raise ValueError(f"status_code must match const 422, got '{status_code}'")
64
+
65
+ validation_issues = []
66
+ _validation_issues = d.pop("validation_issues")
67
+ for validation_issues_item_data in _validation_issues:
68
+ validation_issues_item = FieldValidationError.from_dict(validation_issues_item_data)
69
+
70
+ validation_issues.append(validation_issues_item)
71
+
72
+ unprocessable_input_error_response = cls(
73
+ status_code=status_code,
74
+ validation_issues=validation_issues,
75
+ )
76
+
77
+ unprocessable_input_error_response.additional_properties = d
78
+ return unprocessable_input_error_response
79
+
80
+ @property
81
+ def additional_keys(self) -> list[str]:
82
+ return list(self.additional_properties.keys())
83
+
84
+ def __getitem__(self, key: str) -> Any:
85
+ return self.additional_properties[key]
86
+
87
+ def __setitem__(self, key: str, value: Any) -> None:
88
+ self.additional_properties[key] = value
89
+
90
+ def __delitem__(self, key: str) -> None:
91
+ del self.additional_properties[key]
92
+
93
+ def __contains__(self, key: str) -> bool:
94
+ return key in self.additional_properties
@@ -0,0 +1,93 @@
1
+ """
2
+ This file is generated by the openapi-python-client tool via the generate_api_client.py script
3
+
4
+ It is a customized template from the openapi-python-client tool's default template:
5
+ https://github.com/openapi-generators/openapi-python-client/blob/861ef5622f10fc96d240dc9becb0edf94e61446c/openapi_python_client/templates/model.py.jinja
6
+
7
+ The main change is:
8
+ - Fix typing issues
9
+ """
10
+
11
+ # flake8: noqa: C901
12
+
13
+ from typing import Any, List, Type, TypeVar, Union, cast
14
+
15
+ from attrs import define as _attrs_define
16
+ from attrs import field as _attrs_field
17
+
18
+ from ..types import UNSET, Unset
19
+
20
+ T = TypeVar("T", bound="UpdatePredictionRequest")
21
+
22
+
23
+ @_attrs_define
24
+ class UpdatePredictionRequest:
25
+ """
26
+ Attributes:
27
+ expected_label (Union[None, Unset, int]):
28
+ tags (Union[Unset, List[str]]):
29
+ """
30
+
31
+ expected_label: Union[None, Unset, int] = UNSET
32
+ tags: Union[Unset, List[str]] = UNSET
33
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
34
+
35
+ def to_dict(self) -> dict[str, Any]:
36
+ expected_label: Union[None, Unset, int]
37
+ if isinstance(self.expected_label, Unset):
38
+ expected_label = UNSET
39
+ else:
40
+ expected_label = self.expected_label
41
+
42
+ tags: Union[Unset, List[str]] = UNSET
43
+ if not isinstance(self.tags, Unset):
44
+ tags = self.tags
45
+
46
+ field_dict: dict[str, Any] = {}
47
+ field_dict.update(self.additional_properties)
48
+ field_dict.update({})
49
+ if expected_label is not UNSET:
50
+ field_dict["expected_label"] = expected_label
51
+ if tags is not UNSET:
52
+ field_dict["tags"] = tags
53
+
54
+ return field_dict
55
+
56
+ @classmethod
57
+ def from_dict(cls: Type[T], src_dict: dict[str, Any]) -> T:
58
+ d = src_dict.copy()
59
+
60
+ def _parse_expected_label(data: object) -> Union[None, Unset, int]:
61
+ if data is None:
62
+ return data
63
+ if isinstance(data, Unset):
64
+ return data
65
+ return cast(Union[None, Unset, int], data)
66
+
67
+ expected_label = _parse_expected_label(d.pop("expected_label", UNSET))
68
+
69
+ tags = cast(List[str], d.pop("tags", UNSET))
70
+
71
+ update_prediction_request = cls(
72
+ expected_label=expected_label,
73
+ tags=tags,
74
+ )
75
+
76
+ update_prediction_request.additional_properties = d
77
+ return update_prediction_request
78
+
79
+ @property
80
+ def additional_keys(self) -> list[str]:
81
+ return list(self.additional_properties.keys())
82
+
83
+ def __getitem__(self, key: str) -> Any:
84
+ return self.additional_properties[key]
85
+
86
+ def __setitem__(self, key: str, value: Any) -> None:
87
+ self.additional_properties[key] = value
88
+
89
+ def __delitem__(self, key: str) -> None:
90
+ del self.additional_properties[key]
91
+
92
+ def __contains__(self, key: str) -> bool:
93
+ return key in self.additional_properties
@@ -0,0 +1 @@
1
+ # Marker file for PEP 561
@@ -0,0 +1,56 @@
1
+ """
2
+ This file is generated by the openapi-python-client tool via the generate_api_client.py script
3
+
4
+ It is a customized template from the openapi-python-client tool's default template:
5
+ https://github.com/openapi-generators/openapi-python-client/blob/861ef5622f10fc96d240dc9becb0edf94e61446c/openapi_python_client/templates/types.py.jinja
6
+
7
+ The main change is:
8
+ - Make Response's parsed type required
9
+ """
10
+
11
+ from collections.abc import MutableMapping
12
+ from http import HTTPStatus
13
+ from typing import BinaryIO, Generic, Literal, Optional, TypeVar
14
+
15
+ from attrs import define
16
+
17
+ """ Contains some shared types for properties """
18
+
19
+
20
+ class Unset:
21
+ def __bool__(self) -> Literal[False]:
22
+ return False
23
+
24
+
25
+ UNSET: Unset = Unset()
26
+
27
+ FileJsonType = tuple[Optional[str], BinaryIO, Optional[str]]
28
+
29
+
30
+ @define
31
+ class File:
32
+ """Contains information for file uploads"""
33
+
34
+ payload: BinaryIO
35
+ file_name: Optional[str] = None
36
+ mime_type: Optional[str] = None
37
+
38
+ def to_tuple(self) -> FileJsonType:
39
+ """Return a tuple representation that httpx will accept for multipart/form-data"""
40
+ return self.file_name, self.payload, self.mime_type
41
+
42
+
43
+ T = TypeVar("T")
44
+
45
+
46
+ @define
47
+ class Response(Generic[T]):
48
+ """A response from an endpoint"""
49
+
50
+ status_code: HTTPStatus
51
+ content: bytes
52
+ headers: MutableMapping[str, str]
53
+ parsed: T
54
+
55
+
56
+ __all__ = ["UNSET", "File", "FileJsonType", "Response", "Unset"]
File without changes
@@ -0,0 +1,194 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import re
5
+ from pathlib import Path
6
+ from typing import TypedDict, cast
7
+
8
+ import gradio as gr
9
+
10
+ from ..labeled_memoryset import LabeledMemory, LabeledMemoryset
11
+
12
+ # Suppress all httpx logs
13
+ logging.getLogger("httpx").setLevel(logging.CRITICAL)
14
+
15
+ # Optionally suppress other libraries Gradio might use
16
+ logging.getLogger("gradio").setLevel(logging.CRITICAL)
17
+
18
+
19
+ class RelabelStatus(TypedDict):
20
+ memory_id: str
21
+ approved: bool
22
+ new_label: int | None
23
+ full_memory: LabeledMemory
24
+
25
+
26
+ def display_suggested_memory_relabels(memoryset: LabeledMemoryset):
27
+ suggested_relabels = memoryset.query(
28
+ filters=[("metrics.neighbor_predicted_label_matches_current_label", "==", False)]
29
+ )
30
+ # Sort memories by confidence score (higher confidence first)
31
+ suggested_relabels.sort(
32
+ key=lambda x: (x.metrics and x.metrics.neighbor_predicted_label_confidence) or 0.0, reverse=True
33
+ )
34
+
35
+ def update_approved(memory_id: str, selected: bool, current_memory_relabel_map: dict[str, RelabelStatus]):
36
+ current_memory_relabel_map[memory_id]["approved"] = selected
37
+ return current_memory_relabel_map
38
+
39
+ def approve_all(current_all_approved, selected: bool):
40
+ for mem_id in current_all_approved:
41
+ current_all_approved[mem_id]["approved"] = selected
42
+ return current_all_approved, selected
43
+
44
+ def apply_selected(current_memory_relabel_map: dict[str, RelabelStatus], progress=gr.Progress(track_tqdm=True)):
45
+ progress(0, desc="Processing label updates...")
46
+ to_be_deleted = []
47
+ approved_relabels = [mem for mem in current_memory_relabel_map.values() if mem["approved"]]
48
+ for memory in progress.tqdm(approved_relabels, desc="Applying label updates..."):
49
+ memory = cast(RelabelStatus, memory)
50
+ new_label = memory["new_label"]
51
+ assert isinstance(new_label, int)
52
+ memoryset.update(
53
+ {
54
+ "memory_id": memory["memory_id"],
55
+ "label": new_label,
56
+ }
57
+ )
58
+ to_be_deleted.append(memory["memory_id"])
59
+ for mem_id in to_be_deleted:
60
+ del current_memory_relabel_map[mem_id]
61
+ return (
62
+ current_memory_relabel_map,
63
+ gr.HTML(
64
+ f"<h1 style='display: inline-block; position: fixed; z-index: 1000; left: 36px; top: 14px;'>Suggested Label Updates: {len(current_memory_relabel_map)}</h1>",
65
+ ),
66
+ )
67
+
68
+ def update_label(mem_id: str, label: str, current_memory_relabel_map: dict[str, RelabelStatus]):
69
+ match = re.search(r".*\((\d+)\)$", label)
70
+ if match:
71
+ new_label = int(match.group(1))
72
+ current_memory_relabel_map[mem_id]["new_label"] = new_label
73
+ confidence = "--"
74
+ current_metrics = current_memory_relabel_map[mem_id]["full_memory"].metrics
75
+ if current_metrics and new_label == current_metrics.neighbor_predicted_label:
76
+ confidence = (
77
+ round(current_metrics.neighbor_predicted_label_confidence or 0.0, 2) if current_metrics else 0
78
+ )
79
+ return (
80
+ gr.HTML(
81
+ f"<p style='font-size: 10px; color: #888;'>Confidence: {confidence}</p>",
82
+ elem_classes="no-padding",
83
+ ),
84
+ current_memory_relabel_map,
85
+ )
86
+ else:
87
+ logging.error(f"Invalid label format: {label}")
88
+
89
+ with gr.Blocks(
90
+ fill_width=True,
91
+ title="Suggested Label Updates",
92
+ css_paths=str(Path(__file__).parent / "analysis_ui_style.css"),
93
+ ) as demo:
94
+ label_names = memoryset.label_names
95
+
96
+ refresh = gr.State(False)
97
+ all_approved = gr.State(False)
98
+ memory_relabel_map = gr.State(
99
+ {
100
+ mem.memory_id: RelabelStatus(
101
+ memory_id=mem.memory_id,
102
+ approved=False,
103
+ new_label=(
104
+ mem.metrics.neighbor_predicted_label
105
+ if (mem.metrics and isinstance(mem.metrics.neighbor_predicted_label, int))
106
+ else None
107
+ ),
108
+ full_memory=mem,
109
+ )
110
+ for mem in suggested_relabels
111
+ }
112
+ )
113
+
114
+ @gr.render(
115
+ inputs=[memory_relabel_map, all_approved],
116
+ triggers=[demo.load, refresh.change, all_approved.change, memory_relabel_map.change],
117
+ )
118
+ def render_table(current_memory_relabel_map, current_all_approved):
119
+ if len(current_memory_relabel_map):
120
+ with gr.Group(elem_classes="header"):
121
+ title = gr.HTML(
122
+ f"<h1 style='display: inline-block; position: fixed; z-index: 1000; left: 36px; top: 14px;'>Suggested Label Updates: {len(current_memory_relabel_map)}</h1>"
123
+ )
124
+ apply_selected_button = gr.Button("Apply Selected", elem_classes="button")
125
+ apply_selected_button.click(
126
+ apply_selected,
127
+ inputs=[memory_relabel_map],
128
+ outputs=[memory_relabel_map, title],
129
+ show_progress="full",
130
+ )
131
+ with gr.Row(equal_height=True, variant="panel", elem_classes="margin-top"):
132
+ with gr.Column(scale=9):
133
+ gr.Markdown("**Value**")
134
+ with gr.Column(scale=2, min_width=90):
135
+ gr.Markdown("**Current Label**")
136
+ with gr.Column(scale=3, min_width=150):
137
+ gr.Markdown("**Suggested Label**", elem_classes="centered")
138
+ with gr.Column(scale=2, min_width=50):
139
+ approve_all_checkbox = gr.Checkbox(
140
+ show_label=False,
141
+ value=current_all_approved,
142
+ label="",
143
+ container=False,
144
+ elem_classes="centered",
145
+ )
146
+ approve_all_checkbox.change(
147
+ approve_all,
148
+ inputs=[memory_relabel_map, approve_all_checkbox],
149
+ outputs=[memory_relabel_map, all_approved],
150
+ )
151
+ for i, memory_relabel in enumerate(current_memory_relabel_map.values()):
152
+ mem = memory_relabel["full_memory"]
153
+ with gr.Row(equal_height=True, variant="panel", elem_classes="white" if i % 2 == 0 else None):
154
+ with gr.Column(scale=9):
155
+ assert isinstance(mem.value, str)
156
+ gr.Markdown(mem.value, label="Value", height=50)
157
+ with gr.Column(scale=2, min_width=90):
158
+ gr.Markdown(f"{mem.label_name} ({mem.label})", label="Current Label", height=50)
159
+ with gr.Column(scale=3, min_width=150):
160
+ dropdown = gr.Dropdown(
161
+ choices=[f"{label_name} ({i})" for i, label_name in enumerate(label_names)],
162
+ label="SuggestedLabel",
163
+ value=f"{label_names[mem.metrics.neighbor_predicted_label]} ({mem.metrics.neighbor_predicted_label})",
164
+ interactive=True,
165
+ container=False,
166
+ )
167
+ confidence = gr.HTML(
168
+ f"<p style='font-size: 10px; color: #888;'>Confidence: {mem.metrics.neighbor_predicted_label_confidence:.2f}</p>",
169
+ elem_classes="no-padding",
170
+ )
171
+ dropdown.change(
172
+ lambda val, map, mem_id=mem.memory_id: update_label(mem_id, val, map),
173
+ inputs=[dropdown, memory_relabel_map],
174
+ outputs=[confidence, memory_relabel_map],
175
+ )
176
+ with gr.Column(scale=2, min_width=50):
177
+ checkbox = gr.Checkbox(
178
+ show_label=False,
179
+ label="",
180
+ value=current_memory_relabel_map[mem.memory_id]["approved"],
181
+ container=False,
182
+ elem_classes="centered",
183
+ interactive=True,
184
+ )
185
+ checkbox.input(
186
+ lambda selected, map, mem_id=mem.memory_id: update_approved(mem_id, selected, map),
187
+ inputs=[checkbox, memory_relabel_map],
188
+ outputs=[memory_relabel_map],
189
+ )
190
+
191
+ else:
192
+ gr.HTML("<h1>No suggested label updates</h1>")
193
+
194
+ demo.launch()
@@ -0,0 +1,54 @@
1
+ .white {
2
+ background-color: white;
3
+ }
4
+ .centered input {
5
+ margin: auto;
6
+ }
7
+ .centered p {
8
+ text-align: center;
9
+ }
10
+ .button {
11
+ display: inline-block;
12
+ max-width: 250px;
13
+ background-color: #2b9a66;
14
+ color: white;
15
+ position: fixed;
16
+ z-index: 1000;
17
+ right: 36px;
18
+ border-radius: 8px;
19
+ top: 12px;
20
+ }
21
+ .margin-top {
22
+ margin-top: 60px;
23
+ }
24
+ .header {
25
+ position: fixed;
26
+ z-index: 1000;
27
+ height: 64px;
28
+ left: 0;
29
+ top: 0;
30
+ border-radius: 0;
31
+ }
32
+
33
+ input[type='checkbox']:checked,
34
+ input[type='checkbox']:checked:hover,
35
+ input[type='checkbox']:checked:focus {
36
+ background-color: #2b9a66;
37
+ border-color: #2b9a66;
38
+ }
39
+ input[type='checkbox']:focus {
40
+ border-color: #2b9a66;
41
+ }
42
+ .html-container:has(.no-padding) {
43
+ padding: 0;
44
+ }
45
+
46
+ .progress-bar {
47
+ background-color: #2b9a66;
48
+ }
49
+ .header .full {
50
+ position: fixed !important;
51
+ z-index: 1100;
52
+ background-color: #e4e4e7;
53
+ height: 68px;
54
+ }
@@ -0,0 +1,63 @@
1
+ """This module contains internal utils for managing api keys in tests"""
2
+
3
+ import logging
4
+ import os
5
+ from typing import List
6
+
7
+ from dotenv import load_dotenv
8
+
9
+ from .._generated_api_client.api import (
10
+ check_authentication,
11
+ create_api_key,
12
+ delete_api_key,
13
+ delete_org,
14
+ list_api_keys,
15
+ )
16
+ from .._generated_api_client.client import headers_context, set_base_url, set_headers
17
+ from .._generated_api_client.models import CreateApiKeyRequest
18
+ from .._generated_api_client.models.api_key_metadata import ApiKeyMetadata
19
+ from .common import DropMode
20
+
21
+ load_dotenv() # this needs to be here to ensure env is populated before accessing it
22
+ _ORCA_ROOT_ACCESS_API_KEY = os.environ.get("ORCA_ROOT_ACCESS_API_KEY", "00000000-0000-0000-0000-000000000000")
23
+
24
+
25
+ def _create_api_key(org_id: str, name: str) -> str:
26
+ """Creates an API key for the given organization"""
27
+ with headers_context({"Api-Key": _ORCA_ROOT_ACCESS_API_KEY, "Org-Id": org_id}):
28
+ res = create_api_key(body=CreateApiKeyRequest(name=name))
29
+ return res.api_key
30
+
31
+
32
+ def _list_api_keys(org_id: str) -> List[ApiKeyMetadata]:
33
+ """Lists all API keys for the given organization"""
34
+ with headers_context({"Api-Key": _ORCA_ROOT_ACCESS_API_KEY, "Org-Id": org_id}):
35
+ return list_api_keys()
36
+
37
+
38
+ def _delete_api_key(org_id: str, name: str, if_not_exists: DropMode = "error") -> None:
39
+ """Deletes the API key with the given name from the organization"""
40
+ with headers_context({"Api-Key": _ORCA_ROOT_ACCESS_API_KEY, "Org-Id": org_id}):
41
+ try:
42
+ delete_api_key(name_or_id=name)
43
+ except LookupError:
44
+ if if_not_exists == "error":
45
+ raise
46
+
47
+
48
+ def _delete_org(org_id: str) -> None:
49
+ """Deletes the organization"""
50
+ with headers_context({"Api-Key": _ORCA_ROOT_ACCESS_API_KEY, "Org-Id": org_id}):
51
+ delete_org()
52
+
53
+
54
+ def _authenticate_local_api(org_id: str = "10e50000-0000-4000-a000-a78dca14af3a", api_key_name: str = "local") -> None:
55
+ """Connect to the local API at http://localhost:1584/ and authenticate with a new API key"""
56
+ set_base_url("http://localhost:1584/")
57
+ _delete_api_key(org_id, api_key_name, if_not_exists="ignore")
58
+ set_headers({"Api-Key": _create_api_key(org_id, api_key_name)})
59
+ check_authentication()
60
+ logging.info(f"Authenticated against local API at 'http://localhost:1584' with '{api_key_name}' API key")
61
+
62
+
63
+ __all__ = ["_create_api_key", "_delete_api_key", "_delete_org", "_list_api_keys", "_authenticate_local_api"]
@@ -0,0 +1,31 @@
1
+ from uuid import uuid4
2
+
3
+ from ..orca_credentials import OrcaCredentials
4
+ from .auth import _create_api_key, _delete_api_key, _delete_org, _list_api_keys
5
+
6
+
7
+ def test_list_api_keys(org_id):
8
+ assert len(_list_api_keys(org_id)) >= 1
9
+
10
+
11
+ def test_create_api_key(org_id):
12
+ name = f"test-{uuid4().hex[:8]}"
13
+ api_key = _create_api_key(org_id=org_id, name=name)
14
+ assert api_key is not None
15
+ assert name in [api_key.name for api_key in OrcaCredentials.list_api_keys()]
16
+
17
+
18
+ def test_delete_api_key(org_id):
19
+ name = f"test-{uuid4().hex[:8]}"
20
+ api_key = _create_api_key(org_id=org_id, name=name)
21
+ assert api_key is not None
22
+ assert name in [api_key.name for api_key in OrcaCredentials.list_api_keys()]
23
+ _delete_api_key(org_id=org_id, name=name)
24
+ assert name not in [api_key.name for api_key in OrcaCredentials.list_api_keys()]
25
+
26
+
27
+ def test_delete_org(other_org_id):
28
+ _create_api_key(org_id=other_org_id, name="test")
29
+ assert len(_list_api_keys(other_org_id)) >= 1
30
+ _delete_org(other_org_id)
31
+ assert len(_list_api_keys(other_org_id)) == 0