arize-phoenix 6.1.0__py3-none-any.whl → 7.0.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 (54) hide show
  1. {arize_phoenix-6.1.0.dist-info → arize_phoenix-7.0.0.dist-info}/METADATA +9 -8
  2. {arize_phoenix-6.1.0.dist-info → arize_phoenix-7.0.0.dist-info}/RECORD +52 -38
  3. phoenix/config.py +4 -1
  4. phoenix/db/engines.py +1 -1
  5. phoenix/db/insertion/span.py +65 -30
  6. phoenix/db/migrate.py +4 -1
  7. phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  8. phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +199 -0
  9. phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +66 -0
  10. phoenix/db/models.py +27 -0
  11. phoenix/metrics/wrappers.py +7 -1
  12. phoenix/server/api/context.py +15 -2
  13. phoenix/server/api/dataloaders/__init__.py +14 -2
  14. phoenix/server/api/dataloaders/session_io.py +75 -0
  15. phoenix/server/api/dataloaders/session_num_traces.py +30 -0
  16. phoenix/server/api/dataloaders/session_num_traces_with_error.py +32 -0
  17. phoenix/server/api/dataloaders/session_token_usages.py +41 -0
  18. phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +55 -0
  19. phoenix/server/api/dataloaders/trace_by_trace_ids.py +25 -0
  20. phoenix/server/api/dataloaders/trace_root_spans.py +32 -0
  21. phoenix/server/api/input_types/ProjectSessionSort.py +29 -0
  22. phoenix/server/api/mutations/chat_mutations.py +5 -0
  23. phoenix/server/api/mutations/project_mutations.py +12 -2
  24. phoenix/server/api/queries.py +14 -9
  25. phoenix/server/api/subscriptions.py +6 -0
  26. phoenix/server/api/types/EmbeddingDimension.py +1 -1
  27. phoenix/server/api/types/ExperimentRun.py +3 -4
  28. phoenix/server/api/types/ExperimentRunAnnotation.py +3 -4
  29. phoenix/server/api/types/Project.py +150 -12
  30. phoenix/server/api/types/ProjectSession.py +139 -0
  31. phoenix/server/api/types/Span.py +6 -19
  32. phoenix/server/api/types/SpanIOValue.py +15 -0
  33. phoenix/server/api/types/TokenUsage.py +11 -0
  34. phoenix/server/api/types/Trace.py +59 -2
  35. phoenix/server/app.py +15 -2
  36. phoenix/server/static/.vite/manifest.json +40 -31
  37. phoenix/server/static/assets/{components-CdiZ1Osh.js → components-DKH6AzJw.js} +410 -351
  38. phoenix/server/static/assets/index-DLV87qiO.js +93 -0
  39. phoenix/server/static/assets/{pages-FArMEfgg.js → pages-CVY3Nv4Z.js} +638 -316
  40. phoenix/server/static/assets/vendor-Cb3zlNNd.js +894 -0
  41. phoenix/server/static/assets/{vendor-arizeai-BG6iwyLC.js → vendor-arizeai-Buo4e1A6.js} +2 -2
  42. phoenix/server/static/assets/{vendor-codemirror-BotnVFFX.js → vendor-codemirror-BuAQiUVf.js} +5 -5
  43. phoenix/server/static/assets/{vendor-recharts-Dy5gEFzQ.js → vendor-recharts-Cl9dK5tC.js} +1 -1
  44. phoenix/server/static/assets/{vendor-Bnv1dNRQ.js → vendor-shiki-CazYUixL.js} +5 -898
  45. phoenix/session/client.py +13 -4
  46. phoenix/trace/fixtures.py +8 -0
  47. phoenix/trace/schemas.py +16 -0
  48. phoenix/version.py +1 -1
  49. phoenix/server/api/dataloaders/trace_row_ids.py +0 -33
  50. phoenix/server/static/assets/index-D_sCOjlG.js +0 -101
  51. {arize_phoenix-6.1.0.dist-info → arize_phoenix-7.0.0.dist-info}/WHEEL +0 -0
  52. {arize_phoenix-6.1.0.dist-info → arize_phoenix-7.0.0.dist-info}/entry_points.txt +0 -0
  53. {arize_phoenix-6.1.0.dist-info → arize_phoenix-7.0.0.dist-info}/licenses/IP_NOTICE +0 -0
  54. {arize_phoenix-6.1.0.dist-info → arize_phoenix-7.0.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,11 @@
1
+ import strawberry
2
+
3
+
4
+ @strawberry.type
5
+ class TokenUsage:
6
+ prompt: int = 0
7
+ completion: int = 0
8
+
9
+ @strawberry.field
10
+ async def total(self) -> int:
11
+ return self.prompt + self.completion
@@ -1,11 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Optional
3
+ from datetime import datetime
4
+ from typing import TYPE_CHECKING, Annotated, Optional, Union
4
5
 
5
6
  import strawberry
7
+ from openinference.semconv.trace import SpanAttributes
6
8
  from sqlalchemy import desc, select
7
9
  from sqlalchemy.orm import contains_eager
8
- from strawberry import UNSET, Private
10
+ from strawberry import UNSET, Private, lazy
9
11
  from strawberry.relay import Connection, GlobalID, Node, NodeID
10
12
  from strawberry.types import Info
11
13
 
@@ -21,12 +23,18 @@ from phoenix.server.api.types.SortDir import SortDir
21
23
  from phoenix.server.api.types.Span import Span, to_gql_span
22
24
  from phoenix.server.api.types.TraceAnnotation import TraceAnnotation, to_gql_trace_annotation
23
25
 
26
+ if TYPE_CHECKING:
27
+ from phoenix.server.api.types.ProjectSession import ProjectSession
28
+
24
29
 
25
30
  @strawberry.type
26
31
  class Trace(Node):
27
32
  id_attr: NodeID[int]
28
33
  project_rowid: Private[int]
34
+ project_session_rowid: Private[Optional[int]]
29
35
  trace_id: str
36
+ start_time: datetime
37
+ end_time: datetime
30
38
 
31
39
  @strawberry.field
32
40
  async def project_id(self) -> GlobalID:
@@ -34,6 +42,40 @@ class Trace(Node):
34
42
 
35
43
  return GlobalID(type_name=Project.__name__, node_id=str(self.project_rowid))
36
44
 
45
+ @strawberry.field
46
+ async def project_session_id(self) -> Optional[GlobalID]:
47
+ if self.project_session_rowid is None:
48
+ return None
49
+ from phoenix.server.api.types.ProjectSession import ProjectSession
50
+
51
+ return GlobalID(type_name=ProjectSession.__name__, node_id=str(self.project_session_rowid))
52
+
53
+ @strawberry.field
54
+ async def session(
55
+ self,
56
+ info: Info[Context, None],
57
+ ) -> Union[Annotated["ProjectSession", lazy(".ProjectSession")], None]:
58
+ if self.project_session_rowid is None:
59
+ return None
60
+ from phoenix.server.api.types.ProjectSession import to_gql_project_session
61
+
62
+ stmt = select(models.ProjectSession).filter_by(id=self.project_session_rowid)
63
+ async with info.context.db() as session:
64
+ project_session = await session.scalar(stmt)
65
+ if project_session is None:
66
+ return None
67
+ return to_gql_project_session(project_session)
68
+
69
+ @strawberry.field
70
+ async def root_span(
71
+ self,
72
+ info: Info[Context, None],
73
+ ) -> Optional[Span]:
74
+ span = await info.context.data_loaders.trace_root_spans.load(self.id_attr)
75
+ if span is None:
76
+ return None
77
+ return to_gql_span(span)
78
+
37
79
  @strawberry.field
38
80
  async def spans(
39
81
  self,
@@ -82,3 +124,18 @@ class Trace(Node):
82
124
  stmt = stmt.order_by(models.TraceAnnotation.created_at.desc())
83
125
  annotations = await session.scalars(stmt)
84
126
  return [to_gql_trace_annotation(annotation) for annotation in annotations]
127
+
128
+
129
+ def to_gql_trace(trace: models.Trace) -> Trace:
130
+ return Trace(
131
+ id_attr=trace.id,
132
+ project_rowid=trace.project_rowid,
133
+ project_session_rowid=trace.project_session_rowid,
134
+ trace_id=trace.trace_id,
135
+ start_time=trace.start_time,
136
+ end_time=trace.end_time,
137
+ )
138
+
139
+
140
+ INPUT_VALUE = SpanAttributes.INPUT_VALUE.split(".")
141
+ OUTPUT_VALUE = SpanAttributes.OUTPUT_VALUE.split(".")
phoenix/server/app.py CHANGED
@@ -87,12 +87,18 @@ from phoenix.server.api.dataloaders import (
87
87
  MinStartOrMaxEndTimeDataLoader,
88
88
  ProjectByNameDataLoader,
89
89
  RecordCountDataLoader,
90
+ SessionIODataLoader,
91
+ SessionNumTracesDataLoader,
92
+ SessionNumTracesWithErrorDataLoader,
93
+ SessionTokenUsagesDataLoader,
94
+ SessionTraceLatencyMsQuantileDataLoader,
90
95
  SpanAnnotationsDataLoader,
91
96
  SpanDatasetExamplesDataLoader,
92
97
  SpanDescendantsDataLoader,
93
98
  SpanProjectsDataLoader,
94
99
  TokenCountDataLoader,
95
- TraceRowIdsDataLoader,
100
+ TraceByTraceIdsDataLoader,
101
+ TraceRootSpansDataLoader,
96
102
  UserRolesDataLoader,
97
103
  UsersDataLoader,
98
104
  )
@@ -609,6 +615,12 @@ def create_graphql_router(
609
615
  db,
610
616
  cache_map=cache_for_dataloaders.record_count if cache_for_dataloaders else None,
611
617
  ),
618
+ session_first_inputs=SessionIODataLoader(db, "first_input"),
619
+ session_last_outputs=SessionIODataLoader(db, "last_output"),
620
+ session_num_traces=SessionNumTracesDataLoader(db),
621
+ session_num_traces_with_error=SessionNumTracesWithErrorDataLoader(db),
622
+ session_token_usages=SessionTokenUsagesDataLoader(db),
623
+ session_trace_latency_ms_quantile=SessionTraceLatencyMsQuantileDataLoader(db),
612
624
  span_annotations=SpanAnnotationsDataLoader(db),
613
625
  span_dataset_examples=SpanDatasetExamplesDataLoader(db),
614
626
  span_descendants=SpanDescendantsDataLoader(db),
@@ -617,7 +629,8 @@ def create_graphql_router(
617
629
  db,
618
630
  cache_map=cache_for_dataloaders.token_count if cache_for_dataloaders else None,
619
631
  ),
620
- trace_row_ids=TraceRowIdsDataLoader(db),
632
+ trace_by_trace_ids=TraceByTraceIdsDataLoader(db),
633
+ trace_root_spans=TraceRootSpansDataLoader(db),
621
634
  project_by_name=ProjectByNameDataLoader(db),
622
635
  users=UsersDataLoader(db),
623
636
  user_roles=UserRolesDataLoader(db),
@@ -1,32 +1,32 @@
1
1
  {
2
- "_components-CdiZ1Osh.js": {
3
- "file": "assets/components-CdiZ1Osh.js",
2
+ "_components-DKH6AzJw.js": {
3
+ "file": "assets/components-DKH6AzJw.js",
4
4
  "name": "components",
5
5
  "imports": [
6
- "_vendor-Bnv1dNRQ.js",
7
- "_pages-FArMEfgg.js",
8
- "_vendor-arizeai-BG6iwyLC.js",
9
- "_vendor-codemirror-BotnVFFX.js",
6
+ "_vendor-Cb3zlNNd.js",
7
+ "_pages-CVY3Nv4Z.js",
8
+ "_vendor-arizeai-Buo4e1A6.js",
9
+ "_vendor-codemirror-BuAQiUVf.js",
10
10
  "_vendor-three-DwGkEfCM.js"
11
11
  ]
12
12
  },
13
- "_pages-FArMEfgg.js": {
14
- "file": "assets/pages-FArMEfgg.js",
13
+ "_pages-CVY3Nv4Z.js": {
14
+ "file": "assets/pages-CVY3Nv4Z.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
- "_vendor-Bnv1dNRQ.js",
18
- "_vendor-arizeai-BG6iwyLC.js",
19
- "_components-CdiZ1Osh.js",
20
- "_vendor-recharts-Dy5gEFzQ.js",
21
- "_vendor-codemirror-BotnVFFX.js"
17
+ "_vendor-Cb3zlNNd.js",
18
+ "_vendor-arizeai-Buo4e1A6.js",
19
+ "_components-DKH6AzJw.js",
20
+ "_vendor-recharts-Cl9dK5tC.js",
21
+ "_vendor-codemirror-BuAQiUVf.js"
22
22
  ]
23
23
  },
24
24
  "_vendor-!~{003}~.js": {
25
25
  "file": "assets/vendor-DxkFTwjz.css",
26
26
  "src": "_vendor-!~{003}~.js"
27
27
  },
28
- "_vendor-Bnv1dNRQ.js": {
29
- "file": "assets/vendor-Bnv1dNRQ.js",
28
+ "_vendor-Cb3zlNNd.js": {
29
+ "file": "assets/vendor-Cb3zlNNd.js",
30
30
  "name": "vendor",
31
31
  "imports": [
32
32
  "_vendor-three-DwGkEfCM.js"
@@ -35,25 +35,33 @@
35
35
  "assets/vendor-DxkFTwjz.css"
36
36
  ]
37
37
  },
38
- "_vendor-arizeai-BG6iwyLC.js": {
39
- "file": "assets/vendor-arizeai-BG6iwyLC.js",
38
+ "_vendor-arizeai-Buo4e1A6.js": {
39
+ "file": "assets/vendor-arizeai-Buo4e1A6.js",
40
40
  "name": "vendor-arizeai",
41
41
  "imports": [
42
- "_vendor-Bnv1dNRQ.js"
42
+ "_vendor-Cb3zlNNd.js"
43
43
  ]
44
44
  },
45
- "_vendor-codemirror-BotnVFFX.js": {
46
- "file": "assets/vendor-codemirror-BotnVFFX.js",
45
+ "_vendor-codemirror-BuAQiUVf.js": {
46
+ "file": "assets/vendor-codemirror-BuAQiUVf.js",
47
47
  "name": "vendor-codemirror",
48
48
  "imports": [
49
- "_vendor-Bnv1dNRQ.js"
49
+ "_vendor-Cb3zlNNd.js",
50
+ "_vendor-shiki-CazYUixL.js"
50
51
  ]
51
52
  },
52
- "_vendor-recharts-Dy5gEFzQ.js": {
53
- "file": "assets/vendor-recharts-Dy5gEFzQ.js",
53
+ "_vendor-recharts-Cl9dK5tC.js": {
54
+ "file": "assets/vendor-recharts-Cl9dK5tC.js",
54
55
  "name": "vendor-recharts",
55
56
  "imports": [
56
- "_vendor-Bnv1dNRQ.js"
57
+ "_vendor-Cb3zlNNd.js"
58
+ ]
59
+ },
60
+ "_vendor-shiki-CazYUixL.js": {
61
+ "file": "assets/vendor-shiki-CazYUixL.js",
62
+ "name": "vendor-shiki",
63
+ "imports": [
64
+ "_vendor-Cb3zlNNd.js"
57
65
  ]
58
66
  },
59
67
  "_vendor-three-DwGkEfCM.js": {
@@ -61,18 +69,19 @@
61
69
  "name": "vendor-three"
62
70
  },
63
71
  "index.tsx": {
64
- "file": "assets/index-D_sCOjlG.js",
72
+ "file": "assets/index-DLV87qiO.js",
65
73
  "name": "index",
66
74
  "src": "index.tsx",
67
75
  "isEntry": true,
68
76
  "imports": [
69
- "_vendor-Bnv1dNRQ.js",
70
- "_vendor-arizeai-BG6iwyLC.js",
71
- "_pages-FArMEfgg.js",
72
- "_components-CdiZ1Osh.js",
77
+ "_vendor-Cb3zlNNd.js",
78
+ "_vendor-arizeai-Buo4e1A6.js",
79
+ "_pages-CVY3Nv4Z.js",
80
+ "_components-DKH6AzJw.js",
73
81
  "_vendor-three-DwGkEfCM.js",
74
- "_vendor-recharts-Dy5gEFzQ.js",
75
- "_vendor-codemirror-BotnVFFX.js"
82
+ "_vendor-recharts-Cl9dK5tC.js",
83
+ "_vendor-codemirror-BuAQiUVf.js",
84
+ "_vendor-shiki-CazYUixL.js"
76
85
  ]
77
86
  }
78
87
  }