arize-phoenix 4.32.0__py3-none-any.whl → 4.33.1__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.32.0.dist-info → arize_phoenix-4.33.1.dist-info}/METADATA +20 -17
- {arize_phoenix-4.32.0.dist-info → arize_phoenix-4.33.1.dist-info}/RECORD +29 -29
- phoenix/config.py +11 -1
- phoenix/db/README.md +28 -2
- phoenix/db/engines.py +13 -1
- phoenix/db/migrate.py +1 -0
- phoenix/db/models.py +3 -2
- phoenix/experiments/functions.py +1 -1
- phoenix/server/api/dataloaders/average_experiment_run_latency.py +1 -1
- phoenix/server/api/dataloaders/dataset_example_spans.py +1 -1
- phoenix/server/api/dataloaders/experiment_annotation_summaries.py +1 -1
- phoenix/server/api/dataloaders/experiment_error_rates.py +1 -1
- phoenix/server/api/dataloaders/experiment_run_annotations.py +2 -2
- phoenix/server/api/dataloaders/experiment_run_counts.py +1 -1
- phoenix/server/api/dataloaders/experiment_sequence_number.py +1 -1
- phoenix/server/api/dataloaders/span_dataset_examples.py +1 -1
- phoenix/server/api/dataloaders/span_projects.py +1 -1
- phoenix/server/api/mutations/api_key_mutations.py +2 -1
- phoenix/server/app.py +18 -19
- phoenix/server/grpc_server.py +2 -2
- phoenix/server/main.py +14 -8
- phoenix/server/static/.vite/manifest.json +9 -9
- phoenix/server/static/assets/{components-Ddr-5VpM.js → components-r5FGhZ3q.js} +86 -87
- phoenix/server/static/assets/{index-BvNNAF8n.js → index-D97e4SiJ.js} +1 -1
- phoenix/server/static/assets/{pages-CU_QMYRP.js → pages-Dtpf5TRQ.js} +220 -196
- phoenix/version.py +1 -1
- {arize_phoenix-4.32.0.dist-info → arize_phoenix-4.33.1.dist-info}/WHEEL +0 -0
- {arize_phoenix-4.32.0.dist-info → arize_phoenix-4.33.1.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-4.32.0.dist-info → arize_phoenix-4.33.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: arize-phoenix
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.33.1
|
|
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
|
|
@@ -77,12 +77,13 @@ Requires-Dist: asyncpg; extra == 'dev'
|
|
|
77
77
|
Requires-Dist: faker>=26.0.0; extra == 'dev'
|
|
78
78
|
Requires-Dist: gcsfs; extra == 'dev'
|
|
79
79
|
Requires-Dist: google-cloud-aiplatform>=1.3; extra == 'dev'
|
|
80
|
+
Requires-Dist: grpc-interceptor[testing]; extra == 'dev'
|
|
80
81
|
Requires-Dist: hatch; extra == 'dev'
|
|
81
82
|
Requires-Dist: jupyter; extra == 'dev'
|
|
82
83
|
Requires-Dist: langchain>=0.0.334; extra == 'dev'
|
|
83
84
|
Requires-Dist: litellm>=1.0.3; extra == 'dev'
|
|
84
85
|
Requires-Dist: llama-index>=0.10.3; extra == 'dev'
|
|
85
|
-
Requires-Dist: mypy==1.11.
|
|
86
|
+
Requires-Dist: mypy==1.11.2; extra == 'dev'
|
|
86
87
|
Requires-Dist: nbqa; extra == 'dev'
|
|
87
88
|
Requires-Dist: pandas-stubs==2.0.3.230814; (python_version < '3.9') and extra == 'dev'
|
|
88
89
|
Requires-Dist: pandas-stubs==2.2.2.240603; (python_version >= '3.9') and extra == 'dev'
|
|
@@ -96,13 +97,13 @@ Requires-Dist: pytest-cov; extra == 'dev'
|
|
|
96
97
|
Requires-Dist: pytest-postgresql; extra == 'dev'
|
|
97
98
|
Requires-Dist: pytest-xdist; extra == 'dev'
|
|
98
99
|
Requires-Dist: pytest==8.3.2; extra == 'dev'
|
|
99
|
-
Requires-Dist: ruff==0.6.
|
|
100
|
+
Requires-Dist: ruff==0.6.3; extra == 'dev'
|
|
100
101
|
Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.236.0; extra == 'dev'
|
|
101
102
|
Requires-Dist: tabulate; extra == 'dev'
|
|
102
|
-
Requires-Dist: tox; extra == 'dev'
|
|
103
|
-
Requires-Dist: tox
|
|
103
|
+
Requires-Dist: tox-uv==1.11.2; extra == 'dev'
|
|
104
|
+
Requires-Dist: tox==4.18.0; extra == 'dev'
|
|
104
105
|
Requires-Dist: types-tabulate; extra == 'dev'
|
|
105
|
-
Requires-Dist: uv; extra == 'dev'
|
|
106
|
+
Requires-Dist: uv==0.4.2; extra == 'dev'
|
|
106
107
|
Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'dev'
|
|
107
108
|
Provides-Extra: evals
|
|
108
109
|
Provides-Extra: experimental
|
|
@@ -149,15 +150,17 @@ Description-Content-Type: text/markdown
|
|
|
149
150
|
|
|
150
151
|
Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
|
|
151
152
|
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
-
|
|
155
|
-
-
|
|
153
|
+
- **_Tracing_** - Trace your LLM application's runtime using OpenTelemetry-based instrumentation.
|
|
154
|
+
- **_Evaluation_** - Leverage LLMs to benchmark your application's performance using response and retrieval evals.
|
|
155
|
+
- **_Datasets_** - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
|
|
156
|
+
- **_Experiments_** - Track and evaluate changes to prompts, LLMs, and retrieval.
|
|
156
157
|
|
|
157
158
|
Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙LlamaIndex, 🦜⛓LangChain, Haystack, 🧩DSPy) and LLM providers (OpenAI, Bedrock, and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
|
|
158
159
|
|
|
159
160
|
Phoenix runs practically anywhere, including your Jupyter notebook, local machine, containerized deployment, or in the cloud.
|
|
160
161
|
|
|
162
|
+
<img alt="phoenix_overview.gif" width="100%" src="https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/phoenix_overview.gif?raw=true">
|
|
163
|
+
|
|
161
164
|
## Installation
|
|
162
165
|
|
|
163
166
|
Install Phoenix via `pip` or `conda`
|
|
@@ -172,13 +175,13 @@ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r
|
|
|
172
175
|
|
|
173
176
|
Join our community to connect with thousands of AI builders.
|
|
174
177
|
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
178
|
-
-
|
|
179
|
-
-
|
|
180
|
-
-
|
|
181
|
-
-
|
|
178
|
+
- 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
|
|
179
|
+
- 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
|
|
180
|
+
- 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
|
|
181
|
+
- 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
|
|
182
|
+
- 𝕏 Follow us on [𝕏](https://twitter.com/ArizePhoenix).
|
|
183
|
+
- 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
|
|
184
|
+
- 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
|
|
182
185
|
|
|
183
186
|
## Breaking Changes
|
|
184
187
|
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
phoenix/__init__.py,sha256=TGNWqm2UW-l67yIRpOtmqGHVAmdoobSNqUsiTtip7uQ,1542
|
|
2
2
|
phoenix/auth.py,sha256=ugvGZlseYX9NkpWaSqb8D2kzUBlAPqT45Dx5_VUANqk,1621
|
|
3
|
-
phoenix/config.py,sha256=
|
|
3
|
+
phoenix/config.py,sha256=3ZvppWHfrSdeIG8sFGl6kEygqhbS9KlEqLQTphM3iq0,11197
|
|
4
4
|
phoenix/datetime_utils.py,sha256=yDKjwX2Vtqw9h5F_ProtP-TsXidM43uIvmJ_pOzYc9A,3405
|
|
5
5
|
phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
|
|
6
6
|
phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
7
7
|
phoenix/services.py,sha256=OyML4t2XGnlqF0JXA9_uccL8HslTABxep9Ci7MViKEU,5216
|
|
8
8
|
phoenix/settings.py,sha256=cO-qgis_S27nHirTobYI9hHPfZH18R--WMmxNdsVUwc,273
|
|
9
|
-
phoenix/version.py,sha256=
|
|
9
|
+
phoenix/version.py,sha256=s4RWPFqvsL2oe4Cl03br7jJCnnt6JizPJJwAK64hlhw,23
|
|
10
10
|
phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
|
|
12
12
|
phoenix/core/model.py,sha256=km_a--PBHOuA337ClRw9xqhOHhrUT6Rl9pz_zV0JYkQ,4843
|
|
13
13
|
phoenix/core/model_schema.py,sha256=F2dbbVnkDLsPYoyZDv1q03uhvP8LcU1wXp0g-exiWs0,50551
|
|
14
14
|
phoenix/core/model_schema_adapter.py,sha256=0Tm_Y_gV-WED8fKBCaFXAEFwE3CTEZS1dowqnTZ7x7g,8426
|
|
15
|
-
phoenix/db/README.md,sha256=
|
|
15
|
+
phoenix/db/README.md,sha256=Mjrq0tG68uKQ81mN1Vmu3C795EEpZndmnE6CJXsPCXE,1909
|
|
16
16
|
phoenix/db/__init__.py,sha256=pDjEFXukHmJBM-1D8RjmXkvLsz85YWNxMQczt81ec3A,118
|
|
17
17
|
phoenix/db/alembic.ini,sha256=p8DjVqGUs_tTx8oU56JP7qj-rMUebNFizItUSv_hPhs,3763
|
|
18
18
|
phoenix/db/bulk_inserter.py,sha256=qgg8pt5k4VnHKOE0-KoReXVAfXRhLt-sMZihI-b4X9I,12761
|
|
19
|
-
phoenix/db/engines.py,sha256=
|
|
19
|
+
phoenix/db/engines.py,sha256=uWOZhIAspPCReFNqKtHsmZnY8H2DSi1kCOpQtmU3F1U,5793
|
|
20
20
|
phoenix/db/helpers.py,sha256=2zSc4n5IJfu-CaOFoBfqTB35M1nTFcAc8tqLsNtF2Jw,3488
|
|
21
|
-
phoenix/db/migrate.py,sha256=
|
|
22
|
-
phoenix/db/models.py,sha256=
|
|
21
|
+
phoenix/db/migrate.py,sha256=emiwHiFXijMw6P6gAvLcAw3qTDOuI6wmblD7sEnFLa8,2654
|
|
22
|
+
phoenix/db/models.py,sha256=o97p2H4LeX8YHkTWFsbSGQANW9jHWVf6mJvE9KyFybU,23754
|
|
23
23
|
phoenix/db/insertion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
24
|
phoenix/db/insertion/constants.py,sha256=8wifm7X-1XvroZ__R2Gc96NsgLhTDn0zXl4lehlXtcA,70
|
|
25
25
|
phoenix/db/insertion/dataset.py,sha256=vBIroaSIWz5ZXE0Hul8osbebjS40gDCbsSP-YnazEwk,7212
|
|
@@ -40,7 +40,7 @@ phoenix/db/migrations/versions/10460e46d750_datasets.py,sha256=eZAyz720DmpOd7Rnu
|
|
|
40
40
|
phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py,sha256=bV7urfCPkrXhkyg8oaUfLYN093UoRecLQXPkXJ8SIOs,3666
|
|
41
41
|
phoenix/db/migrations/versions/cf03bd6bae1d_init.py,sha256=09cpofqje8zi4eQFfUn-i21x7VcsUYOfLKKUlrtKrGc,8662
|
|
42
42
|
phoenix/experiments/__init__.py,sha256=6JGwgUd7xCbGpuHqYZlsmErmYvVgv7N_j43bn3dUqsk,123
|
|
43
|
-
phoenix/experiments/functions.py,sha256=
|
|
43
|
+
phoenix/experiments/functions.py,sha256=xxxBziRBdv45H8-LY3yow9XVs4bQLYMd_4Ks5ou4u84,32591
|
|
44
44
|
phoenix/experiments/tracing.py,sha256=wVpt8Ie9WNPoi1djJdcrkwCokHdTO0bicXViLg3O-1Y,2831
|
|
45
45
|
phoenix/experiments/types.py,sha256=HegeRSLyx2lESlzAc2PXYQJVHBFbCLwqQQmPcDMdUnM,23433
|
|
46
46
|
phoenix/experiments/utils.py,sha256=wLu5Kvt1b4a8rGPRWq5G8RQ9XSiV8fCIVm51zWBI3-g,758
|
|
@@ -72,11 +72,11 @@ phoenix/pointcloud/pointcloud.py,sha256=4zAIkKs2xOUbchpj4XDAV-iPMXrfAJ15TG6rlIYG
|
|
|
72
72
|
phoenix/pointcloud/projectors.py,sha256=zO_RrtDYSv2rqVOfIP2_9Cv11Dc8EmcZR94xhFcBYPU,1057
|
|
73
73
|
phoenix/pointcloud/umap_parameters.py,sha256=3UQSjrysVOvq2V4KNpTMqNqNiK0BsTZnPBHWZ4fyJtQ,1708
|
|
74
74
|
phoenix/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
75
|
-
phoenix/server/app.py,sha256=
|
|
75
|
+
phoenix/server/app.py,sha256=15zHrHy0dl-RuBDapU45t6pNSS4mXg21gHVhnRE4GM4,28469
|
|
76
76
|
phoenix/server/dml_event.py,sha256=MpjCFqljxvgb9OB5Cez9vJesb3oHb3XxXictynBfcis,2851
|
|
77
77
|
phoenix/server/dml_event_handler.py,sha256=yU23-DDwXcL35p5EPwFW0oZh6mxQxJrJAQPKcYZYJz4,8310
|
|
78
|
-
phoenix/server/grpc_server.py,sha256=
|
|
79
|
-
phoenix/server/main.py,sha256=
|
|
78
|
+
phoenix/server/grpc_server.py,sha256=XWC2pjSefBBOhM6IXz0oQmjPtnonBvkG9ccUWEfHiiw,3446
|
|
79
|
+
phoenix/server/main.py,sha256=169n7AIYKjcVw_Taw6dDRUBuVT3uqViehHOLSZGB4zE,14872
|
|
80
80
|
phoenix/server/prometheus.py,sha256=j9DHB2fERuq_ZKmwVaqR-9wx5WcPPuU1Cm5Bhg5241Y,2996
|
|
81
81
|
phoenix/server/telemetry.py,sha256=T_2OKrxNViAeaANlNspEekg_Y5uZIFWvKAnpz8Aoqvk,2762
|
|
82
82
|
phoenix/server/thread_server.py,sha256=RwXQGP_QhGD7le6WB7xEygEEuwBl5Ck_Zo8xGIYGi9M,2135
|
|
@@ -90,25 +90,25 @@ phoenix/server/api/schema.py,sha256=4L2m6QXhaV13YPTZCEZ3hqCPQFHZOy3QnJVLRYQFzpg,
|
|
|
90
90
|
phoenix/server/api/utils.py,sha256=Kl47G-1A7QKTDrc75BU2QK6HupsG6MWuXxy351FOfKQ,858
|
|
91
91
|
phoenix/server/api/dataloaders/__init__.py,sha256=D1xEKunv8ZUBEPk2eStX-JhoPR3_NaQcNOp47H-oChM,3161
|
|
92
92
|
phoenix/server/api/dataloaders/annotation_summaries.py,sha256=Wv8AORZoGd5TJ4Y-em8iqJu87AMpZP7lWOTr-SML-x8,5560
|
|
93
|
-
phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=
|
|
93
|
+
phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=mb9TXSrecIhJWQYi_JStWfNkh69izzXw0nAuDH3MbRM,1817
|
|
94
94
|
phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=_X2CwCc6lAkD4VuwAiyo4DfSVS8uuzub05sKyKiEXm8,5149
|
|
95
|
-
phoenix/server/api/dataloaders/dataset_example_spans.py,sha256
|
|
95
|
+
phoenix/server/api/dataloaders/dataset_example_spans.py,sha256=2CzCV94_HyFTmm-PhsFxYMFo733c0yHEZRol0v8Fle8,1409
|
|
96
96
|
phoenix/server/api/dataloaders/document_evaluation_summaries.py,sha256=5XOom2KRAmCwPmtlraiZOSl3vhfaW-eiiYkmetAEalw,5616
|
|
97
97
|
phoenix/server/api/dataloaders/document_evaluations.py,sha256=V6sE34jON_qFxt7eArJbktykAsty-gnBZHlEkORcj0E,1296
|
|
98
98
|
phoenix/server/api/dataloaders/document_retrieval_metrics.py,sha256=JqDqkUuoeG6WfcmWSrmQptfF6IPX8XgzYzyECXTAjgg,4202
|
|
99
|
-
phoenix/server/api/dataloaders/experiment_annotation_summaries.py,sha256=
|
|
100
|
-
phoenix/server/api/dataloaders/experiment_error_rates.py,sha256=
|
|
101
|
-
phoenix/server/api/dataloaders/experiment_run_annotations.py,sha256=
|
|
102
|
-
phoenix/server/api/dataloaders/experiment_run_counts.py,sha256=
|
|
103
|
-
phoenix/server/api/dataloaders/experiment_sequence_number.py,sha256=
|
|
99
|
+
phoenix/server/api/dataloaders/experiment_annotation_summaries.py,sha256=gW0rvM4WTEXmZoxVBGn32oEVloaQVN-ycKVGWkXpSbM,2803
|
|
100
|
+
phoenix/server/api/dataloaders/experiment_error_rates.py,sha256=9lVppbGoPZDhqtEvQu6p0M8-Xl0OPzpA-us1jKUe7y4,1939
|
|
101
|
+
phoenix/server/api/dataloaders/experiment_run_annotations.py,sha256=O2M6HE_UF0Y1Ko9LnYXE-q68w_3IRhauqjqUHyJFdcE,1346
|
|
102
|
+
phoenix/server/api/dataloaders/experiment_run_counts.py,sha256=r8aeDQdX-4ME5jFumW_jkszlTlj84iM98Zcy0dIqFSY,1651
|
|
103
|
+
phoenix/server/api/dataloaders/experiment_sequence_number.py,sha256=yF8AmCY7DpiDN18A5bLs9Pk0HX3f3DmH5IT1Vl3AE0Q,1553
|
|
104
104
|
phoenix/server/api/dataloaders/latency_ms_quantile.py,sha256=5Y2OQ_GeH1My2573eOm7zPbqpwDZ_WeMLoZMq3KDoNQ,7403
|
|
105
105
|
phoenix/server/api/dataloaders/min_start_or_max_end_times.py,sha256=k82jVllBWkGI6xu2MAltqxdIqyw3DqoVCQcKbi-JsmM,2834
|
|
106
106
|
phoenix/server/api/dataloaders/project_by_name.py,sha256=9p6DW_zXrsB9YGILFV0wkRwiapyHbZ1IgWK9HuHxl30,1105
|
|
107
107
|
phoenix/server/api/dataloaders/record_counts.py,sha256=64OsyiQRDZASlibpQAXtRkzyA_ch89A3TvhSUByxoTI,4215
|
|
108
108
|
phoenix/server/api/dataloaders/span_annotations.py,sha256=v3vGkLGTn-n4khxXZY2btgvfXitvytWgBahzrrWEz0I,1078
|
|
109
|
-
phoenix/server/api/dataloaders/span_dataset_examples.py,sha256=
|
|
109
|
+
phoenix/server/api/dataloaders/span_dataset_examples.py,sha256=06QqLBJYEHNxrDs3IIjBDlmg-oF7o76QAI9jzLFdPEg,1299
|
|
110
110
|
phoenix/server/api/dataloaders/span_descendants.py,sha256=b7jGTn0Hi22gv2yskloLnf3BG3upS9z5hnKLMT9Sxac,2094
|
|
111
|
-
phoenix/server/api/dataloaders/span_projects.py,sha256=
|
|
111
|
+
phoenix/server/api/dataloaders/span_projects.py,sha256=QhlIyUJdVa29dGOuolyXFRm5WEcLz4mJMM217PwNLp8,1240
|
|
112
112
|
phoenix/server/api/dataloaders/token_counts.py,sha256=6gDVely8BYiCBdmiq1ECO0lMChUYPIlsZbB34rmL1xM,4684
|
|
113
113
|
phoenix/server/api/dataloaders/trace_row_ids.py,sha256=RODX4NULlBzMxHMrsq0dp1ij6ZlLH4ZzQBnafGdxOvU,1100
|
|
114
114
|
phoenix/server/api/dataloaders/cache/__init__.py,sha256=SYoOM9n8FJaMdQarma5d1blu-jIg2GB8Shqg5ezSzZ8,106
|
|
@@ -145,7 +145,7 @@ phoenix/server/api/input_types/TraceAnnotationSort.py,sha256=BzwiUnMh2VsgQYnhDlb
|
|
|
145
145
|
phoenix/server/api/input_types/UserRoleInput.py,sha256=xxhFe0ITZOgRVEJbVem_W6F1Ip_H6xDENdQqMMx-kKE,129
|
|
146
146
|
phoenix/server/api/input_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
147
147
|
phoenix/server/api/mutations/__init__.py,sha256=JS3WRqYxNeoaLsKjODFvJnZb6CF19IFW-lfOsUq3rtM,1074
|
|
148
|
-
phoenix/server/api/mutations/api_key_mutations.py,sha256=
|
|
148
|
+
phoenix/server/api/mutations/api_key_mutations.py,sha256=TjwPrVeiu7fP0bqAD1yO99aJ1P8TrndpwCgCwrwX6tU,4715
|
|
149
149
|
phoenix/server/api/mutations/auth.py,sha256=8o4tTfGCPkpUauuB9ijPH84Od77UX_UrQWfmUsnujI4,524
|
|
150
150
|
phoenix/server/api/mutations/auth_mutations.py,sha256=XLCxmsjyVp1riGWxUhVUOiGhIFs_ZmOfZM77vs_RLDw,2182
|
|
151
151
|
phoenix/server/api/mutations/dataset_mutations.py,sha256=8S6qjmraSBxA7ioNogTQPp6q27ZdvdAn6yt0Z4fmOI0,27096
|
|
@@ -242,10 +242,10 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
|
|
|
242
242
|
phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
|
|
243
243
|
phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
|
|
244
244
|
phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
|
|
245
|
-
phoenix/server/static/.vite/manifest.json,sha256=
|
|
246
|
-
phoenix/server/static/assets/components-
|
|
247
|
-
phoenix/server/static/assets/index-
|
|
248
|
-
phoenix/server/static/assets/pages-
|
|
245
|
+
phoenix/server/static/.vite/manifest.json,sha256=THlBb4tvLxAwoqYJ3NRH1WqVcwqp7KQ_TQ7qpiw5zoY,1929
|
|
246
|
+
phoenix/server/static/assets/components-r5FGhZ3q.js,sha256=NWjiMcYyfM7SuQkd0zqPnbp-7qNI_-qOK1MQAs6lLmI,248754
|
|
247
|
+
phoenix/server/static/assets/index-D97e4SiJ.js,sha256=0HZXgZL-N_L80RFq-qfyBtqLhObO7ovKt3qdJaHxcME,7602
|
|
248
|
+
phoenix/server/static/assets/pages-Dtpf5TRQ.js,sha256=LEPj9rfWhwQPlT4ZF9SNnrbut5n0hmDJMh_x7-q-8w4,515005
|
|
249
249
|
phoenix/server/static/assets/vendor-Dpio9q2e.js,sha256=1CMQ_vGa7qQyJoLj1WdL23CVQ6y9E94cv1cy_KHNi84,1435263
|
|
250
250
|
phoenix/server/static/assets/vendor-DxkFTwjz.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
|
|
251
251
|
phoenix/server/static/assets/vendor-arizeai-DDzwX9A6.js,sha256=ePHP1b8n-zwCMGEwgfR00aOTSEe8Ogp8gx3FyZ1-SyA,304401
|
|
@@ -296,8 +296,8 @@ phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,
|
|
|
296
296
|
phoenix/utilities/project.py,sha256=8IJuMM4yUMoooPi37sictGj8Etu9rGmq6RFtc9848cQ,436
|
|
297
297
|
phoenix/utilities/re.py,sha256=PDve_OLjRTM8yQQJHC8-n3HdIONi7aNils3ZKRZ5uBM,2045
|
|
298
298
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
299
|
-
arize_phoenix-4.
|
|
300
|
-
arize_phoenix-4.
|
|
301
|
-
arize_phoenix-4.
|
|
302
|
-
arize_phoenix-4.
|
|
303
|
-
arize_phoenix-4.
|
|
299
|
+
arize_phoenix-4.33.1.dist-info/METADATA,sha256=rO1Dk5WxRQ8xT3nvGOm46PQ_6nO_EBZjhgqZgnngYYE,11938
|
|
300
|
+
arize_phoenix-4.33.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
301
|
+
arize_phoenix-4.33.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
302
|
+
arize_phoenix-4.33.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
303
|
+
arize_phoenix-4.33.1.dist-info/RECORD,,
|
phoenix/config.py
CHANGED
|
@@ -47,7 +47,11 @@ Phoenix supports two types of database URLs:
|
|
|
47
47
|
Note that if you plan on using SQLite, it's advised to to use a persistent volume
|
|
48
48
|
and simply point the PHOENIX_WORKING_DIR to that volume.
|
|
49
49
|
"""
|
|
50
|
-
|
|
50
|
+
ENV_PHOENIX_SQL_DATABASE_SCHEMA = "PHOENIX_SQL_DATABASE_SCHEMA"
|
|
51
|
+
"""
|
|
52
|
+
The schema to use for the PostgresSQL database. (This is ignored for SQLite.)
|
|
53
|
+
See e.g. https://www.postgresql.org/docs/current/ddl-schemas.html
|
|
54
|
+
"""
|
|
51
55
|
ENV_PHOENIX_ENABLE_PROMETHEUS = "PHOENIX_ENABLE_PROMETHEUS"
|
|
52
56
|
"""
|
|
53
57
|
Whether to enable Prometheus. Defaults to false.
|
|
@@ -281,6 +285,12 @@ def get_env_database_connection_str() -> str:
|
|
|
281
285
|
return env_url
|
|
282
286
|
|
|
283
287
|
|
|
288
|
+
def get_env_database_schema() -> Optional[str]:
|
|
289
|
+
if get_env_database_connection_str().startswith("sqlite"):
|
|
290
|
+
return None
|
|
291
|
+
return os.getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA)
|
|
292
|
+
|
|
293
|
+
|
|
284
294
|
def get_env_enable_prometheus() -> bool:
|
|
285
295
|
if (enable_promotheus := os.getenv(ENV_PHOENIX_ENABLE_PROMETHEUS)) is None or (
|
|
286
296
|
enable_promotheus_lower := enable_promotheus.lower()
|
phoenix/db/README.md
CHANGED
|
@@ -8,14 +8,40 @@ This module is responsible for the database connection and the migrations.
|
|
|
8
8
|
All migrations are managed by Alembic. Migrations are applied to the database automatically when the application starts.
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
### Applying Migrations
|
|
11
|
+
### Manually Applying Migrations
|
|
12
12
|
|
|
13
|
-
To manually apply
|
|
13
|
+
Sometimes, it's necessary to manually apply migrations, e.g., to recover from a failed migration. To manually apply migrations, you must first clone the Phoenix repository.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone https://github.com/Arize-ai/phoenix.git
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Then navigate to the current directory.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd phoenix/src/phoenix/db
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
If you are using a non-default SQL database URL (e.g., for running PostgreSQL), ensure your `PHOENIX_SQL_DATABASE_URL` is set. This is not needed if you are running Phoenix with the default SQLite URL.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
export PHOENIX_SQL_DATABASE_URL=<sql-database-url>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
To manually run up-migrations, run the following command:
|
|
14
33
|
|
|
15
34
|
```bash
|
|
16
35
|
alembic upgrade head
|
|
17
36
|
```
|
|
18
37
|
|
|
38
|
+
If the above command fails, it may be necessary to undo partially applied changes from a failed migration by first running down-migrations. This can be accomplished by identifying the ID of the migration revision you wish to return to. Revisions are defined [here](./migrations/versions/).
|
|
39
|
+
|
|
40
|
+
⚠️ Running down-migrations can result in lost data. Only run down-migrations if you know what you are doing and consider backing up your database first. If you have any questions or doubts, contact the Phoenix team in the `#phoenix-support` channel of the [Arize AI Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q) or via GitHub.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
alembic downgrade <revision-id>
|
|
44
|
+
```
|
|
19
45
|
|
|
20
46
|
### Creating a Migration
|
|
21
47
|
|
phoenix/db/engines.py
CHANGED
|
@@ -3,7 +3,7 @@ import json
|
|
|
3
3
|
from datetime import datetime
|
|
4
4
|
from enum import Enum
|
|
5
5
|
from sqlite3 import Connection
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any, Callable
|
|
7
7
|
|
|
8
8
|
import aiosqlite
|
|
9
9
|
import numpy as np
|
|
@@ -13,6 +13,7 @@ from sqlalchemy import URL, StaticPool, event, make_url
|
|
|
13
13
|
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
|
|
14
14
|
from typing_extensions import assert_never
|
|
15
15
|
|
|
16
|
+
from phoenix.config import get_env_database_schema
|
|
16
17
|
from phoenix.db.helpers import SupportedSQLDialect
|
|
17
18
|
from phoenix.db.migrate import migrate_in_thread
|
|
18
19
|
from phoenix.db.models import init_models
|
|
@@ -130,6 +131,15 @@ def aio_sqlite_engine(
|
|
|
130
131
|
return engine
|
|
131
132
|
|
|
132
133
|
|
|
134
|
+
def set_postgresql_search_path(schema: str) -> Callable[[Connection, Any], None]:
|
|
135
|
+
def _(connection: Connection, _: Any) -> None:
|
|
136
|
+
cursor = connection.cursor()
|
|
137
|
+
cursor.execute(f"CREATE SCHEMA IF NOT EXISTS {schema};")
|
|
138
|
+
cursor.execute(f"SET search_path TO {schema};")
|
|
139
|
+
|
|
140
|
+
return _
|
|
141
|
+
|
|
142
|
+
|
|
133
143
|
def aio_postgresql_engine(
|
|
134
144
|
url: URL,
|
|
135
145
|
migrate: bool = True,
|
|
@@ -143,6 +153,8 @@ def aio_postgresql_engine(
|
|
|
143
153
|
echo=Settings.log_migrations,
|
|
144
154
|
json_serializer=_dumps,
|
|
145
155
|
)
|
|
156
|
+
if schema := get_env_database_schema():
|
|
157
|
+
event.listen(sync_engine, "connect", set_postgresql_search_path(schema))
|
|
146
158
|
migrate_in_thread(sync_engine)
|
|
147
159
|
return engine
|
|
148
160
|
|
phoenix/db/migrate.py
CHANGED
|
@@ -50,6 +50,7 @@ def migrate(
|
|
|
50
50
|
alembic_cfg.set_main_option("sqlalchemy.url", url)
|
|
51
51
|
alembic_cfg.attributes["connection"] = engine.connect()
|
|
52
52
|
command.upgrade(alembic_cfg, "head")
|
|
53
|
+
engine.dispose()
|
|
53
54
|
printif(log_migrations, "---------------------------")
|
|
54
55
|
printif(log_migrations, "✅ Migrations complete.")
|
|
55
56
|
except BaseException as e:
|
phoenix/db/models.py
CHANGED
|
@@ -34,7 +34,7 @@ from sqlalchemy.orm import (
|
|
|
34
34
|
)
|
|
35
35
|
from sqlalchemy.sql import expression
|
|
36
36
|
|
|
37
|
-
from phoenix.config import ENABLE_AUTH
|
|
37
|
+
from phoenix.config import ENABLE_AUTH, get_env_database_schema
|
|
38
38
|
from phoenix.datetime_utils import normalize_datetime
|
|
39
39
|
|
|
40
40
|
|
|
@@ -100,13 +100,14 @@ class Base(DeclarativeBase):
|
|
|
100
100
|
# Enforce best practices for naming constraints
|
|
101
101
|
# https://alembic.sqlalchemy.org/en/latest/naming.html#integration-of-naming-conventions-into-operations-autogenerate
|
|
102
102
|
metadata = MetaData(
|
|
103
|
+
schema=get_env_database_schema(),
|
|
103
104
|
naming_convention={
|
|
104
105
|
"ix": "ix_%(table_name)s_%(column_0_N_name)s",
|
|
105
106
|
"uq": "uq_%(table_name)s_%(column_0_N_name)s",
|
|
106
107
|
"ck": "ck_%(table_name)s_`%(constraint_name)s`",
|
|
107
108
|
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
|
|
108
109
|
"pk": "pk_%(table_name)s",
|
|
109
|
-
}
|
|
110
|
+
},
|
|
110
111
|
)
|
|
111
112
|
type_annotation_map = {
|
|
112
113
|
Dict[str, Any]: JsonDict,
|
phoenix/experiments/functions.py
CHANGED
|
@@ -153,7 +153,7 @@ def run_experiment(
|
|
|
153
153
|
experiment. Defaults to None.
|
|
154
154
|
rate_limit_errors (Optional[BaseException | Sequence[BaseException]]): An exception or
|
|
155
155
|
sequence of exceptions to adaptively throttle on. Defaults to None.
|
|
156
|
-
dry_run (bool | int):
|
|
156
|
+
dry_run (bool | int): Run the experiment in dry-run mode. When set, experiment results will
|
|
157
157
|
not be recorded in Phoenix. If True, the experiment will run on a random dataset
|
|
158
158
|
example. If an integer, the experiment will run on a random sample of the dataset
|
|
159
159
|
examples of the given size. Defaults to False.
|
|
@@ -25,7 +25,7 @@ class ExperimentRunAnnotations(DataLoader[Key, Result]):
|
|
|
25
25
|
self._db = db
|
|
26
26
|
|
|
27
27
|
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
28
|
-
run_ids =
|
|
28
|
+
run_ids = keys
|
|
29
29
|
annotations: DefaultDict[Key, Result] = defaultdict(list)
|
|
30
30
|
async with self._db() as session:
|
|
31
31
|
async for run_id, annotation in await session.stream(
|
|
@@ -36,5 +36,5 @@ class ExperimentRunAnnotations(DataLoader[Key, Result]):
|
|
|
36
36
|
annotations[run_id].append(annotation)
|
|
37
37
|
return [
|
|
38
38
|
sorted(annotations[run_id], key=lambda annotation: annotation.name, reverse=True)
|
|
39
|
-
for run_id in
|
|
39
|
+
for run_id in keys
|
|
40
40
|
]
|
|
@@ -44,4 +44,4 @@ class ExperimentSequenceNumberDataLoader(DataLoader[Key, Result]):
|
|
|
44
44
|
experiment_id: sequence_number
|
|
45
45
|
async for experiment_id, sequence_number in await session.stream(stmt)
|
|
46
46
|
}
|
|
47
|
-
return [result.get(experiment_id) for experiment_id in
|
|
47
|
+
return [result.get(experiment_id) for experiment_id in keys]
|
|
@@ -33,4 +33,4 @@ class SpanDatasetExamplesDataLoader(DataLoader[Key, Result]):
|
|
|
33
33
|
.where(models.Span.id.in_(span_rowids))
|
|
34
34
|
):
|
|
35
35
|
dataset_examples[span_rowid].append(dataset_example)
|
|
36
|
-
return [dataset_examples.get(span_rowid, []) for span_rowid in
|
|
36
|
+
return [dataset_examples.get(span_rowid, []) for span_rowid in keys]
|
|
@@ -30,4 +30,4 @@ class SpanProjectsDataLoader(DataLoader[Key, Result]):
|
|
|
30
30
|
.where(models.Span.id.in_(span_ids))
|
|
31
31
|
)
|
|
32
32
|
}
|
|
33
|
-
return [projects.get(span_id) or ValueError("Invalid span ID") for span_id in
|
|
33
|
+
return [projects.get(span_id) or ValueError("Invalid span ID") for span_id in keys]
|
|
@@ -39,6 +39,7 @@ class DeleteApiKeyInput:
|
|
|
39
39
|
@strawberry.type
|
|
40
40
|
class DeleteSystemApiKeyMutationPayload:
|
|
41
41
|
id: GlobalID
|
|
42
|
+
query: Query
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
@strawberry.type
|
|
@@ -106,7 +107,7 @@ class ApiKeyMutationMixin:
|
|
|
106
107
|
|
|
107
108
|
await session.delete(api_key)
|
|
108
109
|
|
|
109
|
-
return DeleteSystemApiKeyMutationPayload(id=input.id)
|
|
110
|
+
return DeleteSystemApiKeyMutationPayload(id=input.id, query=Query())
|
|
110
111
|
|
|
111
112
|
|
|
112
113
|
def create_jwt(
|
phoenix/server/app.py
CHANGED
|
@@ -134,6 +134,7 @@ If so, demo data is automatically ingested upon initial boot up to populate the
|
|
|
134
134
|
NEW_DB_AGE_THRESHOLD_MINUTES = 2
|
|
135
135
|
|
|
136
136
|
ProjectName: TypeAlias = str
|
|
137
|
+
_Callback: TypeAlias = Callable[[], Union[None, Awaitable[None]]]
|
|
137
138
|
|
|
138
139
|
|
|
139
140
|
class AppConfig(NamedTuple):
|
|
@@ -377,13 +378,16 @@ def _lifespan(
|
|
|
377
378
|
dml_event_handler: DmlEventHandler,
|
|
378
379
|
tracer_provider: Optional["TracerProvider"] = None,
|
|
379
380
|
enable_prometheus: bool = False,
|
|
380
|
-
startup_callbacks: Iterable[
|
|
381
|
-
shutdown_callbacks: Iterable[
|
|
381
|
+
startup_callbacks: Iterable[_Callback] = (),
|
|
382
|
+
shutdown_callbacks: Iterable[_Callback] = (),
|
|
382
383
|
read_only: bool = False,
|
|
383
384
|
scaffolder_config: Optional[ScaffolderConfig] = None,
|
|
384
385
|
) -> StatefulLifespan[FastAPI]:
|
|
385
386
|
@contextlib.asynccontextmanager
|
|
386
387
|
async def lifespan(_: FastAPI) -> AsyncIterator[Dict[str, Any]]:
|
|
388
|
+
for callback in startup_callbacks:
|
|
389
|
+
if isinstance((res := callback()), Awaitable):
|
|
390
|
+
await res
|
|
387
391
|
global DB_MUTEX
|
|
388
392
|
DB_MUTEX = asyncio.Lock() if db.dialect is SupportedSQLDialect.SQLITE else None
|
|
389
393
|
async with AsyncExitStack() as stack:
|
|
@@ -408,8 +412,6 @@ def _lifespan(
|
|
|
408
412
|
queue_evaluation=queue_evaluation,
|
|
409
413
|
)
|
|
410
414
|
await stack.enter_async_context(scaffolder)
|
|
411
|
-
for callback in startup_callbacks:
|
|
412
|
-
callback()
|
|
413
415
|
yield {
|
|
414
416
|
"event_queue": dml_event_handler,
|
|
415
417
|
"enqueue": enqueue,
|
|
@@ -418,7 +420,8 @@ def _lifespan(
|
|
|
418
420
|
"enqueue_operation": enqueue_operation,
|
|
419
421
|
}
|
|
420
422
|
for callback in shutdown_callbacks:
|
|
421
|
-
callback()
|
|
423
|
+
if isinstance((res := callback()), Awaitable):
|
|
424
|
+
await res
|
|
422
425
|
|
|
423
426
|
return lifespan
|
|
424
427
|
|
|
@@ -596,13 +599,13 @@ def create_app(
|
|
|
596
599
|
initial_spans: Optional[Iterable[Union[Span, Tuple[Span, str]]]] = None,
|
|
597
600
|
initial_evaluations: Optional[Iterable[pb.Evaluation]] = None,
|
|
598
601
|
serve_ui: bool = True,
|
|
599
|
-
startup_callbacks: Iterable[
|
|
600
|
-
shutdown_callbacks: Iterable[
|
|
602
|
+
startup_callbacks: Iterable[_Callback] = (),
|
|
603
|
+
shutdown_callbacks: Iterable[_Callback] = (),
|
|
601
604
|
secret: Optional[str] = None,
|
|
602
605
|
scaffolder_config: Optional[ScaffolderConfig] = None,
|
|
603
606
|
) -> FastAPI:
|
|
604
|
-
startup_callbacks_list: List[
|
|
605
|
-
shutdown_callbacks_list: List[
|
|
607
|
+
startup_callbacks_list: List[_Callback] = list(startup_callbacks)
|
|
608
|
+
shutdown_callbacks_list: List[_Callback] = list(shutdown_callbacks)
|
|
606
609
|
initial_batch_of_spans: Iterable[Tuple[Span, str]] = (
|
|
607
610
|
()
|
|
608
611
|
if initial_spans is None
|
|
@@ -616,6 +619,7 @@ def create_app(
|
|
|
616
619
|
CacheForDataLoaders() if db.dialect is SupportedSQLDialect.SQLITE else None
|
|
617
620
|
)
|
|
618
621
|
last_updated_at = LastUpdatedAt()
|
|
622
|
+
middlewares: List[Middleware] = [Middleware(HeadersMiddleware)]
|
|
619
623
|
dml_event_handler = DmlEventHandler(
|
|
620
624
|
db=db,
|
|
621
625
|
cache_for_dataloaders=cache_for_dataloaders,
|
|
@@ -669,10 +673,7 @@ def create_app(
|
|
|
669
673
|
if enable_prometheus:
|
|
670
674
|
from phoenix.server.prometheus import PrometheusMiddleware
|
|
671
675
|
|
|
672
|
-
|
|
673
|
-
else:
|
|
674
|
-
prometheus_middlewares = []
|
|
675
|
-
|
|
676
|
+
middlewares.append(Middleware(PrometheusMiddleware))
|
|
676
677
|
app = FastAPI(
|
|
677
678
|
title="Arize-Phoenix REST API",
|
|
678
679
|
version=REST_API_VERSION,
|
|
@@ -687,10 +688,7 @@ def create_app(
|
|
|
687
688
|
startup_callbacks=startup_callbacks_list,
|
|
688
689
|
scaffolder_config=scaffolder_config,
|
|
689
690
|
),
|
|
690
|
-
middleware=
|
|
691
|
-
Middleware(HeadersMiddleware),
|
|
692
|
-
*prometheus_middlewares,
|
|
693
|
-
],
|
|
691
|
+
middleware=middlewares,
|
|
694
692
|
exception_handlers={HTTPException: plain_text_http_exception_handler},
|
|
695
693
|
debug=debug,
|
|
696
694
|
swagger_ui_parameters={
|
|
@@ -703,7 +701,8 @@ def create_app(
|
|
|
703
701
|
app.include_router(router)
|
|
704
702
|
app.include_router(graphql_router)
|
|
705
703
|
app.add_middleware(GZipMiddleware)
|
|
706
|
-
|
|
704
|
+
web_manifest_path = SERVER_DIR / "static" / ".vite" / "manifest.json"
|
|
705
|
+
if serve_ui and web_manifest_path.is_file():
|
|
707
706
|
app.mount(
|
|
708
707
|
"/",
|
|
709
708
|
app=Static(
|
|
@@ -716,7 +715,7 @@ def create_app(
|
|
|
716
715
|
n_samples=umap_params.n_samples,
|
|
717
716
|
is_development=dev,
|
|
718
717
|
authentication_enabled=authentication_enabled,
|
|
719
|
-
web_manifest_path=
|
|
718
|
+
web_manifest_path=web_manifest_path,
|
|
720
719
|
),
|
|
721
720
|
),
|
|
722
721
|
name="static",
|
phoenix/server/grpc_server.py
CHANGED
|
@@ -23,7 +23,7 @@ if TYPE_CHECKING:
|
|
|
23
23
|
ProjectName: TypeAlias = str
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
class Servicer(TraceServiceServicer): # type:ignore
|
|
26
|
+
class Servicer(TraceServiceServicer): # type: ignore[misc,unused-ignore]
|
|
27
27
|
def __init__(
|
|
28
28
|
self,
|
|
29
29
|
callback: Callable[[Span, ProjectName], Awaitable[None]],
|
|
@@ -78,7 +78,7 @@ class GrpcServer:
|
|
|
78
78
|
interceptors=interceptors,
|
|
79
79
|
)
|
|
80
80
|
server.add_insecure_port(f"[::]:{get_env_grpc_port()}")
|
|
81
|
-
add_TraceServiceServicer_to_server(Servicer(self._callback), server)
|
|
81
|
+
add_TraceServiceServicer_to_server(Servicer(self._callback), server) # type: ignore[no-untyped-call,unused-ignore]
|
|
82
82
|
await server.start()
|
|
83
83
|
self._server = server
|
|
84
84
|
|