arize-phoenix 4.19.0__py3-none-any.whl → 4.20.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-4.19.0.dist-info → arize_phoenix-4.20.0.dist-info}/METADATA +1 -1
- {arize_phoenix-4.19.0.dist-info → arize_phoenix-4.20.0.dist-info}/RECORD +13 -13
- phoenix/server/api/context.py +1 -1
- phoenix/server/api/dataloaders/span_annotations.py +6 -9
- phoenix/server/api/mutations/dataset_mutations.py +35 -1
- phoenix/server/api/routers/v1/spans.py +3 -1
- phoenix/server/api/routers/v1/traces.py +3 -1
- phoenix/server/api/types/Span.py +14 -13
- phoenix/session/client.py +2 -2
- phoenix/version.py +1 -1
- {arize_phoenix-4.19.0.dist-info → arize_phoenix-4.20.0.dist-info}/WHEEL +0 -0
- {arize_phoenix-4.19.0.dist-info → arize_phoenix-4.20.0.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-4.19.0.dist-info → arize_phoenix-4.20.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,7 +5,7 @@ phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
|
|
|
5
5
|
phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
6
6
|
phoenix/services.py,sha256=aTxhcOA1pZHB6U-B3TEcp6fqDF5oT0xCUvEUNMZVTUQ,5175
|
|
7
7
|
phoenix/settings.py,sha256=cO-qgis_S27nHirTobYI9hHPfZH18R--WMmxNdsVUwc,273
|
|
8
|
-
phoenix/version.py,sha256=
|
|
8
|
+
phoenix/version.py,sha256=5ec26x4UvCA89hZlcWfH3hpX6Ots_JFnmoRZriIx4eY,23
|
|
9
9
|
phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
|
|
11
11
|
phoenix/core/model.py,sha256=km_a--PBHOuA337ClRw9xqhOHhrUT6Rl9pz_zV0JYkQ,4843
|
|
@@ -73,7 +73,7 @@ phoenix/server/telemetry.py,sha256=T_2OKrxNViAeaANlNspEekg_Y5uZIFWvKAnpz8Aoqvk,2
|
|
|
73
73
|
phoenix/server/thread_server.py,sha256=RwXQGP_QhGD7le6WB7xEygEEuwBl5Ck_Zo8xGIYGi9M,2135
|
|
74
74
|
phoenix/server/types.py,sha256=o3uwy8NvfLO-j86v2Dl3irko6er0hvB_x4Df3S1DveM,460
|
|
75
75
|
phoenix/server/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
-
phoenix/server/api/context.py,sha256=
|
|
76
|
+
phoenix/server/api/context.py,sha256=Fk0pwRAYxnG5gplRxdJOh4dzA_QwwU1mX_CVBdWtwGw,2940
|
|
77
77
|
phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
|
|
78
78
|
phoenix/server/api/queries.py,sha256=eq2xHaQF-x4k6AGSY6b6mU2pie9bj-AJML6P2Mr0_DM,19886
|
|
79
79
|
phoenix/server/api/schema.py,sha256=BcxdqO5CSGqpKd-AAJHMjFlzaK9oJA8GJuxmMfcdjn4,434
|
|
@@ -95,7 +95,7 @@ phoenix/server/api/dataloaders/latency_ms_quantile.py,sha256=5Y2OQ_GeH1My2573eOm
|
|
|
95
95
|
phoenix/server/api/dataloaders/min_start_or_max_end_times.py,sha256=k82jVllBWkGI6xu2MAltqxdIqyw3DqoVCQcKbi-JsmM,2834
|
|
96
96
|
phoenix/server/api/dataloaders/project_by_name.py,sha256=9p6DW_zXrsB9YGILFV0wkRwiapyHbZ1IgWK9HuHxl30,1105
|
|
97
97
|
phoenix/server/api/dataloaders/record_counts.py,sha256=64OsyiQRDZASlibpQAXtRkzyA_ch89A3TvhSUByxoTI,4215
|
|
98
|
-
phoenix/server/api/dataloaders/span_annotations.py,sha256=
|
|
98
|
+
phoenix/server/api/dataloaders/span_annotations.py,sha256=v3vGkLGTn-n4khxXZY2btgvfXitvytWgBahzrrWEz0I,1078
|
|
99
99
|
phoenix/server/api/dataloaders/span_dataset_examples.py,sha256=BtLZp11fyyeaWGGBPZj2StzFM0m5jxt52zB2nFMVybo,1306
|
|
100
100
|
phoenix/server/api/dataloaders/span_descendants.py,sha256=b7jGTn0Hi22gv2yskloLnf3BG3upS9z5hnKLMT9Sxac,2094
|
|
101
101
|
phoenix/server/api/dataloaders/span_evaluations.py,sha256=IfwXW23GQaWti8F49wSJocWf7Tklf2ZJ0F6aB4cSVHs,1248
|
|
@@ -137,7 +137,7 @@ phoenix/server/api/input_types/TraceAnnotationSort.py,sha256=BzwiUnMh2VsgQYnhDlb
|
|
|
137
137
|
phoenix/server/api/input_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
138
|
phoenix/server/api/mutations/__init__.py,sha256=UKUAhD5NY-ZI7XONnRRkaHoFuuU3idmE4fk6Sjgy18M,776
|
|
139
139
|
phoenix/server/api/mutations/auth.py,sha256=vPRFoj7J6PV6QeODewG4K0PhoOebS5AfMRpbi_wuhyQ,311
|
|
140
|
-
phoenix/server/api/mutations/dataset_mutations.py,sha256=
|
|
140
|
+
phoenix/server/api/mutations/dataset_mutations.py,sha256=5i2_nT4AP36DDoHLLGwJeL7ahlAl9J8JvxiefVPjK9k,24706
|
|
141
141
|
phoenix/server/api/mutations/experiment_mutations.py,sha256=vV2lbJ7ccXZqe-LY7nXx6QxWqhKQE4UNZAFcML-KQ8I,3011
|
|
142
142
|
phoenix/server/api/mutations/export_events_mutations.py,sha256=t_wYBxaqvBJYRoHslh3Bmoxmwlzoy0u8SsBKWIKN5hE,4028
|
|
143
143
|
phoenix/server/api/mutations/project_mutations.py,sha256=d_xtYkYfZ5flpVgEkGknKB8rsEux-zZraczzqAs4e8A,2255
|
|
@@ -155,8 +155,8 @@ phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=xoVhU71U3c1QJSXiK
|
|
|
155
155
|
phoenix/server/api/routers/v1/experiment_runs.py,sha256=7qvLYgqH58nxqhTnJ0hPf0PBfVmZnbxquodSnEGoQxk,6059
|
|
156
156
|
phoenix/server/api/routers/v1/experiments.py,sha256=AFJb8Pi6SDKbIbkDRWUtPjikZIoRhc7cFLWm40l3mPk,9817
|
|
157
157
|
phoenix/server/api/routers/v1/pydantic_compat.py,sha256=FeK8oe2brqu-djsoqRxiKL4tw5cHmi89OHVfCFxYsAo,2890
|
|
158
|
-
phoenix/server/api/routers/v1/spans.py,sha256
|
|
159
|
-
phoenix/server/api/routers/v1/traces.py,sha256=
|
|
158
|
+
phoenix/server/api/routers/v1/spans.py,sha256=4Cf1zYX7h0J4jT3iPpm9-1Jibc2gOV6qTsWpCcdRv-M,8547
|
|
159
|
+
phoenix/server/api/routers/v1/traces.py,sha256=PurZxyh_ECSSKkw2W7GIV6E1WykmLMGn-qQvP1Km9Os,7601
|
|
160
160
|
phoenix/server/api/routers/v1/utils.py,sha256=xvl2v-BKUkqmFVMmgmmWGFKuRBTrUdoiAeT3mCYEE68,3086
|
|
161
161
|
phoenix/server/api/types/Annotation.py,sha256=7Ym7iuVcbwHlw2yIRylz4nATAF_Cm-Z17qcjiooj1cc,751
|
|
162
162
|
phoenix/server/api/types/AnnotationSummary.py,sha256=8B2LIROqcrPOi8hvYygsblKvSEBfSrysnKOV7F36hgA,1518
|
|
@@ -203,7 +203,7 @@ phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSF
|
|
|
203
203
|
phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
|
|
204
204
|
phoenix/server/api/types/Segments.py,sha256=m2yoegrxA1Tn7ZAy1rMjjD1isc752MaAXMoffkBlvrM,2921
|
|
205
205
|
phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
|
|
206
|
-
phoenix/server/api/types/Span.py,sha256=
|
|
206
|
+
phoenix/server/api/types/Span.py,sha256=Xnq8fgRQlW9whLoya8TPYHyWBhPtvJXCtCD8PBzeVSo,15267
|
|
207
207
|
phoenix/server/api/types/SpanAnnotation.py,sha256=6b5G-b_OoRvDL2ayWk7MkbqarLK-F-pQMx21CpUuNGY,1168
|
|
208
208
|
phoenix/server/api/types/TimeSeries.py,sha256=wjzuxHFqCey0O7Ys25qiXyuqXK8an-osyNWUE8A_8G4,5227
|
|
209
209
|
phoenix/server/api/types/Trace.py,sha256=-nh3A-S_BlQK1VSSOTWqM85l-WwJsRHifxeDi0sFWZE,3246
|
|
@@ -238,7 +238,7 @@ phoenix/server/static/assets/vendor-three-DwGkEfCM.js,sha256=0D12ZgKzfKCTSdSTKJB
|
|
|
238
238
|
phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
239
239
|
phoenix/server/templates/index.html,sha256=gVpjB8pCMiubdMh2DA9mTCtV5AVTXJH_9u5PmG2t7Vk,4238
|
|
240
240
|
phoenix/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
241
|
-
phoenix/session/client.py,sha256=
|
|
241
|
+
phoenix/session/client.py,sha256=C-NpmDkcyGZHR0vv5gWtteUi01cIorjWnqie9WuZb9s,32663
|
|
242
242
|
phoenix/session/data_extractor.py,sha256=gkEM3WWZAlWGMfRgQopAQlid4cSi6GNco-sdrGir0qc,2788
|
|
243
243
|
phoenix/session/evaluation.py,sha256=aKeV8UVOyq3b7CYOwt3cWuLz0xzvMjX7vlEPILJ_fcs,5311
|
|
244
244
|
phoenix/session/session.py,sha256=l10fiotlO1b-SFehcm8N3aVupdFUYYLiLSBrOCJO9as,26911
|
|
@@ -279,8 +279,8 @@ phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,
|
|
|
279
279
|
phoenix/utilities/project.py,sha256=8IJuMM4yUMoooPi37sictGj8Etu9rGmq6RFtc9848cQ,436
|
|
280
280
|
phoenix/utilities/re.py,sha256=PDve_OLjRTM8yQQJHC8-n3HdIONi7aNils3ZKRZ5uBM,2045
|
|
281
281
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
282
|
-
arize_phoenix-4.
|
|
283
|
-
arize_phoenix-4.
|
|
284
|
-
arize_phoenix-4.
|
|
285
|
-
arize_phoenix-4.
|
|
286
|
-
arize_phoenix-4.
|
|
282
|
+
arize_phoenix-4.20.0.dist-info/METADATA,sha256=xjeoRvHxOTBnsy4yoMevcdFPYVmwJI0ftKKA4oV4cPQ,11829
|
|
283
|
+
arize_phoenix-4.20.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
284
|
+
arize_phoenix-4.20.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
285
|
+
arize_phoenix-4.20.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
286
|
+
arize_phoenix-4.20.0.dist-info/RECORD,,
|
phoenix/server/api/context.py
CHANGED
|
@@ -54,6 +54,7 @@ class DataLoaders:
|
|
|
54
54
|
latency_ms_quantile: LatencyMsQuantileDataLoader
|
|
55
55
|
min_start_or_max_end_times: MinStartOrMaxEndTimeDataLoader
|
|
56
56
|
record_counts: RecordCountDataLoader
|
|
57
|
+
span_annotations: SpanAnnotationsDataLoader
|
|
57
58
|
span_dataset_examples: SpanDatasetExamplesDataLoader
|
|
58
59
|
span_descendants: SpanDescendantsDataLoader
|
|
59
60
|
span_evaluations: SpanEvaluationsDataLoader
|
|
@@ -62,7 +63,6 @@ class DataLoaders:
|
|
|
62
63
|
trace_evaluations: TraceEvaluationsDataLoader
|
|
63
64
|
trace_row_ids: TraceRowIdsDataLoader
|
|
64
65
|
project_by_name: ProjectByNameDataLoader
|
|
65
|
-
span_annotations: SpanAnnotationsDataLoader
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
ProjectRowId: TypeAlias = int
|
|
@@ -8,12 +8,11 @@ from sqlalchemy import select
|
|
|
8
8
|
from strawberry.dataloader import DataLoader
|
|
9
9
|
from typing_extensions import TypeAlias
|
|
10
10
|
|
|
11
|
-
from phoenix.db import
|
|
12
|
-
from phoenix.server.api.types.SpanAnnotation import SpanAnnotation, to_gql_span_annotation
|
|
11
|
+
from phoenix.db.models import SpanAnnotation as ORMSpanAnnotation
|
|
13
12
|
from phoenix.server.types import DbSessionFactory
|
|
14
13
|
|
|
15
14
|
Key: TypeAlias = int
|
|
16
|
-
Result: TypeAlias = List[
|
|
15
|
+
Result: TypeAlias = List[ORMSpanAnnotation]
|
|
17
16
|
|
|
18
17
|
|
|
19
18
|
class SpanAnnotationsDataLoader(DataLoader[Key, Result]):
|
|
@@ -23,11 +22,9 @@ class SpanAnnotationsDataLoader(DataLoader[Key, Result]):
|
|
|
23
22
|
|
|
24
23
|
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
25
24
|
span_annotations_by_id: DefaultDict[Key, Result] = defaultdict(list)
|
|
26
|
-
msa = models.SpanAnnotation
|
|
27
25
|
async with self._db() as session:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
)
|
|
26
|
+
async for span_annotation in await session.stream_scalars(
|
|
27
|
+
select(ORMSpanAnnotation).where(ORMSpanAnnotation.span_rowid.in_(keys))
|
|
28
|
+
):
|
|
29
|
+
span_annotations_by_id[span_annotation.span_rowid].append(span_annotation)
|
|
33
30
|
return [span_annotations_by_id[key] for key in keys]
|
|
@@ -154,6 +154,36 @@ class DatasetMutationMixin:
|
|
|
154
154
|
raise ValueError(
|
|
155
155
|
f"Could not find spans with rowids: {', '.join(map(str, missing_span_rowids))}"
|
|
156
156
|
) # todo: implement error handling types https://github.com/Arize-ai/phoenix/issues/3221
|
|
157
|
+
|
|
158
|
+
span_annotations = (
|
|
159
|
+
await session.execute(
|
|
160
|
+
select(
|
|
161
|
+
models.SpanAnnotation.span_rowid,
|
|
162
|
+
models.SpanAnnotation.name,
|
|
163
|
+
models.SpanAnnotation.label,
|
|
164
|
+
models.SpanAnnotation.score,
|
|
165
|
+
models.SpanAnnotation.explanation,
|
|
166
|
+
models.SpanAnnotation.metadata_,
|
|
167
|
+
models.SpanAnnotation.annotator_kind,
|
|
168
|
+
)
|
|
169
|
+
.select_from(models.SpanAnnotation)
|
|
170
|
+
.where(models.SpanAnnotation.span_rowid.in_(span_rowids))
|
|
171
|
+
)
|
|
172
|
+
).all()
|
|
173
|
+
|
|
174
|
+
span_annotations_by_span: Dict[int, Dict[Any, Any]] = {span.id: {} for span in spans}
|
|
175
|
+
for annotation in span_annotations:
|
|
176
|
+
span_id = annotation.span_rowid
|
|
177
|
+
if span_id not in span_annotations_by_span:
|
|
178
|
+
span_annotations_by_span[span_id] = dict()
|
|
179
|
+
span_annotations_by_span[span_id][annotation.name] = {
|
|
180
|
+
"label": annotation.label,
|
|
181
|
+
"score": annotation.score,
|
|
182
|
+
"explanation": annotation.explanation,
|
|
183
|
+
"metadata": annotation.metadata_,
|
|
184
|
+
"annotator_kind": annotation.annotator_kind,
|
|
185
|
+
}
|
|
186
|
+
|
|
157
187
|
DatasetExample = models.DatasetExample
|
|
158
188
|
dataset_example_rowids = (
|
|
159
189
|
await session.scalars(
|
|
@@ -170,6 +200,7 @@ class DatasetMutationMixin:
|
|
|
170
200
|
assert len(dataset_example_rowids) == len(spans)
|
|
171
201
|
assert all(map(lambda id: isinstance(id, int), dataset_example_rowids))
|
|
172
202
|
DatasetExampleRevision = models.DatasetExampleRevision
|
|
203
|
+
|
|
173
204
|
await session.execute(
|
|
174
205
|
insert(DatasetExampleRevision),
|
|
175
206
|
[
|
|
@@ -178,7 +209,10 @@ class DatasetMutationMixin:
|
|
|
178
209
|
DatasetExampleRevision.dataset_version_id.key: dataset_version_rowid,
|
|
179
210
|
DatasetExampleRevision.input.key: get_dataset_example_input(span),
|
|
180
211
|
DatasetExampleRevision.output.key: get_dataset_example_output(span),
|
|
181
|
-
DatasetExampleRevision.metadata_.key:
|
|
212
|
+
DatasetExampleRevision.metadata_.key: {
|
|
213
|
+
**span.attributes,
|
|
214
|
+
"annotations": span_annotations_by_span[span.id],
|
|
215
|
+
},
|
|
182
216
|
DatasetExampleRevision.revision_kind.key: "CREATE",
|
|
183
217
|
}
|
|
184
218
|
for dataset_example_rowid, span in zip(dataset_example_rowids, spans)
|
|
@@ -23,7 +23,7 @@ from .utils import RequestBody, ResponseBody, add_errors_to_responses
|
|
|
23
23
|
|
|
24
24
|
DEFAULT_SPAN_LIMIT = 1000
|
|
25
25
|
|
|
26
|
-
router = APIRouter(tags=["
|
|
26
|
+
router = APIRouter(tags=["spans"])
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
class SpanQuery(V1RoutesBaseModel):
|
|
@@ -65,6 +65,7 @@ class QuerySpansRequestBody(V1RoutesBaseModel):
|
|
|
65
65
|
operation_id="querySpans",
|
|
66
66
|
summary="Query spans with query DSL",
|
|
67
67
|
responses=add_errors_to_responses([HTTP_404_NOT_FOUND, HTTP_422_UNPROCESSABLE_ENTITY]),
|
|
68
|
+
include_in_schema=False,
|
|
68
69
|
)
|
|
69
70
|
async def query_spans_handler(
|
|
70
71
|
request: Request,
|
|
@@ -189,6 +190,7 @@ class AnnotateSpansResponseBody(ResponseBody[List[InsertedSpanAnnotation]]):
|
|
|
189
190
|
[{"status_code": HTTP_404_NOT_FOUND, "description": "Span not found"}]
|
|
190
191
|
),
|
|
191
192
|
response_description="Span annotations inserted successfully",
|
|
193
|
+
include_in_schema=True,
|
|
192
194
|
)
|
|
193
195
|
async def annotate_spans(
|
|
194
196
|
request: Request,
|
|
@@ -30,7 +30,7 @@ from phoenix.utilities.project import get_project_name
|
|
|
30
30
|
from .pydantic_compat import V1RoutesBaseModel
|
|
31
31
|
from .utils import RequestBody, ResponseBody, add_errors_to_responses
|
|
32
32
|
|
|
33
|
-
router = APIRouter(tags=["traces"]
|
|
33
|
+
router = APIRouter(tags=["traces"])
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
@router.post(
|
|
@@ -57,6 +57,7 @@ router = APIRouter(tags=["traces"], include_in_schema=False)
|
|
|
57
57
|
},
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
|
+
include_in_schema=False,
|
|
60
61
|
)
|
|
61
62
|
async def post_traces(
|
|
62
63
|
request: Request,
|
|
@@ -145,6 +146,7 @@ class AnnotateTracesResponseBody(ResponseBody[List[InsertedTraceAnnotation]]):
|
|
|
145
146
|
responses=add_errors_to_responses(
|
|
146
147
|
[{"status_code": HTTP_404_NOT_FOUND, "description": "Trace not found"}]
|
|
147
148
|
),
|
|
149
|
+
include_in_schema=False,
|
|
148
150
|
)
|
|
149
151
|
async def annotate_traces(
|
|
150
152
|
request: Request,
|
phoenix/server/api/types/Span.py
CHANGED
|
@@ -7,7 +7,6 @@ from typing import TYPE_CHECKING, Any, List, Mapping, Optional, Sized, cast
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
import strawberry
|
|
9
9
|
from openinference.semconv.trace import EmbeddingAttributes, SpanAttributes
|
|
10
|
-
from sqlalchemy import select
|
|
11
10
|
from strawberry import ID, UNSET
|
|
12
11
|
from strawberry.relay import Node, NodeID
|
|
13
12
|
from strawberry.types import Info
|
|
@@ -20,7 +19,10 @@ from phoenix.server.api.helpers.dataset_helpers import (
|
|
|
20
19
|
get_dataset_example_input,
|
|
21
20
|
get_dataset_example_output,
|
|
22
21
|
)
|
|
23
|
-
from phoenix.server.api.input_types.SpanAnnotationSort import
|
|
22
|
+
from phoenix.server.api.input_types.SpanAnnotationSort import (
|
|
23
|
+
SpanAnnotationColumn,
|
|
24
|
+
SpanAnnotationSort,
|
|
25
|
+
)
|
|
24
26
|
from phoenix.server.api.types.SortDir import SortDir
|
|
25
27
|
from phoenix.server.api.types.SpanAnnotation import to_gql_span_annotation
|
|
26
28
|
from phoenix.trace.attributes import get_attribute_value
|
|
@@ -190,17 +192,16 @@ class Span(Node):
|
|
|
190
192
|
info: Info[Context, None],
|
|
191
193
|
sort: Optional[SpanAnnotationSort] = UNSET,
|
|
192
194
|
) -> List[SpanAnnotation]:
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
annotations = await session.scalars(stmt)
|
|
195
|
+
span_id = self.id_attr
|
|
196
|
+
annotations = await info.context.data_loaders.span_annotations.load(span_id)
|
|
197
|
+
sort_key = SpanAnnotationColumn.createdAt.value
|
|
198
|
+
sort_descending = True
|
|
199
|
+
if sort:
|
|
200
|
+
sort_key = sort.col.value
|
|
201
|
+
sort_descending = sort.dir is SortDir.desc
|
|
202
|
+
annotations.sort(
|
|
203
|
+
key=lambda annotation: getattr(annotation, sort_key), reverse=sort_descending
|
|
204
|
+
)
|
|
204
205
|
return [to_gql_span_annotation(annotation) for annotation in annotations]
|
|
205
206
|
|
|
206
207
|
@strawberry.field(
|
phoenix/session/client.py
CHANGED
|
@@ -324,7 +324,7 @@ class Client(TraceDataExtractor):
|
|
|
324
324
|
Dataset: The dataset object.
|
|
325
325
|
"""
|
|
326
326
|
response = self._client.get(
|
|
327
|
-
urljoin(self._base_url, "
|
|
327
|
+
urljoin(self._base_url, "v1/datasets"),
|
|
328
328
|
params={"name": name},
|
|
329
329
|
)
|
|
330
330
|
response.raise_for_status()
|
|
@@ -366,7 +366,7 @@ class Client(TraceDataExtractor):
|
|
|
366
366
|
raise ValueError("Dataset id or name must be provided.")
|
|
367
367
|
|
|
368
368
|
response = self._client.get(
|
|
369
|
-
urljoin(self._base_url, f"
|
|
369
|
+
urljoin(self._base_url, f"v1/datasets/{quote(id)}/examples"),
|
|
370
370
|
params={"version_id": version_id} if version_id else None,
|
|
371
371
|
)
|
|
372
372
|
response.raise_for_status()
|
phoenix/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "4.
|
|
1
|
+
__version__ = "4.20.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|