arize-phoenix 3.16.1__py3-none-any.whl → 7.7.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.
Potentially problematic release.
This version of arize-phoenix might be problematic. Click here for more details.
- arize_phoenix-7.7.0.dist-info/METADATA +261 -0
- arize_phoenix-7.7.0.dist-info/RECORD +345 -0
- {arize_phoenix-3.16.1.dist-info → arize_phoenix-7.7.0.dist-info}/WHEEL +1 -1
- arize_phoenix-7.7.0.dist-info/entry_points.txt +3 -0
- phoenix/__init__.py +86 -14
- phoenix/auth.py +309 -0
- phoenix/config.py +675 -45
- phoenix/core/model.py +32 -30
- phoenix/core/model_schema.py +102 -109
- phoenix/core/model_schema_adapter.py +48 -45
- phoenix/datetime_utils.py +24 -3
- phoenix/db/README.md +54 -0
- phoenix/db/__init__.py +4 -0
- phoenix/db/alembic.ini +85 -0
- phoenix/db/bulk_inserter.py +294 -0
- phoenix/db/engines.py +208 -0
- phoenix/db/enums.py +20 -0
- phoenix/db/facilitator.py +113 -0
- phoenix/db/helpers.py +159 -0
- phoenix/db/insertion/constants.py +2 -0
- phoenix/db/insertion/dataset.py +227 -0
- phoenix/db/insertion/document_annotation.py +171 -0
- phoenix/db/insertion/evaluation.py +191 -0
- phoenix/db/insertion/helpers.py +98 -0
- phoenix/db/insertion/span.py +193 -0
- phoenix/db/insertion/span_annotation.py +158 -0
- phoenix/db/insertion/trace_annotation.py +158 -0
- phoenix/db/insertion/types.py +256 -0
- phoenix/db/migrate.py +86 -0
- phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +199 -0
- phoenix/db/migrations/env.py +114 -0
- phoenix/db/migrations/script.py.mako +26 -0
- phoenix/db/migrations/versions/10460e46d750_datasets.py +317 -0
- phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +126 -0
- phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +66 -0
- phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +157 -0
- phoenix/db/migrations/versions/cf03bd6bae1d_init.py +280 -0
- phoenix/db/models.py +807 -0
- phoenix/exceptions.py +5 -1
- phoenix/experiments/__init__.py +6 -0
- phoenix/experiments/evaluators/__init__.py +29 -0
- phoenix/experiments/evaluators/base.py +158 -0
- phoenix/experiments/evaluators/code_evaluators.py +184 -0
- phoenix/experiments/evaluators/llm_evaluators.py +473 -0
- phoenix/experiments/evaluators/utils.py +236 -0
- phoenix/experiments/functions.py +772 -0
- phoenix/experiments/tracing.py +86 -0
- phoenix/experiments/types.py +726 -0
- phoenix/experiments/utils.py +25 -0
- phoenix/inferences/__init__.py +0 -0
- phoenix/{datasets → inferences}/errors.py +6 -5
- phoenix/{datasets → inferences}/fixtures.py +49 -42
- phoenix/{datasets/dataset.py → inferences/inferences.py} +121 -105
- phoenix/{datasets → inferences}/schema.py +11 -11
- phoenix/{datasets → inferences}/validation.py +13 -14
- phoenix/logging/__init__.py +3 -0
- phoenix/logging/_config.py +90 -0
- phoenix/logging/_filter.py +6 -0
- phoenix/logging/_formatter.py +69 -0
- phoenix/metrics/__init__.py +5 -4
- phoenix/metrics/binning.py +4 -3
- phoenix/metrics/metrics.py +2 -1
- phoenix/metrics/mixins.py +7 -6
- phoenix/metrics/retrieval_metrics.py +2 -1
- phoenix/metrics/timeseries.py +5 -4
- phoenix/metrics/wrappers.py +9 -3
- phoenix/pointcloud/clustering.py +5 -5
- phoenix/pointcloud/pointcloud.py +7 -5
- phoenix/pointcloud/projectors.py +5 -6
- phoenix/pointcloud/umap_parameters.py +53 -52
- phoenix/server/api/README.md +28 -0
- phoenix/server/api/auth.py +44 -0
- phoenix/server/api/context.py +152 -9
- phoenix/server/api/dataloaders/__init__.py +91 -0
- phoenix/server/api/dataloaders/annotation_summaries.py +139 -0
- phoenix/server/api/dataloaders/average_experiment_run_latency.py +54 -0
- phoenix/server/api/dataloaders/cache/__init__.py +3 -0
- phoenix/server/api/dataloaders/cache/two_tier_cache.py +68 -0
- phoenix/server/api/dataloaders/dataset_example_revisions.py +131 -0
- phoenix/server/api/dataloaders/dataset_example_spans.py +38 -0
- phoenix/server/api/dataloaders/document_evaluation_summaries.py +144 -0
- phoenix/server/api/dataloaders/document_evaluations.py +31 -0
- phoenix/server/api/dataloaders/document_retrieval_metrics.py +89 -0
- phoenix/server/api/dataloaders/experiment_annotation_summaries.py +79 -0
- phoenix/server/api/dataloaders/experiment_error_rates.py +58 -0
- phoenix/server/api/dataloaders/experiment_run_annotations.py +36 -0
- phoenix/server/api/dataloaders/experiment_run_counts.py +49 -0
- phoenix/server/api/dataloaders/experiment_sequence_number.py +44 -0
- phoenix/server/api/dataloaders/latency_ms_quantile.py +188 -0
- phoenix/server/api/dataloaders/min_start_or_max_end_times.py +85 -0
- phoenix/server/api/dataloaders/project_by_name.py +31 -0
- phoenix/server/api/dataloaders/record_counts.py +116 -0
- phoenix/server/api/dataloaders/session_io.py +79 -0
- phoenix/server/api/dataloaders/session_num_traces.py +30 -0
- phoenix/server/api/dataloaders/session_num_traces_with_error.py +32 -0
- phoenix/server/api/dataloaders/session_token_usages.py +41 -0
- phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +55 -0
- phoenix/server/api/dataloaders/span_annotations.py +26 -0
- phoenix/server/api/dataloaders/span_dataset_examples.py +31 -0
- phoenix/server/api/dataloaders/span_descendants.py +57 -0
- phoenix/server/api/dataloaders/span_projects.py +33 -0
- phoenix/server/api/dataloaders/token_counts.py +124 -0
- phoenix/server/api/dataloaders/trace_by_trace_ids.py +25 -0
- phoenix/server/api/dataloaders/trace_root_spans.py +32 -0
- phoenix/server/api/dataloaders/user_roles.py +30 -0
- phoenix/server/api/dataloaders/users.py +33 -0
- phoenix/server/api/exceptions.py +48 -0
- phoenix/server/api/helpers/__init__.py +12 -0
- phoenix/server/api/helpers/dataset_helpers.py +217 -0
- phoenix/server/api/helpers/experiment_run_filters.py +763 -0
- phoenix/server/api/helpers/playground_clients.py +948 -0
- phoenix/server/api/helpers/playground_registry.py +70 -0
- phoenix/server/api/helpers/playground_spans.py +455 -0
- phoenix/server/api/input_types/AddExamplesToDatasetInput.py +16 -0
- phoenix/server/api/input_types/AddSpansToDatasetInput.py +14 -0
- phoenix/server/api/input_types/ChatCompletionInput.py +38 -0
- phoenix/server/api/input_types/ChatCompletionMessageInput.py +24 -0
- phoenix/server/api/input_types/ClearProjectInput.py +15 -0
- phoenix/server/api/input_types/ClusterInput.py +2 -2
- phoenix/server/api/input_types/CreateDatasetInput.py +12 -0
- phoenix/server/api/input_types/CreateSpanAnnotationInput.py +18 -0
- phoenix/server/api/input_types/CreateTraceAnnotationInput.py +18 -0
- phoenix/server/api/input_types/DataQualityMetricInput.py +5 -2
- phoenix/server/api/input_types/DatasetExampleInput.py +14 -0
- phoenix/server/api/input_types/DatasetSort.py +17 -0
- phoenix/server/api/input_types/DatasetVersionSort.py +16 -0
- phoenix/server/api/input_types/DeleteAnnotationsInput.py +7 -0
- phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +13 -0
- phoenix/server/api/input_types/DeleteDatasetInput.py +7 -0
- phoenix/server/api/input_types/DeleteExperimentsInput.py +7 -0
- phoenix/server/api/input_types/DimensionFilter.py +4 -4
- phoenix/server/api/input_types/GenerativeModelInput.py +17 -0
- phoenix/server/api/input_types/Granularity.py +1 -1
- phoenix/server/api/input_types/InvocationParameters.py +162 -0
- phoenix/server/api/input_types/PatchAnnotationInput.py +19 -0
- phoenix/server/api/input_types/PatchDatasetExamplesInput.py +35 -0
- phoenix/server/api/input_types/PatchDatasetInput.py +14 -0
- phoenix/server/api/input_types/PerformanceMetricInput.py +5 -2
- phoenix/server/api/input_types/ProjectSessionSort.py +29 -0
- phoenix/server/api/input_types/SpanAnnotationSort.py +17 -0
- phoenix/server/api/input_types/SpanSort.py +134 -69
- phoenix/server/api/input_types/TemplateOptions.py +10 -0
- phoenix/server/api/input_types/TraceAnnotationSort.py +17 -0
- phoenix/server/api/input_types/UserRoleInput.py +9 -0
- phoenix/server/api/mutations/__init__.py +28 -0
- phoenix/server/api/mutations/api_key_mutations.py +167 -0
- phoenix/server/api/mutations/chat_mutations.py +593 -0
- phoenix/server/api/mutations/dataset_mutations.py +591 -0
- phoenix/server/api/mutations/experiment_mutations.py +75 -0
- phoenix/server/api/{types/ExportEventsMutation.py → mutations/export_events_mutations.py} +21 -18
- phoenix/server/api/mutations/project_mutations.py +57 -0
- phoenix/server/api/mutations/span_annotations_mutations.py +128 -0
- phoenix/server/api/mutations/trace_annotations_mutations.py +127 -0
- phoenix/server/api/mutations/user_mutations.py +329 -0
- phoenix/server/api/openapi/__init__.py +0 -0
- phoenix/server/api/openapi/main.py +17 -0
- phoenix/server/api/openapi/schema.py +16 -0
- phoenix/server/api/queries.py +738 -0
- phoenix/server/api/routers/__init__.py +11 -0
- phoenix/server/api/routers/auth.py +284 -0
- phoenix/server/api/routers/embeddings.py +26 -0
- phoenix/server/api/routers/oauth2.py +488 -0
- phoenix/server/api/routers/v1/__init__.py +64 -0
- phoenix/server/api/routers/v1/datasets.py +1017 -0
- phoenix/server/api/routers/v1/evaluations.py +362 -0
- phoenix/server/api/routers/v1/experiment_evaluations.py +115 -0
- phoenix/server/api/routers/v1/experiment_runs.py +167 -0
- phoenix/server/api/routers/v1/experiments.py +308 -0
- phoenix/server/api/routers/v1/pydantic_compat.py +78 -0
- phoenix/server/api/routers/v1/spans.py +267 -0
- phoenix/server/api/routers/v1/traces.py +208 -0
- phoenix/server/api/routers/v1/utils.py +95 -0
- phoenix/server/api/schema.py +44 -241
- phoenix/server/api/subscriptions.py +597 -0
- phoenix/server/api/types/Annotation.py +21 -0
- phoenix/server/api/types/AnnotationSummary.py +55 -0
- phoenix/server/api/types/AnnotatorKind.py +16 -0
- phoenix/server/api/types/ApiKey.py +27 -0
- phoenix/server/api/types/AuthMethod.py +9 -0
- phoenix/server/api/types/ChatCompletionMessageRole.py +11 -0
- phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +46 -0
- phoenix/server/api/types/Cluster.py +25 -24
- phoenix/server/api/types/CreateDatasetPayload.py +8 -0
- phoenix/server/api/types/DataQualityMetric.py +31 -13
- phoenix/server/api/types/Dataset.py +288 -63
- phoenix/server/api/types/DatasetExample.py +85 -0
- phoenix/server/api/types/DatasetExampleRevision.py +34 -0
- phoenix/server/api/types/DatasetVersion.py +14 -0
- phoenix/server/api/types/Dimension.py +32 -31
- phoenix/server/api/types/DocumentEvaluationSummary.py +9 -8
- phoenix/server/api/types/EmbeddingDimension.py +56 -49
- phoenix/server/api/types/Evaluation.py +25 -31
- phoenix/server/api/types/EvaluationSummary.py +30 -50
- phoenix/server/api/types/Event.py +20 -20
- phoenix/server/api/types/ExampleRevisionInterface.py +14 -0
- phoenix/server/api/types/Experiment.py +152 -0
- phoenix/server/api/types/ExperimentAnnotationSummary.py +13 -0
- phoenix/server/api/types/ExperimentComparison.py +17 -0
- phoenix/server/api/types/ExperimentRun.py +119 -0
- phoenix/server/api/types/ExperimentRunAnnotation.py +56 -0
- phoenix/server/api/types/GenerativeModel.py +9 -0
- phoenix/server/api/types/GenerativeProvider.py +85 -0
- phoenix/server/api/types/Inferences.py +80 -0
- phoenix/server/api/types/InferencesRole.py +23 -0
- phoenix/server/api/types/LabelFraction.py +7 -0
- phoenix/server/api/types/MimeType.py +2 -2
- phoenix/server/api/types/Model.py +54 -54
- phoenix/server/api/types/PerformanceMetric.py +8 -5
- phoenix/server/api/types/Project.py +407 -142
- phoenix/server/api/types/ProjectSession.py +139 -0
- phoenix/server/api/types/Segments.py +4 -4
- phoenix/server/api/types/Span.py +221 -176
- phoenix/server/api/types/SpanAnnotation.py +43 -0
- phoenix/server/api/types/SpanIOValue.py +15 -0
- phoenix/server/api/types/SystemApiKey.py +9 -0
- phoenix/server/api/types/TemplateLanguage.py +10 -0
- phoenix/server/api/types/TimeSeries.py +19 -15
- phoenix/server/api/types/TokenUsage.py +11 -0
- phoenix/server/api/types/Trace.py +154 -0
- phoenix/server/api/types/TraceAnnotation.py +45 -0
- phoenix/server/api/types/UMAPPoints.py +7 -7
- phoenix/server/api/types/User.py +60 -0
- phoenix/server/api/types/UserApiKey.py +45 -0
- phoenix/server/api/types/UserRole.py +15 -0
- phoenix/server/api/types/node.py +4 -112
- phoenix/server/api/types/pagination.py +156 -57
- phoenix/server/api/utils.py +34 -0
- phoenix/server/app.py +864 -115
- phoenix/server/bearer_auth.py +163 -0
- phoenix/server/dml_event.py +136 -0
- phoenix/server/dml_event_handler.py +256 -0
- phoenix/server/email/__init__.py +0 -0
- phoenix/server/email/sender.py +97 -0
- phoenix/server/email/templates/__init__.py +0 -0
- phoenix/server/email/templates/password_reset.html +19 -0
- phoenix/server/email/types.py +11 -0
- phoenix/server/grpc_server.py +102 -0
- phoenix/server/jwt_store.py +505 -0
- phoenix/server/main.py +305 -116
- phoenix/server/oauth2.py +52 -0
- phoenix/server/openapi/__init__.py +0 -0
- phoenix/server/prometheus.py +111 -0
- phoenix/server/rate_limiters.py +188 -0
- phoenix/server/static/.vite/manifest.json +87 -0
- phoenix/server/static/assets/components-Cy9nwIvF.js +2125 -0
- phoenix/server/static/assets/index-BKvHIxkk.js +113 -0
- phoenix/server/static/assets/pages-CUi2xCVQ.js +4449 -0
- phoenix/server/static/assets/vendor-DvC8cT4X.js +894 -0
- phoenix/server/static/assets/vendor-DxkFTwjz.css +1 -0
- phoenix/server/static/assets/vendor-arizeai-Do1793cv.js +662 -0
- phoenix/server/static/assets/vendor-codemirror-BzwZPyJM.js +24 -0
- phoenix/server/static/assets/vendor-recharts-_Jb7JjhG.js +59 -0
- phoenix/server/static/assets/vendor-shiki-Cl9QBraO.js +5 -0
- phoenix/server/static/assets/vendor-three-DwGkEfCM.js +2998 -0
- phoenix/server/telemetry.py +68 -0
- phoenix/server/templates/index.html +82 -23
- phoenix/server/thread_server.py +3 -3
- phoenix/server/types.py +275 -0
- phoenix/services.py +27 -18
- phoenix/session/client.py +743 -68
- phoenix/session/data_extractor.py +31 -7
- phoenix/session/evaluation.py +3 -9
- phoenix/session/session.py +263 -219
- phoenix/settings.py +22 -0
- phoenix/trace/__init__.py +2 -22
- phoenix/trace/attributes.py +338 -0
- phoenix/trace/dsl/README.md +116 -0
- phoenix/trace/dsl/filter.py +663 -213
- phoenix/trace/dsl/helpers.py +73 -21
- phoenix/trace/dsl/query.py +574 -201
- phoenix/trace/exporter.py +24 -19
- phoenix/trace/fixtures.py +368 -32
- phoenix/trace/otel.py +71 -219
- phoenix/trace/projects.py +3 -2
- phoenix/trace/schemas.py +33 -11
- phoenix/trace/span_evaluations.py +21 -16
- phoenix/trace/span_json_decoder.py +6 -4
- phoenix/trace/span_json_encoder.py +2 -2
- phoenix/trace/trace_dataset.py +47 -32
- phoenix/trace/utils.py +21 -4
- phoenix/utilities/__init__.py +0 -26
- phoenix/utilities/client.py +132 -0
- phoenix/utilities/deprecation.py +31 -0
- phoenix/utilities/error_handling.py +3 -2
- phoenix/utilities/json.py +109 -0
- phoenix/utilities/logging.py +8 -0
- phoenix/utilities/project.py +2 -2
- phoenix/utilities/re.py +49 -0
- phoenix/utilities/span_store.py +0 -23
- phoenix/utilities/template_formatters.py +99 -0
- phoenix/version.py +1 -1
- arize_phoenix-3.16.1.dist-info/METADATA +0 -495
- arize_phoenix-3.16.1.dist-info/RECORD +0 -178
- phoenix/core/project.py +0 -619
- phoenix/core/traces.py +0 -96
- phoenix/experimental/evals/__init__.py +0 -73
- phoenix/experimental/evals/evaluators.py +0 -413
- phoenix/experimental/evals/functions/__init__.py +0 -4
- phoenix/experimental/evals/functions/classify.py +0 -453
- phoenix/experimental/evals/functions/executor.py +0 -353
- phoenix/experimental/evals/functions/generate.py +0 -138
- phoenix/experimental/evals/functions/processing.py +0 -76
- phoenix/experimental/evals/models/__init__.py +0 -14
- phoenix/experimental/evals/models/anthropic.py +0 -175
- phoenix/experimental/evals/models/base.py +0 -170
- phoenix/experimental/evals/models/bedrock.py +0 -221
- phoenix/experimental/evals/models/litellm.py +0 -134
- phoenix/experimental/evals/models/openai.py +0 -448
- phoenix/experimental/evals/models/rate_limiters.py +0 -246
- phoenix/experimental/evals/models/vertex.py +0 -173
- phoenix/experimental/evals/models/vertexai.py +0 -186
- phoenix/experimental/evals/retrievals.py +0 -96
- phoenix/experimental/evals/templates/__init__.py +0 -50
- phoenix/experimental/evals/templates/default_templates.py +0 -472
- phoenix/experimental/evals/templates/template.py +0 -195
- phoenix/experimental/evals/utils/__init__.py +0 -172
- phoenix/experimental/evals/utils/threads.py +0 -27
- phoenix/server/api/helpers.py +0 -11
- phoenix/server/api/routers/evaluation_handler.py +0 -109
- phoenix/server/api/routers/span_handler.py +0 -70
- phoenix/server/api/routers/trace_handler.py +0 -60
- phoenix/server/api/types/DatasetRole.py +0 -23
- phoenix/server/static/index.css +0 -6
- phoenix/server/static/index.js +0 -7447
- phoenix/storage/span_store/__init__.py +0 -23
- phoenix/storage/span_store/text_file.py +0 -85
- phoenix/trace/dsl/missing.py +0 -60
- phoenix/trace/langchain/__init__.py +0 -3
- phoenix/trace/langchain/instrumentor.py +0 -35
- phoenix/trace/llama_index/__init__.py +0 -3
- phoenix/trace/llama_index/callback.py +0 -102
- phoenix/trace/openai/__init__.py +0 -3
- phoenix/trace/openai/instrumentor.py +0 -30
- {arize_phoenix-3.16.1.dist-info → arize_phoenix-7.7.0.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-3.16.1.dist-info → arize_phoenix-7.7.0.dist-info}/licenses/LICENSE +0 -0
- /phoenix/{datasets → db/insertion}/__init__.py +0 -0
- /phoenix/{experimental → db/migrations}/__init__.py +0 -0
- /phoenix/{storage → db/migrations/data_migration_scripts}/__init__.py +0 -0
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Callable, Iterator, Mapping, Protocol
|
|
3
|
-
|
|
4
|
-
from opentelemetry.proto.trace.v1.trace_pb2 import TracesData
|
|
5
|
-
|
|
6
|
-
from phoenix.config import SpanStorageType
|
|
7
|
-
from phoenix.storage.span_store.text_file import TextFileSpanStoreImpl
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class SpanStore(Protocol):
|
|
11
|
-
def save(self, req: TracesData) -> None: ...
|
|
12
|
-
|
|
13
|
-
def load(self) -> Iterator[TracesData]: ...
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
SPAN_STORE_FACTORIES: Mapping[SpanStorageType, Callable[[Path], SpanStore]] = {
|
|
17
|
-
SpanStorageType.TEXT_FILES: TextFileSpanStoreImpl,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
__all__ = (
|
|
21
|
-
"SpanStore",
|
|
22
|
-
"SPAN_STORE_FACTORIES",
|
|
23
|
-
)
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import weakref
|
|
2
|
-
from base64 import urlsafe_b64decode, urlsafe_b64encode
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from queue import SimpleQueue
|
|
5
|
-
from threading import Thread
|
|
6
|
-
from typing import Iterator, Optional, Tuple
|
|
7
|
-
|
|
8
|
-
from opentelemetry.proto.trace.v1.trace_pb2 import TracesData
|
|
9
|
-
from typing_extensions import TypeAlias
|
|
10
|
-
|
|
11
|
-
from phoenix.utilities.project import get_project_name
|
|
12
|
-
|
|
13
|
-
_Queue: TypeAlias = "SimpleQueue[Optional[TracesData]]"
|
|
14
|
-
|
|
15
|
-
_END_OF_QUEUE = None
|
|
16
|
-
_DIR_PREFIX = "project."
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class TextFileSpanStoreImpl:
|
|
20
|
-
def __init__(self, root: Path) -> None:
|
|
21
|
-
self._root = root
|
|
22
|
-
self._projects = dict(_load_projects(self._root))
|
|
23
|
-
|
|
24
|
-
def save(self, traces_data: TracesData) -> None:
|
|
25
|
-
for resource_spans in traces_data.resource_spans:
|
|
26
|
-
name = get_project_name(resource_spans.resource.attributes)
|
|
27
|
-
if (project := self._projects.get(name)) is None:
|
|
28
|
-
self._projects[name] = project = _Project(name, self._root)
|
|
29
|
-
project.save(TracesData(resource_spans=[resource_spans]))
|
|
30
|
-
|
|
31
|
-
def load(self) -> Iterator[TracesData]:
|
|
32
|
-
queue: _Queue = SimpleQueue()
|
|
33
|
-
Thread(target=self._load_traces_data, args=(queue,)).start()
|
|
34
|
-
while (item := queue.get()) is not _END_OF_QUEUE:
|
|
35
|
-
yield item
|
|
36
|
-
|
|
37
|
-
def _load_traces_data(self, queue: _Queue) -> None:
|
|
38
|
-
"""Load traces data from all projects into the queue"""
|
|
39
|
-
for project in self._projects.values():
|
|
40
|
-
project.load(queue)
|
|
41
|
-
queue.put(_END_OF_QUEUE)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class _Project:
|
|
45
|
-
def __init__(self, name: str, root: Path) -> None:
|
|
46
|
-
self._path = root / f"project.{_b64encode(name.encode())}"
|
|
47
|
-
spans_path = self._path / "spans"
|
|
48
|
-
spans_path.mkdir(parents=True, exist_ok=True)
|
|
49
|
-
self._spans = _Spans(spans_path / "spans.txt")
|
|
50
|
-
|
|
51
|
-
def save(self, traces_data: TracesData) -> None:
|
|
52
|
-
self._spans.save(traces_data)
|
|
53
|
-
|
|
54
|
-
def load(self, queue: _Queue) -> None:
|
|
55
|
-
self._spans.load(queue)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class _Spans:
|
|
59
|
-
def __init__(self, file_path: Path):
|
|
60
|
-
self._path = file_path
|
|
61
|
-
self._file = self._path.open("a")
|
|
62
|
-
weakref.finalize(self, self._file.close)
|
|
63
|
-
|
|
64
|
-
def save(self, traces_data: TracesData) -> None:
|
|
65
|
-
self._file.write(_b64encode(traces_data.SerializeToString()))
|
|
66
|
-
self._file.write("\n")
|
|
67
|
-
|
|
68
|
-
def load(self, queue: _Queue) -> None:
|
|
69
|
-
with self._path.open("r") as f:
|
|
70
|
-
while line := f.readline():
|
|
71
|
-
queue.put(TracesData.FromString(_b64decode(line)))
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def _load_projects(root: Path) -> Iterator[Tuple[str, _Project]]:
|
|
75
|
-
for dir_path in root.glob(f"{_DIR_PREFIX}*/"):
|
|
76
|
-
name = _b64decode(dir_path.name[len(_DIR_PREFIX) :]).decode()
|
|
77
|
-
yield name, _Project(name, root)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def _b64encode(s: bytes) -> str:
|
|
81
|
-
return urlsafe_b64encode(s).decode()
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
def _b64decode(name: str) -> bytes:
|
|
85
|
-
return urlsafe_b64decode(name.encode())
|
phoenix/trace/dsl/missing.py
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class _Missing:
|
|
5
|
-
"""
|
|
6
|
-
Falsify all comparisons except those with self; return self when getattr()
|
|
7
|
-
is called. Also, self is callable returning self. All this may seem peculiar
|
|
8
|
-
but is useful for getting the desired (and intuitive) behavior from any
|
|
9
|
-
boolean (i.e. comparative) expression without needing error handling when
|
|
10
|
-
missing values are encountered. `_Missing()` is intended to be a (fancier)
|
|
11
|
-
replacement for `None`.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
def __lt__(self, _: Any) -> bool:
|
|
15
|
-
return False
|
|
16
|
-
|
|
17
|
-
def __le__(self, _: Any) -> bool:
|
|
18
|
-
return False
|
|
19
|
-
|
|
20
|
-
def __gt__(self, _: Any) -> bool:
|
|
21
|
-
return False
|
|
22
|
-
|
|
23
|
-
def __ge__(self, _: Any) -> bool:
|
|
24
|
-
return False
|
|
25
|
-
|
|
26
|
-
def __eq__(self, other: Any) -> bool:
|
|
27
|
-
return isinstance(other, _Missing)
|
|
28
|
-
|
|
29
|
-
def __ne__(self, _: Any) -> bool:
|
|
30
|
-
return False
|
|
31
|
-
|
|
32
|
-
def __len__(self) -> int:
|
|
33
|
-
return 0
|
|
34
|
-
|
|
35
|
-
def __iter__(self) -> Any:
|
|
36
|
-
return self
|
|
37
|
-
|
|
38
|
-
def __next__(self) -> Any:
|
|
39
|
-
raise StopIteration()
|
|
40
|
-
|
|
41
|
-
def __contains__(self, _: Any) -> bool:
|
|
42
|
-
return False
|
|
43
|
-
|
|
44
|
-
def __str__(self) -> str:
|
|
45
|
-
return ""
|
|
46
|
-
|
|
47
|
-
def __float__(self) -> float:
|
|
48
|
-
return float("nan")
|
|
49
|
-
|
|
50
|
-
def __bool__(self) -> bool:
|
|
51
|
-
return False
|
|
52
|
-
|
|
53
|
-
def __getattr__(self, _: Any) -> "_Missing":
|
|
54
|
-
return self
|
|
55
|
-
|
|
56
|
-
def __call__(self, *_: Any, **__: Any) -> "_Missing":
|
|
57
|
-
return self
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
MISSING: Any = _Missing()
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from importlib.metadata import PackageNotFoundError
|
|
3
|
-
from importlib.util import find_spec
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
from openinference.instrumentation.langchain import LangChainInstrumentor as Instrumentor
|
|
7
|
-
from openinference.semconv.resource import ResourceAttributes
|
|
8
|
-
from opentelemetry.sdk import trace as trace_sdk
|
|
9
|
-
from opentelemetry.sdk.resources import Resource
|
|
10
|
-
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
|
|
11
|
-
|
|
12
|
-
from phoenix.config import get_env_project_name
|
|
13
|
-
from phoenix.trace.exporter import _OpenInferenceExporter
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
__all__ = ("LangChainInstrumentor",)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class LangChainInstrumentor(Instrumentor):
|
|
22
|
-
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
23
|
-
if find_spec("langchain_core") is None:
|
|
24
|
-
raise PackageNotFoundError(
|
|
25
|
-
"Missing `langchain-core`. Install with `pip install langchain-core`."
|
|
26
|
-
)
|
|
27
|
-
super().__init__()
|
|
28
|
-
|
|
29
|
-
def instrument(self) -> None:
|
|
30
|
-
tracer_provider = trace_sdk.TracerProvider(
|
|
31
|
-
resource=Resource({ResourceAttributes.PROJECT_NAME: get_env_project_name()}),
|
|
32
|
-
span_limits=trace_sdk.SpanLimits(max_attributes=10_000),
|
|
33
|
-
)
|
|
34
|
-
tracer_provider.add_span_processor(SimpleSpanProcessor(_OpenInferenceExporter()))
|
|
35
|
-
super().instrument(skip_dep_check=True, tracer_provider=tracer_provider)
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from importlib.metadata import PackageNotFoundError, version
|
|
3
|
-
from typing import Any, Optional, Tuple
|
|
4
|
-
|
|
5
|
-
from openinference.semconv.resource import ResourceAttributes
|
|
6
|
-
from opentelemetry import trace as trace_api
|
|
7
|
-
from opentelemetry.sdk import trace as trace_sdk
|
|
8
|
-
from opentelemetry.sdk.resources import Resource
|
|
9
|
-
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
|
|
10
|
-
|
|
11
|
-
from phoenix.config import get_env_project_name
|
|
12
|
-
from phoenix.trace.errors import IncompatibleLibraryVersionError
|
|
13
|
-
from phoenix.trace.exporter import _OpenInferenceExporter
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
LLAMA_INDEX_MODERN_VERSION = (0, 10, 0)
|
|
18
|
-
INSTRUMENTATION_MODERN_VERSION = (1, 0, 0)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def _check_instrumentation_compatibility() -> bool:
|
|
22
|
-
llama_index_version_str = _get_version_if_installed("llama-index")
|
|
23
|
-
llama_index_installed = llama_index_version_str is not None
|
|
24
|
-
llama_index_core_version_str = _get_version_if_installed("llama-index-core")
|
|
25
|
-
llama_index_core_installed = modern_llama_index_installed = (
|
|
26
|
-
llama_index_core_version_str is not None
|
|
27
|
-
)
|
|
28
|
-
instrumentation_version_str = version("openinference-instrumentation-llama-index")
|
|
29
|
-
instrumentation_version = _parse_semantic_version(instrumentation_version_str)
|
|
30
|
-
|
|
31
|
-
if not llama_index_installed and not llama_index_core_installed:
|
|
32
|
-
raise PackageNotFoundError(
|
|
33
|
-
"Missing `llama_index`. "
|
|
34
|
-
"Install with `pip install llama-index` or "
|
|
35
|
-
"`pip install llama-index-core` for a minimal installation."
|
|
36
|
-
)
|
|
37
|
-
elif modern_llama_index_installed and instrumentation_version < INSTRUMENTATION_MODERN_VERSION:
|
|
38
|
-
raise IncompatibleLibraryVersionError(
|
|
39
|
-
f"llama-index-core v{llama_index_core_version_str} is not compatible with "
|
|
40
|
-
f"openinference-instrumentation-llama-index v{instrumentation_version_str}. "
|
|
41
|
-
"Please upgrade openinference-instrumentation-llama-index to at least 1.0.0 via "
|
|
42
|
-
"`pip install 'openinference-instrumentation-llama-index>=1.0.0'`."
|
|
43
|
-
)
|
|
44
|
-
elif (
|
|
45
|
-
llama_index_installed
|
|
46
|
-
and llama_index_version_str
|
|
47
|
-
and _parse_semantic_version(llama_index_version_str) < LLAMA_INDEX_MODERN_VERSION
|
|
48
|
-
and instrumentation_version >= INSTRUMENTATION_MODERN_VERSION
|
|
49
|
-
):
|
|
50
|
-
raise IncompatibleLibraryVersionError(
|
|
51
|
-
f"llama-index v{llama_index_version_str} is not compatible with "
|
|
52
|
-
f"openinference-instrumentation-llama-index v{instrumentation_version_str}. "
|
|
53
|
-
"Please either migrate llama-index to at least 0.10.0 or downgrade "
|
|
54
|
-
"openinference-instrumentation-llama-index via "
|
|
55
|
-
"`pip install 'openinference-instrumentation-llama-index<1.0.0'`."
|
|
56
|
-
)
|
|
57
|
-
return True
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def _get_version_if_installed(package_name: str) -> Optional[str]:
|
|
61
|
-
"""
|
|
62
|
-
Gets the version of the package if it is installed, otherwise, returns None.
|
|
63
|
-
"""
|
|
64
|
-
try:
|
|
65
|
-
return version(package_name)
|
|
66
|
-
except PackageNotFoundError:
|
|
67
|
-
return None
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _parse_semantic_version(semver_string: str) -> Tuple[int, ...]:
|
|
71
|
-
"""
|
|
72
|
-
Parse a semantic version string into a tuple of integers.
|
|
73
|
-
"""
|
|
74
|
-
return tuple(map(int, semver_string.split(".")[:3]))
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if _check_instrumentation_compatibility():
|
|
78
|
-
from openinference.instrumentation.llama_index._callback import (
|
|
79
|
-
OpenInferenceTraceCallbackHandler as _OpenInferenceTraceCallbackHandler,
|
|
80
|
-
)
|
|
81
|
-
from openinference.instrumentation.llama_index.version import (
|
|
82
|
-
__version__,
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
class OpenInferenceTraceCallbackHandler(_OpenInferenceTraceCallbackHandler):
|
|
87
|
-
"""Callback handler for storing LLM application trace data in OpenInference format.
|
|
88
|
-
OpenInference is an open standard for capturing and storing AI model
|
|
89
|
-
inferences. It enables production LLMapp servers to seamlessly integrate
|
|
90
|
-
with LLM observability solutions such as Arize and Phoenix.
|
|
91
|
-
|
|
92
|
-
For more information on the specification, see
|
|
93
|
-
https://github.com/Arize-ai/openinference
|
|
94
|
-
"""
|
|
95
|
-
|
|
96
|
-
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
97
|
-
tracer_provider = trace_sdk.TracerProvider(
|
|
98
|
-
resource=Resource({ResourceAttributes.PROJECT_NAME: get_env_project_name()}),
|
|
99
|
-
span_limits=trace_sdk.SpanLimits(max_attributes=10_000),
|
|
100
|
-
)
|
|
101
|
-
tracer_provider.add_span_processor(SimpleSpanProcessor(_OpenInferenceExporter()))
|
|
102
|
-
super().__init__(trace_api.get_tracer(__name__, __version__, tracer_provider))
|
phoenix/trace/openai/__init__.py
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from importlib.metadata import PackageNotFoundError
|
|
3
|
-
from importlib.util import find_spec
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
from openinference.instrumentation.openai import OpenAIInstrumentor as Instrumentor
|
|
7
|
-
from openinference.semconv.resource import ResourceAttributes
|
|
8
|
-
from opentelemetry.sdk import trace as trace_sdk
|
|
9
|
-
from opentelemetry.sdk.resources import Resource
|
|
10
|
-
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
|
|
11
|
-
|
|
12
|
-
from phoenix.config import get_env_project_name
|
|
13
|
-
from phoenix.trace.exporter import _OpenInferenceExporter
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class OpenAIInstrumentor(Instrumentor):
|
|
19
|
-
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
20
|
-
if find_spec("openai") is None:
|
|
21
|
-
raise PackageNotFoundError("Missing `openai`. Install with `pip install openai`.")
|
|
22
|
-
super().__init__()
|
|
23
|
-
|
|
24
|
-
def instrument(self) -> None:
|
|
25
|
-
tracer_provider = trace_sdk.TracerProvider(
|
|
26
|
-
resource=Resource({ResourceAttributes.PROJECT_NAME: get_env_project_name()}),
|
|
27
|
-
span_limits=trace_sdk.SpanLimits(max_attributes=10_000),
|
|
28
|
-
)
|
|
29
|
-
tracer_provider.add_span_processor(SimpleSpanProcessor(_OpenInferenceExporter()))
|
|
30
|
-
super().instrument(skip_dep_check=True, tracer_provider=tracer_provider)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|