arize-phoenix 4.5.0__py3-none-any.whl → 4.6.2__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 (123) hide show
  1. {arize_phoenix-4.5.0.dist-info → arize_phoenix-4.6.2.dist-info}/METADATA +16 -8
  2. {arize_phoenix-4.5.0.dist-info → arize_phoenix-4.6.2.dist-info}/RECORD +122 -58
  3. {arize_phoenix-4.5.0.dist-info → arize_phoenix-4.6.2.dist-info}/WHEEL +1 -1
  4. phoenix/__init__.py +0 -27
  5. phoenix/config.py +42 -7
  6. phoenix/core/model.py +25 -25
  7. phoenix/core/model_schema.py +64 -62
  8. phoenix/core/model_schema_adapter.py +27 -25
  9. phoenix/datetime_utils.py +4 -0
  10. phoenix/db/bulk_inserter.py +54 -14
  11. phoenix/db/insertion/dataset.py +237 -0
  12. phoenix/db/insertion/evaluation.py +10 -10
  13. phoenix/db/insertion/helpers.py +17 -14
  14. phoenix/db/insertion/span.py +3 -3
  15. phoenix/db/migrations/types.py +29 -0
  16. phoenix/db/migrations/versions/10460e46d750_datasets.py +291 -0
  17. phoenix/db/migrations/versions/cf03bd6bae1d_init.py +2 -28
  18. phoenix/db/models.py +236 -4
  19. phoenix/experiments/__init__.py +6 -0
  20. phoenix/experiments/evaluators/__init__.py +29 -0
  21. phoenix/experiments/evaluators/base.py +153 -0
  22. phoenix/experiments/evaluators/code_evaluators.py +99 -0
  23. phoenix/experiments/evaluators/llm_evaluators.py +244 -0
  24. phoenix/experiments/evaluators/utils.py +186 -0
  25. phoenix/experiments/functions.py +757 -0
  26. phoenix/experiments/tracing.py +85 -0
  27. phoenix/experiments/types.py +753 -0
  28. phoenix/experiments/utils.py +24 -0
  29. phoenix/inferences/fixtures.py +23 -23
  30. phoenix/inferences/inferences.py +7 -7
  31. phoenix/inferences/validation.py +1 -1
  32. phoenix/server/api/context.py +20 -0
  33. phoenix/server/api/dataloaders/__init__.py +20 -0
  34. phoenix/server/api/dataloaders/average_experiment_run_latency.py +54 -0
  35. phoenix/server/api/dataloaders/dataset_example_revisions.py +100 -0
  36. phoenix/server/api/dataloaders/dataset_example_spans.py +43 -0
  37. phoenix/server/api/dataloaders/experiment_annotation_summaries.py +85 -0
  38. phoenix/server/api/dataloaders/experiment_error_rates.py +43 -0
  39. phoenix/server/api/dataloaders/experiment_run_counts.py +42 -0
  40. phoenix/server/api/dataloaders/experiment_sequence_number.py +49 -0
  41. phoenix/server/api/dataloaders/project_by_name.py +31 -0
  42. phoenix/server/api/dataloaders/span_descendants.py +2 -3
  43. phoenix/server/api/dataloaders/span_projects.py +33 -0
  44. phoenix/server/api/dataloaders/trace_row_ids.py +39 -0
  45. phoenix/server/api/helpers/dataset_helpers.py +179 -0
  46. phoenix/server/api/input_types/AddExamplesToDatasetInput.py +16 -0
  47. phoenix/server/api/input_types/AddSpansToDatasetInput.py +14 -0
  48. phoenix/server/api/input_types/ClearProjectInput.py +15 -0
  49. phoenix/server/api/input_types/CreateDatasetInput.py +12 -0
  50. phoenix/server/api/input_types/DatasetExampleInput.py +14 -0
  51. phoenix/server/api/input_types/DatasetSort.py +17 -0
  52. phoenix/server/api/input_types/DatasetVersionSort.py +16 -0
  53. phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +13 -0
  54. phoenix/server/api/input_types/DeleteDatasetInput.py +7 -0
  55. phoenix/server/api/input_types/DeleteExperimentsInput.py +9 -0
  56. phoenix/server/api/input_types/PatchDatasetExamplesInput.py +35 -0
  57. phoenix/server/api/input_types/PatchDatasetInput.py +14 -0
  58. phoenix/server/api/mutations/__init__.py +13 -0
  59. phoenix/server/api/mutations/auth.py +11 -0
  60. phoenix/server/api/mutations/dataset_mutations.py +520 -0
  61. phoenix/server/api/mutations/experiment_mutations.py +65 -0
  62. phoenix/server/api/{types/ExportEventsMutation.py → mutations/export_events_mutations.py} +17 -14
  63. phoenix/server/api/mutations/project_mutations.py +47 -0
  64. phoenix/server/api/openapi/__init__.py +0 -0
  65. phoenix/server/api/openapi/main.py +6 -0
  66. phoenix/server/api/openapi/schema.py +16 -0
  67. phoenix/server/api/queries.py +503 -0
  68. phoenix/server/api/routers/v1/__init__.py +77 -2
  69. phoenix/server/api/routers/v1/dataset_examples.py +178 -0
  70. phoenix/server/api/routers/v1/datasets.py +965 -0
  71. phoenix/server/api/routers/v1/evaluations.py +8 -13
  72. phoenix/server/api/routers/v1/experiment_evaluations.py +143 -0
  73. phoenix/server/api/routers/v1/experiment_runs.py +220 -0
  74. phoenix/server/api/routers/v1/experiments.py +302 -0
  75. phoenix/server/api/routers/v1/spans.py +9 -5
  76. phoenix/server/api/routers/v1/traces.py +1 -4
  77. phoenix/server/api/schema.py +2 -303
  78. phoenix/server/api/types/AnnotatorKind.py +10 -0
  79. phoenix/server/api/types/Cluster.py +19 -19
  80. phoenix/server/api/types/CreateDatasetPayload.py +8 -0
  81. phoenix/server/api/types/Dataset.py +282 -63
  82. phoenix/server/api/types/DatasetExample.py +85 -0
  83. phoenix/server/api/types/DatasetExampleRevision.py +34 -0
  84. phoenix/server/api/types/DatasetVersion.py +14 -0
  85. phoenix/server/api/types/Dimension.py +30 -29
  86. phoenix/server/api/types/EmbeddingDimension.py +40 -34
  87. phoenix/server/api/types/Event.py +16 -16
  88. phoenix/server/api/types/ExampleRevisionInterface.py +14 -0
  89. phoenix/server/api/types/Experiment.py +147 -0
  90. phoenix/server/api/types/ExperimentAnnotationSummary.py +13 -0
  91. phoenix/server/api/types/ExperimentComparison.py +19 -0
  92. phoenix/server/api/types/ExperimentRun.py +91 -0
  93. phoenix/server/api/types/ExperimentRunAnnotation.py +57 -0
  94. phoenix/server/api/types/Inferences.py +80 -0
  95. phoenix/server/api/types/InferencesRole.py +23 -0
  96. phoenix/server/api/types/Model.py +43 -42
  97. phoenix/server/api/types/Project.py +26 -12
  98. phoenix/server/api/types/Span.py +79 -2
  99. phoenix/server/api/types/TimeSeries.py +6 -6
  100. phoenix/server/api/types/Trace.py +15 -4
  101. phoenix/server/api/types/UMAPPoints.py +1 -1
  102. phoenix/server/api/types/node.py +5 -111
  103. phoenix/server/api/types/pagination.py +10 -52
  104. phoenix/server/app.py +103 -49
  105. phoenix/server/main.py +49 -27
  106. phoenix/server/openapi/docs.py +3 -0
  107. phoenix/server/static/index.js +2300 -1294
  108. phoenix/server/templates/index.html +1 -0
  109. phoenix/services.py +15 -15
  110. phoenix/session/client.py +581 -22
  111. phoenix/session/session.py +47 -37
  112. phoenix/trace/exporter.py +14 -9
  113. phoenix/trace/fixtures.py +133 -7
  114. phoenix/trace/schemas.py +1 -2
  115. phoenix/trace/span_evaluations.py +3 -3
  116. phoenix/trace/trace_dataset.py +6 -6
  117. phoenix/utilities/json.py +61 -0
  118. phoenix/utilities/re.py +50 -0
  119. phoenix/version.py +1 -1
  120. phoenix/server/api/types/DatasetRole.py +0 -23
  121. {arize_phoenix-4.5.0.dist-info → arize_phoenix-4.6.2.dist-info}/licenses/IP_NOTICE +0 -0
  122. {arize_phoenix-4.5.0.dist-info → arize_phoenix-4.6.2.dist-info}/licenses/LICENSE +0 -0
  123. /phoenix/server/api/{helpers.py → helpers/__init__.py} +0 -0
phoenix/server/main.py CHANGED
@@ -22,9 +22,9 @@ from phoenix.config import (
22
22
  get_pids_path,
23
23
  get_working_dir,
24
24
  )
25
- from phoenix.core.model_schema_adapter import create_model_from_datasets
25
+ from phoenix.core.model_schema_adapter import create_model_from_inferences
26
26
  from phoenix.db import get_printable_db_url
27
- from phoenix.inferences.fixtures import FIXTURES, get_datasets
27
+ from phoenix.inferences.fixtures import FIXTURES, get_inferences
28
28
  from phoenix.inferences.inferences import EMPTY_INFERENCES, Inferences
29
29
  from phoenix.pointcloud.umap_parameters import (
30
30
  DEFAULT_MIN_DIST,
@@ -32,14 +32,22 @@ from phoenix.pointcloud.umap_parameters import (
32
32
  DEFAULT_N_SAMPLES,
33
33
  UMAPParameters,
34
34
  )
35
- from phoenix.server.app import create_app
35
+ from phoenix.server.app import (
36
+ SessionFactory,
37
+ _db,
38
+ create_app,
39
+ create_engine_and_run_migrations,
40
+ instrument_engine_if_enabled,
41
+ )
36
42
  from phoenix.settings import Settings
37
43
  from phoenix.trace.fixtures import (
38
44
  TRACES_FIXTURES,
39
45
  download_traces_fixture,
46
+ get_dataset_fixtures,
40
47
  get_evals_from_fixture,
41
48
  get_trace_fixture_by_name,
42
49
  reset_fixture_span_ids_and_timestamps,
50
+ send_dataset_fixtures,
43
51
  )
44
52
  from phoenix.trace.otel import decode_otlp_span, encode_span_to_otlp
45
53
  from phoenix.trace.schemas import Span
@@ -99,14 +107,14 @@ def _get_pid_file() -> Path:
99
107
  DEFAULT_UMAP_PARAMS_STR = f"{DEFAULT_MIN_DIST},{DEFAULT_N_NEIGHBORS},{DEFAULT_N_SAMPLES}"
100
108
 
101
109
  if __name__ == "__main__":
102
- primary_dataset_name: str
103
- reference_dataset_name: Optional[str]
110
+ primary_inferences_name: str
111
+ reference_inferences_name: Optional[str]
104
112
  trace_dataset_name: Optional[str] = None
105
113
  simulate_streaming: Optional[bool] = None
106
114
 
107
- primary_dataset: Inferences = EMPTY_INFERENCES
108
- reference_dataset: Optional[Inferences] = None
109
- corpus_dataset: Optional[Inferences] = None
115
+ primary_inferences: Inferences = EMPTY_INFERENCES
116
+ reference_inferences: Optional[Inferences] = None
117
+ corpus_inferences: Optional[Inferences] = None
110
118
 
111
119
  # Initialize the settings for the Server
112
120
  Settings.log_migrations = True
@@ -150,34 +158,34 @@ if __name__ == "__main__":
150
158
  )
151
159
  export_path = Path(args.export_path) if args.export_path else EXPORT_DIR
152
160
  if args.command == "datasets":
153
- primary_dataset_name = args.primary
154
- reference_dataset_name = args.reference
155
- corpus_dataset_name = args.corpus
156
- primary_dataset = Inferences.from_name(primary_dataset_name)
157
- reference_dataset = (
158
- Inferences.from_name(reference_dataset_name)
159
- if reference_dataset_name is not None
161
+ primary_inferences_name = args.primary
162
+ reference_inferences_name = args.reference
163
+ corpus_inferences_name = args.corpus
164
+ primary_inferences = Inferences.from_name(primary_inferences_name)
165
+ reference_inferences = (
166
+ Inferences.from_name(reference_inferences_name)
167
+ if reference_inferences_name is not None
160
168
  else None
161
169
  )
162
- corpus_dataset = (
163
- None if corpus_dataset_name is None else Inferences.from_name(corpus_dataset_name)
170
+ corpus_inferences = (
171
+ None if corpus_inferences_name is None else Inferences.from_name(corpus_inferences_name)
164
172
  )
165
173
  elif args.command == "fixture":
166
174
  fixture_name = args.fixture
167
175
  primary_only = args.primary_only
168
- primary_dataset, reference_dataset, corpus_dataset = get_datasets(
176
+ primary_inferences, reference_inferences, corpus_inferences = get_inferences(
169
177
  fixture_name,
170
178
  args.no_internet,
171
179
  )
172
180
  if primary_only:
173
- reference_dataset_name = None
174
- reference_dataset = None
181
+ reference_inferences_name = None
182
+ reference_inferences = None
175
183
  elif args.command == "trace-fixture":
176
184
  trace_dataset_name = args.fixture
177
185
  simulate_streaming = args.simulate_streaming
178
186
  elif args.command == "demo":
179
187
  fixture_name = args.fixture
180
- primary_dataset, reference_dataset, corpus_dataset = get_datasets(
188
+ primary_inferences, reference_inferences, corpus_inferences = get_inferences(
181
189
  fixture_name,
182
190
  args.no_internet,
183
191
  )
@@ -197,9 +205,11 @@ if __name__ == "__main__":
197
205
 
198
206
  port = args.port or get_env_port()
199
207
  host_root_path = get_env_host_root_path()
200
- model = create_model_from_datasets(
201
- primary_dataset,
202
- reference_dataset,
208
+ read_only = args.read_only
209
+
210
+ model = create_model_from_inferences(
211
+ primary_inferences,
212
+ reference_inferences,
203
213
  )
204
214
 
205
215
  fixture_spans: List[Span] = []
@@ -216,13 +226,19 @@ if __name__ == "__main__":
216
226
  ),
217
227
  get_evals_from_fixture(trace_dataset_name),
218
228
  )
229
+ dataset_fixtures = list(get_dataset_fixtures(trace_dataset_name))
230
+ if not read_only:
231
+ Thread(
232
+ target=send_dataset_fixtures,
233
+ args=(f"http://{host}:{port}", dataset_fixtures),
234
+ ).start()
219
235
  umap_params_list = args.umap_params.split(",")
220
236
  umap_params = UMAPParameters(
221
237
  min_dist=float(umap_params_list[0]),
222
238
  n_neighbors=int(umap_params_list[1]),
223
239
  n_samples=int(umap_params_list[2]),
224
240
  )
225
- read_only = args.read_only
241
+
226
242
  logger.info(f"Server umap params: {umap_params}")
227
243
  if enable_prometheus := get_env_enable_prometheus():
228
244
  from phoenix.server.prometheus import start_prometheus
@@ -230,17 +246,23 @@ if __name__ == "__main__":
230
246
  start_prometheus()
231
247
 
232
248
  working_dir = get_working_dir().resolve()
249
+ engine = create_engine_and_run_migrations(db_connection_str)
250
+ instrumentation_cleanups = instrument_engine_if_enabled(engine)
251
+ factory = SessionFactory(session_factory=_db(engine), dialect=engine.dialect.name)
233
252
  app = create_app(
234
- database_url=db_connection_str,
253
+ db=factory,
235
254
  export_path=export_path,
236
255
  model=model,
237
256
  umap_params=umap_params,
238
- corpus=None if corpus_dataset is None else create_model_from_datasets(corpus_dataset),
257
+ corpus=None
258
+ if corpus_inferences is None
259
+ else create_model_from_inferences(corpus_inferences),
239
260
  debug=args.debug,
240
261
  read_only=read_only,
241
262
  enable_prometheus=enable_prometheus,
242
263
  initial_spans=fixture_spans,
243
264
  initial_evaluations=fixture_evals,
265
+ clean_up_callbacks=instrumentation_cleanups,
244
266
  )
245
267
  server = Server(config=Config(app, host=host, port=port, root_path=host_root_path)) # type: ignore
246
268
  Thread(target=_write_pid_file_when_ready, args=(server,), daemon=True).start()
@@ -43,6 +43,9 @@ def get_swagger_ui_html(
43
43
  <div id="swagger-ui">
44
44
  </div>
45
45
  <script src="{swagger_js_url}"></script>
46
+ <style type="text/css">
47
+ div[id^="operations-private"]{{display:none}} #operations-tag-private{{display:none}}
48
+ </style>
46
49
  <!-- `SwaggerUIBundle` is now available on the page -->
47
50
  <script>
48
51
  const ui = SwaggerUIBundle({{