fiddler-client 2.2.0.dev3__tar.gz → 2.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/PKG-INFO +31 -4
- fiddler-client-2.2.0.dev3/fiddler_client.egg-info/PKG-INFO → fiddler-client-2.3.0/PUBLIC.md +29 -25
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/__init__.py +1 -4
- fiddler-client-2.3.0/fiddler/_version.py +1 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/alert_mixin.py +4 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/api.py +1 -5
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/events_mixin.py +5 -5
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/webhooks_mixin.py +8 -7
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/alert.py +2 -0
- fiddler-client-2.3.0/fiddler3/__init__.py +39 -0
- fiddler-client-2.3.0/fiddler3/configs.py +5 -0
- fiddler-client-2.3.0/fiddler3/connection.py +117 -0
- fiddler-client-2.3.0/fiddler3/constants/common.py +3 -0
- fiddler-client-2.3.0/fiddler3/constants/job.py +13 -0
- fiddler-client-2.3.0/fiddler3/constants/model.py +64 -0
- fiddler-client-2.3.0/fiddler3/decorators.py +52 -0
- fiddler-client-2.3.0/fiddler3/entities/__init__.py +3 -0
- fiddler-client-2.3.0/fiddler3/entities/base.py +76 -0
- fiddler-client-2.3.0/fiddler3/entities/helpers.py +21 -0
- fiddler-client-2.3.0/fiddler3/entities/job.py +145 -0
- fiddler-client-2.3.0/fiddler3/entities/model.py +198 -0
- fiddler-client-2.3.0/fiddler3/entities/project.py +90 -0
- fiddler-client-2.3.0/fiddler3/exceptions.py +87 -0
- fiddler-client-2.3.0/fiddler3/libs/http_client.py +220 -0
- fiddler-client-2.3.0/fiddler3/libs/semver.py +489 -0
- fiddler-client-2.3.0/fiddler3/schemas/__init__.py +5 -0
- fiddler-client-2.3.0/fiddler3/schemas/base.py +8 -0
- fiddler-client-2.3.0/fiddler3/schemas/custom_features.py +98 -0
- fiddler-client-2.3.0/fiddler3/schemas/job.py +19 -0
- fiddler-client-2.3.0/fiddler3/schemas/model.py +48 -0
- {fiddler-client-2.2.0.dev3/fiddler → fiddler-client-2.3.0/fiddler3}/schemas/model_schema.py +1 -1
- {fiddler-client-2.2.0.dev3/fiddler → fiddler-client-2.3.0/fiddler3}/schemas/model_spec.py +1 -1
- {fiddler-client-2.2.0.dev3/fiddler → fiddler-client-2.3.0/fiddler3}/schemas/model_task_params.py +1 -1
- fiddler-client-2.3.0/fiddler3/schemas/organization.py +8 -0
- fiddler-client-2.3.0/fiddler3/schemas/project.py +19 -0
- fiddler-client-2.3.0/fiddler3/schemas/response.py +51 -0
- fiddler-client-2.3.0/fiddler3/schemas/server_info.py +18 -0
- fiddler-client-2.3.0/fiddler3/schemas/user.py +9 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/__init__.py +0 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/test_generate_schema.py +149 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/test_job.py +82 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/test_model.py +373 -0
- fiddler-client-2.3.0/fiddler3/tests/apis/test_project.py +221 -0
- fiddler-client-2.3.0/fiddler3/tests/conftest.py +30 -0
- fiddler-client-2.3.0/fiddler3/tests/constants.py +14 -0
- fiddler-client-2.3.0/fiddler3/tests/test_connection.py +41 -0
- fiddler-client-2.3.0/fiddler3/tests/test_utils.py +15 -0
- fiddler-client-2.3.0/fiddler3/tests/utils.py +14 -0
- fiddler-client-2.3.0/fiddler3/utils/__init__.py +0 -0
- fiddler-client-2.3.0/fiddler3/utils/logger.py +8 -0
- fiddler-client-2.2.0.dev3/fiddler/api/generate_schema_mixin.py → fiddler-client-2.3.0/fiddler3/utils/model_schema_generator.py +23 -53
- fiddler-client-2.3.0/fiddler3/utils/version.py +17 -0
- fiddler-client-2.3.0/fiddler3/version.py +1 -0
- fiddler-client-2.2.0.dev3/PUBLIC.md → fiddler-client-2.3.0/fiddler_client.egg-info/PKG-INFO +52 -2
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler_client.egg-info/SOURCES.txt +48 -7
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler_client.egg-info/requires.txt +1 -1
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler_client.egg-info/top_level.txt +1 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/setup.py +1 -1
- fiddler-client-2.3.0/tests/__init__.py +0 -0
- fiddler-client-2.3.0/tests/fiddler/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_alert.py +33 -0
- fiddler-client-2.3.0/tests/fiddler/utils/__init__.py +0 -0
- fiddler-client-2.2.0.dev3/fiddler/_version.py +0 -1
- fiddler-client-2.2.0.dev3/tests/fiddler/test_generate_schema.py +0 -113
- fiddler-client-2.2.0.dev3/tests/fiddler/test_segments.py +0 -227
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/LICENSE.txt +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/MANIFEST.in +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/README.md +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/baseline_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/custom_metrics_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/dataset_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/explainability_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/helpers.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/job_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/model_artifact_deploy.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/model_deployment_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/model_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/project_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/api/segments_mixin.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/assets/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/assets/pg_reserved_words.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/constants.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/core_objects.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/exceptions.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/libs/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/libs/http_client.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/packtools/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/packtools/gem.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/packtools/keras_ig_helpers.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/packtools/project_attributions_helpers.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/packtools/template_model.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/base.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/baseline.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/custom_metric.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/dataset.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/events.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/job.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/model.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/model_deployment.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/project.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/segment.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/server_info.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/user.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schema/webhook.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schemas/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/schemas/custom_features.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/decorators.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/formatting.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/general_checks.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/helpers.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/logger.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/pandas_helper.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/response_handler.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/semver_version.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/validations.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/utils/validator.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/validators/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler/validators/dataset_validator.py +0 -0
- {fiddler-client-2.2.0.dev3/tests → fiddler-client-2.3.0/fiddler3/constants}/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3/tests/fiddler → fiddler-client-2.3.0/fiddler3/libs}/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3/fiddler → fiddler-client-2.3.0/fiddler3}/schemas/xai_params.py +0 -0
- {fiddler-client-2.2.0.dev3/tests/fiddler/utils → fiddler-client-2.3.0/fiddler3/tests}/__init__.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/fiddler_client.egg-info/dependency_links.txt +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/setup.cfg +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/base.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/helper.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_add_model.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_baseline.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_check_version_decorator.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_custom_features.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_custom_metrics.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_dataset_api.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_events_api.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_exceptions.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_explainability_apis.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_file_upload.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_helpers.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_job.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_model.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_project.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_response_handler.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_upload_dataset.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_validations.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/test_webhook.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/utils/test_general_checks.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/utils/test_pandas.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/fiddler/utils/tests_utils.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/test_object_inference.py +0 -0
- {fiddler-client-2.2.0.dev3 → fiddler-client-2.3.0}/tests/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fiddler-client
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Python client for Fiddler Service
|
|
5
5
|
Home-page: https://fiddler.ai
|
|
6
6
|
Author: Fiddler Labs
|
|
@@ -14,7 +14,7 @@ Requires-Dist: pip>=21.0
|
|
|
14
14
|
Requires-Dist: requests<3
|
|
15
15
|
Requires-Dist: requests-toolbelt
|
|
16
16
|
Requires-Dist: pandas>=1.2.5
|
|
17
|
-
Requires-Dist: pydantic
|
|
17
|
+
Requires-Dist: pydantic<2,>=1.9.0
|
|
18
18
|
Requires-Dist: deprecated==1.2.13
|
|
19
19
|
Requires-Dist: tqdm
|
|
20
20
|
Requires-Dist: simplejson>=3.17.0
|
|
@@ -42,10 +42,29 @@ Documentation for the API can be found [here](https://docs.fiddler.ai/reference/
|
|
|
42
42
|
|
|
43
43
|
Version History
|
|
44
44
|
-------------
|
|
45
|
+
### 2.3.0
|
|
46
|
+
- #### **New Features**
|
|
47
|
+
- Added support for creating alerts on the `Frequency` metric.
|
|
48
|
+
- #### **Modifications**
|
|
49
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
50
|
+
|
|
51
|
+
### 2.2.1
|
|
52
|
+
- #### **Modifications**
|
|
53
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
45
54
|
|
|
46
55
|
### 2.2.0
|
|
47
|
-
- #### **
|
|
48
|
-
-
|
|
56
|
+
- #### **Modifications**
|
|
57
|
+
- add_custom_metric() supports an optional `description` parameter
|
|
58
|
+
- `fql` is renamed to `definition` in add_custom_metric()
|
|
59
|
+
- A new get_custom_metric() function to get details about a single custom metric.
|
|
60
|
+
|
|
61
|
+
### 2.1.2
|
|
62
|
+
- #### **Modifications**
|
|
63
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
64
|
+
|
|
65
|
+
### 2.1.1
|
|
66
|
+
- #### **Modifications**
|
|
67
|
+
- Update `pyarrow` requirement to `7.0.0`.
|
|
49
68
|
|
|
50
69
|
### 2.1.0
|
|
51
70
|
- #### **New Features**
|
|
@@ -56,6 +75,14 @@ Version History
|
|
|
56
75
|
- `DatasetDataSource` and `EventIdDataSource` will take `dataset_id` instead of `dataset_name`
|
|
57
76
|
- `list_baselines()` to return baseline names instead of baseline objects
|
|
58
77
|
|
|
78
|
+
### 2.0.8
|
|
79
|
+
- #### **Modifications**
|
|
80
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
81
|
+
|
|
82
|
+
### 2.0.7
|
|
83
|
+
- #### **Modifications**
|
|
84
|
+
- Support string metric types for alert creation, for server 23.7.
|
|
85
|
+
|
|
59
86
|
### 2.0.6
|
|
60
87
|
- #### **Modifications**
|
|
61
88
|
- Update `pyarrow` requirement to `7.0.0`.
|
|
@@ -1,26 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: fiddler-client
|
|
3
|
-
Version: 2.2.0.dev3
|
|
4
|
-
Summary: Python client for Fiddler Service
|
|
5
|
-
Home-page: https://fiddler.ai
|
|
6
|
-
Author: Fiddler Labs
|
|
7
|
-
Classifier: Programming Language :: Python :: 3
|
|
8
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
|
9
|
-
Classifier: Operating System :: OS Independent
|
|
10
|
-
Requires-Python: >3.6.3
|
|
11
|
-
Description-Content-Type: text/markdown
|
|
12
|
-
License-File: LICENSE.txt
|
|
13
|
-
Requires-Dist: pip>=21.0
|
|
14
|
-
Requires-Dist: requests<3
|
|
15
|
-
Requires-Dist: requests-toolbelt
|
|
16
|
-
Requires-Dist: pandas>=1.2.5
|
|
17
|
-
Requires-Dist: pydantic==1.9.0
|
|
18
|
-
Requires-Dist: deprecated==1.2.13
|
|
19
|
-
Requires-Dist: tqdm
|
|
20
|
-
Requires-Dist: simplejson>=3.17.0
|
|
21
|
-
Requires-Dist: pyarrow>=7.0.0
|
|
22
|
-
Requires-Dist: pyyaml
|
|
23
|
-
|
|
24
1
|
Fiddler Client
|
|
25
2
|
=============
|
|
26
3
|
|
|
@@ -42,10 +19,29 @@ Documentation for the API can be found [here](https://docs.fiddler.ai/reference/
|
|
|
42
19
|
|
|
43
20
|
Version History
|
|
44
21
|
-------------
|
|
22
|
+
### 2.3.0
|
|
23
|
+
- #### **New Features**
|
|
24
|
+
- Added support for creating alerts on the `Frequency` metric.
|
|
25
|
+
- #### **Modifications**
|
|
26
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
27
|
+
|
|
28
|
+
### 2.2.1
|
|
29
|
+
- #### **Modifications**
|
|
30
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
45
31
|
|
|
46
32
|
### 2.2.0
|
|
47
|
-
- #### **
|
|
48
|
-
-
|
|
33
|
+
- #### **Modifications**
|
|
34
|
+
- add_custom_metric() supports an optional `description` parameter
|
|
35
|
+
- `fql` is renamed to `definition` in add_custom_metric()
|
|
36
|
+
- A new get_custom_metric() function to get details about a single custom metric.
|
|
37
|
+
|
|
38
|
+
### 2.1.2
|
|
39
|
+
- #### **Modifications**
|
|
40
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
41
|
+
|
|
42
|
+
### 2.1.1
|
|
43
|
+
- #### **Modifications**
|
|
44
|
+
- Update `pyarrow` requirement to `7.0.0`.
|
|
49
45
|
|
|
50
46
|
### 2.1.0
|
|
51
47
|
- #### **New Features**
|
|
@@ -56,6 +52,14 @@ Version History
|
|
|
56
52
|
- `DatasetDataSource` and `EventIdDataSource` will take `dataset_id` instead of `dataset_name`
|
|
57
53
|
- `list_baselines()` to return baseline names instead of baseline objects
|
|
58
54
|
|
|
55
|
+
### 2.0.8
|
|
56
|
+
- #### **Modifications**
|
|
57
|
+
- Relax pydantic version to allow any version between 1.9 and 2
|
|
58
|
+
|
|
59
|
+
### 2.0.7
|
|
60
|
+
- #### **Modifications**
|
|
61
|
+
- Support string metric types for alert creation, for server 23.7.
|
|
62
|
+
|
|
59
63
|
### 2.0.6
|
|
60
64
|
- #### **Modifications**
|
|
61
65
|
- Update `pyarrow` requirement to `7.0.0`.
|
|
@@ -45,11 +45,11 @@ from fiddler.schema.alert import (
|
|
|
45
45
|
from fiddler.schema.model_deployment import DeploymentParams, DeploymentType
|
|
46
46
|
from fiddler.schemas.custom_features import (
|
|
47
47
|
CustomFeature,
|
|
48
|
+
CustomFeatureType,
|
|
48
49
|
ImageEmbedding,
|
|
49
50
|
Multivariate,
|
|
50
51
|
TextEmbedding,
|
|
51
52
|
VectorFeature,
|
|
52
|
-
CustomFeatureType,
|
|
53
53
|
)
|
|
54
54
|
from fiddler.utils import ColorLogger
|
|
55
55
|
from fiddler.utils.logger import get_logger
|
|
@@ -61,9 +61,6 @@ from fiddler.utils.validator import (
|
|
|
61
61
|
|
|
62
62
|
logger = get_logger(__name__)
|
|
63
63
|
|
|
64
|
-
SUPPORTED_API_VERSIONS = ['v2']
|
|
65
|
-
|
|
66
|
-
|
|
67
64
|
__all__ = [
|
|
68
65
|
'__version__',
|
|
69
66
|
'BatchPublishType',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.3.0'
|
|
@@ -54,6 +54,7 @@ class AlertMixin:
|
|
|
54
54
|
alert_type: Optional[AlertType] = None,
|
|
55
55
|
baseline_id: Optional[str] = None,
|
|
56
56
|
compare_period: Optional[ComparePeriod] = None,
|
|
57
|
+
category: Optional[str] = None,
|
|
57
58
|
column: Optional[str] = None,
|
|
58
59
|
columns: Optional[List[str]] = None,
|
|
59
60
|
warning_threshold: Optional[float] = None,
|
|
@@ -146,6 +147,7 @@ class AlertMixin:
|
|
|
146
147
|
alert_type=alert_type,
|
|
147
148
|
metric=metric,
|
|
148
149
|
metric_id=metric,
|
|
150
|
+
category=category,
|
|
149
151
|
compare_to=compare_to,
|
|
150
152
|
compare_period=compare_period,
|
|
151
153
|
priority=priority,
|
|
@@ -156,6 +158,8 @@ class AlertMixin:
|
|
|
156
158
|
time_bucket=bin_size.value[0],
|
|
157
159
|
bin_size=bin_size.value[1],
|
|
158
160
|
notifications=notifications_config,
|
|
161
|
+
feature_name=None,
|
|
162
|
+
feature_names=None,
|
|
159
163
|
)
|
|
160
164
|
|
|
161
165
|
if columns and not match_semver(
|
|
@@ -4,19 +4,17 @@ from urllib.parse import urljoin
|
|
|
4
4
|
from fiddler._version import __version__
|
|
5
5
|
from fiddler.api.alert_mixin import AlertMixin
|
|
6
6
|
from fiddler.api.baseline_mixin import BaselineMixin
|
|
7
|
+
from fiddler.api.custom_metrics_mixin import CustomMetricsMixin
|
|
7
8
|
|
|
8
9
|
# @todo: This is v1 implementation needs to have a proper v2 approach
|
|
9
10
|
from fiddler.api.dataset_mixin import DatasetMixin
|
|
10
11
|
from fiddler.api.events_mixin import EventsMixin
|
|
11
12
|
from fiddler.api.explainability_mixin import ExplainabilityMixin
|
|
12
|
-
from fiddler.api.generate_schema_mixin import GenerateSchemaMixin
|
|
13
13
|
from fiddler.api.job_mixin import JobMixin
|
|
14
14
|
from fiddler.api.model_deployment_mixin import ModelDeploymentMixin
|
|
15
15
|
from fiddler.api.model_mixin import ModelMixin
|
|
16
16
|
from fiddler.api.project_mixin import ProjectMixin
|
|
17
17
|
from fiddler.api.webhooks_mixin import WebhookMixin
|
|
18
|
-
from fiddler.api.custom_metrics_mixin import CustomMetricsMixin
|
|
19
|
-
from fiddler.api.segments_mixin import SegmentsMixin
|
|
20
18
|
from fiddler.constants import (
|
|
21
19
|
CURRENT_API_VERSION,
|
|
22
20
|
FIDDLER_CLIENT_VERSION_HEADER,
|
|
@@ -41,10 +39,8 @@ class FiddlerClient(
|
|
|
41
39
|
AlertMixin,
|
|
42
40
|
ExplainabilityMixin,
|
|
43
41
|
ModelDeploymentMixin,
|
|
44
|
-
GenerateSchemaMixin,
|
|
45
42
|
WebhookMixin,
|
|
46
43
|
CustomMetricsMixin,
|
|
47
|
-
SegmentsMixin
|
|
48
44
|
):
|
|
49
45
|
def __init__(
|
|
50
46
|
self,
|
|
@@ -34,7 +34,7 @@ class EventsMixin:
|
|
|
34
34
|
model_name: str,
|
|
35
35
|
events_path: Path,
|
|
36
36
|
batch_id: Optional[str] = None,
|
|
37
|
-
events_schema: Optional[
|
|
37
|
+
events_schema: Optional[dict] = None,
|
|
38
38
|
id_field: Optional[str] = None,
|
|
39
39
|
is_update: Optional[bool] = None,
|
|
40
40
|
timestamp_field: Optional[str] = None,
|
|
@@ -181,12 +181,12 @@ class EventsMixin:
|
|
|
181
181
|
|
|
182
182
|
# Either batch_source or events_path can be given for _publish_events_batch_from_file
|
|
183
183
|
if batch_source is None and events_path is None:
|
|
184
|
-
raise ValueError(
|
|
184
|
+
raise ValueError('`batch_source` parameter is required.')
|
|
185
185
|
|
|
186
186
|
if timestamp_format:
|
|
187
187
|
if type(timestamp_format) is not FiddlerTimestamp:
|
|
188
188
|
raise ValueError(
|
|
189
|
-
|
|
189
|
+
'timestamp_format format is not of type FiddlerTimestamp'
|
|
190
190
|
)
|
|
191
191
|
timestamp_format = FiddlerTimestamp(timestamp_format.value)
|
|
192
192
|
if type(batch_source) == pd.DataFrame and (
|
|
@@ -235,7 +235,7 @@ class EventsMixin:
|
|
|
235
235
|
event: dict,
|
|
236
236
|
event_id: Optional[str] = None,
|
|
237
237
|
update_event: Optional[bool] = None,
|
|
238
|
-
event_timestamp: Optional[
|
|
238
|
+
event_timestamp: Optional[str] = None,
|
|
239
239
|
timestamp_format: FiddlerTimestamp = FiddlerTimestamp.INFER,
|
|
240
240
|
casting_type: Optional[bool] = False,
|
|
241
241
|
dry_run: Optional[bool] = False,
|
|
@@ -263,7 +263,7 @@ class EventsMixin:
|
|
|
263
263
|
if timestamp_format:
|
|
264
264
|
if type(timestamp_format) is not FiddlerTimestamp:
|
|
265
265
|
raise ValueError(
|
|
266
|
-
|
|
266
|
+
'timestamp_format format is not of type FiddlerTimestamp'
|
|
267
267
|
)
|
|
268
268
|
timestamp_format = FiddlerTimestamp(timestamp_format.value)
|
|
269
269
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from http import HTTPStatus
|
|
2
|
-
from typing import List
|
|
2
|
+
from typing import Dict, List
|
|
3
3
|
|
|
4
4
|
from pydantic import parse_obj_as
|
|
5
5
|
|
|
@@ -7,10 +7,7 @@ from fiddler.libs.http_client import RequestClient
|
|
|
7
7
|
from fiddler.schema.webhook import Webhook
|
|
8
8
|
from fiddler.utils.decorators import handle_api_error_response
|
|
9
9
|
from fiddler.utils.logger import get_logger
|
|
10
|
-
from fiddler.utils.response_handler import
|
|
11
|
-
APIResponseHandler,
|
|
12
|
-
PaginatedResponseHandler,
|
|
13
|
-
)
|
|
10
|
+
from fiddler.utils.response_handler import APIResponseHandler, PaginatedResponseHandler
|
|
14
11
|
|
|
15
12
|
logger = get_logger(__name__)
|
|
16
13
|
|
|
@@ -41,7 +38,7 @@ class WebhookMixin:
|
|
|
41
38
|
data=request_body,
|
|
42
39
|
)
|
|
43
40
|
if response.status_code == HTTPStatus.OK:
|
|
44
|
-
logger.info(
|
|
41
|
+
logger.info('Webhook created successfully.')
|
|
45
42
|
else:
|
|
46
43
|
logger.info('Webhook creation unsuccessful')
|
|
47
44
|
return Webhook.deserialize(APIResponseHandler(response))
|
|
@@ -83,7 +80,11 @@ class WebhookMixin:
|
|
|
83
80
|
|
|
84
81
|
:returns: Updated `Webhook` object.
|
|
85
82
|
"""
|
|
86
|
-
request_body
|
|
83
|
+
request_body: Dict[str, str] = {
|
|
84
|
+
'name': name,
|
|
85
|
+
'url': url,
|
|
86
|
+
'provider': provider,
|
|
87
|
+
}
|
|
87
88
|
response = self.client.patch(
|
|
88
89
|
url=f'webhooks/{uuid}',
|
|
89
90
|
data=request_body,
|
|
@@ -148,6 +148,7 @@ class AlertRulePayload(BaseDataSchema):
|
|
|
148
148
|
metric_id: Union[Metric, str]
|
|
149
149
|
feature_name: Optional[str]
|
|
150
150
|
feature_names: Optional[List[str]]
|
|
151
|
+
category: Optional[str]
|
|
151
152
|
priority: Priority
|
|
152
153
|
compare_to: CompareTo
|
|
153
154
|
baseline_name: Optional[str]
|
|
@@ -176,6 +177,7 @@ class AlertRule(BaseDataSchema):
|
|
|
176
177
|
metric: str
|
|
177
178
|
column: Optional[str] = Field(alias='feature_name', default=None)
|
|
178
179
|
columns: Optional[List[str]] = Field(alias='feature_names', default=None)
|
|
180
|
+
category: Optional[str]
|
|
179
181
|
baseline_name: Optional[str]
|
|
180
182
|
priority: Priority
|
|
181
183
|
compare_to: CompareTo
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from fiddler3.configs import DEFAULT_CONNECTION_TIMEOUT
|
|
4
|
+
from fiddler3.connection import Connection
|
|
5
|
+
from fiddler3.entities import * # noqa
|
|
6
|
+
from fiddler3.exceptions import * # noqa
|
|
7
|
+
from fiddler3.schemas import * # noqa
|
|
8
|
+
|
|
9
|
+
# Global connection object
|
|
10
|
+
connection: Connection | None = None
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def init(
|
|
14
|
+
url: str,
|
|
15
|
+
token: str,
|
|
16
|
+
proxies: dict | None = None,
|
|
17
|
+
timeout: int = DEFAULT_CONNECTION_TIMEOUT,
|
|
18
|
+
verify: bool = True,
|
|
19
|
+
validate: bool = True,
|
|
20
|
+
) -> None:
|
|
21
|
+
"""
|
|
22
|
+
Initiate Python Client Connection
|
|
23
|
+
:param url: URL of Fiddler Platform
|
|
24
|
+
:param token: Authorization token
|
|
25
|
+
:param proxies: Dictionary mapping protocol to the URL of the proxy
|
|
26
|
+
:param timeout: Seconds to wait for the server to send data before giving up
|
|
27
|
+
:param verify: Controls whether we verify the server’s TLS certificate
|
|
28
|
+
:param validate: Whether to validate the server/client version compatibility.
|
|
29
|
+
Some functionalities might not work if this is turned off.
|
|
30
|
+
"""
|
|
31
|
+
global connection
|
|
32
|
+
connection = Connection(
|
|
33
|
+
url=url,
|
|
34
|
+
token=token,
|
|
35
|
+
proxies=proxies,
|
|
36
|
+
timeout=timeout,
|
|
37
|
+
verify=verify,
|
|
38
|
+
validate=validate,
|
|
39
|
+
)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from functools import cached_property
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
from fiddler3.configs import DEFAULT_CONNECTION_TIMEOUT, MIN_SERVER_VERSION
|
|
7
|
+
from fiddler3.constants.common import CLIENT_NAME, FIDDLER_CLIENT_VERSION_HEADER
|
|
8
|
+
from fiddler3.decorators import handle_api_error
|
|
9
|
+
from fiddler3.exceptions import IncompatibleClient
|
|
10
|
+
from fiddler3.libs.http_client import RequestClient
|
|
11
|
+
from fiddler3.schemas.server_info import ServerInfo, Version
|
|
12
|
+
from fiddler3.utils.logger import get_logger
|
|
13
|
+
from fiddler3.utils.version import match_semver
|
|
14
|
+
from fiddler3.version import __version__
|
|
15
|
+
|
|
16
|
+
logger = get_logger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Connection:
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
url: str,
|
|
23
|
+
token: str,
|
|
24
|
+
proxies: dict | None = None,
|
|
25
|
+
timeout: int = DEFAULT_CONNECTION_TIMEOUT,
|
|
26
|
+
verify: bool = True,
|
|
27
|
+
validate: bool = True,
|
|
28
|
+
) -> None:
|
|
29
|
+
"""
|
|
30
|
+
Initiate connection to Fiddler Platform
|
|
31
|
+
:param url: URL of Fiddler Platform
|
|
32
|
+
:param token: Authorization token
|
|
33
|
+
:param proxies: Dictionary mapping protocol to the URL of the proxy
|
|
34
|
+
:param timeout: Seconds to wait for the server to send data before giving up
|
|
35
|
+
:param verify: Controls whether we verify the server’s TLS certificate
|
|
36
|
+
:param validate: Whether to validate the server/client version compatibility.
|
|
37
|
+
Some functionalities might not work if this is turned off.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
self.url = url
|
|
41
|
+
self.token = token
|
|
42
|
+
self.proxies = proxies
|
|
43
|
+
self.timeout = timeout
|
|
44
|
+
self.verify = verify
|
|
45
|
+
|
|
46
|
+
if not url:
|
|
47
|
+
raise ValueError('Please pass a valid url')
|
|
48
|
+
|
|
49
|
+
if not token:
|
|
50
|
+
raise ValueError('Please pass a valid token')
|
|
51
|
+
|
|
52
|
+
self.request_headers = {
|
|
53
|
+
'Authorization': f'Bearer {token}',
|
|
54
|
+
FIDDLER_CLIENT_VERSION_HEADER: __version__,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if validate:
|
|
58
|
+
self._check_server_version()
|
|
59
|
+
self._check_version_compatibility()
|
|
60
|
+
|
|
61
|
+
@cached_property
|
|
62
|
+
def client(self) -> RequestClient:
|
|
63
|
+
"""Request client instance"""
|
|
64
|
+
return RequestClient(
|
|
65
|
+
base_url=self.url,
|
|
66
|
+
headers=self.request_headers,
|
|
67
|
+
proxies=self.proxies,
|
|
68
|
+
verify=self.verify,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
@cached_property
|
|
72
|
+
def server_info(self) -> ServerInfo:
|
|
73
|
+
"""Server info instance"""
|
|
74
|
+
return self._get_server_info()
|
|
75
|
+
|
|
76
|
+
@cached_property
|
|
77
|
+
def server_version(self) -> Version:
|
|
78
|
+
"""Server semver version"""
|
|
79
|
+
return self.server_info.server_version
|
|
80
|
+
|
|
81
|
+
@cached_property
|
|
82
|
+
def organization_name(self) -> str:
|
|
83
|
+
"""Organization name"""
|
|
84
|
+
return self.server_info.organization.name
|
|
85
|
+
|
|
86
|
+
@cached_property
|
|
87
|
+
def organization_id(self) -> UUID:
|
|
88
|
+
"""Organization id"""
|
|
89
|
+
return self.server_info.organization.id
|
|
90
|
+
|
|
91
|
+
@handle_api_error
|
|
92
|
+
def _get_server_info(self) -> ServerInfo:
|
|
93
|
+
"""Get server info"""
|
|
94
|
+
response = self.client.get(
|
|
95
|
+
url='/v3/server-info',
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return ServerInfo(**response.json().get('data'))
|
|
99
|
+
|
|
100
|
+
@handle_api_error
|
|
101
|
+
def _check_version_compatibility(self) -> None:
|
|
102
|
+
"""Check whether Client version is compatible with Fiddler Platform version"""
|
|
103
|
+
|
|
104
|
+
self.client.get(
|
|
105
|
+
url='/v3/version-compatibility',
|
|
106
|
+
params={
|
|
107
|
+
'client_version': __version__,
|
|
108
|
+
'client_name': CLIENT_NAME,
|
|
109
|
+
},
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
def _check_server_version(self) -> None:
|
|
113
|
+
"""Check whether Fiddler Platform version is compatible with Client version"""
|
|
114
|
+
if match_semver(self.server_version, f'>={MIN_SERVER_VERSION}'):
|
|
115
|
+
return
|
|
116
|
+
|
|
117
|
+
raise IncompatibleClient(server_version=str(self.server_version))
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import enum
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@enum.unique
|
|
7
|
+
class ModelInputType(str, enum.Enum):
|
|
8
|
+
"""Input data type used by the model"""
|
|
9
|
+
|
|
10
|
+
TABULAR = 'structured'
|
|
11
|
+
TEXT = 'text'
|
|
12
|
+
MIXED = 'mixed'
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@enum.unique
|
|
16
|
+
class ModelTask(str, enum.Enum):
|
|
17
|
+
"""Task the model is designed to address"""
|
|
18
|
+
|
|
19
|
+
BINARY_CLASSIFICATION = 'binary_classification'
|
|
20
|
+
MULTICLASS_CLASSIFICATION = 'multiclass_classification'
|
|
21
|
+
REGRESSION = 'regression'
|
|
22
|
+
RANKING = 'ranking'
|
|
23
|
+
LLM = 'llm'
|
|
24
|
+
NOT_SET = 'not_set'
|
|
25
|
+
|
|
26
|
+
def is_classification(self) -> bool:
|
|
27
|
+
return self in {
|
|
28
|
+
ModelTask.BINARY_CLASSIFICATION,
|
|
29
|
+
ModelTask.MULTICLASS_CLASSIFICATION,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
def is_regression(self) -> bool:
|
|
33
|
+
return self == ModelTask.REGRESSION
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@enum.unique
|
|
37
|
+
class DataType(str, enum.Enum):
|
|
38
|
+
"""Data types supported for model columns"""
|
|
39
|
+
|
|
40
|
+
FLOAT = 'float'
|
|
41
|
+
INTEGER = 'int'
|
|
42
|
+
BOOLEAN = 'bool'
|
|
43
|
+
STRING = 'str'
|
|
44
|
+
CATEGORY = 'category'
|
|
45
|
+
TIMESTAMP = 'timestamp'
|
|
46
|
+
VECTOR = 'vector'
|
|
47
|
+
|
|
48
|
+
def is_numeric(self) -> bool:
|
|
49
|
+
return self in {DataType.INTEGER, DataType.FLOAT}
|
|
50
|
+
|
|
51
|
+
def is_bool_or_cat(self) -> bool:
|
|
52
|
+
return self in {DataType.BOOLEAN, DataType.CATEGORY}
|
|
53
|
+
|
|
54
|
+
def is_vector(self) -> bool:
|
|
55
|
+
return self == DataType.VECTOR
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@enum.unique
|
|
59
|
+
class ArtifactStatus(str, enum.Enum):
|
|
60
|
+
"""Artifact Status"""
|
|
61
|
+
|
|
62
|
+
NO_MODEL = 'no_model'
|
|
63
|
+
SURROGATE = 'surrogate'
|
|
64
|
+
USER_UPLOADED = 'user_uploaded'
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
from functools import wraps
|
|
2
|
+
from http import HTTPStatus
|
|
3
|
+
from typing import Any, Callable, TypeVar, cast
|
|
4
|
+
|
|
5
|
+
import requests
|
|
6
|
+
|
|
7
|
+
from fiddler3.exceptions import ApiError, Conflict, HttpError, NotFound, Unsupported
|
|
8
|
+
from fiddler3.schemas.response import ErrorResponse
|
|
9
|
+
from fiddler3.utils.logger import get_logger
|
|
10
|
+
|
|
11
|
+
logger = get_logger(__name__)
|
|
12
|
+
|
|
13
|
+
_WrappedFuncType = TypeVar( # pylint: disable=invalid-name
|
|
14
|
+
'_WrappedFuncType', bound=Callable[..., Any]
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def handle_api_error(func: _WrappedFuncType) -> _WrappedFuncType:
|
|
19
|
+
@wraps(func)
|
|
20
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
21
|
+
try:
|
|
22
|
+
return func(*args, **kwargs)
|
|
23
|
+
except requests.JSONDecodeError as e:
|
|
24
|
+
raise HttpError(message=f'Invalid JSON response - {e.doc}') # type: ignore
|
|
25
|
+
except requests.HTTPError as e:
|
|
26
|
+
logger.error(
|
|
27
|
+
'HTTP request to %s failed with %s - %s',
|
|
28
|
+
getattr(e.request, 'url', 'unknown'),
|
|
29
|
+
getattr(e.response, 'status_code', 'unknown'),
|
|
30
|
+
getattr(e.response, 'content', 'missing'),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
status_code = e.response.status_code or HTTPStatus.INTERNAL_SERVER_ERROR
|
|
34
|
+
|
|
35
|
+
if status_code == HTTPStatus.METHOD_NOT_ALLOWED:
|
|
36
|
+
raise Unsupported()
|
|
37
|
+
|
|
38
|
+
try:
|
|
39
|
+
error_resp = ErrorResponse(**e.response.json())
|
|
40
|
+
except requests.JSONDecodeError:
|
|
41
|
+
raise HttpError(
|
|
42
|
+
message=f'Invalid response content-type - {e.response.content}'
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
if status_code == HTTPStatus.CONFLICT:
|
|
46
|
+
raise Conflict(error_resp.error)
|
|
47
|
+
if status_code == HTTPStatus.NOT_FOUND:
|
|
48
|
+
raise NotFound(error_resp.error)
|
|
49
|
+
|
|
50
|
+
raise ApiError(error_resp.error)
|
|
51
|
+
|
|
52
|
+
return cast(_WrappedFuncType, wrapper)
|