opik 1.8.39__py3-none-any.whl → 1.9.71__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.
Files changed (592) hide show
  1. opik/__init__.py +19 -3
  2. opik/anonymizer/__init__.py +5 -0
  3. opik/anonymizer/anonymizer.py +12 -0
  4. opik/anonymizer/factory.py +80 -0
  5. opik/anonymizer/recursive_anonymizer.py +64 -0
  6. opik/anonymizer/rules.py +56 -0
  7. opik/anonymizer/rules_anonymizer.py +35 -0
  8. opik/api_objects/attachment/attachment_context.py +36 -0
  9. opik/api_objects/attachment/attachments_extractor.py +153 -0
  10. opik/api_objects/attachment/client.py +1 -0
  11. opik/api_objects/attachment/converters.py +2 -0
  12. opik/api_objects/attachment/decoder.py +18 -0
  13. opik/api_objects/attachment/decoder_base64.py +83 -0
  14. opik/api_objects/attachment/decoder_helpers.py +137 -0
  15. opik/api_objects/data_helpers.py +79 -0
  16. opik/api_objects/dataset/dataset.py +64 -4
  17. opik/api_objects/dataset/rest_operations.py +11 -2
  18. opik/api_objects/experiment/experiment.py +57 -57
  19. opik/api_objects/experiment/experiment_item.py +2 -1
  20. opik/api_objects/experiment/experiments_client.py +64 -0
  21. opik/api_objects/experiment/helpers.py +35 -11
  22. opik/api_objects/experiment/rest_operations.py +65 -5
  23. opik/api_objects/helpers.py +8 -5
  24. opik/api_objects/local_recording.py +81 -0
  25. opik/api_objects/opik_client.py +600 -108
  26. opik/api_objects/opik_query_language.py +39 -5
  27. opik/api_objects/prompt/__init__.py +12 -2
  28. opik/api_objects/prompt/base_prompt.py +69 -0
  29. opik/api_objects/prompt/base_prompt_template.py +29 -0
  30. opik/api_objects/prompt/chat/__init__.py +1 -0
  31. opik/api_objects/prompt/chat/chat_prompt.py +210 -0
  32. opik/api_objects/prompt/chat/chat_prompt_template.py +350 -0
  33. opik/api_objects/prompt/chat/content_renderer_registry.py +203 -0
  34. opik/api_objects/prompt/client.py +189 -47
  35. opik/api_objects/prompt/text/__init__.py +1 -0
  36. opik/api_objects/prompt/text/prompt.py +174 -0
  37. opik/api_objects/prompt/{prompt_template.py → text/prompt_template.py} +10 -6
  38. opik/api_objects/prompt/types.py +23 -0
  39. opik/api_objects/search_helpers.py +89 -0
  40. opik/api_objects/span/span_data.py +35 -25
  41. opik/api_objects/threads/threads_client.py +39 -5
  42. opik/api_objects/trace/trace_client.py +52 -2
  43. opik/api_objects/trace/trace_data.py +15 -24
  44. opik/api_objects/validation_helpers.py +3 -3
  45. opik/cli/__init__.py +5 -0
  46. opik/cli/__main__.py +6 -0
  47. opik/cli/configure.py +66 -0
  48. opik/cli/exports/__init__.py +131 -0
  49. opik/cli/exports/dataset.py +278 -0
  50. opik/cli/exports/experiment.py +784 -0
  51. opik/cli/exports/project.py +685 -0
  52. opik/cli/exports/prompt.py +578 -0
  53. opik/cli/exports/utils.py +406 -0
  54. opik/cli/harbor.py +39 -0
  55. opik/cli/healthcheck.py +21 -0
  56. opik/cli/imports/__init__.py +439 -0
  57. opik/cli/imports/dataset.py +143 -0
  58. opik/cli/imports/experiment.py +1192 -0
  59. opik/cli/imports/project.py +262 -0
  60. opik/cli/imports/prompt.py +177 -0
  61. opik/cli/imports/utils.py +280 -0
  62. opik/cli/main.py +49 -0
  63. opik/cli/proxy.py +93 -0
  64. opik/cli/usage_report/__init__.py +16 -0
  65. opik/cli/usage_report/charts.py +783 -0
  66. opik/cli/usage_report/cli.py +274 -0
  67. opik/cli/usage_report/constants.py +9 -0
  68. opik/cli/usage_report/extraction.py +749 -0
  69. opik/cli/usage_report/pdf.py +244 -0
  70. opik/cli/usage_report/statistics.py +78 -0
  71. opik/cli/usage_report/utils.py +235 -0
  72. opik/config.py +13 -7
  73. opik/configurator/configure.py +17 -0
  74. opik/datetime_helpers.py +12 -0
  75. opik/decorator/arguments_helpers.py +9 -1
  76. opik/decorator/base_track_decorator.py +205 -133
  77. opik/decorator/context_manager/span_context_manager.py +123 -0
  78. opik/decorator/context_manager/trace_context_manager.py +84 -0
  79. opik/decorator/opik_args/__init__.py +13 -0
  80. opik/decorator/opik_args/api_classes.py +71 -0
  81. opik/decorator/opik_args/helpers.py +120 -0
  82. opik/decorator/span_creation_handler.py +25 -6
  83. opik/dict_utils.py +3 -3
  84. opik/evaluation/__init__.py +13 -2
  85. opik/evaluation/engine/engine.py +272 -75
  86. opik/evaluation/engine/evaluation_tasks_executor.py +6 -3
  87. opik/evaluation/engine/helpers.py +31 -6
  88. opik/evaluation/engine/metrics_evaluator.py +237 -0
  89. opik/evaluation/evaluation_result.py +168 -2
  90. opik/evaluation/evaluator.py +533 -62
  91. opik/evaluation/metrics/__init__.py +103 -4
  92. opik/evaluation/metrics/aggregated_metric.py +35 -6
  93. opik/evaluation/metrics/base_metric.py +1 -1
  94. opik/evaluation/metrics/conversation/__init__.py +48 -0
  95. opik/evaluation/metrics/conversation/conversation_thread_metric.py +56 -2
  96. opik/evaluation/metrics/conversation/g_eval_wrappers.py +19 -0
  97. opik/evaluation/metrics/conversation/helpers.py +14 -15
  98. opik/evaluation/metrics/conversation/heuristics/__init__.py +14 -0
  99. opik/evaluation/metrics/conversation/heuristics/degeneration/__init__.py +3 -0
  100. opik/evaluation/metrics/conversation/heuristics/degeneration/metric.py +189 -0
  101. opik/evaluation/metrics/conversation/heuristics/degeneration/phrases.py +12 -0
  102. opik/evaluation/metrics/conversation/heuristics/knowledge_retention/__init__.py +3 -0
  103. opik/evaluation/metrics/conversation/heuristics/knowledge_retention/metric.py +172 -0
  104. opik/evaluation/metrics/conversation/llm_judges/__init__.py +32 -0
  105. opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/metric.py +22 -17
  106. opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/templates.py +1 -1
  107. opik/evaluation/metrics/conversation/llm_judges/g_eval_wrappers.py +442 -0
  108. opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/metric.py +13 -7
  109. opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/templates.py +1 -1
  110. opik/evaluation/metrics/conversation/llm_judges/user_frustration/__init__.py +0 -0
  111. opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/metric.py +21 -14
  112. opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/templates.py +1 -1
  113. opik/evaluation/metrics/conversation/types.py +4 -5
  114. opik/evaluation/metrics/conversation_types.py +9 -0
  115. opik/evaluation/metrics/heuristics/bertscore.py +107 -0
  116. opik/evaluation/metrics/heuristics/bleu.py +35 -15
  117. opik/evaluation/metrics/heuristics/chrf.py +127 -0
  118. opik/evaluation/metrics/heuristics/contains.py +47 -11
  119. opik/evaluation/metrics/heuristics/distribution_metrics.py +331 -0
  120. opik/evaluation/metrics/heuristics/gleu.py +113 -0
  121. opik/evaluation/metrics/heuristics/language_adherence.py +123 -0
  122. opik/evaluation/metrics/heuristics/meteor.py +119 -0
  123. opik/evaluation/metrics/heuristics/prompt_injection.py +150 -0
  124. opik/evaluation/metrics/heuristics/readability.py +129 -0
  125. opik/evaluation/metrics/heuristics/rouge.py +26 -9
  126. opik/evaluation/metrics/heuristics/spearman.py +88 -0
  127. opik/evaluation/metrics/heuristics/tone.py +155 -0
  128. opik/evaluation/metrics/heuristics/vader_sentiment.py +77 -0
  129. opik/evaluation/metrics/llm_judges/answer_relevance/metric.py +20 -5
  130. opik/evaluation/metrics/llm_judges/context_precision/metric.py +20 -6
  131. opik/evaluation/metrics/llm_judges/context_recall/metric.py +20 -6
  132. opik/evaluation/metrics/llm_judges/g_eval/__init__.py +5 -0
  133. opik/evaluation/metrics/llm_judges/g_eval/metric.py +219 -68
  134. opik/evaluation/metrics/llm_judges/g_eval/parser.py +102 -52
  135. opik/evaluation/metrics/llm_judges/g_eval/presets.py +209 -0
  136. opik/evaluation/metrics/llm_judges/g_eval_presets/__init__.py +36 -0
  137. opik/evaluation/metrics/llm_judges/g_eval_presets/agent_assessment.py +77 -0
  138. opik/evaluation/metrics/llm_judges/g_eval_presets/bias_classifier.py +181 -0
  139. opik/evaluation/metrics/llm_judges/g_eval_presets/compliance_risk.py +41 -0
  140. opik/evaluation/metrics/llm_judges/g_eval_presets/prompt_uncertainty.py +41 -0
  141. opik/evaluation/metrics/llm_judges/g_eval_presets/qa_suite.py +146 -0
  142. opik/evaluation/metrics/llm_judges/hallucination/metric.py +16 -3
  143. opik/evaluation/metrics/llm_judges/llm_juries/__init__.py +3 -0
  144. opik/evaluation/metrics/llm_judges/llm_juries/metric.py +76 -0
  145. opik/evaluation/metrics/llm_judges/moderation/metric.py +16 -4
  146. opik/evaluation/metrics/llm_judges/structure_output_compliance/__init__.py +0 -0
  147. opik/evaluation/metrics/llm_judges/structure_output_compliance/metric.py +144 -0
  148. opik/evaluation/metrics/llm_judges/structure_output_compliance/parser.py +79 -0
  149. opik/evaluation/metrics/llm_judges/structure_output_compliance/schema.py +15 -0
  150. opik/evaluation/metrics/llm_judges/structure_output_compliance/template.py +50 -0
  151. opik/evaluation/metrics/llm_judges/syc_eval/__init__.py +0 -0
  152. opik/evaluation/metrics/llm_judges/syc_eval/metric.py +252 -0
  153. opik/evaluation/metrics/llm_judges/syc_eval/parser.py +82 -0
  154. opik/evaluation/metrics/llm_judges/syc_eval/template.py +155 -0
  155. opik/evaluation/metrics/llm_judges/trajectory_accuracy/metric.py +20 -5
  156. opik/evaluation/metrics/llm_judges/usefulness/metric.py +16 -4
  157. opik/evaluation/metrics/ragas_metric.py +43 -23
  158. opik/evaluation/models/__init__.py +8 -0
  159. opik/evaluation/models/base_model.py +107 -1
  160. opik/evaluation/models/langchain/langchain_chat_model.py +15 -7
  161. opik/evaluation/models/langchain/message_converters.py +97 -15
  162. opik/evaluation/models/litellm/litellm_chat_model.py +156 -29
  163. opik/evaluation/models/litellm/util.py +125 -0
  164. opik/evaluation/models/litellm/warning_filters.py +16 -4
  165. opik/evaluation/models/model_capabilities.py +187 -0
  166. opik/evaluation/models/models_factory.py +25 -3
  167. opik/evaluation/preprocessing.py +92 -0
  168. opik/evaluation/report.py +70 -12
  169. opik/evaluation/rest_operations.py +49 -45
  170. opik/evaluation/samplers/__init__.py +4 -0
  171. opik/evaluation/samplers/base_dataset_sampler.py +40 -0
  172. opik/evaluation/samplers/random_dataset_sampler.py +48 -0
  173. opik/evaluation/score_statistics.py +66 -0
  174. opik/evaluation/scorers/__init__.py +4 -0
  175. opik/evaluation/scorers/scorer_function.py +55 -0
  176. opik/evaluation/scorers/scorer_wrapper_metric.py +130 -0
  177. opik/evaluation/test_case.py +3 -2
  178. opik/evaluation/test_result.py +1 -0
  179. opik/evaluation/threads/evaluator.py +31 -3
  180. opik/evaluation/threads/helpers.py +3 -2
  181. opik/evaluation/types.py +9 -1
  182. opik/exceptions.py +33 -0
  183. opik/file_upload/file_uploader.py +13 -0
  184. opik/file_upload/upload_options.py +2 -0
  185. opik/hooks/__init__.py +23 -0
  186. opik/hooks/anonymizer_hook.py +36 -0
  187. opik/hooks/httpx_client_hook.py +112 -0
  188. opik/httpx_client.py +12 -9
  189. opik/id_helpers.py +18 -0
  190. opik/integrations/adk/graph/subgraph_edges_builders.py +1 -2
  191. opik/integrations/adk/helpers.py +16 -7
  192. opik/integrations/adk/legacy_opik_tracer.py +7 -4
  193. opik/integrations/adk/opik_tracer.py +14 -1
  194. opik/integrations/adk/patchers/adk_otel_tracer/opik_adk_otel_tracer.py +7 -3
  195. opik/integrations/adk/recursive_callback_injector.py +4 -7
  196. opik/integrations/bedrock/converse/__init__.py +0 -0
  197. opik/integrations/bedrock/converse/chunks_aggregator.py +188 -0
  198. opik/integrations/bedrock/{converse_decorator.py → converse/converse_decorator.py} +4 -3
  199. opik/integrations/bedrock/invoke_agent_decorator.py +5 -4
  200. opik/integrations/bedrock/invoke_model/__init__.py +0 -0
  201. opik/integrations/bedrock/invoke_model/chunks_aggregator/__init__.py +78 -0
  202. opik/integrations/bedrock/invoke_model/chunks_aggregator/api.py +45 -0
  203. opik/integrations/bedrock/invoke_model/chunks_aggregator/base.py +23 -0
  204. opik/integrations/bedrock/invoke_model/chunks_aggregator/claude.py +121 -0
  205. opik/integrations/bedrock/invoke_model/chunks_aggregator/format_detector.py +107 -0
  206. opik/integrations/bedrock/invoke_model/chunks_aggregator/llama.py +108 -0
  207. opik/integrations/bedrock/invoke_model/chunks_aggregator/mistral.py +118 -0
  208. opik/integrations/bedrock/invoke_model/chunks_aggregator/nova.py +99 -0
  209. opik/integrations/bedrock/invoke_model/invoke_model_decorator.py +178 -0
  210. opik/integrations/bedrock/invoke_model/response_types.py +34 -0
  211. opik/integrations/bedrock/invoke_model/stream_wrappers.py +122 -0
  212. opik/integrations/bedrock/invoke_model/usage_converters.py +87 -0
  213. opik/integrations/bedrock/invoke_model/usage_extraction.py +108 -0
  214. opik/integrations/bedrock/opik_tracker.py +42 -4
  215. opik/integrations/bedrock/types.py +19 -0
  216. opik/integrations/crewai/crewai_decorator.py +8 -51
  217. opik/integrations/crewai/opik_tracker.py +31 -10
  218. opik/integrations/crewai/patchers/__init__.py +5 -0
  219. opik/integrations/crewai/patchers/flow.py +118 -0
  220. opik/integrations/crewai/patchers/litellm_completion.py +30 -0
  221. opik/integrations/crewai/patchers/llm_client.py +207 -0
  222. opik/integrations/dspy/callback.py +80 -17
  223. opik/integrations/dspy/parsers.py +168 -0
  224. opik/integrations/harbor/__init__.py +17 -0
  225. opik/integrations/harbor/experiment_service.py +269 -0
  226. opik/integrations/harbor/opik_tracker.py +528 -0
  227. opik/integrations/haystack/opik_connector.py +2 -2
  228. opik/integrations/haystack/opik_tracer.py +3 -7
  229. opik/integrations/langchain/__init__.py +3 -1
  230. opik/integrations/langchain/helpers.py +96 -0
  231. opik/integrations/langchain/langgraph_async_context_bridge.py +131 -0
  232. opik/integrations/langchain/langgraph_tracer_injector.py +88 -0
  233. opik/integrations/langchain/opik_encoder_extension.py +1 -1
  234. opik/integrations/langchain/opik_tracer.py +474 -229
  235. opik/integrations/litellm/__init__.py +5 -0
  236. opik/integrations/litellm/completion_chunks_aggregator.py +115 -0
  237. opik/integrations/litellm/litellm_completion_decorator.py +242 -0
  238. opik/integrations/litellm/opik_tracker.py +43 -0
  239. opik/integrations/litellm/stream_patchers.py +151 -0
  240. opik/integrations/llama_index/callback.py +146 -107
  241. opik/integrations/openai/agents/opik_tracing_processor.py +1 -2
  242. opik/integrations/openai/openai_chat_completions_decorator.py +2 -16
  243. opik/integrations/openai/opik_tracker.py +1 -1
  244. opik/integrations/sagemaker/auth.py +5 -1
  245. opik/llm_usage/google_usage.py +3 -1
  246. opik/llm_usage/opik_usage.py +7 -8
  247. opik/llm_usage/opik_usage_factory.py +4 -2
  248. opik/logging_messages.py +6 -0
  249. opik/message_processing/batching/base_batcher.py +14 -21
  250. opik/message_processing/batching/batch_manager.py +22 -10
  251. opik/message_processing/batching/batch_manager_constuctors.py +10 -0
  252. opik/message_processing/batching/batchers.py +59 -27
  253. opik/message_processing/batching/flushing_thread.py +0 -3
  254. opik/message_processing/emulation/__init__.py +0 -0
  255. opik/message_processing/emulation/emulator_message_processor.py +578 -0
  256. opik/message_processing/emulation/local_emulator_message_processor.py +140 -0
  257. opik/message_processing/emulation/models.py +162 -0
  258. opik/message_processing/encoder_helpers.py +79 -0
  259. opik/message_processing/messages.py +56 -1
  260. opik/message_processing/preprocessing/__init__.py +0 -0
  261. opik/message_processing/preprocessing/attachments_preprocessor.py +70 -0
  262. opik/message_processing/preprocessing/batching_preprocessor.py +53 -0
  263. opik/message_processing/preprocessing/constants.py +1 -0
  264. opik/message_processing/preprocessing/file_upload_preprocessor.py +38 -0
  265. opik/message_processing/preprocessing/preprocessor.py +36 -0
  266. opik/message_processing/processors/__init__.py +0 -0
  267. opik/message_processing/processors/attachments_extraction_processor.py +146 -0
  268. opik/message_processing/processors/message_processors.py +92 -0
  269. opik/message_processing/processors/message_processors_chain.py +96 -0
  270. opik/message_processing/{message_processors.py → processors/online_message_processor.py} +85 -29
  271. opik/message_processing/queue_consumer.py +9 -3
  272. opik/message_processing/streamer.py +71 -33
  273. opik/message_processing/streamer_constructors.py +43 -10
  274. opik/opik_context.py +16 -4
  275. opik/plugins/pytest/hooks.py +5 -3
  276. opik/rest_api/__init__.py +346 -15
  277. opik/rest_api/alerts/__init__.py +7 -0
  278. opik/rest_api/alerts/client.py +667 -0
  279. opik/rest_api/alerts/raw_client.py +1015 -0
  280. opik/rest_api/alerts/types/__init__.py +7 -0
  281. opik/rest_api/alerts/types/get_webhook_examples_request_alert_type.py +5 -0
  282. opik/rest_api/annotation_queues/__init__.py +4 -0
  283. opik/rest_api/annotation_queues/client.py +668 -0
  284. opik/rest_api/annotation_queues/raw_client.py +1019 -0
  285. opik/rest_api/automation_rule_evaluators/client.py +34 -2
  286. opik/rest_api/automation_rule_evaluators/raw_client.py +24 -0
  287. opik/rest_api/client.py +15 -0
  288. opik/rest_api/dashboards/__init__.py +4 -0
  289. opik/rest_api/dashboards/client.py +462 -0
  290. opik/rest_api/dashboards/raw_client.py +648 -0
  291. opik/rest_api/datasets/client.py +1310 -44
  292. opik/rest_api/datasets/raw_client.py +2269 -358
  293. opik/rest_api/experiments/__init__.py +2 -2
  294. opik/rest_api/experiments/client.py +191 -5
  295. opik/rest_api/experiments/raw_client.py +301 -7
  296. opik/rest_api/experiments/types/__init__.py +4 -1
  297. opik/rest_api/experiments/types/experiment_update_status.py +5 -0
  298. opik/rest_api/experiments/types/experiment_update_type.py +5 -0
  299. opik/rest_api/experiments/types/experiment_write_status.py +5 -0
  300. opik/rest_api/feedback_definitions/types/find_feedback_definitions_request_type.py +1 -1
  301. opik/rest_api/llm_provider_key/client.py +20 -0
  302. opik/rest_api/llm_provider_key/raw_client.py +20 -0
  303. opik/rest_api/llm_provider_key/types/provider_api_key_write_provider.py +1 -1
  304. opik/rest_api/manual_evaluation/__init__.py +4 -0
  305. opik/rest_api/manual_evaluation/client.py +347 -0
  306. opik/rest_api/manual_evaluation/raw_client.py +543 -0
  307. opik/rest_api/optimizations/client.py +145 -9
  308. opik/rest_api/optimizations/raw_client.py +237 -13
  309. opik/rest_api/optimizations/types/optimization_update_status.py +3 -1
  310. opik/rest_api/prompts/__init__.py +2 -2
  311. opik/rest_api/prompts/client.py +227 -6
  312. opik/rest_api/prompts/raw_client.py +331 -2
  313. opik/rest_api/prompts/types/__init__.py +3 -1
  314. opik/rest_api/prompts/types/create_prompt_version_detail_template_structure.py +5 -0
  315. opik/rest_api/prompts/types/prompt_write_template_structure.py +5 -0
  316. opik/rest_api/spans/__init__.py +0 -2
  317. opik/rest_api/spans/client.py +238 -76
  318. opik/rest_api/spans/raw_client.py +307 -95
  319. opik/rest_api/spans/types/__init__.py +0 -2
  320. opik/rest_api/traces/client.py +572 -161
  321. opik/rest_api/traces/raw_client.py +736 -229
  322. opik/rest_api/types/__init__.py +352 -17
  323. opik/rest_api/types/aggregation_data.py +1 -0
  324. opik/rest_api/types/alert.py +33 -0
  325. opik/rest_api/types/alert_alert_type.py +5 -0
  326. opik/rest_api/types/alert_page_public.py +24 -0
  327. opik/rest_api/types/alert_public.py +33 -0
  328. opik/rest_api/types/alert_public_alert_type.py +5 -0
  329. opik/rest_api/types/alert_trigger.py +27 -0
  330. opik/rest_api/types/alert_trigger_config.py +28 -0
  331. opik/rest_api/types/alert_trigger_config_public.py +28 -0
  332. opik/rest_api/types/alert_trigger_config_public_type.py +10 -0
  333. opik/rest_api/types/alert_trigger_config_type.py +10 -0
  334. opik/rest_api/types/alert_trigger_config_write.py +22 -0
  335. opik/rest_api/types/alert_trigger_config_write_type.py +10 -0
  336. opik/rest_api/types/alert_trigger_event_type.py +19 -0
  337. opik/rest_api/types/alert_trigger_public.py +27 -0
  338. opik/rest_api/types/alert_trigger_public_event_type.py +19 -0
  339. opik/rest_api/types/alert_trigger_write.py +23 -0
  340. opik/rest_api/types/alert_trigger_write_event_type.py +19 -0
  341. opik/rest_api/types/alert_write.py +28 -0
  342. opik/rest_api/types/alert_write_alert_type.py +5 -0
  343. opik/rest_api/types/annotation_queue.py +42 -0
  344. opik/rest_api/types/annotation_queue_batch.py +27 -0
  345. opik/rest_api/types/annotation_queue_item_ids.py +19 -0
  346. opik/rest_api/types/annotation_queue_page_public.py +28 -0
  347. opik/rest_api/types/annotation_queue_public.py +38 -0
  348. opik/rest_api/types/annotation_queue_public_scope.py +5 -0
  349. opik/rest_api/types/annotation_queue_reviewer.py +20 -0
  350. opik/rest_api/types/annotation_queue_reviewer_public.py +20 -0
  351. opik/rest_api/types/annotation_queue_scope.py +5 -0
  352. opik/rest_api/types/annotation_queue_write.py +31 -0
  353. opik/rest_api/types/annotation_queue_write_scope.py +5 -0
  354. opik/rest_api/types/audio_url.py +19 -0
  355. opik/rest_api/types/audio_url_public.py +19 -0
  356. opik/rest_api/types/audio_url_write.py +19 -0
  357. opik/rest_api/types/automation_rule_evaluator.py +62 -2
  358. opik/rest_api/types/automation_rule_evaluator_llm_as_judge.py +2 -0
  359. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_public.py +2 -0
  360. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_write.py +2 -0
  361. opik/rest_api/types/automation_rule_evaluator_object_object_public.py +155 -0
  362. opik/rest_api/types/automation_rule_evaluator_page_public.py +3 -2
  363. opik/rest_api/types/automation_rule_evaluator_public.py +57 -2
  364. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge.py +22 -0
  365. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_public.py +22 -0
  366. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_write.py +22 -0
  367. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python.py +22 -0
  368. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_public.py +22 -0
  369. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_write.py +22 -0
  370. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge.py +2 -0
  371. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_public.py +2 -0
  372. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_write.py +2 -0
  373. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python.py +2 -0
  374. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_public.py +2 -0
  375. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_write.py +2 -0
  376. opik/rest_api/types/automation_rule_evaluator_update.py +51 -1
  377. opik/rest_api/types/automation_rule_evaluator_update_llm_as_judge.py +2 -0
  378. opik/rest_api/types/automation_rule_evaluator_update_span_llm_as_judge.py +22 -0
  379. opik/rest_api/types/automation_rule_evaluator_update_span_user_defined_metric_python.py +22 -0
  380. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_llm_as_judge.py +2 -0
  381. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_user_defined_metric_python.py +2 -0
  382. opik/rest_api/types/automation_rule_evaluator_update_user_defined_metric_python.py +2 -0
  383. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python.py +2 -0
  384. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_public.py +2 -0
  385. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_write.py +2 -0
  386. opik/rest_api/types/automation_rule_evaluator_write.py +51 -1
  387. opik/rest_api/types/boolean_feedback_definition.py +25 -0
  388. opik/rest_api/types/boolean_feedback_definition_create.py +20 -0
  389. opik/rest_api/types/boolean_feedback_definition_public.py +25 -0
  390. opik/rest_api/types/boolean_feedback_definition_update.py +20 -0
  391. opik/rest_api/types/boolean_feedback_detail.py +29 -0
  392. opik/rest_api/types/boolean_feedback_detail_create.py +29 -0
  393. opik/rest_api/types/boolean_feedback_detail_public.py +29 -0
  394. opik/rest_api/types/boolean_feedback_detail_update.py +29 -0
  395. opik/rest_api/types/dashboard_page_public.py +24 -0
  396. opik/rest_api/types/dashboard_public.py +30 -0
  397. opik/rest_api/types/dataset.py +4 -0
  398. opik/rest_api/types/dataset_expansion.py +42 -0
  399. opik/rest_api/types/dataset_expansion_response.py +39 -0
  400. opik/rest_api/types/dataset_item.py +2 -0
  401. opik/rest_api/types/dataset_item_changes_public.py +5 -0
  402. opik/rest_api/types/dataset_item_compare.py +2 -0
  403. opik/rest_api/types/dataset_item_filter.py +27 -0
  404. opik/rest_api/types/dataset_item_filter_operator.py +21 -0
  405. opik/rest_api/types/dataset_item_page_compare.py +5 -0
  406. opik/rest_api/types/dataset_item_page_public.py +5 -0
  407. opik/rest_api/types/dataset_item_public.py +2 -0
  408. opik/rest_api/types/dataset_item_update.py +39 -0
  409. opik/rest_api/types/dataset_item_write.py +1 -0
  410. opik/rest_api/types/dataset_public.py +4 -0
  411. opik/rest_api/types/dataset_public_status.py +5 -0
  412. opik/rest_api/types/dataset_status.py +5 -0
  413. opik/rest_api/types/dataset_version_diff.py +22 -0
  414. opik/rest_api/types/dataset_version_diff_stats.py +24 -0
  415. opik/rest_api/types/dataset_version_page_public.py +23 -0
  416. opik/rest_api/types/dataset_version_public.py +59 -0
  417. opik/rest_api/types/dataset_version_summary.py +46 -0
  418. opik/rest_api/types/dataset_version_summary_public.py +46 -0
  419. opik/rest_api/types/experiment.py +7 -2
  420. opik/rest_api/types/experiment_group_response.py +2 -0
  421. opik/rest_api/types/experiment_public.py +7 -2
  422. opik/rest_api/types/experiment_public_status.py +5 -0
  423. opik/rest_api/types/experiment_score.py +20 -0
  424. opik/rest_api/types/experiment_score_public.py +20 -0
  425. opik/rest_api/types/experiment_score_write.py +20 -0
  426. opik/rest_api/types/experiment_status.py +5 -0
  427. opik/rest_api/types/feedback.py +25 -1
  428. opik/rest_api/types/feedback_create.py +20 -1
  429. opik/rest_api/types/feedback_object_public.py +27 -1
  430. opik/rest_api/types/feedback_public.py +25 -1
  431. opik/rest_api/types/feedback_score_batch_item.py +2 -1
  432. opik/rest_api/types/feedback_score_batch_item_thread.py +2 -1
  433. opik/rest_api/types/feedback_score_public.py +4 -0
  434. opik/rest_api/types/feedback_update.py +20 -1
  435. opik/rest_api/types/group_content_with_aggregations.py +1 -0
  436. opik/rest_api/types/group_detail.py +19 -0
  437. opik/rest_api/types/group_details.py +20 -0
  438. opik/rest_api/types/guardrail.py +1 -0
  439. opik/rest_api/types/guardrail_write.py +1 -0
  440. opik/rest_api/types/ids_holder.py +19 -0
  441. opik/rest_api/types/image_url.py +20 -0
  442. opik/rest_api/types/image_url_public.py +20 -0
  443. opik/rest_api/types/image_url_write.py +20 -0
  444. opik/rest_api/types/llm_as_judge_message.py +5 -1
  445. opik/rest_api/types/llm_as_judge_message_content.py +26 -0
  446. opik/rest_api/types/llm_as_judge_message_content_public.py +26 -0
  447. opik/rest_api/types/llm_as_judge_message_content_write.py +26 -0
  448. opik/rest_api/types/llm_as_judge_message_public.py +5 -1
  449. opik/rest_api/types/llm_as_judge_message_write.py +5 -1
  450. opik/rest_api/types/llm_as_judge_model_parameters.py +3 -0
  451. opik/rest_api/types/llm_as_judge_model_parameters_public.py +3 -0
  452. opik/rest_api/types/llm_as_judge_model_parameters_write.py +3 -0
  453. opik/rest_api/types/manual_evaluation_request.py +38 -0
  454. opik/rest_api/types/manual_evaluation_request_entity_type.py +5 -0
  455. opik/rest_api/types/manual_evaluation_response.py +27 -0
  456. opik/rest_api/types/optimization.py +4 -2
  457. opik/rest_api/types/optimization_public.py +4 -2
  458. opik/rest_api/types/optimization_public_status.py +3 -1
  459. opik/rest_api/types/optimization_status.py +3 -1
  460. opik/rest_api/types/optimization_studio_config.py +27 -0
  461. opik/rest_api/types/optimization_studio_config_public.py +27 -0
  462. opik/rest_api/types/optimization_studio_config_write.py +27 -0
  463. opik/rest_api/types/optimization_studio_log.py +22 -0
  464. opik/rest_api/types/optimization_write.py +4 -2
  465. opik/rest_api/types/optimization_write_status.py +3 -1
  466. opik/rest_api/types/project.py +1 -0
  467. opik/rest_api/types/project_detailed.py +1 -0
  468. opik/rest_api/types/project_reference.py +31 -0
  469. opik/rest_api/types/project_reference_public.py +31 -0
  470. opik/rest_api/types/project_stats_summary_item.py +1 -0
  471. opik/rest_api/types/prompt.py +6 -0
  472. opik/rest_api/types/prompt_detail.py +6 -0
  473. opik/rest_api/types/prompt_detail_template_structure.py +5 -0
  474. opik/rest_api/types/prompt_public.py +6 -0
  475. opik/rest_api/types/prompt_public_template_structure.py +5 -0
  476. opik/rest_api/types/prompt_template_structure.py +5 -0
  477. opik/rest_api/types/prompt_version.py +3 -0
  478. opik/rest_api/types/prompt_version_detail.py +3 -0
  479. opik/rest_api/types/prompt_version_detail_template_structure.py +5 -0
  480. opik/rest_api/types/prompt_version_link.py +1 -0
  481. opik/rest_api/types/prompt_version_link_public.py +1 -0
  482. opik/rest_api/types/prompt_version_page_public.py +5 -0
  483. opik/rest_api/types/prompt_version_public.py +3 -0
  484. opik/rest_api/types/prompt_version_public_template_structure.py +5 -0
  485. opik/rest_api/types/prompt_version_template_structure.py +5 -0
  486. opik/rest_api/types/prompt_version_update.py +33 -0
  487. opik/rest_api/types/provider_api_key.py +9 -0
  488. opik/rest_api/types/provider_api_key_provider.py +1 -1
  489. opik/rest_api/types/provider_api_key_public.py +9 -0
  490. opik/rest_api/types/provider_api_key_public_provider.py +1 -1
  491. opik/rest_api/types/score_name.py +1 -0
  492. opik/rest_api/types/service_toggles_config.py +18 -0
  493. opik/rest_api/types/span.py +1 -2
  494. opik/rest_api/types/span_enrichment_options.py +31 -0
  495. opik/rest_api/types/span_experiment_item_bulk_write_view.py +1 -2
  496. opik/rest_api/types/span_filter.py +23 -0
  497. opik/rest_api/types/span_filter_operator.py +21 -0
  498. opik/rest_api/types/span_filter_write.py +23 -0
  499. opik/rest_api/types/span_filter_write_operator.py +21 -0
  500. opik/rest_api/types/span_llm_as_judge_code.py +27 -0
  501. opik/rest_api/types/span_llm_as_judge_code_public.py +27 -0
  502. opik/rest_api/types/span_llm_as_judge_code_write.py +27 -0
  503. opik/rest_api/types/span_public.py +1 -2
  504. opik/rest_api/types/span_update.py +46 -0
  505. opik/rest_api/types/span_user_defined_metric_python_code.py +20 -0
  506. opik/rest_api/types/span_user_defined_metric_python_code_public.py +20 -0
  507. opik/rest_api/types/span_user_defined_metric_python_code_write.py +20 -0
  508. opik/rest_api/types/span_write.py +1 -2
  509. opik/rest_api/types/studio_evaluation.py +20 -0
  510. opik/rest_api/types/studio_evaluation_public.py +20 -0
  511. opik/rest_api/types/studio_evaluation_write.py +20 -0
  512. opik/rest_api/types/studio_llm_model.py +21 -0
  513. opik/rest_api/types/studio_llm_model_public.py +21 -0
  514. opik/rest_api/types/studio_llm_model_write.py +21 -0
  515. opik/rest_api/types/studio_message.py +20 -0
  516. opik/rest_api/types/studio_message_public.py +20 -0
  517. opik/rest_api/types/studio_message_write.py +20 -0
  518. opik/rest_api/types/studio_metric.py +21 -0
  519. opik/rest_api/types/studio_metric_public.py +21 -0
  520. opik/rest_api/types/studio_metric_write.py +21 -0
  521. opik/rest_api/types/studio_optimizer.py +21 -0
  522. opik/rest_api/types/studio_optimizer_public.py +21 -0
  523. opik/rest_api/types/studio_optimizer_write.py +21 -0
  524. opik/rest_api/types/studio_prompt.py +20 -0
  525. opik/rest_api/types/studio_prompt_public.py +20 -0
  526. opik/rest_api/types/studio_prompt_write.py +20 -0
  527. opik/rest_api/types/trace.py +11 -2
  528. opik/rest_api/types/trace_enrichment_options.py +32 -0
  529. opik/rest_api/types/trace_experiment_item_bulk_write_view.py +1 -2
  530. opik/rest_api/types/trace_filter.py +23 -0
  531. opik/rest_api/types/trace_filter_operator.py +21 -0
  532. opik/rest_api/types/trace_filter_write.py +23 -0
  533. opik/rest_api/types/trace_filter_write_operator.py +21 -0
  534. opik/rest_api/types/trace_public.py +11 -2
  535. opik/rest_api/types/trace_thread_filter_write.py +23 -0
  536. opik/rest_api/types/trace_thread_filter_write_operator.py +21 -0
  537. opik/rest_api/types/trace_thread_identifier.py +1 -0
  538. opik/rest_api/types/trace_update.py +39 -0
  539. opik/rest_api/types/trace_write.py +1 -2
  540. opik/rest_api/types/value_entry.py +2 -0
  541. opik/rest_api/types/value_entry_compare.py +2 -0
  542. opik/rest_api/types/value_entry_experiment_item_bulk_write_view.py +2 -0
  543. opik/rest_api/types/value_entry_public.py +2 -0
  544. opik/rest_api/types/video_url.py +19 -0
  545. opik/rest_api/types/video_url_public.py +19 -0
  546. opik/rest_api/types/video_url_write.py +19 -0
  547. opik/rest_api/types/webhook.py +28 -0
  548. opik/rest_api/types/webhook_examples.py +19 -0
  549. opik/rest_api/types/webhook_public.py +28 -0
  550. opik/rest_api/types/webhook_test_result.py +23 -0
  551. opik/rest_api/types/webhook_test_result_status.py +5 -0
  552. opik/rest_api/types/webhook_write.py +23 -0
  553. opik/rest_api/types/welcome_wizard_tracking.py +22 -0
  554. opik/rest_api/types/workspace_configuration.py +5 -0
  555. opik/rest_api/welcome_wizard/__init__.py +4 -0
  556. opik/rest_api/welcome_wizard/client.py +195 -0
  557. opik/rest_api/welcome_wizard/raw_client.py +208 -0
  558. opik/rest_api/workspaces/client.py +14 -2
  559. opik/rest_api/workspaces/raw_client.py +10 -0
  560. opik/s3_httpx_client.py +14 -1
  561. opik/simulation/__init__.py +6 -0
  562. opik/simulation/simulated_user.py +99 -0
  563. opik/simulation/simulator.py +108 -0
  564. opik/synchronization.py +5 -6
  565. opik/{decorator/tracing_runtime_config.py → tracing_runtime_config.py} +6 -7
  566. opik/types.py +36 -0
  567. opik/validation/chat_prompt_messages.py +241 -0
  568. opik/validation/feedback_score.py +3 -3
  569. opik/validation/validator.py +28 -0
  570. opik-1.9.71.dist-info/METADATA +370 -0
  571. opik-1.9.71.dist-info/RECORD +1110 -0
  572. opik/api_objects/prompt/prompt.py +0 -112
  573. opik/cli.py +0 -193
  574. opik/hooks.py +0 -13
  575. opik/integrations/bedrock/chunks_aggregator.py +0 -55
  576. opik/integrations/bedrock/helpers.py +0 -8
  577. opik/rest_api/types/automation_rule_evaluator_object_public.py +0 -100
  578. opik/rest_api/types/json_node_experiment_item_bulk_write_view.py +0 -5
  579. opik-1.8.39.dist-info/METADATA +0 -339
  580. opik-1.8.39.dist-info/RECORD +0 -790
  581. /opik/{evaluation/metrics/conversation/conversational_coherence → decorator/context_manager}/__init__.py +0 -0
  582. /opik/evaluation/metrics/conversation/{session_completeness → llm_judges/conversational_coherence}/__init__.py +0 -0
  583. /opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/schema.py +0 -0
  584. /opik/evaluation/metrics/conversation/{user_frustration → llm_judges/session_completeness}/__init__.py +0 -0
  585. /opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/schema.py +0 -0
  586. /opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/schema.py +0 -0
  587. /opik/integrations/bedrock/{stream_wrappers.py → converse/stream_wrappers.py} +0 -0
  588. /opik/rest_api/{spans/types → types}/span_update_type.py +0 -0
  589. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/WHEEL +0 -0
  590. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/entry_points.txt +0 -0
  591. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/licenses/LICENSE +0 -0
  592. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/top_level.txt +0 -0
@@ -7,6 +7,7 @@ from json.decoder import JSONDecodeError
7
7
 
8
8
  from ..core.api_error import ApiError
9
9
  from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
10
+ from ..core.datetime_utils import serialize_datetime
10
11
  from ..core.http_response import AsyncHttpResponse, HttpResponse
11
12
  from ..core.jsonable_encoder import jsonable_encoder
12
13
  from ..core.pydantic_utilities import parse_obj_as
@@ -23,12 +24,12 @@ from ..types.feedback_score_batch_item import FeedbackScoreBatchItem
23
24
  from ..types.feedback_score_source import FeedbackScoreSource
24
25
  from ..types.json_list_string import JsonListString
25
26
  from ..types.json_list_string_write import JsonListStringWrite
26
- from ..types.json_node import JsonNode
27
- from ..types.json_node_write import JsonNodeWrite
28
27
  from ..types.project_stats_public import ProjectStatsPublic
29
28
  from ..types.span_filter_public import SpanFilterPublic
30
29
  from ..types.span_page_public import SpanPagePublic
31
30
  from ..types.span_public import SpanPublic
31
+ from ..types.span_update import SpanUpdate
32
+ from ..types.span_update_type import SpanUpdateType
32
33
  from ..types.span_write import SpanWrite
33
34
  from ..types.span_write_type import SpanWriteType
34
35
  from ..types.value_entry import ValueEntry
@@ -36,7 +37,6 @@ from .types.find_feedback_score_names_1_request_type import FindFeedbackScoreNam
36
37
  from .types.get_span_stats_request_type import GetSpanStatsRequestType
37
38
  from .types.get_spans_by_project_request_type import GetSpansByProjectRequestType
38
39
  from .types.span_search_stream_request_public_type import SpanSearchStreamRequestPublicType
39
- from .types.span_update_type import SpanUpdateType
40
40
 
41
41
  # this is used as the default value for optional parameters
42
42
  OMIT = typing.cast(typing.Any, ...)
@@ -190,6 +190,108 @@ class RawSpansClient:
190
190
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
191
191
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
192
192
 
193
+ def create_spans(
194
+ self, *, spans: typing.Sequence[SpanWrite], request_options: typing.Optional[RequestOptions] = None
195
+ ) -> HttpResponse[None]:
196
+ """
197
+ Create spans
198
+
199
+ Parameters
200
+ ----------
201
+ spans : typing.Sequence[SpanWrite]
202
+
203
+ request_options : typing.Optional[RequestOptions]
204
+ Request-specific configuration.
205
+
206
+ Returns
207
+ -------
208
+ HttpResponse[None]
209
+ """
210
+ _response = self._client_wrapper.httpx_client.request(
211
+ "v1/private/spans/batch",
212
+ method="POST",
213
+ json={
214
+ "spans": convert_and_respect_annotation_metadata(
215
+ object_=spans, annotation=typing.Sequence[SpanWrite], direction="write"
216
+ ),
217
+ },
218
+ headers={
219
+ "content-type": "application/json",
220
+ },
221
+ request_options=request_options,
222
+ omit=OMIT,
223
+ )
224
+ try:
225
+ if 200 <= _response.status_code < 300:
226
+ return HttpResponse(response=_response, data=None)
227
+ _response_json = _response.json()
228
+ except JSONDecodeError:
229
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
230
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
231
+
232
+ def batch_update_spans(
233
+ self,
234
+ *,
235
+ ids: typing.Sequence[str],
236
+ update: SpanUpdate,
237
+ merge_tags: typing.Optional[bool] = OMIT,
238
+ request_options: typing.Optional[RequestOptions] = None,
239
+ ) -> HttpResponse[None]:
240
+ """
241
+ Update multiple spans
242
+
243
+ Parameters
244
+ ----------
245
+ ids : typing.Sequence[str]
246
+ List of span IDs to update (max 1000)
247
+
248
+ update : SpanUpdate
249
+
250
+ merge_tags : typing.Optional[bool]
251
+ If true, merge tags with existing tags instead of replacing them. Default: false
252
+
253
+ request_options : typing.Optional[RequestOptions]
254
+ Request-specific configuration.
255
+
256
+ Returns
257
+ -------
258
+ HttpResponse[None]
259
+ """
260
+ _response = self._client_wrapper.httpx_client.request(
261
+ "v1/private/spans/batch",
262
+ method="PATCH",
263
+ json={
264
+ "ids": ids,
265
+ "update": convert_and_respect_annotation_metadata(
266
+ object_=update, annotation=SpanUpdate, direction="write"
267
+ ),
268
+ "merge_tags": merge_tags,
269
+ },
270
+ headers={
271
+ "content-type": "application/json",
272
+ },
273
+ request_options=request_options,
274
+ omit=OMIT,
275
+ )
276
+ try:
277
+ if 200 <= _response.status_code < 300:
278
+ return HttpResponse(response=_response, data=None)
279
+ if _response.status_code == 400:
280
+ raise BadRequestError(
281
+ headers=dict(_response.headers),
282
+ body=typing.cast(
283
+ typing.Optional[typing.Any],
284
+ parse_obj_as(
285
+ type_=typing.Optional[typing.Any], # type: ignore
286
+ object_=_response.json(),
287
+ ),
288
+ ),
289
+ )
290
+ _response_json = _response.json()
291
+ except JSONDecodeError:
292
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
293
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
294
+
193
295
  def get_spans_by_project(
194
296
  self,
195
297
  *,
@@ -201,8 +303,11 @@ class RawSpansClient:
201
303
  type: typing.Optional[GetSpansByProjectRequestType] = None,
202
304
  filters: typing.Optional[str] = None,
203
305
  truncate: typing.Optional[bool] = None,
306
+ strip_attachments: typing.Optional[bool] = None,
204
307
  sorting: typing.Optional[str] = None,
205
308
  exclude: typing.Optional[str] = None,
309
+ from_time: typing.Optional[dt.datetime] = None,
310
+ to_time: typing.Optional[dt.datetime] = None,
206
311
  request_options: typing.Optional[RequestOptions] = None,
207
312
  ) -> HttpResponse[SpanPagePublic]:
208
313
  """
@@ -226,10 +331,16 @@ class RawSpansClient:
226
331
 
227
332
  truncate : typing.Optional[bool]
228
333
 
334
+ strip_attachments : typing.Optional[bool]
335
+
229
336
  sorting : typing.Optional[str]
230
337
 
231
338
  exclude : typing.Optional[str]
232
339
 
340
+ from_time : typing.Optional[dt.datetime]
341
+
342
+ to_time : typing.Optional[dt.datetime]
343
+
233
344
  request_options : typing.Optional[RequestOptions]
234
345
  Request-specific configuration.
235
346
 
@@ -250,8 +361,11 @@ class RawSpansClient:
250
361
  "type": type,
251
362
  "filters": filters,
252
363
  "truncate": truncate,
364
+ "strip_attachments": strip_attachments,
253
365
  "sorting": sorting,
254
366
  "exclude": exclude,
367
+ "from_time": serialize_datetime(from_time) if from_time is not None else None,
368
+ "to_time": serialize_datetime(to_time) if to_time is not None else None,
255
369
  },
256
370
  request_options=request_options,
257
371
  )
@@ -283,7 +397,7 @@ class RawSpansClient:
283
397
  end_time: typing.Optional[dt.datetime] = OMIT,
284
398
  input: typing.Optional[JsonListStringWrite] = OMIT,
285
399
  output: typing.Optional[JsonListStringWrite] = OMIT,
286
- metadata: typing.Optional[JsonNodeWrite] = OMIT,
400
+ metadata: typing.Optional[JsonListStringWrite] = OMIT,
287
401
  model: typing.Optional[str] = OMIT,
288
402
  provider: typing.Optional[str] = OMIT,
289
403
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
@@ -320,7 +434,7 @@ class RawSpansClient:
320
434
 
321
435
  output : typing.Optional[JsonListStringWrite]
322
436
 
323
- metadata : typing.Optional[JsonNodeWrite]
437
+ metadata : typing.Optional[JsonListStringWrite]
324
438
 
325
439
  model : typing.Optional[str]
326
440
 
@@ -363,7 +477,9 @@ class RawSpansClient:
363
477
  "output": convert_and_respect_annotation_metadata(
364
478
  object_=output, annotation=JsonListStringWrite, direction="write"
365
479
  ),
366
- "metadata": metadata,
480
+ "metadata": convert_and_respect_annotation_metadata(
481
+ object_=metadata, annotation=JsonListStringWrite, direction="write"
482
+ ),
367
483
  "model": model,
368
484
  "provider": provider,
369
485
  "tags": tags,
@@ -400,47 +516,12 @@ class RawSpansClient:
400
516
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
401
517
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
402
518
 
403
- def create_spans(
404
- self, *, spans: typing.Sequence[SpanWrite], request_options: typing.Optional[RequestOptions] = None
405
- ) -> HttpResponse[None]:
406
- """
407
- Create spans
408
-
409
- Parameters
410
- ----------
411
- spans : typing.Sequence[SpanWrite]
412
-
413
- request_options : typing.Optional[RequestOptions]
414
- Request-specific configuration.
415
-
416
- Returns
417
- -------
418
- HttpResponse[None]
419
- """
420
- _response = self._client_wrapper.httpx_client.request(
421
- "v1/private/spans/batch",
422
- method="POST",
423
- json={
424
- "spans": convert_and_respect_annotation_metadata(
425
- object_=spans, annotation=typing.Sequence[SpanWrite], direction="write"
426
- ),
427
- },
428
- headers={
429
- "content-type": "application/json",
430
- },
431
- request_options=request_options,
432
- omit=OMIT,
433
- )
434
- try:
435
- if 200 <= _response.status_code < 300:
436
- return HttpResponse(response=_response, data=None)
437
- _response_json = _response.json()
438
- except JSONDecodeError:
439
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
440
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
441
-
442
519
  def get_span_by_id(
443
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
520
+ self,
521
+ id: str,
522
+ *,
523
+ strip_attachments: typing.Optional[bool] = None,
524
+ request_options: typing.Optional[RequestOptions] = None,
444
525
  ) -> HttpResponse[SpanPublic]:
445
526
  """
446
527
  Get span by id
@@ -449,6 +530,8 @@ class RawSpansClient:
449
530
  ----------
450
531
  id : str
451
532
 
533
+ strip_attachments : typing.Optional[bool]
534
+
452
535
  request_options : typing.Optional[RequestOptions]
453
536
  Request-specific configuration.
454
537
 
@@ -460,6 +543,9 @@ class RawSpansClient:
460
543
  _response = self._client_wrapper.httpx_client.request(
461
544
  f"v1/private/spans/{jsonable_encoder(id)}",
462
545
  method="GET",
546
+ params={
547
+ "strip_attachments": strip_attachments,
548
+ },
463
549
  request_options=request_options,
464
550
  )
465
551
  try:
@@ -542,7 +628,7 @@ class RawSpansClient:
542
628
  end_time: typing.Optional[dt.datetime] = OMIT,
543
629
  input: typing.Optional[JsonListString] = OMIT,
544
630
  output: typing.Optional[JsonListString] = OMIT,
545
- metadata: typing.Optional[JsonNode] = OMIT,
631
+ metadata: typing.Optional[JsonListString] = OMIT,
546
632
  model: typing.Optional[str] = OMIT,
547
633
  provider: typing.Optional[str] = OMIT,
548
634
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
@@ -578,7 +664,7 @@ class RawSpansClient:
578
664
 
579
665
  output : typing.Optional[JsonListString]
580
666
 
581
- metadata : typing.Optional[JsonNode]
667
+ metadata : typing.Optional[JsonListString]
582
668
 
583
669
  model : typing.Optional[str]
584
670
 
@@ -616,7 +702,9 @@ class RawSpansClient:
616
702
  "output": convert_and_respect_annotation_metadata(
617
703
  object_=output, annotation=JsonListString, direction="write"
618
704
  ),
619
- "metadata": metadata,
705
+ "metadata": convert_and_respect_annotation_metadata(
706
+ object_=metadata, annotation=JsonListString, direction="write"
707
+ ),
620
708
  "model": model,
621
709
  "provider": provider,
622
710
  "tags": tags,
@@ -842,6 +930,8 @@ class RawSpansClient:
842
930
  trace_id: typing.Optional[str] = None,
843
931
  type: typing.Optional[GetSpanStatsRequestType] = None,
844
932
  filters: typing.Optional[str] = None,
933
+ from_time: typing.Optional[dt.datetime] = None,
934
+ to_time: typing.Optional[dt.datetime] = None,
845
935
  request_options: typing.Optional[RequestOptions] = None,
846
936
  ) -> HttpResponse[ProjectStatsPublic]:
847
937
  """
@@ -859,6 +949,10 @@ class RawSpansClient:
859
949
 
860
950
  filters : typing.Optional[str]
861
951
 
952
+ from_time : typing.Optional[dt.datetime]
953
+
954
+ to_time : typing.Optional[dt.datetime]
955
+
862
956
  request_options : typing.Optional[RequestOptions]
863
957
  Request-specific configuration.
864
958
 
@@ -876,6 +970,8 @@ class RawSpansClient:
876
970
  "trace_id": trace_id,
877
971
  "type": type,
878
972
  "filters": filters,
973
+ "from_time": serialize_datetime(from_time) if from_time is not None else None,
974
+ "to_time": serialize_datetime(to_time) if to_time is not None else None,
879
975
  },
880
976
  request_options=request_options,
881
977
  )
@@ -948,6 +1044,8 @@ class RawSpansClient:
948
1044
  limit: typing.Optional[int] = OMIT,
949
1045
  last_retrieved_id: typing.Optional[str] = OMIT,
950
1046
  truncate: typing.Optional[bool] = OMIT,
1047
+ from_time: typing.Optional[dt.datetime] = OMIT,
1048
+ to_time: typing.Optional[dt.datetime] = OMIT,
951
1049
  request_options: typing.Optional[RequestOptions] = None,
952
1050
  ) -> typing.Iterator[HttpResponse[typing.Iterator[bytes]]]:
953
1051
  """
@@ -973,6 +1071,12 @@ class RawSpansClient:
973
1071
  truncate : typing.Optional[bool]
974
1072
  Truncate image included in either input, output or metadata
975
1073
 
1074
+ from_time : typing.Optional[dt.datetime]
1075
+ Filter spans created from this time (ISO-8601 format).
1076
+
1077
+ to_time : typing.Optional[dt.datetime]
1078
+ Filter spans created up to this time (ISO-8601 format). If not provided, defaults to current time. Must be after 'from_time'.
1079
+
976
1080
  request_options : typing.Optional[RequestOptions]
977
1081
  Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
978
1082
 
@@ -995,6 +1099,8 @@ class RawSpansClient:
995
1099
  "limit": limit,
996
1100
  "last_retrieved_id": last_retrieved_id,
997
1101
  "truncate": truncate,
1102
+ "from_time": from_time,
1103
+ "to_time": to_time,
998
1104
  },
999
1105
  headers={
1000
1106
  "content-type": "application/json",
@@ -1254,6 +1360,108 @@ class AsyncRawSpansClient:
1254
1360
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1255
1361
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1256
1362
 
1363
+ async def create_spans(
1364
+ self, *, spans: typing.Sequence[SpanWrite], request_options: typing.Optional[RequestOptions] = None
1365
+ ) -> AsyncHttpResponse[None]:
1366
+ """
1367
+ Create spans
1368
+
1369
+ Parameters
1370
+ ----------
1371
+ spans : typing.Sequence[SpanWrite]
1372
+
1373
+ request_options : typing.Optional[RequestOptions]
1374
+ Request-specific configuration.
1375
+
1376
+ Returns
1377
+ -------
1378
+ AsyncHttpResponse[None]
1379
+ """
1380
+ _response = await self._client_wrapper.httpx_client.request(
1381
+ "v1/private/spans/batch",
1382
+ method="POST",
1383
+ json={
1384
+ "spans": convert_and_respect_annotation_metadata(
1385
+ object_=spans, annotation=typing.Sequence[SpanWrite], direction="write"
1386
+ ),
1387
+ },
1388
+ headers={
1389
+ "content-type": "application/json",
1390
+ },
1391
+ request_options=request_options,
1392
+ omit=OMIT,
1393
+ )
1394
+ try:
1395
+ if 200 <= _response.status_code < 300:
1396
+ return AsyncHttpResponse(response=_response, data=None)
1397
+ _response_json = _response.json()
1398
+ except JSONDecodeError:
1399
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1400
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1401
+
1402
+ async def batch_update_spans(
1403
+ self,
1404
+ *,
1405
+ ids: typing.Sequence[str],
1406
+ update: SpanUpdate,
1407
+ merge_tags: typing.Optional[bool] = OMIT,
1408
+ request_options: typing.Optional[RequestOptions] = None,
1409
+ ) -> AsyncHttpResponse[None]:
1410
+ """
1411
+ Update multiple spans
1412
+
1413
+ Parameters
1414
+ ----------
1415
+ ids : typing.Sequence[str]
1416
+ List of span IDs to update (max 1000)
1417
+
1418
+ update : SpanUpdate
1419
+
1420
+ merge_tags : typing.Optional[bool]
1421
+ If true, merge tags with existing tags instead of replacing them. Default: false
1422
+
1423
+ request_options : typing.Optional[RequestOptions]
1424
+ Request-specific configuration.
1425
+
1426
+ Returns
1427
+ -------
1428
+ AsyncHttpResponse[None]
1429
+ """
1430
+ _response = await self._client_wrapper.httpx_client.request(
1431
+ "v1/private/spans/batch",
1432
+ method="PATCH",
1433
+ json={
1434
+ "ids": ids,
1435
+ "update": convert_and_respect_annotation_metadata(
1436
+ object_=update, annotation=SpanUpdate, direction="write"
1437
+ ),
1438
+ "merge_tags": merge_tags,
1439
+ },
1440
+ headers={
1441
+ "content-type": "application/json",
1442
+ },
1443
+ request_options=request_options,
1444
+ omit=OMIT,
1445
+ )
1446
+ try:
1447
+ if 200 <= _response.status_code < 300:
1448
+ return AsyncHttpResponse(response=_response, data=None)
1449
+ if _response.status_code == 400:
1450
+ raise BadRequestError(
1451
+ headers=dict(_response.headers),
1452
+ body=typing.cast(
1453
+ typing.Optional[typing.Any],
1454
+ parse_obj_as(
1455
+ type_=typing.Optional[typing.Any], # type: ignore
1456
+ object_=_response.json(),
1457
+ ),
1458
+ ),
1459
+ )
1460
+ _response_json = _response.json()
1461
+ except JSONDecodeError:
1462
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1463
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1464
+
1257
1465
  async def get_spans_by_project(
1258
1466
  self,
1259
1467
  *,
@@ -1265,8 +1473,11 @@ class AsyncRawSpansClient:
1265
1473
  type: typing.Optional[GetSpansByProjectRequestType] = None,
1266
1474
  filters: typing.Optional[str] = None,
1267
1475
  truncate: typing.Optional[bool] = None,
1476
+ strip_attachments: typing.Optional[bool] = None,
1268
1477
  sorting: typing.Optional[str] = None,
1269
1478
  exclude: typing.Optional[str] = None,
1479
+ from_time: typing.Optional[dt.datetime] = None,
1480
+ to_time: typing.Optional[dt.datetime] = None,
1270
1481
  request_options: typing.Optional[RequestOptions] = None,
1271
1482
  ) -> AsyncHttpResponse[SpanPagePublic]:
1272
1483
  """
@@ -1290,10 +1501,16 @@ class AsyncRawSpansClient:
1290
1501
 
1291
1502
  truncate : typing.Optional[bool]
1292
1503
 
1504
+ strip_attachments : typing.Optional[bool]
1505
+
1293
1506
  sorting : typing.Optional[str]
1294
1507
 
1295
1508
  exclude : typing.Optional[str]
1296
1509
 
1510
+ from_time : typing.Optional[dt.datetime]
1511
+
1512
+ to_time : typing.Optional[dt.datetime]
1513
+
1297
1514
  request_options : typing.Optional[RequestOptions]
1298
1515
  Request-specific configuration.
1299
1516
 
@@ -1314,8 +1531,11 @@ class AsyncRawSpansClient:
1314
1531
  "type": type,
1315
1532
  "filters": filters,
1316
1533
  "truncate": truncate,
1534
+ "strip_attachments": strip_attachments,
1317
1535
  "sorting": sorting,
1318
1536
  "exclude": exclude,
1537
+ "from_time": serialize_datetime(from_time) if from_time is not None else None,
1538
+ "to_time": serialize_datetime(to_time) if to_time is not None else None,
1319
1539
  },
1320
1540
  request_options=request_options,
1321
1541
  )
@@ -1347,7 +1567,7 @@ class AsyncRawSpansClient:
1347
1567
  end_time: typing.Optional[dt.datetime] = OMIT,
1348
1568
  input: typing.Optional[JsonListStringWrite] = OMIT,
1349
1569
  output: typing.Optional[JsonListStringWrite] = OMIT,
1350
- metadata: typing.Optional[JsonNodeWrite] = OMIT,
1570
+ metadata: typing.Optional[JsonListStringWrite] = OMIT,
1351
1571
  model: typing.Optional[str] = OMIT,
1352
1572
  provider: typing.Optional[str] = OMIT,
1353
1573
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
@@ -1384,7 +1604,7 @@ class AsyncRawSpansClient:
1384
1604
 
1385
1605
  output : typing.Optional[JsonListStringWrite]
1386
1606
 
1387
- metadata : typing.Optional[JsonNodeWrite]
1607
+ metadata : typing.Optional[JsonListStringWrite]
1388
1608
 
1389
1609
  model : typing.Optional[str]
1390
1610
 
@@ -1427,7 +1647,9 @@ class AsyncRawSpansClient:
1427
1647
  "output": convert_and_respect_annotation_metadata(
1428
1648
  object_=output, annotation=JsonListStringWrite, direction="write"
1429
1649
  ),
1430
- "metadata": metadata,
1650
+ "metadata": convert_and_respect_annotation_metadata(
1651
+ object_=metadata, annotation=JsonListStringWrite, direction="write"
1652
+ ),
1431
1653
  "model": model,
1432
1654
  "provider": provider,
1433
1655
  "tags": tags,
@@ -1464,47 +1686,12 @@ class AsyncRawSpansClient:
1464
1686
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1465
1687
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1466
1688
 
1467
- async def create_spans(
1468
- self, *, spans: typing.Sequence[SpanWrite], request_options: typing.Optional[RequestOptions] = None
1469
- ) -> AsyncHttpResponse[None]:
1470
- """
1471
- Create spans
1472
-
1473
- Parameters
1474
- ----------
1475
- spans : typing.Sequence[SpanWrite]
1476
-
1477
- request_options : typing.Optional[RequestOptions]
1478
- Request-specific configuration.
1479
-
1480
- Returns
1481
- -------
1482
- AsyncHttpResponse[None]
1483
- """
1484
- _response = await self._client_wrapper.httpx_client.request(
1485
- "v1/private/spans/batch",
1486
- method="POST",
1487
- json={
1488
- "spans": convert_and_respect_annotation_metadata(
1489
- object_=spans, annotation=typing.Sequence[SpanWrite], direction="write"
1490
- ),
1491
- },
1492
- headers={
1493
- "content-type": "application/json",
1494
- },
1495
- request_options=request_options,
1496
- omit=OMIT,
1497
- )
1498
- try:
1499
- if 200 <= _response.status_code < 300:
1500
- return AsyncHttpResponse(response=_response, data=None)
1501
- _response_json = _response.json()
1502
- except JSONDecodeError:
1503
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1504
- raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1505
-
1506
1689
  async def get_span_by_id(
1507
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
1690
+ self,
1691
+ id: str,
1692
+ *,
1693
+ strip_attachments: typing.Optional[bool] = None,
1694
+ request_options: typing.Optional[RequestOptions] = None,
1508
1695
  ) -> AsyncHttpResponse[SpanPublic]:
1509
1696
  """
1510
1697
  Get span by id
@@ -1513,6 +1700,8 @@ class AsyncRawSpansClient:
1513
1700
  ----------
1514
1701
  id : str
1515
1702
 
1703
+ strip_attachments : typing.Optional[bool]
1704
+
1516
1705
  request_options : typing.Optional[RequestOptions]
1517
1706
  Request-specific configuration.
1518
1707
 
@@ -1524,6 +1713,9 @@ class AsyncRawSpansClient:
1524
1713
  _response = await self._client_wrapper.httpx_client.request(
1525
1714
  f"v1/private/spans/{jsonable_encoder(id)}",
1526
1715
  method="GET",
1716
+ params={
1717
+ "strip_attachments": strip_attachments,
1718
+ },
1527
1719
  request_options=request_options,
1528
1720
  )
1529
1721
  try:
@@ -1606,7 +1798,7 @@ class AsyncRawSpansClient:
1606
1798
  end_time: typing.Optional[dt.datetime] = OMIT,
1607
1799
  input: typing.Optional[JsonListString] = OMIT,
1608
1800
  output: typing.Optional[JsonListString] = OMIT,
1609
- metadata: typing.Optional[JsonNode] = OMIT,
1801
+ metadata: typing.Optional[JsonListString] = OMIT,
1610
1802
  model: typing.Optional[str] = OMIT,
1611
1803
  provider: typing.Optional[str] = OMIT,
1612
1804
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
@@ -1642,7 +1834,7 @@ class AsyncRawSpansClient:
1642
1834
 
1643
1835
  output : typing.Optional[JsonListString]
1644
1836
 
1645
- metadata : typing.Optional[JsonNode]
1837
+ metadata : typing.Optional[JsonListString]
1646
1838
 
1647
1839
  model : typing.Optional[str]
1648
1840
 
@@ -1680,7 +1872,9 @@ class AsyncRawSpansClient:
1680
1872
  "output": convert_and_respect_annotation_metadata(
1681
1873
  object_=output, annotation=JsonListString, direction="write"
1682
1874
  ),
1683
- "metadata": metadata,
1875
+ "metadata": convert_and_respect_annotation_metadata(
1876
+ object_=metadata, annotation=JsonListString, direction="write"
1877
+ ),
1684
1878
  "model": model,
1685
1879
  "provider": provider,
1686
1880
  "tags": tags,
@@ -1906,6 +2100,8 @@ class AsyncRawSpansClient:
1906
2100
  trace_id: typing.Optional[str] = None,
1907
2101
  type: typing.Optional[GetSpanStatsRequestType] = None,
1908
2102
  filters: typing.Optional[str] = None,
2103
+ from_time: typing.Optional[dt.datetime] = None,
2104
+ to_time: typing.Optional[dt.datetime] = None,
1909
2105
  request_options: typing.Optional[RequestOptions] = None,
1910
2106
  ) -> AsyncHttpResponse[ProjectStatsPublic]:
1911
2107
  """
@@ -1923,6 +2119,10 @@ class AsyncRawSpansClient:
1923
2119
 
1924
2120
  filters : typing.Optional[str]
1925
2121
 
2122
+ from_time : typing.Optional[dt.datetime]
2123
+
2124
+ to_time : typing.Optional[dt.datetime]
2125
+
1926
2126
  request_options : typing.Optional[RequestOptions]
1927
2127
  Request-specific configuration.
1928
2128
 
@@ -1940,6 +2140,8 @@ class AsyncRawSpansClient:
1940
2140
  "trace_id": trace_id,
1941
2141
  "type": type,
1942
2142
  "filters": filters,
2143
+ "from_time": serialize_datetime(from_time) if from_time is not None else None,
2144
+ "to_time": serialize_datetime(to_time) if to_time is not None else None,
1943
2145
  },
1944
2146
  request_options=request_options,
1945
2147
  )
@@ -2012,6 +2214,8 @@ class AsyncRawSpansClient:
2012
2214
  limit: typing.Optional[int] = OMIT,
2013
2215
  last_retrieved_id: typing.Optional[str] = OMIT,
2014
2216
  truncate: typing.Optional[bool] = OMIT,
2217
+ from_time: typing.Optional[dt.datetime] = OMIT,
2218
+ to_time: typing.Optional[dt.datetime] = OMIT,
2015
2219
  request_options: typing.Optional[RequestOptions] = None,
2016
2220
  ) -> typing.AsyncIterator[AsyncHttpResponse[typing.AsyncIterator[bytes]]]:
2017
2221
  """
@@ -2037,6 +2241,12 @@ class AsyncRawSpansClient:
2037
2241
  truncate : typing.Optional[bool]
2038
2242
  Truncate image included in either input, output or metadata
2039
2243
 
2244
+ from_time : typing.Optional[dt.datetime]
2245
+ Filter spans created from this time (ISO-8601 format).
2246
+
2247
+ to_time : typing.Optional[dt.datetime]
2248
+ Filter spans created up to this time (ISO-8601 format). If not provided, defaults to current time. Must be after 'from_time'.
2249
+
2040
2250
  request_options : typing.Optional[RequestOptions]
2041
2251
  Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
2042
2252
 
@@ -2059,6 +2269,8 @@ class AsyncRawSpansClient:
2059
2269
  "limit": limit,
2060
2270
  "last_retrieved_id": last_retrieved_id,
2061
2271
  "truncate": truncate,
2272
+ "from_time": from_time,
2273
+ "to_time": to_time,
2062
2274
  },
2063
2275
  headers={
2064
2276
  "content-type": "application/json",