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
@@ -12,12 +12,12 @@ from ..types.feedback_score_batch_item import FeedbackScoreBatchItem
12
12
  from ..types.feedback_score_source import FeedbackScoreSource
13
13
  from ..types.json_list_string import JsonListString
14
14
  from ..types.json_list_string_write import JsonListStringWrite
15
- from ..types.json_node import JsonNode
16
- from ..types.json_node_write import JsonNodeWrite
17
15
  from ..types.project_stats_public import ProjectStatsPublic
18
16
  from ..types.span_filter_public import SpanFilterPublic
19
17
  from ..types.span_page_public import SpanPagePublic
20
18
  from ..types.span_public import SpanPublic
19
+ from ..types.span_update import SpanUpdate
20
+ from ..types.span_update_type import SpanUpdateType
21
21
  from ..types.span_write import SpanWrite
22
22
  from ..types.span_write_type import SpanWriteType
23
23
  from ..types.value_entry import ValueEntry
@@ -26,7 +26,6 @@ from .types.find_feedback_score_names_1_request_type import FindFeedbackScoreNam
26
26
  from .types.get_span_stats_request_type import GetSpanStatsRequestType
27
27
  from .types.get_spans_by_project_request_type import GetSpansByProjectRequestType
28
28
  from .types.span_search_stream_request_public_type import SpanSearchStreamRequestPublicType
29
- from .types.span_update_type import SpanUpdateType
30
29
 
31
30
  # this is used as the default value for optional parameters
32
31
  OMIT = typing.cast(typing.Any, ...)
@@ -175,6 +174,74 @@ class SpansClient:
175
174
  )
176
175
  return _response.data
177
176
 
177
+ def create_spans(
178
+ self, *, spans: typing.Sequence[SpanWrite], request_options: typing.Optional[RequestOptions] = None
179
+ ) -> None:
180
+ """
181
+ Create spans
182
+
183
+ Parameters
184
+ ----------
185
+ spans : typing.Sequence[SpanWrite]
186
+
187
+ request_options : typing.Optional[RequestOptions]
188
+ Request-specific configuration.
189
+
190
+ Returns
191
+ -------
192
+ None
193
+
194
+ Examples
195
+ --------
196
+ from Opik import OpikApi
197
+ from Opik import SpanWrite
198
+ import datetime
199
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
200
+ client.spans.create_spans(spans=[SpanWrite(start_time=datetime.datetime.fromisoformat("2024-01-15 09:30:00+00:00", ), )], )
201
+ """
202
+ _response = self._raw_client.create_spans(spans=spans, request_options=request_options)
203
+ return _response.data
204
+
205
+ def batch_update_spans(
206
+ self,
207
+ *,
208
+ ids: typing.Sequence[str],
209
+ update: SpanUpdate,
210
+ merge_tags: typing.Optional[bool] = OMIT,
211
+ request_options: typing.Optional[RequestOptions] = None,
212
+ ) -> None:
213
+ """
214
+ Update multiple spans
215
+
216
+ Parameters
217
+ ----------
218
+ ids : typing.Sequence[str]
219
+ List of span IDs to update (max 1000)
220
+
221
+ update : SpanUpdate
222
+
223
+ merge_tags : typing.Optional[bool]
224
+ If true, merge tags with existing tags instead of replacing them. Default: false
225
+
226
+ request_options : typing.Optional[RequestOptions]
227
+ Request-specific configuration.
228
+
229
+ Returns
230
+ -------
231
+ None
232
+
233
+ Examples
234
+ --------
235
+ from Opik import OpikApi
236
+ from Opik import SpanUpdate
237
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
238
+ client.spans.batch_update_spans(ids=['ids'], update=SpanUpdate(trace_id='trace_id', ), )
239
+ """
240
+ _response = self._raw_client.batch_update_spans(
241
+ ids=ids, update=update, merge_tags=merge_tags, request_options=request_options
242
+ )
243
+ return _response.data
244
+
178
245
  def get_spans_by_project(
179
246
  self,
180
247
  *,
@@ -186,8 +253,11 @@ class SpansClient:
186
253
  type: typing.Optional[GetSpansByProjectRequestType] = None,
187
254
  filters: typing.Optional[str] = None,
188
255
  truncate: typing.Optional[bool] = None,
256
+ strip_attachments: typing.Optional[bool] = None,
189
257
  sorting: typing.Optional[str] = None,
190
258
  exclude: typing.Optional[str] = None,
259
+ from_time: typing.Optional[dt.datetime] = None,
260
+ to_time: typing.Optional[dt.datetime] = None,
191
261
  request_options: typing.Optional[RequestOptions] = None,
192
262
  ) -> SpanPagePublic:
193
263
  """
@@ -211,10 +281,16 @@ class SpansClient:
211
281
 
212
282
  truncate : typing.Optional[bool]
213
283
 
284
+ strip_attachments : typing.Optional[bool]
285
+
214
286
  sorting : typing.Optional[str]
215
287
 
216
288
  exclude : typing.Optional[str]
217
289
 
290
+ from_time : typing.Optional[dt.datetime]
291
+
292
+ to_time : typing.Optional[dt.datetime]
293
+
218
294
  request_options : typing.Optional[RequestOptions]
219
295
  Request-specific configuration.
220
296
 
@@ -238,8 +314,11 @@ class SpansClient:
238
314
  type=type,
239
315
  filters=filters,
240
316
  truncate=truncate,
317
+ strip_attachments=strip_attachments,
241
318
  sorting=sorting,
242
319
  exclude=exclude,
320
+ from_time=from_time,
321
+ to_time=to_time,
243
322
  request_options=request_options,
244
323
  )
245
324
  return _response.data
@@ -257,7 +336,7 @@ class SpansClient:
257
336
  end_time: typing.Optional[dt.datetime] = OMIT,
258
337
  input: typing.Optional[JsonListStringWrite] = OMIT,
259
338
  output: typing.Optional[JsonListStringWrite] = OMIT,
260
- metadata: typing.Optional[JsonNodeWrite] = OMIT,
339
+ metadata: typing.Optional[JsonListStringWrite] = OMIT,
261
340
  model: typing.Optional[str] = OMIT,
262
341
  provider: typing.Optional[str] = OMIT,
263
342
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
@@ -294,7 +373,7 @@ class SpansClient:
294
373
 
295
374
  output : typing.Optional[JsonListStringWrite]
296
375
 
297
- metadata : typing.Optional[JsonNodeWrite]
376
+ metadata : typing.Optional[JsonListStringWrite]
298
377
 
299
378
  model : typing.Optional[str]
300
379
 
@@ -350,35 +429,13 @@ class SpansClient:
350
429
  )
351
430
  return _response.data
352
431
 
353
- def create_spans(
354
- self, *, spans: typing.Sequence[SpanWrite], request_options: typing.Optional[RequestOptions] = None
355
- ) -> None:
356
- """
357
- Create spans
358
-
359
- Parameters
360
- ----------
361
- spans : typing.Sequence[SpanWrite]
362
-
363
- request_options : typing.Optional[RequestOptions]
364
- Request-specific configuration.
365
-
366
- Returns
367
- -------
368
- None
369
-
370
- Examples
371
- --------
372
- from Opik import OpikApi
373
- from Opik import SpanWrite
374
- import datetime
375
- client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
376
- client.spans.create_spans(spans=[SpanWrite(start_time=datetime.datetime.fromisoformat("2024-01-15 09:30:00+00:00", ), )], )
377
- """
378
- _response = self._raw_client.create_spans(spans=spans, request_options=request_options)
379
- return _response.data
380
-
381
- def get_span_by_id(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> SpanPublic:
432
+ def get_span_by_id(
433
+ self,
434
+ id: str,
435
+ *,
436
+ strip_attachments: typing.Optional[bool] = None,
437
+ request_options: typing.Optional[RequestOptions] = None,
438
+ ) -> SpanPublic:
382
439
  """
383
440
  Get span by id
384
441
 
@@ -386,6 +443,8 @@ class SpansClient:
386
443
  ----------
387
444
  id : str
388
445
 
446
+ strip_attachments : typing.Optional[bool]
447
+
389
448
  request_options : typing.Optional[RequestOptions]
390
449
  Request-specific configuration.
391
450
 
@@ -400,7 +459,9 @@ class SpansClient:
400
459
  client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
401
460
  client.spans.get_span_by_id(id='id', )
402
461
  """
403
- _response = self._raw_client.get_span_by_id(id, request_options=request_options)
462
+ _response = self._raw_client.get_span_by_id(
463
+ id, strip_attachments=strip_attachments, request_options=request_options
464
+ )
404
465
  return _response.data
405
466
 
406
467
  def delete_span_by_id(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
@@ -440,7 +501,7 @@ class SpansClient:
440
501
  end_time: typing.Optional[dt.datetime] = OMIT,
441
502
  input: typing.Optional[JsonListString] = OMIT,
442
503
  output: typing.Optional[JsonListString] = OMIT,
443
- metadata: typing.Optional[JsonNode] = OMIT,
504
+ metadata: typing.Optional[JsonListString] = OMIT,
444
505
  model: typing.Optional[str] = OMIT,
445
506
  provider: typing.Optional[str] = OMIT,
446
507
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
@@ -476,7 +537,7 @@ class SpansClient:
476
537
 
477
538
  output : typing.Optional[JsonListString]
478
539
 
479
- metadata : typing.Optional[JsonNode]
540
+ metadata : typing.Optional[JsonListString]
480
541
 
481
542
  model : typing.Optional[str]
482
543
 
@@ -660,6 +721,8 @@ class SpansClient:
660
721
  trace_id: typing.Optional[str] = None,
661
722
  type: typing.Optional[GetSpanStatsRequestType] = None,
662
723
  filters: typing.Optional[str] = None,
724
+ from_time: typing.Optional[dt.datetime] = None,
725
+ to_time: typing.Optional[dt.datetime] = None,
663
726
  request_options: typing.Optional[RequestOptions] = None,
664
727
  ) -> ProjectStatsPublic:
665
728
  """
@@ -677,6 +740,10 @@ class SpansClient:
677
740
 
678
741
  filters : typing.Optional[str]
679
742
 
743
+ from_time : typing.Optional[dt.datetime]
744
+
745
+ to_time : typing.Optional[dt.datetime]
746
+
680
747
  request_options : typing.Optional[RequestOptions]
681
748
  Request-specific configuration.
682
749
 
@@ -697,6 +764,8 @@ class SpansClient:
697
764
  trace_id=trace_id,
698
765
  type=type,
699
766
  filters=filters,
767
+ from_time=from_time,
768
+ to_time=to_time,
700
769
  request_options=request_options,
701
770
  )
702
771
  return _response.data
@@ -726,7 +795,7 @@ class SpansClient:
726
795
  from Opik import OpikApi
727
796
  from Opik import FeedbackScoreBatchItem
728
797
  client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
729
- client.spans.score_batch_of_spans(scores=[FeedbackScoreBatchItem(id='id', name='name', value=1.1, source="ui", )], )
798
+ client.spans.score_batch_of_spans(scores=[FeedbackScoreBatchItem(name='name', value=1.1, source="ui", id='id', )], )
730
799
  """
731
800
  _response = self._raw_client.score_batch_of_spans(scores=scores, request_options=request_options)
732
801
  return _response.data
@@ -742,6 +811,8 @@ class SpansClient:
742
811
  limit: typing.Optional[int] = OMIT,
743
812
  last_retrieved_id: typing.Optional[str] = OMIT,
744
813
  truncate: typing.Optional[bool] = OMIT,
814
+ from_time: typing.Optional[dt.datetime] = OMIT,
815
+ to_time: typing.Optional[dt.datetime] = OMIT,
745
816
  request_options: typing.Optional[RequestOptions] = None,
746
817
  ) -> typing.Iterator[bytes]:
747
818
  """
@@ -767,6 +838,12 @@ class SpansClient:
767
838
  truncate : typing.Optional[bool]
768
839
  Truncate image included in either input, output or metadata
769
840
 
841
+ from_time : typing.Optional[dt.datetime]
842
+ Filter spans created from this time (ISO-8601 format).
843
+
844
+ to_time : typing.Optional[dt.datetime]
845
+ Filter spans created up to this time (ISO-8601 format). If not provided, defaults to current time. Must be after 'from_time'.
846
+
770
847
  request_options : typing.Optional[RequestOptions]
771
848
  Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
772
849
 
@@ -784,6 +861,8 @@ class SpansClient:
784
861
  limit=limit,
785
862
  last_retrieved_id=last_retrieved_id,
786
863
  truncate=truncate,
864
+ from_time=from_time,
865
+ to_time=to_time,
787
866
  request_options=request_options,
788
867
  ) as r:
789
868
  yield from r.data
@@ -994,6 +1073,80 @@ class AsyncSpansClient:
994
1073
  )
995
1074
  return _response.data
996
1075
 
1076
+ async def create_spans(
1077
+ self, *, spans: typing.Sequence[SpanWrite], request_options: typing.Optional[RequestOptions] = None
1078
+ ) -> None:
1079
+ """
1080
+ Create spans
1081
+
1082
+ Parameters
1083
+ ----------
1084
+ spans : typing.Sequence[SpanWrite]
1085
+
1086
+ request_options : typing.Optional[RequestOptions]
1087
+ Request-specific configuration.
1088
+
1089
+ Returns
1090
+ -------
1091
+ None
1092
+
1093
+ Examples
1094
+ --------
1095
+ from Opik import AsyncOpikApi
1096
+ from Opik import SpanWrite
1097
+ import datetime
1098
+ import asyncio
1099
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1100
+ async def main() -> None:
1101
+ await client.spans.create_spans(spans=[SpanWrite(start_time=datetime.datetime.fromisoformat("2024-01-15 09:30:00+00:00", ), )], )
1102
+ asyncio.run(main())
1103
+ """
1104
+ _response = await self._raw_client.create_spans(spans=spans, request_options=request_options)
1105
+ return _response.data
1106
+
1107
+ async def batch_update_spans(
1108
+ self,
1109
+ *,
1110
+ ids: typing.Sequence[str],
1111
+ update: SpanUpdate,
1112
+ merge_tags: typing.Optional[bool] = OMIT,
1113
+ request_options: typing.Optional[RequestOptions] = None,
1114
+ ) -> None:
1115
+ """
1116
+ Update multiple spans
1117
+
1118
+ Parameters
1119
+ ----------
1120
+ ids : typing.Sequence[str]
1121
+ List of span IDs to update (max 1000)
1122
+
1123
+ update : SpanUpdate
1124
+
1125
+ merge_tags : typing.Optional[bool]
1126
+ If true, merge tags with existing tags instead of replacing them. Default: false
1127
+
1128
+ request_options : typing.Optional[RequestOptions]
1129
+ Request-specific configuration.
1130
+
1131
+ Returns
1132
+ -------
1133
+ None
1134
+
1135
+ Examples
1136
+ --------
1137
+ from Opik import AsyncOpikApi
1138
+ from Opik import SpanUpdate
1139
+ import asyncio
1140
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1141
+ async def main() -> None:
1142
+ await client.spans.batch_update_spans(ids=['ids'], update=SpanUpdate(trace_id='trace_id', ), )
1143
+ asyncio.run(main())
1144
+ """
1145
+ _response = await self._raw_client.batch_update_spans(
1146
+ ids=ids, update=update, merge_tags=merge_tags, request_options=request_options
1147
+ )
1148
+ return _response.data
1149
+
997
1150
  async def get_spans_by_project(
998
1151
  self,
999
1152
  *,
@@ -1005,8 +1158,11 @@ class AsyncSpansClient:
1005
1158
  type: typing.Optional[GetSpansByProjectRequestType] = None,
1006
1159
  filters: typing.Optional[str] = None,
1007
1160
  truncate: typing.Optional[bool] = None,
1161
+ strip_attachments: typing.Optional[bool] = None,
1008
1162
  sorting: typing.Optional[str] = None,
1009
1163
  exclude: typing.Optional[str] = None,
1164
+ from_time: typing.Optional[dt.datetime] = None,
1165
+ to_time: typing.Optional[dt.datetime] = None,
1010
1166
  request_options: typing.Optional[RequestOptions] = None,
1011
1167
  ) -> SpanPagePublic:
1012
1168
  """
@@ -1030,10 +1186,16 @@ class AsyncSpansClient:
1030
1186
 
1031
1187
  truncate : typing.Optional[bool]
1032
1188
 
1189
+ strip_attachments : typing.Optional[bool]
1190
+
1033
1191
  sorting : typing.Optional[str]
1034
1192
 
1035
1193
  exclude : typing.Optional[str]
1036
1194
 
1195
+ from_time : typing.Optional[dt.datetime]
1196
+
1197
+ to_time : typing.Optional[dt.datetime]
1198
+
1037
1199
  request_options : typing.Optional[RequestOptions]
1038
1200
  Request-specific configuration.
1039
1201
 
@@ -1060,8 +1222,11 @@ class AsyncSpansClient:
1060
1222
  type=type,
1061
1223
  filters=filters,
1062
1224
  truncate=truncate,
1225
+ strip_attachments=strip_attachments,
1063
1226
  sorting=sorting,
1064
1227
  exclude=exclude,
1228
+ from_time=from_time,
1229
+ to_time=to_time,
1065
1230
  request_options=request_options,
1066
1231
  )
1067
1232
  return _response.data
@@ -1079,7 +1244,7 @@ class AsyncSpansClient:
1079
1244
  end_time: typing.Optional[dt.datetime] = OMIT,
1080
1245
  input: typing.Optional[JsonListStringWrite] = OMIT,
1081
1246
  output: typing.Optional[JsonListStringWrite] = OMIT,
1082
- metadata: typing.Optional[JsonNodeWrite] = OMIT,
1247
+ metadata: typing.Optional[JsonListStringWrite] = OMIT,
1083
1248
  model: typing.Optional[str] = OMIT,
1084
1249
  provider: typing.Optional[str] = OMIT,
1085
1250
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
@@ -1116,7 +1281,7 @@ class AsyncSpansClient:
1116
1281
 
1117
1282
  output : typing.Optional[JsonListStringWrite]
1118
1283
 
1119
- metadata : typing.Optional[JsonNodeWrite]
1284
+ metadata : typing.Optional[JsonListStringWrite]
1120
1285
 
1121
1286
  model : typing.Optional[str]
1122
1287
 
@@ -1175,38 +1340,13 @@ class AsyncSpansClient:
1175
1340
  )
1176
1341
  return _response.data
1177
1342
 
1178
- async def create_spans(
1179
- self, *, spans: typing.Sequence[SpanWrite], request_options: typing.Optional[RequestOptions] = None
1180
- ) -> None:
1181
- """
1182
- Create spans
1183
-
1184
- Parameters
1185
- ----------
1186
- spans : typing.Sequence[SpanWrite]
1187
-
1188
- request_options : typing.Optional[RequestOptions]
1189
- Request-specific configuration.
1190
-
1191
- Returns
1192
- -------
1193
- None
1194
-
1195
- Examples
1196
- --------
1197
- from Opik import AsyncOpikApi
1198
- from Opik import SpanWrite
1199
- import datetime
1200
- import asyncio
1201
- client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1202
- async def main() -> None:
1203
- await client.spans.create_spans(spans=[SpanWrite(start_time=datetime.datetime.fromisoformat("2024-01-15 09:30:00+00:00", ), )], )
1204
- asyncio.run(main())
1205
- """
1206
- _response = await self._raw_client.create_spans(spans=spans, request_options=request_options)
1207
- return _response.data
1208
-
1209
- async def get_span_by_id(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> SpanPublic:
1343
+ async def get_span_by_id(
1344
+ self,
1345
+ id: str,
1346
+ *,
1347
+ strip_attachments: typing.Optional[bool] = None,
1348
+ request_options: typing.Optional[RequestOptions] = None,
1349
+ ) -> SpanPublic:
1210
1350
  """
1211
1351
  Get span by id
1212
1352
 
@@ -1214,6 +1354,8 @@ class AsyncSpansClient:
1214
1354
  ----------
1215
1355
  id : str
1216
1356
 
1357
+ strip_attachments : typing.Optional[bool]
1358
+
1217
1359
  request_options : typing.Optional[RequestOptions]
1218
1360
  Request-specific configuration.
1219
1361
 
@@ -1231,7 +1373,9 @@ class AsyncSpansClient:
1231
1373
  await client.spans.get_span_by_id(id='id', )
1232
1374
  asyncio.run(main())
1233
1375
  """
1234
- _response = await self._raw_client.get_span_by_id(id, request_options=request_options)
1376
+ _response = await self._raw_client.get_span_by_id(
1377
+ id, strip_attachments=strip_attachments, request_options=request_options
1378
+ )
1235
1379
  return _response.data
1236
1380
 
1237
1381
  async def delete_span_by_id(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
@@ -1274,7 +1418,7 @@ class AsyncSpansClient:
1274
1418
  end_time: typing.Optional[dt.datetime] = OMIT,
1275
1419
  input: typing.Optional[JsonListString] = OMIT,
1276
1420
  output: typing.Optional[JsonListString] = OMIT,
1277
- metadata: typing.Optional[JsonNode] = OMIT,
1421
+ metadata: typing.Optional[JsonListString] = OMIT,
1278
1422
  model: typing.Optional[str] = OMIT,
1279
1423
  provider: typing.Optional[str] = OMIT,
1280
1424
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
@@ -1310,7 +1454,7 @@ class AsyncSpansClient:
1310
1454
 
1311
1455
  output : typing.Optional[JsonListString]
1312
1456
 
1313
- metadata : typing.Optional[JsonNode]
1457
+ metadata : typing.Optional[JsonListString]
1314
1458
 
1315
1459
  model : typing.Optional[str]
1316
1460
 
@@ -1509,6 +1653,8 @@ class AsyncSpansClient:
1509
1653
  trace_id: typing.Optional[str] = None,
1510
1654
  type: typing.Optional[GetSpanStatsRequestType] = None,
1511
1655
  filters: typing.Optional[str] = None,
1656
+ from_time: typing.Optional[dt.datetime] = None,
1657
+ to_time: typing.Optional[dt.datetime] = None,
1512
1658
  request_options: typing.Optional[RequestOptions] = None,
1513
1659
  ) -> ProjectStatsPublic:
1514
1660
  """
@@ -1526,6 +1672,10 @@ class AsyncSpansClient:
1526
1672
 
1527
1673
  filters : typing.Optional[str]
1528
1674
 
1675
+ from_time : typing.Optional[dt.datetime]
1676
+
1677
+ to_time : typing.Optional[dt.datetime]
1678
+
1529
1679
  request_options : typing.Optional[RequestOptions]
1530
1680
  Request-specific configuration.
1531
1681
 
@@ -1549,6 +1699,8 @@ class AsyncSpansClient:
1549
1699
  trace_id=trace_id,
1550
1700
  type=type,
1551
1701
  filters=filters,
1702
+ from_time=from_time,
1703
+ to_time=to_time,
1552
1704
  request_options=request_options,
1553
1705
  )
1554
1706
  return _response.data
@@ -1580,7 +1732,7 @@ class AsyncSpansClient:
1580
1732
  import asyncio
1581
1733
  client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1582
1734
  async def main() -> None:
1583
- await client.spans.score_batch_of_spans(scores=[FeedbackScoreBatchItem(id='id', name='name', value=1.1, source="ui", )], )
1735
+ await client.spans.score_batch_of_spans(scores=[FeedbackScoreBatchItem(name='name', value=1.1, source="ui", id='id', )], )
1584
1736
  asyncio.run(main())
1585
1737
  """
1586
1738
  _response = await self._raw_client.score_batch_of_spans(scores=scores, request_options=request_options)
@@ -1597,6 +1749,8 @@ class AsyncSpansClient:
1597
1749
  limit: typing.Optional[int] = OMIT,
1598
1750
  last_retrieved_id: typing.Optional[str] = OMIT,
1599
1751
  truncate: typing.Optional[bool] = OMIT,
1752
+ from_time: typing.Optional[dt.datetime] = OMIT,
1753
+ to_time: typing.Optional[dt.datetime] = OMIT,
1600
1754
  request_options: typing.Optional[RequestOptions] = None,
1601
1755
  ) -> typing.AsyncIterator[bytes]:
1602
1756
  """
@@ -1622,6 +1776,12 @@ class AsyncSpansClient:
1622
1776
  truncate : typing.Optional[bool]
1623
1777
  Truncate image included in either input, output or metadata
1624
1778
 
1779
+ from_time : typing.Optional[dt.datetime]
1780
+ Filter spans created from this time (ISO-8601 format).
1781
+
1782
+ to_time : typing.Optional[dt.datetime]
1783
+ Filter spans created up to this time (ISO-8601 format). If not provided, defaults to current time. Must be after 'from_time'.
1784
+
1625
1785
  request_options : typing.Optional[RequestOptions]
1626
1786
  Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
1627
1787
 
@@ -1639,6 +1799,8 @@ class AsyncSpansClient:
1639
1799
  limit=limit,
1640
1800
  last_retrieved_id=last_retrieved_id,
1641
1801
  truncate=truncate,
1802
+ from_time=from_time,
1803
+ to_time=to_time,
1642
1804
  request_options=request_options,
1643
1805
  ) as r:
1644
1806
  async for data in r.data: