arize 8.0.0a15__tar.gz → 8.0.0a16__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.
- {arize-8.0.0a15 → arize-8.0.0a16}/PKG-INFO +3 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/pyproject.toml +10 -1
- {arize-8.0.0a15/src/arize/datasets → arize-8.0.0a16/src/arize}/__init__.py +19 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_flight/client.py +157 -41
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_flight/types.py +1 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/__init__.py +5 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/api/datasets_api.py +6 -6
- arize-8.0.0a16/src/arize/_generated/api_client/api/experiments_api.py +1468 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/api_client.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/configuration.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/exceptions.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/__init__.py +3 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/dataset.py +2 -2
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/dataset_version.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/datasets_create_request.py +3 -3
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/datasets_list200_response.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/datasets_list_examples200_response.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/error.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/experiment.py +6 -6
- arize-8.0.0a16/src/arize/_generated/api_client/models/experiments_create_request.py +98 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/models/experiments_list200_response.py +1 -1
- arize-8.0.0a16/src/arize/_generated/api_client/models/experiments_runs_list200_response.py +92 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/rest.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_dataset.py +2 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_dataset_version.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_datasets_api.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_datasets_create_request.py +2 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_datasets_list200_response.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_datasets_list_examples200_response.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_error.py +1 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_experiment.py +6 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_experiments_api.py +23 -2
- arize-8.0.0a16/src/arize/_generated/api_client/test/test_experiments_create_request.py +61 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/test_experiments_list200_response.py +1 -1
- arize-8.0.0a16/src/arize/_generated/api_client/test/test_experiments_runs_list200_response.py +56 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client_README.md +13 -8
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/client.py +19 -2
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/config.py +50 -3
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/constants/config.py +8 -2
- arize-8.0.0a16/src/arize/constants/openinference.py +14 -0
- arize-8.0.0a16/src/arize/constants/pyarrow.py +1 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/datasets/client.py +106 -19
- arize-8.0.0a16/src/arize/datasets/errors.py +61 -0
- arize-8.0.0a16/src/arize/datasets/validation.py +46 -0
- arize-8.0.0a16/src/arize/experiments/client.py +465 -0
- arize-8.0.0a16/src/arize/experiments/evaluators/base.py +255 -0
- arize-8.0.0a16/src/arize/experiments/evaluators/exceptions.py +10 -0
- arize-8.0.0a16/src/arize/experiments/evaluators/executors.py +502 -0
- arize-8.0.0a16/src/arize/experiments/evaluators/rate_limiters.py +277 -0
- arize-8.0.0a16/src/arize/experiments/evaluators/types.py +122 -0
- arize-8.0.0a16/src/arize/experiments/evaluators/utils.py +198 -0
- arize-8.0.0a16/src/arize/experiments/functions.py +920 -0
- arize-8.0.0a16/src/arize/experiments/tracing.py +276 -0
- arize-8.0.0a16/src/arize/experiments/types.py +394 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/models/client.py +4 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/client.py +16 -20
- arize-8.0.0a16/src/arize/spans/validation/spans/__init__.py +0 -0
- arize-8.0.0a16/src/arize/utils/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/utils/arrow.py +4 -3
- arize-8.0.0a16/src/arize/utils/openinference_conversion.py +56 -0
- arize-8.0.0a16/src/arize/utils/proto.py +13 -0
- arize-8.0.0a16/src/arize/utils/size.py +22 -0
- arize-8.0.0a16/src/arize/version.py +1 -0
- arize-8.0.0a15/src/arize/__init__.py +0 -20
- arize-8.0.0a15/src/arize/_generated/api_client/api/experiments_api.py +0 -605
- arize-8.0.0a15/src/arize/experiments/client.py +0 -10
- arize-8.0.0a15/src/arize/version.py +0 -1
- {arize-8.0.0a15 → arize-8.0.0a16}/.gitignore +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/LICENSE.md +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/README.md +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_exporter/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_exporter/client.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_exporter/parsers/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_exporter/parsers/tracing_data_parser.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_exporter/validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_flight/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/api/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/api_response.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/api_client/test/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/protocol/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/protocol/flight/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/protocol/flight/export_pb2.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/protocol/flight/ingest_pb2.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/protocol/rec/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_generated/protocol/rec/public_pb2.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/_lazy.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/constants/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/constants/ml.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/constants/model_mapping.json +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/constants/spans.py +0 -0
- {arize-8.0.0a15/src/arize/exceptions → arize-8.0.0a16/src/arize/datasets}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/auto_generator.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/base_generators.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/constants.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/cv_generators.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/errors.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/nlp_generators.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/tabular_generators.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/embeddings/usecases.py +0 -0
- {arize-8.0.0a15/src/arize/experiments → arize-8.0.0a16/src/arize/exceptions}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/exceptions/auth.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/exceptions/base.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/exceptions/models.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/exceptions/parameters.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/exceptions/spaces.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/exceptions/types.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/exceptions/values.py +0 -0
- {arize-8.0.0a15/src/arize/models → arize-8.0.0a16/src/arize/experiments}/__init__.py +0 -0
- {arize-8.0.0a15/src/arize/models/batch_validation → arize-8.0.0a16/src/arize/experiments/evaluators}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/logging.py +0 -0
- {arize-8.0.0a15/src/arize/models/surrogate_explainer → arize-8.0.0a16/src/arize/models}/__init__.py +0 -0
- {arize-8.0.0a15/src/arize/spans → arize-8.0.0a16/src/arize/models/batch_validation}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/models/batch_validation/errors.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/models/batch_validation/validator.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/models/bounded_executor.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/models/casting.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/models/proto.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/models/stream_validation.py +0 -0
- {arize-8.0.0a15/src/arize/spans/validation → arize-8.0.0a16/src/arize/models/surrogate_explainer}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/models/surrogate_explainer/mimic.py +0 -0
- {arize-8.0.0a15/src/arize/spans/validation/annotations → arize-8.0.0a16/src/arize/spans}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/columns.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/conversion.py +0 -0
- {arize-8.0.0a15/src/arize/spans/validation/common → arize-8.0.0a16/src/arize/spans/validation}/__init__.py +0 -0
- {arize-8.0.0a15/src/arize/spans/validation/evals → arize-8.0.0a16/src/arize/spans/validation/annotations}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/annotations/annotations_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/annotations/dataframe_form_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/annotations/value_validation.py +0 -0
- {arize-8.0.0a15/src/arize/spans/validation/spans → arize-8.0.0a16/src/arize/spans/validation/common}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/common/argument_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/common/dataframe_form_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/common/errors.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/common/value_validation.py +0 -0
- {arize-8.0.0a15/src/arize/utils → arize-8.0.0a16/src/arize/spans/validation/evals}/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/evals/dataframe_form_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/evals/evals_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/evals/value_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/metadata/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/metadata/argument_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/metadata/dataframe_form_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/metadata/value_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/spans/dataframe_form_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/spans/spans_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/spans/validation/spans/value_validation.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/types.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/utils/dataframe.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/utils/online_tasks/__init__.py +0 -0
- {arize-8.0.0a15 → arize-8.0.0a16}/src/arize/utils/online_tasks/dataframe_preprocessor.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arize
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.0a16
|
|
4
4
|
Summary: A helper library to interact with Arize AI APIs
|
|
5
5
|
Project-URL: Homepage, https://arize.com
|
|
6
6
|
Project-URL: Documentation, https://docs.arize.com/arize
|
|
@@ -35,7 +35,9 @@ Requires-Dist: tokenizers<1,>=0.13; extra == 'auto-embeddings'
|
|
|
35
35
|
Requires-Dist: torch<3,>=1.13; extra == 'auto-embeddings'
|
|
36
36
|
Requires-Dist: transformers<5,>=4.25; extra == 'auto-embeddings'
|
|
37
37
|
Provides-Extra: datasets-experiments
|
|
38
|
+
Requires-Dist: numpy>=2.0.0; extra == 'datasets-experiments'
|
|
38
39
|
Requires-Dist: pydantic; extra == 'datasets-experiments'
|
|
40
|
+
Requires-Dist: wrapt<2.0.0,>=1.0.0; extra == 'datasets-experiments'
|
|
39
41
|
Provides-Extra: dev
|
|
40
42
|
Requires-Dist: pytest==8.4.2; extra == 'dev'
|
|
41
43
|
Requires-Dist: ruff==0.13.2; extra == 'dev'
|
|
@@ -38,7 +38,7 @@ dependencies = [
|
|
|
38
38
|
"lazy-imports",
|
|
39
39
|
# "requests_futures==1.0.0",
|
|
40
40
|
# "googleapis_common_protos>=1.51.0,<2",
|
|
41
|
-
# "protobuf>=4.21.0,<
|
|
41
|
+
# "protobuf>=4.21.0,<7",
|
|
42
42
|
# "pyarrow>=0.15.0",
|
|
43
43
|
# "tqdm>=4.60.0,<5",
|
|
44
44
|
# "pydantic>=2.0.0,<3",
|
|
@@ -72,6 +72,15 @@ ml-batch = [
|
|
|
72
72
|
]
|
|
73
73
|
datasets-experiments = [
|
|
74
74
|
"pydantic",
|
|
75
|
+
"numpy>=2.0.0",
|
|
76
|
+
"wrapt>=1.0.0,<2.0.0",
|
|
77
|
+
# "openinference-semantic-conventions>=0.1.21, <1",
|
|
78
|
+
# "opentelemetry-exporter-otlp-proto-common>=1.38.0",
|
|
79
|
+
# "opentelemetry-exporter-otlp-proto-grpc>=1.38.0",
|
|
80
|
+
# "opentelemetry-sdk>=1.38.0",
|
|
81
|
+
#
|
|
82
|
+
# "opentelemetry-api>=1.38.0",
|
|
83
|
+
# "opentelemetry-proto>=1.38.0",
|
|
75
84
|
]
|
|
76
85
|
mimic-explainer = [
|
|
77
86
|
"interpret-community[mimic]>=0.22.0,<1",
|
|
@@ -1,6 +1,24 @@
|
|
|
1
|
+
import logging
|
|
1
2
|
from collections.abc import Mapping
|
|
2
3
|
|
|
3
4
|
from arize._generated.api_client import models
|
|
5
|
+
from arize.client import ArizeClient
|
|
6
|
+
from arize.config import SDKConfiguration
|
|
7
|
+
|
|
8
|
+
# Attach a NullHandler by default in the top-level package
|
|
9
|
+
# so that if no configuration is installed, nothing explodes.
|
|
10
|
+
logging.getLogger("arize").addHandler(logging.NullHandler())
|
|
11
|
+
|
|
12
|
+
# Opt-in env-based logging
|
|
13
|
+
try:
|
|
14
|
+
from .logging import auto_configure_from_env
|
|
15
|
+
|
|
16
|
+
auto_configure_from_env()
|
|
17
|
+
except Exception:
|
|
18
|
+
# Never let logging config crash imports
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
__all__ = ["ArizeClient", "SDKConfiguration"]
|
|
4
22
|
|
|
5
23
|
|
|
6
24
|
def make_to_df(field_name: str):
|
|
@@ -68,3 +86,4 @@ def make_to_df(field_name: str):
|
|
|
68
86
|
|
|
69
87
|
models.DatasetsList200Response.to_df = make_to_df("datasets") # type: ignore[attr-defined]
|
|
70
88
|
models.DatasetsListExamples200Response.to_df = make_to_df("examples") # type: ignore[attr-defined]
|
|
89
|
+
models.ExperimentsList200Response.to_df = make_to_df("experiments") # type: ignore[attr-defined]
|
|
@@ -4,7 +4,8 @@ from __future__ import annotations
|
|
|
4
4
|
import base64
|
|
5
5
|
import logging
|
|
6
6
|
from dataclasses import dataclass, field
|
|
7
|
-
from
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Tuple
|
|
8
9
|
|
|
9
10
|
from google.protobuf import json_format
|
|
10
11
|
from pyarrow import flight
|
|
@@ -12,12 +13,15 @@ from pyarrow import flight
|
|
|
12
13
|
from arize._flight.types import FlightRequestType
|
|
13
14
|
from arize._generated.protocol.flight import ingest_pb2 as flight_ing_pb2
|
|
14
15
|
from arize._generated.protocol.flight.ingest_pb2 import (
|
|
16
|
+
PostExperimentDataResponse,
|
|
15
17
|
WriteSpanAnnotationResponse,
|
|
16
18
|
WriteSpanAttributesMetadataResponse,
|
|
17
19
|
WriteSpanEvaluationResponse,
|
|
18
20
|
)
|
|
19
21
|
from arize.config import get_python_version
|
|
20
22
|
from arize.logging import log_a_list
|
|
23
|
+
from arize.utils.openinference_conversion import convert_json_str_to_dict
|
|
24
|
+
from arize.utils.proto import get_pb_schema_tracing
|
|
21
25
|
from arize.version import __version__
|
|
22
26
|
|
|
23
27
|
if TYPE_CHECKING:
|
|
@@ -26,21 +30,31 @@ if TYPE_CHECKING:
|
|
|
26
30
|
|
|
27
31
|
BytesPair = Tuple[bytes, bytes]
|
|
28
32
|
Headers = List[BytesPair]
|
|
29
|
-
|
|
33
|
+
FlightPostArrowFileResponse = (
|
|
30
34
|
WriteSpanEvaluationResponse
|
|
31
35
|
| WriteSpanAnnotationResponse
|
|
32
36
|
| WriteSpanAttributesMetadataResponse
|
|
37
|
+
| PostExperimentDataResponse
|
|
33
38
|
)
|
|
34
39
|
|
|
35
40
|
logger = logging.getLogger(__name__)
|
|
36
41
|
|
|
37
42
|
|
|
43
|
+
class FlightActionKey(Enum):
|
|
44
|
+
CREATE_EXPERIMENT_DB_ENTRY = "create_experiment_db_entry"
|
|
45
|
+
# GET_DATASET_VERSION = "get_dataset_version"
|
|
46
|
+
# LIST_DATASETS = "list_datasets"
|
|
47
|
+
# DELETE_DATASET = "delete_dataset"
|
|
48
|
+
# DELETE_EXPERIMENT = "delete_experiment"
|
|
49
|
+
|
|
50
|
+
|
|
38
51
|
@dataclass(frozen=True)
|
|
39
52
|
class ArizeFlightClient:
|
|
40
53
|
api_key: str = field(repr=False)
|
|
41
54
|
host: str
|
|
42
55
|
port: int
|
|
43
56
|
scheme: str
|
|
57
|
+
max_chunksize: int
|
|
44
58
|
request_verify: bool
|
|
45
59
|
|
|
46
60
|
# internal cache for the underlying FlightClient
|
|
@@ -107,17 +121,19 @@ class ArizeFlightClient:
|
|
|
107
121
|
kwargs.setdefault("options", self.call_options)
|
|
108
122
|
return client.get_flight_info(*args, **kwargs)
|
|
109
123
|
|
|
110
|
-
def do_get(self, *args: Any, **kwargs: Any):
|
|
124
|
+
def do_get(self, *args: Any, **kwargs: Any) -> flight.FlightStreamReader:
|
|
111
125
|
client = self._ensure_client()
|
|
112
126
|
kwargs.setdefault("options", self.call_options)
|
|
113
127
|
return client.do_get(*args, **kwargs)
|
|
114
128
|
|
|
115
|
-
def do_put(
|
|
129
|
+
def do_put(
|
|
130
|
+
self, *args: Any, **kwargs: Any
|
|
131
|
+
) -> [flight.FlightStreamWriter, flight.FlightMetadataReader]:
|
|
116
132
|
client = self._ensure_client()
|
|
117
133
|
kwargs.setdefault("options", self.call_options)
|
|
118
134
|
return client.do_put(*args, **kwargs)
|
|
119
135
|
|
|
120
|
-
def do_action(self, *args: Any, **kwargs: Any):
|
|
136
|
+
def do_action(self, *args: Any, **kwargs: Any) -> Iterable[flight.Result]:
|
|
121
137
|
client = self._ensure_client()
|
|
122
138
|
kwargs.setdefault("options", self.call_options)
|
|
123
139
|
return client.do_action(*args, **kwargs)
|
|
@@ -127,20 +143,30 @@ class ArizeFlightClient:
|
|
|
127
143
|
def log_arrow_table(
|
|
128
144
|
self,
|
|
129
145
|
space_id: str,
|
|
130
|
-
project_name: str,
|
|
131
146
|
request_type: FlightRequestType,
|
|
132
147
|
pa_table: pa.Table,
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
148
|
+
project_name: str | None = None,
|
|
149
|
+
dataset_id: str | None = None,
|
|
150
|
+
experiment_name: str | None = None,
|
|
151
|
+
) -> FlightPostArrowFileResponse:
|
|
152
|
+
pa_schema = pa_table.schema
|
|
153
|
+
if request_type in (
|
|
154
|
+
FlightRequestType.EVALUATION,
|
|
155
|
+
FlightRequestType.ANNOTATION,
|
|
156
|
+
FlightRequestType.METADATA,
|
|
157
|
+
):
|
|
158
|
+
proto_schema = get_pb_schema_tracing(project_name=project_name)
|
|
159
|
+
base64_schema = base64.b64encode(proto_schema.SerializeToString())
|
|
160
|
+
pa_schema = append_to_pyarrow_metadata(
|
|
161
|
+
pa_table.schema, {"arize-schema": base64_schema}
|
|
162
|
+
)
|
|
139
163
|
|
|
140
164
|
doput_request = _get_pb_flight_doput_request(
|
|
141
165
|
space_id=space_id,
|
|
142
|
-
model_id=project_name,
|
|
143
166
|
request_type=request_type,
|
|
167
|
+
model_id=project_name,
|
|
168
|
+
dataset_id=dataset_id,
|
|
169
|
+
experiment_name=experiment_name,
|
|
144
170
|
)
|
|
145
171
|
|
|
146
172
|
descriptor = flight.FlightDescriptor.for_command(
|
|
@@ -152,7 +178,7 @@ class ArizeFlightClient:
|
|
|
152
178
|
)
|
|
153
179
|
with flight_writer:
|
|
154
180
|
# write table as stream to flight server
|
|
155
|
-
flight_writer.write_table(pa_table)
|
|
181
|
+
flight_writer.write_table(pa_table, self.max_chunksize)
|
|
156
182
|
# indicate that client has flushed all contents to stream
|
|
157
183
|
flight_writer.done_writing()
|
|
158
184
|
# read response from flight server
|
|
@@ -171,11 +197,13 @@ class ArizeFlightClient:
|
|
|
171
197
|
case FlightRequestType.METADATA:
|
|
172
198
|
res = WriteSpanAttributesMetadataResponse()
|
|
173
199
|
res.ParseFromString(flight_response.to_pybytes())
|
|
200
|
+
case FlightRequestType.LOG_EXPERIMENT_DATA:
|
|
201
|
+
res = PostExperimentDataResponse()
|
|
202
|
+
res.ParseFromString(flight_response.to_pybytes())
|
|
174
203
|
case _:
|
|
175
204
|
raise ValueError(
|
|
176
205
|
f"Unsupported request_type: {request_type}"
|
|
177
206
|
)
|
|
178
|
-
|
|
179
207
|
return res
|
|
180
208
|
except Exception as e:
|
|
181
209
|
logger.exception(f"Error logging arrow table to Arize: {e}")
|
|
@@ -207,7 +235,7 @@ class ArizeFlightClient:
|
|
|
207
235
|
)
|
|
208
236
|
with flight_writer:
|
|
209
237
|
# write table as stream to flight server
|
|
210
|
-
flight_writer.write_table(pa_table)
|
|
238
|
+
flight_writer.write_table(pa_table, self.max_chunksize)
|
|
211
239
|
# indicate that client has flushed all contents to stream
|
|
212
240
|
flight_writer.done_writing()
|
|
213
241
|
# read response from flight server
|
|
@@ -227,6 +255,69 @@ class ArizeFlightClient:
|
|
|
227
255
|
f"Error logging arrow table to Arize: {e}"
|
|
228
256
|
) from e
|
|
229
257
|
|
|
258
|
+
def get_dataset_examples(
|
|
259
|
+
self,
|
|
260
|
+
space_id: str,
|
|
261
|
+
dataset_id: str,
|
|
262
|
+
dataset_version_id: str | None = None,
|
|
263
|
+
):
|
|
264
|
+
# TODO(Kiko): Space ID should not be needed,
|
|
265
|
+
# should work on server tech debt to remove this
|
|
266
|
+
doget_request = flight_ing_pb2.DoGetRequest(
|
|
267
|
+
get_dataset=flight_ing_pb2.GetDatasetRequest(
|
|
268
|
+
space_id=space_id,
|
|
269
|
+
dataset_id=dataset_id,
|
|
270
|
+
dataset_version=dataset_version_id,
|
|
271
|
+
)
|
|
272
|
+
)
|
|
273
|
+
descriptor = flight.Ticket(
|
|
274
|
+
json_format.MessageToJson(doget_request).encode("utf-8")
|
|
275
|
+
)
|
|
276
|
+
try:
|
|
277
|
+
reader = self.do_get(descriptor, options=self.call_options)
|
|
278
|
+
# read all data into pandas dataframe
|
|
279
|
+
df = reader.read_all().to_pandas()
|
|
280
|
+
df = convert_json_str_to_dict(df)
|
|
281
|
+
return df
|
|
282
|
+
except Exception as e:
|
|
283
|
+
logger.exception(f"Failed to get dataset id={dataset_id}")
|
|
284
|
+
raise RuntimeError(f"Failed to get dataset id={dataset_id}") from e
|
|
285
|
+
|
|
286
|
+
def init_experiment(
|
|
287
|
+
self,
|
|
288
|
+
space_id: str,
|
|
289
|
+
dataset_id: str,
|
|
290
|
+
experiment_name: str,
|
|
291
|
+
) -> Tuple[str, str] | None:
|
|
292
|
+
request = flight_ing_pb2.DoActionRequest(
|
|
293
|
+
create_experiment_db_entry=flight_ing_pb2.CreateExperimentDBEntryRequest(
|
|
294
|
+
space_id=space_id,
|
|
295
|
+
dataset_id=dataset_id,
|
|
296
|
+
experiment_name=experiment_name,
|
|
297
|
+
)
|
|
298
|
+
)
|
|
299
|
+
action = flight.Action(
|
|
300
|
+
FlightActionKey.CREATE_EXPERIMENT_DB_ENTRY,
|
|
301
|
+
json_format.MessageToJson(request).encode("utf-8"),
|
|
302
|
+
)
|
|
303
|
+
try:
|
|
304
|
+
response = self.do_action(action, options=self.call_options)
|
|
305
|
+
except Exception as e:
|
|
306
|
+
logger.exception(f"Failed to init experiment {experiment_name}")
|
|
307
|
+
raise RuntimeError(
|
|
308
|
+
f"Failed to init experiment {experiment_name}"
|
|
309
|
+
) from e
|
|
310
|
+
|
|
311
|
+
res = next(response, None)
|
|
312
|
+
if res is None:
|
|
313
|
+
return None
|
|
314
|
+
resp_pb = flight_ing_pb2.CreateExperimentDBEntryResponse()
|
|
315
|
+
resp_pb.ParseFromString(res.body.to_pybytes())
|
|
316
|
+
return (
|
|
317
|
+
resp_pb.experiment_id,
|
|
318
|
+
resp_pb.trace_model_name,
|
|
319
|
+
)
|
|
320
|
+
|
|
230
321
|
|
|
231
322
|
def append_to_pyarrow_metadata(
|
|
232
323
|
pa_schema: pa.Schema, new_metadata: Dict[str, Any]
|
|
@@ -250,34 +341,59 @@ def append_to_pyarrow_metadata(
|
|
|
250
341
|
|
|
251
342
|
|
|
252
343
|
def _get_pb_flight_doput_request(
|
|
253
|
-
space_id,
|
|
254
|
-
model_id: str,
|
|
344
|
+
space_id: str,
|
|
255
345
|
request_type: FlightRequestType,
|
|
346
|
+
model_id: str | None = None,
|
|
347
|
+
dataset_id: str | None = None,
|
|
348
|
+
experiment_name: str | None = None,
|
|
256
349
|
) -> flight_ing_pb2.DoPutRequest:
|
|
257
350
|
"""Return a DoPutRequest for the given request_type."""
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
351
|
+
|
|
352
|
+
common_args = {"space_id": space_id}
|
|
353
|
+
|
|
354
|
+
if model_id:
|
|
355
|
+
common_args["external_model_id"] = model_id
|
|
356
|
+
if dataset_id:
|
|
357
|
+
common_args["dataset_id"] = dataset_id
|
|
358
|
+
if experiment_name:
|
|
359
|
+
common_args["experiment_name"] = experiment_name
|
|
360
|
+
|
|
361
|
+
if model_id:
|
|
362
|
+
# model-based request types
|
|
363
|
+
match request_type:
|
|
364
|
+
case FlightRequestType.LOG_EXPERIMENT_DATA:
|
|
365
|
+
return flight_ing_pb2.DoPutRequest(
|
|
366
|
+
write_span_evaluation_request=flight_ing_pb2.WriteSpanEvaluationRequest(
|
|
367
|
+
**common_args
|
|
368
|
+
)
|
|
268
369
|
)
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
370
|
+
case FlightRequestType.ANNOTATION:
|
|
371
|
+
return flight_ing_pb2.DoPutRequest(
|
|
372
|
+
write_span_annotation_request=flight_ing_pb2.WriteSpanAnnotationRequest(
|
|
373
|
+
**common_args
|
|
374
|
+
)
|
|
274
375
|
)
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
376
|
+
case FlightRequestType.METADATA:
|
|
377
|
+
return flight_ing_pb2.DoPutRequest(
|
|
378
|
+
write_span_attributes_metadata_request=flight_ing_pb2.WriteSpanAttributesMetadataRequest(
|
|
379
|
+
**common_args
|
|
380
|
+
)
|
|
280
381
|
)
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
382
|
+
case _:
|
|
383
|
+
raise ValueError(f"Unsupported request_type: {request_type}")
|
|
384
|
+
|
|
385
|
+
if dataset_id and experiment_name:
|
|
386
|
+
# dataset-based request types
|
|
387
|
+
match request_type:
|
|
388
|
+
case FlightRequestType.LOG_EXPERIMENT_DATA:
|
|
389
|
+
return flight_ing_pb2.DoPutRequest(
|
|
390
|
+
post_experiment_data=flight_ing_pb2.PostExperimentDataRequest(
|
|
391
|
+
**common_args
|
|
392
|
+
)
|
|
393
|
+
)
|
|
394
|
+
case _:
|
|
395
|
+
raise ValueError(f"Unsupported request_type: {request_type}")
|
|
396
|
+
|
|
397
|
+
raise ValueError(
|
|
398
|
+
f"Unsupported combination: {request_type=} with provided arguments."
|
|
399
|
+
)
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"""
|
|
6
6
|
Arize REST API
|
|
7
7
|
|
|
8
|
-
API specification for the backend data server. The API is hosted globally at https://
|
|
8
|
+
API specification for the backend data server. The API is hosted globally at https://api.arize.com/v2 or in your own environment. You can access the OpenAPI spec for this API at https://api.arize.com/v2/spec.yaml
|
|
9
9
|
|
|
10
10
|
The version of the OpenAPI document: 0.0.1
|
|
11
11
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
@@ -36,7 +36,9 @@ __all__ = [
|
|
|
36
36
|
"DatasetsListExamples200Response",
|
|
37
37
|
"Error",
|
|
38
38
|
"Experiment",
|
|
39
|
+
"ExperimentsCreateRequest",
|
|
39
40
|
"ExperimentsList200Response",
|
|
41
|
+
"ExperimentsRunsList200Response",
|
|
40
42
|
]
|
|
41
43
|
|
|
42
44
|
# import apis into sdk package
|
|
@@ -62,5 +64,7 @@ from arize._generated.api_client.models.datasets_list200_response import Dataset
|
|
|
62
64
|
from arize._generated.api_client.models.datasets_list_examples200_response import DatasetsListExamples200Response as DatasetsListExamples200Response
|
|
63
65
|
from arize._generated.api_client.models.error import Error as Error
|
|
64
66
|
from arize._generated.api_client.models.experiment import Experiment as Experiment
|
|
67
|
+
from arize._generated.api_client.models.experiments_create_request import ExperimentsCreateRequest as ExperimentsCreateRequest
|
|
65
68
|
from arize._generated.api_client.models.experiments_list200_response import ExperimentsList200Response as ExperimentsList200Response
|
|
69
|
+
from arize._generated.api_client.models.experiments_runs_list200_response import ExperimentsRunsList200Response as ExperimentsRunsList200Response
|
|
66
70
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"""
|
|
4
4
|
Arize REST API
|
|
5
5
|
|
|
6
|
-
API specification for the backend data server. The API is hosted globally at https://
|
|
6
|
+
API specification for the backend data server. The API is hosted globally at https://api.arize.com/v2 or in your own environment. You can access the OpenAPI spec for this API at https://api.arize.com/v2/spec.yaml
|
|
7
7
|
|
|
8
8
|
The version of the OpenAPI document: 0.0.1
|
|
9
9
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
@@ -309,7 +309,7 @@ class DatasetsApi:
|
|
|
309
309
|
|
|
310
310
|
return self.api_client.param_serialize(
|
|
311
311
|
method='POST',
|
|
312
|
-
resource_path='/
|
|
312
|
+
resource_path='/v2/datasets',
|
|
313
313
|
path_params=_path_params,
|
|
314
314
|
query_params=_query_params,
|
|
315
315
|
header_params=_header_params,
|
|
@@ -585,7 +585,7 @@ class DatasetsApi:
|
|
|
585
585
|
|
|
586
586
|
return self.api_client.param_serialize(
|
|
587
587
|
method='DELETE',
|
|
588
|
-
resource_path='/
|
|
588
|
+
resource_path='/v2/datasets/{datasetId}',
|
|
589
589
|
path_params=_path_params,
|
|
590
590
|
query_params=_query_params,
|
|
591
591
|
header_params=_header_params,
|
|
@@ -878,7 +878,7 @@ class DatasetsApi:
|
|
|
878
878
|
|
|
879
879
|
return self.api_client.param_serialize(
|
|
880
880
|
method='GET',
|
|
881
|
-
resource_path='/
|
|
881
|
+
resource_path='/v2/datasets/{datasetId}',
|
|
882
882
|
path_params=_path_params,
|
|
883
883
|
query_params=_query_params,
|
|
884
884
|
header_params=_header_params,
|
|
@@ -1170,7 +1170,7 @@ class DatasetsApi:
|
|
|
1170
1170
|
|
|
1171
1171
|
return self.api_client.param_serialize(
|
|
1172
1172
|
method='GET',
|
|
1173
|
-
resource_path='/
|
|
1173
|
+
resource_path='/v2/datasets',
|
|
1174
1174
|
path_params=_path_params,
|
|
1175
1175
|
query_params=_query_params,
|
|
1176
1176
|
header_params=_header_params,
|
|
@@ -1480,7 +1480,7 @@ class DatasetsApi:
|
|
|
1480
1480
|
|
|
1481
1481
|
return self.api_client.param_serialize(
|
|
1482
1482
|
method='GET',
|
|
1483
|
-
resource_path='/
|
|
1483
|
+
resource_path='/v2/datasets/{datasetId}/examples',
|
|
1484
1484
|
path_params=_path_params,
|
|
1485
1485
|
query_params=_query_params,
|
|
1486
1486
|
header_params=_header_params,
|