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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 4.19.0
3
+ Version: 4.20.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -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=Fp9FRZ7Y9YVSCh7eiorMVnopeqssImC_xE1F6sMNAaY,23
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=70fJ9_O2yD-JEiCUM6WuKr6Byw9Sq00z_q0gBFW0Acg,2940
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=QsbAGPFitFxOCI9yJPPlueuMh0LqN18hMo-Vx2P8EsI,1194
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=CuKhxsYfvwVcdN_9EXhKxB6444BQfObzKzzyfAeg-n8,23199
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=-nDcr0AjynS-0U6A2nxEQiUTLoNyfzE-3NiFObyfyVQ,8516
159
- phoenix/server/api/routers/v1/traces.py,sha256=4k_57UICPfRcyQsdPBK-Xo_n6oZ1p41XUwXhZEQpXwE,7568
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=PRVjcC79qyxz8FW-YT90rDgcW8dkVO9_5pXxUXeH31g,15448
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=RSaEALbFu-En5oJLv7K4BmwdkrsIC5ZbjMX7Mlny8_Y,32665
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.19.0.dist-info/METADATA,sha256=XNi1_9Af0PcDBKgp1T34UljJcp4wbJ21lXL4b4o0s5s,11829
283
- arize_phoenix-4.19.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
284
- arize_phoenix-4.19.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
285
- arize_phoenix-4.19.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
286
- arize_phoenix-4.19.0.dist-info/RECORD,,
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,,
@@ -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 models
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[SpanAnnotation]
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
- data = await session.stream_scalars(select(msa).where(msa.span_rowid.in_(keys)))
29
- async for span_annotation in data:
30
- span_annotations_by_id[span_annotation.span_rowid].append(
31
- to_gql_span_annotation(span_annotation)
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: span.attributes,
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=["traces"], include_in_schema=False)
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"], include_in_schema=False)
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,
@@ -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 SpanAnnotationSort
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
- async with info.context.db() as session:
194
- stmt = select(models.SpanAnnotation).filter_by(span_rowid=self.id_attr)
195
- if sort:
196
- sort_col = getattr(models.SpanAnnotation, sort.col.value)
197
- if sort.dir is SortDir.desc:
198
- stmt = stmt.order_by(sort_col.desc(), models.SpanAnnotation.id.desc())
199
- else:
200
- stmt = stmt.order_by(sort_col.asc(), models.SpanAnnotation.id.asc())
201
- else:
202
- stmt = stmt.order_by(models.SpanAnnotation.created_at.desc())
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, "/v1/datasets"),
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"/v1/datasets/{quote(id)}/examples"),
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.19.0"
1
+ __version__ = "4.20.0"