arize-phoenix 5.5.2__py3-none-any.whl → 5.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.

Files changed (186) hide show
  1. {arize_phoenix-5.5.2.dist-info → arize_phoenix-5.7.0.dist-info}/METADATA +4 -7
  2. arize_phoenix-5.7.0.dist-info/RECORD +330 -0
  3. phoenix/config.py +50 -8
  4. phoenix/core/model.py +3 -3
  5. phoenix/core/model_schema.py +41 -50
  6. phoenix/core/model_schema_adapter.py +17 -16
  7. phoenix/datetime_utils.py +2 -2
  8. phoenix/db/bulk_inserter.py +10 -20
  9. phoenix/db/engines.py +2 -1
  10. phoenix/db/enums.py +2 -2
  11. phoenix/db/helpers.py +8 -7
  12. phoenix/db/insertion/dataset.py +9 -19
  13. phoenix/db/insertion/document_annotation.py +14 -13
  14. phoenix/db/insertion/helpers.py +6 -16
  15. phoenix/db/insertion/span_annotation.py +14 -13
  16. phoenix/db/insertion/trace_annotation.py +14 -13
  17. phoenix/db/insertion/types.py +19 -30
  18. phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +8 -8
  19. phoenix/db/models.py +28 -28
  20. phoenix/experiments/evaluators/base.py +2 -1
  21. phoenix/experiments/evaluators/code_evaluators.py +4 -5
  22. phoenix/experiments/evaluators/llm_evaluators.py +157 -4
  23. phoenix/experiments/evaluators/utils.py +3 -2
  24. phoenix/experiments/functions.py +10 -21
  25. phoenix/experiments/tracing.py +2 -1
  26. phoenix/experiments/types.py +20 -29
  27. phoenix/experiments/utils.py +2 -1
  28. phoenix/inferences/errors.py +6 -5
  29. phoenix/inferences/fixtures.py +6 -5
  30. phoenix/inferences/inferences.py +37 -37
  31. phoenix/inferences/schema.py +11 -10
  32. phoenix/inferences/validation.py +13 -14
  33. phoenix/logging/_formatter.py +3 -3
  34. phoenix/metrics/__init__.py +5 -4
  35. phoenix/metrics/binning.py +2 -1
  36. phoenix/metrics/metrics.py +2 -1
  37. phoenix/metrics/mixins.py +7 -6
  38. phoenix/metrics/retrieval_metrics.py +2 -1
  39. phoenix/metrics/timeseries.py +5 -4
  40. phoenix/metrics/wrappers.py +2 -2
  41. phoenix/pointcloud/clustering.py +3 -4
  42. phoenix/pointcloud/pointcloud.py +7 -5
  43. phoenix/pointcloud/umap_parameters.py +2 -1
  44. phoenix/server/api/dataloaders/annotation_summaries.py +12 -19
  45. phoenix/server/api/dataloaders/average_experiment_run_latency.py +2 -2
  46. phoenix/server/api/dataloaders/cache/two_tier_cache.py +3 -2
  47. phoenix/server/api/dataloaders/dataset_example_revisions.py +3 -8
  48. phoenix/server/api/dataloaders/dataset_example_spans.py +2 -5
  49. phoenix/server/api/dataloaders/document_evaluation_summaries.py +12 -18
  50. phoenix/server/api/dataloaders/document_evaluations.py +3 -7
  51. phoenix/server/api/dataloaders/document_retrieval_metrics.py +6 -13
  52. phoenix/server/api/dataloaders/experiment_annotation_summaries.py +4 -8
  53. phoenix/server/api/dataloaders/experiment_error_rates.py +2 -5
  54. phoenix/server/api/dataloaders/experiment_run_annotations.py +3 -7
  55. phoenix/server/api/dataloaders/experiment_run_counts.py +1 -5
  56. phoenix/server/api/dataloaders/experiment_sequence_number.py +2 -5
  57. phoenix/server/api/dataloaders/latency_ms_quantile.py +21 -30
  58. phoenix/server/api/dataloaders/min_start_or_max_end_times.py +7 -13
  59. phoenix/server/api/dataloaders/project_by_name.py +3 -3
  60. phoenix/server/api/dataloaders/record_counts.py +11 -18
  61. phoenix/server/api/dataloaders/span_annotations.py +3 -7
  62. phoenix/server/api/dataloaders/span_dataset_examples.py +3 -8
  63. phoenix/server/api/dataloaders/span_descendants.py +3 -7
  64. phoenix/server/api/dataloaders/span_projects.py +2 -2
  65. phoenix/server/api/dataloaders/token_counts.py +12 -19
  66. phoenix/server/api/dataloaders/trace_row_ids.py +3 -7
  67. phoenix/server/api/dataloaders/user_roles.py +3 -3
  68. phoenix/server/api/dataloaders/users.py +3 -3
  69. phoenix/server/api/helpers/__init__.py +4 -3
  70. phoenix/server/api/helpers/dataset_helpers.py +10 -9
  71. phoenix/server/api/helpers/playground_clients.py +671 -0
  72. phoenix/server/api/helpers/playground_registry.py +70 -0
  73. phoenix/server/api/helpers/playground_spans.py +325 -0
  74. phoenix/server/api/input_types/AddExamplesToDatasetInput.py +2 -2
  75. phoenix/server/api/input_types/AddSpansToDatasetInput.py +2 -2
  76. phoenix/server/api/input_types/ChatCompletionInput.py +38 -0
  77. phoenix/server/api/input_types/ChatCompletionMessageInput.py +13 -1
  78. phoenix/server/api/input_types/ClusterInput.py +2 -2
  79. phoenix/server/api/input_types/DeleteAnnotationsInput.py +1 -3
  80. phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +2 -2
  81. phoenix/server/api/input_types/DeleteExperimentsInput.py +1 -3
  82. phoenix/server/api/input_types/DimensionFilter.py +4 -4
  83. phoenix/server/api/input_types/GenerativeModelInput.py +17 -0
  84. phoenix/server/api/input_types/Granularity.py +1 -1
  85. phoenix/server/api/input_types/InvocationParameters.py +156 -13
  86. phoenix/server/api/input_types/PatchDatasetExamplesInput.py +2 -2
  87. phoenix/server/api/input_types/TemplateOptions.py +10 -0
  88. phoenix/server/api/mutations/__init__.py +4 -0
  89. phoenix/server/api/mutations/chat_mutations.py +374 -0
  90. phoenix/server/api/mutations/dataset_mutations.py +4 -4
  91. phoenix/server/api/mutations/experiment_mutations.py +1 -2
  92. phoenix/server/api/mutations/export_events_mutations.py +7 -7
  93. phoenix/server/api/mutations/span_annotations_mutations.py +4 -4
  94. phoenix/server/api/mutations/trace_annotations_mutations.py +4 -4
  95. phoenix/server/api/mutations/user_mutations.py +4 -4
  96. phoenix/server/api/openapi/schema.py +2 -2
  97. phoenix/server/api/queries.py +61 -72
  98. phoenix/server/api/routers/oauth2.py +4 -4
  99. phoenix/server/api/routers/v1/datasets.py +22 -36
  100. phoenix/server/api/routers/v1/evaluations.py +6 -5
  101. phoenix/server/api/routers/v1/experiment_evaluations.py +2 -2
  102. phoenix/server/api/routers/v1/experiment_runs.py +2 -2
  103. phoenix/server/api/routers/v1/experiments.py +4 -4
  104. phoenix/server/api/routers/v1/spans.py +13 -12
  105. phoenix/server/api/routers/v1/traces.py +5 -5
  106. phoenix/server/api/routers/v1/utils.py +5 -5
  107. phoenix/server/api/schema.py +42 -10
  108. phoenix/server/api/subscriptions.py +347 -494
  109. phoenix/server/api/types/AnnotationSummary.py +3 -3
  110. phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +44 -0
  111. phoenix/server/api/types/Cluster.py +8 -7
  112. phoenix/server/api/types/Dataset.py +5 -4
  113. phoenix/server/api/types/Dimension.py +3 -3
  114. phoenix/server/api/types/DocumentEvaluationSummary.py +8 -7
  115. phoenix/server/api/types/EmbeddingDimension.py +6 -5
  116. phoenix/server/api/types/EvaluationSummary.py +3 -3
  117. phoenix/server/api/types/Event.py +7 -7
  118. phoenix/server/api/types/Experiment.py +3 -3
  119. phoenix/server/api/types/ExperimentComparison.py +2 -4
  120. phoenix/server/api/types/GenerativeProvider.py +27 -3
  121. phoenix/server/api/types/Inferences.py +9 -8
  122. phoenix/server/api/types/InferencesRole.py +2 -2
  123. phoenix/server/api/types/Model.py +2 -2
  124. phoenix/server/api/types/Project.py +11 -18
  125. phoenix/server/api/types/Segments.py +3 -3
  126. phoenix/server/api/types/Span.py +45 -7
  127. phoenix/server/api/types/TemplateLanguage.py +9 -0
  128. phoenix/server/api/types/TimeSeries.py +8 -7
  129. phoenix/server/api/types/Trace.py +2 -2
  130. phoenix/server/api/types/UMAPPoints.py +6 -6
  131. phoenix/server/api/types/User.py +3 -3
  132. phoenix/server/api/types/node.py +1 -3
  133. phoenix/server/api/types/pagination.py +4 -4
  134. phoenix/server/api/utils.py +2 -4
  135. phoenix/server/app.py +76 -37
  136. phoenix/server/bearer_auth.py +4 -10
  137. phoenix/server/dml_event.py +3 -3
  138. phoenix/server/dml_event_handler.py +10 -24
  139. phoenix/server/grpc_server.py +3 -2
  140. phoenix/server/jwt_store.py +22 -21
  141. phoenix/server/main.py +17 -4
  142. phoenix/server/oauth2.py +3 -2
  143. phoenix/server/rate_limiters.py +5 -8
  144. phoenix/server/static/.vite/manifest.json +31 -31
  145. phoenix/server/static/assets/components-Csu8UKOs.js +1612 -0
  146. phoenix/server/static/assets/{index-DCzakdJq.js → index-Bk5C9EA7.js} +2 -2
  147. phoenix/server/static/assets/{pages-CAL1FDMt.js → pages-UeWaKXNs.js} +337 -442
  148. phoenix/server/static/assets/{vendor-6IcPAw_j.js → vendor-CtqfhlbC.js} +6 -6
  149. phoenix/server/static/assets/{vendor-arizeai-DRZuoyuF.js → vendor-arizeai-C_3SBz56.js} +2 -2
  150. phoenix/server/static/assets/{vendor-codemirror-DVE2_WBr.js → vendor-codemirror-wfdk9cjp.js} +1 -1
  151. phoenix/server/static/assets/{vendor-recharts-DwrexFA4.js → vendor-recharts-BiVnSv90.js} +1 -1
  152. phoenix/server/templates/index.html +1 -0
  153. phoenix/server/thread_server.py +1 -1
  154. phoenix/server/types.py +17 -29
  155. phoenix/services.py +8 -3
  156. phoenix/session/client.py +12 -24
  157. phoenix/session/data_extractor.py +3 -3
  158. phoenix/session/evaluation.py +1 -2
  159. phoenix/session/session.py +26 -21
  160. phoenix/trace/attributes.py +16 -28
  161. phoenix/trace/dsl/filter.py +17 -21
  162. phoenix/trace/dsl/helpers.py +3 -3
  163. phoenix/trace/dsl/query.py +13 -22
  164. phoenix/trace/fixtures.py +11 -17
  165. phoenix/trace/otel.py +5 -15
  166. phoenix/trace/projects.py +3 -2
  167. phoenix/trace/schemas.py +2 -2
  168. phoenix/trace/span_evaluations.py +9 -8
  169. phoenix/trace/span_json_decoder.py +3 -3
  170. phoenix/trace/span_json_encoder.py +2 -2
  171. phoenix/trace/trace_dataset.py +6 -5
  172. phoenix/trace/utils.py +6 -6
  173. phoenix/utilities/deprecation.py +3 -2
  174. phoenix/utilities/error_handling.py +3 -2
  175. phoenix/utilities/json.py +2 -1
  176. phoenix/utilities/logging.py +2 -2
  177. phoenix/utilities/project.py +1 -1
  178. phoenix/utilities/re.py +3 -4
  179. phoenix/utilities/template_formatters.py +16 -5
  180. phoenix/version.py +1 -1
  181. arize_phoenix-5.5.2.dist-info/RECORD +0 -321
  182. phoenix/server/static/assets/components-hX0LgYz3.js +0 -1428
  183. {arize_phoenix-5.5.2.dist-info → arize_phoenix-5.7.0.dist-info}/WHEEL +0 -0
  184. {arize_phoenix-5.5.2.dist-info → arize_phoenix-5.7.0.dist-info}/entry_points.txt +0 -0
  185. {arize_phoenix-5.5.2.dist-info → arize_phoenix-5.7.0.dist-info}/licenses/IP_NOTICE +0 -0
  186. {arize_phoenix-5.5.2.dist-info → arize_phoenix-5.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,6 @@
1
+ from collections.abc import AsyncIterator
1
2
  from datetime import datetime, timezone
2
- from typing import Any, AsyncIterator, Dict, List, Literal, Optional
3
+ from typing import Any, Literal, Optional
3
4
 
4
5
  from fastapi import APIRouter, HTTPException, Query
5
6
  from pydantic import Field
@@ -28,16 +29,16 @@ router = APIRouter(tags=["spans"])
28
29
 
29
30
 
30
31
  class SpanQuery(V1RoutesBaseModel):
31
- select: Optional[Dict[str, Any]] = None
32
- filter: Optional[Dict[str, Any]] = None
33
- explode: Optional[Dict[str, Any]] = None
34
- concat: Optional[Dict[str, Any]] = None
35
- rename: Optional[Dict[str, Any]] = None
36
- index: Optional[Dict[str, Any]] = None
32
+ select: Optional[dict[str, Any]] = None
33
+ filter: Optional[dict[str, Any]] = None
34
+ explode: Optional[dict[str, Any]] = None
35
+ concat: Optional[dict[str, Any]] = None
36
+ rename: Optional[dict[str, Any]] = None
37
+ index: Optional[dict[str, Any]] = None
37
38
 
38
39
 
39
40
  class QuerySpansRequestBody(V1RoutesBaseModel):
40
- queries: List[SpanQuery]
41
+ queries: list[SpanQuery]
41
42
  start_time: Optional[datetime] = None
42
43
  end_time: Optional[datetime] = None
43
44
  limit: int = DEFAULT_SPAN_LIMIT
@@ -153,7 +154,7 @@ class SpanAnnotation(V1RoutesBaseModel):
153
154
  result: Optional[SpanAnnotationResult] = Field(
154
155
  default=None, description="The result of the annotation"
155
156
  )
156
- metadata: Optional[Dict[str, Any]] = Field(
157
+ metadata: Optional[dict[str, Any]] = Field(
157
158
  default=None, description="Metadata for the annotation"
158
159
  )
159
160
 
@@ -171,15 +172,15 @@ class SpanAnnotation(V1RoutesBaseModel):
171
172
  )
172
173
 
173
174
 
174
- class AnnotateSpansRequestBody(RequestBody[List[SpanAnnotation]]):
175
- data: List[SpanAnnotation]
175
+ class AnnotateSpansRequestBody(RequestBody[list[SpanAnnotation]]):
176
+ data: list[SpanAnnotation]
176
177
 
177
178
 
178
179
  class InsertedSpanAnnotation(V1RoutesBaseModel):
179
180
  id: str = Field(description="The ID of the inserted span annotation")
180
181
 
181
182
 
182
- class AnnotateSpansResponseBody(ResponseBody[List[InsertedSpanAnnotation]]):
183
+ class AnnotateSpansResponseBody(ResponseBody[list[InsertedSpanAnnotation]]):
183
184
  pass
184
185
 
185
186
 
@@ -1,6 +1,6 @@
1
1
  import gzip
2
2
  import zlib
3
- from typing import Any, Dict, List, Literal, Optional
3
+ from typing import Any, Literal, Optional
4
4
 
5
5
  from fastapi import APIRouter, BackgroundTasks, Header, HTTPException, Query
6
6
  from google.protobuf.message import DecodeError
@@ -110,7 +110,7 @@ class TraceAnnotation(V1RoutesBaseModel):
110
110
  result: Optional[TraceAnnotationResult] = Field(
111
111
  default=None, description="The result of the annotation"
112
112
  )
113
- metadata: Optional[Dict[str, Any]] = Field(
113
+ metadata: Optional[dict[str, Any]] = Field(
114
114
  default=None, description="Metadata for the annotation"
115
115
  )
116
116
 
@@ -128,15 +128,15 @@ class TraceAnnotation(V1RoutesBaseModel):
128
128
  )
129
129
 
130
130
 
131
- class AnnotateTracesRequestBody(RequestBody[List[TraceAnnotation]]):
132
- data: List[TraceAnnotation] = Field(description="The trace annotations to be upserted")
131
+ class AnnotateTracesRequestBody(RequestBody[list[TraceAnnotation]]):
132
+ data: list[TraceAnnotation] = Field(description="The trace annotations to be upserted")
133
133
 
134
134
 
135
135
  class InsertedTraceAnnotation(V1RoutesBaseModel):
136
136
  id: str = Field(description="The ID of the inserted trace annotation")
137
137
 
138
138
 
139
- class AnnotateTracesResponseBody(ResponseBody[List[InsertedTraceAnnotation]]):
139
+ class AnnotateTracesResponseBody(ResponseBody[list[InsertedTraceAnnotation]]):
140
140
  pass
141
141
 
142
142
 
@@ -1,4 +1,4 @@
1
- from typing import Any, Dict, Generic, List, Optional, TypedDict, TypeVar, Union
1
+ from typing import Any, Generic, Optional, TypedDict, TypeVar, Union
2
2
 
3
3
  from typing_extensions import TypeAlias, assert_never
4
4
 
@@ -6,8 +6,8 @@ from .pydantic_compat import V1RoutesBaseModel
6
6
 
7
7
  StatusCode: TypeAlias = int
8
8
  DataType = TypeVar("DataType")
9
- Responses: TypeAlias = Dict[
10
- Union[int, str], Dict[str, Any]
9
+ Responses: TypeAlias = dict[
10
+ Union[int, str], dict[str, Any]
11
11
  ] # input type for the `responses` parameter of a fastapi route
12
12
 
13
13
 
@@ -44,12 +44,12 @@ class PaginatedResponseBody(V1RoutesBaseModel, Generic[DataType]):
44
44
  # Don't use """ for this docstring or it will be included as a description
45
45
  # in the generated OpenAPI schema.
46
46
 
47
- data: List[DataType]
47
+ data: list[DataType]
48
48
  next_cursor: Optional[str]
49
49
 
50
50
 
51
51
  def add_errors_to_responses(
52
- errors: List[Union[StatusCode, StatusCodeWithDescription]],
52
+ errors: list[Union[StatusCode, StatusCodeWithDescription]],
53
53
  /,
54
54
  *,
55
55
  responses: Optional[Responses] = None,
@@ -1,17 +1,49 @@
1
+ from itertools import chain
2
+ from typing import Any, Iterable, Iterator, Optional, Union
3
+
1
4
  import strawberry
5
+ from strawberry.extensions import SchemaExtension
6
+ from strawberry.types.base import StrawberryObjectDefinition, StrawberryType
2
7
 
3
8
  from phoenix.server.api.exceptions import get_mask_errors_extension
4
9
  from phoenix.server.api.mutations import Mutation
5
10
  from phoenix.server.api.queries import Query
6
11
  from phoenix.server.api.subscriptions import Subscription
7
-
8
- # This is the schema for generating `schema.graphql`.
9
- # See https://strawberry.rocks/docs/guides/schema-export
10
- # It should be kept in sync with the server's runtime-initialized
11
- # instance. To do so, search for the usage of `strawberry.Schema(...)`.
12
- schema = strawberry.Schema(
13
- query=Query,
14
- mutation=Mutation,
15
- extensions=[get_mask_errors_extension()],
16
- subscription=Subscription,
12
+ from phoenix.server.api.types.ChatCompletionSubscriptionPayload import (
13
+ ChatCompletionSubscriptionPayload,
17
14
  )
15
+
16
+
17
+ def build_graphql_schema(
18
+ extensions: Optional[Iterable[Union[type[SchemaExtension], SchemaExtension]]] = None,
19
+ ) -> strawberry.Schema:
20
+ """
21
+ Builds a strawberry schema.
22
+ """
23
+ return strawberry.Schema(
24
+ query=Query,
25
+ mutation=Mutation,
26
+ extensions=chain(extensions or [], [get_mask_errors_extension()]),
27
+ subscription=Subscription,
28
+ types=_implementing_types(ChatCompletionSubscriptionPayload),
29
+ )
30
+
31
+
32
+ def _implementing_types(interface: Any) -> Iterator[StrawberryType]:
33
+ """
34
+ Iterates over strawberry types implementing the given strawberry interface.
35
+ """
36
+ assert isinstance(
37
+ strawberry_definition := getattr(interface, "__strawberry_definition__", None),
38
+ StrawberryObjectDefinition,
39
+ )
40
+ assert strawberry_definition.is_interface
41
+ for subcls in interface.__subclasses__():
42
+ if isinstance(
43
+ getattr(subcls, "__strawberry_definition__", None),
44
+ StrawberryObjectDefinition,
45
+ ):
46
+ yield subcls
47
+
48
+
49
+ _EXPORTED_GRAPHQL_SCHEMA = build_graphql_schema() # used to export the GraphQL schema to file