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
@@ -1,23 +0,0 @@
1
- from pathlib import Path
2
- from typing import Callable, Iterator, Mapping, Protocol
3
-
4
- from opentelemetry.proto.trace.v1.trace_pb2 import TracesData
5
-
6
- from phoenix.config import SpanStorageType
7
- from phoenix.storage.span_store.text_file import TextFileSpanStoreImpl
8
-
9
-
10
- class SpanStore(Protocol):
11
- def save(self, req: TracesData) -> None: ...
12
-
13
- def load(self) -> Iterator[TracesData]: ...
14
-
15
-
16
- SPAN_STORE_FACTORIES: Mapping[SpanStorageType, Callable[[Path], SpanStore]] = {
17
- SpanStorageType.TEXT_FILES: TextFileSpanStoreImpl,
18
- }
19
-
20
- __all__ = (
21
- "SpanStore",
22
- "SPAN_STORE_FACTORIES",
23
- )
@@ -1,85 +0,0 @@
1
- import weakref
2
- from base64 import urlsafe_b64decode, urlsafe_b64encode
3
- from pathlib import Path
4
- from queue import SimpleQueue
5
- from threading import Thread
6
- from typing import Iterator, Optional, Tuple
7
-
8
- from opentelemetry.proto.trace.v1.trace_pb2 import TracesData
9
- from typing_extensions import TypeAlias
10
-
11
- from phoenix.utilities.project import get_project_name
12
-
13
- _Queue: TypeAlias = "SimpleQueue[Optional[TracesData]]"
14
-
15
- _END_OF_QUEUE = None
16
- _DIR_PREFIX = "project."
17
-
18
-
19
- class TextFileSpanStoreImpl:
20
- def __init__(self, root: Path) -> None:
21
- self._root = root
22
- self._projects = dict(_load_projects(self._root))
23
-
24
- def save(self, traces_data: TracesData) -> None:
25
- for resource_spans in traces_data.resource_spans:
26
- name = get_project_name(resource_spans.resource.attributes)
27
- if (project := self._projects.get(name)) is None:
28
- self._projects[name] = project = _Project(name, self._root)
29
- project.save(TracesData(resource_spans=[resource_spans]))
30
-
31
- def load(self) -> Iterator[TracesData]:
32
- queue: _Queue = SimpleQueue()
33
- Thread(target=self._load_traces_data, args=(queue,)).start()
34
- while (item := queue.get()) is not _END_OF_QUEUE:
35
- yield item
36
-
37
- def _load_traces_data(self, queue: _Queue) -> None:
38
- """Load traces data from all projects into the queue"""
39
- for project in self._projects.values():
40
- project.load(queue)
41
- queue.put(_END_OF_QUEUE)
42
-
43
-
44
- class _Project:
45
- def __init__(self, name: str, root: Path) -> None:
46
- self._path = root / f"project.{_b64encode(name.encode())}"
47
- spans_path = self._path / "spans"
48
- spans_path.mkdir(parents=True, exist_ok=True)
49
- self._spans = _Spans(spans_path / "spans.txt")
50
-
51
- def save(self, traces_data: TracesData) -> None:
52
- self._spans.save(traces_data)
53
-
54
- def load(self, queue: _Queue) -> None:
55
- self._spans.load(queue)
56
-
57
-
58
- class _Spans:
59
- def __init__(self, file_path: Path):
60
- self._path = file_path
61
- self._file = self._path.open("a")
62
- weakref.finalize(self, self._file.close)
63
-
64
- def save(self, traces_data: TracesData) -> None:
65
- self._file.write(_b64encode(traces_data.SerializeToString()))
66
- self._file.write("\n")
67
-
68
- def load(self, queue: _Queue) -> None:
69
- with self._path.open("r") as f:
70
- while line := f.readline():
71
- queue.put(TracesData.FromString(_b64decode(line)))
72
-
73
-
74
- def _load_projects(root: Path) -> Iterator[Tuple[str, _Project]]:
75
- for dir_path in root.glob(f"{_DIR_PREFIX}*/"):
76
- name = _b64decode(dir_path.name[len(_DIR_PREFIX) :]).decode()
77
- yield name, _Project(name, root)
78
-
79
-
80
- def _b64encode(s: bytes) -> str:
81
- return urlsafe_b64encode(s).decode()
82
-
83
-
84
- def _b64decode(name: str) -> bytes:
85
- return urlsafe_b64decode(name.encode())
@@ -1,60 +0,0 @@
1
- from typing import Any
2
-
3
-
4
- class _Missing:
5
- """
6
- Falsify all comparisons except those with self; return self when getattr()
7
- is called. Also, self is callable returning self. All this may seem peculiar
8
- but is useful for getting the desired (and intuitive) behavior from any
9
- boolean (i.e. comparative) expression without needing error handling when
10
- missing values are encountered. `_Missing()` is intended to be a (fancier)
11
- replacement for `None`.
12
- """
13
-
14
- def __lt__(self, _: Any) -> bool:
15
- return False
16
-
17
- def __le__(self, _: Any) -> bool:
18
- return False
19
-
20
- def __gt__(self, _: Any) -> bool:
21
- return False
22
-
23
- def __ge__(self, _: Any) -> bool:
24
- return False
25
-
26
- def __eq__(self, other: Any) -> bool:
27
- return isinstance(other, _Missing)
28
-
29
- def __ne__(self, _: Any) -> bool:
30
- return False
31
-
32
- def __len__(self) -> int:
33
- return 0
34
-
35
- def __iter__(self) -> Any:
36
- return self
37
-
38
- def __next__(self) -> Any:
39
- raise StopIteration()
40
-
41
- def __contains__(self, _: Any) -> bool:
42
- return False
43
-
44
- def __str__(self) -> str:
45
- return ""
46
-
47
- def __float__(self) -> float:
48
- return float("nan")
49
-
50
- def __bool__(self) -> bool:
51
- return False
52
-
53
- def __getattr__(self, _: Any) -> "_Missing":
54
- return self
55
-
56
- def __call__(self, *_: Any, **__: Any) -> "_Missing":
57
- return self
58
-
59
-
60
- MISSING: Any = _Missing()
@@ -1,3 +0,0 @@
1
- from phoenix.trace.langchain.instrumentor import LangChainInstrumentor
2
-
3
- __all__ = ("LangChainInstrumentor",)
@@ -1,35 +0,0 @@
1
- import logging
2
- from importlib.metadata import PackageNotFoundError
3
- from importlib.util import find_spec
4
- from typing import Any
5
-
6
- from openinference.instrumentation.langchain import LangChainInstrumentor as Instrumentor
7
- from openinference.semconv.resource import ResourceAttributes
8
- from opentelemetry.sdk import trace as trace_sdk
9
- from opentelemetry.sdk.resources import Resource
10
- from opentelemetry.sdk.trace.export import SimpleSpanProcessor
11
-
12
- from phoenix.config import get_env_project_name
13
- from phoenix.trace.exporter import _OpenInferenceExporter
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
-
18
- __all__ = ("LangChainInstrumentor",)
19
-
20
-
21
- class LangChainInstrumentor(Instrumentor):
22
- def __init__(self, *args: Any, **kwargs: Any) -> None:
23
- if find_spec("langchain_core") is None:
24
- raise PackageNotFoundError(
25
- "Missing `langchain-core`. Install with `pip install langchain-core`."
26
- )
27
- super().__init__()
28
-
29
- def instrument(self) -> None:
30
- tracer_provider = trace_sdk.TracerProvider(
31
- resource=Resource({ResourceAttributes.PROJECT_NAME: get_env_project_name()}),
32
- span_limits=trace_sdk.SpanLimits(max_attributes=10_000),
33
- )
34
- tracer_provider.add_span_processor(SimpleSpanProcessor(_OpenInferenceExporter()))
35
- super().instrument(skip_dep_check=True, tracer_provider=tracer_provider)
@@ -1,3 +0,0 @@
1
- from .callback import OpenInferenceTraceCallbackHandler
2
-
3
- __all__ = ["OpenInferenceTraceCallbackHandler"]
@@ -1,102 +0,0 @@
1
- import logging
2
- from importlib.metadata import PackageNotFoundError, version
3
- from typing import Any, Optional, Tuple
4
-
5
- from openinference.semconv.resource import ResourceAttributes
6
- from opentelemetry import trace as trace_api
7
- from opentelemetry.sdk import trace as trace_sdk
8
- from opentelemetry.sdk.resources import Resource
9
- from opentelemetry.sdk.trace.export import SimpleSpanProcessor
10
-
11
- from phoenix.config import get_env_project_name
12
- from phoenix.trace.errors import IncompatibleLibraryVersionError
13
- from phoenix.trace.exporter import _OpenInferenceExporter
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- LLAMA_INDEX_MODERN_VERSION = (0, 10, 0)
18
- INSTRUMENTATION_MODERN_VERSION = (1, 0, 0)
19
-
20
-
21
- def _check_instrumentation_compatibility() -> bool:
22
- llama_index_version_str = _get_version_if_installed("llama-index")
23
- llama_index_installed = llama_index_version_str is not None
24
- llama_index_core_version_str = _get_version_if_installed("llama-index-core")
25
- llama_index_core_installed = modern_llama_index_installed = (
26
- llama_index_core_version_str is not None
27
- )
28
- instrumentation_version_str = version("openinference-instrumentation-llama-index")
29
- instrumentation_version = _parse_semantic_version(instrumentation_version_str)
30
-
31
- if not llama_index_installed and not llama_index_core_installed:
32
- raise PackageNotFoundError(
33
- "Missing `llama_index`. "
34
- "Install with `pip install llama-index` or "
35
- "`pip install llama-index-core` for a minimal installation."
36
- )
37
- elif modern_llama_index_installed and instrumentation_version < INSTRUMENTATION_MODERN_VERSION:
38
- raise IncompatibleLibraryVersionError(
39
- f"llama-index-core v{llama_index_core_version_str} is not compatible with "
40
- f"openinference-instrumentation-llama-index v{instrumentation_version_str}. "
41
- "Please upgrade openinference-instrumentation-llama-index to at least 1.0.0 via "
42
- "`pip install 'openinference-instrumentation-llama-index>=1.0.0'`."
43
- )
44
- elif (
45
- llama_index_installed
46
- and llama_index_version_str
47
- and _parse_semantic_version(llama_index_version_str) < LLAMA_INDEX_MODERN_VERSION
48
- and instrumentation_version >= INSTRUMENTATION_MODERN_VERSION
49
- ):
50
- raise IncompatibleLibraryVersionError(
51
- f"llama-index v{llama_index_version_str} is not compatible with "
52
- f"openinference-instrumentation-llama-index v{instrumentation_version_str}. "
53
- "Please either migrate llama-index to at least 0.10.0 or downgrade "
54
- "openinference-instrumentation-llama-index via "
55
- "`pip install 'openinference-instrumentation-llama-index<1.0.0'`."
56
- )
57
- return True
58
-
59
-
60
- def _get_version_if_installed(package_name: str) -> Optional[str]:
61
- """
62
- Gets the version of the package if it is installed, otherwise, returns None.
63
- """
64
- try:
65
- return version(package_name)
66
- except PackageNotFoundError:
67
- return None
68
-
69
-
70
- def _parse_semantic_version(semver_string: str) -> Tuple[int, ...]:
71
- """
72
- Parse a semantic version string into a tuple of integers.
73
- """
74
- return tuple(map(int, semver_string.split(".")[:3]))
75
-
76
-
77
- if _check_instrumentation_compatibility():
78
- from openinference.instrumentation.llama_index._callback import (
79
- OpenInferenceTraceCallbackHandler as _OpenInferenceTraceCallbackHandler,
80
- )
81
- from openinference.instrumentation.llama_index.version import (
82
- __version__,
83
- )
84
-
85
-
86
- class OpenInferenceTraceCallbackHandler(_OpenInferenceTraceCallbackHandler):
87
- """Callback handler for storing LLM application trace data in OpenInference format.
88
- OpenInference is an open standard for capturing and storing AI model
89
- inferences. It enables production LLMapp servers to seamlessly integrate
90
- with LLM observability solutions such as Arize and Phoenix.
91
-
92
- For more information on the specification, see
93
- https://github.com/Arize-ai/openinference
94
- """
95
-
96
- def __init__(self, *args: Any, **kwargs: Any) -> None:
97
- tracer_provider = trace_sdk.TracerProvider(
98
- resource=Resource({ResourceAttributes.PROJECT_NAME: get_env_project_name()}),
99
- span_limits=trace_sdk.SpanLimits(max_attributes=10_000),
100
- )
101
- tracer_provider.add_span_processor(SimpleSpanProcessor(_OpenInferenceExporter()))
102
- super().__init__(trace_api.get_tracer(__name__, __version__, tracer_provider))
@@ -1,3 +0,0 @@
1
- from .instrumentor import OpenAIInstrumentor
2
-
3
- __all__ = ["OpenAIInstrumentor"]
@@ -1,30 +0,0 @@
1
- import logging
2
- from importlib.metadata import PackageNotFoundError
3
- from importlib.util import find_spec
4
- from typing import Any
5
-
6
- from openinference.instrumentation.openai import OpenAIInstrumentor as Instrumentor
7
- from openinference.semconv.resource import ResourceAttributes
8
- from opentelemetry.sdk import trace as trace_sdk
9
- from opentelemetry.sdk.resources import Resource
10
- from opentelemetry.sdk.trace.export import SimpleSpanProcessor
11
-
12
- from phoenix.config import get_env_project_name
13
- from phoenix.trace.exporter import _OpenInferenceExporter
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
-
18
- class OpenAIInstrumentor(Instrumentor):
19
- def __init__(self, *args: Any, **kwargs: Any) -> None:
20
- if find_spec("openai") is None:
21
- raise PackageNotFoundError("Missing `openai`. Install with `pip install openai`.")
22
- super().__init__()
23
-
24
- def instrument(self) -> None:
25
- tracer_provider = trace_sdk.TracerProvider(
26
- resource=Resource({ResourceAttributes.PROJECT_NAME: get_env_project_name()}),
27
- span_limits=trace_sdk.SpanLimits(max_attributes=10_000),
28
- )
29
- tracer_provider.add_span_processor(SimpleSpanProcessor(_OpenInferenceExporter()))
30
- super().instrument(skip_dep_check=True, tracer_provider=tracer_provider)
File without changes
File without changes