arize-phoenix 3.16.1__py3-none-any.whl → 7.7.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 (338) hide show
  1. arize_phoenix-7.7.0.dist-info/METADATA +261 -0
  2. arize_phoenix-7.7.0.dist-info/RECORD +345 -0
  3. {arize_phoenix-3.16.1.dist-info → arize_phoenix-7.7.0.dist-info}/WHEEL +1 -1
  4. arize_phoenix-7.7.0.dist-info/entry_points.txt +3 -0
  5. phoenix/__init__.py +86 -14
  6. phoenix/auth.py +309 -0
  7. phoenix/config.py +675 -45
  8. phoenix/core/model.py +32 -30
  9. phoenix/core/model_schema.py +102 -109
  10. phoenix/core/model_schema_adapter.py +48 -45
  11. phoenix/datetime_utils.py +24 -3
  12. phoenix/db/README.md +54 -0
  13. phoenix/db/__init__.py +4 -0
  14. phoenix/db/alembic.ini +85 -0
  15. phoenix/db/bulk_inserter.py +294 -0
  16. phoenix/db/engines.py +208 -0
  17. phoenix/db/enums.py +20 -0
  18. phoenix/db/facilitator.py +113 -0
  19. phoenix/db/helpers.py +159 -0
  20. phoenix/db/insertion/constants.py +2 -0
  21. phoenix/db/insertion/dataset.py +227 -0
  22. phoenix/db/insertion/document_annotation.py +171 -0
  23. phoenix/db/insertion/evaluation.py +191 -0
  24. phoenix/db/insertion/helpers.py +98 -0
  25. phoenix/db/insertion/span.py +193 -0
  26. phoenix/db/insertion/span_annotation.py +158 -0
  27. phoenix/db/insertion/trace_annotation.py +158 -0
  28. phoenix/db/insertion/types.py +256 -0
  29. phoenix/db/migrate.py +86 -0
  30. phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +199 -0
  31. phoenix/db/migrations/env.py +114 -0
  32. phoenix/db/migrations/script.py.mako +26 -0
  33. phoenix/db/migrations/versions/10460e46d750_datasets.py +317 -0
  34. phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +126 -0
  35. phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +66 -0
  36. phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +157 -0
  37. phoenix/db/migrations/versions/cf03bd6bae1d_init.py +280 -0
  38. phoenix/db/models.py +807 -0
  39. phoenix/exceptions.py +5 -1
  40. phoenix/experiments/__init__.py +6 -0
  41. phoenix/experiments/evaluators/__init__.py +29 -0
  42. phoenix/experiments/evaluators/base.py +158 -0
  43. phoenix/experiments/evaluators/code_evaluators.py +184 -0
  44. phoenix/experiments/evaluators/llm_evaluators.py +473 -0
  45. phoenix/experiments/evaluators/utils.py +236 -0
  46. phoenix/experiments/functions.py +772 -0
  47. phoenix/experiments/tracing.py +86 -0
  48. phoenix/experiments/types.py +726 -0
  49. phoenix/experiments/utils.py +25 -0
  50. phoenix/inferences/__init__.py +0 -0
  51. phoenix/{datasets → inferences}/errors.py +6 -5
  52. phoenix/{datasets → inferences}/fixtures.py +49 -42
  53. phoenix/{datasets/dataset.py → inferences/inferences.py} +121 -105
  54. phoenix/{datasets → inferences}/schema.py +11 -11
  55. phoenix/{datasets → inferences}/validation.py +13 -14
  56. phoenix/logging/__init__.py +3 -0
  57. phoenix/logging/_config.py +90 -0
  58. phoenix/logging/_filter.py +6 -0
  59. phoenix/logging/_formatter.py +69 -0
  60. phoenix/metrics/__init__.py +5 -4
  61. phoenix/metrics/binning.py +4 -3
  62. phoenix/metrics/metrics.py +2 -1
  63. phoenix/metrics/mixins.py +7 -6
  64. phoenix/metrics/retrieval_metrics.py +2 -1
  65. phoenix/metrics/timeseries.py +5 -4
  66. phoenix/metrics/wrappers.py +9 -3
  67. phoenix/pointcloud/clustering.py +5 -5
  68. phoenix/pointcloud/pointcloud.py +7 -5
  69. phoenix/pointcloud/projectors.py +5 -6
  70. phoenix/pointcloud/umap_parameters.py +53 -52
  71. phoenix/server/api/README.md +28 -0
  72. phoenix/server/api/auth.py +44 -0
  73. phoenix/server/api/context.py +152 -9
  74. phoenix/server/api/dataloaders/__init__.py +91 -0
  75. phoenix/server/api/dataloaders/annotation_summaries.py +139 -0
  76. phoenix/server/api/dataloaders/average_experiment_run_latency.py +54 -0
  77. phoenix/server/api/dataloaders/cache/__init__.py +3 -0
  78. phoenix/server/api/dataloaders/cache/two_tier_cache.py +68 -0
  79. phoenix/server/api/dataloaders/dataset_example_revisions.py +131 -0
  80. phoenix/server/api/dataloaders/dataset_example_spans.py +38 -0
  81. phoenix/server/api/dataloaders/document_evaluation_summaries.py +144 -0
  82. phoenix/server/api/dataloaders/document_evaluations.py +31 -0
  83. phoenix/server/api/dataloaders/document_retrieval_metrics.py +89 -0
  84. phoenix/server/api/dataloaders/experiment_annotation_summaries.py +79 -0
  85. phoenix/server/api/dataloaders/experiment_error_rates.py +58 -0
  86. phoenix/server/api/dataloaders/experiment_run_annotations.py +36 -0
  87. phoenix/server/api/dataloaders/experiment_run_counts.py +49 -0
  88. phoenix/server/api/dataloaders/experiment_sequence_number.py +44 -0
  89. phoenix/server/api/dataloaders/latency_ms_quantile.py +188 -0
  90. phoenix/server/api/dataloaders/min_start_or_max_end_times.py +85 -0
  91. phoenix/server/api/dataloaders/project_by_name.py +31 -0
  92. phoenix/server/api/dataloaders/record_counts.py +116 -0
  93. phoenix/server/api/dataloaders/session_io.py +79 -0
  94. phoenix/server/api/dataloaders/session_num_traces.py +30 -0
  95. phoenix/server/api/dataloaders/session_num_traces_with_error.py +32 -0
  96. phoenix/server/api/dataloaders/session_token_usages.py +41 -0
  97. phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +55 -0
  98. phoenix/server/api/dataloaders/span_annotations.py +26 -0
  99. phoenix/server/api/dataloaders/span_dataset_examples.py +31 -0
  100. phoenix/server/api/dataloaders/span_descendants.py +57 -0
  101. phoenix/server/api/dataloaders/span_projects.py +33 -0
  102. phoenix/server/api/dataloaders/token_counts.py +124 -0
  103. phoenix/server/api/dataloaders/trace_by_trace_ids.py +25 -0
  104. phoenix/server/api/dataloaders/trace_root_spans.py +32 -0
  105. phoenix/server/api/dataloaders/user_roles.py +30 -0
  106. phoenix/server/api/dataloaders/users.py +33 -0
  107. phoenix/server/api/exceptions.py +48 -0
  108. phoenix/server/api/helpers/__init__.py +12 -0
  109. phoenix/server/api/helpers/dataset_helpers.py +217 -0
  110. phoenix/server/api/helpers/experiment_run_filters.py +763 -0
  111. phoenix/server/api/helpers/playground_clients.py +948 -0
  112. phoenix/server/api/helpers/playground_registry.py +70 -0
  113. phoenix/server/api/helpers/playground_spans.py +455 -0
  114. phoenix/server/api/input_types/AddExamplesToDatasetInput.py +16 -0
  115. phoenix/server/api/input_types/AddSpansToDatasetInput.py +14 -0
  116. phoenix/server/api/input_types/ChatCompletionInput.py +38 -0
  117. phoenix/server/api/input_types/ChatCompletionMessageInput.py +24 -0
  118. phoenix/server/api/input_types/ClearProjectInput.py +15 -0
  119. phoenix/server/api/input_types/ClusterInput.py +2 -2
  120. phoenix/server/api/input_types/CreateDatasetInput.py +12 -0
  121. phoenix/server/api/input_types/CreateSpanAnnotationInput.py +18 -0
  122. phoenix/server/api/input_types/CreateTraceAnnotationInput.py +18 -0
  123. phoenix/server/api/input_types/DataQualityMetricInput.py +5 -2
  124. phoenix/server/api/input_types/DatasetExampleInput.py +14 -0
  125. phoenix/server/api/input_types/DatasetSort.py +17 -0
  126. phoenix/server/api/input_types/DatasetVersionSort.py +16 -0
  127. phoenix/server/api/input_types/DeleteAnnotationsInput.py +7 -0
  128. phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +13 -0
  129. phoenix/server/api/input_types/DeleteDatasetInput.py +7 -0
  130. phoenix/server/api/input_types/DeleteExperimentsInput.py +7 -0
  131. phoenix/server/api/input_types/DimensionFilter.py +4 -4
  132. phoenix/server/api/input_types/GenerativeModelInput.py +17 -0
  133. phoenix/server/api/input_types/Granularity.py +1 -1
  134. phoenix/server/api/input_types/InvocationParameters.py +162 -0
  135. phoenix/server/api/input_types/PatchAnnotationInput.py +19 -0
  136. phoenix/server/api/input_types/PatchDatasetExamplesInput.py +35 -0
  137. phoenix/server/api/input_types/PatchDatasetInput.py +14 -0
  138. phoenix/server/api/input_types/PerformanceMetricInput.py +5 -2
  139. phoenix/server/api/input_types/ProjectSessionSort.py +29 -0
  140. phoenix/server/api/input_types/SpanAnnotationSort.py +17 -0
  141. phoenix/server/api/input_types/SpanSort.py +134 -69
  142. phoenix/server/api/input_types/TemplateOptions.py +10 -0
  143. phoenix/server/api/input_types/TraceAnnotationSort.py +17 -0
  144. phoenix/server/api/input_types/UserRoleInput.py +9 -0
  145. phoenix/server/api/mutations/__init__.py +28 -0
  146. phoenix/server/api/mutations/api_key_mutations.py +167 -0
  147. phoenix/server/api/mutations/chat_mutations.py +593 -0
  148. phoenix/server/api/mutations/dataset_mutations.py +591 -0
  149. phoenix/server/api/mutations/experiment_mutations.py +75 -0
  150. phoenix/server/api/{types/ExportEventsMutation.py → mutations/export_events_mutations.py} +21 -18
  151. phoenix/server/api/mutations/project_mutations.py +57 -0
  152. phoenix/server/api/mutations/span_annotations_mutations.py +128 -0
  153. phoenix/server/api/mutations/trace_annotations_mutations.py +127 -0
  154. phoenix/server/api/mutations/user_mutations.py +329 -0
  155. phoenix/server/api/openapi/__init__.py +0 -0
  156. phoenix/server/api/openapi/main.py +17 -0
  157. phoenix/server/api/openapi/schema.py +16 -0
  158. phoenix/server/api/queries.py +738 -0
  159. phoenix/server/api/routers/__init__.py +11 -0
  160. phoenix/server/api/routers/auth.py +284 -0
  161. phoenix/server/api/routers/embeddings.py +26 -0
  162. phoenix/server/api/routers/oauth2.py +488 -0
  163. phoenix/server/api/routers/v1/__init__.py +64 -0
  164. phoenix/server/api/routers/v1/datasets.py +1017 -0
  165. phoenix/server/api/routers/v1/evaluations.py +362 -0
  166. phoenix/server/api/routers/v1/experiment_evaluations.py +115 -0
  167. phoenix/server/api/routers/v1/experiment_runs.py +167 -0
  168. phoenix/server/api/routers/v1/experiments.py +308 -0
  169. phoenix/server/api/routers/v1/pydantic_compat.py +78 -0
  170. phoenix/server/api/routers/v1/spans.py +267 -0
  171. phoenix/server/api/routers/v1/traces.py +208 -0
  172. phoenix/server/api/routers/v1/utils.py +95 -0
  173. phoenix/server/api/schema.py +44 -241
  174. phoenix/server/api/subscriptions.py +597 -0
  175. phoenix/server/api/types/Annotation.py +21 -0
  176. phoenix/server/api/types/AnnotationSummary.py +55 -0
  177. phoenix/server/api/types/AnnotatorKind.py +16 -0
  178. phoenix/server/api/types/ApiKey.py +27 -0
  179. phoenix/server/api/types/AuthMethod.py +9 -0
  180. phoenix/server/api/types/ChatCompletionMessageRole.py +11 -0
  181. phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +46 -0
  182. phoenix/server/api/types/Cluster.py +25 -24
  183. phoenix/server/api/types/CreateDatasetPayload.py +8 -0
  184. phoenix/server/api/types/DataQualityMetric.py +31 -13
  185. phoenix/server/api/types/Dataset.py +288 -63
  186. phoenix/server/api/types/DatasetExample.py +85 -0
  187. phoenix/server/api/types/DatasetExampleRevision.py +34 -0
  188. phoenix/server/api/types/DatasetVersion.py +14 -0
  189. phoenix/server/api/types/Dimension.py +32 -31
  190. phoenix/server/api/types/DocumentEvaluationSummary.py +9 -8
  191. phoenix/server/api/types/EmbeddingDimension.py +56 -49
  192. phoenix/server/api/types/Evaluation.py +25 -31
  193. phoenix/server/api/types/EvaluationSummary.py +30 -50
  194. phoenix/server/api/types/Event.py +20 -20
  195. phoenix/server/api/types/ExampleRevisionInterface.py +14 -0
  196. phoenix/server/api/types/Experiment.py +152 -0
  197. phoenix/server/api/types/ExperimentAnnotationSummary.py +13 -0
  198. phoenix/server/api/types/ExperimentComparison.py +17 -0
  199. phoenix/server/api/types/ExperimentRun.py +119 -0
  200. phoenix/server/api/types/ExperimentRunAnnotation.py +56 -0
  201. phoenix/server/api/types/GenerativeModel.py +9 -0
  202. phoenix/server/api/types/GenerativeProvider.py +85 -0
  203. phoenix/server/api/types/Inferences.py +80 -0
  204. phoenix/server/api/types/InferencesRole.py +23 -0
  205. phoenix/server/api/types/LabelFraction.py +7 -0
  206. phoenix/server/api/types/MimeType.py +2 -2
  207. phoenix/server/api/types/Model.py +54 -54
  208. phoenix/server/api/types/PerformanceMetric.py +8 -5
  209. phoenix/server/api/types/Project.py +407 -142
  210. phoenix/server/api/types/ProjectSession.py +139 -0
  211. phoenix/server/api/types/Segments.py +4 -4
  212. phoenix/server/api/types/Span.py +221 -176
  213. phoenix/server/api/types/SpanAnnotation.py +43 -0
  214. phoenix/server/api/types/SpanIOValue.py +15 -0
  215. phoenix/server/api/types/SystemApiKey.py +9 -0
  216. phoenix/server/api/types/TemplateLanguage.py +10 -0
  217. phoenix/server/api/types/TimeSeries.py +19 -15
  218. phoenix/server/api/types/TokenUsage.py +11 -0
  219. phoenix/server/api/types/Trace.py +154 -0
  220. phoenix/server/api/types/TraceAnnotation.py +45 -0
  221. phoenix/server/api/types/UMAPPoints.py +7 -7
  222. phoenix/server/api/types/User.py +60 -0
  223. phoenix/server/api/types/UserApiKey.py +45 -0
  224. phoenix/server/api/types/UserRole.py +15 -0
  225. phoenix/server/api/types/node.py +4 -112
  226. phoenix/server/api/types/pagination.py +156 -57
  227. phoenix/server/api/utils.py +34 -0
  228. phoenix/server/app.py +864 -115
  229. phoenix/server/bearer_auth.py +163 -0
  230. phoenix/server/dml_event.py +136 -0
  231. phoenix/server/dml_event_handler.py +256 -0
  232. phoenix/server/email/__init__.py +0 -0
  233. phoenix/server/email/sender.py +97 -0
  234. phoenix/server/email/templates/__init__.py +0 -0
  235. phoenix/server/email/templates/password_reset.html +19 -0
  236. phoenix/server/email/types.py +11 -0
  237. phoenix/server/grpc_server.py +102 -0
  238. phoenix/server/jwt_store.py +505 -0
  239. phoenix/server/main.py +305 -116
  240. phoenix/server/oauth2.py +52 -0
  241. phoenix/server/openapi/__init__.py +0 -0
  242. phoenix/server/prometheus.py +111 -0
  243. phoenix/server/rate_limiters.py +188 -0
  244. phoenix/server/static/.vite/manifest.json +87 -0
  245. phoenix/server/static/assets/components-Cy9nwIvF.js +2125 -0
  246. phoenix/server/static/assets/index-BKvHIxkk.js +113 -0
  247. phoenix/server/static/assets/pages-CUi2xCVQ.js +4449 -0
  248. phoenix/server/static/assets/vendor-DvC8cT4X.js +894 -0
  249. phoenix/server/static/assets/vendor-DxkFTwjz.css +1 -0
  250. phoenix/server/static/assets/vendor-arizeai-Do1793cv.js +662 -0
  251. phoenix/server/static/assets/vendor-codemirror-BzwZPyJM.js +24 -0
  252. phoenix/server/static/assets/vendor-recharts-_Jb7JjhG.js +59 -0
  253. phoenix/server/static/assets/vendor-shiki-Cl9QBraO.js +5 -0
  254. phoenix/server/static/assets/vendor-three-DwGkEfCM.js +2998 -0
  255. phoenix/server/telemetry.py +68 -0
  256. phoenix/server/templates/index.html +82 -23
  257. phoenix/server/thread_server.py +3 -3
  258. phoenix/server/types.py +275 -0
  259. phoenix/services.py +27 -18
  260. phoenix/session/client.py +743 -68
  261. phoenix/session/data_extractor.py +31 -7
  262. phoenix/session/evaluation.py +3 -9
  263. phoenix/session/session.py +263 -219
  264. phoenix/settings.py +22 -0
  265. phoenix/trace/__init__.py +2 -22
  266. phoenix/trace/attributes.py +338 -0
  267. phoenix/trace/dsl/README.md +116 -0
  268. phoenix/trace/dsl/filter.py +663 -213
  269. phoenix/trace/dsl/helpers.py +73 -21
  270. phoenix/trace/dsl/query.py +574 -201
  271. phoenix/trace/exporter.py +24 -19
  272. phoenix/trace/fixtures.py +368 -32
  273. phoenix/trace/otel.py +71 -219
  274. phoenix/trace/projects.py +3 -2
  275. phoenix/trace/schemas.py +33 -11
  276. phoenix/trace/span_evaluations.py +21 -16
  277. phoenix/trace/span_json_decoder.py +6 -4
  278. phoenix/trace/span_json_encoder.py +2 -2
  279. phoenix/trace/trace_dataset.py +47 -32
  280. phoenix/trace/utils.py +21 -4
  281. phoenix/utilities/__init__.py +0 -26
  282. phoenix/utilities/client.py +132 -0
  283. phoenix/utilities/deprecation.py +31 -0
  284. phoenix/utilities/error_handling.py +3 -2
  285. phoenix/utilities/json.py +109 -0
  286. phoenix/utilities/logging.py +8 -0
  287. phoenix/utilities/project.py +2 -2
  288. phoenix/utilities/re.py +49 -0
  289. phoenix/utilities/span_store.py +0 -23
  290. phoenix/utilities/template_formatters.py +99 -0
  291. phoenix/version.py +1 -1
  292. arize_phoenix-3.16.1.dist-info/METADATA +0 -495
  293. arize_phoenix-3.16.1.dist-info/RECORD +0 -178
  294. phoenix/core/project.py +0 -619
  295. phoenix/core/traces.py +0 -96
  296. phoenix/experimental/evals/__init__.py +0 -73
  297. phoenix/experimental/evals/evaluators.py +0 -413
  298. phoenix/experimental/evals/functions/__init__.py +0 -4
  299. phoenix/experimental/evals/functions/classify.py +0 -453
  300. phoenix/experimental/evals/functions/executor.py +0 -353
  301. phoenix/experimental/evals/functions/generate.py +0 -138
  302. phoenix/experimental/evals/functions/processing.py +0 -76
  303. phoenix/experimental/evals/models/__init__.py +0 -14
  304. phoenix/experimental/evals/models/anthropic.py +0 -175
  305. phoenix/experimental/evals/models/base.py +0 -170
  306. phoenix/experimental/evals/models/bedrock.py +0 -221
  307. phoenix/experimental/evals/models/litellm.py +0 -134
  308. phoenix/experimental/evals/models/openai.py +0 -448
  309. phoenix/experimental/evals/models/rate_limiters.py +0 -246
  310. phoenix/experimental/evals/models/vertex.py +0 -173
  311. phoenix/experimental/evals/models/vertexai.py +0 -186
  312. phoenix/experimental/evals/retrievals.py +0 -96
  313. phoenix/experimental/evals/templates/__init__.py +0 -50
  314. phoenix/experimental/evals/templates/default_templates.py +0 -472
  315. phoenix/experimental/evals/templates/template.py +0 -195
  316. phoenix/experimental/evals/utils/__init__.py +0 -172
  317. phoenix/experimental/evals/utils/threads.py +0 -27
  318. phoenix/server/api/helpers.py +0 -11
  319. phoenix/server/api/routers/evaluation_handler.py +0 -109
  320. phoenix/server/api/routers/span_handler.py +0 -70
  321. phoenix/server/api/routers/trace_handler.py +0 -60
  322. phoenix/server/api/types/DatasetRole.py +0 -23
  323. phoenix/server/static/index.css +0 -6
  324. phoenix/server/static/index.js +0 -7447
  325. phoenix/storage/span_store/__init__.py +0 -23
  326. phoenix/storage/span_store/text_file.py +0 -85
  327. phoenix/trace/dsl/missing.py +0 -60
  328. phoenix/trace/langchain/__init__.py +0 -3
  329. phoenix/trace/langchain/instrumentor.py +0 -35
  330. phoenix/trace/llama_index/__init__.py +0 -3
  331. phoenix/trace/llama_index/callback.py +0 -102
  332. phoenix/trace/openai/__init__.py +0 -3
  333. phoenix/trace/openai/instrumentor.py +0 -30
  334. {arize_phoenix-3.16.1.dist-info → arize_phoenix-7.7.0.dist-info}/licenses/IP_NOTICE +0 -0
  335. {arize_phoenix-3.16.1.dist-info → arize_phoenix-7.7.0.dist-info}/licenses/LICENSE +0 -0
  336. /phoenix/{datasets → db/insertion}/__init__.py +0 -0
  337. /phoenix/{experimental → db/migrations}/__init__.py +0 -0
  338. /phoenix/{storage → db/migrations/data_migration_scripts}/__init__.py +0 -0
@@ -0,0 +1,317 @@
1
+ """datasets
2
+
3
+ Revision ID: 10460e46d750
4
+ Revises: cf03bd6bae1d
5
+ Create Date: 2024-05-10 11:24:23.985834
6
+
7
+ """
8
+
9
+ from typing import Any, Sequence, Union
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+ from sqlalchemy import JSON
14
+ from sqlalchemy.dialects import postgresql
15
+ from sqlalchemy.ext.compiler import compiles
16
+
17
+
18
+ class JSONB(JSON):
19
+ # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
20
+ __visit_name__ = "JSONB"
21
+
22
+
23
+ @compiles(JSONB, "sqlite")
24
+ def _(*args: Any, **kwargs: Any) -> str:
25
+ # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
26
+ return "JSONB"
27
+
28
+
29
+ JSON_ = (
30
+ JSON()
31
+ .with_variant(
32
+ postgresql.JSONB(), # type: ignore
33
+ "postgresql",
34
+ )
35
+ .with_variant(
36
+ JSONB(),
37
+ "sqlite",
38
+ )
39
+ )
40
+
41
+ # revision identifiers, used by Alembic.
42
+ revision: str = "10460e46d750"
43
+ down_revision: Union[str, None] = "cf03bd6bae1d"
44
+ branch_labels: Union[str, Sequence[str], None] = None
45
+ depends_on: Union[str, Sequence[str], None] = None
46
+
47
+
48
+ def upgrade() -> None:
49
+ op.create_table(
50
+ "datasets",
51
+ sa.Column("id", sa.Integer, primary_key=True),
52
+ sa.Column("name", sa.String, nullable=False, unique=True),
53
+ sa.Column("description", sa.String, nullable=True),
54
+ sa.Column("metadata", JSON_, nullable=False),
55
+ sa.Column(
56
+ "created_at",
57
+ sa.TIMESTAMP(timezone=True),
58
+ nullable=False,
59
+ server_default=sa.func.now(),
60
+ ),
61
+ sa.Column(
62
+ "updated_at",
63
+ sa.TIMESTAMP(timezone=True),
64
+ nullable=False,
65
+ server_default=sa.func.now(),
66
+ onupdate=sa.func.now(),
67
+ ),
68
+ )
69
+ op.create_table(
70
+ "dataset_versions",
71
+ sa.Column("id", sa.Integer, primary_key=True),
72
+ sa.Column(
73
+ "dataset_id",
74
+ sa.Integer,
75
+ sa.ForeignKey("datasets.id", ondelete="CASCADE"),
76
+ nullable=False,
77
+ index=True,
78
+ ),
79
+ sa.Column("description", sa.String, nullable=True),
80
+ sa.Column("metadata", JSON_, nullable=False),
81
+ sa.Column(
82
+ "created_at",
83
+ sa.TIMESTAMP(timezone=True),
84
+ nullable=False,
85
+ server_default=sa.func.now(),
86
+ ),
87
+ )
88
+ op.create_table(
89
+ "dataset_examples",
90
+ sa.Column("id", sa.Integer, primary_key=True),
91
+ sa.Column(
92
+ "dataset_id",
93
+ sa.Integer,
94
+ sa.ForeignKey("datasets.id", ondelete="CASCADE"),
95
+ nullable=False,
96
+ index=True,
97
+ ),
98
+ sa.Column(
99
+ "span_rowid",
100
+ sa.Integer,
101
+ sa.ForeignKey("spans.id", ondelete="SET NULL"),
102
+ nullable=True,
103
+ index=True,
104
+ ),
105
+ sa.Column(
106
+ "created_at",
107
+ sa.TIMESTAMP(timezone=True),
108
+ nullable=False,
109
+ server_default=sa.func.now(),
110
+ ),
111
+ )
112
+ op.create_table(
113
+ "dataset_example_revisions",
114
+ sa.Column("id", sa.Integer, primary_key=True),
115
+ sa.Column(
116
+ "dataset_example_id",
117
+ sa.Integer,
118
+ sa.ForeignKey("dataset_examples.id", ondelete="CASCADE"),
119
+ nullable=False,
120
+ index=True,
121
+ ),
122
+ sa.Column(
123
+ "dataset_version_id",
124
+ sa.Integer,
125
+ sa.ForeignKey("dataset_versions.id", ondelete="CASCADE"),
126
+ nullable=False,
127
+ index=True,
128
+ ),
129
+ sa.Column("input", JSON_, nullable=False),
130
+ sa.Column("output", JSON_, nullable=False),
131
+ sa.Column("metadata", JSON_, nullable=False),
132
+ sa.Column(
133
+ "revision_kind",
134
+ sa.String,
135
+ sa.CheckConstraint(
136
+ "revision_kind IN ('CREATE', 'PATCH', 'DELETE')",
137
+ name="valid_revision_kind",
138
+ ),
139
+ nullable=False,
140
+ ),
141
+ sa.Column(
142
+ "created_at",
143
+ sa.TIMESTAMP(timezone=True),
144
+ nullable=False,
145
+ server_default=sa.func.now(),
146
+ ),
147
+ sa.UniqueConstraint(
148
+ "dataset_example_id",
149
+ "dataset_version_id",
150
+ ),
151
+ )
152
+ op.create_table(
153
+ "experiments",
154
+ sa.Column("id", sa.Integer, primary_key=True),
155
+ sa.Column(
156
+ "dataset_id",
157
+ sa.Integer,
158
+ sa.ForeignKey("datasets.id", ondelete="CASCADE"),
159
+ nullable=False,
160
+ index=True,
161
+ ),
162
+ sa.Column(
163
+ "dataset_version_id",
164
+ sa.Integer,
165
+ sa.ForeignKey("dataset_versions.id", ondelete="CASCADE"),
166
+ nullable=False,
167
+ index=True,
168
+ ),
169
+ sa.Column(
170
+ "name",
171
+ sa.String,
172
+ nullable=False,
173
+ ),
174
+ sa.Column(
175
+ "description",
176
+ sa.String,
177
+ nullable=True,
178
+ ),
179
+ sa.Column(
180
+ "repetitions",
181
+ sa.Integer,
182
+ nullable=False,
183
+ ),
184
+ sa.Column("metadata", JSON_, nullable=False),
185
+ sa.Column("project_name", sa.String, index=True),
186
+ sa.Column(
187
+ "created_at",
188
+ sa.TIMESTAMP(timezone=True),
189
+ nullable=False,
190
+ server_default=sa.func.now(),
191
+ ),
192
+ sa.Column(
193
+ "updated_at",
194
+ sa.TIMESTAMP(timezone=True),
195
+ nullable=False,
196
+ server_default=sa.func.now(),
197
+ onupdate=sa.func.now(),
198
+ ),
199
+ )
200
+ op.create_table(
201
+ "experiment_runs",
202
+ sa.Column("id", sa.Integer, primary_key=True),
203
+ sa.Column(
204
+ "experiment_id",
205
+ sa.Integer,
206
+ sa.ForeignKey("experiments.id", ondelete="CASCADE"),
207
+ nullable=False,
208
+ index=True,
209
+ ),
210
+ sa.Column(
211
+ "dataset_example_id",
212
+ sa.Integer,
213
+ sa.ForeignKey("dataset_examples.id", ondelete="CASCADE"),
214
+ nullable=False,
215
+ index=True,
216
+ ),
217
+ sa.Column(
218
+ "repetition_number",
219
+ sa.Integer,
220
+ nullable=False,
221
+ ),
222
+ sa.Column(
223
+ "trace_id",
224
+ sa.String,
225
+ nullable=True,
226
+ ),
227
+ sa.Column("output", JSON_, nullable=False),
228
+ sa.Column("start_time", sa.TIMESTAMP(timezone=True), nullable=False),
229
+ sa.Column("end_time", sa.TIMESTAMP(timezone=True), nullable=False),
230
+ sa.Column(
231
+ "prompt_token_count",
232
+ sa.Integer,
233
+ nullable=True,
234
+ ),
235
+ sa.Column(
236
+ "completion_token_count",
237
+ sa.Integer,
238
+ nullable=True,
239
+ ),
240
+ sa.Column(
241
+ "error",
242
+ sa.String,
243
+ nullable=True,
244
+ ),
245
+ sa.UniqueConstraint(
246
+ "experiment_id",
247
+ "dataset_example_id",
248
+ "repetition_number",
249
+ ),
250
+ )
251
+ op.create_table(
252
+ "experiment_run_annotations",
253
+ sa.Column("id", sa.Integer, primary_key=True),
254
+ sa.Column(
255
+ "experiment_run_id",
256
+ sa.Integer,
257
+ sa.ForeignKey("experiment_runs.id", ondelete="CASCADE"),
258
+ nullable=False,
259
+ index=True,
260
+ ),
261
+ sa.Column(
262
+ "name",
263
+ sa.String,
264
+ nullable=False,
265
+ ),
266
+ sa.Column(
267
+ "annotator_kind",
268
+ sa.String,
269
+ sa.CheckConstraint(
270
+ "annotator_kind IN ('LLM', 'CODE', 'HUMAN')",
271
+ name="valid_annotator_kind",
272
+ ),
273
+ nullable=False,
274
+ ),
275
+ sa.Column(
276
+ "label",
277
+ sa.String,
278
+ nullable=True,
279
+ ),
280
+ sa.Column(
281
+ "score",
282
+ sa.Float,
283
+ nullable=True,
284
+ ),
285
+ sa.Column(
286
+ "explanation",
287
+ sa.String,
288
+ nullable=True,
289
+ ),
290
+ sa.Column(
291
+ "trace_id",
292
+ sa.String,
293
+ nullable=True,
294
+ ),
295
+ sa.Column(
296
+ "error",
297
+ sa.String,
298
+ nullable=True,
299
+ ),
300
+ sa.Column("metadata", JSON_, nullable=False),
301
+ sa.Column("start_time", sa.TIMESTAMP(timezone=True), nullable=False),
302
+ sa.Column("end_time", sa.TIMESTAMP(timezone=True), nullable=False),
303
+ sa.UniqueConstraint(
304
+ "experiment_run_id",
305
+ "name",
306
+ ),
307
+ )
308
+
309
+
310
+ def downgrade() -> None:
311
+ op.drop_table("experiment_run_annotations")
312
+ op.drop_table("experiment_runs")
313
+ op.drop_table("experiments")
314
+ op.drop_table("dataset_example_revisions")
315
+ op.drop_table("dataset_examples")
316
+ op.drop_table("dataset_versions")
317
+ op.drop_table("datasets")
@@ -0,0 +1,126 @@
1
+ """add token columns to spans table
2
+
3
+ Revision ID: 3be8647b87d8
4
+ Revises: 10460e46d750
5
+ Create Date: 2024-08-03 22:11:28.733133
6
+
7
+ """
8
+
9
+ from typing import Any, Optional, Sequence, TypedDict, Union
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+ from openinference.semconv.trace import SpanAttributes
14
+ from sqlalchemy import (
15
+ JSON,
16
+ Dialect,
17
+ MetaData,
18
+ TypeDecorator,
19
+ update,
20
+ )
21
+ from sqlalchemy.dialects import postgresql
22
+ from sqlalchemy.ext.compiler import compiles
23
+ from sqlalchemy.orm import (
24
+ DeclarativeBase,
25
+ Mapped,
26
+ mapped_column,
27
+ )
28
+
29
+
30
+ class JSONB(JSON):
31
+ # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
32
+ __visit_name__ = "JSONB"
33
+
34
+
35
+ @compiles(JSONB, "sqlite")
36
+ def _(*args: Any, **kwargs: Any) -> str:
37
+ # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
38
+ return "JSONB"
39
+
40
+
41
+ JSON_ = (
42
+ JSON()
43
+ .with_variant(
44
+ postgresql.JSONB(), # type: ignore
45
+ "postgresql",
46
+ )
47
+ .with_variant(
48
+ JSONB(),
49
+ "sqlite",
50
+ )
51
+ )
52
+
53
+
54
+ class JsonDict(TypeDecorator[dict[str, Any]]):
55
+ # See # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
56
+ cache_ok = True
57
+ impl = JSON_
58
+
59
+ def process_bind_param(self, value: Optional[dict[str, Any]], _: Dialect) -> dict[str, Any]:
60
+ return value if isinstance(value, dict) else {}
61
+
62
+
63
+ class JsonList(TypeDecorator[list[Any]]):
64
+ # See # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
65
+ cache_ok = True
66
+ impl = JSON_
67
+
68
+ def process_bind_param(self, value: Optional[list[Any]], _: Dialect) -> list[Any]:
69
+ return value if isinstance(value, list) else []
70
+
71
+
72
+ class ExperimentRunOutput(TypedDict, total=False):
73
+ task_output: Any
74
+
75
+
76
+ class Base(DeclarativeBase):
77
+ # Enforce best practices for naming constraints
78
+ # https://alembic.sqlalchemy.org/en/latest/naming.html#integration-of-naming-conventions-into-operations-autogenerate
79
+ metadata = MetaData(
80
+ naming_convention={
81
+ "ix": "ix_%(table_name)s_%(column_0_N_name)s",
82
+ "uq": "uq_%(table_name)s_%(column_0_N_name)s",
83
+ "ck": "ck_%(table_name)s_`%(constraint_name)s`",
84
+ "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
85
+ "pk": "pk_%(table_name)s",
86
+ }
87
+ )
88
+ type_annotation_map = {
89
+ dict[str, Any]: JsonDict,
90
+ list[dict[str, Any]]: JsonList,
91
+ ExperimentRunOutput: JsonDict,
92
+ }
93
+
94
+
95
+ class Span(Base):
96
+ __tablename__ = "spans"
97
+ id: Mapped[int] = mapped_column(primary_key=True)
98
+ attributes: Mapped[dict[str, Any]]
99
+ llm_token_count_prompt: Mapped[Optional[int]]
100
+ llm_token_count_completion: Mapped[Optional[int]]
101
+
102
+
103
+ # revision identifiers, used by Alembic.
104
+ revision: str = "3be8647b87d8"
105
+ down_revision: Union[str, None] = "10460e46d750"
106
+ branch_labels: Union[str, Sequence[str], None] = None
107
+ depends_on: Union[str, Sequence[str], None] = None
108
+
109
+ LLM_TOKEN_COUNT_PROMPT = SpanAttributes.LLM_TOKEN_COUNT_PROMPT.split(".")
110
+ LLM_TOKEN_COUNT_COMPLETION = SpanAttributes.LLM_TOKEN_COUNT_COMPLETION.split(".")
111
+
112
+
113
+ def upgrade() -> None:
114
+ op.add_column("spans", sa.Column("llm_token_count_prompt", sa.Integer, nullable=True))
115
+ op.add_column("spans", sa.Column("llm_token_count_completion", sa.Integer, nullable=True))
116
+ op.execute(
117
+ update(Span).values(
118
+ llm_token_count_prompt=Span.attributes[LLM_TOKEN_COUNT_PROMPT].as_float(),
119
+ llm_token_count_completion=Span.attributes[LLM_TOKEN_COUNT_COMPLETION].as_float(),
120
+ )
121
+ )
122
+
123
+
124
+ def downgrade() -> None:
125
+ op.drop_column("spans", "llm_token_count_completion")
126
+ op.drop_column("spans", "llm_token_count_prompt")
@@ -0,0 +1,66 @@
1
+ """create project_session table
2
+
3
+ Revision ID: 4ded9e43755f
4
+ Revises: cd164e83824f
5
+ Create Date: 2024-10-08 22:53:24.539786
6
+
7
+ """
8
+
9
+ from typing import Sequence, Union
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = "4ded9e43755f"
16
+ down_revision: Union[str, None] = "cd164e83824f"
17
+ branch_labels: Union[str, Sequence[str], None] = None
18
+ depends_on: Union[str, Sequence[str], None] = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ op.create_table(
23
+ "project_sessions",
24
+ sa.Column("id", sa.Integer, primary_key=True),
25
+ sa.Column("session_id", sa.String, unique=True, nullable=False),
26
+ sa.Column(
27
+ "project_id",
28
+ sa.Integer,
29
+ sa.ForeignKey("projects.id", ondelete="CASCADE"),
30
+ nullable=False,
31
+ index=True,
32
+ ),
33
+ sa.Column(
34
+ "start_time",
35
+ sa.TIMESTAMP(timezone=True),
36
+ index=True,
37
+ nullable=False,
38
+ ),
39
+ sa.Column(
40
+ "end_time",
41
+ sa.TIMESTAMP(timezone=True),
42
+ index=True,
43
+ nullable=False,
44
+ ),
45
+ )
46
+ with op.batch_alter_table("traces") as batch_op:
47
+ batch_op.add_column(
48
+ sa.Column(
49
+ "project_session_rowid",
50
+ sa.Integer,
51
+ sa.ForeignKey("project_sessions.id", ondelete="CASCADE"),
52
+ nullable=True,
53
+ ),
54
+ )
55
+ op.create_index(
56
+ "ix_traces_project_session_rowid",
57
+ "traces",
58
+ ["project_session_rowid"],
59
+ )
60
+
61
+
62
+ def downgrade() -> None:
63
+ op.drop_index("ix_traces_project_session_rowid")
64
+ with op.batch_alter_table("traces") as batch_op:
65
+ batch_op.drop_column("project_session_rowid")
66
+ op.drop_table("project_sessions")
@@ -0,0 +1,157 @@
1
+ """users and tokens
2
+
3
+ Revision ID: cd164e83824f
4
+ Revises: 10460e46d750
5
+ Create Date: 2024-08-01 18:36:52.157604
6
+
7
+ """
8
+
9
+ from typing import Sequence, Union
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = "cd164e83824f"
16
+ down_revision: Union[str, None] = "3be8647b87d8"
17
+ branch_labels: Union[str, Sequence[str], None] = None
18
+ depends_on: Union[str, Sequence[str], None] = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ op.create_table(
23
+ "user_roles",
24
+ sa.Column("id", sa.Integer, primary_key=True),
25
+ sa.Column(
26
+ "name",
27
+ sa.String,
28
+ nullable=False,
29
+ unique=True,
30
+ index=True,
31
+ ),
32
+ )
33
+ op.create_table(
34
+ "users",
35
+ sa.Column("id", sa.Integer, primary_key=True),
36
+ sa.Column(
37
+ "user_role_id",
38
+ sa.Integer,
39
+ sa.ForeignKey("user_roles.id", ondelete="CASCADE"),
40
+ nullable=False,
41
+ index=True,
42
+ ),
43
+ sa.Column("username", sa.String, nullable=False, unique=True, index=True),
44
+ sa.Column("email", sa.String, nullable=False, unique=True, index=True),
45
+ sa.Column("profile_picture_url", sa.String, nullable=True),
46
+ sa.Column("password_hash", sa.LargeBinary, nullable=True),
47
+ sa.Column("password_salt", sa.LargeBinary, nullable=True),
48
+ sa.Column("reset_password", sa.Boolean, nullable=False),
49
+ sa.Column("oauth2_client_id", sa.String, nullable=True, index=True),
50
+ sa.Column("oauth2_user_id", sa.String, nullable=True, index=True),
51
+ sa.Column(
52
+ "created_at",
53
+ sa.TIMESTAMP(timezone=True),
54
+ nullable=False,
55
+ server_default=sa.func.now(),
56
+ ),
57
+ sa.Column(
58
+ "updated_at",
59
+ sa.TIMESTAMP(timezone=True),
60
+ nullable=False,
61
+ server_default=sa.func.now(),
62
+ onupdate=sa.func.now(),
63
+ ),
64
+ sa.CheckConstraint(
65
+ "(password_hash IS NULL) = (password_salt IS NULL)",
66
+ name="password_hash_and_salt",
67
+ ),
68
+ sa.CheckConstraint(
69
+ "(oauth2_client_id IS NULL) = (oauth2_user_id IS NULL)",
70
+ name="oauth2_client_id_and_user_id",
71
+ ),
72
+ sa.CheckConstraint(
73
+ "(password_hash IS NULL) != (oauth2_client_id IS NULL)",
74
+ name="exactly_one_auth_method",
75
+ ),
76
+ sa.UniqueConstraint(
77
+ "oauth2_client_id",
78
+ "oauth2_user_id",
79
+ ),
80
+ sqlite_autoincrement=True,
81
+ )
82
+ op.create_table(
83
+ "password_reset_tokens",
84
+ sa.Column("id", sa.Integer, primary_key=True),
85
+ sa.Column(
86
+ "user_id",
87
+ sa.Integer,
88
+ sa.ForeignKey("users.id", ondelete="CASCADE"),
89
+ unique=True,
90
+ index=True,
91
+ ),
92
+ sa.Column(
93
+ "created_at",
94
+ sa.TIMESTAMP(timezone=True),
95
+ nullable=False,
96
+ server_default=sa.func.now(),
97
+ ),
98
+ sa.Column("expires_at", sa.TIMESTAMP(timezone=True), nullable=False, index=True),
99
+ sqlite_autoincrement=True,
100
+ )
101
+ op.create_table(
102
+ "refresh_tokens",
103
+ sa.Column("id", sa.Integer, primary_key=True),
104
+ sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), index=True),
105
+ sa.Column(
106
+ "created_at",
107
+ sa.TIMESTAMP(timezone=True),
108
+ nullable=False,
109
+ server_default=sa.func.now(),
110
+ ),
111
+ sa.Column("expires_at", sa.TIMESTAMP(timezone=True), nullable=False, index=True),
112
+ sqlite_autoincrement=True,
113
+ )
114
+ op.create_table(
115
+ "access_tokens",
116
+ sa.Column("id", sa.Integer, primary_key=True),
117
+ sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), index=True),
118
+ sa.Column(
119
+ "created_at",
120
+ sa.TIMESTAMP(timezone=True),
121
+ nullable=False,
122
+ server_default=sa.func.now(),
123
+ ),
124
+ sa.Column("expires_at", sa.TIMESTAMP(timezone=True), nullable=False, index=True),
125
+ sa.Column(
126
+ "refresh_token_id",
127
+ sa.Integer,
128
+ sa.ForeignKey("refresh_tokens.id", ondelete="CASCADE"),
129
+ index=True,
130
+ unique=True,
131
+ ),
132
+ sqlite_autoincrement=True,
133
+ )
134
+ op.create_table(
135
+ "api_keys",
136
+ sa.Column("id", sa.Integer, primary_key=True),
137
+ sa.Column("user_id", sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), index=True),
138
+ sa.Column("name", sa.String, nullable=False),
139
+ sa.Column("description", sa.String, nullable=True),
140
+ sa.Column(
141
+ "created_at",
142
+ sa.TIMESTAMP(timezone=True),
143
+ nullable=False,
144
+ server_default=sa.func.now(),
145
+ ),
146
+ sa.Column("expires_at", sa.TIMESTAMP(timezone=True), nullable=True, index=True),
147
+ sqlite_autoincrement=True,
148
+ )
149
+
150
+
151
+ def downgrade() -> None:
152
+ op.drop_table("api_keys")
153
+ op.drop_table("access_tokens")
154
+ op.drop_table("refresh_tokens")
155
+ op.drop_table("password_reset_tokens")
156
+ op.drop_table("users")
157
+ op.drop_table("user_roles")