arize-phoenix 8.32.1__py3-none-any.whl → 9.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 (79) hide show
  1. {arize_phoenix-8.32.1.dist-info → arize_phoenix-9.0.0.dist-info}/METADATA +2 -2
  2. {arize_phoenix-8.32.1.dist-info → arize_phoenix-9.0.0.dist-info}/RECORD +76 -56
  3. phoenix/db/constants.py +1 -0
  4. phoenix/db/facilitator.py +55 -0
  5. phoenix/db/insertion/document_annotation.py +31 -13
  6. phoenix/db/insertion/evaluation.py +15 -3
  7. phoenix/db/insertion/helpers.py +2 -1
  8. phoenix/db/insertion/span_annotation.py +26 -9
  9. phoenix/db/insertion/trace_annotation.py +25 -9
  10. phoenix/db/insertion/types.py +7 -0
  11. phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py +322 -0
  12. phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py +76 -0
  13. phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py +77 -0
  14. phoenix/db/models.py +151 -10
  15. phoenix/db/types/annotation_configs.py +97 -0
  16. phoenix/db/types/db_models.py +41 -0
  17. phoenix/db/types/trace_retention.py +267 -0
  18. phoenix/experiments/functions.py +5 -1
  19. phoenix/server/api/auth.py +9 -0
  20. phoenix/server/api/context.py +5 -0
  21. phoenix/server/api/dataloaders/__init__.py +4 -0
  22. phoenix/server/api/dataloaders/annotation_summaries.py +203 -24
  23. phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py +42 -0
  24. phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py +34 -0
  25. phoenix/server/api/helpers/annotations.py +9 -0
  26. phoenix/server/api/helpers/prompts/models.py +34 -67
  27. phoenix/server/api/input_types/CreateSpanAnnotationInput.py +9 -0
  28. phoenix/server/api/input_types/CreateTraceAnnotationInput.py +3 -0
  29. phoenix/server/api/input_types/PatchAnnotationInput.py +3 -0
  30. phoenix/server/api/input_types/SpanAnnotationFilter.py +67 -0
  31. phoenix/server/api/mutations/__init__.py +6 -0
  32. phoenix/server/api/mutations/annotation_config_mutations.py +413 -0
  33. phoenix/server/api/mutations/dataset_mutations.py +62 -39
  34. phoenix/server/api/mutations/project_trace_retention_policy_mutations.py +245 -0
  35. phoenix/server/api/mutations/span_annotations_mutations.py +272 -70
  36. phoenix/server/api/mutations/trace_annotations_mutations.py +203 -74
  37. phoenix/server/api/queries.py +86 -0
  38. phoenix/server/api/routers/v1/__init__.py +4 -0
  39. phoenix/server/api/routers/v1/annotation_configs.py +449 -0
  40. phoenix/server/api/routers/v1/annotations.py +161 -0
  41. phoenix/server/api/routers/v1/evaluations.py +6 -0
  42. phoenix/server/api/routers/v1/projects.py +1 -50
  43. phoenix/server/api/routers/v1/spans.py +35 -8
  44. phoenix/server/api/routers/v1/traces.py +22 -13
  45. phoenix/server/api/routers/v1/utils.py +60 -0
  46. phoenix/server/api/types/Annotation.py +7 -0
  47. phoenix/server/api/types/AnnotationConfig.py +124 -0
  48. phoenix/server/api/types/AnnotationSource.py +9 -0
  49. phoenix/server/api/types/AnnotationSummary.py +28 -14
  50. phoenix/server/api/types/AnnotatorKind.py +1 -0
  51. phoenix/server/api/types/CronExpression.py +15 -0
  52. phoenix/server/api/types/Evaluation.py +4 -30
  53. phoenix/server/api/types/Project.py +50 -2
  54. phoenix/server/api/types/ProjectTraceRetentionPolicy.py +110 -0
  55. phoenix/server/api/types/Span.py +78 -0
  56. phoenix/server/api/types/SpanAnnotation.py +24 -0
  57. phoenix/server/api/types/Trace.py +2 -2
  58. phoenix/server/api/types/TraceAnnotation.py +23 -0
  59. phoenix/server/app.py +20 -0
  60. phoenix/server/retention.py +76 -0
  61. phoenix/server/static/.vite/manifest.json +36 -36
  62. phoenix/server/static/assets/components-B2MWTXnm.js +4326 -0
  63. phoenix/server/static/assets/{index-B0CbpsxD.js → index-Bfvpea_-.js} +10 -10
  64. phoenix/server/static/assets/pages-CZ2vKu8H.js +7268 -0
  65. phoenix/server/static/assets/vendor-BRDkBC5J.js +903 -0
  66. phoenix/server/static/assets/{vendor-arizeai-CxXYQNUl.js → vendor-arizeai-BvTqp_W8.js} +3 -3
  67. phoenix/server/static/assets/{vendor-codemirror-B0NIFPOL.js → vendor-codemirror-COt9UfW7.js} +1 -1
  68. phoenix/server/static/assets/{vendor-recharts-CrrDFWK1.js → vendor-recharts-BoHX9Hvs.js} +2 -2
  69. phoenix/server/static/assets/{vendor-shiki-C5bJ-RPf.js → vendor-shiki-Cw1dsDAz.js} +1 -1
  70. phoenix/trace/dsl/filter.py +25 -5
  71. phoenix/utilities/__init__.py +18 -0
  72. phoenix/version.py +1 -1
  73. phoenix/server/static/assets/components-x-gKFJ8C.js +0 -3414
  74. phoenix/server/static/assets/pages-BU4VdyeH.js +0 -5867
  75. phoenix/server/static/assets/vendor-BfhM_F1u.js +0 -902
  76. {arize_phoenix-8.32.1.dist-info → arize_phoenix-9.0.0.dist-info}/WHEEL +0 -0
  77. {arize_phoenix-8.32.1.dist-info → arize_phoenix-9.0.0.dist-info}/entry_points.txt +0 -0
  78. {arize_phoenix-8.32.1.dist-info → arize_phoenix-9.0.0.dist-info}/licenses/IP_NOTICE +0 -0
  79. {arize_phoenix-8.32.1.dist-info → arize_phoenix-9.0.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 8.32.1
3
+ Version: 9.0.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
@@ -172,7 +172,7 @@ Phoenix is an open-source AI observability platform designed for experimentation
172
172
  - [**_Playground_**](https://docs.arize.com/phoenix/prompt-engineering/overview-prompts)- Optimize prompts, compare models, adjust parameters, and replay traced LLM calls.
173
173
  - [**_Prompt Management_**](https://docs.arize.com/phoenix/prompt-engineering/overview-prompts/prompt-management)- Manage and test prompt changes systematically using version control, tagging, and experimentation.
174
174
 
175
- Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙[LlamaIndex](https://docs.arize.com/phoenix/tracing/integrations-tracing/llamaindex), 🦜⛓[LangChain](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain), [Haystack](https://docs.arize.com/phoenix/tracing/integrations-tracing/haystack), 🧩[DSPy](https://docs.arize.com/phoenix/tracing/integrations-tracing/dspy), 🤗[smolagents](https://docs.arize.com/phoenix/tracing/integrations-tracing/hfsmolagents)) and LLM providers ([OpenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai), [Bedrock](https://docs.arize.com/phoenix/tracing/integrations-tracing/bedrock), [MistralAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/mistralai), [VertexAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/vertexai), [LiteLLM](https://docs.arize.com/phoenix/tracing/integrations-tracing/litellm), and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
175
+ Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙[LlamaIndex](https://docs.arize.com/phoenix/tracing/integrations-tracing/llamaindex), 🦜⛓[LangChain](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain), [Haystack](https://docs.arize.com/phoenix/tracing/integrations-tracing/haystack), 🧩[DSPy](https://docs.arize.com/phoenix/tracing/integrations-tracing/dspy), 🤗[smolagents](https://docs.arize.com/phoenix/tracing/integrations-tracing/hfsmolagents)) and LLM providers ([OpenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai), [Bedrock](https://docs.arize.com/phoenix/tracing/integrations-tracing/bedrock), [MistralAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/mistralai), [VertexAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/vertexai), [LiteLLM](https://docs.arize.com/phoenix/tracing/integrations-tracing/litellm), [Google GenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/google-genai) and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
176
176
 
177
177
  Phoenix runs practically anywhere, including your local machine, a Jupyter notebook, a containerized deployment, or in the cloud.
178
178
 
@@ -6,7 +6,7 @@ phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
6
6
  phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
7
7
  phoenix/services.py,sha256=ngkyKGVatX3cO2WJdo2hKdaVKP-xJCMvqthvga6kJss,5196
8
8
  phoenix/settings.py,sha256=x87BX7hWGQQZbrW_vrYqFR_izCGfO9gFc--JXUG4Tdk,754
9
- phoenix/version.py,sha256=UaNVMdObIxyLeFhiJhW0aDRn8ABTA1EjarJjwY2CmEY,23
9
+ phoenix/version.py,sha256=fmjeF1kRBUkpbk6F_YtljM4OmJk-qNnHjds6vJCK9fc,22
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=qBFraOtmwCCnWJltKNP18DDG0mULXigytlFsa6YOz6k,4837
@@ -16,39 +16,46 @@ phoenix/db/README.md,sha256=7BFJuecWJjFSxEYmoSv4CvoFHHszX4tFy3HJExOxS-4,8661
16
16
  phoenix/db/__init__.py,sha256=pDjEFXukHmJBM-1D8RjmXkvLsz85YWNxMQczt81ec3A,118
17
17
  phoenix/db/alembic.ini,sha256=GIS6HpHaKaJbbuahZg1Rc1D2_QqyCkV9r58wdARGf6w,3262
18
18
  phoenix/db/bulk_inserter.py,sha256=faNjuwLqqsw4ky8sa4D0h9u5TvEDTOjrccUW89L008E,12725
19
+ phoenix/db/constants.py,sha256=-YE2rkzcROG06_rerfnX5hC7fLzOHx1Gjw4nXhX_um4,46
19
20
  phoenix/db/engines.py,sha256=tB_8iWMDz0folryVvw29sbBUxJOB2XZ-Xx0Uexj3uns,6889
20
21
  phoenix/db/enums.py,sha256=tt7iovXLhVTLZ3_LbHNGgcI44SnNjXfkKtLAZG57T54,428
21
- phoenix/db/facilitator.py,sha256=6CeUMNTkNXrdviSQspY9ktFpVX-JHXcMJz6L0PuHxrI,7481
22
+ phoenix/db/facilitator.py,sha256=dznnV_kZNgpUe5D1BRpznfsClEkb1cgmd2QRMO4KyOM,9370
22
23
  phoenix/db/helpers.py,sha256=rbbHcl-STzcEpcXCYx6jbKzko7r3ggrWHHsXjZ48HsM,5352
23
24
  phoenix/db/migrate.py,sha256=oUrXH8yEbcpL4eh09aSCuUiSrhFli0eT5D_j4ZmYChY,2797
24
- phoenix/db/models.py,sha256=TbHgtT7WWdkQK-OtLsUqp3MwP23HGV1IaSAWTqCf5ac,45707
25
+ phoenix/db/models.py,sha256=6a8-3Ciz2OylXlwQvWupODGcmHUNguolmJwk_PWa2QQ,51185
25
26
  phoenix/db/pg_config.py,sha256=h6mB7qF7t4Zk6VGvAiyefHGVu74o-yJynaWzeE39k9Y,6001
26
27
  phoenix/db/insertion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
28
  phoenix/db/insertion/constants.py,sha256=8wifm7X-1XvroZ__R2Gc96NsgLhTDn0zXl4lehlXtcA,70
28
29
  phoenix/db/insertion/dataset.py,sha256=I9OC1ouVx7m6BH_c8hvcxW1dWGRAtpvXee29yBTuFkg,7136
29
- phoenix/db/insertion/document_annotation.py,sha256=vnszF9L0qHjUY-eWgBVRG5OTpz-ECs1BoCfy66ynzjo,5997
30
- phoenix/db/insertion/evaluation.py,sha256=SoI85N3MYUSeNgjKa5WzFw14OfNjNTjExv-2m3sxaR8,6371
31
- phoenix/db/insertion/helpers.py,sha256=PlYtLI6SfmQwoLZ8UYrkAffygjMwiuZz1FPs6g7Vchs,3437
30
+ phoenix/db/insertion/document_annotation.py,sha256=46IHWgILlIIoCkzgEtZIubqfpgF9KVA8ETWeblcpff0,6544
31
+ phoenix/db/insertion/evaluation.py,sha256=XIlDQMx9FFu_hO1TEao8_ScgKETw61AoeGezsmngXrY,6876
32
+ phoenix/db/insertion/helpers.py,sha256=PAYKxm21OKe_cLsIo08KGJCqT9avjabWLmvD1CpteRs,3499
32
33
  phoenix/db/insertion/span.py,sha256=02hpGo5ZY6N-n6Z-far-AC_yVAloXpJyt-CIHOeor0k,8126
33
- phoenix/db/insertion/span_annotation.py,sha256=EtzcjS8GR2rDM_cxIQloGc2SZqfdrACyAPwvyFBa2Ac,5273
34
- phoenix/db/insertion/trace_annotation.py,sha256=6yzWuU0Fh-mC-rJJ96rH0IYTJg1EQFnj-GZhUwolUKI,5338
35
- phoenix/db/insertion/types.py,sha256=cWeBceyZZ3efLHKPjnPpVahrpX7-P8Bm_sdudWXkOek,8106
34
+ phoenix/db/insertion/span_annotation.py,sha256=7m0kaOkdHhLTqs_E9Kt8BeCiHUpaU3mspm5ZdMz3lio,5728
35
+ phoenix/db/insertion/trace_annotation.py,sha256=Qijh7eROXLjV6OLIuKwsrc2OB9A7JnefzP4eZxlPRlc,5768
36
+ phoenix/db/insertion/types.py,sha256=0p1IQj4WlhNAWonuCnNzWaV6G6xTvAFXRattUGw_zrk,8378
36
37
  phoenix/db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
38
  phoenix/db/migrations/env.py,sha256=tFO3ceuCx9Es5_2w_BXclaQMmNQKNX21b1UEV5mYdeo,3387
38
39
  phoenix/db/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
39
40
  phoenix/db/migrations/data_migration_scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
41
  phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py,sha256=NJPoEX2-OhYxQXl0jRcX5eoq1azgLi8RLArZZw2pTY4,6046
41
42
  phoenix/db/migrations/versions/10460e46d750_datasets.py,sha256=E2xC5NCmY6bEvJGf1SbxblvmERHdxeEq13mbWTz3clQ,8663
43
+ phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py,sha256=hkGeTYYw-2gZufjXD0OMhJiBrGepoCJ7hUc28IN3twY,10775
42
44
  phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py,sha256=RxE_1vrpSAy2GKwHvrU3cOLA_bxcRRDibAj87nJEDKE,3622
43
45
  phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py,sha256=HDP3X5yxm5PwxMkODd-wrSwspQpFotTEz40jXRgq320,1787
46
+ phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py,sha256=VWluPffBH11NADJ1-CTzoFvbrqIFmEAOSKI21_jsLk8,1841
47
+ phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py,sha256=MmkEZRfDPppX9iM9yxyDzmXlJXlGCEqhbN0nCT8aBF0,2044
44
48
  phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py,sha256=rq-bwg0grRVvbKvwE2ZBCFG_nQRmYNCd2PJeFd_5SDk,5527
45
49
  phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py,sha256=fkpmh5PgMZJiZpvLbZIaqlI2cucVpVbbNYpQ-Tznil8,5180
46
50
  phoenix/db/migrations/versions/cf03bd6bae1d_init.py,sha256=ZNQzTUyb3p9Bkq7rjd5MRxGQV8W08zpY8E3GlzSJ2cM,8630
47
51
  phoenix/db/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ phoenix/db/types/annotation_configs.py,sha256=keiQ9mzLZWE8Eqsu1xFxQBXvBiym0s-yPzoL8qIR4PY,2904
53
+ phoenix/db/types/db_models.py,sha256=nMSd9gWHwObnVO3_slztlHqoeh04czS-Jxu-omS6M6E,1135
48
54
  phoenix/db/types/identifier.py,sha256=Opr3_1di6e5ncrBDn30WfBSr-jN_VGBnkkA4BMuSoyc,244
49
55
  phoenix/db/types/model_provider.py,sha256=96UMeqiy5X9PmYMOWA6dZAmI_BSV3yVxt9HEVYGe5Ns,157
56
+ phoenix/db/types/trace_retention.py,sha256=UoLVX4efhv-mcF32zHpMX_hXWe8474cmhEyPmYqeMfI,9573
50
57
  phoenix/experiments/__init__.py,sha256=6JGwgUd7xCbGpuHqYZlsmErmYvVgv7N_j43bn3dUqsk,123
51
- phoenix/experiments/functions.py,sha256=QOwYNMO1qxG2bah4ZjJKMk7agFkZRWGvwyazLcwRCys,32573
58
+ phoenix/experiments/functions.py,sha256=rqhKgo7F0jMlkR_7zTZ6UqknrSF44v2XgEd-JR5ISmY,32818
52
59
  phoenix/experiments/tracing.py,sha256=seNh9rBH-rtQe8_FPI_VJj1rbo3ADcP6wDvERkMoxNc,2858
53
60
  phoenix/experiments/types.py,sha256=yntt6fnAny1U4Q9Y5Mm4ZYIb9319OaJovl-kyXFtGQE,23475
54
61
  phoenix/experiments/utils.py,sha256=MZ1-OnTcavk_KUtbfGqt55Fk9TGtJpYG_K71WsN-zDk,785
@@ -81,7 +88,7 @@ phoenix/pointcloud/pointcloud.py,sha256=SN_1wXZcwKrtSnHGZLDZGx71orqE1WyVF7E-D58d
81
88
  phoenix/pointcloud/projectors.py,sha256=TQgwc9cJDjJkin1WZyZzgl3HsYrLLiyWD7Czy4jNW3U,1088
82
89
  phoenix/pointcloud/umap_parameters.py,sha256=db_WEPoamuWtopZx7tQfAXPnoE0MS8FkAV0_ThjEx_Q,1735
83
90
  phoenix/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- phoenix/server/app.py,sha256=1lPHzZwWlTpwzEaO6jmgO18Ib4ssBxoLO9fwbfT_ois,39053
91
+ phoenix/server/app.py,sha256=zDBaR8GPphzxV9HyVY8ktPovwxVcnKPXRIWnxKJMSGY,39961
85
92
  phoenix/server/authorization.py,sha256=fofeRwuoodCUB3DQYPCuAgIyeiwopXW0tkH_KZvU0Rg,1848
86
93
  phoenix/server/bearer_auth.py,sha256=9AY0-aOSHm-B7OYB-20jFA7bETAA6S1_W1za42A8Yt8,6804
87
94
  phoenix/server/dml_event.py,sha256=MjJmVEKytq75chBOSyvYDusUnEbg1pHpIjR3pZkUaJA,2838
@@ -92,21 +99,22 @@ phoenix/server/main.py,sha256=Twpig08FSHIwICMr-2qGNLNoCrgk6EjyHrrxiBwS_VU,18029
92
99
  phoenix/server/oauth2.py,sha256=EV4wcCwG0N7cJRcfGNURdP5rZgRVCeRDvXyle19A27Y,2064
93
100
  phoenix/server/prometheus.py,sha256=1KjvSfjSa2-BPjDybVMM_Kag316CsN-Zwt64YNr_snc,7825
94
101
  phoenix/server/rate_limiters.py,sha256=cFc73D2NaxqNZZDbwfIDw4So-fRVOJPBtqxOZ8Qky_s,7155
102
+ phoenix/server/retention.py,sha256=MQe1FWuc_NxhqgIq5q2hfFhWT8ddAmpppgI74xYEQ6c,3064
95
103
  phoenix/server/telemetry.py,sha256=4EluDDrhdDPxAjaW6lVSbi73xkB5XeUCZWOmZGdk0hg,2755
96
104
  phoenix/server/thread_server.py,sha256=Ea2AWreN1lwJsT2wYvGaRaiXrzBqH4kgkZpx0FO5Ocw,2144
97
105
  phoenix/server/types.py,sha256=gJJPBcDRkQ9VHZIt_aLqG_OBbGt1oWp4e3W3Jp61oKs,7409
98
106
  phoenix/server/api/README.md,sha256=Pyq1PLPgTzXAswrfIhGXrjI3Skq8it2jTVnanT6Ba4Q,1162
99
107
  phoenix/server/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
- phoenix/server/api/auth.py,sha256=nywpmfMI1trZTbZRD3oBj4kFjzg_vnxDljcM431T1eY,1246
101
- phoenix/server/api/context.py,sha256=gB9bNgdqqD4Bn-6V4zlKeILl6L76jynPtOuM_5UZBNw,6557
108
+ phoenix/server/api/auth.py,sha256=cvKH2FQLL7PasiqZMHgu9P4qchhEG7a7P9Nxy35FoIQ,1551
109
+ phoenix/server/api/context.py,sha256=O1-mnFWcxV69r0Uw4zz_630qEdRGHiZQCPicAbrZYxo,6898
102
110
  phoenix/server/api/exceptions.py,sha256=TA0JuY2YRnj35qGuMSQ8d0ToHum9gWm9W--3fSKHrX0,1171
103
111
  phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
104
- phoenix/server/api/queries.py,sha256=nQA39BqVlrlXy6guOURGKslcD4OZNhmzuCw_bw_yGms,35638
112
+ phoenix/server/api/queries.py,sha256=NxVJMVEPuqOcPczHSMwSOVe8i_DadYlS_r7QTjbZxZc,39679
105
113
  phoenix/server/api/schema.py,sha256=fcs36xQwFF_Qe41_5cWR8wYpDvOrnbcyTeo5WNMbDsA,1702
106
114
  phoenix/server/api/subscriptions.py,sha256=TnZhdoNHMXp1NkUVLA-eB54woll7FvxtsB2pLt1dO0w,23001
107
115
  phoenix/server/api/utils.py,sha256=quCBRcusc6PUq9tJq7M8PgwFZp7nXgVAxtbw8feribY,833
108
- phoenix/server/api/dataloaders/__init__.py,sha256=LiOF9d95TPOD3pYuE906trLq-_q1VP8JQ9B6SHicbbM,4360
109
- phoenix/server/api/dataloaders/annotation_summaries.py,sha256=2sHmIDX7n8tuPeBTs9bMKtlMKWn_Ph9awTZqmwn2Owc,5505
116
+ phoenix/server/api/dataloaders/__init__.py,sha256=jAdt8Tuoj8X2iszbjqJ-LVNo5PicmyxyCTQWL51NMxU,4659
117
+ phoenix/server/api/dataloaders/annotation_summaries.py,sha256=U-mVB6pY65umyjtmF-cLGJAp5QCAaB7psgTie6_gLGI,12943
110
118
  phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=GLFoFAbztOH-0FVzzZ77mATIO63UcjB50j3qXiNi-tE,1811
111
119
  phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=xF7M2dg3UmjhdCrscnztCIBBI0cg3RF48IIqvilpc18,4623
112
120
  phoenix/server/api/dataloaders/dataset_example_spans.py,sha256=z_MFquqAcJ9wat7BBp7MVeJ9BYuu2EZEdaog52iWDno,1390
@@ -123,6 +131,7 @@ phoenix/server/api/dataloaders/min_start_or_max_end_times.py,sha256=1jYglTXv4S8k
123
131
  phoenix/server/api/dataloaders/num_child_spans.py,sha256=655g9SP_3gfT4qqukfgKzLy5uBLQmnVQBP-mZL3in0s,1200
124
132
  phoenix/server/api/dataloaders/num_spans_per_trace.py,sha256=nNAxj6QYcTc8oykfJZxH0vtS9tE83oXoArVwQTJHzTw,922
125
133
  phoenix/server/api/dataloaders/project_by_name.py,sha256=O24Rjs0ZQaYtSnPfA6YBQfbHfUgNsHKUcc_gIKyK9vo,1086
134
+ phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py,sha256=KWaFZGI4wJaUftLoUJ4ufJYNx1UAWrFfVfloVGOX1XE,1606
126
135
  phoenix/server/api/dataloaders/prompt_version_sequence_number.py,sha256=tBaCbpI9KgjCACvpd-5hZy5TDSHH7PJPn4bd1xJuN-g,1314
127
136
  phoenix/server/api/dataloaders/record_counts.py,sha256=NLlMEaJ-HxiJavqbSkMbzOrIRzqzYxO8-t2mfp1vXqM,4160
128
137
  phoenix/server/api/dataloaders/session_io.py,sha256=1c2b-87KGHuF2sgeQvXmIv1-kFHEt6CfAvuH11jKfh4,3168
@@ -138,19 +147,21 @@ phoenix/server/api/dataloaders/span_projects.py,sha256=JTfuKn2BBn72QdAP53ZGP2OUC
138
147
  phoenix/server/api/dataloaders/table_fields.py,sha256=C3ywv87XphMEvqsQGl33H4iOiXbvqWqvaM4Snps4Sv0,3068
139
148
  phoenix/server/api/dataloaders/token_counts.py,sha256=Sr_sBfLgsKYCIjgzTFV-fuat7s7DATM2u6ZftLaOnoQ,4629
140
149
  phoenix/server/api/dataloaders/trace_by_trace_ids.py,sha256=xqYJOjCgXlTzour4vY72kO-2gJFgWMjD3759o78cq44,874
150
+ phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py,sha256=WYaq1iR43ekBljZLldZScjXrweY0D7S9FNzCeaYO9Y0,1213
141
151
  phoenix/server/api/dataloaders/trace_root_spans.py,sha256=0Y2ImTPmDHpz_quRMIjuxED2M0dAm2M0StZUmSTiTiw,1000
142
152
  phoenix/server/api/dataloaders/user_roles.py,sha256=TvPWve38TlGFvaFkMeFvnnHBn1OMHUJTErRLeYrXR8I,1029
143
153
  phoenix/server/api/dataloaders/users.py,sha256=Uh86Kny_xpqDdEvEklcTBUA_MELgu4Z0jgh45ZqTzXs,1075
144
154
  phoenix/server/api/dataloaders/cache/__init__.py,sha256=SYoOM9n8FJaMdQarma5d1blu-jIg2GB8Shqg5ezSzZ8,106
145
155
  phoenix/server/api/dataloaders/cache/two_tier_cache.py,sha256=cmo8FUT3E91R139IEzh4yCga-6nTamc5KPXAfMrzNDM,2315
146
156
  phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY-m_Vxw16U,272
157
+ phoenix/server/api/helpers/annotations.py,sha256=9gMXKpMTfWEChoSCnvdWYuyB0hlSnNOp-qUdar9Vono,262
147
158
  phoenix/server/api/helpers/dataset_helpers.py,sha256=DoMBTg-qXTnC_K4Evx1WKpCCYgRbITpVqyY-8efJRf0,8984
148
159
  phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
149
160
  phoenix/server/api/helpers/playground_clients.py,sha256=tHwW-HbnoxU-EXXVvmY_1lbYh3Mv7QKw-e9KnREc7m4,41814
150
161
  phoenix/server/api/helpers/playground_registry.py,sha256=CPLMziFB2wmr-dfbx7VbzO2f8YIG_k5RftzvGXYGQ1w,2570
151
162
  phoenix/server/api/helpers/playground_spans.py,sha256=ObAhvV_yNwEQDkjzgU5G73wfIisc8q4cpB0OFH5cd24,16974
152
163
  phoenix/server/api/helpers/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
- phoenix/server/api/helpers/prompts/models.py,sha256=zwWBA5GQvEHT4xyZwP-_kr1rJZ7SHnguATsQwsFw5aw,19519
164
+ phoenix/server/api/helpers/prompts/models.py,sha256=6AAYRqmuDMNrqelK9v-bh1qkfKLB3iHmISj7W6Awzqw,18585
154
165
  phoenix/server/api/helpers/prompts/conversions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
166
  phoenix/server/api/helpers/prompts/conversions/anthropic.py,sha256=ZT--UqBwoGf7QMusajB6aeB7zyWGttaZigb113kgiY8,3571
156
167
  phoenix/server/api/helpers/prompts/conversions/openai.py,sha256=a43WAftFn_me6ePHDufqvlg-4Z2C31owUSsqYC0YUP8,2589
@@ -162,8 +173,8 @@ phoenix/server/api/input_types/ClearProjectInput.py,sha256=cpPFRyQ3ffy2dLbCZgYpw
162
173
  phoenix/server/api/input_types/ClusterInput.py,sha256=AfhuYYHlYgdMO6Ap8cLXqAp70S0Wutx-RTzZYetN62A,173
163
174
  phoenix/server/api/input_types/Coordinates.py,sha256=meTwbIjwTfqx5DGD2DBlH9wQzdQVNM5a8x9dp1FfIgA,173
164
175
  phoenix/server/api/input_types/CreateDatasetInput.py,sha256=Q3MwouIx9jTQBRWDju75iMQXEGJCrL4aD4ESQp771nc,248
165
- phoenix/server/api/input_types/CreateSpanAnnotationInput.py,sha256=bKgT7bdA9-gYpJmqnMq9TEfjNDEYoldc17EjAglXVlU,474
166
- phoenix/server/api/input_types/CreateTraceAnnotationInput.py,sha256=iSukKAxt-gTTykpkttse3MVOTD3AOk6fWD-N5PaZ2yY,476
176
+ phoenix/server/api/input_types/CreateSpanAnnotationInput.py,sha256=BtPB8udqnpK7kQxPpryxoO4D4yoN1E4qYF2VZxqw2LQ,706
177
+ phoenix/server/api/input_types/CreateTraceAnnotationInput.py,sha256=GBzOwRw_GNQq3RwS5kDp32j55VI1czOmvEmRESqCsRQ,625
167
178
  phoenix/server/api/input_types/DataQualityMetricInput.py,sha256=WPWRlqSejOnxlLqsbEwPCDgz8ocsyGSb-9SptdCjZEc,1361
168
179
  phoenix/server/api/input_types/DatasetExampleInput.py,sha256=9oJ6pCFxFd02IWJuK4YAUvz-jCgFGDUCDDb2--GAzCw,289
169
180
  phoenix/server/api/input_types/DatasetSort.py,sha256=KDKjx5L8WFNwx7O-g1pDzCMMwY-ErgDd1_HkkZBAvCY,333
@@ -177,31 +188,34 @@ phoenix/server/api/input_types/DimensionInput.py,sha256=Vfx5FmiMKey4-EHDQsQRPzSA
177
188
  phoenix/server/api/input_types/GenerativeModelInput.py,sha256=n6OCkX44I1AIovMAHCxy8SvqPKDb_BYDPA-fn_JnckQ,634
178
189
  phoenix/server/api/input_types/Granularity.py,sha256=dbBlD_GsIBa8_xrx4JlLuR59bQ0NRB5H-cv1zvcb-cw,2299
179
190
  phoenix/server/api/input_types/InvocationParameters.py,sha256=62xL0iIKvuQherkuJaJ6Lha4TTEoYLpvH-pEP9awK6k,5260
180
- phoenix/server/api/input_types/PatchAnnotationInput.py,sha256=NWhkcbcGNPwfOYsN3wm5YFNNrSc5T-8Y5my74RK99HE,520
191
+ phoenix/server/api/input_types/PatchAnnotationInput.py,sha256=2wxC-ibQU59I28amTxLMYMo9SSvJwAIor0w0YvS0e48,676
181
192
  phoenix/server/api/input_types/PatchDatasetExamplesInput.py,sha256=_uMqkAInhLDvzUSASl6HgLNulTsekMcYzyd5J6LF90I,884
182
193
  phoenix/server/api/input_types/PatchDatasetInput.py,sha256=OURtTVY8Z_oFEDtKwT1LCMaOK5D4QYo5TVQ6mDrex-g,328
183
194
  phoenix/server/api/input_types/PerformanceMetricInput.py,sha256=4SG5AymxV2dMeCrK7eREThdt9SuC43irMYZtY-Oq-bg,658
184
195
  phoenix/server/api/input_types/ProjectSessionSort.py,sha256=qFgLmKYeyFpx7An9ZNdDNkkt7tghrG6XXruQbFLiFt8,919
185
196
  phoenix/server/api/input_types/PromptTemplateOptions.py,sha256=8ZJdH1F9fExcdH9dF8SJ29WycCvtEpK-Z6dZwFO7KgQ,232
186
197
  phoenix/server/api/input_types/PromptVersionInput.py,sha256=n6zBeSkK8ZFRHTjtVx4BK--azZIxXeYETa6Cufcet2I,3743
198
+ phoenix/server/api/input_types/SpanAnnotationFilter.py,sha256=-djfIXYCxV6sV3GPOZQUV0SPfiWDhRlTORfeQ7tCBgQ,2671
187
199
  phoenix/server/api/input_types/SpanAnnotationSort.py,sha256=T5pAGzmh4MiJp9JMAzNDByFVTczfw02FH4WFWwFezyI,361
188
200
  phoenix/server/api/input_types/SpanSort.py,sha256=oqvcWHYgp_nXvXYNi5l8Bhe7PHT3LbAhUn6ZXDSzdXo,5959
189
201
  phoenix/server/api/input_types/TimeRange.py,sha256=pwhC2jx6dFIgT0qFfnO68qiJp9-m7Je5QkNscNsuVxA,700
190
202
  phoenix/server/api/input_types/TraceAnnotationSort.py,sha256=BzwiUnMh2VsgQYnhDlbJ6ljHugqIS4YDUlYzvq_tl3o,365
191
203
  phoenix/server/api/input_types/UserRoleInput.py,sha256=xxhFe0ITZOgRVEJbVem_W6F1Ip_H6xDENdQqMMx-kKE,129
192
204
  phoenix/server/api/input_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
- phoenix/server/api/mutations/__init__.py,sha256=MlJPciihC5gwE0AVkaqZhYeVkaCuuq1EaDTrs1MRw2I,1560
205
+ phoenix/server/api/mutations/__init__.py,sha256=fGFokUtX4J1q9yYzRtPOwRyfJNyL_8z60gaWX9IPvtM,1872
206
+ phoenix/server/api/mutations/annotation_config_mutations.py,sha256=i7NsQhYICcQ-I-tnFjGtVAYc8WVmMBacmRaqHWJ25t4,15433
194
207
  phoenix/server/api/mutations/api_key_mutations.py,sha256=diNBL06zrFCmzR-leYbL-AxDqN05-YtbzsnsAdew_K8,6194
195
208
  phoenix/server/api/mutations/chat_mutations.py,sha256=ChRh4YbNkBgFO05CNElzqJ1hIvo7lr5Zn0lvlRs51pE,22997
196
- phoenix/server/api/mutations/dataset_mutations.py,sha256=V52mL0vizxL9cvWWBkmd19rGu8xvu-B8LOosZkROPIk,27004
209
+ phoenix/server/api/mutations/dataset_mutations.py,sha256=KRlF-Ag3twqaBpLR_6WYxf57DffaGuFBm-soaBPStbI,27787
197
210
  phoenix/server/api/mutations/experiment_mutations.py,sha256=p3CoLAa8nFPa3D759Y2A7De_PVJNGOL98mA3HoZBrRQ,3188
198
211
  phoenix/server/api/mutations/export_events_mutations.py,sha256=xoDnVWC7eA_8wNQP0-oyiHojyUZ0EhVVSrsAnztetC0,3993
199
212
  phoenix/server/api/mutations/project_mutations.py,sha256=u7kLvJbBFR418F9lMamiisZerF18E8h5wGKV4sDTF-g,2674
213
+ phoenix/server/api/mutations/project_trace_retention_policy_mutations.py,sha256=AqBe8TBxlXdIL56Afs4FIBqkI0bEgf-v9bHlbc-O6VI,9839
200
214
  phoenix/server/api/mutations/prompt_label_mutations.py,sha256=uCiVcULtmgaNaav4M08ipPYM68sZv1MVLrCgvW-Xyn8,7317
201
215
  phoenix/server/api/mutations/prompt_mutations.py,sha256=Yg-6L2PiKUZfFyNarptu3OdE0uA2_Nyl3VrLVP8FJ9Y,12114
202
216
  phoenix/server/api/mutations/prompt_version_tag_mutations.py,sha256=t77osYb5he2Am4UeNis7pzY9MnaA9PNEQhsQelRH8k8,5767
203
- phoenix/server/api/mutations/span_annotations_mutations.py,sha256=sumBLUqRKlgMASWdWwYItmIJ2l7AyAp_PlIYeXYfguc,5970
204
- phoenix/server/api/mutations/trace_annotations_mutations.py,sha256=sEcEt8hbMt8YMiRX5o3xcJ5rWWZbDeBPMNz2teZoi3U,5945
217
+ phoenix/server/api/mutations/span_annotations_mutations.py,sha256=LQPcODp7-ZobXspjmtLaamyQa8UkTONC_va-ST9r-k8,15015
218
+ phoenix/server/api/mutations/trace_annotations_mutations.py,sha256=PLNNzSlk3fyJHkAVaMGR8pbWB63nOos-cStUWbTi7f8,11995
205
219
  phoenix/server/api/mutations/trace_mutations.py,sha256=D5h2HYdlTo6yYZNq-O-PjaS9GeiZHxxVaOxDdh7fwjw,2957
206
220
  phoenix/server/api/mutations/user_mutations.py,sha256=7CSTuUENIfKkdFhwLguqPG28h3zO5KrhMhfQqSCjNIg,14164
207
221
  phoenix/server/api/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -212,27 +226,32 @@ phoenix/server/api/routers/auth.py,sha256=T774FE5mqrfRSSYo1snpR5NIp3YzAJnsLsY9FJ
212
226
  phoenix/server/api/routers/embeddings.py,sha256=BpZGJee0pdL0W5Rp1L0b30dEtZTgJeVqXky8LgZ0ZXw,898
213
227
  phoenix/server/api/routers/oauth2.py,sha256=qXSUmnHPoRS8extKB8qUD8zbnUerAHeoEyEiVPiCyek,17285
214
228
  phoenix/server/api/routers/utils.py,sha256=M41BoH-fl37izhRuN2aX7lWm7jOC20A_3uClv9TVUUY,583
215
- phoenix/server/api/routers/v1/__init__.py,sha256=_diWcDH9P49f_p0g2E8zkh-eVQkcSYCVdBO_zLccS8o,2393
229
+ phoenix/server/api/routers/v1/__init__.py,sha256=0oOcsKJkQtBXAjZAo3AMtfjyW3OGCU4MI4TGW5nV6lo,2614
230
+ phoenix/server/api/routers/v1/annotation_configs.py,sha256=rZ3yJm7m75BVegSjSHqsdqf7n26roGg7vYYiiKfWA3A,15898
231
+ phoenix/server/api/routers/v1/annotations.py,sha256=oeafR2tCLu-uIwM9J72gN3MX5WDhrOMU3Jqd1uIiFqg,5921
216
232
  phoenix/server/api/routers/v1/datasets.py,sha256=gHlF4x0EmWiJ-8vwJygoh0bO3gvDBmi6vYnLAbSkQw4,37057
217
- phoenix/server/api/routers/v1/evaluations.py,sha256=RpOkTylp5Da6BvPZGuN8ksnxz_BVXRIwyOvwX9Iko8U,12647
233
+ phoenix/server/api/routers/v1/evaluations.py,sha256=GFTo42aIEX0Htn0EjjoE1JZDYlvryeZ_CK9kowhwzGw,12830
218
234
  phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=vx4CKlE84sAL1vtPiM_XWnbfrATQujOSzzduJDYgcyM,4829
219
235
  phoenix/server/api/routers/v1/experiment_runs.py,sha256=bInuasRv7ogiYf8fq-LwpJ5tptmMQsBNDlJAqwdymko,6378
220
236
  phoenix/server/api/routers/v1/experiments.py,sha256=V9_sxqLTE1MKGFu9H3FEdGKr70lYMbGZx813MGaavfQ,20430
221
237
  phoenix/server/api/routers/v1/models.py,sha256=r0nM2kFJ3mxDqgc5vFr1cjNuyOPs3RIKE_DS2VMdF48,1749
222
- phoenix/server/api/routers/v1/projects.py,sha256=qv4RffYVGCJQuJ3FzaTVkueY8qKY0-GUbG9eSdm7oRY,14181
238
+ phoenix/server/api/routers/v1/projects.py,sha256=RVOAWW8RQIqaebQFcIbk1OGxO7B1BITtUewlcSUhasg,12615
223
239
  phoenix/server/api/routers/v1/prompts.py,sha256=aBOUBwLDzZDIzJQkxJcR8ZKnakNJOLMwzsLKINSs1mA,26545
224
- phoenix/server/api/routers/v1/spans.py,sha256=kvWRbMy5LjEPOw1Hd3PyncSspRYNi6ISe3Wr3qRpHa0,9751
225
- phoenix/server/api/routers/v1/traces.py,sha256=hSv35QIB4mwFgp53rOpz3zWIiSwbZzQnjafD790QuJU,7908
226
- phoenix/server/api/routers/v1/utils.py,sha256=SoRl0Dc8By15ZckhNcXg2QRrqYjMvgTjVcqrZ6MwVmo,3065
227
- phoenix/server/api/types/Annotation.py,sha256=r1JDvkWoFKeLRysos3l1exqKfs8zoklVv2tNSG9kFzQ,849
228
- phoenix/server/api/types/AnnotationSummary.py,sha256=Adg_tFla5lL2csDQeQwn58b8kTB_57hotAN6WLQCLzE,1512
229
- phoenix/server/api/types/AnnotatorKind.py,sha256=rPgGdbN1Gvc109sGQ_ZH-gfJbp93V9wlarzTEJNtUwI,236
240
+ phoenix/server/api/routers/v1/spans.py,sha256=RsmHZ-KusCUleCObNLzlHgOtbTqR50PU82sr8mspecc,10811
241
+ phoenix/server/api/routers/v1/traces.py,sha256=DfzeszQvtlrVxvurJLaWJJAhkCZ4BodLwpFuBYPwN5Q,8206
242
+ phoenix/server/api/routers/v1/utils.py,sha256=oXIOGPzPTkE0ZWUTRCoRIQQ7wTzoSwtWFaUSjlGBqts,4960
243
+ phoenix/server/api/types/Annotation.py,sha256=gsl8CwjIbDUbZRj4d9USwZ_w_Tkz4i7zuZh9ftV80jA,1132
244
+ phoenix/server/api/types/AnnotationConfig.py,sha256=TPukZUgvFC17W93Vnme21EhswasBMR-ZiuSWteiWZOU,3891
245
+ phoenix/server/api/types/AnnotationSource.py,sha256=nwWL8HdnMNE8LKvAbeZix-dzfBNymACyBt9f6nzk0PM,122
246
+ phoenix/server/api/types/AnnotationSummary.py,sha256=mXp2bdlcId_i8swVuv7I72mMvFv0ZOTTgI03CT5X8gQ,2080
247
+ phoenix/server/api/types/AnnotatorKind.py,sha256=6L_1iuxYYwmEMdKNlET1bPKhJ-INfCsY_VHDwCLi63E,254
230
248
  phoenix/server/api/types/ApiKey.py,sha256=76HIkWxyJqL3UjdMesX9l5y6XaD9QphwabXGQVY-MaQ,793
231
249
  phoenix/server/api/types/AuthMethod.py,sha256=M25usT6FCNKi-QFMdtMqRjJVGfq1ACnVoSjHXGxfrUk,126
232
250
  phoenix/server/api/types/ChatCompletionMessageRole.py,sha256=kmQOilOlVntlmqbaHkqXZuimfljfYaHc3kbo53uK8_0,227
233
251
  phoenix/server/api/types/ChatCompletionSubscriptionPayload.py,sha256=G0YsirJzDMFDqEK7I_FCkPmIugAof-8D9fNfFlHdhjY,1031
234
252
  phoenix/server/api/types/Cluster.py,sha256=duX0pSC7P3YT1IztduuJtPsRj1x6oOOLfmWf2Y-FdEk,5699
235
253
  phoenix/server/api/types/CreateDatasetPayload.py,sha256=R-6zCmuD0f76RU9Giu78xwTHlASQs6Aq8yzvX1Kxc3g,140
254
+ phoenix/server/api/types/CronExpression.py,sha256=R7oxuSSX_eTUHQWaoaSueQqWDmkkHr5dBKRN6q-6ROk,331
236
255
  phoenix/server/api/types/DataQualityMetric.py,sha256=Aieg3bHeBFaAf4mqeRcH1zT04sXAtQD8ATSHJt7FaBQ,1538
237
256
  phoenix/server/api/types/Dataset.py,sha256=1NACY8_s-TZGgTwv6pkFlYPJDy14EVcQlrjgNd7dQ_U,11732
238
257
  phoenix/server/api/types/DatasetExample.py,sha256=_9byxGpXfYb-hmFMUJeG7Bw1wsRKSJaHwF2IPAbFpFw,3115
@@ -248,7 +267,7 @@ phoenix/server/api/types/DocumentEvaluationSummary.py,sha256=dx4Btlfw9_XsfmibjfW
248
267
  phoenix/server/api/types/DocumentRetrievalMetrics.py,sha256=amkpC3H5IU5-9GvO0telpbq00m6lIcv_2v446OpwFwc,1822
249
268
  phoenix/server/api/types/EmbeddingDimension.py,sha256=AYvpZ1nWINAgN4BAZsA_xI_2TNFK6h5jmqzvkPs651M,19428
250
269
  phoenix/server/api/types/EmbeddingMetadata.py,sha256=fJvNNYCbkf3SJalArLy9rcBq9Uj1SNac60zjqe1PFnM,461
251
- phoenix/server/api/types/Evaluation.py,sha256=rLJptUSRUPPx9sdUyc4UPWxzkr9gcKtkpAS5Zi_EyFQ,2406
270
+ phoenix/server/api/types/Evaluation.py,sha256=jPUH4fUFTpQHmiHA4zS4o3zigYp2LNX7VhlT580HJ_I,1301
252
271
  phoenix/server/api/types/EvaluationSummary.py,sha256=vILYejnfPvMwWEXOwhQZsANvYe3AdO2OkMR2rcgp1H4,1512
253
272
  phoenix/server/api/types/Event.py,sha256=iYt_Jx1Roioo0vZ0iPeJTHcTu6NSm4ilVMJ-IMUHAKk,3970
254
273
  phoenix/server/api/types/EventMetadata.py,sha256=-J0tYF9eZTHwCjwxQHY7Gckr2_MNW5OoWT1mydweZNM,635
@@ -270,8 +289,9 @@ phoenix/server/api/types/MimeType.py,sha256=Zpi6zCalkSFgsvhzvOs-O1gYA04usAi9H__Q
270
289
  phoenix/server/api/types/Model.py,sha256=8UIFqMe1q-2ufBNg-gxHusV8wM1h-KbfLUeJjyVcMvQ,8081
271
290
  phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
272
291
  phoenix/server/api/types/PerformanceMetric.py,sha256=KFkmJDqP43eDUtARQOUqR7NYcxvL6Vh2uisHWU6H3ko,387
273
- phoenix/server/api/types/Project.py,sha256=5Vl2AFqiyAD4PlX2jNAP6tbx07hAs5XT0wZnGR10mbw,20645
292
+ phoenix/server/api/types/Project.py,sha256=91yfPnu717qVQJJaJYBkJo6YXNbNql2HC4sWSXsfBFM,22638
274
293
  phoenix/server/api/types/ProjectSession.py,sha256=fyfVtpUpFOTnBx8DFnH3dr7WXAssN0ooAgrQSSi7kEI,4677
294
+ phoenix/server/api/types/ProjectTraceRetentionPolicy.py,sha256=tYy2kgalPDyuaYZr0VUHjH0YpXaiF_QOzg5yfaV_c7c,3782
275
295
  phoenix/server/api/types/Prompt.py,sha256=ccP4eq1e38xbF0afclGWLOuDpBVpNbJ3AOSRClF8yFQ,4955
276
296
  phoenix/server/api/types/PromptLabel.py,sha256=g3IDSPYRZwb0qpMAk93R6J96jgYULUYGOciTnpeh3sI,1321
277
297
  phoenix/server/api/types/PromptResponse.py,sha256=Q8HKtpp8GpUOcxPCzZpkkokidDd6u0aZOv_SuPZZd5Q,630
@@ -283,15 +303,15 @@ phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSF
283
303
  phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
284
304
  phoenix/server/api/types/Segments.py,sha256=vT2v0efoa5cuBKxLtxTnsUP5YJJCZfTloM71Spu0tMI,2915
285
305
  phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
286
- phoenix/server/api/types/Span.py,sha256=OJBVbOltdhqbSOepge0qPYS9PBGs2BrA9RyktQ9_otE,25371
287
- phoenix/server/api/types/SpanAnnotation.py,sha256=6b5G-b_OoRvDL2ayWk7MkbqarLK-F-pQMx21CpUuNGY,1168
306
+ phoenix/server/api/types/Span.py,sha256=N61m2HKaF-F7t7myCfg5k2cbzM_4R86wZS4r881e-SY,28787
307
+ phoenix/server/api/types/SpanAnnotation.py,sha256=uPWu7Z8rmpfKhaaxbged4_o00pPCR3nkn7Gji9vB8jY,1959
288
308
  phoenix/server/api/types/SpanIOValue.py,sha256=c5TWdZZN3v0gHI5xWeY7gjD-sE9ugWlGGAio-gDS-Uo,1653
289
309
  phoenix/server/api/types/SystemApiKey.py,sha256=2ym8EgsTBIvxx1l9xZ-2YMovz58ZwYb_MaHBTJ9NH2E,166
290
310
  phoenix/server/api/types/TimeSeries.py,sha256=nuuZtfHmOhTjeB8_SvZ5PUQexAkTcPScwYeFC5RUlRU,5491
291
311
  phoenix/server/api/types/TokenUsage.py,sha256=g-PjAGVigpchQgkXAuC5sc53fn2YwAgfeXkGmFPi_TE,201
292
312
  phoenix/server/api/types/ToolDefinition.py,sha256=T6UH2vcbuPBDy7jKYOqMth2NdqxMPgDBf11Tpbt5Yb8,187
293
- phoenix/server/api/types/Trace.py,sha256=Yhy3olalZ03k3kJkg2DHwYhBM2sUe_HIRtDY258gvFc,8193
294
- phoenix/server/api/types/TraceAnnotation.py,sha256=OW6A2zr1gomOuG0XQe55dk15XXX2DSM0DzatRbHWH5A,1256
313
+ phoenix/server/api/types/Trace.py,sha256=fx1ozxiFMu-9AUyJ9LyMr6QtMqxzGEkucu7eE_dDZBM,8195
314
+ phoenix/server/api/types/TraceAnnotation.py,sha256=qUO9DhTIAOKIYqNd5uHqLAsVTsJLSddkXo-gmyjnPBI,1964
295
315
  phoenix/server/api/types/UMAPPoints.py,sha256=49sWnxjcAJKRzqUY71Fa0tOPti5XjIIFT5cSg6oNu_U,1650
296
316
  phoenix/server/api/types/User.py,sha256=iTVUrI8U6-asOhBt1bOZNtoRAaRNC4WHgR1Uv2rHnWQ,1975
297
317
  phoenix/server/api/types/UserApiKey.py,sha256=EcsPNxV_PtgpqwA_bPTj_aRYt15l6X24YDy20hUPywU,1251
@@ -320,16 +340,16 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
320
340
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
321
341
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
322
342
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
323
- phoenix/server/static/.vite/manifest.json,sha256=lkhQOaQx8cjiJQeVrrDfp2_pSvKAS8o-DDrzjdLXY7Y,2165
324
- phoenix/server/static/assets/components-x-gKFJ8C.js,sha256=X4qsvxt0Au4bURJd_ntsb_5zDbCCf6ExCyWjTc3QANc,458101
325
- phoenix/server/static/assets/index-B0CbpsxD.js,sha256=0Y1a5THRDD7MIVBniyp-LQRcFniB0L6GuLI7LIorVNo,60460
326
- phoenix/server/static/assets/pages-BU4VdyeH.js,sha256=7rSqUn1XhMhJJdw8u6lEcvwWGpVJI0ciX1y3Z5euwF0,866121
327
- phoenix/server/static/assets/vendor-BfhM_F1u.js,sha256=S90L1KRZOw_NX6C9FENfLs6bSuEzf7zVDAqjZAZJZgE,2514280
343
+ phoenix/server/static/.vite/manifest.json,sha256=We1LFOj6nMnRbMzbxOE_1L06HVo7xXam1mg-DVoqPXA,2165
344
+ phoenix/server/static/assets/components-B2MWTXnm.js,sha256=2_C-61D2pzLsgB9f16vxJfTJDB5MXzarHcLYuWFGO_4,530209
345
+ phoenix/server/static/assets/index-Bfvpea_-.js,sha256=RPCq3x94S7VsuWdc0Lk7Y0wX323mvKYnPJnn_AC9kaI,60669
346
+ phoenix/server/static/assets/pages-CZ2vKu8H.js,sha256=m2dfQXuAII1BGgr4CayJOJKsZ6ds0iH-hgAIj6phaRo,1013141
347
+ phoenix/server/static/assets/vendor-BRDkBC5J.js,sha256=qRSj_aFoih8Zxp-Vya-CWYj-24wgjIYzQLloWW7oa8s,2661112
328
348
  phoenix/server/static/assets/vendor-Cg6lcjUC.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
329
- phoenix/server/static/assets/vendor-arizeai-CxXYQNUl.js,sha256=V0umBNhH2psKhzwNKvLylYrqVfHu4I6NDSqejmR2OIU,193248
330
- phoenix/server/static/assets/vendor-codemirror-B0NIFPOL.js,sha256=XIIcXC7NfCwIHORCWThN4GyMvohkMv3UYAhKWNWZzC0,781264
331
- phoenix/server/static/assets/vendor-recharts-CrrDFWK1.js,sha256=EnjW8lF_NHEAvzq42kjAsI7VAas5YsF-YLo11NGHtjI,282109
332
- phoenix/server/static/assets/vendor-shiki-C5bJ-RPf.js,sha256=FW2Z4UsRXRmPGjDeJSv2Tz-JMs24Ypl-yvt-T9Fdnb0,8980312
349
+ phoenix/server/static/assets/vendor-arizeai-BvTqp_W8.js,sha256=oGu_hHPbWuwvQRlH6ryyXtWRUXJfysRmbz9A1UPN9JU,193248
350
+ phoenix/server/static/assets/vendor-codemirror-COt9UfW7.js,sha256=UyZx84hDMEGKM9lU8O6tbzUtgwZTV7rh25Dvn00UGiQ,781264
351
+ phoenix/server/static/assets/vendor-recharts-BoHX9Hvs.js,sha256=D9n3-7nfMookUbweXQd9e2CO9upBbtmFdA8hzmI6oz0,282151
352
+ phoenix/server/static/assets/vendor-shiki-Cw1dsDAz.js,sha256=7tEVbYPDltuhQcLpdJ2QlMLfJuenNeHhiuB6zUjzGEI,8980312
333
353
  phoenix/server/static/assets/vendor-three-C5WAXd5r.js,sha256=ELkg06u70N7h8oFmvqdoHyPuUf9VgGEWeT4LKFx4VWo,620975
334
354
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
335
355
  phoenix/server/templates/index.html,sha256=e8_jdi7Eo19SK7DI_gglkTW094D17E0VAegoMmmmvIc,4330
@@ -354,13 +374,13 @@ phoenix/trace/trace_dataset.py,sha256=jOlAD8_QqbI3hwqya72hrd3zo-pg7ok1I1a4psoHqb
354
374
  phoenix/trace/utils.py,sha256=nlOmbF4n57s6qwZsMoeyEdfPHl6KE0fZM8V9aHaIR-I,1681
355
375
  phoenix/trace/dsl/README.md,sha256=ihmP9zGUC5V-TDbzKla76LuyDqPDQIBUH2BORwxNI68,2902
356
376
  phoenix/trace/dsl/__init__.py,sha256=WIQIjJg362XD3s50OsPJJ0xbDsGp41bSv7vDllLrPuA,144
357
- phoenix/trace/dsl/filter.py,sha256=yCmQKvIh7SA5Q-bQ-MKMlYY34lZnG39MLEmL2A93MTw,30472
377
+ phoenix/trace/dsl/filter.py,sha256=FYOzH1gkwlKBYepscZzwHeeXnJdTadC_m4v0cYRs00Y,31557
358
378
  phoenix/trace/dsl/helpers.py,sha256=pJESAz7sDNE7HTVCFzxIx5sEsyUSh7RIN7yqmndAaF8,4171
359
379
  phoenix/trace/dsl/query.py,sha256=qi5k83Ch7mouSzd8w8dkMHVJ9C45tYXZLtb4lMwToZM,36350
360
380
  phoenix/trace/v1/__init__.py,sha256=-IbAD0ruESMjvQLvGAg9CTfjBUATFDx1OXseDPis6-0,88
361
381
  phoenix/trace/v1/evaluation_pb2.py,sha256=8sXvv2BW_vqD30MOMbmkeE2zpmm7ncik21kl3e-HzeQ,2254
362
382
  phoenix/trace/v1/evaluation_pb2.pyi,sha256=cCbbx06gwQmaH14s3J1X25TtaARh-k1abbxQdQCXGm8,4500
363
- phoenix/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
383
+ phoenix/utilities/__init__.py,sha256=PCtaszUCo9GZvXewPd09gmXxTJB4WRmfAsEeDwRHV4E,461
364
384
  phoenix/utilities/client.py,sha256=sUiy8FsxzIf6Hmd1rpD6infmijOdM9r24zJokA5RjZM,5595
365
385
  phoenix/utilities/deprecation.py,sha256=LL1LWfVqnYulceMQw2CggoIv8Uogrj7fAD_85devnoo,1067
366
386
  phoenix/utilities/error_handling.py,sha256=5_ggfwmd0xZPoI3qi1fwm0x1F0i7g5j-gr0ny1TFzPU,1967
@@ -370,9 +390,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
370
390
  phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
371
391
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
372
392
  phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
373
- arize_phoenix-8.32.1.dist-info/METADATA,sha256=Tmih_769p0j9crLeyhY-u6bNxpEXH8MlLXKuMKxC0bg,24950
374
- arize_phoenix-8.32.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
375
- arize_phoenix-8.32.1.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
376
- arize_phoenix-8.32.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
377
- arize_phoenix-8.32.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
378
- arize_phoenix-8.32.1.dist-info/RECORD,,
393
+ arize_phoenix-9.0.0.dist-info/METADATA,sha256=Xu20K4JjcUX625FlF2GkjBkCE8GglKvWw0XR9BMy2R4,25038
394
+ arize_phoenix-9.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
395
+ arize_phoenix-9.0.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
396
+ arize_phoenix-9.0.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
397
+ arize_phoenix-9.0.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
398
+ arize_phoenix-9.0.0.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID = 0
phoenix/db/facilitator.py CHANGED
@@ -9,6 +9,7 @@ from typing import Optional
9
9
 
10
10
  from sqlalchemy import (
11
11
  distinct,
12
+ exists,
12
13
  insert,
13
14
  select,
14
15
  )
@@ -27,7 +28,13 @@ from phoenix.config import (
27
28
  get_env_default_admin_initial_password,
28
29
  )
29
30
  from phoenix.db import models
31
+ from phoenix.db.constants import DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID
30
32
  from phoenix.db.enums import COLUMN_ENUMS, UserRole
33
+ from phoenix.db.types.trace_retention import (
34
+ MaxDaysRule,
35
+ TraceRetentionCronExpression,
36
+ TraceRetentionRule,
37
+ )
31
38
  from phoenix.server.email.types import WelcomeEmailSender
32
39
  from phoenix.server.types import DbSessionFactory
33
40
 
@@ -57,6 +64,7 @@ class Facilitator:
57
64
  _ensure_user_roles,
58
65
  _get_system_user_id,
59
66
  partial(_ensure_admins, email_sender=self._email_sender),
67
+ _ensure_default_project_trace_retention_policy,
60
68
  ):
61
69
  await fn(self._db)
62
70
 
@@ -205,3 +213,50 @@ async def _ensure_admins(
205
213
  ):
206
214
  if isinstance(exc, Exception):
207
215
  logger.error(f"Failed to send welcome email: {exc}")
216
+
217
+
218
+ async def _ensure_default_project_trace_retention_policy(db: DbSessionFactory) -> None:
219
+ """
220
+ Ensures the default trace retention policy (id=1) exists in the database. Default policy
221
+ applies to all projects without a specific policy (i.e. foreign key is null).
222
+
223
+ This function checks for the presence of the default trace retention policy and
224
+ creates it if missing. The default trace retention policy:
225
+
226
+ - Has ID=0
227
+ - Is named "Default"
228
+ - Runs every Sunday at midnight UTC (cron: "0 0 * * 0")
229
+ - Retains traces indefinitely
230
+
231
+ If the default policy already exists, this function makes no changes.
232
+
233
+ Args:
234
+ db (DbSessionFactory): An async SQLAlchemy session factory.
235
+
236
+ Returns:
237
+ None
238
+ """
239
+ assert DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID == 0
240
+ async with db() as session:
241
+ if await session.scalar(
242
+ select(
243
+ exists().where(
244
+ models.ProjectTraceRetentionPolicy.id
245
+ == DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID
246
+ )
247
+ )
248
+ ):
249
+ return
250
+ cron_expression = TraceRetentionCronExpression(root="0 0 * * 0")
251
+ rule = TraceRetentionRule(root=MaxDaysRule(max_days=0))
252
+ await session.execute(
253
+ insert(models.ProjectTraceRetentionPolicy),
254
+ [
255
+ {
256
+ "id": DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID,
257
+ "name": "Default",
258
+ "cron_expression": cron_expression,
259
+ "rule": rule,
260
+ }
261
+ ],
262
+ )
@@ -24,9 +24,17 @@ _SpanRowId: TypeAlias = int
24
24
  _DocumentPosition: TypeAlias = int
25
25
  _AnnoRowId: TypeAlias = int
26
26
  _NumDocs: TypeAlias = int
27
+ _Identifier: TypeAlias = str
27
28
 
28
- _Key: TypeAlias = tuple[_Name, _SpanId, _DocumentPosition]
29
- _UniqueBy: TypeAlias = tuple[_Name, _SpanRowId, _DocumentPosition]
29
+
30
+ class _Key(NamedTuple):
31
+ annotation_name: _Name
32
+ annotation_identifier: _Identifier
33
+ span_id: _SpanId
34
+ document_position: _DocumentPosition
35
+
36
+
37
+ _UniqueBy: TypeAlias = tuple[_Name, _SpanRowId, _DocumentPosition, _Identifier]
30
38
  _Existing: TypeAlias = tuple[
31
39
  _SpanRowId,
32
40
  _SpanId,
@@ -34,6 +42,7 @@ _Existing: TypeAlias = tuple[
34
42
  Optional[_AnnoRowId],
35
43
  Optional[_Name],
36
44
  Optional[_DocumentPosition],
45
+ Optional[_Identifier],
37
46
  Optional[datetime],
38
47
  ]
39
48
 
@@ -46,7 +55,8 @@ class DocumentAnnotationQueueInserter(
46
55
  DocumentAnnotationDmlEvent,
47
56
  ],
48
57
  table=models.DocumentAnnotation,
49
- unique_by=("name", "span_rowid", "document_position"),
58
+ unique_by=("name", "span_rowid", "document_position", "identifier"),
59
+ constraint_name="uq_document_annotations_name_span_rowid_document_pos_identifier",
50
60
  ):
51
61
  async def _events(
52
62
  self,
@@ -77,12 +87,14 @@ class DocumentAnnotationQueueInserter(
77
87
  e.span_id: _SpanAttr(e.span_rowid, e.num_docs) for e in existing
78
88
  }
79
89
  existing_annos: Mapping[_Key, _AnnoAttr] = {
80
- (e.name, e.span_id, e.document_position): _AnnoAttr(e.span_rowid, e.id, e.updated_at)
90
+ _Key(
91
+ annotation_name=e.name,
92
+ annotation_identifier=e.identifier,
93
+ span_id=e.span_id,
94
+ document_position=e.document_position,
95
+ ): _AnnoAttr(e.span_rowid, e.id, e.updated_at)
81
96
  for e in existing
82
- if e.id is not None
83
- and e.name is not None
84
- and e.document_position is not None
85
- and e.updated_at is not None
97
+ if e.id is not None and e.name is not None and e.updated_at is not None
86
98
  }
87
99
 
88
100
  for p in parcels:
@@ -129,13 +141,13 @@ class DocumentAnnotationQueueInserter(
129
141
  anno = self.table
130
142
  span = (
131
143
  select(models.Span.id, models.Span.span_id, num_docs_col(self._db.dialect))
132
- .where(models.Span.span_id.in_({span_id for _, span_id, *_ in keys}))
144
+ .where(models.Span.span_id.in_({k.span_id for k in keys}))
133
145
  .cte()
134
146
  )
135
147
  onclause = and_(
136
148
  span.c.id == anno.span_rowid,
137
- anno.name.in_({name for name, *_ in keys}),
138
- tuple_(anno.name, span.c.span_id, anno.document_position).in_(keys),
149
+ anno.name.in_({k.annotation_name for k in keys}),
150
+ tuple_(anno.name, anno.identifier, span.c.span_id, anno.document_position).in_(keys),
139
151
  )
140
152
  return select(
141
153
  span.c.id.label("span_rowid"),
@@ -144,6 +156,7 @@ class DocumentAnnotationQueueInserter(
144
156
  anno.id,
145
157
  anno.name,
146
158
  anno.document_position,
159
+ anno.identifier,
147
160
  anno.updated_at,
148
161
  ).outerjoin_from(span, anno, onclause)
149
162
 
@@ -160,11 +173,16 @@ class _AnnoAttr(NamedTuple):
160
173
 
161
174
 
162
175
  def _key(p: Received[Precursors.DocumentAnnotation]) -> _Key:
163
- return p.item.obj.name, p.item.span_id, p.item.document_position
176
+ return _Key(
177
+ annotation_name=p.item.obj.name,
178
+ annotation_identifier=p.item.obj.identifier,
179
+ span_id=p.item.span_id,
180
+ document_position=p.item.document_position,
181
+ )
164
182
 
165
183
 
166
184
  def _unique_by(p: Received[Insertables.DocumentAnnotation]) -> _UniqueBy:
167
- return p.item.obj.name, p.item.span_rowid, p.item.document_position
185
+ return p.item.obj.name, p.item.span_rowid, p.item.document_position, p.item.identifier
168
186
 
169
187
 
170
188
  def _time(p: Received[Any]) -> datetime:
@@ -86,13 +86,15 @@ async def _insert_trace_evaluation(
86
86
  explanation=explanation,
87
87
  metadata_={}, # `metadata_` must match ORM
88
88
  annotator_kind="LLM",
89
+ identifier="",
90
+ source="API",
89
91
  )
90
92
  await session.execute(
91
93
  insert_on_conflict(
92
94
  values,
93
95
  dialect=dialect,
94
96
  table=models.TraceAnnotation,
95
- unique_by=("name", "trace_rowid"),
97
+ unique_by=("name", "trace_rowid", "identifier"),
96
98
  )
97
99
  )
98
100
  return TraceEvaluationInsertionEvent(project_rowid, evaluation_name)
@@ -128,13 +130,15 @@ async def _insert_span_evaluation(
128
130
  explanation=explanation,
129
131
  metadata_={}, # `metadata_` must match ORM
130
132
  annotator_kind="LLM",
133
+ identifier="",
134
+ source="API",
131
135
  )
132
136
  await session.execute(
133
137
  insert_on_conflict(
134
138
  values,
135
139
  dialect=dialect,
136
140
  table=models.SpanAnnotation,
137
- unique_by=("name", "span_rowid"),
141
+ unique_by=("name", "span_rowid", "identifier"),
138
142
  )
139
143
  )
140
144
  return SpanEvaluationInsertionEvent(project_rowid, evaluation_name)
@@ -179,13 +183,21 @@ async def _insert_document_evaluation(
179
183
  explanation=explanation,
180
184
  metadata_={}, # `metadata_` must match ORM
181
185
  annotator_kind="LLM",
186
+ identifier="",
187
+ source="API",
182
188
  )
183
189
  await session.execute(
184
190
  insert_on_conflict(
185
191
  values,
186
192
  dialect=dialect,
187
193
  table=models.DocumentAnnotation,
188
- unique_by=("name", "span_rowid", "document_position"),
194
+ unique_by=(
195
+ "name",
196
+ "span_rowid",
197
+ "document_position",
198
+ "identifier",
199
+ ),
200
+ constraint_name="uq_document_annotations_name_span_rowid_document_pos_identifier", # The name of the unique constraint is specified manually since the auto-generated name is longer than the Postgres limit of 63 characters # noqa: E501
189
201
  )
190
202
  )
191
203
  return DocumentEvaluationInsertionEvent(project_rowid, evaluation_name)
@@ -36,6 +36,7 @@ def insert_on_conflict(
36
36
  unique_by: Sequence[str],
37
37
  on_conflict: OnConflict = OnConflict.DO_UPDATE,
38
38
  set_: Optional[Mapping[str, Any]] = None,
39
+ constraint_name: Optional[str] = None,
39
40
  ) -> Insert:
40
41
  """
41
42
  Dialect specific insertion statement using ON CONFLICT DO syntax.
@@ -50,7 +51,7 @@ def insert_on_conflict(
50
51
  unique_records.append(v)
51
52
  seen.add(k)
52
53
  records = tuple(reversed(unique_records))
53
- constraint = "_".join(("uq", table.__tablename__, *unique_by))
54
+ constraint = constraint_name or "_".join(("uq", table.__tablename__, *unique_by))
54
55
  if dialect is SupportedSQLDialect.POSTGRESQL:
55
56
  stmt_postgresql = insert_postgresql(table).values(records)
56
57
  if on_conflict is OnConflict.DO_NOTHING: