judgeval 0.0.42__tar.gz → 0.0.43__tar.gz

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.
Files changed (179) hide show
  1. {judgeval-0.0.42 → judgeval-0.0.43}/PKG-INFO +1 -1
  2. {judgeval-0.0.42 → judgeval-0.0.43}/pyproject.toml +1 -1
  3. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/common/tracer.py +48 -10
  4. {judgeval-0.0.42 → judgeval-0.0.43}/.github/pull_request_template.md +0 -0
  5. {judgeval-0.0.42 → judgeval-0.0.43}/.github/workflows/blocked-pr.yaml +0 -0
  6. {judgeval-0.0.42 → judgeval-0.0.43}/.github/workflows/ci.yaml +0 -0
  7. {judgeval-0.0.42 → judgeval-0.0.43}/.github/workflows/merge-branch-check.yaml +0 -0
  8. {judgeval-0.0.42 → judgeval-0.0.43}/.github/workflows/release.yaml +0 -0
  9. {judgeval-0.0.42 → judgeval-0.0.43}/.github/workflows/validate-branch.yaml +0 -0
  10. {judgeval-0.0.42 → judgeval-0.0.43}/.gitignore +0 -0
  11. {judgeval-0.0.42 → judgeval-0.0.43}/LICENSE.md +0 -0
  12. {judgeval-0.0.42 → judgeval-0.0.43}/README.md +0 -0
  13. {judgeval-0.0.42 → judgeval-0.0.43}/assets/Screenshot 2025-05-17 at 8.14.27/342/200/257PM.png" +0 -0
  14. {judgeval-0.0.42 → judgeval-0.0.43}/assets/dataset_clustering_screenshot.png +0 -0
  15. {judgeval-0.0.42 → judgeval-0.0.43}/assets/dataset_clustering_screenshot_dm.png +0 -0
  16. {judgeval-0.0.42 → judgeval-0.0.43}/assets/datasets_preview_screenshot.png +0 -0
  17. {judgeval-0.0.42 → judgeval-0.0.43}/assets/experiments_dashboard_screenshot.png +0 -0
  18. {judgeval-0.0.42 → judgeval-0.0.43}/assets/experiments_page.png +0 -0
  19. {judgeval-0.0.42 → judgeval-0.0.43}/assets/experiments_pagev2.png +0 -0
  20. {judgeval-0.0.42 → judgeval-0.0.43}/assets/logo-dark.svg +0 -0
  21. {judgeval-0.0.42 → judgeval-0.0.43}/assets/logo-light.svg +0 -0
  22. {judgeval-0.0.42 → judgeval-0.0.43}/assets/monitoring_screenshot.png +0 -0
  23. {judgeval-0.0.42 → judgeval-0.0.43}/assets/new_darkmode.svg +0 -0
  24. {judgeval-0.0.42 → judgeval-0.0.43}/assets/new_lightmode.svg +0 -0
  25. {judgeval-0.0.42 → judgeval-0.0.43}/assets/trace_demo.png +0 -0
  26. {judgeval-0.0.42 → judgeval-0.0.43}/assets/trace_screenshot.png +0 -0
  27. {judgeval-0.0.42 → judgeval-0.0.43}/docs/README.md +0 -0
  28. {judgeval-0.0.42 → judgeval-0.0.43}/docs/alerts/notifications.mdx +0 -0
  29. {judgeval-0.0.42 → judgeval-0.0.43}/docs/alerts/platform_notifications.mdx +0 -0
  30. {judgeval-0.0.42 → judgeval-0.0.43}/docs/alerts/rules.mdx +0 -0
  31. {judgeval-0.0.42 → judgeval-0.0.43}/docs/api_reference/judgment_client.mdx +0 -0
  32. {judgeval-0.0.42 → judgeval-0.0.43}/docs/api_reference/trace.mdx +0 -0
  33. {judgeval-0.0.42 → judgeval-0.0.43}/docs/changelog/2025-04-21.mdx +0 -0
  34. {judgeval-0.0.42 → judgeval-0.0.43}/docs/clustering/clustering.mdx +0 -0
  35. {judgeval-0.0.42 → judgeval-0.0.43}/docs/compliance/certifications.mdx +0 -0
  36. {judgeval-0.0.42 → judgeval-0.0.43}/docs/development.mdx +0 -0
  37. {judgeval-0.0.42 → judgeval-0.0.43}/docs/essentials/code.mdx +0 -0
  38. {judgeval-0.0.42 → judgeval-0.0.43}/docs/essentials/images.mdx +0 -0
  39. {judgeval-0.0.42 → judgeval-0.0.43}/docs/essentials/markdown.mdx +0 -0
  40. {judgeval-0.0.42 → judgeval-0.0.43}/docs/essentials/navigation.mdx +0 -0
  41. {judgeval-0.0.42 → judgeval-0.0.43}/docs/essentials/reusable-snippets.mdx +0 -0
  42. {judgeval-0.0.42 → judgeval-0.0.43}/docs/essentials/settings.mdx +0 -0
  43. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/data_datasets.mdx +0 -0
  44. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/data_examples.mdx +0 -0
  45. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/data_sequences.mdx +0 -0
  46. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/experiment_comparisons.mdx +0 -0
  47. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/introduction.mdx +0 -0
  48. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/judges.mdx +0 -0
  49. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/agent/derailment.mdx +0 -0
  50. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/classifier_scorer.mdx +0 -0
  51. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/custom_scorers.mdx +0 -0
  52. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/answer_correctness.mdx +0 -0
  53. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/answer_relevancy.mdx +0 -0
  54. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/comparison.mdx +0 -0
  55. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/contextual_precision.mdx +0 -0
  56. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/contextual_recall.mdx +0 -0
  57. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/contextual_relevancy.mdx +0 -0
  58. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/execution_order.mdx +0 -0
  59. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/faithfulness.mdx +0 -0
  60. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/groundedness.mdx +0 -0
  61. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/json_correctness.mdx +0 -0
  62. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/default/summarization.mdx +0 -0
  63. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/scorers/introduction.mdx +0 -0
  64. {judgeval-0.0.42 → judgeval-0.0.43}/docs/evaluation/unit_testing.mdx +0 -0
  65. {judgeval-0.0.42 → judgeval-0.0.43}/docs/favicon.svg +0 -0
  66. {judgeval-0.0.42 → judgeval-0.0.43}/docs/getting_started.mdx +0 -0
  67. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/annotation_queue_ui.png +0 -0
  68. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/basic_trace_example.png +0 -0
  69. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/checks-passed.png +0 -0
  70. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/cluster.png +0 -0
  71. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/cluster_button.png +0 -0
  72. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/create_aggressive_scorer.png +0 -0
  73. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/create_scorer.png +0 -0
  74. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/dashboard_annotation_queue_button.png +0 -0
  75. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/evaluation_diagram.png +0 -0
  76. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/experiment-comparison-page-2.png +0 -0
  77. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/experiment-page-comparison.png +0 -0
  78. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/experiment-popout-comparison.png +0 -0
  79. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/experiments-page-comparison-2.png +0 -0
  80. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/experiments-page-comparison.png +0 -0
  81. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/export-dataset.png +0 -0
  82. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/hero-dark.svg +0 -0
  83. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/hero-light.svg +0 -0
  84. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/notifications_page.png +0 -0
  85. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/online_eval_fault.png +0 -0
  86. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/reports_modal.png +0 -0
  87. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/synth_data_button.png +0 -0
  88. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/synth_data_window.png +0 -0
  89. {judgeval-0.0.42 → judgeval-0.0.43}/docs/images/trace_ss.png +0 -0
  90. {judgeval-0.0.42 → judgeval-0.0.43}/docs/integration/langgraph.mdx +0 -0
  91. {judgeval-0.0.42 → judgeval-0.0.43}/docs/introduction.mdx +0 -0
  92. {judgeval-0.0.42 → judgeval-0.0.43}/docs/judgment_cli/installation.mdx +0 -0
  93. {judgeval-0.0.42 → judgeval-0.0.43}/docs/judgment_cli/self-hosting.mdx +0 -0
  94. {judgeval-0.0.42 → judgeval-0.0.43}/docs/judgment_cli/supabase-org-id.png +0 -0
  95. {judgeval-0.0.42 → judgeval-0.0.43}/docs/logo/dark.svg +0 -0
  96. {judgeval-0.0.42 → judgeval-0.0.43}/docs/logo/light.svg +0 -0
  97. {judgeval-0.0.42 → judgeval-0.0.43}/docs/mint.json +0 -0
  98. {judgeval-0.0.42 → judgeval-0.0.43}/docs/monitoring/annotations.mdx +0 -0
  99. {judgeval-0.0.42 → judgeval-0.0.43}/docs/monitoring/introduction.mdx +0 -0
  100. {judgeval-0.0.42 → judgeval-0.0.43}/docs/monitoring/production_insights.mdx +0 -0
  101. {judgeval-0.0.42 → judgeval-0.0.43}/docs/monitoring/tracing.mdx +0 -0
  102. {judgeval-0.0.42 → judgeval-0.0.43}/docs/monitoring/tracing_s3.mdx +0 -0
  103. {judgeval-0.0.42 → judgeval-0.0.43}/docs/notebooks/create_dataset.ipynb +0 -0
  104. {judgeval-0.0.42 → judgeval-0.0.43}/docs/notebooks/create_scorer.ipynb +0 -0
  105. {judgeval-0.0.42 → judgeval-0.0.43}/docs/notebooks/demo.ipynb +0 -0
  106. {judgeval-0.0.42 → judgeval-0.0.43}/docs/notebooks/prompt_scorer.ipynb +0 -0
  107. {judgeval-0.0.42 → judgeval-0.0.43}/docs/notebooks/quickstart.ipynb +0 -0
  108. {judgeval-0.0.42 → judgeval-0.0.43}/docs/optimization/osiris_agent.mdx +0 -0
  109. {judgeval-0.0.42 → judgeval-0.0.43}/docs/quickstart.mdx +0 -0
  110. {judgeval-0.0.42 → judgeval-0.0.43}/docs/self_hosting/get_started.mdx +0 -0
  111. {judgeval-0.0.42 → judgeval-0.0.43}/docs/snippets/snippet-intro.mdx +0 -0
  112. {judgeval-0.0.42 → judgeval-0.0.43}/docs/synthetic_data/synthetic_data.mdx +0 -0
  113. {judgeval-0.0.42 → judgeval-0.0.43}/pytest.ini +0 -0
  114. {judgeval-0.0.42 → judgeval-0.0.43}/src/.coveragerc +0 -0
  115. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/__init__.py +0 -0
  116. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/clients.py +0 -0
  117. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/common/__init__.py +0 -0
  118. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/common/exceptions.py +0 -0
  119. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/common/logger.py +0 -0
  120. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/common/s3_storage.py +0 -0
  121. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/common/utils.py +0 -0
  122. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/constants.py +0 -0
  123. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/__init__.py +0 -0
  124. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/custom_example.py +0 -0
  125. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/datasets/__init__.py +0 -0
  126. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/datasets/dataset.py +0 -0
  127. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/datasets/eval_dataset_client.py +0 -0
  128. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/example.py +0 -0
  129. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/result.py +0 -0
  130. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/scorer_data.py +0 -0
  131. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/tool.py +0 -0
  132. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/trace.py +0 -0
  133. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/data/trace_run.py +0 -0
  134. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/evaluation_run.py +0 -0
  135. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/integrations/langgraph.py +0 -0
  136. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/judges/__init__.py +0 -0
  137. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/judges/base_judge.py +0 -0
  138. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/judges/litellm_judge.py +0 -0
  139. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/judges/mixture_of_judges.py +0 -0
  140. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/judges/together_judge.py +0 -0
  141. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/judges/utils.py +0 -0
  142. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/judgment_client.py +0 -0
  143. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/rules.py +0 -0
  144. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/run_evaluation.py +0 -0
  145. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/__init__.py +0 -0
  146. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/api_scorer.py +0 -0
  147. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/exceptions.py +0 -0
  148. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorer.py +0 -0
  149. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/__init__.py +0 -0
  150. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/__init__.py +0 -0
  151. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/answer_correctness.py +0 -0
  152. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/answer_relevancy.py +0 -0
  153. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/classifier_scorer.py +0 -0
  154. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/comparison.py +0 -0
  155. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/contextual_precision.py +0 -0
  156. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/contextual_recall.py +0 -0
  157. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/contextual_relevancy.py +0 -0
  158. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/derailment_scorer.py +0 -0
  159. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/execution_order.py +0 -0
  160. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/faithfulness.py +0 -0
  161. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/groundedness.py +0 -0
  162. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/hallucination.py +0 -0
  163. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/instruction_adherence.py +0 -0
  164. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/json_correctness.py +0 -0
  165. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/summarization.py +0 -0
  166. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/tool_dependency.py +0 -0
  167. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/api_scorers/tool_order.py +0 -0
  168. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/classifiers/__init__.py +0 -0
  169. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/classifiers/text2sql/__init__.py +0 -0
  170. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/judgeval_scorers/classifiers/text2sql/text2sql_scorer.py +0 -0
  171. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/prompt_scorer.py +0 -0
  172. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/score.py +0 -0
  173. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/scorers/utils.py +0 -0
  174. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/tracer/__init__.py +0 -0
  175. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/utils/alerts.py +0 -0
  176. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/utils/data_utils.py +0 -0
  177. {judgeval-0.0.42 → judgeval-0.0.43}/src/judgeval/version_check.py +0 -0
  178. {judgeval-0.0.42 → judgeval-0.0.43}/update_version.py +0 -0
  179. {judgeval-0.0.42 → judgeval-0.0.43}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: judgeval
3
- Version: 0.0.42
3
+ Version: 0.0.43
4
4
  Summary: Judgeval Package
5
5
  Project-URL: Homepage, https://github.com/JudgmentLabs/judgeval
6
6
  Project-URL: Issues, https://github.com/JudgmentLabs/judgeval/issues
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "judgeval"
3
- version = "0.0.42"
3
+ version = "0.0.43"
4
4
  authors = [
5
5
  { name="Andrew Li", email="andrew@judgmentlabs.ai" },
6
6
  { name="Alex Shan", email="alex@judgmentlabs.ai" },
@@ -2237,7 +2237,7 @@ def wrap(client: Any, trace_across_async_contexts: bool = Tracer.trace_across_as
2237
2237
  Supports OpenAI, Together, Anthropic, and Google GenAI clients.
2238
2238
  Patches both '.create' and Anthropic's '.stream' methods using a wrapper class.
2239
2239
  """
2240
- span_name, original_create, original_responses_create, original_stream = _get_client_config(client)
2240
+ span_name, original_create, original_responses_create, original_stream, original_beta_parse = _get_client_config(client)
2241
2241
 
2242
2242
  def _get_current_trace():
2243
2243
  if trace_across_async_contexts:
@@ -2307,6 +2307,22 @@ def wrap(client: Any, trace_across_async_contexts: bool = Tracer.trace_across_as
2307
2307
  _capture_exception_for_trace(span, sys.exc_info())
2308
2308
  raise e
2309
2309
 
2310
+ async def traced_beta_parse_async(*args, **kwargs):
2311
+ current_trace = _get_current_trace()
2312
+ if not current_trace:
2313
+ return await original_beta_parse(*args, **kwargs)
2314
+
2315
+ with current_trace.span(span_name, span_type="llm") as span:
2316
+ is_streaming = _record_input_and_check_streaming(span, kwargs)
2317
+
2318
+ try:
2319
+ response_or_iterator = await original_beta_parse(*args, **kwargs)
2320
+ return _format_and_record_output(span, response_or_iterator, is_streaming, True, False)
2321
+ except Exception as e:
2322
+ _capture_exception_for_trace(span, sys.exc_info())
2323
+ raise e
2324
+
2325
+
2310
2326
  # Async responses for OpenAI clients
2311
2327
  async def traced_response_create_async(*args, **kwargs):
2312
2328
  current_trace = _get_current_trace()
@@ -2354,6 +2370,21 @@ def wrap(client: Any, trace_across_async_contexts: bool = Tracer.trace_across_as
2354
2370
  except Exception as e:
2355
2371
  _capture_exception_for_trace(span, sys.exc_info())
2356
2372
  raise e
2373
+
2374
+ def traced_beta_parse_sync(*args, **kwargs):
2375
+ current_trace = _get_current_trace()
2376
+ if not current_trace:
2377
+ return original_beta_parse(*args, **kwargs)
2378
+
2379
+ with current_trace.span(span_name, span_type="llm") as span:
2380
+ is_streaming = _record_input_and_check_streaming(span, kwargs)
2381
+
2382
+ try:
2383
+ response_or_iterator = original_beta_parse(*args, **kwargs)
2384
+ return _format_and_record_output(span, response_or_iterator, is_streaming, False, False)
2385
+ except Exception as e:
2386
+ _capture_exception_for_trace(span, sys.exc_info())
2387
+ raise e
2357
2388
 
2358
2389
  def traced_response_create_sync(*args, **kwargs):
2359
2390
  current_trace = _get_current_trace()
@@ -2392,7 +2423,7 @@ def wrap(client: Any, trace_across_async_contexts: bool = Tracer.trace_across_as
2392
2423
  if hasattr(client, "responses") and hasattr(client.responses, "create"):
2393
2424
  client.responses.create = traced_response_create_async
2394
2425
  if hasattr(client, "beta") and hasattr(client.beta, "chat") and hasattr(client.beta.chat, "completions") and hasattr(client.beta.chat.completions, "parse"):
2395
- client.beta.chat.completions.parse = traced_create_async
2426
+ client.beta.chat.completions.parse = traced_beta_parse_async
2396
2427
  elif isinstance(client, AsyncAnthropic):
2397
2428
  client.messages.create = traced_create_async
2398
2429
  if original_stream:
@@ -2404,7 +2435,7 @@ def wrap(client: Any, trace_across_async_contexts: bool = Tracer.trace_across_as
2404
2435
  if hasattr(client, "responses") and hasattr(client.responses, "create"):
2405
2436
  client.responses.create = traced_response_create_sync
2406
2437
  if hasattr(client, "beta") and hasattr(client.beta, "chat") and hasattr(client.beta.chat, "completions") and hasattr(client.beta.chat.completions, "parse"):
2407
- client.beta.chat.completions.parse = traced_create_sync
2438
+ client.beta.chat.completions.parse = traced_beta_parse_sync
2408
2439
  elif isinstance(client, Anthropic):
2409
2440
  client.messages.create = traced_create_sync
2410
2441
  if original_stream:
@@ -2423,23 +2454,24 @@ def _get_client_config(client: ApiClient) -> tuple[str, callable, Optional[calla
2423
2454
  client: An instance of OpenAI, Together, or Anthropic client
2424
2455
 
2425
2456
  Returns:
2426
- tuple: (span_name, create_method, stream_method)
2457
+ tuple: (span_name, create_method, responses_method, stream_method, beta_parse_method)
2427
2458
  - span_name: String identifier for tracing
2428
2459
  - create_method: Reference to the client's creation method
2429
2460
  - responses_method: Reference to the client's responses method (if applicable)
2430
2461
  - stream_method: Reference to the client's stream method (if applicable)
2462
+ - beta_parse_method: Reference to the client's beta parse method (if applicable)
2431
2463
 
2432
2464
  Raises:
2433
2465
  ValueError: If client type is not supported
2434
2466
  """
2435
2467
  if isinstance(client, (OpenAI, AsyncOpenAI)):
2436
- return "OPENAI_API_CALL", client.chat.completions.create, client.responses.create, None
2468
+ return "OPENAI_API_CALL", client.chat.completions.create, client.responses.create, None, client.beta.chat.completions.parse
2437
2469
  elif isinstance(client, (Together, AsyncTogether)):
2438
- return "TOGETHER_API_CALL", client.chat.completions.create, None, None
2470
+ return "TOGETHER_API_CALL", client.chat.completions.create, None, None, None
2439
2471
  elif isinstance(client, (Anthropic, AsyncAnthropic)):
2440
- return "ANTHROPIC_API_CALL", client.messages.create, None, client.messages.stream
2472
+ return "ANTHROPIC_API_CALL", client.messages.create, None, client.messages.stream, None
2441
2473
  elif isinstance(client, (genai.Client, genai.client.AsyncClient)):
2442
- return "GOOGLE_API_CALL", client.models.generate_content, None, None
2474
+ return "GOOGLE_API_CALL", client.models.generate_content, None, None, None
2443
2475
  raise ValueError(f"Unsupported client type: {type(client)}")
2444
2476
 
2445
2477
  def _format_input_data(client: ApiClient, **kwargs) -> dict:
@@ -2449,10 +2481,13 @@ def _format_input_data(client: ApiClient, **kwargs) -> dict:
2449
2481
  to ensure consistent tracing across different APIs.
2450
2482
  """
2451
2483
  if isinstance(client, (OpenAI, Together, AsyncOpenAI, AsyncTogether)):
2452
- return {
2484
+ input_data = {
2453
2485
  "model": kwargs.get("model"),
2454
2486
  "messages": kwargs.get("messages"),
2455
2487
  }
2488
+ if kwargs.get("response_format"):
2489
+ input_data["response_format"] = kwargs.get("response_format")
2490
+ return input_data
2456
2491
  elif isinstance(client, (genai.Client, genai.client.AsyncClient)):
2457
2492
  return {
2458
2493
  "model": kwargs.get("model"),
@@ -2522,7 +2557,10 @@ def _format_output_data(client: ApiClient, response: Any) -> dict:
2522
2557
  model_name = response.model
2523
2558
  prompt_tokens = response.usage.prompt_tokens
2524
2559
  completion_tokens = response.usage.completion_tokens
2525
- message_content = response.choices[0].message.content
2560
+ if hasattr(response.choices[0].message, "parsed") and response.choices[0].message.parsed:
2561
+ message_content = response.choices[0].message.parsed
2562
+ else:
2563
+ message_content = response.choices[0].message.content
2526
2564
  elif isinstance(client, (genai.Client, genai.client.AsyncClient)):
2527
2565
  model_name = response.model_version
2528
2566
  prompt_tokens = response.usage_metadata.prompt_token_count
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes