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.
- orca_sdk/__init__.py +19 -0
- orca_sdk/_generated_api_client/__init__.py +3 -0
- orca_sdk/_generated_api_client/api/__init__.py +193 -0
- orca_sdk/_generated_api_client/api/auth/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/auth/check_authentication_auth_get.py +128 -0
- orca_sdk/_generated_api_client/api/auth/create_api_key_auth_api_key_post.py +170 -0
- orca_sdk/_generated_api_client/api/auth/delete_api_key_auth_api_key_name_or_id_delete.py +156 -0
- orca_sdk/_generated_api_client/api/auth/delete_org_auth_org_delete.py +130 -0
- orca_sdk/_generated_api_client/api/auth/list_api_keys_auth_api_key_get.py +127 -0
- orca_sdk/_generated_api_client/api/classification_model/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/classification_model/create_evaluation_classification_model_model_name_or_id_evaluation_post.py +183 -0
- orca_sdk/_generated_api_client/api/classification_model/create_model_classification_model_post.py +170 -0
- orca_sdk/_generated_api_client/api/classification_model/delete_evaluation_classification_model_model_name_or_id_evaluation_task_id_delete.py +168 -0
- orca_sdk/_generated_api_client/api/classification_model/delete_model_classification_model_name_or_id_delete.py +154 -0
- orca_sdk/_generated_api_client/api/classification_model/get_evaluation_classification_model_model_name_or_id_evaluation_task_id_get.py +170 -0
- orca_sdk/_generated_api_client/api/classification_model/get_model_classification_model_name_or_id_get.py +156 -0
- orca_sdk/_generated_api_client/api/classification_model/list_evaluations_classification_model_model_name_or_id_evaluation_get.py +161 -0
- orca_sdk/_generated_api_client/api/classification_model/list_models_classification_model_get.py +127 -0
- orca_sdk/_generated_api_client/api/classification_model/predict_gpu_classification_model_name_or_id_prediction_post.py +190 -0
- orca_sdk/_generated_api_client/api/datasource/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/datasource/create_datasource_datasource_post.py +167 -0
- orca_sdk/_generated_api_client/api/datasource/delete_datasource_datasource_name_or_id_delete.py +156 -0
- orca_sdk/_generated_api_client/api/datasource/get_datasource_datasource_name_or_id_get.py +156 -0
- orca_sdk/_generated_api_client/api/datasource/list_datasources_datasource_get.py +127 -0
- orca_sdk/_generated_api_client/api/default/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/default/healthcheck_get.py +118 -0
- orca_sdk/_generated_api_client/api/default/healthcheck_gpu_get.py +118 -0
- orca_sdk/_generated_api_client/api/finetuned_embedding_model/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/finetuned_embedding_model/create_finetuned_embedding_model_finetuned_embedding_model_post.py +168 -0
- orca_sdk/_generated_api_client/api/finetuned_embedding_model/delete_finetuned_embedding_model_finetuned_embedding_model_name_or_id_delete.py +156 -0
- 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
- orca_sdk/_generated_api_client/api/finetuned_embedding_model/get_finetuned_embedding_model_finetuned_embedding_model_name_or_id_get.py +156 -0
- orca_sdk/_generated_api_client/api/finetuned_embedding_model/list_finetuned_embedding_models_finetuned_embedding_model_get.py +127 -0
- orca_sdk/_generated_api_client/api/memoryset/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/memoryset/clone_memoryset_memoryset_name_or_id_clone_post.py +181 -0
- orca_sdk/_generated_api_client/api/memoryset/create_analysis_memoryset_name_or_id_analysis_post.py +183 -0
- orca_sdk/_generated_api_client/api/memoryset/create_memoryset_memoryset_post.py +168 -0
- orca_sdk/_generated_api_client/api/memoryset/delete_memories_memoryset_name_or_id_memories_delete_post.py +181 -0
- orca_sdk/_generated_api_client/api/memoryset/delete_memory_memoryset_name_or_id_memory_memory_id_delete.py +167 -0
- orca_sdk/_generated_api_client/api/memoryset/delete_memoryset_memoryset_name_or_id_delete.py +156 -0
- orca_sdk/_generated_api_client/api/memoryset/get_analysis_memoryset_name_or_id_analysis_analysis_task_id_get.py +169 -0
- orca_sdk/_generated_api_client/api/memoryset/get_memories_memoryset_name_or_id_memories_get_post.py +188 -0
- orca_sdk/_generated_api_client/api/memoryset/get_memory_memoryset_name_or_id_memory_memory_id_get.py +169 -0
- orca_sdk/_generated_api_client/api/memoryset/get_memoryset_memoryset_name_or_id_get.py +156 -0
- orca_sdk/_generated_api_client/api/memoryset/insert_memories_gpu_memoryset_name_or_id_memory_post.py +184 -0
- orca_sdk/_generated_api_client/api/memoryset/list_analyses_memoryset_name_or_id_analysis_get.py +260 -0
- orca_sdk/_generated_api_client/api/memoryset/list_memorysets_memoryset_get.py +127 -0
- orca_sdk/_generated_api_client/api/memoryset/memoryset_lookup_gpu_memoryset_name_or_id_lookup_post.py +193 -0
- orca_sdk/_generated_api_client/api/memoryset/query_memoryset_memoryset_name_or_id_memories_post.py +188 -0
- orca_sdk/_generated_api_client/api/memoryset/update_memories_gpu_memoryset_name_or_id_memories_patch.py +191 -0
- orca_sdk/_generated_api_client/api/memoryset/update_memory_gpu_memoryset_name_or_id_memory_patch.py +187 -0
- orca_sdk/_generated_api_client/api/pretrained_embedding_model/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/pretrained_embedding_model/embed_with_pretrained_model_gpu_pretrained_embedding_model_model_name_embedding_post.py +188 -0
- orca_sdk/_generated_api_client/api/pretrained_embedding_model/get_pretrained_embedding_model_pretrained_embedding_model_model_name_get.py +157 -0
- orca_sdk/_generated_api_client/api/pretrained_embedding_model/list_pretrained_embedding_models_pretrained_embedding_model_get.py +127 -0
- orca_sdk/_generated_api_client/api/task/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/task/abort_task_task_task_id_abort_delete.py +154 -0
- orca_sdk/_generated_api_client/api/task/get_task_status_task_task_id_status_get.py +156 -0
- orca_sdk/_generated_api_client/api/task/list_tasks_task_get.py +243 -0
- orca_sdk/_generated_api_client/api/telemetry/__init__.py +0 -0
- orca_sdk/_generated_api_client/api/telemetry/drop_feedback_category_with_data_telemetry_feedback_category_name_or_id_delete.py +162 -0
- orca_sdk/_generated_api_client/api/telemetry/get_feedback_category_telemetry_feedback_category_name_or_id_get.py +156 -0
- orca_sdk/_generated_api_client/api/telemetry/get_prediction_telemetry_prediction_prediction_id_get.py +157 -0
- orca_sdk/_generated_api_client/api/telemetry/list_feedback_categories_telemetry_feedback_category_get.py +127 -0
- orca_sdk/_generated_api_client/api/telemetry/list_predictions_telemetry_prediction_post.py +175 -0
- orca_sdk/_generated_api_client/api/telemetry/record_prediction_feedback_telemetry_prediction_feedback_put.py +171 -0
- orca_sdk/_generated_api_client/api/telemetry/update_prediction_telemetry_prediction_prediction_id_patch.py +181 -0
- orca_sdk/_generated_api_client/client.py +216 -0
- orca_sdk/_generated_api_client/errors.py +38 -0
- orca_sdk/_generated_api_client/models/__init__.py +159 -0
- orca_sdk/_generated_api_client/models/analyze_neighbor_labels_result.py +84 -0
- orca_sdk/_generated_api_client/models/api_key_metadata.py +118 -0
- orca_sdk/_generated_api_client/models/base_model.py +55 -0
- orca_sdk/_generated_api_client/models/body_create_datasource_datasource_post.py +176 -0
- orca_sdk/_generated_api_client/models/classification_evaluation_result.py +114 -0
- orca_sdk/_generated_api_client/models/clone_labeled_memoryset_request.py +150 -0
- orca_sdk/_generated_api_client/models/column_info.py +114 -0
- orca_sdk/_generated_api_client/models/column_type.py +14 -0
- orca_sdk/_generated_api_client/models/conflict_error_response.py +80 -0
- orca_sdk/_generated_api_client/models/create_api_key_request.py +99 -0
- orca_sdk/_generated_api_client/models/create_api_key_response.py +126 -0
- orca_sdk/_generated_api_client/models/create_labeled_memoryset_request.py +259 -0
- orca_sdk/_generated_api_client/models/create_rac_model_request.py +209 -0
- orca_sdk/_generated_api_client/models/datasource_metadata.py +142 -0
- orca_sdk/_generated_api_client/models/delete_memories_request.py +70 -0
- orca_sdk/_generated_api_client/models/embed_request.py +127 -0
- orca_sdk/_generated_api_client/models/embedding_finetuning_method.py +9 -0
- orca_sdk/_generated_api_client/models/evaluation_request.py +180 -0
- orca_sdk/_generated_api_client/models/evaluation_response.py +140 -0
- orca_sdk/_generated_api_client/models/feedback_type.py +9 -0
- orca_sdk/_generated_api_client/models/field_validation_error.py +103 -0
- orca_sdk/_generated_api_client/models/filter_item.py +231 -0
- orca_sdk/_generated_api_client/models/filter_item_field_type_0_item.py +15 -0
- orca_sdk/_generated_api_client/models/filter_item_field_type_2_item_type_1.py +16 -0
- orca_sdk/_generated_api_client/models/filter_item_op.py +16 -0
- orca_sdk/_generated_api_client/models/find_duplicates_analysis_result.py +70 -0
- orca_sdk/_generated_api_client/models/finetune_embedding_model_request.py +259 -0
- orca_sdk/_generated_api_client/models/finetune_embedding_model_request_training_args.py +66 -0
- orca_sdk/_generated_api_client/models/finetuned_embedding_model_metadata.py +166 -0
- orca_sdk/_generated_api_client/models/get_memories_request.py +70 -0
- orca_sdk/_generated_api_client/models/internal_server_error_response.py +80 -0
- orca_sdk/_generated_api_client/models/label_class_metrics.py +108 -0
- orca_sdk/_generated_api_client/models/label_prediction_memory_lookup.py +274 -0
- orca_sdk/_generated_api_client/models/label_prediction_memory_lookup_metadata.py +68 -0
- orca_sdk/_generated_api_client/models/label_prediction_result.py +101 -0
- orca_sdk/_generated_api_client/models/label_prediction_with_memories_and_feedback.py +232 -0
- orca_sdk/_generated_api_client/models/labeled_memory.py +197 -0
- orca_sdk/_generated_api_client/models/labeled_memory_insert.py +108 -0
- orca_sdk/_generated_api_client/models/labeled_memory_insert_metadata.py +68 -0
- orca_sdk/_generated_api_client/models/labeled_memory_lookup.py +258 -0
- orca_sdk/_generated_api_client/models/labeled_memory_lookup_metadata.py +68 -0
- orca_sdk/_generated_api_client/models/labeled_memory_metadata.py +68 -0
- orca_sdk/_generated_api_client/models/labeled_memory_metrics.py +277 -0
- orca_sdk/_generated_api_client/models/labeled_memory_update.py +171 -0
- orca_sdk/_generated_api_client/models/labeled_memory_update_metadata_type_0.py +68 -0
- orca_sdk/_generated_api_client/models/labeled_memoryset_metadata.py +195 -0
- orca_sdk/_generated_api_client/models/list_analyses_memoryset_name_or_id_analysis_get_type_type_0.py +9 -0
- orca_sdk/_generated_api_client/models/list_memories_request.py +104 -0
- orca_sdk/_generated_api_client/models/list_predictions_request.py +234 -0
- orca_sdk/_generated_api_client/models/list_predictions_request_sort_item_item_type_0.py +9 -0
- orca_sdk/_generated_api_client/models/list_predictions_request_sort_item_item_type_1.py +9 -0
- orca_sdk/_generated_api_client/models/lookup_request.py +81 -0
- orca_sdk/_generated_api_client/models/memoryset_analysis_request.py +83 -0
- orca_sdk/_generated_api_client/models/memoryset_analysis_request_type.py +9 -0
- orca_sdk/_generated_api_client/models/memoryset_analysis_response.py +180 -0
- orca_sdk/_generated_api_client/models/memoryset_analysis_response_config.py +66 -0
- orca_sdk/_generated_api_client/models/memoryset_analysis_response_type.py +9 -0
- orca_sdk/_generated_api_client/models/not_found_error_response.py +100 -0
- orca_sdk/_generated_api_client/models/not_found_error_response_resource_type_0.py +20 -0
- orca_sdk/_generated_api_client/models/prediction_feedback.py +157 -0
- orca_sdk/_generated_api_client/models/prediction_feedback_category.py +115 -0
- orca_sdk/_generated_api_client/models/prediction_feedback_request.py +122 -0
- orca_sdk/_generated_api_client/models/prediction_feedback_result.py +102 -0
- orca_sdk/_generated_api_client/models/prediction_request.py +169 -0
- orca_sdk/_generated_api_client/models/pretrained_embedding_model_metadata.py +97 -0
- orca_sdk/_generated_api_client/models/pretrained_embedding_model_name.py +11 -0
- orca_sdk/_generated_api_client/models/rac_head_type.py +11 -0
- orca_sdk/_generated_api_client/models/rac_model_metadata.py +191 -0
- orca_sdk/_generated_api_client/models/service_unavailable_error_response.py +80 -0
- orca_sdk/_generated_api_client/models/task.py +198 -0
- orca_sdk/_generated_api_client/models/task_status.py +14 -0
- orca_sdk/_generated_api_client/models/task_status_info.py +133 -0
- orca_sdk/_generated_api_client/models/unauthenticated_error_response.py +72 -0
- orca_sdk/_generated_api_client/models/unauthorized_error_response.py +80 -0
- orca_sdk/_generated_api_client/models/unprocessable_input_error_response.py +94 -0
- orca_sdk/_generated_api_client/models/update_prediction_request.py +93 -0
- orca_sdk/_generated_api_client/py.typed +1 -0
- orca_sdk/_generated_api_client/types.py +56 -0
- orca_sdk/_utils/__init__.py +0 -0
- orca_sdk/_utils/analysis_ui.py +194 -0
- orca_sdk/_utils/analysis_ui_style.css +54 -0
- orca_sdk/_utils/auth.py +63 -0
- orca_sdk/_utils/auth_test.py +31 -0
- orca_sdk/_utils/common.py +37 -0
- orca_sdk/_utils/data_parsing.py +99 -0
- orca_sdk/_utils/data_parsing_test.py +244 -0
- orca_sdk/_utils/prediction_result_ui.css +18 -0
- orca_sdk/_utils/prediction_result_ui.py +64 -0
- orca_sdk/_utils/task.py +73 -0
- orca_sdk/classification_model.py +499 -0
- orca_sdk/classification_model_test.py +266 -0
- orca_sdk/conftest.py +117 -0
- orca_sdk/datasource.py +333 -0
- orca_sdk/datasource_test.py +95 -0
- orca_sdk/embedding_model.py +336 -0
- orca_sdk/embedding_model_test.py +173 -0
- orca_sdk/labeled_memoryset.py +1154 -0
- orca_sdk/labeled_memoryset_test.py +271 -0
- orca_sdk/orca_credentials.py +75 -0
- orca_sdk/orca_credentials_test.py +37 -0
- orca_sdk/telemetry.py +386 -0
- orca_sdk/telemetry_test.py +100 -0
- orca_sdk-0.1.0.dist-info/METADATA +39 -0
- orca_sdk-0.1.0.dist-info/RECORD +175 -0
- 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
|
+
}
|
orca_sdk/_utils/auth.py
ADDED
|
@@ -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
|