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
@@ -4,13 +4,25 @@ import typing
4
4
 
5
5
  from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
6
6
  from ..core.request_options import RequestOptions
7
+ from ..types.dataset_expansion_response import DatasetExpansionResponse
8
+ from ..types.dataset_item_changes_public import DatasetItemChangesPublic
9
+ from ..types.dataset_item_filter import DatasetItemFilter
7
10
  from ..types.dataset_item_page_compare import DatasetItemPageCompare
8
11
  from ..types.dataset_item_page_public import DatasetItemPagePublic
9
12
  from ..types.dataset_item_public import DatasetItemPublic
13
+ from ..types.dataset_item_update import DatasetItemUpdate
10
14
  from ..types.dataset_item_write import DatasetItemWrite
15
+ from ..types.dataset_item_write_source import DatasetItemWriteSource
11
16
  from ..types.dataset_page_public import DatasetPagePublic
12
17
  from ..types.dataset_public import DatasetPublic
18
+ from ..types.dataset_version_diff import DatasetVersionDiff
19
+ from ..types.dataset_version_page_public import DatasetVersionPagePublic
20
+ from ..types.dataset_version_public import DatasetVersionPublic
21
+ from ..types.json_node import JsonNode
13
22
  from ..types.page_columns import PageColumns
23
+ from ..types.project_stats_public import ProjectStatsPublic
24
+ from ..types.span_enrichment_options import SpanEnrichmentOptions
25
+ from ..types.trace_enrichment_options import TraceEnrichmentOptions
14
26
  from .raw_client import AsyncRawDatasetsClient, RawDatasetsClient
15
27
  from .types.dataset_update_visibility import DatasetUpdateVisibility
16
28
  from .types.dataset_write_visibility import DatasetWriteVisibility
@@ -34,6 +46,104 @@ class DatasetsClient:
34
46
  """
35
47
  return self._raw_client
36
48
 
49
+ def apply_dataset_item_changes(
50
+ self,
51
+ id: str,
52
+ *,
53
+ request: DatasetItemChangesPublic,
54
+ override: typing.Optional[bool] = None,
55
+ request_options: typing.Optional[RequestOptions] = None,
56
+ ) -> DatasetVersionPublic:
57
+ """
58
+ Apply delta changes (add, edit, delete) to a dataset version with conflict detection.
59
+
60
+ This endpoint:
61
+ - Creates a new version with the applied changes
62
+ - Validates that baseVersion matches the latest version (unless override=true)
63
+ - Returns 409 Conflict if baseVersion is stale and override is not set
64
+
65
+ Use `override=true` query parameter to force version creation even with stale baseVersion.
66
+
67
+ Parameters
68
+ ----------
69
+ id : str
70
+
71
+ request : DatasetItemChangesPublic
72
+
73
+ override : typing.Optional[bool]
74
+
75
+ request_options : typing.Optional[RequestOptions]
76
+ Request-specific configuration.
77
+
78
+ Returns
79
+ -------
80
+ DatasetVersionPublic
81
+ Version created successfully
82
+
83
+ Examples
84
+ --------
85
+ from Opik import OpikApi
86
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
87
+ client.datasets.apply_dataset_item_changes(id='id', request={'key': 'value'
88
+ }, )
89
+ """
90
+ _response = self._raw_client.apply_dataset_item_changes(
91
+ id, request=request, override=override, request_options=request_options
92
+ )
93
+ return _response.data
94
+
95
+ def batch_update_dataset_items(
96
+ self,
97
+ *,
98
+ update: DatasetItemUpdate,
99
+ ids: typing.Optional[typing.Sequence[str]] = OMIT,
100
+ filters: typing.Optional[typing.Sequence[DatasetItemFilter]] = OMIT,
101
+ dataset_id: typing.Optional[str] = OMIT,
102
+ merge_tags: typing.Optional[bool] = OMIT,
103
+ request_options: typing.Optional[RequestOptions] = None,
104
+ ) -> None:
105
+ """
106
+ Update multiple dataset items
107
+
108
+ Parameters
109
+ ----------
110
+ update : DatasetItemUpdate
111
+
112
+ ids : typing.Optional[typing.Sequence[str]]
113
+ List of dataset item IDs to update (max 1000). Mutually exclusive with 'filters'.
114
+
115
+ filters : typing.Optional[typing.Sequence[DatasetItemFilter]]
116
+
117
+ dataset_id : typing.Optional[str]
118
+ Dataset ID. Required when using 'filters', optional when using 'ids'.
119
+
120
+ merge_tags : typing.Optional[bool]
121
+ If true, merge tags with existing tags instead of replacing them. Default: false. When using 'filters', this is automatically set to true.
122
+
123
+ request_options : typing.Optional[RequestOptions]
124
+ Request-specific configuration.
125
+
126
+ Returns
127
+ -------
128
+ None
129
+
130
+ Examples
131
+ --------
132
+ from Opik import OpikApi
133
+ from Opik import DatasetItemUpdate
134
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
135
+ client.datasets.batch_update_dataset_items(update=DatasetItemUpdate(), )
136
+ """
137
+ _response = self._raw_client.batch_update_dataset_items(
138
+ update=update,
139
+ ids=ids,
140
+ filters=filters,
141
+ dataset_id=dataset_id,
142
+ merge_tags=merge_tags,
143
+ request_options=request_options,
144
+ )
145
+ return _response.data
146
+
37
147
  def find_datasets(
38
148
  self,
39
149
  *,
@@ -179,6 +289,119 @@ class DatasetsClient:
179
289
  )
180
290
  return _response.data
181
291
 
292
+ def create_dataset_items_from_csv(
293
+ self,
294
+ *,
295
+ file: typing.Dict[str, typing.Optional[typing.Any]],
296
+ dataset_id: str,
297
+ request_options: typing.Optional[RequestOptions] = None,
298
+ ) -> None:
299
+ """
300
+ Create dataset items from uploaded CSV file. CSV should have headers in the first row. Processing happens asynchronously in batches.
301
+
302
+ Parameters
303
+ ----------
304
+ file : typing.Dict[str, typing.Optional[typing.Any]]
305
+
306
+ dataset_id : str
307
+
308
+ request_options : typing.Optional[RequestOptions]
309
+ Request-specific configuration.
310
+
311
+ Returns
312
+ -------
313
+ None
314
+
315
+ Examples
316
+ --------
317
+ from Opik import OpikApi
318
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
319
+ client.datasets.create_dataset_items_from_csv(file={'key': 'value'
320
+ }, dataset_id='dataset_id', )
321
+ """
322
+ _response = self._raw_client.create_dataset_items_from_csv(
323
+ file=file, dataset_id=dataset_id, request_options=request_options
324
+ )
325
+ return _response.data
326
+
327
+ def create_dataset_items_from_spans(
328
+ self,
329
+ dataset_id: str,
330
+ *,
331
+ span_ids: typing.Sequence[str],
332
+ enrichment_options: SpanEnrichmentOptions,
333
+ request_options: typing.Optional[RequestOptions] = None,
334
+ ) -> None:
335
+ """
336
+ Create dataset items from spans with enriched metadata
337
+
338
+ Parameters
339
+ ----------
340
+ dataset_id : str
341
+
342
+ span_ids : typing.Sequence[str]
343
+ Set of span IDs to add to the dataset
344
+
345
+ enrichment_options : SpanEnrichmentOptions
346
+
347
+ request_options : typing.Optional[RequestOptions]
348
+ Request-specific configuration.
349
+
350
+ Returns
351
+ -------
352
+ None
353
+
354
+ Examples
355
+ --------
356
+ from Opik import OpikApi
357
+ from Opik import SpanEnrichmentOptions
358
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
359
+ client.datasets.create_dataset_items_from_spans(dataset_id='dataset_id', span_ids=['span_ids'], enrichment_options=SpanEnrichmentOptions(), )
360
+ """
361
+ _response = self._raw_client.create_dataset_items_from_spans(
362
+ dataset_id, span_ids=span_ids, enrichment_options=enrichment_options, request_options=request_options
363
+ )
364
+ return _response.data
365
+
366
+ def create_dataset_items_from_traces(
367
+ self,
368
+ dataset_id: str,
369
+ *,
370
+ trace_ids: typing.Sequence[str],
371
+ enrichment_options: TraceEnrichmentOptions,
372
+ request_options: typing.Optional[RequestOptions] = None,
373
+ ) -> None:
374
+ """
375
+ Create dataset items from traces with enriched metadata
376
+
377
+ Parameters
378
+ ----------
379
+ dataset_id : str
380
+
381
+ trace_ids : typing.Sequence[str]
382
+ Set of trace IDs to add to the dataset
383
+
384
+ enrichment_options : TraceEnrichmentOptions
385
+
386
+ request_options : typing.Optional[RequestOptions]
387
+ Request-specific configuration.
388
+
389
+ Returns
390
+ -------
391
+ None
392
+
393
+ Examples
394
+ --------
395
+ from Opik import OpikApi
396
+ from Opik import TraceEnrichmentOptions
397
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
398
+ client.datasets.create_dataset_items_from_traces(dataset_id='dataset_id', trace_ids=['trace_ids'], enrichment_options=TraceEnrichmentOptions(), )
399
+ """
400
+ _response = self._raw_client.create_dataset_items_from_traces(
401
+ dataset_id, trace_ids=trace_ids, enrichment_options=enrichment_options, request_options=request_options
402
+ )
403
+ return _response.data
404
+
182
405
  def get_dataset_by_id(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> DatasetPublic:
183
406
  """
184
407
  Get dataset by id
@@ -298,14 +521,30 @@ class DatasetsClient:
298
521
  return _response.data
299
522
 
300
523
  def delete_dataset_items(
301
- self, *, item_ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
524
+ self,
525
+ *,
526
+ item_ids: typing.Optional[typing.Sequence[str]] = OMIT,
527
+ dataset_id: typing.Optional[str] = OMIT,
528
+ filters: typing.Optional[typing.Sequence[DatasetItemFilter]] = OMIT,
529
+ request_options: typing.Optional[RequestOptions] = None,
302
530
  ) -> None:
303
531
  """
304
- Delete dataset items
532
+ Delete dataset items using one of two modes:
533
+ 1. **Delete by IDs**: Provide 'item_ids' to delete specific items by their IDs
534
+ 2. **Delete by filters**: Provide 'dataset_id' with optional 'filters' to delete items matching criteria
535
+
536
+ When using filters, an empty 'filters' array will delete all items in the specified dataset.
305
537
 
306
538
  Parameters
307
539
  ----------
308
- item_ids : typing.Sequence[str]
540
+ item_ids : typing.Optional[typing.Sequence[str]]
541
+ List of dataset item IDs to delete (max 1000). Use this to delete specific items by their IDs. Mutually exclusive with 'dataset_id' and 'filters'.
542
+
543
+ dataset_id : typing.Optional[str]
544
+ Dataset ID to scope the deletion. Required when using 'filters'. Mutually exclusive with 'item_ids'.
545
+
546
+ filters : typing.Optional[typing.Sequence[DatasetItemFilter]]
547
+ Filters to select dataset items to delete within the specified dataset. Must be used with 'dataset_id'. Mutually exclusive with 'item_ids'. Empty array means 'delete all items in the dataset'.
309
548
 
310
549
  request_options : typing.Optional[RequestOptions]
311
550
  Request-specific configuration.
@@ -318,9 +557,11 @@ class DatasetsClient:
318
557
  --------
319
558
  from Opik import OpikApi
320
559
  client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
321
- client.datasets.delete_dataset_items(item_ids=['item_ids'], )
560
+ client.datasets.delete_dataset_items()
322
561
  """
323
- _response = self._raw_client.delete_dataset_items(item_ids=item_ids, request_options=request_options)
562
+ _response = self._raw_client.delete_dataset_items(
563
+ item_ids=item_ids, dataset_id=dataset_id, filters=filters, request_options=request_options
564
+ )
324
565
  return _response.data
325
566
 
326
567
  def delete_datasets_batch(
@@ -349,6 +590,64 @@ class DatasetsClient:
349
590
  _response = self._raw_client.delete_datasets_batch(ids=ids, request_options=request_options)
350
591
  return _response.data
351
592
 
593
+ def expand_dataset(
594
+ self,
595
+ id: str,
596
+ *,
597
+ model: str,
598
+ sample_count: typing.Optional[int] = OMIT,
599
+ preserve_fields: typing.Optional[typing.Sequence[str]] = OMIT,
600
+ variation_instructions: typing.Optional[str] = OMIT,
601
+ custom_prompt: typing.Optional[str] = OMIT,
602
+ request_options: typing.Optional[RequestOptions] = None,
603
+ ) -> DatasetExpansionResponse:
604
+ """
605
+ Generate synthetic dataset samples using LLM based on existing data patterns
606
+
607
+ Parameters
608
+ ----------
609
+ id : str
610
+
611
+ model : str
612
+ The model to use for synthetic data generation
613
+
614
+ sample_count : typing.Optional[int]
615
+ Number of synthetic samples to generate
616
+
617
+ preserve_fields : typing.Optional[typing.Sequence[str]]
618
+ Fields to preserve patterns from original data
619
+
620
+ variation_instructions : typing.Optional[str]
621
+ Additional instructions for data variation
622
+
623
+ custom_prompt : typing.Optional[str]
624
+ Custom prompt to use for generation instead of auto-generated one
625
+
626
+ request_options : typing.Optional[RequestOptions]
627
+ Request-specific configuration.
628
+
629
+ Returns
630
+ -------
631
+ DatasetExpansionResponse
632
+ Generated synthetic samples
633
+
634
+ Examples
635
+ --------
636
+ from Opik import OpikApi
637
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
638
+ client.datasets.expand_dataset(id='id', model='gpt-4', )
639
+ """
640
+ _response = self._raw_client.expand_dataset(
641
+ id,
642
+ model=model,
643
+ sample_count=sample_count,
644
+ preserve_fields=preserve_fields,
645
+ variation_instructions=variation_instructions,
646
+ custom_prompt=custom_prompt,
647
+ request_options=request_options,
648
+ )
649
+ return _response.data
650
+
352
651
  def find_dataset_items_with_experiment_items(
353
652
  self,
354
653
  id: str,
@@ -357,6 +656,8 @@ class DatasetsClient:
357
656
  page: typing.Optional[int] = None,
358
657
  size: typing.Optional[int] = None,
359
658
  filters: typing.Optional[str] = None,
659
+ sorting: typing.Optional[str] = None,
660
+ search: typing.Optional[str] = None,
360
661
  truncate: typing.Optional[bool] = None,
361
662
  request_options: typing.Optional[RequestOptions] = None,
362
663
  ) -> DatasetItemPageCompare:
@@ -375,6 +676,10 @@ class DatasetsClient:
375
676
 
376
677
  filters : typing.Optional[str]
377
678
 
679
+ sorting : typing.Optional[str]
680
+
681
+ search : typing.Optional[str]
682
+
378
683
  truncate : typing.Optional[bool]
379
684
 
380
685
  request_options : typing.Optional[RequestOptions]
@@ -397,6 +702,8 @@ class DatasetsClient:
397
702
  page=page,
398
703
  size=size,
399
704
  filters=filters,
705
+ sorting=sorting,
706
+ search=search,
400
707
  truncate=truncate,
401
708
  request_options=request_options,
402
709
  )
@@ -431,6 +738,44 @@ class DatasetsClient:
431
738
  )
432
739
  return _response.data
433
740
 
741
+ def get_dataset_experiment_items_stats(
742
+ self,
743
+ id: str,
744
+ *,
745
+ experiment_ids: str,
746
+ filters: typing.Optional[str] = None,
747
+ request_options: typing.Optional[RequestOptions] = None,
748
+ ) -> ProjectStatsPublic:
749
+ """
750
+ Get experiment items stats for dataset
751
+
752
+ Parameters
753
+ ----------
754
+ id : str
755
+
756
+ experiment_ids : str
757
+
758
+ filters : typing.Optional[str]
759
+
760
+ request_options : typing.Optional[RequestOptions]
761
+ Request-specific configuration.
762
+
763
+ Returns
764
+ -------
765
+ ProjectStatsPublic
766
+ Experiment items stats resource
767
+
768
+ Examples
769
+ --------
770
+ from Opik import OpikApi
771
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
772
+ client.datasets.get_dataset_experiment_items_stats(id='id', experiment_ids='experiment_ids', )
773
+ """
774
+ _response = self._raw_client.get_dataset_experiment_items_stats(
775
+ id, experiment_ids=experiment_ids, filters=filters, request_options=request_options
776
+ )
777
+ return _response.data
778
+
434
779
  def get_dataset_item_by_id(
435
780
  self, item_id: str, *, request_options: typing.Optional[RequestOptions] = None
436
781
  ) -> DatasetItemPublic:
@@ -458,12 +803,71 @@ class DatasetsClient:
458
803
  _response = self._raw_client.get_dataset_item_by_id(item_id, request_options=request_options)
459
804
  return _response.data
460
805
 
806
+ def patch_dataset_item(
807
+ self,
808
+ item_id: str,
809
+ *,
810
+ source: DatasetItemWriteSource,
811
+ data: JsonNode,
812
+ id: typing.Optional[str] = OMIT,
813
+ trace_id: typing.Optional[str] = OMIT,
814
+ span_id: typing.Optional[str] = OMIT,
815
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
816
+ request_options: typing.Optional[RequestOptions] = None,
817
+ ) -> None:
818
+ """
819
+ Partially update dataset item by id. Only provided fields will be updated.
820
+
821
+ Parameters
822
+ ----------
823
+ item_id : str
824
+
825
+ source : DatasetItemWriteSource
826
+
827
+ data : JsonNode
828
+
829
+ id : typing.Optional[str]
830
+
831
+ trace_id : typing.Optional[str]
832
+
833
+ span_id : typing.Optional[str]
834
+
835
+ tags : typing.Optional[typing.Sequence[str]]
836
+
837
+ request_options : typing.Optional[RequestOptions]
838
+ Request-specific configuration.
839
+
840
+ Returns
841
+ -------
842
+ None
843
+
844
+ Examples
845
+ --------
846
+ from Opik import OpikApi
847
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
848
+ client.datasets.patch_dataset_item(item_id='itemId', source="manual", data={'key': 'value'
849
+ }, )
850
+ """
851
+ _response = self._raw_client.patch_dataset_item(
852
+ item_id,
853
+ source=source,
854
+ data=data,
855
+ id=id,
856
+ trace_id=trace_id,
857
+ span_id=span_id,
858
+ tags=tags,
859
+ request_options=request_options,
860
+ )
861
+ return _response.data
862
+
461
863
  def get_dataset_items(
462
864
  self,
463
865
  id: str,
464
866
  *,
465
867
  page: typing.Optional[int] = None,
466
868
  size: typing.Optional[int] = None,
869
+ version: typing.Optional[str] = None,
870
+ filters: typing.Optional[str] = None,
467
871
  truncate: typing.Optional[bool] = None,
468
872
  request_options: typing.Optional[RequestOptions] = None,
469
873
  ) -> DatasetItemPagePublic:
@@ -478,6 +882,10 @@ class DatasetsClient:
478
882
 
479
883
  size : typing.Optional[int]
480
884
 
885
+ version : typing.Optional[str]
886
+
887
+ filters : typing.Optional[str]
888
+
481
889
  truncate : typing.Optional[bool]
482
890
 
483
891
  request_options : typing.Optional[RequestOptions]
@@ -495,12 +903,18 @@ class DatasetsClient:
495
903
  client.datasets.get_dataset_items(id='id', )
496
904
  """
497
905
  _response = self._raw_client.get_dataset_items(
498
- id, page=page, size=size, truncate=truncate, request_options=request_options
499
- )
500
- return _response.data
501
-
502
- def get_dataset_items_output_columns(
503
- self,
906
+ id,
907
+ page=page,
908
+ size=size,
909
+ version=version,
910
+ filters=filters,
911
+ truncate=truncate,
912
+ request_options=request_options,
913
+ )
914
+ return _response.data
915
+
916
+ def get_dataset_items_output_columns(
917
+ self,
504
918
  id: str,
505
919
  *,
506
920
  experiment_ids: typing.Optional[str] = None,
@@ -569,6 +983,208 @@ class DatasetsClient:
569
983
  ) as r:
570
984
  yield from r.data
571
985
 
986
+ def compare_dataset_versions(
987
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
988
+ ) -> DatasetVersionDiff:
989
+ """
990
+ Compare the latest committed dataset version with the current draft state. This endpoint provides insights into changes made since the last version was committed. The comparison calculates additions, modifications, deletions, and unchanged items between the latest version snapshot and current draft.
991
+
992
+ Parameters
993
+ ----------
994
+ id : str
995
+
996
+ request_options : typing.Optional[RequestOptions]
997
+ Request-specific configuration.
998
+
999
+ Returns
1000
+ -------
1001
+ DatasetVersionDiff
1002
+ Diff computed successfully
1003
+
1004
+ Examples
1005
+ --------
1006
+ from Opik import OpikApi
1007
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1008
+ client.datasets.compare_dataset_versions(id='id', )
1009
+ """
1010
+ _response = self._raw_client.compare_dataset_versions(id, request_options=request_options)
1011
+ return _response.data
1012
+
1013
+ def create_version_tag(
1014
+ self, version_hash: str, id: str, *, tag: str, request_options: typing.Optional[RequestOptions] = None
1015
+ ) -> None:
1016
+ """
1017
+ Add a tag to a specific dataset version for easy reference (e.g., 'baseline', 'v1.0', 'production')
1018
+
1019
+ Parameters
1020
+ ----------
1021
+ version_hash : str
1022
+
1023
+ id : str
1024
+
1025
+ tag : str
1026
+
1027
+ request_options : typing.Optional[RequestOptions]
1028
+ Request-specific configuration.
1029
+
1030
+ Returns
1031
+ -------
1032
+ None
1033
+
1034
+ Examples
1035
+ --------
1036
+ from Opik import OpikApi
1037
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1038
+ client.datasets.create_version_tag(version_hash='versionHash', id='id', tag='tag', )
1039
+ """
1040
+ _response = self._raw_client.create_version_tag(version_hash, id, tag=tag, request_options=request_options)
1041
+ return _response.data
1042
+
1043
+ def delete_version_tag(
1044
+ self, version_hash: str, tag: str, id: str, *, request_options: typing.Optional[RequestOptions] = None
1045
+ ) -> None:
1046
+ """
1047
+ Remove a tag from a dataset version. The version itself is not deleted, only the tag reference.
1048
+
1049
+ Parameters
1050
+ ----------
1051
+ version_hash : str
1052
+
1053
+ tag : str
1054
+
1055
+ id : str
1056
+
1057
+ request_options : typing.Optional[RequestOptions]
1058
+ Request-specific configuration.
1059
+
1060
+ Returns
1061
+ -------
1062
+ None
1063
+
1064
+ Examples
1065
+ --------
1066
+ from Opik import OpikApi
1067
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1068
+ client.datasets.delete_version_tag(version_hash='versionHash', tag='tag', id='id', )
1069
+ """
1070
+ _response = self._raw_client.delete_version_tag(version_hash, tag, id, request_options=request_options)
1071
+ return _response.data
1072
+
1073
+ def list_dataset_versions(
1074
+ self,
1075
+ id: str,
1076
+ *,
1077
+ page: typing.Optional[int] = None,
1078
+ size: typing.Optional[int] = None,
1079
+ request_options: typing.Optional[RequestOptions] = None,
1080
+ ) -> DatasetVersionPagePublic:
1081
+ """
1082
+ Get paginated list of versions for a dataset, ordered by creation time (newest first)
1083
+
1084
+ Parameters
1085
+ ----------
1086
+ id : str
1087
+
1088
+ page : typing.Optional[int]
1089
+
1090
+ size : typing.Optional[int]
1091
+
1092
+ request_options : typing.Optional[RequestOptions]
1093
+ Request-specific configuration.
1094
+
1095
+ Returns
1096
+ -------
1097
+ DatasetVersionPagePublic
1098
+ Dataset versions
1099
+
1100
+ Examples
1101
+ --------
1102
+ from Opik import OpikApi
1103
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1104
+ client.datasets.list_dataset_versions(id='id', )
1105
+ """
1106
+ _response = self._raw_client.list_dataset_versions(id, page=page, size=size, request_options=request_options)
1107
+ return _response.data
1108
+
1109
+ def restore_dataset_version(
1110
+ self, id: str, *, version_ref: str, request_options: typing.Optional[RequestOptions] = None
1111
+ ) -> DatasetVersionPublic:
1112
+ """
1113
+ Restores the dataset to a previous version state by creating a new version with items copied from the specified version. If the version is already the latest, returns it as-is (no-op).
1114
+
1115
+ Parameters
1116
+ ----------
1117
+ id : str
1118
+
1119
+ version_ref : str
1120
+ Version hash or tag to restore from
1121
+
1122
+ request_options : typing.Optional[RequestOptions]
1123
+ Request-specific configuration.
1124
+
1125
+ Returns
1126
+ -------
1127
+ DatasetVersionPublic
1128
+ Version restored successfully
1129
+
1130
+ Examples
1131
+ --------
1132
+ from Opik import OpikApi
1133
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1134
+ client.datasets.restore_dataset_version(id='id', version_ref='version_ref', )
1135
+ """
1136
+ _response = self._raw_client.restore_dataset_version(
1137
+ id, version_ref=version_ref, request_options=request_options
1138
+ )
1139
+ return _response.data
1140
+
1141
+ def update_dataset_version(
1142
+ self,
1143
+ version_hash: str,
1144
+ id: str,
1145
+ *,
1146
+ change_description: typing.Optional[str] = OMIT,
1147
+ tags_to_add: typing.Optional[typing.Sequence[str]] = OMIT,
1148
+ request_options: typing.Optional[RequestOptions] = None,
1149
+ ) -> DatasetVersionPublic:
1150
+ """
1151
+ Update a dataset version's change_description and/or add new tags
1152
+
1153
+ Parameters
1154
+ ----------
1155
+ version_hash : str
1156
+
1157
+ id : str
1158
+
1159
+ change_description : typing.Optional[str]
1160
+ Optional description of changes in this version
1161
+
1162
+ tags_to_add : typing.Optional[typing.Sequence[str]]
1163
+ Optional list of tags to add to this version
1164
+
1165
+ request_options : typing.Optional[RequestOptions]
1166
+ Request-specific configuration.
1167
+
1168
+ Returns
1169
+ -------
1170
+ DatasetVersionPublic
1171
+ Version updated successfully
1172
+
1173
+ Examples
1174
+ --------
1175
+ from Opik import OpikApi
1176
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1177
+ client.datasets.update_dataset_version(version_hash='versionHash', id='id', )
1178
+ """
1179
+ _response = self._raw_client.update_dataset_version(
1180
+ version_hash,
1181
+ id,
1182
+ change_description=change_description,
1183
+ tags_to_add=tags_to_add,
1184
+ request_options=request_options,
1185
+ )
1186
+ return _response.data
1187
+
572
1188
 
573
1189
  class AsyncDatasetsClient:
574
1190
  def __init__(self, *, client_wrapper: AsyncClientWrapper):
@@ -585,6 +1201,110 @@ class AsyncDatasetsClient:
585
1201
  """
586
1202
  return self._raw_client
587
1203
 
1204
+ async def apply_dataset_item_changes(
1205
+ self,
1206
+ id: str,
1207
+ *,
1208
+ request: DatasetItemChangesPublic,
1209
+ override: typing.Optional[bool] = None,
1210
+ request_options: typing.Optional[RequestOptions] = None,
1211
+ ) -> DatasetVersionPublic:
1212
+ """
1213
+ Apply delta changes (add, edit, delete) to a dataset version with conflict detection.
1214
+
1215
+ This endpoint:
1216
+ - Creates a new version with the applied changes
1217
+ - Validates that baseVersion matches the latest version (unless override=true)
1218
+ - Returns 409 Conflict if baseVersion is stale and override is not set
1219
+
1220
+ Use `override=true` query parameter to force version creation even with stale baseVersion.
1221
+
1222
+ Parameters
1223
+ ----------
1224
+ id : str
1225
+
1226
+ request : DatasetItemChangesPublic
1227
+
1228
+ override : typing.Optional[bool]
1229
+
1230
+ request_options : typing.Optional[RequestOptions]
1231
+ Request-specific configuration.
1232
+
1233
+ Returns
1234
+ -------
1235
+ DatasetVersionPublic
1236
+ Version created successfully
1237
+
1238
+ Examples
1239
+ --------
1240
+ from Opik import AsyncOpikApi
1241
+ import asyncio
1242
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1243
+ async def main() -> None:
1244
+ await client.datasets.apply_dataset_item_changes(id='id', request={'key': 'value'
1245
+ }, )
1246
+ asyncio.run(main())
1247
+ """
1248
+ _response = await self._raw_client.apply_dataset_item_changes(
1249
+ id, request=request, override=override, request_options=request_options
1250
+ )
1251
+ return _response.data
1252
+
1253
+ async def batch_update_dataset_items(
1254
+ self,
1255
+ *,
1256
+ update: DatasetItemUpdate,
1257
+ ids: typing.Optional[typing.Sequence[str]] = OMIT,
1258
+ filters: typing.Optional[typing.Sequence[DatasetItemFilter]] = OMIT,
1259
+ dataset_id: typing.Optional[str] = OMIT,
1260
+ merge_tags: typing.Optional[bool] = OMIT,
1261
+ request_options: typing.Optional[RequestOptions] = None,
1262
+ ) -> None:
1263
+ """
1264
+ Update multiple dataset items
1265
+
1266
+ Parameters
1267
+ ----------
1268
+ update : DatasetItemUpdate
1269
+
1270
+ ids : typing.Optional[typing.Sequence[str]]
1271
+ List of dataset item IDs to update (max 1000). Mutually exclusive with 'filters'.
1272
+
1273
+ filters : typing.Optional[typing.Sequence[DatasetItemFilter]]
1274
+
1275
+ dataset_id : typing.Optional[str]
1276
+ Dataset ID. Required when using 'filters', optional when using 'ids'.
1277
+
1278
+ merge_tags : typing.Optional[bool]
1279
+ If true, merge tags with existing tags instead of replacing them. Default: false. When using 'filters', this is automatically set to true.
1280
+
1281
+ request_options : typing.Optional[RequestOptions]
1282
+ Request-specific configuration.
1283
+
1284
+ Returns
1285
+ -------
1286
+ None
1287
+
1288
+ Examples
1289
+ --------
1290
+ from Opik import AsyncOpikApi
1291
+ from Opik import DatasetItemUpdate
1292
+ import asyncio
1293
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1294
+ async def main() -> None:
1295
+ await client.datasets.batch_update_dataset_items(update=DatasetItemUpdate(), )
1296
+ asyncio.run(main())
1297
+ """
1298
+ _response = await self._raw_client.batch_update_dataset_items(
1299
+ update=update,
1300
+ ids=ids,
1301
+ filters=filters,
1302
+ dataset_id=dataset_id,
1303
+ merge_tags=merge_tags,
1304
+ request_options=request_options,
1305
+ )
1306
+ return _response.data
1307
+
588
1308
  async def find_datasets(
589
1309
  self,
590
1310
  *,
@@ -739,23 +1459,28 @@ class AsyncDatasetsClient:
739
1459
  )
740
1460
  return _response.data
741
1461
 
742
- async def get_dataset_by_id(
743
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
744
- ) -> DatasetPublic:
1462
+ async def create_dataset_items_from_csv(
1463
+ self,
1464
+ *,
1465
+ file: typing.Dict[str, typing.Optional[typing.Any]],
1466
+ dataset_id: str,
1467
+ request_options: typing.Optional[RequestOptions] = None,
1468
+ ) -> None:
745
1469
  """
746
- Get dataset by id
1470
+ Create dataset items from uploaded CSV file. CSV should have headers in the first row. Processing happens asynchronously in batches.
747
1471
 
748
1472
  Parameters
749
1473
  ----------
750
- id : str
1474
+ file : typing.Dict[str, typing.Optional[typing.Any]]
1475
+
1476
+ dataset_id : str
751
1477
 
752
1478
  request_options : typing.Optional[RequestOptions]
753
1479
  Request-specific configuration.
754
1480
 
755
1481
  Returns
756
1482
  -------
757
- DatasetPublic
758
- Dataset resource
1483
+ None
759
1484
 
760
1485
  Examples
761
1486
  --------
@@ -763,36 +1488,34 @@ class AsyncDatasetsClient:
763
1488
  import asyncio
764
1489
  client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
765
1490
  async def main() -> None:
766
- await client.datasets.get_dataset_by_id(id='id', )
1491
+ await client.datasets.create_dataset_items_from_csv(file={'key': 'value'
1492
+ }, dataset_id='dataset_id', )
767
1493
  asyncio.run(main())
768
1494
  """
769
- _response = await self._raw_client.get_dataset_by_id(id, request_options=request_options)
1495
+ _response = await self._raw_client.create_dataset_items_from_csv(
1496
+ file=file, dataset_id=dataset_id, request_options=request_options
1497
+ )
770
1498
  return _response.data
771
1499
 
772
- async def update_dataset(
1500
+ async def create_dataset_items_from_spans(
773
1501
  self,
774
- id: str,
1502
+ dataset_id: str,
775
1503
  *,
776
- name: str,
777
- description: typing.Optional[str] = OMIT,
778
- visibility: typing.Optional[DatasetUpdateVisibility] = OMIT,
779
- tags: typing.Optional[typing.Sequence[str]] = OMIT,
1504
+ span_ids: typing.Sequence[str],
1505
+ enrichment_options: SpanEnrichmentOptions,
780
1506
  request_options: typing.Optional[RequestOptions] = None,
781
1507
  ) -> None:
782
1508
  """
783
- Update dataset by id
1509
+ Create dataset items from spans with enriched metadata
784
1510
 
785
1511
  Parameters
786
1512
  ----------
787
- id : str
788
-
789
- name : str
1513
+ dataset_id : str
790
1514
 
791
- description : typing.Optional[str]
792
-
793
- visibility : typing.Optional[DatasetUpdateVisibility]
1515
+ span_ids : typing.Sequence[str]
1516
+ Set of span IDs to add to the dataset
794
1517
 
795
- tags : typing.Optional[typing.Sequence[str]]
1518
+ enrichment_options : SpanEnrichmentOptions
796
1519
 
797
1520
  request_options : typing.Optional[RequestOptions]
798
1521
  Request-specific configuration.
@@ -804,18 +1527,137 @@ class AsyncDatasetsClient:
804
1527
  Examples
805
1528
  --------
806
1529
  from Opik import AsyncOpikApi
1530
+ from Opik import SpanEnrichmentOptions
807
1531
  import asyncio
808
1532
  client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
809
1533
  async def main() -> None:
810
- await client.datasets.update_dataset(id='id', name='name', )
1534
+ await client.datasets.create_dataset_items_from_spans(dataset_id='dataset_id', span_ids=['span_ids'], enrichment_options=SpanEnrichmentOptions(), )
811
1535
  asyncio.run(main())
812
1536
  """
813
- _response = await self._raw_client.update_dataset(
814
- id, name=name, description=description, visibility=visibility, tags=tags, request_options=request_options
1537
+ _response = await self._raw_client.create_dataset_items_from_spans(
1538
+ dataset_id, span_ids=span_ids, enrichment_options=enrichment_options, request_options=request_options
815
1539
  )
816
1540
  return _response.data
817
1541
 
818
- async def delete_dataset(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
1542
+ async def create_dataset_items_from_traces(
1543
+ self,
1544
+ dataset_id: str,
1545
+ *,
1546
+ trace_ids: typing.Sequence[str],
1547
+ enrichment_options: TraceEnrichmentOptions,
1548
+ request_options: typing.Optional[RequestOptions] = None,
1549
+ ) -> None:
1550
+ """
1551
+ Create dataset items from traces with enriched metadata
1552
+
1553
+ Parameters
1554
+ ----------
1555
+ dataset_id : str
1556
+
1557
+ trace_ids : typing.Sequence[str]
1558
+ Set of trace IDs to add to the dataset
1559
+
1560
+ enrichment_options : TraceEnrichmentOptions
1561
+
1562
+ request_options : typing.Optional[RequestOptions]
1563
+ Request-specific configuration.
1564
+
1565
+ Returns
1566
+ -------
1567
+ None
1568
+
1569
+ Examples
1570
+ --------
1571
+ from Opik import AsyncOpikApi
1572
+ from Opik import TraceEnrichmentOptions
1573
+ import asyncio
1574
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1575
+ async def main() -> None:
1576
+ await client.datasets.create_dataset_items_from_traces(dataset_id='dataset_id', trace_ids=['trace_ids'], enrichment_options=TraceEnrichmentOptions(), )
1577
+ asyncio.run(main())
1578
+ """
1579
+ _response = await self._raw_client.create_dataset_items_from_traces(
1580
+ dataset_id, trace_ids=trace_ids, enrichment_options=enrichment_options, request_options=request_options
1581
+ )
1582
+ return _response.data
1583
+
1584
+ async def get_dataset_by_id(
1585
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
1586
+ ) -> DatasetPublic:
1587
+ """
1588
+ Get dataset by id
1589
+
1590
+ Parameters
1591
+ ----------
1592
+ id : str
1593
+
1594
+ request_options : typing.Optional[RequestOptions]
1595
+ Request-specific configuration.
1596
+
1597
+ Returns
1598
+ -------
1599
+ DatasetPublic
1600
+ Dataset resource
1601
+
1602
+ Examples
1603
+ --------
1604
+ from Opik import AsyncOpikApi
1605
+ import asyncio
1606
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1607
+ async def main() -> None:
1608
+ await client.datasets.get_dataset_by_id(id='id', )
1609
+ asyncio.run(main())
1610
+ """
1611
+ _response = await self._raw_client.get_dataset_by_id(id, request_options=request_options)
1612
+ return _response.data
1613
+
1614
+ async def update_dataset(
1615
+ self,
1616
+ id: str,
1617
+ *,
1618
+ name: str,
1619
+ description: typing.Optional[str] = OMIT,
1620
+ visibility: typing.Optional[DatasetUpdateVisibility] = OMIT,
1621
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
1622
+ request_options: typing.Optional[RequestOptions] = None,
1623
+ ) -> None:
1624
+ """
1625
+ Update dataset by id
1626
+
1627
+ Parameters
1628
+ ----------
1629
+ id : str
1630
+
1631
+ name : str
1632
+
1633
+ description : typing.Optional[str]
1634
+
1635
+ visibility : typing.Optional[DatasetUpdateVisibility]
1636
+
1637
+ tags : typing.Optional[typing.Sequence[str]]
1638
+
1639
+ request_options : typing.Optional[RequestOptions]
1640
+ Request-specific configuration.
1641
+
1642
+ Returns
1643
+ -------
1644
+ None
1645
+
1646
+ Examples
1647
+ --------
1648
+ from Opik import AsyncOpikApi
1649
+ import asyncio
1650
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1651
+ async def main() -> None:
1652
+ await client.datasets.update_dataset(id='id', name='name', )
1653
+ asyncio.run(main())
1654
+ """
1655
+ _response = await self._raw_client.update_dataset(
1656
+ id, name=name, description=description, visibility=visibility, tags=tags, request_options=request_options
1657
+ )
1658
+ return _response.data
1659
+
1660
+ async def delete_dataset(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
819
1661
  """
820
1662
  Delete dataset by id
821
1663
 
@@ -874,14 +1716,30 @@ class AsyncDatasetsClient:
874
1716
  return _response.data
875
1717
 
876
1718
  async def delete_dataset_items(
877
- self, *, item_ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
1719
+ self,
1720
+ *,
1721
+ item_ids: typing.Optional[typing.Sequence[str]] = OMIT,
1722
+ dataset_id: typing.Optional[str] = OMIT,
1723
+ filters: typing.Optional[typing.Sequence[DatasetItemFilter]] = OMIT,
1724
+ request_options: typing.Optional[RequestOptions] = None,
878
1725
  ) -> None:
879
1726
  """
880
- Delete dataset items
1727
+ Delete dataset items using one of two modes:
1728
+ 1. **Delete by IDs**: Provide 'item_ids' to delete specific items by their IDs
1729
+ 2. **Delete by filters**: Provide 'dataset_id' with optional 'filters' to delete items matching criteria
1730
+
1731
+ When using filters, an empty 'filters' array will delete all items in the specified dataset.
881
1732
 
882
1733
  Parameters
883
1734
  ----------
884
- item_ids : typing.Sequence[str]
1735
+ item_ids : typing.Optional[typing.Sequence[str]]
1736
+ List of dataset item IDs to delete (max 1000). Use this to delete specific items by their IDs. Mutually exclusive with 'dataset_id' and 'filters'.
1737
+
1738
+ dataset_id : typing.Optional[str]
1739
+ Dataset ID to scope the deletion. Required when using 'filters'. Mutually exclusive with 'item_ids'.
1740
+
1741
+ filters : typing.Optional[typing.Sequence[DatasetItemFilter]]
1742
+ Filters to select dataset items to delete within the specified dataset. Must be used with 'dataset_id'. Mutually exclusive with 'item_ids'. Empty array means 'delete all items in the dataset'.
885
1743
 
886
1744
  request_options : typing.Optional[RequestOptions]
887
1745
  Request-specific configuration.
@@ -896,10 +1754,12 @@ class AsyncDatasetsClient:
896
1754
  import asyncio
897
1755
  client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
898
1756
  async def main() -> None:
899
- await client.datasets.delete_dataset_items(item_ids=['item_ids'], )
1757
+ await client.datasets.delete_dataset_items()
900
1758
  asyncio.run(main())
901
1759
  """
902
- _response = await self._raw_client.delete_dataset_items(item_ids=item_ids, request_options=request_options)
1760
+ _response = await self._raw_client.delete_dataset_items(
1761
+ item_ids=item_ids, dataset_id=dataset_id, filters=filters, request_options=request_options
1762
+ )
903
1763
  return _response.data
904
1764
 
905
1765
  async def delete_datasets_batch(
@@ -931,6 +1791,67 @@ class AsyncDatasetsClient:
931
1791
  _response = await self._raw_client.delete_datasets_batch(ids=ids, request_options=request_options)
932
1792
  return _response.data
933
1793
 
1794
+ async def expand_dataset(
1795
+ self,
1796
+ id: str,
1797
+ *,
1798
+ model: str,
1799
+ sample_count: typing.Optional[int] = OMIT,
1800
+ preserve_fields: typing.Optional[typing.Sequence[str]] = OMIT,
1801
+ variation_instructions: typing.Optional[str] = OMIT,
1802
+ custom_prompt: typing.Optional[str] = OMIT,
1803
+ request_options: typing.Optional[RequestOptions] = None,
1804
+ ) -> DatasetExpansionResponse:
1805
+ """
1806
+ Generate synthetic dataset samples using LLM based on existing data patterns
1807
+
1808
+ Parameters
1809
+ ----------
1810
+ id : str
1811
+
1812
+ model : str
1813
+ The model to use for synthetic data generation
1814
+
1815
+ sample_count : typing.Optional[int]
1816
+ Number of synthetic samples to generate
1817
+
1818
+ preserve_fields : typing.Optional[typing.Sequence[str]]
1819
+ Fields to preserve patterns from original data
1820
+
1821
+ variation_instructions : typing.Optional[str]
1822
+ Additional instructions for data variation
1823
+
1824
+ custom_prompt : typing.Optional[str]
1825
+ Custom prompt to use for generation instead of auto-generated one
1826
+
1827
+ request_options : typing.Optional[RequestOptions]
1828
+ Request-specific configuration.
1829
+
1830
+ Returns
1831
+ -------
1832
+ DatasetExpansionResponse
1833
+ Generated synthetic samples
1834
+
1835
+ Examples
1836
+ --------
1837
+ from Opik import AsyncOpikApi
1838
+ import asyncio
1839
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1840
+ async def main() -> None:
1841
+ await client.datasets.expand_dataset(id='id', model='gpt-4', )
1842
+ asyncio.run(main())
1843
+ """
1844
+ _response = await self._raw_client.expand_dataset(
1845
+ id,
1846
+ model=model,
1847
+ sample_count=sample_count,
1848
+ preserve_fields=preserve_fields,
1849
+ variation_instructions=variation_instructions,
1850
+ custom_prompt=custom_prompt,
1851
+ request_options=request_options,
1852
+ )
1853
+ return _response.data
1854
+
934
1855
  async def find_dataset_items_with_experiment_items(
935
1856
  self,
936
1857
  id: str,
@@ -939,6 +1860,8 @@ class AsyncDatasetsClient:
939
1860
  page: typing.Optional[int] = None,
940
1861
  size: typing.Optional[int] = None,
941
1862
  filters: typing.Optional[str] = None,
1863
+ sorting: typing.Optional[str] = None,
1864
+ search: typing.Optional[str] = None,
942
1865
  truncate: typing.Optional[bool] = None,
943
1866
  request_options: typing.Optional[RequestOptions] = None,
944
1867
  ) -> DatasetItemPageCompare:
@@ -957,6 +1880,10 @@ class AsyncDatasetsClient:
957
1880
 
958
1881
  filters : typing.Optional[str]
959
1882
 
1883
+ sorting : typing.Optional[str]
1884
+
1885
+ search : typing.Optional[str]
1886
+
960
1887
  truncate : typing.Optional[bool]
961
1888
 
962
1889
  request_options : typing.Optional[RequestOptions]
@@ -982,6 +1909,8 @@ class AsyncDatasetsClient:
982
1909
  page=page,
983
1910
  size=size,
984
1911
  filters=filters,
1912
+ sorting=sorting,
1913
+ search=search,
985
1914
  truncate=truncate,
986
1915
  request_options=request_options,
987
1916
  )
@@ -1019,6 +1948,47 @@ class AsyncDatasetsClient:
1019
1948
  )
1020
1949
  return _response.data
1021
1950
 
1951
+ async def get_dataset_experiment_items_stats(
1952
+ self,
1953
+ id: str,
1954
+ *,
1955
+ experiment_ids: str,
1956
+ filters: typing.Optional[str] = None,
1957
+ request_options: typing.Optional[RequestOptions] = None,
1958
+ ) -> ProjectStatsPublic:
1959
+ """
1960
+ Get experiment items stats for dataset
1961
+
1962
+ Parameters
1963
+ ----------
1964
+ id : str
1965
+
1966
+ experiment_ids : str
1967
+
1968
+ filters : typing.Optional[str]
1969
+
1970
+ request_options : typing.Optional[RequestOptions]
1971
+ Request-specific configuration.
1972
+
1973
+ Returns
1974
+ -------
1975
+ ProjectStatsPublic
1976
+ Experiment items stats resource
1977
+
1978
+ Examples
1979
+ --------
1980
+ from Opik import AsyncOpikApi
1981
+ import asyncio
1982
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1983
+ async def main() -> None:
1984
+ await client.datasets.get_dataset_experiment_items_stats(id='id', experiment_ids='experiment_ids', )
1985
+ asyncio.run(main())
1986
+ """
1987
+ _response = await self._raw_client.get_dataset_experiment_items_stats(
1988
+ id, experiment_ids=experiment_ids, filters=filters, request_options=request_options
1989
+ )
1990
+ return _response.data
1991
+
1022
1992
  async def get_dataset_item_by_id(
1023
1993
  self, item_id: str, *, request_options: typing.Optional[RequestOptions] = None
1024
1994
  ) -> DatasetItemPublic:
@@ -1049,12 +2019,74 @@ class AsyncDatasetsClient:
1049
2019
  _response = await self._raw_client.get_dataset_item_by_id(item_id, request_options=request_options)
1050
2020
  return _response.data
1051
2021
 
2022
+ async def patch_dataset_item(
2023
+ self,
2024
+ item_id: str,
2025
+ *,
2026
+ source: DatasetItemWriteSource,
2027
+ data: JsonNode,
2028
+ id: typing.Optional[str] = OMIT,
2029
+ trace_id: typing.Optional[str] = OMIT,
2030
+ span_id: typing.Optional[str] = OMIT,
2031
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
2032
+ request_options: typing.Optional[RequestOptions] = None,
2033
+ ) -> None:
2034
+ """
2035
+ Partially update dataset item by id. Only provided fields will be updated.
2036
+
2037
+ Parameters
2038
+ ----------
2039
+ item_id : str
2040
+
2041
+ source : DatasetItemWriteSource
2042
+
2043
+ data : JsonNode
2044
+
2045
+ id : typing.Optional[str]
2046
+
2047
+ trace_id : typing.Optional[str]
2048
+
2049
+ span_id : typing.Optional[str]
2050
+
2051
+ tags : typing.Optional[typing.Sequence[str]]
2052
+
2053
+ request_options : typing.Optional[RequestOptions]
2054
+ Request-specific configuration.
2055
+
2056
+ Returns
2057
+ -------
2058
+ None
2059
+
2060
+ Examples
2061
+ --------
2062
+ from Opik import AsyncOpikApi
2063
+ import asyncio
2064
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2065
+ async def main() -> None:
2066
+ await client.datasets.patch_dataset_item(item_id='itemId', source="manual", data={'key': 'value'
2067
+ }, )
2068
+ asyncio.run(main())
2069
+ """
2070
+ _response = await self._raw_client.patch_dataset_item(
2071
+ item_id,
2072
+ source=source,
2073
+ data=data,
2074
+ id=id,
2075
+ trace_id=trace_id,
2076
+ span_id=span_id,
2077
+ tags=tags,
2078
+ request_options=request_options,
2079
+ )
2080
+ return _response.data
2081
+
1052
2082
  async def get_dataset_items(
1053
2083
  self,
1054
2084
  id: str,
1055
2085
  *,
1056
2086
  page: typing.Optional[int] = None,
1057
2087
  size: typing.Optional[int] = None,
2088
+ version: typing.Optional[str] = None,
2089
+ filters: typing.Optional[str] = None,
1058
2090
  truncate: typing.Optional[bool] = None,
1059
2091
  request_options: typing.Optional[RequestOptions] = None,
1060
2092
  ) -> DatasetItemPagePublic:
@@ -1069,6 +2101,10 @@ class AsyncDatasetsClient:
1069
2101
 
1070
2102
  size : typing.Optional[int]
1071
2103
 
2104
+ version : typing.Optional[str]
2105
+
2106
+ filters : typing.Optional[str]
2107
+
1072
2108
  truncate : typing.Optional[bool]
1073
2109
 
1074
2110
  request_options : typing.Optional[RequestOptions]
@@ -1089,7 +2125,13 @@ class AsyncDatasetsClient:
1089
2125
  asyncio.run(main())
1090
2126
  """
1091
2127
  _response = await self._raw_client.get_dataset_items(
1092
- id, page=page, size=size, truncate=truncate, request_options=request_options
2128
+ id,
2129
+ page=page,
2130
+ size=size,
2131
+ version=version,
2132
+ filters=filters,
2133
+ truncate=truncate,
2134
+ request_options=request_options,
1093
2135
  )
1094
2136
  return _response.data
1095
2137
 
@@ -1166,3 +2208,227 @@ class AsyncDatasetsClient:
1166
2208
  ) as r:
1167
2209
  async for data in r.data:
1168
2210
  yield data
2211
+
2212
+ async def compare_dataset_versions(
2213
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
2214
+ ) -> DatasetVersionDiff:
2215
+ """
2216
+ Compare the latest committed dataset version with the current draft state. This endpoint provides insights into changes made since the last version was committed. The comparison calculates additions, modifications, deletions, and unchanged items between the latest version snapshot and current draft.
2217
+
2218
+ Parameters
2219
+ ----------
2220
+ id : str
2221
+
2222
+ request_options : typing.Optional[RequestOptions]
2223
+ Request-specific configuration.
2224
+
2225
+ Returns
2226
+ -------
2227
+ DatasetVersionDiff
2228
+ Diff computed successfully
2229
+
2230
+ Examples
2231
+ --------
2232
+ from Opik import AsyncOpikApi
2233
+ import asyncio
2234
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2235
+ async def main() -> None:
2236
+ await client.datasets.compare_dataset_versions(id='id', )
2237
+ asyncio.run(main())
2238
+ """
2239
+ _response = await self._raw_client.compare_dataset_versions(id, request_options=request_options)
2240
+ return _response.data
2241
+
2242
+ async def create_version_tag(
2243
+ self, version_hash: str, id: str, *, tag: str, request_options: typing.Optional[RequestOptions] = None
2244
+ ) -> None:
2245
+ """
2246
+ Add a tag to a specific dataset version for easy reference (e.g., 'baseline', 'v1.0', 'production')
2247
+
2248
+ Parameters
2249
+ ----------
2250
+ version_hash : str
2251
+
2252
+ id : str
2253
+
2254
+ tag : str
2255
+
2256
+ request_options : typing.Optional[RequestOptions]
2257
+ Request-specific configuration.
2258
+
2259
+ Returns
2260
+ -------
2261
+ None
2262
+
2263
+ Examples
2264
+ --------
2265
+ from Opik import AsyncOpikApi
2266
+ import asyncio
2267
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2268
+ async def main() -> None:
2269
+ await client.datasets.create_version_tag(version_hash='versionHash', id='id', tag='tag', )
2270
+ asyncio.run(main())
2271
+ """
2272
+ _response = await self._raw_client.create_version_tag(
2273
+ version_hash, id, tag=tag, request_options=request_options
2274
+ )
2275
+ return _response.data
2276
+
2277
+ async def delete_version_tag(
2278
+ self, version_hash: str, tag: str, id: str, *, request_options: typing.Optional[RequestOptions] = None
2279
+ ) -> None:
2280
+ """
2281
+ Remove a tag from a dataset version. The version itself is not deleted, only the tag reference.
2282
+
2283
+ Parameters
2284
+ ----------
2285
+ version_hash : str
2286
+
2287
+ tag : str
2288
+
2289
+ id : str
2290
+
2291
+ request_options : typing.Optional[RequestOptions]
2292
+ Request-specific configuration.
2293
+
2294
+ Returns
2295
+ -------
2296
+ None
2297
+
2298
+ Examples
2299
+ --------
2300
+ from Opik import AsyncOpikApi
2301
+ import asyncio
2302
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2303
+ async def main() -> None:
2304
+ await client.datasets.delete_version_tag(version_hash='versionHash', tag='tag', id='id', )
2305
+ asyncio.run(main())
2306
+ """
2307
+ _response = await self._raw_client.delete_version_tag(version_hash, tag, id, request_options=request_options)
2308
+ return _response.data
2309
+
2310
+ async def list_dataset_versions(
2311
+ self,
2312
+ id: str,
2313
+ *,
2314
+ page: typing.Optional[int] = None,
2315
+ size: typing.Optional[int] = None,
2316
+ request_options: typing.Optional[RequestOptions] = None,
2317
+ ) -> DatasetVersionPagePublic:
2318
+ """
2319
+ Get paginated list of versions for a dataset, ordered by creation time (newest first)
2320
+
2321
+ Parameters
2322
+ ----------
2323
+ id : str
2324
+
2325
+ page : typing.Optional[int]
2326
+
2327
+ size : typing.Optional[int]
2328
+
2329
+ request_options : typing.Optional[RequestOptions]
2330
+ Request-specific configuration.
2331
+
2332
+ Returns
2333
+ -------
2334
+ DatasetVersionPagePublic
2335
+ Dataset versions
2336
+
2337
+ Examples
2338
+ --------
2339
+ from Opik import AsyncOpikApi
2340
+ import asyncio
2341
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2342
+ async def main() -> None:
2343
+ await client.datasets.list_dataset_versions(id='id', )
2344
+ asyncio.run(main())
2345
+ """
2346
+ _response = await self._raw_client.list_dataset_versions(
2347
+ id, page=page, size=size, request_options=request_options
2348
+ )
2349
+ return _response.data
2350
+
2351
+ async def restore_dataset_version(
2352
+ self, id: str, *, version_ref: str, request_options: typing.Optional[RequestOptions] = None
2353
+ ) -> DatasetVersionPublic:
2354
+ """
2355
+ Restores the dataset to a previous version state by creating a new version with items copied from the specified version. If the version is already the latest, returns it as-is (no-op).
2356
+
2357
+ Parameters
2358
+ ----------
2359
+ id : str
2360
+
2361
+ version_ref : str
2362
+ Version hash or tag to restore from
2363
+
2364
+ request_options : typing.Optional[RequestOptions]
2365
+ Request-specific configuration.
2366
+
2367
+ Returns
2368
+ -------
2369
+ DatasetVersionPublic
2370
+ Version restored successfully
2371
+
2372
+ Examples
2373
+ --------
2374
+ from Opik import AsyncOpikApi
2375
+ import asyncio
2376
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2377
+ async def main() -> None:
2378
+ await client.datasets.restore_dataset_version(id='id', version_ref='version_ref', )
2379
+ asyncio.run(main())
2380
+ """
2381
+ _response = await self._raw_client.restore_dataset_version(
2382
+ id, version_ref=version_ref, request_options=request_options
2383
+ )
2384
+ return _response.data
2385
+
2386
+ async def update_dataset_version(
2387
+ self,
2388
+ version_hash: str,
2389
+ id: str,
2390
+ *,
2391
+ change_description: typing.Optional[str] = OMIT,
2392
+ tags_to_add: typing.Optional[typing.Sequence[str]] = OMIT,
2393
+ request_options: typing.Optional[RequestOptions] = None,
2394
+ ) -> DatasetVersionPublic:
2395
+ """
2396
+ Update a dataset version's change_description and/or add new tags
2397
+
2398
+ Parameters
2399
+ ----------
2400
+ version_hash : str
2401
+
2402
+ id : str
2403
+
2404
+ change_description : typing.Optional[str]
2405
+ Optional description of changes in this version
2406
+
2407
+ tags_to_add : typing.Optional[typing.Sequence[str]]
2408
+ Optional list of tags to add to this version
2409
+
2410
+ request_options : typing.Optional[RequestOptions]
2411
+ Request-specific configuration.
2412
+
2413
+ Returns
2414
+ -------
2415
+ DatasetVersionPublic
2416
+ Version updated successfully
2417
+
2418
+ Examples
2419
+ --------
2420
+ from Opik import AsyncOpikApi
2421
+ import asyncio
2422
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2423
+ async def main() -> None:
2424
+ await client.datasets.update_dataset_version(version_hash='versionHash', id='id', )
2425
+ asyncio.run(main())
2426
+ """
2427
+ _response = await self._raw_client.update_dataset_version(
2428
+ version_hash,
2429
+ id,
2430
+ change_description=change_description,
2431
+ tags_to_add=tags_to_add,
2432
+ request_options=request_options,
2433
+ )
2434
+ return _response.data