opik 1.6.4__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 (1021) hide show
  1. opik/__init__.py +33 -2
  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/__init__.py +5 -0
  9. opik/api_objects/attachment/attachment.py +20 -0
  10. opik/api_objects/attachment/attachment_context.py +36 -0
  11. opik/api_objects/attachment/attachments_extractor.py +153 -0
  12. opik/api_objects/attachment/client.py +220 -0
  13. opik/api_objects/attachment/converters.py +51 -0
  14. opik/api_objects/attachment/decoder.py +18 -0
  15. opik/api_objects/attachment/decoder_base64.py +83 -0
  16. opik/api_objects/attachment/decoder_helpers.py +137 -0
  17. opik/api_objects/conversation/__init__.py +0 -0
  18. opik/api_objects/conversation/conversation_factory.py +43 -0
  19. opik/api_objects/conversation/conversation_thread.py +49 -0
  20. opik/api_objects/data_helpers.py +79 -0
  21. opik/api_objects/dataset/dataset.py +107 -45
  22. opik/api_objects/dataset/rest_operations.py +12 -3
  23. opik/api_objects/experiment/experiment.py +81 -45
  24. opik/api_objects/experiment/experiment_item.py +2 -1
  25. opik/api_objects/experiment/experiments_client.py +64 -0
  26. opik/api_objects/experiment/helpers.py +35 -11
  27. opik/api_objects/experiment/rest_operations.py +88 -19
  28. opik/api_objects/helpers.py +104 -7
  29. opik/api_objects/local_recording.py +81 -0
  30. opik/api_objects/opik_client.py +872 -174
  31. opik/api_objects/opik_query_language.py +136 -18
  32. opik/api_objects/optimization/__init__.py +3 -0
  33. opik/api_objects/optimization/optimization.py +39 -0
  34. opik/api_objects/prompt/__init__.py +13 -1
  35. opik/api_objects/prompt/base_prompt.py +69 -0
  36. opik/api_objects/prompt/base_prompt_template.py +29 -0
  37. opik/api_objects/prompt/chat/__init__.py +1 -0
  38. opik/api_objects/prompt/chat/chat_prompt.py +210 -0
  39. opik/api_objects/prompt/chat/chat_prompt_template.py +350 -0
  40. opik/api_objects/prompt/chat/content_renderer_registry.py +203 -0
  41. opik/api_objects/prompt/client.py +193 -41
  42. opik/api_objects/prompt/text/__init__.py +1 -0
  43. opik/api_objects/prompt/text/prompt.py +174 -0
  44. opik/api_objects/prompt/text/prompt_template.py +55 -0
  45. opik/api_objects/prompt/types.py +29 -0
  46. opik/api_objects/rest_stream_parser.py +98 -0
  47. opik/api_objects/search_helpers.py +89 -0
  48. opik/api_objects/span/span_client.py +165 -45
  49. opik/api_objects/span/span_data.py +136 -25
  50. opik/api_objects/threads/__init__.py +0 -0
  51. opik/api_objects/threads/threads_client.py +185 -0
  52. opik/api_objects/trace/trace_client.py +72 -36
  53. opik/api_objects/trace/trace_data.py +112 -26
  54. opik/api_objects/validation_helpers.py +3 -3
  55. opik/cli/__init__.py +5 -0
  56. opik/cli/__main__.py +6 -0
  57. opik/cli/configure.py +66 -0
  58. opik/cli/exports/__init__.py +131 -0
  59. opik/cli/exports/dataset.py +278 -0
  60. opik/cli/exports/experiment.py +784 -0
  61. opik/cli/exports/project.py +685 -0
  62. opik/cli/exports/prompt.py +578 -0
  63. opik/cli/exports/utils.py +406 -0
  64. opik/cli/harbor.py +39 -0
  65. opik/cli/healthcheck.py +21 -0
  66. opik/cli/imports/__init__.py +439 -0
  67. opik/cli/imports/dataset.py +143 -0
  68. opik/cli/imports/experiment.py +1192 -0
  69. opik/cli/imports/project.py +262 -0
  70. opik/cli/imports/prompt.py +177 -0
  71. opik/cli/imports/utils.py +280 -0
  72. opik/cli/main.py +49 -0
  73. opik/cli/proxy.py +93 -0
  74. opik/cli/usage_report/__init__.py +16 -0
  75. opik/cli/usage_report/charts.py +783 -0
  76. opik/cli/usage_report/cli.py +274 -0
  77. opik/cli/usage_report/constants.py +9 -0
  78. opik/cli/usage_report/extraction.py +749 -0
  79. opik/cli/usage_report/pdf.py +244 -0
  80. opik/cli/usage_report/statistics.py +78 -0
  81. opik/cli/usage_report/utils.py +235 -0
  82. opik/config.py +62 -4
  83. opik/configurator/configure.py +45 -6
  84. opik/configurator/opik_rest_helpers.py +4 -1
  85. opik/context_storage.py +164 -65
  86. opik/datetime_helpers.py +12 -0
  87. opik/decorator/arguments_helpers.py +9 -1
  88. opik/decorator/base_track_decorator.py +298 -146
  89. opik/decorator/context_manager/__init__.py +0 -0
  90. opik/decorator/context_manager/span_context_manager.py +123 -0
  91. opik/decorator/context_manager/trace_context_manager.py +84 -0
  92. opik/decorator/generator_wrappers.py +3 -2
  93. opik/decorator/inspect_helpers.py +11 -0
  94. opik/decorator/opik_args/__init__.py +13 -0
  95. opik/decorator/opik_args/api_classes.py +71 -0
  96. opik/decorator/opik_args/helpers.py +120 -0
  97. opik/decorator/span_creation_handler.py +49 -21
  98. opik/decorator/tracker.py +9 -1
  99. opik/dict_utils.py +3 -3
  100. opik/environment.py +13 -1
  101. opik/error_tracking/api.py +1 -1
  102. opik/error_tracking/before_send.py +6 -5
  103. opik/error_tracking/environment_details.py +29 -7
  104. opik/error_tracking/error_filtering/filter_by_response_status_code.py +42 -0
  105. opik/error_tracking/error_filtering/filter_chain_builder.py +14 -3
  106. opik/evaluation/__init__.py +14 -2
  107. opik/evaluation/engine/engine.py +280 -82
  108. opik/evaluation/engine/evaluation_tasks_executor.py +15 -10
  109. opik/evaluation/engine/helpers.py +34 -9
  110. opik/evaluation/engine/metrics_evaluator.py +237 -0
  111. opik/evaluation/engine/types.py +5 -4
  112. opik/evaluation/evaluation_result.py +169 -2
  113. opik/evaluation/evaluator.py +659 -58
  114. opik/evaluation/metrics/__init__.py +121 -6
  115. opik/evaluation/metrics/aggregated_metric.py +92 -0
  116. opik/evaluation/metrics/arguments_helpers.py +15 -21
  117. opik/evaluation/metrics/arguments_validator.py +38 -0
  118. opik/evaluation/metrics/base_metric.py +20 -10
  119. opik/evaluation/metrics/conversation/__init__.py +48 -0
  120. opik/evaluation/metrics/conversation/conversation_thread_metric.py +79 -0
  121. opik/evaluation/metrics/conversation/conversation_turns_factory.py +39 -0
  122. opik/evaluation/metrics/conversation/g_eval_wrappers.py +19 -0
  123. opik/evaluation/metrics/conversation/helpers.py +84 -0
  124. opik/evaluation/metrics/conversation/heuristics/__init__.py +14 -0
  125. opik/evaluation/metrics/conversation/heuristics/degeneration/__init__.py +3 -0
  126. opik/evaluation/metrics/conversation/heuristics/degeneration/metric.py +189 -0
  127. opik/evaluation/metrics/conversation/heuristics/degeneration/phrases.py +12 -0
  128. opik/evaluation/metrics/conversation/heuristics/knowledge_retention/__init__.py +3 -0
  129. opik/evaluation/metrics/conversation/heuristics/knowledge_retention/metric.py +172 -0
  130. opik/evaluation/metrics/conversation/llm_judges/__init__.py +32 -0
  131. opik/evaluation/metrics/conversation/llm_judges/conversational_coherence/__init__.py +0 -0
  132. opik/evaluation/metrics/conversation/llm_judges/conversational_coherence/metric.py +274 -0
  133. opik/evaluation/metrics/conversation/llm_judges/conversational_coherence/schema.py +16 -0
  134. opik/evaluation/metrics/conversation/llm_judges/conversational_coherence/templates.py +95 -0
  135. opik/evaluation/metrics/conversation/llm_judges/g_eval_wrappers.py +442 -0
  136. opik/evaluation/metrics/conversation/llm_judges/session_completeness/__init__.py +0 -0
  137. opik/evaluation/metrics/conversation/llm_judges/session_completeness/metric.py +295 -0
  138. opik/evaluation/metrics/conversation/llm_judges/session_completeness/schema.py +22 -0
  139. opik/evaluation/metrics/conversation/llm_judges/session_completeness/templates.py +139 -0
  140. opik/evaluation/metrics/conversation/llm_judges/user_frustration/__init__.py +0 -0
  141. opik/evaluation/metrics/conversation/llm_judges/user_frustration/metric.py +277 -0
  142. opik/evaluation/metrics/conversation/llm_judges/user_frustration/schema.py +16 -0
  143. opik/evaluation/metrics/conversation/llm_judges/user_frustration/templates.py +135 -0
  144. opik/evaluation/metrics/conversation/types.py +34 -0
  145. opik/evaluation/metrics/conversation_types.py +9 -0
  146. opik/evaluation/metrics/heuristics/bertscore.py +107 -0
  147. opik/evaluation/metrics/heuristics/bleu.py +43 -16
  148. opik/evaluation/metrics/heuristics/chrf.py +127 -0
  149. opik/evaluation/metrics/heuristics/contains.py +50 -11
  150. opik/evaluation/metrics/heuristics/distribution_metrics.py +331 -0
  151. opik/evaluation/metrics/heuristics/equals.py +4 -1
  152. opik/evaluation/metrics/heuristics/gleu.py +113 -0
  153. opik/evaluation/metrics/heuristics/is_json.py +9 -3
  154. opik/evaluation/metrics/heuristics/language_adherence.py +123 -0
  155. opik/evaluation/metrics/heuristics/levenshtein_ratio.py +6 -5
  156. opik/evaluation/metrics/heuristics/meteor.py +119 -0
  157. opik/evaluation/metrics/heuristics/prompt_injection.py +150 -0
  158. opik/evaluation/metrics/heuristics/readability.py +129 -0
  159. opik/evaluation/metrics/heuristics/regex_match.py +4 -1
  160. opik/evaluation/metrics/heuristics/rouge.py +148 -0
  161. opik/evaluation/metrics/heuristics/sentiment.py +98 -0
  162. opik/evaluation/metrics/heuristics/spearman.py +88 -0
  163. opik/evaluation/metrics/heuristics/tone.py +155 -0
  164. opik/evaluation/metrics/heuristics/vader_sentiment.py +77 -0
  165. opik/evaluation/metrics/llm_judges/answer_relevance/metric.py +27 -30
  166. opik/evaluation/metrics/llm_judges/answer_relevance/parser.py +27 -0
  167. opik/evaluation/metrics/llm_judges/answer_relevance/templates.py +10 -10
  168. opik/evaluation/metrics/llm_judges/context_precision/metric.py +28 -31
  169. opik/evaluation/metrics/llm_judges/context_precision/parser.py +27 -0
  170. opik/evaluation/metrics/llm_judges/context_precision/template.py +7 -7
  171. opik/evaluation/metrics/llm_judges/context_recall/metric.py +27 -31
  172. opik/evaluation/metrics/llm_judges/context_recall/parser.py +27 -0
  173. opik/evaluation/metrics/llm_judges/context_recall/template.py +7 -7
  174. opik/evaluation/metrics/llm_judges/factuality/metric.py +7 -26
  175. opik/evaluation/metrics/llm_judges/factuality/parser.py +35 -0
  176. opik/evaluation/metrics/llm_judges/factuality/template.py +1 -1
  177. opik/evaluation/metrics/llm_judges/g_eval/__init__.py +5 -0
  178. opik/evaluation/metrics/llm_judges/g_eval/metric.py +244 -113
  179. opik/evaluation/metrics/llm_judges/g_eval/parser.py +161 -0
  180. opik/evaluation/metrics/llm_judges/g_eval/presets.py +209 -0
  181. opik/evaluation/metrics/llm_judges/g_eval_presets/__init__.py +36 -0
  182. opik/evaluation/metrics/llm_judges/g_eval_presets/agent_assessment.py +77 -0
  183. opik/evaluation/metrics/llm_judges/g_eval_presets/bias_classifier.py +181 -0
  184. opik/evaluation/metrics/llm_judges/g_eval_presets/compliance_risk.py +41 -0
  185. opik/evaluation/metrics/llm_judges/g_eval_presets/prompt_uncertainty.py +41 -0
  186. opik/evaluation/metrics/llm_judges/g_eval_presets/qa_suite.py +146 -0
  187. opik/evaluation/metrics/llm_judges/hallucination/metric.py +23 -27
  188. opik/evaluation/metrics/llm_judges/hallucination/parser.py +29 -0
  189. opik/evaluation/metrics/llm_judges/hallucination/template.py +2 -4
  190. opik/evaluation/metrics/llm_judges/llm_juries/__init__.py +3 -0
  191. opik/evaluation/metrics/llm_judges/llm_juries/metric.py +76 -0
  192. opik/evaluation/metrics/llm_judges/moderation/metric.py +23 -28
  193. opik/evaluation/metrics/llm_judges/moderation/parser.py +27 -0
  194. opik/evaluation/metrics/llm_judges/moderation/template.py +2 -2
  195. opik/evaluation/metrics/llm_judges/parsing_helpers.py +26 -0
  196. opik/evaluation/metrics/llm_judges/structure_output_compliance/__init__.py +0 -0
  197. opik/evaluation/metrics/llm_judges/structure_output_compliance/metric.py +144 -0
  198. opik/evaluation/metrics/llm_judges/structure_output_compliance/parser.py +79 -0
  199. opik/evaluation/metrics/llm_judges/structure_output_compliance/schema.py +15 -0
  200. opik/evaluation/metrics/llm_judges/structure_output_compliance/template.py +50 -0
  201. opik/evaluation/metrics/llm_judges/syc_eval/__init__.py +0 -0
  202. opik/evaluation/metrics/llm_judges/syc_eval/metric.py +252 -0
  203. opik/evaluation/metrics/llm_judges/syc_eval/parser.py +82 -0
  204. opik/evaluation/metrics/llm_judges/syc_eval/template.py +155 -0
  205. opik/evaluation/metrics/llm_judges/trajectory_accuracy/__init__.py +3 -0
  206. opik/evaluation/metrics/llm_judges/trajectory_accuracy/metric.py +171 -0
  207. opik/evaluation/metrics/llm_judges/trajectory_accuracy/parser.py +38 -0
  208. opik/evaluation/metrics/llm_judges/trajectory_accuracy/templates.py +65 -0
  209. opik/evaluation/metrics/llm_judges/usefulness/metric.py +23 -32
  210. opik/evaluation/metrics/llm_judges/usefulness/parser.py +28 -0
  211. opik/evaluation/metrics/ragas_metric.py +112 -0
  212. opik/evaluation/models/__init__.py +10 -0
  213. opik/evaluation/models/base_model.py +140 -18
  214. opik/evaluation/models/langchain/__init__.py +3 -0
  215. opik/evaluation/models/langchain/langchain_chat_model.py +166 -0
  216. opik/evaluation/models/langchain/message_converters.py +106 -0
  217. opik/evaluation/models/langchain/opik_monitoring.py +23 -0
  218. opik/evaluation/models/litellm/litellm_chat_model.py +186 -40
  219. opik/evaluation/models/litellm/opik_monitor.py +24 -21
  220. opik/evaluation/models/litellm/util.py +125 -0
  221. opik/evaluation/models/litellm/warning_filters.py +16 -4
  222. opik/evaluation/models/model_capabilities.py +187 -0
  223. opik/evaluation/models/models_factory.py +25 -3
  224. opik/evaluation/preprocessing.py +92 -0
  225. opik/evaluation/report.py +70 -12
  226. opik/evaluation/rest_operations.py +49 -45
  227. opik/evaluation/samplers/__init__.py +4 -0
  228. opik/evaluation/samplers/base_dataset_sampler.py +40 -0
  229. opik/evaluation/samplers/random_dataset_sampler.py +48 -0
  230. opik/evaluation/score_statistics.py +66 -0
  231. opik/evaluation/scorers/__init__.py +4 -0
  232. opik/evaluation/scorers/scorer_function.py +55 -0
  233. opik/evaluation/scorers/scorer_wrapper_metric.py +130 -0
  234. opik/evaluation/test_case.py +3 -2
  235. opik/evaluation/test_result.py +1 -0
  236. opik/evaluation/threads/__init__.py +0 -0
  237. opik/evaluation/threads/context_helper.py +32 -0
  238. opik/evaluation/threads/evaluation_engine.py +181 -0
  239. opik/evaluation/threads/evaluation_result.py +18 -0
  240. opik/evaluation/threads/evaluator.py +120 -0
  241. opik/evaluation/threads/helpers.py +51 -0
  242. opik/evaluation/types.py +9 -1
  243. opik/exceptions.py +116 -3
  244. opik/file_upload/__init__.py +0 -0
  245. opik/file_upload/base_upload_manager.py +39 -0
  246. opik/file_upload/file_upload_monitor.py +14 -0
  247. opik/file_upload/file_uploader.py +141 -0
  248. opik/file_upload/mime_type.py +9 -0
  249. opik/file_upload/s3_multipart_upload/__init__.py +0 -0
  250. opik/file_upload/s3_multipart_upload/file_parts_strategy.py +89 -0
  251. opik/file_upload/s3_multipart_upload/s3_file_uploader.py +86 -0
  252. opik/file_upload/s3_multipart_upload/s3_upload_error.py +29 -0
  253. opik/file_upload/thread_pool.py +17 -0
  254. opik/file_upload/upload_client.py +114 -0
  255. opik/file_upload/upload_manager.py +255 -0
  256. opik/file_upload/upload_options.py +37 -0
  257. opik/format_helpers.py +17 -0
  258. opik/guardrails/__init__.py +4 -0
  259. opik/guardrails/guardrail.py +157 -0
  260. opik/guardrails/guards/__init__.py +5 -0
  261. opik/guardrails/guards/guard.py +17 -0
  262. opik/guardrails/guards/pii.py +47 -0
  263. opik/guardrails/guards/topic.py +76 -0
  264. opik/guardrails/rest_api_client.py +34 -0
  265. opik/guardrails/schemas.py +24 -0
  266. opik/guardrails/tracing.py +61 -0
  267. opik/healthcheck/__init__.py +2 -1
  268. opik/healthcheck/checks.py +2 -2
  269. opik/healthcheck/rich_representation.py +1 -1
  270. opik/hooks/__init__.py +23 -0
  271. opik/hooks/anonymizer_hook.py +36 -0
  272. opik/hooks/httpx_client_hook.py +112 -0
  273. opik/httpx_client.py +75 -4
  274. opik/id_helpers.py +18 -0
  275. opik/integrations/adk/__init__.py +14 -0
  276. opik/integrations/adk/callback_context_info_extractors.py +32 -0
  277. opik/integrations/adk/graph/__init__.py +0 -0
  278. opik/integrations/adk/graph/mermaid_graph_builder.py +128 -0
  279. opik/integrations/adk/graph/nodes.py +101 -0
  280. opik/integrations/adk/graph/subgraph_edges_builders.py +41 -0
  281. opik/integrations/adk/helpers.py +48 -0
  282. opik/integrations/adk/legacy_opik_tracer.py +381 -0
  283. opik/integrations/adk/opik_tracer.py +370 -0
  284. opik/integrations/adk/patchers/__init__.py +4 -0
  285. opik/integrations/adk/patchers/adk_otel_tracer/__init__.py +0 -0
  286. opik/integrations/adk/patchers/adk_otel_tracer/llm_span_helpers.py +30 -0
  287. opik/integrations/adk/patchers/adk_otel_tracer/opik_adk_otel_tracer.py +201 -0
  288. opik/integrations/adk/patchers/litellm_wrappers.py +91 -0
  289. opik/integrations/adk/patchers/llm_response_wrapper.py +105 -0
  290. opik/integrations/adk/patchers/patchers.py +64 -0
  291. opik/integrations/adk/recursive_callback_injector.py +126 -0
  292. opik/integrations/aisuite/aisuite_decorator.py +8 -3
  293. opik/integrations/aisuite/opik_tracker.py +1 -0
  294. opik/integrations/anthropic/messages_create_decorator.py +8 -3
  295. opik/integrations/anthropic/opik_tracker.py +0 -1
  296. opik/integrations/bedrock/converse/__init__.py +0 -0
  297. opik/integrations/bedrock/converse/chunks_aggregator.py +188 -0
  298. opik/integrations/bedrock/{converse_decorator.py → converse/converse_decorator.py} +18 -8
  299. opik/integrations/bedrock/invoke_agent_decorator.py +12 -7
  300. opik/integrations/bedrock/invoke_model/__init__.py +0 -0
  301. opik/integrations/bedrock/invoke_model/chunks_aggregator/__init__.py +78 -0
  302. opik/integrations/bedrock/invoke_model/chunks_aggregator/api.py +45 -0
  303. opik/integrations/bedrock/invoke_model/chunks_aggregator/base.py +23 -0
  304. opik/integrations/bedrock/invoke_model/chunks_aggregator/claude.py +121 -0
  305. opik/integrations/bedrock/invoke_model/chunks_aggregator/format_detector.py +107 -0
  306. opik/integrations/bedrock/invoke_model/chunks_aggregator/llama.py +108 -0
  307. opik/integrations/bedrock/invoke_model/chunks_aggregator/mistral.py +118 -0
  308. opik/integrations/bedrock/invoke_model/chunks_aggregator/nova.py +99 -0
  309. opik/integrations/bedrock/invoke_model/invoke_model_decorator.py +178 -0
  310. opik/integrations/bedrock/invoke_model/response_types.py +34 -0
  311. opik/integrations/bedrock/invoke_model/stream_wrappers.py +122 -0
  312. opik/integrations/bedrock/invoke_model/usage_converters.py +87 -0
  313. opik/integrations/bedrock/invoke_model/usage_extraction.py +108 -0
  314. opik/integrations/bedrock/opik_tracker.py +43 -4
  315. opik/integrations/bedrock/types.py +19 -0
  316. opik/integrations/crewai/crewai_decorator.py +34 -56
  317. opik/integrations/crewai/opik_tracker.py +31 -10
  318. opik/integrations/crewai/patchers/__init__.py +5 -0
  319. opik/integrations/crewai/patchers/flow.py +118 -0
  320. opik/integrations/crewai/patchers/litellm_completion.py +30 -0
  321. opik/integrations/crewai/patchers/llm_client.py +207 -0
  322. opik/integrations/dspy/callback.py +246 -84
  323. opik/integrations/dspy/graph.py +88 -0
  324. opik/integrations/dspy/parsers.py +168 -0
  325. opik/integrations/genai/encoder_extension.py +2 -6
  326. opik/integrations/genai/generate_content_decorator.py +20 -13
  327. opik/integrations/guardrails/guardrails_decorator.py +4 -0
  328. opik/integrations/harbor/__init__.py +17 -0
  329. opik/integrations/harbor/experiment_service.py +269 -0
  330. opik/integrations/harbor/opik_tracker.py +528 -0
  331. opik/integrations/haystack/constants.py +35 -0
  332. opik/integrations/haystack/converters.py +1 -2
  333. opik/integrations/haystack/opik_connector.py +28 -6
  334. opik/integrations/haystack/opik_span_bridge.py +284 -0
  335. opik/integrations/haystack/opik_tracer.py +124 -222
  336. opik/integrations/langchain/__init__.py +3 -1
  337. opik/integrations/langchain/helpers.py +96 -0
  338. opik/integrations/langchain/langgraph_async_context_bridge.py +131 -0
  339. opik/integrations/langchain/langgraph_tracer_injector.py +88 -0
  340. opik/integrations/langchain/opik_encoder_extension.py +2 -2
  341. opik/integrations/langchain/opik_tracer.py +641 -206
  342. opik/integrations/langchain/provider_usage_extractors/__init__.py +5 -0
  343. opik/integrations/langchain/provider_usage_extractors/anthropic_usage_extractor.py +101 -0
  344. opik/integrations/langchain/provider_usage_extractors/anthropic_vertexai_usage_extractor.py +67 -0
  345. opik/integrations/langchain/provider_usage_extractors/bedrock_usage_extractor.py +94 -0
  346. opik/integrations/langchain/provider_usage_extractors/google_generative_ai_usage_extractor.py +109 -0
  347. opik/integrations/langchain/provider_usage_extractors/groq_usage_extractor.py +92 -0
  348. opik/integrations/langchain/provider_usage_extractors/langchain_run_helpers/__init__.py +15 -0
  349. opik/integrations/langchain/provider_usage_extractors/langchain_run_helpers/helpers.py +134 -0
  350. opik/integrations/langchain/provider_usage_extractors/langchain_run_helpers/langchain_usage.py +163 -0
  351. opik/integrations/langchain/provider_usage_extractors/openai_usage_extractor.py +124 -0
  352. opik/integrations/langchain/provider_usage_extractors/provider_usage_extractor_protocol.py +29 -0
  353. opik/integrations/langchain/provider_usage_extractors/usage_extractor.py +48 -0
  354. opik/integrations/langchain/provider_usage_extractors/vertexai_usage_extractor.py +109 -0
  355. opik/integrations/litellm/__init__.py +5 -0
  356. opik/integrations/litellm/completion_chunks_aggregator.py +115 -0
  357. opik/integrations/litellm/litellm_completion_decorator.py +242 -0
  358. opik/integrations/litellm/opik_tracker.py +43 -0
  359. opik/integrations/litellm/stream_patchers.py +151 -0
  360. opik/integrations/llama_index/callback.py +179 -78
  361. opik/integrations/llama_index/event_parsing_utils.py +29 -9
  362. opik/integrations/openai/agents/opik_tracing_processor.py +204 -32
  363. opik/integrations/openai/agents/span_data_parsers.py +15 -6
  364. opik/integrations/openai/chat_completion_chunks_aggregator.py +1 -1
  365. opik/integrations/openai/{openai_decorator.py → openai_chat_completions_decorator.py} +45 -35
  366. opik/integrations/openai/openai_responses_decorator.py +158 -0
  367. opik/integrations/openai/opik_tracker.py +94 -13
  368. opik/integrations/openai/response_events_aggregator.py +36 -0
  369. opik/integrations/openai/stream_patchers.py +125 -15
  370. opik/integrations/sagemaker/auth.py +5 -1
  371. opik/jsonable_encoder.py +29 -1
  372. opik/llm_usage/base_original_provider_usage.py +15 -8
  373. opik/llm_usage/bedrock_usage.py +8 -2
  374. opik/llm_usage/google_usage.py +6 -1
  375. opik/llm_usage/llm_usage_info.py +6 -0
  376. opik/llm_usage/{openai_usage.py → openai_chat_completions_usage.py} +2 -12
  377. opik/llm_usage/{openai_agent_usage.py → openai_responses_usage.py} +7 -15
  378. opik/llm_usage/opik_usage.py +36 -10
  379. opik/llm_usage/opik_usage_factory.py +35 -19
  380. opik/logging_messages.py +19 -7
  381. opik/message_processing/arguments_utils.py +22 -0
  382. opik/message_processing/batching/base_batcher.py +45 -17
  383. opik/message_processing/batching/batch_manager.py +22 -10
  384. opik/message_processing/batching/batch_manager_constuctors.py +36 -11
  385. opik/message_processing/batching/batchers.py +167 -44
  386. opik/message_processing/batching/flushing_thread.py +0 -3
  387. opik/message_processing/batching/sequence_splitter.py +50 -5
  388. opik/message_processing/emulation/__init__.py +0 -0
  389. opik/message_processing/emulation/emulator_message_processor.py +578 -0
  390. opik/message_processing/emulation/local_emulator_message_processor.py +140 -0
  391. opik/message_processing/emulation/models.py +162 -0
  392. opik/message_processing/encoder_helpers.py +79 -0
  393. opik/message_processing/message_queue.py +79 -0
  394. opik/message_processing/messages.py +154 -12
  395. opik/message_processing/preprocessing/__init__.py +0 -0
  396. opik/message_processing/preprocessing/attachments_preprocessor.py +70 -0
  397. opik/message_processing/preprocessing/batching_preprocessor.py +53 -0
  398. opik/message_processing/preprocessing/constants.py +1 -0
  399. opik/message_processing/preprocessing/file_upload_preprocessor.py +38 -0
  400. opik/message_processing/preprocessing/preprocessor.py +36 -0
  401. opik/message_processing/processors/__init__.py +0 -0
  402. opik/message_processing/processors/attachments_extraction_processor.py +146 -0
  403. opik/message_processing/processors/message_processors.py +92 -0
  404. opik/message_processing/processors/message_processors_chain.py +96 -0
  405. opik/message_processing/processors/online_message_processor.py +324 -0
  406. opik/message_processing/queue_consumer.py +61 -13
  407. opik/message_processing/streamer.py +102 -31
  408. opik/message_processing/streamer_constructors.py +67 -12
  409. opik/opik_context.py +103 -11
  410. opik/plugins/pytest/decorator.py +2 -2
  411. opik/plugins/pytest/experiment_runner.py +3 -2
  412. opik/plugins/pytest/hooks.py +6 -4
  413. opik/rate_limit/__init__.py +0 -0
  414. opik/rate_limit/rate_limit.py +25 -0
  415. opik/rest_api/__init__.py +643 -11
  416. opik/rest_api/alerts/__init__.py +7 -0
  417. opik/rest_api/alerts/client.py +667 -0
  418. opik/rest_api/alerts/raw_client.py +1015 -0
  419. opik/rest_api/alerts/types/__init__.py +7 -0
  420. opik/rest_api/alerts/types/get_webhook_examples_request_alert_type.py +5 -0
  421. opik/rest_api/annotation_queues/__init__.py +4 -0
  422. opik/rest_api/annotation_queues/client.py +668 -0
  423. opik/rest_api/annotation_queues/raw_client.py +1019 -0
  424. opik/rest_api/attachments/__init__.py +17 -0
  425. opik/rest_api/attachments/client.py +752 -0
  426. opik/rest_api/attachments/raw_client.py +1125 -0
  427. opik/rest_api/attachments/types/__init__.py +15 -0
  428. opik/rest_api/attachments/types/attachment_list_request_entity_type.py +5 -0
  429. opik/rest_api/attachments/types/download_attachment_request_entity_type.py +5 -0
  430. opik/rest_api/attachments/types/start_multipart_upload_request_entity_type.py +5 -0
  431. opik/rest_api/attachments/types/upload_attachment_request_entity_type.py +5 -0
  432. opik/rest_api/automation_rule_evaluators/__init__.py +2 -0
  433. opik/rest_api/automation_rule_evaluators/client.py +182 -1162
  434. opik/rest_api/automation_rule_evaluators/raw_client.py +598 -0
  435. opik/rest_api/chat_completions/__init__.py +2 -0
  436. opik/rest_api/chat_completions/client.py +115 -149
  437. opik/rest_api/chat_completions/raw_client.py +339 -0
  438. opik/rest_api/check/__init__.py +2 -0
  439. opik/rest_api/check/client.py +88 -106
  440. opik/rest_api/check/raw_client.py +258 -0
  441. opik/rest_api/client.py +112 -212
  442. opik/rest_api/core/__init__.py +5 -0
  443. opik/rest_api/core/api_error.py +12 -6
  444. opik/rest_api/core/client_wrapper.py +4 -14
  445. opik/rest_api/core/datetime_utils.py +1 -3
  446. opik/rest_api/core/file.py +2 -5
  447. opik/rest_api/core/http_client.py +42 -120
  448. opik/rest_api/core/http_response.py +55 -0
  449. opik/rest_api/core/jsonable_encoder.py +1 -4
  450. opik/rest_api/core/pydantic_utilities.py +79 -147
  451. opik/rest_api/core/query_encoder.py +1 -3
  452. opik/rest_api/core/serialization.py +10 -10
  453. opik/rest_api/dashboards/__init__.py +4 -0
  454. opik/rest_api/dashboards/client.py +462 -0
  455. opik/rest_api/dashboards/raw_client.py +648 -0
  456. opik/rest_api/datasets/__init__.py +5 -0
  457. opik/rest_api/datasets/client.py +1638 -1091
  458. opik/rest_api/datasets/raw_client.py +3389 -0
  459. opik/rest_api/datasets/types/__init__.py +8 -0
  460. opik/rest_api/datasets/types/dataset_update_visibility.py +5 -0
  461. opik/rest_api/datasets/types/dataset_write_visibility.py +5 -0
  462. opik/rest_api/errors/__init__.py +2 -0
  463. opik/rest_api/errors/bad_request_error.py +4 -3
  464. opik/rest_api/errors/conflict_error.py +4 -3
  465. opik/rest_api/errors/forbidden_error.py +4 -2
  466. opik/rest_api/errors/not_found_error.py +4 -3
  467. opik/rest_api/errors/not_implemented_error.py +4 -3
  468. opik/rest_api/errors/unauthorized_error.py +4 -3
  469. opik/rest_api/errors/unprocessable_entity_error.py +4 -3
  470. opik/rest_api/experiments/__init__.py +5 -0
  471. opik/rest_api/experiments/client.py +676 -752
  472. opik/rest_api/experiments/raw_client.py +1872 -0
  473. opik/rest_api/experiments/types/__init__.py +10 -0
  474. opik/rest_api/experiments/types/experiment_update_status.py +5 -0
  475. opik/rest_api/experiments/types/experiment_update_type.py +5 -0
  476. opik/rest_api/experiments/types/experiment_write_status.py +5 -0
  477. opik/rest_api/experiments/types/experiment_write_type.py +5 -0
  478. opik/rest_api/feedback_definitions/__init__.py +2 -0
  479. opik/rest_api/feedback_definitions/client.py +96 -370
  480. opik/rest_api/feedback_definitions/raw_client.py +541 -0
  481. opik/rest_api/feedback_definitions/types/__init__.py +2 -0
  482. opik/rest_api/feedback_definitions/types/find_feedback_definitions_request_type.py +1 -3
  483. opik/rest_api/guardrails/__init__.py +4 -0
  484. opik/rest_api/guardrails/client.py +104 -0
  485. opik/rest_api/guardrails/raw_client.py +102 -0
  486. opik/rest_api/llm_provider_key/__init__.py +2 -0
  487. opik/rest_api/llm_provider_key/client.py +166 -440
  488. opik/rest_api/llm_provider_key/raw_client.py +643 -0
  489. opik/rest_api/llm_provider_key/types/__init__.py +2 -0
  490. opik/rest_api/llm_provider_key/types/provider_api_key_write_provider.py +1 -1
  491. opik/rest_api/manual_evaluation/__init__.py +4 -0
  492. opik/rest_api/manual_evaluation/client.py +347 -0
  493. opik/rest_api/manual_evaluation/raw_client.py +543 -0
  494. opik/rest_api/open_telemetry_ingestion/__init__.py +2 -0
  495. opik/rest_api/open_telemetry_ingestion/client.py +38 -63
  496. opik/rest_api/open_telemetry_ingestion/raw_client.py +88 -0
  497. opik/rest_api/optimizations/__init__.py +7 -0
  498. opik/rest_api/optimizations/client.py +704 -0
  499. opik/rest_api/optimizations/raw_client.py +920 -0
  500. opik/rest_api/optimizations/types/__init__.py +7 -0
  501. opik/rest_api/optimizations/types/optimization_update_status.py +7 -0
  502. opik/rest_api/projects/__init__.py +10 -1
  503. opik/rest_api/projects/client.py +180 -855
  504. opik/rest_api/projects/raw_client.py +1216 -0
  505. opik/rest_api/projects/types/__init__.py +11 -4
  506. opik/rest_api/projects/types/project_metric_request_public_interval.py +1 -3
  507. opik/rest_api/projects/types/project_metric_request_public_metric_type.py +11 -1
  508. opik/rest_api/projects/types/project_update_visibility.py +5 -0
  509. opik/rest_api/projects/types/project_write_visibility.py +5 -0
  510. opik/rest_api/prompts/__init__.py +4 -2
  511. opik/rest_api/prompts/client.py +381 -970
  512. opik/rest_api/prompts/raw_client.py +1634 -0
  513. opik/rest_api/prompts/types/__init__.py +5 -1
  514. opik/rest_api/prompts/types/create_prompt_version_detail_template_structure.py +5 -0
  515. opik/rest_api/prompts/types/prompt_write_template_structure.py +5 -0
  516. opik/rest_api/raw_client.py +156 -0
  517. opik/rest_api/redirect/__init__.py +4 -0
  518. opik/rest_api/redirect/client.py +375 -0
  519. opik/rest_api/redirect/raw_client.py +566 -0
  520. opik/rest_api/service_toggles/__init__.py +4 -0
  521. opik/rest_api/service_toggles/client.py +91 -0
  522. opik/rest_api/service_toggles/raw_client.py +93 -0
  523. opik/rest_api/spans/__init__.py +2 -0
  524. opik/rest_api/spans/client.py +659 -1354
  525. opik/rest_api/spans/raw_client.py +2383 -0
  526. opik/rest_api/spans/types/__init__.py +2 -0
  527. opik/rest_api/spans/types/find_feedback_score_names_1_request_type.py +1 -3
  528. opik/rest_api/spans/types/get_span_stats_request_type.py +1 -3
  529. opik/rest_api/spans/types/get_spans_by_project_request_type.py +1 -3
  530. opik/rest_api/spans/types/span_search_stream_request_public_type.py +1 -3
  531. opik/rest_api/system_usage/__init__.py +2 -0
  532. opik/rest_api/system_usage/client.py +157 -216
  533. opik/rest_api/system_usage/raw_client.py +455 -0
  534. opik/rest_api/traces/__init__.py +2 -0
  535. opik/rest_api/traces/client.py +2102 -1625
  536. opik/rest_api/traces/raw_client.py +4144 -0
  537. opik/rest_api/types/__init__.py +629 -24
  538. opik/rest_api/types/aggregation_data.py +27 -0
  539. opik/rest_api/types/alert.py +33 -0
  540. opik/rest_api/types/alert_alert_type.py +5 -0
  541. opik/rest_api/types/alert_page_public.py +24 -0
  542. opik/rest_api/types/alert_public.py +33 -0
  543. opik/rest_api/types/alert_public_alert_type.py +5 -0
  544. opik/rest_api/types/alert_trigger.py +27 -0
  545. opik/rest_api/types/alert_trigger_config.py +28 -0
  546. opik/rest_api/types/alert_trigger_config_public.py +28 -0
  547. opik/rest_api/types/alert_trigger_config_public_type.py +10 -0
  548. opik/rest_api/types/alert_trigger_config_type.py +10 -0
  549. opik/rest_api/types/alert_trigger_config_write.py +22 -0
  550. opik/rest_api/types/alert_trigger_config_write_type.py +10 -0
  551. opik/rest_api/types/alert_trigger_event_type.py +19 -0
  552. opik/rest_api/types/alert_trigger_public.py +27 -0
  553. opik/rest_api/types/alert_trigger_public_event_type.py +19 -0
  554. opik/rest_api/types/alert_trigger_write.py +23 -0
  555. opik/rest_api/types/alert_trigger_write_event_type.py +19 -0
  556. opik/rest_api/types/alert_write.py +28 -0
  557. opik/rest_api/types/alert_write_alert_type.py +5 -0
  558. opik/rest_api/types/annotation_queue.py +42 -0
  559. opik/rest_api/types/annotation_queue_batch.py +27 -0
  560. opik/rest_api/types/{json_schema_element.py → annotation_queue_item_ids.py} +5 -7
  561. opik/rest_api/types/annotation_queue_page_public.py +28 -0
  562. opik/rest_api/types/annotation_queue_public.py +38 -0
  563. opik/rest_api/types/annotation_queue_public_scope.py +5 -0
  564. opik/rest_api/types/{workspace_metadata.py → annotation_queue_reviewer.py} +6 -7
  565. opik/rest_api/types/annotation_queue_reviewer_public.py +20 -0
  566. opik/rest_api/types/annotation_queue_scope.py +5 -0
  567. opik/rest_api/types/annotation_queue_write.py +31 -0
  568. opik/rest_api/types/annotation_queue_write_scope.py +5 -0
  569. opik/rest_api/types/assistant_message.py +7 -8
  570. opik/rest_api/types/assistant_message_role.py +1 -3
  571. opik/rest_api/types/attachment.py +22 -0
  572. opik/rest_api/types/attachment_page.py +28 -0
  573. opik/rest_api/types/audio_url.py +19 -0
  574. opik/rest_api/types/audio_url_public.py +19 -0
  575. opik/rest_api/types/audio_url_write.py +19 -0
  576. opik/rest_api/types/automation_rule_evaluator.py +160 -0
  577. opik/rest_api/types/automation_rule_evaluator_llm_as_judge.py +6 -6
  578. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_public.py +6 -6
  579. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_write.py +6 -6
  580. opik/rest_api/types/automation_rule_evaluator_object_object_public.py +155 -0
  581. opik/rest_api/types/automation_rule_evaluator_page_public.py +6 -6
  582. opik/rest_api/types/automation_rule_evaluator_public.py +155 -0
  583. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge.py +22 -0
  584. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_public.py +22 -0
  585. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_write.py +22 -0
  586. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python.py +22 -0
  587. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_public.py +22 -0
  588. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_write.py +22 -0
  589. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge.py +22 -0
  590. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_public.py +22 -0
  591. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_write.py +22 -0
  592. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python.py +22 -0
  593. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_public.py +22 -0
  594. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_write.py +22 -0
  595. opik/rest_api/types/automation_rule_evaluator_update.py +143 -0
  596. opik/rest_api/types/automation_rule_evaluator_update_llm_as_judge.py +6 -6
  597. opik/rest_api/types/automation_rule_evaluator_update_span_llm_as_judge.py +22 -0
  598. opik/rest_api/types/automation_rule_evaluator_update_span_user_defined_metric_python.py +22 -0
  599. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_llm_as_judge.py +22 -0
  600. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_user_defined_metric_python.py +22 -0
  601. opik/rest_api/types/automation_rule_evaluator_update_user_defined_metric_python.py +6 -6
  602. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python.py +6 -6
  603. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_public.py +6 -6
  604. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_write.py +6 -6
  605. opik/rest_api/types/automation_rule_evaluator_write.py +143 -0
  606. opik/rest_api/types/avg_value_stat_public.py +3 -5
  607. opik/rest_api/types/batch_delete.py +3 -5
  608. opik/rest_api/types/batch_delete_by_project.py +20 -0
  609. opik/rest_api/types/bi_information.py +3 -5
  610. opik/rest_api/types/bi_information_response.py +4 -6
  611. opik/rest_api/types/boolean_feedback_definition.py +25 -0
  612. opik/rest_api/types/boolean_feedback_definition_create.py +20 -0
  613. opik/rest_api/types/boolean_feedback_definition_public.py +25 -0
  614. opik/rest_api/types/boolean_feedback_definition_update.py +20 -0
  615. opik/rest_api/types/boolean_feedback_detail.py +29 -0
  616. opik/rest_api/types/boolean_feedback_detail_create.py +29 -0
  617. opik/rest_api/types/boolean_feedback_detail_public.py +29 -0
  618. opik/rest_api/types/boolean_feedback_detail_update.py +29 -0
  619. opik/rest_api/types/categorical_feedback_definition.py +5 -7
  620. opik/rest_api/types/categorical_feedback_definition_create.py +4 -6
  621. opik/rest_api/types/categorical_feedback_definition_public.py +5 -7
  622. opik/rest_api/types/categorical_feedback_definition_update.py +4 -6
  623. opik/rest_api/types/categorical_feedback_detail.py +3 -5
  624. opik/rest_api/types/categorical_feedback_detail_create.py +3 -5
  625. opik/rest_api/types/categorical_feedback_detail_public.py +3 -5
  626. opik/rest_api/types/categorical_feedback_detail_update.py +3 -5
  627. opik/rest_api/types/chat_completion_choice.py +4 -6
  628. opik/rest_api/types/chat_completion_response.py +5 -6
  629. opik/rest_api/types/check.py +22 -0
  630. opik/rest_api/types/{json_node_compare.py → check_name.py} +1 -1
  631. opik/rest_api/types/check_public.py +22 -0
  632. opik/rest_api/types/check_public_name.py +5 -0
  633. opik/rest_api/types/check_public_result.py +5 -0
  634. opik/rest_api/types/check_result.py +5 -0
  635. opik/rest_api/types/chunked_output_json_node.py +4 -6
  636. opik/rest_api/types/chunked_output_json_node_public.py +4 -6
  637. opik/rest_api/types/chunked_output_json_node_public_type.py +6 -10
  638. opik/rest_api/types/chunked_output_json_node_type.py +6 -10
  639. opik/rest_api/types/column.py +8 -10
  640. opik/rest_api/types/column_compare.py +8 -10
  641. opik/rest_api/types/column_public.py +8 -10
  642. opik/rest_api/types/column_types_item.py +1 -3
  643. opik/rest_api/types/comment.py +4 -6
  644. opik/rest_api/types/comment_compare.py +4 -6
  645. opik/rest_api/types/comment_public.py +4 -6
  646. opik/rest_api/types/complete_multipart_upload_request.py +33 -0
  647. opik/rest_api/types/complete_multipart_upload_request_entity_type.py +5 -0
  648. opik/rest_api/types/completion_tokens_details.py +3 -5
  649. opik/rest_api/types/count_value_stat_public.py +3 -5
  650. opik/rest_api/types/dashboard_page_public.py +24 -0
  651. opik/rest_api/types/dashboard_public.py +30 -0
  652. opik/rest_api/types/data_point_double.py +21 -0
  653. opik/rest_api/types/data_point_number_public.py +3 -5
  654. opik/rest_api/types/dataset.py +14 -6
  655. opik/rest_api/types/dataset_expansion.py +42 -0
  656. opik/rest_api/types/dataset_expansion_response.py +39 -0
  657. opik/rest_api/types/dataset_item.py +9 -8
  658. opik/rest_api/types/dataset_item_batch.py +3 -5
  659. opik/rest_api/types/dataset_item_changes_public.py +5 -0
  660. opik/rest_api/types/dataset_item_compare.py +9 -8
  661. opik/rest_api/types/dataset_item_compare_source.py +1 -3
  662. opik/rest_api/types/dataset_item_filter.py +27 -0
  663. opik/rest_api/types/dataset_item_filter_operator.py +21 -0
  664. opik/rest_api/types/dataset_item_page_compare.py +10 -7
  665. opik/rest_api/types/dataset_item_page_public.py +10 -7
  666. opik/rest_api/types/dataset_item_public.py +9 -8
  667. opik/rest_api/types/dataset_item_public_source.py +1 -3
  668. opik/rest_api/types/dataset_item_source.py +1 -3
  669. opik/rest_api/types/dataset_item_update.py +39 -0
  670. opik/rest_api/types/dataset_item_write.py +5 -6
  671. opik/rest_api/types/dataset_item_write_source.py +1 -3
  672. opik/rest_api/types/dataset_page_public.py +9 -6
  673. opik/rest_api/types/dataset_public.py +14 -6
  674. opik/rest_api/types/dataset_public_status.py +5 -0
  675. opik/rest_api/types/dataset_public_visibility.py +5 -0
  676. opik/rest_api/types/dataset_status.py +5 -0
  677. opik/rest_api/types/dataset_version_diff.py +22 -0
  678. opik/rest_api/types/dataset_version_diff_stats.py +24 -0
  679. opik/rest_api/types/dataset_version_page_public.py +23 -0
  680. opik/rest_api/types/dataset_version_public.py +59 -0
  681. opik/rest_api/types/dataset_version_summary.py +46 -0
  682. opik/rest_api/types/dataset_version_summary_public.py +46 -0
  683. opik/rest_api/types/dataset_visibility.py +5 -0
  684. opik/rest_api/types/delete_attachments_request.py +23 -0
  685. opik/rest_api/types/delete_attachments_request_entity_type.py +5 -0
  686. opik/rest_api/types/delete_feedback_score.py +4 -5
  687. opik/rest_api/types/delete_ids_holder.py +19 -0
  688. opik/rest_api/types/delta.py +7 -9
  689. opik/rest_api/types/error_count_with_deviation.py +21 -0
  690. opik/rest_api/types/error_count_with_deviation_detailed.py +21 -0
  691. opik/rest_api/types/error_info.py +3 -5
  692. opik/rest_api/types/error_info_experiment_item_bulk_write_view.py +21 -0
  693. opik/rest_api/types/error_info_public.py +3 -5
  694. opik/rest_api/types/error_info_write.py +3 -5
  695. opik/rest_api/types/error_message.py +3 -5
  696. opik/rest_api/types/error_message_detail.py +3 -5
  697. opik/rest_api/types/error_message_detailed.py +3 -5
  698. opik/rest_api/types/error_message_public.py +3 -5
  699. opik/rest_api/types/experiment.py +21 -10
  700. opik/rest_api/types/experiment_group_aggregations_response.py +20 -0
  701. opik/rest_api/types/experiment_group_response.py +22 -0
  702. opik/rest_api/types/experiment_item.py +14 -11
  703. opik/rest_api/types/experiment_item_bulk_record.py +27 -0
  704. opik/rest_api/types/experiment_item_bulk_record_experiment_item_bulk_write_view.py +27 -0
  705. opik/rest_api/types/experiment_item_bulk_upload.py +27 -0
  706. opik/rest_api/types/experiment_item_compare.py +14 -11
  707. opik/rest_api/types/experiment_item_compare_trace_visibility_mode.py +5 -0
  708. opik/rest_api/types/experiment_item_public.py +6 -6
  709. opik/rest_api/types/experiment_item_public_trace_visibility_mode.py +5 -0
  710. opik/rest_api/types/experiment_item_trace_visibility_mode.py +5 -0
  711. opik/rest_api/types/experiment_page_public.py +9 -6
  712. opik/rest_api/types/experiment_public.py +21 -10
  713. opik/rest_api/types/experiment_public_status.py +5 -0
  714. opik/rest_api/types/experiment_public_type.py +5 -0
  715. opik/rest_api/types/experiment_score.py +20 -0
  716. opik/rest_api/types/experiment_score_public.py +20 -0
  717. opik/rest_api/types/experiment_score_write.py +20 -0
  718. opik/rest_api/types/experiment_status.py +5 -0
  719. opik/rest_api/types/experiment_type.py +5 -0
  720. opik/rest_api/types/export_trace_service_request.py +5 -0
  721. opik/rest_api/types/feedback.py +40 -27
  722. opik/rest_api/types/feedback_create.py +27 -13
  723. opik/rest_api/types/feedback_definition_page_public.py +4 -6
  724. opik/rest_api/types/feedback_object_public.py +40 -27
  725. opik/rest_api/types/feedback_public.py +40 -27
  726. opik/rest_api/types/feedback_score.py +7 -7
  727. opik/rest_api/types/feedback_score_average.py +3 -5
  728. opik/rest_api/types/feedback_score_average_detailed.py +3 -5
  729. opik/rest_api/types/feedback_score_average_public.py +3 -5
  730. opik/rest_api/types/feedback_score_batch.py +4 -6
  731. opik/rest_api/types/feedback_score_batch_item.py +6 -6
  732. opik/rest_api/types/feedback_score_batch_item_source.py +1 -3
  733. opik/rest_api/types/feedback_score_batch_item_thread.py +32 -0
  734. opik/rest_api/types/feedback_score_batch_item_thread_source.py +5 -0
  735. opik/rest_api/types/feedback_score_compare.py +7 -7
  736. opik/rest_api/types/feedback_score_compare_source.py +1 -3
  737. opik/rest_api/types/feedback_score_experiment_item_bulk_write_view.py +31 -0
  738. opik/rest_api/types/feedback_score_experiment_item_bulk_write_view_source.py +5 -0
  739. opik/rest_api/types/feedback_score_names.py +4 -6
  740. opik/rest_api/types/feedback_score_public.py +11 -7
  741. opik/rest_api/types/feedback_score_public_source.py +1 -3
  742. opik/rest_api/types/feedback_score_source.py +1 -3
  743. opik/rest_api/types/feedback_update.py +27 -13
  744. opik/rest_api/types/function.py +4 -7
  745. opik/rest_api/types/function_call.py +3 -5
  746. opik/rest_api/types/group_content.py +19 -0
  747. opik/rest_api/types/group_content_with_aggregations.py +21 -0
  748. opik/rest_api/types/group_detail.py +19 -0
  749. opik/rest_api/types/group_details.py +20 -0
  750. opik/rest_api/types/guardrail.py +34 -0
  751. opik/rest_api/types/guardrail_batch.py +20 -0
  752. opik/rest_api/types/guardrail_name.py +5 -0
  753. opik/rest_api/types/guardrail_result.py +5 -0
  754. opik/rest_api/types/guardrail_write.py +33 -0
  755. opik/rest_api/types/guardrail_write_name.py +5 -0
  756. opik/rest_api/types/guardrail_write_result.py +5 -0
  757. opik/rest_api/types/guardrails_validation.py +21 -0
  758. opik/rest_api/types/guardrails_validation_public.py +21 -0
  759. opik/rest_api/types/ids_holder.py +19 -0
  760. opik/rest_api/types/image_url.py +20 -0
  761. opik/rest_api/types/image_url_public.py +20 -0
  762. opik/rest_api/types/image_url_write.py +20 -0
  763. opik/rest_api/types/json_list_string.py +7 -0
  764. opik/rest_api/types/json_list_string_compare.py +7 -0
  765. opik/rest_api/types/json_list_string_experiment_item_bulk_write_view.py +7 -0
  766. opik/rest_api/types/json_list_string_public.py +7 -0
  767. opik/rest_api/types/json_list_string_write.py +7 -0
  768. opik/rest_api/types/json_schema.py +5 -8
  769. opik/rest_api/types/llm_as_judge_code.py +8 -12
  770. opik/rest_api/types/llm_as_judge_code_public.py +8 -12
  771. opik/rest_api/types/llm_as_judge_code_write.py +8 -12
  772. opik/rest_api/types/llm_as_judge_message.py +9 -7
  773. opik/rest_api/types/llm_as_judge_message_content.py +26 -0
  774. opik/rest_api/types/llm_as_judge_message_content_public.py +26 -0
  775. opik/rest_api/types/llm_as_judge_message_content_write.py +26 -0
  776. opik/rest_api/types/llm_as_judge_message_public.py +9 -7
  777. opik/rest_api/types/llm_as_judge_message_public_role.py +1 -1
  778. opik/rest_api/types/llm_as_judge_message_role.py +1 -1
  779. opik/rest_api/types/llm_as_judge_message_write.py +9 -7
  780. opik/rest_api/types/llm_as_judge_message_write_role.py +1 -1
  781. opik/rest_api/types/llm_as_judge_model_parameters.py +6 -5
  782. opik/rest_api/types/llm_as_judge_model_parameters_public.py +6 -5
  783. opik/rest_api/types/llm_as_judge_model_parameters_write.py +6 -5
  784. opik/rest_api/types/llm_as_judge_output_schema.py +4 -6
  785. opik/rest_api/types/llm_as_judge_output_schema_public.py +4 -6
  786. opik/rest_api/types/llm_as_judge_output_schema_public_type.py +1 -3
  787. opik/rest_api/types/llm_as_judge_output_schema_type.py +1 -3
  788. opik/rest_api/types/llm_as_judge_output_schema_write.py +4 -6
  789. opik/rest_api/types/llm_as_judge_output_schema_write_type.py +1 -3
  790. opik/rest_api/types/log_item.py +5 -7
  791. opik/rest_api/types/log_item_level.py +1 -3
  792. opik/rest_api/types/log_page.py +4 -6
  793. opik/rest_api/types/manual_evaluation_request.py +38 -0
  794. opik/rest_api/types/manual_evaluation_request_entity_type.py +5 -0
  795. opik/rest_api/types/manual_evaluation_response.py +27 -0
  796. opik/rest_api/types/multipart_upload_part.py +20 -0
  797. opik/rest_api/types/numerical_feedback_definition.py +5 -7
  798. opik/rest_api/types/numerical_feedback_definition_create.py +4 -6
  799. opik/rest_api/types/numerical_feedback_definition_public.py +5 -7
  800. opik/rest_api/types/numerical_feedback_definition_update.py +4 -6
  801. opik/rest_api/types/numerical_feedback_detail.py +3 -5
  802. opik/rest_api/types/numerical_feedback_detail_create.py +3 -5
  803. opik/rest_api/types/numerical_feedback_detail_public.py +3 -5
  804. opik/rest_api/types/numerical_feedback_detail_update.py +3 -5
  805. opik/rest_api/types/optimization.py +37 -0
  806. opik/rest_api/types/optimization_page_public.py +28 -0
  807. opik/rest_api/types/optimization_public.py +37 -0
  808. opik/rest_api/types/optimization_public_status.py +7 -0
  809. opik/rest_api/types/optimization_status.py +7 -0
  810. opik/rest_api/types/optimization_studio_config.py +27 -0
  811. opik/rest_api/types/optimization_studio_config_public.py +27 -0
  812. opik/rest_api/types/optimization_studio_config_write.py +27 -0
  813. opik/rest_api/types/optimization_studio_log.py +22 -0
  814. opik/rest_api/types/optimization_write.py +30 -0
  815. opik/rest_api/types/optimization_write_status.py +7 -0
  816. opik/rest_api/types/page_columns.py +4 -6
  817. opik/rest_api/types/percentage_value_stat_public.py +4 -6
  818. opik/rest_api/types/percentage_values.py +8 -16
  819. opik/rest_api/types/percentage_values_detailed.py +8 -16
  820. opik/rest_api/types/percentage_values_public.py +8 -16
  821. opik/rest_api/types/project.py +12 -7
  822. opik/rest_api/types/project_detailed.py +12 -7
  823. opik/rest_api/types/project_detailed_visibility.py +5 -0
  824. opik/rest_api/types/project_metric_response_public.py +5 -9
  825. opik/rest_api/types/project_metric_response_public_interval.py +1 -3
  826. opik/rest_api/types/project_metric_response_public_metric_type.py +11 -1
  827. opik/rest_api/types/project_page_public.py +8 -10
  828. opik/rest_api/types/project_public.py +6 -6
  829. opik/rest_api/types/project_public_visibility.py +5 -0
  830. opik/rest_api/types/project_reference.py +31 -0
  831. opik/rest_api/types/project_reference_public.py +31 -0
  832. opik/rest_api/types/project_stat_item_object_public.py +8 -17
  833. opik/rest_api/types/project_stats_public.py +4 -6
  834. opik/rest_api/types/project_stats_summary.py +4 -6
  835. opik/rest_api/types/project_stats_summary_item.py +9 -6
  836. opik/rest_api/types/project_visibility.py +5 -0
  837. opik/rest_api/types/prompt.py +12 -7
  838. opik/rest_api/types/prompt_detail.py +12 -7
  839. opik/rest_api/types/prompt_detail_template_structure.py +5 -0
  840. opik/rest_api/types/prompt_page_public.py +9 -6
  841. opik/rest_api/types/prompt_public.py +11 -6
  842. opik/rest_api/types/prompt_public_template_structure.py +5 -0
  843. opik/rest_api/types/prompt_template_structure.py +5 -0
  844. opik/rest_api/types/prompt_tokens_details.py +19 -0
  845. opik/rest_api/types/prompt_version.py +7 -6
  846. opik/rest_api/types/prompt_version_detail.py +7 -6
  847. opik/rest_api/types/prompt_version_detail_template_structure.py +5 -0
  848. opik/rest_api/types/prompt_version_link.py +4 -5
  849. opik/rest_api/types/prompt_version_link_public.py +4 -5
  850. opik/rest_api/types/prompt_version_link_write.py +3 -5
  851. opik/rest_api/types/prompt_version_page_public.py +9 -6
  852. opik/rest_api/types/prompt_version_public.py +7 -6
  853. opik/rest_api/types/prompt_version_public_template_structure.py +5 -0
  854. opik/rest_api/types/prompt_version_template_structure.py +5 -0
  855. opik/rest_api/types/prompt_version_update.py +33 -0
  856. opik/rest_api/types/provider_api_key.py +18 -8
  857. opik/rest_api/types/provider_api_key_page_public.py +27 -0
  858. opik/rest_api/types/provider_api_key_provider.py +1 -1
  859. opik/rest_api/types/provider_api_key_public.py +18 -8
  860. opik/rest_api/types/provider_api_key_public_provider.py +1 -1
  861. opik/rest_api/types/response_format.py +5 -7
  862. opik/rest_api/types/response_format_type.py +1 -3
  863. opik/rest_api/types/result.py +21 -0
  864. opik/rest_api/types/results_number_public.py +4 -6
  865. opik/rest_api/types/score_name.py +4 -5
  866. opik/rest_api/types/service_toggles_config.py +44 -0
  867. opik/rest_api/types/span.py +13 -15
  868. opik/rest_api/types/span_batch.py +4 -6
  869. opik/rest_api/types/span_enrichment_options.py +31 -0
  870. opik/rest_api/types/span_experiment_item_bulk_write_view.py +39 -0
  871. opik/rest_api/types/span_experiment_item_bulk_write_view_type.py +5 -0
  872. opik/rest_api/types/span_filter.py +23 -0
  873. opik/rest_api/types/span_filter_operator.py +21 -0
  874. opik/rest_api/types/span_filter_public.py +4 -6
  875. opik/rest_api/types/span_filter_public_operator.py +2 -0
  876. opik/rest_api/types/span_filter_write.py +23 -0
  877. opik/rest_api/types/span_filter_write_operator.py +21 -0
  878. opik/rest_api/types/span_llm_as_judge_code.py +27 -0
  879. opik/rest_api/types/span_llm_as_judge_code_public.py +27 -0
  880. opik/rest_api/types/span_llm_as_judge_code_write.py +27 -0
  881. opik/rest_api/types/span_page_public.py +9 -6
  882. opik/rest_api/types/span_public.py +19 -16
  883. opik/rest_api/types/span_public_type.py +1 -1
  884. opik/rest_api/types/span_type.py +1 -1
  885. opik/rest_api/types/span_update.py +46 -0
  886. opik/rest_api/types/span_update_type.py +5 -0
  887. opik/rest_api/types/span_user_defined_metric_python_code.py +20 -0
  888. opik/rest_api/types/span_user_defined_metric_python_code_public.py +20 -0
  889. opik/rest_api/types/span_user_defined_metric_python_code_write.py +20 -0
  890. opik/rest_api/types/span_write.py +13 -14
  891. opik/rest_api/types/span_write_type.py +1 -1
  892. opik/rest_api/types/spans_count_response.py +20 -0
  893. opik/rest_api/types/start_multipart_upload_response.py +20 -0
  894. opik/rest_api/types/stream_options.py +3 -5
  895. opik/rest_api/types/studio_evaluation.py +20 -0
  896. opik/rest_api/types/studio_evaluation_public.py +20 -0
  897. opik/rest_api/types/studio_evaluation_write.py +20 -0
  898. opik/rest_api/types/studio_llm_model.py +21 -0
  899. opik/rest_api/types/studio_llm_model_public.py +21 -0
  900. opik/rest_api/types/studio_llm_model_write.py +21 -0
  901. opik/rest_api/types/studio_message.py +20 -0
  902. opik/rest_api/types/studio_message_public.py +20 -0
  903. opik/rest_api/types/studio_message_write.py +20 -0
  904. opik/rest_api/types/studio_metric.py +21 -0
  905. opik/rest_api/types/studio_metric_public.py +21 -0
  906. opik/rest_api/types/studio_metric_write.py +21 -0
  907. opik/rest_api/types/studio_optimizer.py +21 -0
  908. opik/rest_api/types/studio_optimizer_public.py +21 -0
  909. opik/rest_api/types/studio_optimizer_write.py +21 -0
  910. opik/rest_api/types/studio_prompt.py +20 -0
  911. opik/rest_api/types/studio_prompt_public.py +20 -0
  912. opik/rest_api/types/studio_prompt_write.py +20 -0
  913. opik/rest_api/types/tool.py +4 -6
  914. opik/rest_api/types/tool_call.py +4 -6
  915. opik/rest_api/types/trace.py +26 -12
  916. opik/rest_api/types/trace_batch.py +4 -6
  917. opik/rest_api/types/trace_count_response.py +4 -6
  918. opik/rest_api/types/trace_enrichment_options.py +32 -0
  919. opik/rest_api/types/trace_experiment_item_bulk_write_view.py +41 -0
  920. opik/rest_api/types/trace_filter.py +23 -0
  921. opik/rest_api/types/trace_filter_operator.py +21 -0
  922. opik/rest_api/types/trace_filter_public.py +23 -0
  923. opik/rest_api/types/trace_filter_public_operator.py +21 -0
  924. opik/rest_api/types/trace_filter_write.py +23 -0
  925. opik/rest_api/types/trace_filter_write_operator.py +21 -0
  926. opik/rest_api/types/trace_page_public.py +8 -10
  927. opik/rest_api/types/trace_public.py +27 -13
  928. opik/rest_api/types/trace_public_visibility_mode.py +5 -0
  929. opik/rest_api/types/trace_thread.py +18 -9
  930. opik/rest_api/types/trace_thread_filter.py +23 -0
  931. opik/rest_api/types/trace_thread_filter_operator.py +21 -0
  932. opik/rest_api/types/trace_thread_filter_public.py +23 -0
  933. opik/rest_api/types/trace_thread_filter_public_operator.py +21 -0
  934. opik/rest_api/types/trace_thread_filter_write.py +23 -0
  935. opik/rest_api/types/trace_thread_filter_write_operator.py +21 -0
  936. opik/rest_api/types/trace_thread_identifier.py +22 -0
  937. opik/rest_api/types/trace_thread_llm_as_judge_code.py +26 -0
  938. opik/rest_api/types/trace_thread_llm_as_judge_code_public.py +26 -0
  939. opik/rest_api/types/trace_thread_llm_as_judge_code_write.py +26 -0
  940. opik/rest_api/types/trace_thread_page.py +9 -6
  941. opik/rest_api/types/trace_thread_status.py +5 -0
  942. opik/rest_api/types/trace_thread_update.py +19 -0
  943. opik/rest_api/types/trace_thread_user_defined_metric_python_code.py +19 -0
  944. opik/rest_api/types/trace_thread_user_defined_metric_python_code_public.py +19 -0
  945. opik/rest_api/types/trace_thread_user_defined_metric_python_code_write.py +19 -0
  946. opik/rest_api/types/trace_update.py +39 -0
  947. opik/rest_api/types/trace_visibility_mode.py +5 -0
  948. opik/rest_api/types/trace_write.py +10 -11
  949. opik/rest_api/types/usage.py +6 -6
  950. opik/rest_api/types/user_defined_metric_python_code.py +3 -5
  951. opik/rest_api/types/user_defined_metric_python_code_public.py +3 -5
  952. opik/rest_api/types/user_defined_metric_python_code_write.py +3 -5
  953. opik/rest_api/types/value_entry.py +27 -0
  954. opik/rest_api/types/value_entry_compare.py +27 -0
  955. opik/rest_api/types/value_entry_compare_source.py +5 -0
  956. opik/rest_api/types/value_entry_experiment_item_bulk_write_view.py +27 -0
  957. opik/rest_api/types/value_entry_experiment_item_bulk_write_view_source.py +5 -0
  958. opik/rest_api/types/value_entry_public.py +27 -0
  959. opik/rest_api/types/value_entry_public_source.py +5 -0
  960. opik/rest_api/types/value_entry_source.py +5 -0
  961. opik/rest_api/types/video_url.py +19 -0
  962. opik/rest_api/types/video_url_public.py +19 -0
  963. opik/rest_api/types/video_url_write.py +19 -0
  964. opik/rest_api/types/webhook.py +28 -0
  965. opik/rest_api/types/webhook_examples.py +19 -0
  966. opik/rest_api/types/webhook_public.py +28 -0
  967. opik/rest_api/types/webhook_test_result.py +23 -0
  968. opik/rest_api/types/webhook_test_result_status.py +5 -0
  969. opik/rest_api/types/webhook_write.py +23 -0
  970. opik/rest_api/types/welcome_wizard_tracking.py +22 -0
  971. opik/rest_api/types/workspace_configuration.py +27 -0
  972. opik/rest_api/types/workspace_metric_request.py +24 -0
  973. opik/rest_api/types/workspace_metric_response.py +20 -0
  974. opik/rest_api/types/workspace_metrics_summary_request.py +23 -0
  975. opik/rest_api/types/workspace_metrics_summary_response.py +20 -0
  976. opik/rest_api/types/workspace_name_holder.py +19 -0
  977. opik/rest_api/types/workspace_spans_count.py +20 -0
  978. opik/rest_api/types/workspace_trace_count.py +3 -5
  979. opik/rest_api/welcome_wizard/__init__.py +4 -0
  980. opik/rest_api/welcome_wizard/client.py +195 -0
  981. opik/rest_api/welcome_wizard/raw_client.py +208 -0
  982. opik/rest_api/workspaces/__init__.py +2 -0
  983. opik/rest_api/workspaces/client.py +550 -77
  984. opik/rest_api/workspaces/raw_client.py +923 -0
  985. opik/rest_client_configurator/api.py +1 -0
  986. opik/rest_client_configurator/retry_decorator.py +1 -0
  987. opik/s3_httpx_client.py +67 -0
  988. opik/simulation/__init__.py +6 -0
  989. opik/simulation/simulated_user.py +99 -0
  990. opik/simulation/simulator.py +108 -0
  991. opik/synchronization.py +11 -24
  992. opik/tracing_runtime_config.py +48 -0
  993. opik/types.py +48 -2
  994. opik/url_helpers.py +13 -3
  995. opik/validation/chat_prompt_messages.py +241 -0
  996. opik/validation/feedback_score.py +4 -5
  997. opik/validation/parameter.py +122 -0
  998. opik/validation/parameters_validator.py +175 -0
  999. opik/validation/validator.py +30 -2
  1000. opik/validation/validator_helpers.py +147 -0
  1001. opik-1.9.71.dist-info/METADATA +370 -0
  1002. opik-1.9.71.dist-info/RECORD +1110 -0
  1003. {opik-1.6.4.dist-info → opik-1.9.71.dist-info}/WHEEL +1 -1
  1004. opik-1.9.71.dist-info/licenses/LICENSE +203 -0
  1005. opik/api_objects/prompt/prompt.py +0 -107
  1006. opik/api_objects/prompt/prompt_template.py +0 -35
  1007. opik/cli.py +0 -193
  1008. opik/evaluation/metrics/models.py +0 -8
  1009. opik/hooks.py +0 -13
  1010. opik/integrations/bedrock/chunks_aggregator.py +0 -55
  1011. opik/integrations/bedrock/helpers.py +0 -8
  1012. opik/integrations/langchain/google_run_helpers.py +0 -75
  1013. opik/integrations/langchain/openai_run_helpers.py +0 -122
  1014. opik/message_processing/message_processors.py +0 -203
  1015. opik/rest_api/types/delta_role.py +0 -7
  1016. opik/rest_api/types/json_object_schema.py +0 -34
  1017. opik-1.6.4.dist-info/METADATA +0 -270
  1018. opik-1.6.4.dist-info/RECORD +0 -507
  1019. /opik/integrations/bedrock/{stream_wrappers.py → converse/stream_wrappers.py} +0 -0
  1020. {opik-1.6.4.dist-info → opik-1.9.71.dist-info}/entry_points.txt +0 -0
  1021. {opik-1.6.4.dist-info → opik-1.9.71.dist-info}/top_level.txt +0 -0
@@ -1,21 +1,31 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
3
  import typing
4
- from ..core.client_wrapper import SyncClientWrapper
4
+
5
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
5
6
  from ..core.request_options import RequestOptions
6
- from ..types.dataset_page_public import DatasetPagePublic
7
- from ..core.pydantic_utilities import parse_obj_as
8
- from json.decoder import JSONDecodeError
9
- from ..core.api_error import ApiError
10
- from ..types.dataset_item_write import DatasetItemWrite
11
- from ..core.serialization import convert_and_respect_annotation_metadata
12
- from ..types.dataset_public import DatasetPublic
13
- from ..core.jsonable_encoder import jsonable_encoder
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
14
10
  from ..types.dataset_item_page_compare import DatasetItemPageCompare
15
- from ..types.dataset_item_public import DatasetItemPublic
16
11
  from ..types.dataset_item_page_public import DatasetItemPagePublic
12
+ from ..types.dataset_item_public import DatasetItemPublic
13
+ from ..types.dataset_item_update import DatasetItemUpdate
14
+ from ..types.dataset_item_write import DatasetItemWrite
15
+ from ..types.dataset_item_write_source import DatasetItemWriteSource
16
+ from ..types.dataset_page_public import DatasetPagePublic
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
17
22
  from ..types.page_columns import PageColumns
18
- from ..core.client_wrapper import AsyncClientWrapper
23
+ from ..types.project_stats_public import ProjectStatsPublic
24
+ from ..types.span_enrichment_options import SpanEnrichmentOptions
25
+ from ..types.trace_enrichment_options import TraceEnrichmentOptions
26
+ from .raw_client import AsyncRawDatasetsClient, RawDatasetsClient
27
+ from .types.dataset_update_visibility import DatasetUpdateVisibility
28
+ from .types.dataset_write_visibility import DatasetWriteVisibility
19
29
 
20
30
  # this is used as the default value for optional parameters
21
31
  OMIT = typing.cast(typing.Any, ...)
@@ -23,7 +33,116 @@ OMIT = typing.cast(typing.Any, ...)
23
33
 
24
34
  class DatasetsClient:
25
35
  def __init__(self, *, client_wrapper: SyncClientWrapper):
26
- self._client_wrapper = client_wrapper
36
+ self._raw_client = RawDatasetsClient(client_wrapper=client_wrapper)
37
+
38
+ @property
39
+ def with_raw_response(self) -> RawDatasetsClient:
40
+ """
41
+ Retrieves a raw implementation of this client that returns raw responses.
42
+
43
+ Returns
44
+ -------
45
+ RawDatasetsClient
46
+ """
47
+ return self._raw_client
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
27
146
 
28
147
  def find_datasets(
29
148
  self,
@@ -31,9 +150,11 @@ class DatasetsClient:
31
150
  page: typing.Optional[int] = None,
32
151
  size: typing.Optional[int] = None,
33
152
  with_experiments_only: typing.Optional[bool] = None,
153
+ with_optimizations_only: typing.Optional[bool] = None,
34
154
  prompt_id: typing.Optional[str] = None,
35
155
  name: typing.Optional[str] = None,
36
156
  sorting: typing.Optional[str] = None,
157
+ filters: typing.Optional[str] = None,
37
158
  request_options: typing.Optional[RequestOptions] = None,
38
159
  ) -> DatasetPagePublic:
39
160
  """
@@ -47,12 +168,16 @@ class DatasetsClient:
47
168
 
48
169
  with_experiments_only : typing.Optional[bool]
49
170
 
171
+ with_optimizations_only : typing.Optional[bool]
172
+
50
173
  prompt_id : typing.Optional[str]
51
174
 
52
175
  name : typing.Optional[str]
53
176
 
54
177
  sorting : typing.Optional[str]
55
178
 
179
+ filters : typing.Optional[str]
180
+
56
181
  request_options : typing.Optional[RequestOptions]
57
182
  Request-specific configuration.
58
183
 
@@ -64,45 +189,29 @@ class DatasetsClient:
64
189
  Examples
65
190
  --------
66
191
  from Opik import OpikApi
67
-
68
- client = OpikApi(
69
- api_key="YOUR_API_KEY",
70
- workspace_name="YOUR_WORKSPACE_NAME",
71
- )
192
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
72
193
  client.datasets.find_datasets()
73
194
  """
74
- _response = self._client_wrapper.httpx_client.request(
75
- "v1/private/datasets",
76
- method="GET",
77
- params={
78
- "page": page,
79
- "size": size,
80
- "with_experiments_only": with_experiments_only,
81
- "prompt_id": prompt_id,
82
- "name": name,
83
- "sorting": sorting,
84
- },
195
+ _response = self._raw_client.find_datasets(
196
+ page=page,
197
+ size=size,
198
+ with_experiments_only=with_experiments_only,
199
+ with_optimizations_only=with_optimizations_only,
200
+ prompt_id=prompt_id,
201
+ name=name,
202
+ sorting=sorting,
203
+ filters=filters,
85
204
  request_options=request_options,
86
205
  )
87
- try:
88
- if 200 <= _response.status_code < 300:
89
- return typing.cast(
90
- DatasetPagePublic,
91
- parse_obj_as(
92
- type_=DatasetPagePublic, # type: ignore
93
- object_=_response.json(),
94
- ),
95
- )
96
- _response_json = _response.json()
97
- except JSONDecodeError:
98
- raise ApiError(status_code=_response.status_code, body=_response.text)
99
- raise ApiError(status_code=_response.status_code, body=_response_json)
206
+ return _response.data
100
207
 
101
208
  def create_dataset(
102
209
  self,
103
210
  *,
104
211
  name: str,
105
212
  id: typing.Optional[str] = OMIT,
213
+ visibility: typing.Optional[DatasetWriteVisibility] = OMIT,
214
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
106
215
  description: typing.Optional[str] = OMIT,
107
216
  request_options: typing.Optional[RequestOptions] = None,
108
217
  ) -> None:
@@ -115,6 +224,10 @@ class DatasetsClient:
115
224
 
116
225
  id : typing.Optional[str]
117
226
 
227
+ visibility : typing.Optional[DatasetWriteVisibility]
228
+
229
+ tags : typing.Optional[typing.Sequence[str]]
230
+
118
231
  description : typing.Optional[str]
119
232
 
120
233
  request_options : typing.Optional[RequestOptions]
@@ -127,36 +240,13 @@ class DatasetsClient:
127
240
  Examples
128
241
  --------
129
242
  from Opik import OpikApi
130
-
131
- client = OpikApi(
132
- api_key="YOUR_API_KEY",
133
- workspace_name="YOUR_WORKSPACE_NAME",
134
- )
135
- client.datasets.create_dataset(
136
- name="name",
137
- )
243
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
244
+ client.datasets.create_dataset(name='name', )
138
245
  """
139
- _response = self._client_wrapper.httpx_client.request(
140
- "v1/private/datasets",
141
- method="POST",
142
- json={
143
- "id": id,
144
- "name": name,
145
- "description": description,
146
- },
147
- headers={
148
- "content-type": "application/json",
149
- },
150
- request_options=request_options,
151
- omit=OMIT,
246
+ _response = self._raw_client.create_dataset(
247
+ name=name, id=id, visibility=visibility, tags=tags, description=description, request_options=request_options
152
248
  )
153
- try:
154
- if 200 <= _response.status_code < 300:
155
- return
156
- _response_json = _response.json()
157
- except JSONDecodeError:
158
- raise ApiError(status_code=_response.status_code, body=_response.text)
159
- raise ApiError(status_code=_response.status_code, body=_response_json)
249
+ return _response.data
160
250
 
161
251
  def create_or_update_dataset_items(
162
252
  self,
@@ -188,50 +278,131 @@ class DatasetsClient:
188
278
 
189
279
  Examples
190
280
  --------
191
- from Opik import DatasetItemWrite, OpikApi
281
+ from Opik import OpikApi
282
+ from Opik import DatasetItemWrite
283
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
284
+ client.datasets.create_or_update_dataset_items(items=[DatasetItemWrite(source="manual", data={'key': 'value'
285
+ }, )], )
286
+ """
287
+ _response = self._raw_client.create_or_update_dataset_items(
288
+ items=items, dataset_name=dataset_name, dataset_id=dataset_id, request_options=request_options
289
+ )
290
+ return _response.data
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
192
314
 
193
- client = OpikApi(
194
- api_key="YOUR_API_KEY",
195
- workspace_name="YOUR_WORKSPACE_NAME",
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
196
324
  )
197
- client.datasets.create_or_update_dataset_items(
198
- items=[
199
- DatasetItemWrite(
200
- source="manual",
201
- data={"key": "value"},
202
- )
203
- ],
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
204
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:
205
374
  """
206
- _response = self._client_wrapper.httpx_client.request(
207
- "v1/private/datasets/items",
208
- method="PUT",
209
- json={
210
- "dataset_name": dataset_name,
211
- "dataset_id": dataset_id,
212
- "items": convert_and_respect_annotation_metadata(
213
- object_=items,
214
- annotation=typing.Sequence[DatasetItemWrite],
215
- direction="write",
216
- ),
217
- },
218
- headers={
219
- "content-type": "application/json",
220
- },
221
- request_options=request_options,
222
- omit=OMIT,
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
223
402
  )
224
- try:
225
- if 200 <= _response.status_code < 300:
226
- return
227
- _response_json = _response.json()
228
- except JSONDecodeError:
229
- raise ApiError(status_code=_response.status_code, body=_response.text)
230
- raise ApiError(status_code=_response.status_code, body=_response_json)
231
-
232
- def get_dataset_by_id(
233
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
234
- ) -> DatasetPublic:
403
+ return _response.data
404
+
405
+ def get_dataset_by_id(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> DatasetPublic:
235
406
  """
236
407
  Get dataset by id
237
408
 
@@ -250,33 +421,11 @@ class DatasetsClient:
250
421
  Examples
251
422
  --------
252
423
  from Opik import OpikApi
253
-
254
- client = OpikApi(
255
- api_key="YOUR_API_KEY",
256
- workspace_name="YOUR_WORKSPACE_NAME",
257
- )
258
- client.datasets.get_dataset_by_id(
259
- id="id",
260
- )
424
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
425
+ client.datasets.get_dataset_by_id(id='id', )
261
426
  """
262
- _response = self._client_wrapper.httpx_client.request(
263
- f"v1/private/datasets/{jsonable_encoder(id)}",
264
- method="GET",
265
- request_options=request_options,
266
- )
267
- try:
268
- if 200 <= _response.status_code < 300:
269
- return typing.cast(
270
- DatasetPublic,
271
- parse_obj_as(
272
- type_=DatasetPublic, # type: ignore
273
- object_=_response.json(),
274
- ),
275
- )
276
- _response_json = _response.json()
277
- except JSONDecodeError:
278
- raise ApiError(status_code=_response.status_code, body=_response.text)
279
- raise ApiError(status_code=_response.status_code, body=_response_json)
427
+ _response = self._raw_client.get_dataset_by_id(id, request_options=request_options)
428
+ return _response.data
280
429
 
281
430
  def update_dataset(
282
431
  self,
@@ -284,6 +433,8 @@ class DatasetsClient:
284
433
  *,
285
434
  name: str,
286
435
  description: typing.Optional[str] = OMIT,
436
+ visibility: typing.Optional[DatasetUpdateVisibility] = OMIT,
437
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
287
438
  request_options: typing.Optional[RequestOptions] = None,
288
439
  ) -> None:
289
440
  """
@@ -297,6 +448,10 @@ class DatasetsClient:
297
448
 
298
449
  description : typing.Optional[str]
299
450
 
451
+ visibility : typing.Optional[DatasetUpdateVisibility]
452
+
453
+ tags : typing.Optional[typing.Sequence[str]]
454
+
300
455
  request_options : typing.Optional[RequestOptions]
301
456
  Request-specific configuration.
302
457
 
@@ -307,40 +462,15 @@ class DatasetsClient:
307
462
  Examples
308
463
  --------
309
464
  from Opik import OpikApi
310
-
311
- client = OpikApi(
312
- api_key="YOUR_API_KEY",
313
- workspace_name="YOUR_WORKSPACE_NAME",
314
- )
315
- client.datasets.update_dataset(
316
- id="id",
317
- name="name",
318
- )
465
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
466
+ client.datasets.update_dataset(id='id', name='name', )
319
467
  """
320
- _response = self._client_wrapper.httpx_client.request(
321
- f"v1/private/datasets/{jsonable_encoder(id)}",
322
- method="PUT",
323
- json={
324
- "name": name,
325
- "description": description,
326
- },
327
- headers={
328
- "content-type": "application/json",
329
- },
330
- request_options=request_options,
331
- omit=OMIT,
468
+ _response = self._raw_client.update_dataset(
469
+ id, name=name, description=description, visibility=visibility, tags=tags, request_options=request_options
332
470
  )
333
- try:
334
- if 200 <= _response.status_code < 300:
335
- return
336
- _response_json = _response.json()
337
- except JSONDecodeError:
338
- raise ApiError(status_code=_response.status_code, body=_response.text)
339
- raise ApiError(status_code=_response.status_code, body=_response_json)
340
-
341
- def delete_dataset(
342
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
343
- ) -> None:
471
+ return _response.data
472
+
473
+ def delete_dataset(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
344
474
  """
345
475
  Delete dataset by id
346
476
 
@@ -358,33 +488,14 @@ class DatasetsClient:
358
488
  Examples
359
489
  --------
360
490
  from Opik import OpikApi
361
-
362
- client = OpikApi(
363
- api_key="YOUR_API_KEY",
364
- workspace_name="YOUR_WORKSPACE_NAME",
365
- )
366
- client.datasets.delete_dataset(
367
- id="id",
368
- )
491
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
492
+ client.datasets.delete_dataset(id='id', )
369
493
  """
370
- _response = self._client_wrapper.httpx_client.request(
371
- f"v1/private/datasets/{jsonable_encoder(id)}",
372
- method="DELETE",
373
- request_options=request_options,
374
- )
375
- try:
376
- if 200 <= _response.status_code < 300:
377
- return
378
- _response_json = _response.json()
379
- except JSONDecodeError:
380
- raise ApiError(status_code=_response.status_code, body=_response.text)
381
- raise ApiError(status_code=_response.status_code, body=_response_json)
494
+ _response = self._raw_client.delete_dataset(id, request_options=request_options)
495
+ return _response.data
382
496
 
383
497
  def delete_dataset_by_name(
384
- self,
385
- *,
386
- dataset_name: str,
387
- request_options: typing.Optional[RequestOptions] = None,
498
+ self, *, dataset_name: str, request_options: typing.Optional[RequestOptions] = None
388
499
  ) -> None:
389
500
  """
390
501
  Delete dataset by name
@@ -403,47 +514,37 @@ class DatasetsClient:
403
514
  Examples
404
515
  --------
405
516
  from Opik import OpikApi
406
-
407
- client = OpikApi(
408
- api_key="YOUR_API_KEY",
409
- workspace_name="YOUR_WORKSPACE_NAME",
410
- )
411
- client.datasets.delete_dataset_by_name(
412
- dataset_name="dataset_name",
413
- )
517
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
518
+ client.datasets.delete_dataset_by_name(dataset_name='dataset_name', )
414
519
  """
415
- _response = self._client_wrapper.httpx_client.request(
416
- "v1/private/datasets/delete",
417
- method="POST",
418
- json={
419
- "dataset_name": dataset_name,
420
- },
421
- headers={
422
- "content-type": "application/json",
423
- },
424
- request_options=request_options,
425
- omit=OMIT,
426
- )
427
- try:
428
- if 200 <= _response.status_code < 300:
429
- return
430
- _response_json = _response.json()
431
- except JSONDecodeError:
432
- raise ApiError(status_code=_response.status_code, body=_response.text)
433
- raise ApiError(status_code=_response.status_code, body=_response_json)
520
+ _response = self._raw_client.delete_dataset_by_name(dataset_name=dataset_name, request_options=request_options)
521
+ return _response.data
434
522
 
435
523
  def delete_dataset_items(
436
524
  self,
437
525
  *,
438
- item_ids: typing.Sequence[str],
526
+ item_ids: typing.Optional[typing.Sequence[str]] = OMIT,
527
+ dataset_id: typing.Optional[str] = OMIT,
528
+ filters: typing.Optional[typing.Sequence[DatasetItemFilter]] = OMIT,
439
529
  request_options: typing.Optional[RequestOptions] = None,
440
530
  ) -> None:
441
531
  """
442
- 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.
443
537
 
444
538
  Parameters
445
539
  ----------
446
- 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'.
447
548
 
448
549
  request_options : typing.Optional[RequestOptions]
449
550
  Request-specific configuration.
@@ -455,40 +556,16 @@ class DatasetsClient:
455
556
  Examples
456
557
  --------
457
558
  from Opik import OpikApi
458
-
459
- client = OpikApi(
460
- api_key="YOUR_API_KEY",
461
- workspace_name="YOUR_WORKSPACE_NAME",
462
- )
463
- client.datasets.delete_dataset_items(
464
- item_ids=["item_ids"],
465
- )
559
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
560
+ client.datasets.delete_dataset_items()
466
561
  """
467
- _response = self._client_wrapper.httpx_client.request(
468
- "v1/private/datasets/items/delete",
469
- method="POST",
470
- json={
471
- "item_ids": item_ids,
472
- },
473
- headers={
474
- "content-type": "application/json",
475
- },
476
- request_options=request_options,
477
- omit=OMIT,
562
+ _response = self._raw_client.delete_dataset_items(
563
+ item_ids=item_ids, dataset_id=dataset_id, filters=filters, request_options=request_options
478
564
  )
479
- try:
480
- if 200 <= _response.status_code < 300:
481
- return
482
- _response_json = _response.json()
483
- except JSONDecodeError:
484
- raise ApiError(status_code=_response.status_code, body=_response.text)
485
- raise ApiError(status_code=_response.status_code, body=_response_json)
565
+ return _response.data
486
566
 
487
567
  def delete_datasets_batch(
488
- self,
489
- *,
490
- ids: typing.Sequence[str],
491
- request_options: typing.Optional[RequestOptions] = None,
568
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
492
569
  ) -> None:
493
570
  """
494
571
  Delete datasets batch
@@ -507,31 +584,69 @@ class DatasetsClient:
507
584
  Examples
508
585
  --------
509
586
  from Opik import OpikApi
587
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
588
+ client.datasets.delete_datasets_batch(ids=['ids'], )
589
+ """
590
+ _response = self._raw_client.delete_datasets_batch(ids=ids, request_options=request_options)
591
+ return _response.data
510
592
 
511
- client = OpikApi(
512
- api_key="YOUR_API_KEY",
513
- workspace_name="YOUR_WORKSPACE_NAME",
514
- )
515
- client.datasets.delete_datasets_batch(
516
- ids=["ids"],
517
- )
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', )
518
639
  """
519
- _response = self._client_wrapper.httpx_client.request(
520
- "v1/private/datasets/delete-batch",
521
- method="POST",
522
- json={
523
- "ids": ids,
524
- },
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,
525
647
  request_options=request_options,
526
- omit=OMIT,
527
648
  )
528
- try:
529
- if 200 <= _response.status_code < 300:
530
- return
531
- _response_json = _response.json()
532
- except JSONDecodeError:
533
- raise ApiError(status_code=_response.status_code, body=_response.text)
534
- raise ApiError(status_code=_response.status_code, body=_response_json)
649
+ return _response.data
535
650
 
536
651
  def find_dataset_items_with_experiment_items(
537
652
  self,
@@ -541,6 +656,8 @@ class DatasetsClient:
541
656
  page: typing.Optional[int] = None,
542
657
  size: typing.Optional[int] = None,
543
658
  filters: typing.Optional[str] = None,
659
+ sorting: typing.Optional[str] = None,
660
+ search: typing.Optional[str] = None,
544
661
  truncate: typing.Optional[bool] = None,
545
662
  request_options: typing.Optional[RequestOptions] = None,
546
663
  ) -> DatasetItemPageCompare:
@@ -559,6 +676,10 @@ class DatasetsClient:
559
676
 
560
677
  filters : typing.Optional[str]
561
678
 
679
+ sorting : typing.Optional[str]
680
+
681
+ search : typing.Optional[str]
682
+
562
683
  truncate : typing.Optional[bool]
563
684
 
564
685
  request_options : typing.Optional[RequestOptions]
@@ -572,47 +693,24 @@ class DatasetsClient:
572
693
  Examples
573
694
  --------
574
695
  from Opik import OpikApi
575
-
576
- client = OpikApi(
577
- api_key="YOUR_API_KEY",
578
- workspace_name="YOUR_WORKSPACE_NAME",
579
- )
580
- client.datasets.find_dataset_items_with_experiment_items(
581
- id="id",
582
- experiment_ids="experiment_ids",
583
- )
696
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
697
+ client.datasets.find_dataset_items_with_experiment_items(id='id', experiment_ids='experiment_ids', )
584
698
  """
585
- _response = self._client_wrapper.httpx_client.request(
586
- f"v1/private/datasets/{jsonable_encoder(id)}/items/experiments/items",
587
- method="GET",
588
- params={
589
- "page": page,
590
- "size": size,
591
- "experiment_ids": experiment_ids,
592
- "filters": filters,
593
- "truncate": truncate,
594
- },
699
+ _response = self._raw_client.find_dataset_items_with_experiment_items(
700
+ id,
701
+ experiment_ids=experiment_ids,
702
+ page=page,
703
+ size=size,
704
+ filters=filters,
705
+ sorting=sorting,
706
+ search=search,
707
+ truncate=truncate,
595
708
  request_options=request_options,
596
709
  )
597
- try:
598
- if 200 <= _response.status_code < 300:
599
- return typing.cast(
600
- DatasetItemPageCompare,
601
- parse_obj_as(
602
- type_=DatasetItemPageCompare, # type: ignore
603
- object_=_response.json(),
604
- ),
605
- )
606
- _response_json = _response.json()
607
- except JSONDecodeError:
608
- raise ApiError(status_code=_response.status_code, body=_response.text)
609
- raise ApiError(status_code=_response.status_code, body=_response_json)
710
+ return _response.data
610
711
 
611
712
  def get_dataset_by_identifier(
612
- self,
613
- *,
614
- dataset_name: str,
615
- request_options: typing.Optional[RequestOptions] = None,
713
+ self, *, dataset_name: str, request_options: typing.Optional[RequestOptions] = None
616
714
  ) -> DatasetPublic:
617
715
  """
618
716
  Get dataset by name
@@ -632,89 +730,135 @@ class DatasetsClient:
632
730
  Examples
633
731
  --------
634
732
  from Opik import OpikApi
635
-
636
- client = OpikApi(
637
- api_key="YOUR_API_KEY",
638
- workspace_name="YOUR_WORKSPACE_NAME",
639
- )
640
- client.datasets.get_dataset_by_identifier(
641
- dataset_name="dataset_name",
642
- )
733
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
734
+ client.datasets.get_dataset_by_identifier(dataset_name='dataset_name', )
643
735
  """
644
- _response = self._client_wrapper.httpx_client.request(
645
- "v1/private/datasets/retrieve",
646
- method="POST",
647
- json={
648
- "dataset_name": dataset_name,
649
- },
650
- headers={
651
- "content-type": "application/json",
652
- },
653
- request_options=request_options,
654
- omit=OMIT,
736
+ _response = self._raw_client.get_dataset_by_identifier(
737
+ dataset_name=dataset_name, request_options=request_options
655
738
  )
656
- try:
657
- if 200 <= _response.status_code < 300:
658
- return typing.cast(
659
- DatasetPublic,
660
- parse_obj_as(
661
- type_=DatasetPublic, # type: ignore
662
- object_=_response.json(),
663
- ),
664
- )
665
- _response_json = _response.json()
666
- except JSONDecodeError:
667
- raise ApiError(status_code=_response.status_code, body=_response.text)
668
- raise ApiError(status_code=_response.status_code, body=_response_json)
739
+ return _response.data
669
740
 
670
- def get_dataset_item_by_id(
671
- self, item_id: str, *, request_options: typing.Optional[RequestOptions] = None
672
- ) -> DatasetItemPublic:
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:
673
749
  """
674
- Get dataset item by id
750
+ Get experiment items stats for dataset
675
751
 
676
752
  Parameters
677
753
  ----------
678
- item_id : str
754
+ id : str
755
+
756
+ experiment_ids : str
757
+
758
+ filters : typing.Optional[str]
679
759
 
680
760
  request_options : typing.Optional[RequestOptions]
681
761
  Request-specific configuration.
682
762
 
683
763
  Returns
684
764
  -------
685
- DatasetItemPublic
686
- Dataset item resource
765
+ ProjectStatsPublic
766
+ Experiment items stats resource
687
767
 
688
768
  Examples
689
769
  --------
690
770
  from Opik import OpikApi
691
-
692
- client = OpikApi(
693
- api_key="YOUR_API_KEY",
694
- workspace_name="YOUR_WORKSPACE_NAME",
695
- )
696
- client.datasets.get_dataset_item_by_id(
697
- item_id="itemId",
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
698
776
  )
777
+ return _response.data
778
+
779
+ def get_dataset_item_by_id(
780
+ self, item_id: str, *, request_options: typing.Optional[RequestOptions] = None
781
+ ) -> DatasetItemPublic:
782
+ """
783
+ Get dataset item by id
784
+
785
+ Parameters
786
+ ----------
787
+ item_id : str
788
+
789
+ request_options : typing.Optional[RequestOptions]
790
+ Request-specific configuration.
791
+
792
+ Returns
793
+ -------
794
+ DatasetItemPublic
795
+ Dataset item resource
796
+
797
+ Examples
798
+ --------
799
+ from Opik import OpikApi
800
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
801
+ client.datasets.get_dataset_item_by_id(item_id='itemId', )
802
+ """
803
+ _response = self._raw_client.get_dataset_item_by_id(item_id, request_options=request_options)
804
+ return _response.data
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
+ }, )
699
850
  """
700
- _response = self._client_wrapper.httpx_client.request(
701
- f"v1/private/datasets/items/{jsonable_encoder(item_id)}",
702
- method="GET",
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,
703
859
  request_options=request_options,
704
860
  )
705
- try:
706
- if 200 <= _response.status_code < 300:
707
- return typing.cast(
708
- DatasetItemPublic,
709
- parse_obj_as(
710
- type_=DatasetItemPublic, # type: ignore
711
- object_=_response.json(),
712
- ),
713
- )
714
- _response_json = _response.json()
715
- except JSONDecodeError:
716
- raise ApiError(status_code=_response.status_code, body=_response.text)
717
- raise ApiError(status_code=_response.status_code, body=_response_json)
861
+ return _response.data
718
862
 
719
863
  def get_dataset_items(
720
864
  self,
@@ -722,6 +866,8 @@ class DatasetsClient:
722
866
  *,
723
867
  page: typing.Optional[int] = None,
724
868
  size: typing.Optional[int] = None,
869
+ version: typing.Optional[str] = None,
870
+ filters: typing.Optional[str] = None,
725
871
  truncate: typing.Optional[bool] = None,
726
872
  request_options: typing.Optional[RequestOptions] = None,
727
873
  ) -> DatasetItemPagePublic:
@@ -736,6 +882,10 @@ class DatasetsClient:
736
882
 
737
883
  size : typing.Optional[int]
738
884
 
885
+ version : typing.Optional[str]
886
+
887
+ filters : typing.Optional[str]
888
+
739
889
  truncate : typing.Optional[bool]
740
890
 
741
891
  request_options : typing.Optional[RequestOptions]
@@ -749,38 +899,19 @@ class DatasetsClient:
749
899
  Examples
750
900
  --------
751
901
  from Opik import OpikApi
752
-
753
- client = OpikApi(
754
- api_key="YOUR_API_KEY",
755
- workspace_name="YOUR_WORKSPACE_NAME",
756
- )
757
- client.datasets.get_dataset_items(
758
- id="id",
759
- )
902
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
903
+ client.datasets.get_dataset_items(id='id', )
760
904
  """
761
- _response = self._client_wrapper.httpx_client.request(
762
- f"v1/private/datasets/{jsonable_encoder(id)}/items",
763
- method="GET",
764
- params={
765
- "page": page,
766
- "size": size,
767
- "truncate": truncate,
768
- },
905
+ _response = self._raw_client.get_dataset_items(
906
+ id,
907
+ page=page,
908
+ size=size,
909
+ version=version,
910
+ filters=filters,
911
+ truncate=truncate,
769
912
  request_options=request_options,
770
913
  )
771
- try:
772
- if 200 <= _response.status_code < 300:
773
- return typing.cast(
774
- DatasetItemPagePublic,
775
- parse_obj_as(
776
- type_=DatasetItemPagePublic, # type: ignore
777
- object_=_response.json(),
778
- ),
779
- )
780
- _response_json = _response.json()
781
- except JSONDecodeError:
782
- raise ApiError(status_code=_response.status_code, body=_response.text)
783
- raise ApiError(status_code=_response.status_code, body=_response_json)
914
+ return _response.data
784
915
 
785
916
  def get_dataset_items_output_columns(
786
917
  self,
@@ -809,36 +940,13 @@ class DatasetsClient:
809
940
  Examples
810
941
  --------
811
942
  from Opik import OpikApi
812
-
813
- client = OpikApi(
814
- api_key="YOUR_API_KEY",
815
- workspace_name="YOUR_WORKSPACE_NAME",
816
- )
817
- client.datasets.get_dataset_items_output_columns(
818
- id="id",
819
- )
943
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
944
+ client.datasets.get_dataset_items_output_columns(id='id', )
820
945
  """
821
- _response = self._client_wrapper.httpx_client.request(
822
- f"v1/private/datasets/{jsonable_encoder(id)}/items/experiments/items/output/columns",
823
- method="GET",
824
- params={
825
- "experiment_ids": experiment_ids,
826
- },
827
- request_options=request_options,
946
+ _response = self._raw_client.get_dataset_items_output_columns(
947
+ id, experiment_ids=experiment_ids, request_options=request_options
828
948
  )
829
- try:
830
- if 200 <= _response.status_code < 300:
831
- return typing.cast(
832
- PageColumns,
833
- parse_obj_as(
834
- type_=PageColumns, # type: ignore
835
- object_=_response.json(),
836
- ),
837
- )
838
- _response_json = _response.json()
839
- except JSONDecodeError:
840
- raise ApiError(status_code=_response.status_code, body=_response.text)
841
- raise ApiError(status_code=_response.status_code, body=_response_json)
949
+ return _response.data
842
950
 
843
951
  def stream_dataset_items(
844
952
  self,
@@ -862,145 +970,59 @@ class DatasetsClient:
862
970
  request_options : typing.Optional[RequestOptions]
863
971
  Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
864
972
 
865
- Yields
866
- ------
973
+ Returns
974
+ -------
867
975
  typing.Iterator[bytes]
868
976
  Dataset items stream or error during process
869
977
  """
870
- with self._client_wrapper.httpx_client.stream(
871
- "v1/private/datasets/items/stream",
872
- method="POST",
873
- json={
874
- "dataset_name": dataset_name,
875
- "last_retrieved_id": last_retrieved_id,
876
- "steam_limit": steam_limit,
877
- },
878
- headers={
879
- "content-type": "application/json",
880
- },
978
+ with self._raw_client.stream_dataset_items(
979
+ dataset_name=dataset_name,
980
+ last_retrieved_id=last_retrieved_id,
981
+ steam_limit=steam_limit,
881
982
  request_options=request_options,
882
- omit=OMIT,
883
- ) as _response:
884
- try:
885
- if 200 <= _response.status_code < 300:
886
- _chunk_size = (
887
- request_options.get("chunk_size", None)
888
- if request_options is not None
889
- else None
890
- )
891
- for _chunk in _response.iter_bytes(chunk_size=_chunk_size):
892
- yield _chunk
893
- return
894
- _response.read()
895
- _response_json = _response.json()
896
- except JSONDecodeError:
897
- raise ApiError(status_code=_response.status_code, body=_response.text)
898
- raise ApiError(status_code=_response.status_code, body=_response_json)
899
-
983
+ ) as r:
984
+ yield from r.data
900
985
 
901
- class AsyncDatasetsClient:
902
- def __init__(self, *, client_wrapper: AsyncClientWrapper):
903
- self._client_wrapper = client_wrapper
904
-
905
- async def find_datasets(
906
- self,
907
- *,
908
- page: typing.Optional[int] = None,
909
- size: typing.Optional[int] = None,
910
- with_experiments_only: typing.Optional[bool] = None,
911
- prompt_id: typing.Optional[str] = None,
912
- name: typing.Optional[str] = None,
913
- sorting: typing.Optional[str] = None,
914
- request_options: typing.Optional[RequestOptions] = None,
915
- ) -> DatasetPagePublic:
986
+ def compare_dataset_versions(
987
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
988
+ ) -> DatasetVersionDiff:
916
989
  """
917
- Find datasets
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.
918
991
 
919
992
  Parameters
920
993
  ----------
921
- page : typing.Optional[int]
922
-
923
- size : typing.Optional[int]
924
-
925
- with_experiments_only : typing.Optional[bool]
926
-
927
- prompt_id : typing.Optional[str]
928
-
929
- name : typing.Optional[str]
930
-
931
- sorting : typing.Optional[str]
994
+ id : str
932
995
 
933
996
  request_options : typing.Optional[RequestOptions]
934
997
  Request-specific configuration.
935
998
 
936
999
  Returns
937
1000
  -------
938
- DatasetPagePublic
939
- Dataset resource
1001
+ DatasetVersionDiff
1002
+ Diff computed successfully
940
1003
 
941
1004
  Examples
942
1005
  --------
943
- import asyncio
944
-
945
- from Opik import AsyncOpikApi
946
-
947
- client = AsyncOpikApi(
948
- api_key="YOUR_API_KEY",
949
- workspace_name="YOUR_WORKSPACE_NAME",
950
- )
951
-
952
-
953
- async def main() -> None:
954
- await client.datasets.find_datasets()
955
-
956
-
957
- asyncio.run(main())
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', )
958
1009
  """
959
- _response = await self._client_wrapper.httpx_client.request(
960
- "v1/private/datasets",
961
- method="GET",
962
- params={
963
- "page": page,
964
- "size": size,
965
- "with_experiments_only": with_experiments_only,
966
- "prompt_id": prompt_id,
967
- "name": name,
968
- "sorting": sorting,
969
- },
970
- request_options=request_options,
971
- )
972
- try:
973
- if 200 <= _response.status_code < 300:
974
- return typing.cast(
975
- DatasetPagePublic,
976
- parse_obj_as(
977
- type_=DatasetPagePublic, # type: ignore
978
- object_=_response.json(),
979
- ),
980
- )
981
- _response_json = _response.json()
982
- except JSONDecodeError:
983
- raise ApiError(status_code=_response.status_code, body=_response.text)
984
- raise ApiError(status_code=_response.status_code, body=_response_json)
1010
+ _response = self._raw_client.compare_dataset_versions(id, request_options=request_options)
1011
+ return _response.data
985
1012
 
986
- async def create_dataset(
987
- self,
988
- *,
989
- name: str,
990
- id: typing.Optional[str] = OMIT,
991
- description: typing.Optional[str] = OMIT,
992
- request_options: typing.Optional[RequestOptions] = None,
1013
+ def create_version_tag(
1014
+ self, version_hash: str, id: str, *, tag: str, request_options: typing.Optional[RequestOptions] = None
993
1015
  ) -> None:
994
1016
  """
995
- Create dataset
1017
+ Add a tag to a specific dataset version for easy reference (e.g., 'baseline', 'v1.0', 'production')
996
1018
 
997
1019
  Parameters
998
1020
  ----------
999
- name : str
1021
+ version_hash : str
1000
1022
 
1001
- id : typing.Optional[str]
1023
+ id : str
1002
1024
 
1003
- description : typing.Optional[str]
1025
+ tag : str
1004
1026
 
1005
1027
  request_options : typing.Optional[RequestOptions]
1006
1028
  Request-specific configuration.
@@ -1011,259 +1033,250 @@ class AsyncDatasetsClient:
1011
1033
 
1012
1034
  Examples
1013
1035
  --------
1014
- import asyncio
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
1015
1042
 
1016
- from Opik import AsyncOpikApi
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.
1017
1048
 
1018
- client = AsyncOpikApi(
1019
- api_key="YOUR_API_KEY",
1020
- workspace_name="YOUR_WORKSPACE_NAME",
1021
- )
1049
+ Parameters
1050
+ ----------
1051
+ version_hash : str
1022
1052
 
1053
+ tag : str
1023
1054
 
1024
- async def main() -> None:
1025
- await client.datasets.create_dataset(
1026
- name="name",
1027
- )
1055
+ id : str
1028
1056
 
1057
+ request_options : typing.Optional[RequestOptions]
1058
+ Request-specific configuration.
1029
1059
 
1030
- asyncio.run(main())
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', )
1031
1069
  """
1032
- _response = await self._client_wrapper.httpx_client.request(
1033
- "v1/private/datasets",
1034
- method="POST",
1035
- json={
1036
- "id": id,
1037
- "name": name,
1038
- "description": description,
1039
- },
1040
- headers={
1041
- "content-type": "application/json",
1042
- },
1043
- request_options=request_options,
1044
- omit=OMIT,
1045
- )
1046
- try:
1047
- if 200 <= _response.status_code < 300:
1048
- return
1049
- _response_json = _response.json()
1050
- except JSONDecodeError:
1051
- raise ApiError(status_code=_response.status_code, body=_response.text)
1052
- raise ApiError(status_code=_response.status_code, body=_response_json)
1070
+ _response = self._raw_client.delete_version_tag(version_hash, tag, id, request_options=request_options)
1071
+ return _response.data
1053
1072
 
1054
- async def create_or_update_dataset_items(
1073
+ def list_dataset_versions(
1055
1074
  self,
1075
+ id: str,
1056
1076
  *,
1057
- items: typing.Sequence[DatasetItemWrite],
1058
- dataset_name: typing.Optional[str] = OMIT,
1059
- dataset_id: typing.Optional[str] = OMIT,
1077
+ page: typing.Optional[int] = None,
1078
+ size: typing.Optional[int] = None,
1060
1079
  request_options: typing.Optional[RequestOptions] = None,
1061
- ) -> None:
1080
+ ) -> DatasetVersionPagePublic:
1062
1081
  """
1063
- Create/update dataset items based on dataset item id
1082
+ Get paginated list of versions for a dataset, ordered by creation time (newest first)
1064
1083
 
1065
1084
  Parameters
1066
1085
  ----------
1067
- items : typing.Sequence[DatasetItemWrite]
1086
+ id : str
1068
1087
 
1069
- dataset_name : typing.Optional[str]
1070
- If null, dataset_id must be provided
1088
+ page : typing.Optional[int]
1071
1089
 
1072
- dataset_id : typing.Optional[str]
1073
- If null, dataset_name must be provided
1090
+ size : typing.Optional[int]
1074
1091
 
1075
1092
  request_options : typing.Optional[RequestOptions]
1076
1093
  Request-specific configuration.
1077
1094
 
1078
1095
  Returns
1079
1096
  -------
1080
- None
1097
+ DatasetVersionPagePublic
1098
+ Dataset versions
1081
1099
 
1082
1100
  Examples
1083
1101
  --------
1084
- import asyncio
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
1085
1108
 
1086
- from Opik import AsyncOpikApi, DatasetItemWrite
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).
1087
1114
 
1088
- client = AsyncOpikApi(
1089
- api_key="YOUR_API_KEY",
1090
- workspace_name="YOUR_WORKSPACE_NAME",
1091
- )
1115
+ Parameters
1116
+ ----------
1117
+ id : str
1092
1118
 
1119
+ version_ref : str
1120
+ Version hash or tag to restore from
1093
1121
 
1094
- async def main() -> None:
1095
- await client.datasets.create_or_update_dataset_items(
1096
- items=[
1097
- DatasetItemWrite(
1098
- source="manual",
1099
- data={"key": "value"},
1100
- )
1101
- ],
1102
- )
1122
+ request_options : typing.Optional[RequestOptions]
1123
+ Request-specific configuration.
1103
1124
 
1125
+ Returns
1126
+ -------
1127
+ DatasetVersionPublic
1128
+ Version restored successfully
1104
1129
 
1105
- asyncio.run(main())
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', )
1106
1135
  """
1107
- _response = await self._client_wrapper.httpx_client.request(
1108
- "v1/private/datasets/items",
1109
- method="PUT",
1110
- json={
1111
- "dataset_name": dataset_name,
1112
- "dataset_id": dataset_id,
1113
- "items": convert_and_respect_annotation_metadata(
1114
- object_=items,
1115
- annotation=typing.Sequence[DatasetItemWrite],
1116
- direction="write",
1117
- ),
1118
- },
1119
- headers={
1120
- "content-type": "application/json",
1121
- },
1122
- request_options=request_options,
1123
- omit=OMIT,
1136
+ _response = self._raw_client.restore_dataset_version(
1137
+ id, version_ref=version_ref, request_options=request_options
1124
1138
  )
1125
- try:
1126
- if 200 <= _response.status_code < 300:
1127
- return
1128
- _response_json = _response.json()
1129
- except JSONDecodeError:
1130
- raise ApiError(status_code=_response.status_code, body=_response.text)
1131
- raise ApiError(status_code=_response.status_code, body=_response_json)
1139
+ return _response.data
1132
1140
 
1133
- async def get_dataset_by_id(
1134
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
1135
- ) -> DatasetPublic:
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:
1136
1150
  """
1137
- Get dataset by id
1151
+ Update a dataset version's change_description and/or add new tags
1138
1152
 
1139
1153
  Parameters
1140
1154
  ----------
1155
+ version_hash : str
1156
+
1141
1157
  id : str
1142
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
+
1143
1165
  request_options : typing.Optional[RequestOptions]
1144
1166
  Request-specific configuration.
1145
1167
 
1146
1168
  Returns
1147
1169
  -------
1148
- DatasetPublic
1149
- Dataset resource
1170
+ DatasetVersionPublic
1171
+ Version updated successfully
1150
1172
 
1151
1173
  Examples
1152
1174
  --------
1153
- import asyncio
1154
-
1155
- from Opik import AsyncOpikApi
1156
-
1157
- client = AsyncOpikApi(
1158
- api_key="YOUR_API_KEY",
1159
- workspace_name="YOUR_WORKSPACE_NAME",
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,
1160
1185
  )
1186
+ return _response.data
1161
1187
 
1162
1188
 
1163
- async def main() -> None:
1164
- await client.datasets.get_dataset_by_id(
1165
- id="id",
1166
- )
1189
+ class AsyncDatasetsClient:
1190
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
1191
+ self._raw_client = AsyncRawDatasetsClient(client_wrapper=client_wrapper)
1167
1192
 
1193
+ @property
1194
+ def with_raw_response(self) -> AsyncRawDatasetsClient:
1195
+ """
1196
+ Retrieves a raw implementation of this client that returns raw responses.
1168
1197
 
1169
- asyncio.run(main())
1198
+ Returns
1199
+ -------
1200
+ AsyncRawDatasetsClient
1170
1201
  """
1171
- _response = await self._client_wrapper.httpx_client.request(
1172
- f"v1/private/datasets/{jsonable_encoder(id)}",
1173
- method="GET",
1174
- request_options=request_options,
1175
- )
1176
- try:
1177
- if 200 <= _response.status_code < 300:
1178
- return typing.cast(
1179
- DatasetPublic,
1180
- parse_obj_as(
1181
- type_=DatasetPublic, # type: ignore
1182
- object_=_response.json(),
1183
- ),
1184
- )
1185
- _response_json = _response.json()
1186
- except JSONDecodeError:
1187
- raise ApiError(status_code=_response.status_code, body=_response.text)
1188
- raise ApiError(status_code=_response.status_code, body=_response_json)
1202
+ return self._raw_client
1189
1203
 
1190
- async def update_dataset(
1204
+ async def apply_dataset_item_changes(
1191
1205
  self,
1192
1206
  id: str,
1193
1207
  *,
1194
- name: str,
1195
- description: typing.Optional[str] = OMIT,
1208
+ request: DatasetItemChangesPublic,
1209
+ override: typing.Optional[bool] = None,
1196
1210
  request_options: typing.Optional[RequestOptions] = None,
1197
- ) -> None:
1211
+ ) -> DatasetVersionPublic:
1198
1212
  """
1199
- Update dataset by id
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.
1200
1221
 
1201
1222
  Parameters
1202
1223
  ----------
1203
1224
  id : str
1204
1225
 
1205
- name : str
1226
+ request : DatasetItemChangesPublic
1206
1227
 
1207
- description : typing.Optional[str]
1228
+ override : typing.Optional[bool]
1208
1229
 
1209
1230
  request_options : typing.Optional[RequestOptions]
1210
1231
  Request-specific configuration.
1211
1232
 
1212
1233
  Returns
1213
1234
  -------
1214
- None
1235
+ DatasetVersionPublic
1236
+ Version created successfully
1215
1237
 
1216
1238
  Examples
1217
1239
  --------
1218
- import asyncio
1219
-
1220
1240
  from Opik import AsyncOpikApi
1221
-
1222
- client = AsyncOpikApi(
1223
- api_key="YOUR_API_KEY",
1224
- workspace_name="YOUR_WORKSPACE_NAME",
1225
- )
1226
-
1227
-
1241
+ import asyncio
1242
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1228
1243
  async def main() -> None:
1229
- await client.datasets.update_dataset(
1230
- id="id",
1231
- name="name",
1232
- )
1233
-
1234
-
1244
+ await client.datasets.apply_dataset_item_changes(id='id', request={'key': 'value'
1245
+ }, )
1235
1246
  asyncio.run(main())
1236
1247
  """
1237
- _response = await self._client_wrapper.httpx_client.request(
1238
- f"v1/private/datasets/{jsonable_encoder(id)}",
1239
- method="PUT",
1240
- json={
1241
- "name": name,
1242
- "description": description,
1243
- },
1244
- headers={
1245
- "content-type": "application/json",
1246
- },
1247
- request_options=request_options,
1248
- omit=OMIT,
1248
+ _response = await self._raw_client.apply_dataset_item_changes(
1249
+ id, request=request, override=override, request_options=request_options
1249
1250
  )
1250
- try:
1251
- if 200 <= _response.status_code < 300:
1252
- return
1253
- _response_json = _response.json()
1254
- except JSONDecodeError:
1255
- raise ApiError(status_code=_response.status_code, body=_response.text)
1256
- raise ApiError(status_code=_response.status_code, body=_response_json)
1257
-
1258
- async def delete_dataset(
1259
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
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,
1260
1262
  ) -> None:
1261
1263
  """
1262
- Delete dataset by id
1264
+ Update multiple dataset items
1263
1265
 
1264
1266
  Parameters
1265
1267
  ----------
1266
- id : str
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.
1267
1280
 
1268
1281
  request_options : typing.Optional[RequestOptions]
1269
1282
  Request-specific configuration.
@@ -1274,169 +1287,768 @@ class AsyncDatasetsClient:
1274
1287
 
1275
1288
  Examples
1276
1289
  --------
1277
- import asyncio
1278
-
1279
1290
  from Opik import AsyncOpikApi
1280
-
1281
- client = AsyncOpikApi(
1282
- api_key="YOUR_API_KEY",
1283
- workspace_name="YOUR_WORKSPACE_NAME",
1284
- )
1285
-
1286
-
1291
+ from Opik import DatasetItemUpdate
1292
+ import asyncio
1293
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1287
1294
  async def main() -> None:
1288
- await client.datasets.delete_dataset(
1289
- id="id",
1290
- )
1291
-
1292
-
1295
+ await client.datasets.batch_update_dataset_items(update=DatasetItemUpdate(), )
1293
1296
  asyncio.run(main())
1294
1297
  """
1295
- _response = await self._client_wrapper.httpx_client.request(
1296
- f"v1/private/datasets/{jsonable_encoder(id)}",
1297
- method="DELETE",
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,
1298
1304
  request_options=request_options,
1299
1305
  )
1300
- try:
1301
- if 200 <= _response.status_code < 300:
1302
- return
1303
- _response_json = _response.json()
1304
- except JSONDecodeError:
1305
- raise ApiError(status_code=_response.status_code, body=_response.text)
1306
- raise ApiError(status_code=_response.status_code, body=_response_json)
1306
+ return _response.data
1307
1307
 
1308
- async def delete_dataset_by_name(
1308
+ async def find_datasets(
1309
1309
  self,
1310
1310
  *,
1311
- dataset_name: str,
1311
+ page: typing.Optional[int] = None,
1312
+ size: typing.Optional[int] = None,
1313
+ with_experiments_only: typing.Optional[bool] = None,
1314
+ with_optimizations_only: typing.Optional[bool] = None,
1315
+ prompt_id: typing.Optional[str] = None,
1316
+ name: typing.Optional[str] = None,
1317
+ sorting: typing.Optional[str] = None,
1318
+ filters: typing.Optional[str] = None,
1319
+ request_options: typing.Optional[RequestOptions] = None,
1320
+ ) -> DatasetPagePublic:
1321
+ """
1322
+ Find datasets
1323
+
1324
+ Parameters
1325
+ ----------
1326
+ page : typing.Optional[int]
1327
+
1328
+ size : typing.Optional[int]
1329
+
1330
+ with_experiments_only : typing.Optional[bool]
1331
+
1332
+ with_optimizations_only : typing.Optional[bool]
1333
+
1334
+ prompt_id : typing.Optional[str]
1335
+
1336
+ name : typing.Optional[str]
1337
+
1338
+ sorting : typing.Optional[str]
1339
+
1340
+ filters : typing.Optional[str]
1341
+
1342
+ request_options : typing.Optional[RequestOptions]
1343
+ Request-specific configuration.
1344
+
1345
+ Returns
1346
+ -------
1347
+ DatasetPagePublic
1348
+ Dataset resource
1349
+
1350
+ Examples
1351
+ --------
1352
+ from Opik import AsyncOpikApi
1353
+ import asyncio
1354
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1355
+ async def main() -> None:
1356
+ await client.datasets.find_datasets()
1357
+ asyncio.run(main())
1358
+ """
1359
+ _response = await self._raw_client.find_datasets(
1360
+ page=page,
1361
+ size=size,
1362
+ with_experiments_only=with_experiments_only,
1363
+ with_optimizations_only=with_optimizations_only,
1364
+ prompt_id=prompt_id,
1365
+ name=name,
1366
+ sorting=sorting,
1367
+ filters=filters,
1368
+ request_options=request_options,
1369
+ )
1370
+ return _response.data
1371
+
1372
+ async def create_dataset(
1373
+ self,
1374
+ *,
1375
+ name: str,
1376
+ id: typing.Optional[str] = OMIT,
1377
+ visibility: typing.Optional[DatasetWriteVisibility] = OMIT,
1378
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
1379
+ description: typing.Optional[str] = OMIT,
1380
+ request_options: typing.Optional[RequestOptions] = None,
1381
+ ) -> None:
1382
+ """
1383
+ Create dataset
1384
+
1385
+ Parameters
1386
+ ----------
1387
+ name : str
1388
+
1389
+ id : typing.Optional[str]
1390
+
1391
+ visibility : typing.Optional[DatasetWriteVisibility]
1392
+
1393
+ tags : typing.Optional[typing.Sequence[str]]
1394
+
1395
+ description : typing.Optional[str]
1396
+
1397
+ request_options : typing.Optional[RequestOptions]
1398
+ Request-specific configuration.
1399
+
1400
+ Returns
1401
+ -------
1402
+ None
1403
+
1404
+ Examples
1405
+ --------
1406
+ from Opik import AsyncOpikApi
1407
+ import asyncio
1408
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1409
+ async def main() -> None:
1410
+ await client.datasets.create_dataset(name='name', )
1411
+ asyncio.run(main())
1412
+ """
1413
+ _response = await self._raw_client.create_dataset(
1414
+ name=name, id=id, visibility=visibility, tags=tags, description=description, request_options=request_options
1415
+ )
1416
+ return _response.data
1417
+
1418
+ async def create_or_update_dataset_items(
1419
+ self,
1420
+ *,
1421
+ items: typing.Sequence[DatasetItemWrite],
1422
+ dataset_name: typing.Optional[str] = OMIT,
1423
+ dataset_id: typing.Optional[str] = OMIT,
1424
+ request_options: typing.Optional[RequestOptions] = None,
1425
+ ) -> None:
1426
+ """
1427
+ Create/update dataset items based on dataset item id
1428
+
1429
+ Parameters
1430
+ ----------
1431
+ items : typing.Sequence[DatasetItemWrite]
1432
+
1433
+ dataset_name : typing.Optional[str]
1434
+ If null, dataset_id must be provided
1435
+
1436
+ dataset_id : typing.Optional[str]
1437
+ If null, dataset_name must be provided
1438
+
1439
+ request_options : typing.Optional[RequestOptions]
1440
+ Request-specific configuration.
1441
+
1442
+ Returns
1443
+ -------
1444
+ None
1445
+
1446
+ Examples
1447
+ --------
1448
+ from Opik import AsyncOpikApi
1449
+ from Opik import DatasetItemWrite
1450
+ import asyncio
1451
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1452
+ async def main() -> None:
1453
+ await client.datasets.create_or_update_dataset_items(items=[DatasetItemWrite(source="manual", data={'key': 'value'
1454
+ }, )], )
1455
+ asyncio.run(main())
1456
+ """
1457
+ _response = await self._raw_client.create_or_update_dataset_items(
1458
+ items=items, dataset_name=dataset_name, dataset_id=dataset_id, request_options=request_options
1459
+ )
1460
+ return _response.data
1461
+
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:
1469
+ """
1470
+ Create dataset items from uploaded CSV file. CSV should have headers in the first row. Processing happens asynchronously in batches.
1471
+
1472
+ Parameters
1473
+ ----------
1474
+ file : typing.Dict[str, typing.Optional[typing.Any]]
1475
+
1476
+ dataset_id : str
1477
+
1478
+ request_options : typing.Optional[RequestOptions]
1479
+ Request-specific configuration.
1480
+
1481
+ Returns
1482
+ -------
1483
+ None
1484
+
1485
+ Examples
1486
+ --------
1487
+ from Opik import AsyncOpikApi
1488
+ import asyncio
1489
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1490
+ async def main() -> None:
1491
+ await client.datasets.create_dataset_items_from_csv(file={'key': 'value'
1492
+ }, dataset_id='dataset_id', )
1493
+ asyncio.run(main())
1494
+ """
1495
+ _response = await self._raw_client.create_dataset_items_from_csv(
1496
+ file=file, dataset_id=dataset_id, request_options=request_options
1497
+ )
1498
+ return _response.data
1499
+
1500
+ async def create_dataset_items_from_spans(
1501
+ self,
1502
+ dataset_id: str,
1503
+ *,
1504
+ span_ids: typing.Sequence[str],
1505
+ enrichment_options: SpanEnrichmentOptions,
1506
+ request_options: typing.Optional[RequestOptions] = None,
1507
+ ) -> None:
1508
+ """
1509
+ Create dataset items from spans with enriched metadata
1510
+
1511
+ Parameters
1512
+ ----------
1513
+ dataset_id : str
1514
+
1515
+ span_ids : typing.Sequence[str]
1516
+ Set of span IDs to add to the dataset
1517
+
1518
+ enrichment_options : SpanEnrichmentOptions
1519
+
1520
+ request_options : typing.Optional[RequestOptions]
1521
+ Request-specific configuration.
1522
+
1523
+ Returns
1524
+ -------
1525
+ None
1526
+
1527
+ Examples
1528
+ --------
1529
+ from Opik import AsyncOpikApi
1530
+ from Opik import SpanEnrichmentOptions
1531
+ import asyncio
1532
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1533
+ async def main() -> None:
1534
+ await client.datasets.create_dataset_items_from_spans(dataset_id='dataset_id', span_ids=['span_ids'], enrichment_options=SpanEnrichmentOptions(), )
1535
+ asyncio.run(main())
1536
+ """
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
1539
+ )
1540
+ return _response.data
1541
+
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:
1661
+ """
1662
+ Delete dataset by id
1663
+
1664
+ Parameters
1665
+ ----------
1666
+ id : str
1667
+
1668
+ request_options : typing.Optional[RequestOptions]
1669
+ Request-specific configuration.
1670
+
1671
+ Returns
1672
+ -------
1673
+ None
1674
+
1675
+ Examples
1676
+ --------
1677
+ from Opik import AsyncOpikApi
1678
+ import asyncio
1679
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1680
+ async def main() -> None:
1681
+ await client.datasets.delete_dataset(id='id', )
1682
+ asyncio.run(main())
1683
+ """
1684
+ _response = await self._raw_client.delete_dataset(id, request_options=request_options)
1685
+ return _response.data
1686
+
1687
+ async def delete_dataset_by_name(
1688
+ self, *, dataset_name: str, request_options: typing.Optional[RequestOptions] = None
1689
+ ) -> None:
1690
+ """
1691
+ Delete dataset by name
1692
+
1693
+ Parameters
1694
+ ----------
1695
+ dataset_name : str
1696
+
1697
+ request_options : typing.Optional[RequestOptions]
1698
+ Request-specific configuration.
1699
+
1700
+ Returns
1701
+ -------
1702
+ None
1703
+
1704
+ Examples
1705
+ --------
1706
+ from Opik import AsyncOpikApi
1707
+ import asyncio
1708
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1709
+ async def main() -> None:
1710
+ await client.datasets.delete_dataset_by_name(dataset_name='dataset_name', )
1711
+ asyncio.run(main())
1712
+ """
1713
+ _response = await self._raw_client.delete_dataset_by_name(
1714
+ dataset_name=dataset_name, request_options=request_options
1715
+ )
1716
+ return _response.data
1717
+
1718
+ async def delete_dataset_items(
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,
1725
+ ) -> None:
1726
+ """
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.
1732
+
1733
+ Parameters
1734
+ ----------
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'.
1743
+
1744
+ request_options : typing.Optional[RequestOptions]
1745
+ Request-specific configuration.
1746
+
1747
+ Returns
1748
+ -------
1749
+ None
1750
+
1751
+ Examples
1752
+ --------
1753
+ from Opik import AsyncOpikApi
1754
+ import asyncio
1755
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1756
+ async def main() -> None:
1757
+ await client.datasets.delete_dataset_items()
1758
+ asyncio.run(main())
1759
+ """
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
+ )
1763
+ return _response.data
1764
+
1765
+ async def delete_datasets_batch(
1766
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
1767
+ ) -> None:
1768
+ """
1769
+ Delete datasets batch
1770
+
1771
+ Parameters
1772
+ ----------
1773
+ ids : typing.Sequence[str]
1774
+
1775
+ request_options : typing.Optional[RequestOptions]
1776
+ Request-specific configuration.
1777
+
1778
+ Returns
1779
+ -------
1780
+ None
1781
+
1782
+ Examples
1783
+ --------
1784
+ from Opik import AsyncOpikApi
1785
+ import asyncio
1786
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1787
+ async def main() -> None:
1788
+ await client.datasets.delete_datasets_batch(ids=['ids'], )
1789
+ asyncio.run(main())
1790
+ """
1791
+ _response = await self._raw_client.delete_datasets_batch(ids=ids, request_options=request_options)
1792
+ return _response.data
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
+
1855
+ async def find_dataset_items_with_experiment_items(
1856
+ self,
1857
+ id: str,
1858
+ *,
1859
+ experiment_ids: str,
1860
+ page: typing.Optional[int] = None,
1861
+ size: typing.Optional[int] = None,
1862
+ filters: typing.Optional[str] = None,
1863
+ sorting: typing.Optional[str] = None,
1864
+ search: typing.Optional[str] = None,
1865
+ truncate: typing.Optional[bool] = None,
1866
+ request_options: typing.Optional[RequestOptions] = None,
1867
+ ) -> DatasetItemPageCompare:
1868
+ """
1869
+ Find dataset items with experiment items
1870
+
1871
+ Parameters
1872
+ ----------
1873
+ id : str
1874
+
1875
+ experiment_ids : str
1876
+
1877
+ page : typing.Optional[int]
1878
+
1879
+ size : typing.Optional[int]
1880
+
1881
+ filters : typing.Optional[str]
1882
+
1883
+ sorting : typing.Optional[str]
1884
+
1885
+ search : typing.Optional[str]
1886
+
1887
+ truncate : typing.Optional[bool]
1888
+
1889
+ request_options : typing.Optional[RequestOptions]
1890
+ Request-specific configuration.
1891
+
1892
+ Returns
1893
+ -------
1894
+ DatasetItemPageCompare
1895
+ Dataset item resource
1896
+
1897
+ Examples
1898
+ --------
1899
+ from Opik import AsyncOpikApi
1900
+ import asyncio
1901
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1902
+ async def main() -> None:
1903
+ await client.datasets.find_dataset_items_with_experiment_items(id='id', experiment_ids='experiment_ids', )
1904
+ asyncio.run(main())
1905
+ """
1906
+ _response = await self._raw_client.find_dataset_items_with_experiment_items(
1907
+ id,
1908
+ experiment_ids=experiment_ids,
1909
+ page=page,
1910
+ size=size,
1911
+ filters=filters,
1912
+ sorting=sorting,
1913
+ search=search,
1914
+ truncate=truncate,
1915
+ request_options=request_options,
1916
+ )
1917
+ return _response.data
1918
+
1919
+ async def get_dataset_by_identifier(
1920
+ self, *, dataset_name: str, request_options: typing.Optional[RequestOptions] = None
1921
+ ) -> DatasetPublic:
1922
+ """
1923
+ Get dataset by name
1924
+
1925
+ Parameters
1926
+ ----------
1927
+ dataset_name : str
1928
+
1929
+ request_options : typing.Optional[RequestOptions]
1930
+ Request-specific configuration.
1931
+
1932
+ Returns
1933
+ -------
1934
+ DatasetPublic
1935
+ Dataset resource
1936
+
1937
+ Examples
1938
+ --------
1939
+ from Opik import AsyncOpikApi
1940
+ import asyncio
1941
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1942
+ async def main() -> None:
1943
+ await client.datasets.get_dataset_by_identifier(dataset_name='dataset_name', )
1944
+ asyncio.run(main())
1945
+ """
1946
+ _response = await self._raw_client.get_dataset_by_identifier(
1947
+ dataset_name=dataset_name, request_options=request_options
1948
+ )
1949
+ return _response.data
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,
1312
1957
  request_options: typing.Optional[RequestOptions] = None,
1313
- ) -> None:
1958
+ ) -> ProjectStatsPublic:
1314
1959
  """
1315
- Delete dataset by name
1960
+ Get experiment items stats for dataset
1316
1961
 
1317
1962
  Parameters
1318
1963
  ----------
1319
- dataset_name : str
1964
+ id : str
1965
+
1966
+ experiment_ids : str
1967
+
1968
+ filters : typing.Optional[str]
1320
1969
 
1321
1970
  request_options : typing.Optional[RequestOptions]
1322
1971
  Request-specific configuration.
1323
1972
 
1324
1973
  Returns
1325
1974
  -------
1326
- None
1975
+ ProjectStatsPublic
1976
+ Experiment items stats resource
1327
1977
 
1328
1978
  Examples
1329
1979
  --------
1330
- import asyncio
1331
-
1332
1980
  from Opik import AsyncOpikApi
1333
-
1334
- client = AsyncOpikApi(
1335
- api_key="YOUR_API_KEY",
1336
- workspace_name="YOUR_WORKSPACE_NAME",
1337
- )
1338
-
1339
-
1981
+ import asyncio
1982
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1340
1983
  async def main() -> None:
1341
- await client.datasets.delete_dataset_by_name(
1342
- dataset_name="dataset_name",
1343
- )
1344
-
1345
-
1984
+ await client.datasets.get_dataset_experiment_items_stats(id='id', experiment_ids='experiment_ids', )
1346
1985
  asyncio.run(main())
1347
1986
  """
1348
- _response = await self._client_wrapper.httpx_client.request(
1349
- "v1/private/datasets/delete",
1350
- method="POST",
1351
- json={
1352
- "dataset_name": dataset_name,
1353
- },
1354
- headers={
1355
- "content-type": "application/json",
1356
- },
1357
- request_options=request_options,
1358
- omit=OMIT,
1987
+ _response = await self._raw_client.get_dataset_experiment_items_stats(
1988
+ id, experiment_ids=experiment_ids, filters=filters, request_options=request_options
1359
1989
  )
1360
- try:
1361
- if 200 <= _response.status_code < 300:
1362
- return
1363
- _response_json = _response.json()
1364
- except JSONDecodeError:
1365
- raise ApiError(status_code=_response.status_code, body=_response.text)
1366
- raise ApiError(status_code=_response.status_code, body=_response_json)
1990
+ return _response.data
1367
1991
 
1368
- async def delete_dataset_items(
1369
- self,
1370
- *,
1371
- item_ids: typing.Sequence[str],
1372
- request_options: typing.Optional[RequestOptions] = None,
1373
- ) -> None:
1992
+ async def get_dataset_item_by_id(
1993
+ self, item_id: str, *, request_options: typing.Optional[RequestOptions] = None
1994
+ ) -> DatasetItemPublic:
1374
1995
  """
1375
- Delete dataset items
1996
+ Get dataset item by id
1376
1997
 
1377
1998
  Parameters
1378
1999
  ----------
1379
- item_ids : typing.Sequence[str]
2000
+ item_id : str
1380
2001
 
1381
2002
  request_options : typing.Optional[RequestOptions]
1382
2003
  Request-specific configuration.
1383
2004
 
1384
2005
  Returns
1385
2006
  -------
1386
- None
2007
+ DatasetItemPublic
2008
+ Dataset item resource
1387
2009
 
1388
2010
  Examples
1389
2011
  --------
1390
- import asyncio
1391
-
1392
2012
  from Opik import AsyncOpikApi
1393
-
1394
- client = AsyncOpikApi(
1395
- api_key="YOUR_API_KEY",
1396
- workspace_name="YOUR_WORKSPACE_NAME",
1397
- )
1398
-
1399
-
2013
+ import asyncio
2014
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1400
2015
  async def main() -> None:
1401
- await client.datasets.delete_dataset_items(
1402
- item_ids=["item_ids"],
1403
- )
1404
-
1405
-
2016
+ await client.datasets.get_dataset_item_by_id(item_id='itemId', )
1406
2017
  asyncio.run(main())
1407
2018
  """
1408
- _response = await self._client_wrapper.httpx_client.request(
1409
- "v1/private/datasets/items/delete",
1410
- method="POST",
1411
- json={
1412
- "item_ids": item_ids,
1413
- },
1414
- headers={
1415
- "content-type": "application/json",
1416
- },
1417
- request_options=request_options,
1418
- omit=OMIT,
1419
- )
1420
- try:
1421
- if 200 <= _response.status_code < 300:
1422
- return
1423
- _response_json = _response.json()
1424
- except JSONDecodeError:
1425
- raise ApiError(status_code=_response.status_code, body=_response.text)
1426
- raise ApiError(status_code=_response.status_code, body=_response_json)
2019
+ _response = await self._raw_client.get_dataset_item_by_id(item_id, request_options=request_options)
2020
+ return _response.data
1427
2021
 
1428
- async def delete_datasets_batch(
2022
+ async def patch_dataset_item(
1429
2023
  self,
2024
+ item_id: str,
1430
2025
  *,
1431
- ids: typing.Sequence[str],
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,
1432
2032
  request_options: typing.Optional[RequestOptions] = None,
1433
2033
  ) -> None:
1434
2034
  """
1435
- Delete datasets batch
2035
+ Partially update dataset item by id. Only provided fields will be updated.
1436
2036
 
1437
2037
  Parameters
1438
2038
  ----------
1439
- ids : typing.Sequence[str]
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]]
1440
2052
 
1441
2053
  request_options : typing.Optional[RequestOptions]
1442
2054
  Request-specific configuration.
@@ -1447,65 +2059,50 @@ class AsyncDatasetsClient:
1447
2059
 
1448
2060
  Examples
1449
2061
  --------
1450
- import asyncio
1451
-
1452
2062
  from Opik import AsyncOpikApi
1453
-
1454
- client = AsyncOpikApi(
1455
- api_key="YOUR_API_KEY",
1456
- workspace_name="YOUR_WORKSPACE_NAME",
1457
- )
1458
-
1459
-
2063
+ import asyncio
2064
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1460
2065
  async def main() -> None:
1461
- await client.datasets.delete_datasets_batch(
1462
- ids=["ids"],
1463
- )
1464
-
1465
-
2066
+ await client.datasets.patch_dataset_item(item_id='itemId', source="manual", data={'key': 'value'
2067
+ }, )
1466
2068
  asyncio.run(main())
1467
2069
  """
1468
- _response = await self._client_wrapper.httpx_client.request(
1469
- "v1/private/datasets/delete-batch",
1470
- method="POST",
1471
- json={
1472
- "ids": ids,
1473
- },
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,
1474
2078
  request_options=request_options,
1475
- omit=OMIT,
1476
2079
  )
1477
- try:
1478
- if 200 <= _response.status_code < 300:
1479
- return
1480
- _response_json = _response.json()
1481
- except JSONDecodeError:
1482
- raise ApiError(status_code=_response.status_code, body=_response.text)
1483
- raise ApiError(status_code=_response.status_code, body=_response_json)
2080
+ return _response.data
1484
2081
 
1485
- async def find_dataset_items_with_experiment_items(
2082
+ async def get_dataset_items(
1486
2083
  self,
1487
2084
  id: str,
1488
2085
  *,
1489
- experiment_ids: str,
1490
2086
  page: typing.Optional[int] = None,
1491
2087
  size: typing.Optional[int] = None,
2088
+ version: typing.Optional[str] = None,
1492
2089
  filters: typing.Optional[str] = None,
1493
2090
  truncate: typing.Optional[bool] = None,
1494
2091
  request_options: typing.Optional[RequestOptions] = None,
1495
- ) -> DatasetItemPageCompare:
2092
+ ) -> DatasetItemPagePublic:
1496
2093
  """
1497
- Find dataset items with experiment items
2094
+ Get dataset items
1498
2095
 
1499
2096
  Parameters
1500
2097
  ----------
1501
2098
  id : str
1502
2099
 
1503
- experiment_ids : str
1504
-
1505
2100
  page : typing.Optional[int]
1506
2101
 
1507
2102
  size : typing.Optional[int]
1508
2103
 
2104
+ version : typing.Optional[str]
2105
+
1509
2106
  filters : typing.Optional[str]
1510
2107
 
1511
2108
  truncate : typing.Optional[bool]
@@ -1515,191 +2112,211 @@ class AsyncDatasetsClient:
1515
2112
 
1516
2113
  Returns
1517
2114
  -------
1518
- DatasetItemPageCompare
1519
- Dataset item resource
2115
+ DatasetItemPagePublic
2116
+ Dataset items resource
1520
2117
 
1521
2118
  Examples
1522
2119
  --------
2120
+ from Opik import AsyncOpikApi
1523
2121
  import asyncio
2122
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2123
+ async def main() -> None:
2124
+ await client.datasets.get_dataset_items(id='id', )
2125
+ asyncio.run(main())
2126
+ """
2127
+ _response = await self._raw_client.get_dataset_items(
2128
+ id,
2129
+ page=page,
2130
+ size=size,
2131
+ version=version,
2132
+ filters=filters,
2133
+ truncate=truncate,
2134
+ request_options=request_options,
2135
+ )
2136
+ return _response.data
1524
2137
 
1525
- from Opik import AsyncOpikApi
2138
+ async def get_dataset_items_output_columns(
2139
+ self,
2140
+ id: str,
2141
+ *,
2142
+ experiment_ids: typing.Optional[str] = None,
2143
+ request_options: typing.Optional[RequestOptions] = None,
2144
+ ) -> PageColumns:
2145
+ """
2146
+ Get dataset items output columns
1526
2147
 
1527
- client = AsyncOpikApi(
1528
- api_key="YOUR_API_KEY",
1529
- workspace_name="YOUR_WORKSPACE_NAME",
1530
- )
2148
+ Parameters
2149
+ ----------
2150
+ id : str
1531
2151
 
2152
+ experiment_ids : typing.Optional[str]
1532
2153
 
1533
- async def main() -> None:
1534
- await client.datasets.find_dataset_items_with_experiment_items(
1535
- id="id",
1536
- experiment_ids="experiment_ids",
1537
- )
2154
+ request_options : typing.Optional[RequestOptions]
2155
+ Request-specific configuration.
1538
2156
 
2157
+ Returns
2158
+ -------
2159
+ PageColumns
2160
+ Dataset item output columns
1539
2161
 
2162
+ Examples
2163
+ --------
2164
+ from Opik import AsyncOpikApi
2165
+ import asyncio
2166
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
2167
+ async def main() -> None:
2168
+ await client.datasets.get_dataset_items_output_columns(id='id', )
1540
2169
  asyncio.run(main())
1541
2170
  """
1542
- _response = await self._client_wrapper.httpx_client.request(
1543
- f"v1/private/datasets/{jsonable_encoder(id)}/items/experiments/items",
1544
- method="GET",
1545
- params={
1546
- "page": page,
1547
- "size": size,
1548
- "experiment_ids": experiment_ids,
1549
- "filters": filters,
1550
- "truncate": truncate,
1551
- },
1552
- request_options=request_options,
2171
+ _response = await self._raw_client.get_dataset_items_output_columns(
2172
+ id, experiment_ids=experiment_ids, request_options=request_options
1553
2173
  )
1554
- try:
1555
- if 200 <= _response.status_code < 300:
1556
- return typing.cast(
1557
- DatasetItemPageCompare,
1558
- parse_obj_as(
1559
- type_=DatasetItemPageCompare, # type: ignore
1560
- object_=_response.json(),
1561
- ),
1562
- )
1563
- _response_json = _response.json()
1564
- except JSONDecodeError:
1565
- raise ApiError(status_code=_response.status_code, body=_response.text)
1566
- raise ApiError(status_code=_response.status_code, body=_response_json)
2174
+ return _response.data
1567
2175
 
1568
- async def get_dataset_by_identifier(
2176
+ async def stream_dataset_items(
1569
2177
  self,
1570
2178
  *,
1571
2179
  dataset_name: str,
2180
+ last_retrieved_id: typing.Optional[str] = OMIT,
2181
+ steam_limit: typing.Optional[int] = OMIT,
1572
2182
  request_options: typing.Optional[RequestOptions] = None,
1573
- ) -> DatasetPublic:
2183
+ ) -> typing.AsyncIterator[bytes]:
1574
2184
  """
1575
- Get dataset by name
2185
+ Stream dataset items
1576
2186
 
1577
2187
  Parameters
1578
2188
  ----------
1579
2189
  dataset_name : str
1580
2190
 
2191
+ last_retrieved_id : typing.Optional[str]
2192
+
2193
+ steam_limit : typing.Optional[int]
2194
+
2195
+ request_options : typing.Optional[RequestOptions]
2196
+ Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
2197
+
2198
+ Returns
2199
+ -------
2200
+ typing.AsyncIterator[bytes]
2201
+ Dataset items stream or error during process
2202
+ """
2203
+ async with self._raw_client.stream_dataset_items(
2204
+ dataset_name=dataset_name,
2205
+ last_retrieved_id=last_retrieved_id,
2206
+ steam_limit=steam_limit,
2207
+ request_options=request_options,
2208
+ ) as r:
2209
+ async for data in r.data:
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
+
1581
2222
  request_options : typing.Optional[RequestOptions]
1582
2223
  Request-specific configuration.
1583
2224
 
1584
2225
  Returns
1585
2226
  -------
1586
- DatasetPublic
1587
- Dataset resource
2227
+ DatasetVersionDiff
2228
+ Diff computed successfully
1588
2229
 
1589
2230
  Examples
1590
2231
  --------
2232
+ from Opik import AsyncOpikApi
1591
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
1592
2241
 
1593
- from Opik import AsyncOpikApi
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')
1594
2247
 
1595
- client = AsyncOpikApi(
1596
- api_key="YOUR_API_KEY",
1597
- workspace_name="YOUR_WORKSPACE_NAME",
1598
- )
2248
+ Parameters
2249
+ ----------
2250
+ version_hash : str
1599
2251
 
2252
+ id : str
1600
2253
 
1601
- async def main() -> None:
1602
- await client.datasets.get_dataset_by_identifier(
1603
- dataset_name="dataset_name",
1604
- )
2254
+ tag : str
1605
2255
 
2256
+ request_options : typing.Optional[RequestOptions]
2257
+ Request-specific configuration.
2258
+
2259
+ Returns
2260
+ -------
2261
+ None
1606
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', )
1607
2270
  asyncio.run(main())
1608
2271
  """
1609
- _response = await self._client_wrapper.httpx_client.request(
1610
- "v1/private/datasets/retrieve",
1611
- method="POST",
1612
- json={
1613
- "dataset_name": dataset_name,
1614
- },
1615
- headers={
1616
- "content-type": "application/json",
1617
- },
1618
- request_options=request_options,
1619
- omit=OMIT,
2272
+ _response = await self._raw_client.create_version_tag(
2273
+ version_hash, id, tag=tag, request_options=request_options
1620
2274
  )
1621
- try:
1622
- if 200 <= _response.status_code < 300:
1623
- return typing.cast(
1624
- DatasetPublic,
1625
- parse_obj_as(
1626
- type_=DatasetPublic, # type: ignore
1627
- object_=_response.json(),
1628
- ),
1629
- )
1630
- _response_json = _response.json()
1631
- except JSONDecodeError:
1632
- raise ApiError(status_code=_response.status_code, body=_response.text)
1633
- raise ApiError(status_code=_response.status_code, body=_response_json)
2275
+ return _response.data
1634
2276
 
1635
- async def get_dataset_item_by_id(
1636
- self, item_id: str, *, request_options: typing.Optional[RequestOptions] = None
1637
- ) -> DatasetItemPublic:
2277
+ async def delete_version_tag(
2278
+ self, version_hash: str, tag: str, id: str, *, request_options: typing.Optional[RequestOptions] = None
2279
+ ) -> None:
1638
2280
  """
1639
- Get dataset item by id
2281
+ Remove a tag from a dataset version. The version itself is not deleted, only the tag reference.
1640
2282
 
1641
2283
  Parameters
1642
2284
  ----------
1643
- item_id : str
2285
+ version_hash : str
2286
+
2287
+ tag : str
2288
+
2289
+ id : str
1644
2290
 
1645
2291
  request_options : typing.Optional[RequestOptions]
1646
2292
  Request-specific configuration.
1647
2293
 
1648
2294
  Returns
1649
2295
  -------
1650
- DatasetItemPublic
1651
- Dataset item resource
2296
+ None
1652
2297
 
1653
2298
  Examples
1654
2299
  --------
1655
- import asyncio
1656
-
1657
2300
  from Opik import AsyncOpikApi
1658
-
1659
- client = AsyncOpikApi(
1660
- api_key="YOUR_API_KEY",
1661
- workspace_name="YOUR_WORKSPACE_NAME",
1662
- )
1663
-
1664
-
2301
+ import asyncio
2302
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1665
2303
  async def main() -> None:
1666
- await client.datasets.get_dataset_item_by_id(
1667
- item_id="itemId",
1668
- )
1669
-
1670
-
2304
+ await client.datasets.delete_version_tag(version_hash='versionHash', tag='tag', id='id', )
1671
2305
  asyncio.run(main())
1672
2306
  """
1673
- _response = await self._client_wrapper.httpx_client.request(
1674
- f"v1/private/datasets/items/{jsonable_encoder(item_id)}",
1675
- method="GET",
1676
- request_options=request_options,
1677
- )
1678
- try:
1679
- if 200 <= _response.status_code < 300:
1680
- return typing.cast(
1681
- DatasetItemPublic,
1682
- parse_obj_as(
1683
- type_=DatasetItemPublic, # type: ignore
1684
- object_=_response.json(),
1685
- ),
1686
- )
1687
- _response_json = _response.json()
1688
- except JSONDecodeError:
1689
- raise ApiError(status_code=_response.status_code, body=_response.text)
1690
- raise ApiError(status_code=_response.status_code, body=_response_json)
2307
+ _response = await self._raw_client.delete_version_tag(version_hash, tag, id, request_options=request_options)
2308
+ return _response.data
1691
2309
 
1692
- async def get_dataset_items(
2310
+ async def list_dataset_versions(
1693
2311
  self,
1694
2312
  id: str,
1695
2313
  *,
1696
2314
  page: typing.Optional[int] = None,
1697
2315
  size: typing.Optional[int] = None,
1698
- truncate: typing.Optional[bool] = None,
1699
2316
  request_options: typing.Optional[RequestOptions] = None,
1700
- ) -> DatasetItemPagePublic:
2317
+ ) -> DatasetVersionPagePublic:
1701
2318
  """
1702
- Get dataset items
2319
+ Get paginated list of versions for a dataset, ordered by creation time (newest first)
1703
2320
 
1704
2321
  Parameters
1705
2322
  ----------
@@ -1709,179 +2326,109 @@ class AsyncDatasetsClient:
1709
2326
 
1710
2327
  size : typing.Optional[int]
1711
2328
 
1712
- truncate : typing.Optional[bool]
1713
-
1714
2329
  request_options : typing.Optional[RequestOptions]
1715
2330
  Request-specific configuration.
1716
2331
 
1717
2332
  Returns
1718
2333
  -------
1719
- DatasetItemPagePublic
1720
- Dataset items resource
2334
+ DatasetVersionPagePublic
2335
+ Dataset versions
1721
2336
 
1722
2337
  Examples
1723
2338
  --------
1724
- import asyncio
1725
-
1726
2339
  from Opik import AsyncOpikApi
1727
-
1728
- client = AsyncOpikApi(
1729
- api_key="YOUR_API_KEY",
1730
- workspace_name="YOUR_WORKSPACE_NAME",
1731
- )
1732
-
1733
-
2340
+ import asyncio
2341
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1734
2342
  async def main() -> None:
1735
- await client.datasets.get_dataset_items(
1736
- id="id",
1737
- )
1738
-
1739
-
2343
+ await client.datasets.list_dataset_versions(id='id', )
1740
2344
  asyncio.run(main())
1741
2345
  """
1742
- _response = await self._client_wrapper.httpx_client.request(
1743
- f"v1/private/datasets/{jsonable_encoder(id)}/items",
1744
- method="GET",
1745
- params={
1746
- "page": page,
1747
- "size": size,
1748
- "truncate": truncate,
1749
- },
1750
- request_options=request_options,
2346
+ _response = await self._raw_client.list_dataset_versions(
2347
+ id, page=page, size=size, request_options=request_options
1751
2348
  )
1752
- try:
1753
- if 200 <= _response.status_code < 300:
1754
- return typing.cast(
1755
- DatasetItemPagePublic,
1756
- parse_obj_as(
1757
- type_=DatasetItemPagePublic, # type: ignore
1758
- object_=_response.json(),
1759
- ),
1760
- )
1761
- _response_json = _response.json()
1762
- except JSONDecodeError:
1763
- raise ApiError(status_code=_response.status_code, body=_response.text)
1764
- raise ApiError(status_code=_response.status_code, body=_response_json)
2349
+ return _response.data
1765
2350
 
1766
- async def get_dataset_items_output_columns(
1767
- self,
1768
- id: str,
1769
- *,
1770
- experiment_ids: typing.Optional[str] = None,
1771
- request_options: typing.Optional[RequestOptions] = None,
1772
- ) -> PageColumns:
2351
+ async def restore_dataset_version(
2352
+ self, id: str, *, version_ref: str, request_options: typing.Optional[RequestOptions] = None
2353
+ ) -> DatasetVersionPublic:
1773
2354
  """
1774
- Get dataset items output columns
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).
1775
2356
 
1776
2357
  Parameters
1777
2358
  ----------
1778
2359
  id : str
1779
2360
 
1780
- experiment_ids : typing.Optional[str]
2361
+ version_ref : str
2362
+ Version hash or tag to restore from
1781
2363
 
1782
2364
  request_options : typing.Optional[RequestOptions]
1783
2365
  Request-specific configuration.
1784
2366
 
1785
2367
  Returns
1786
2368
  -------
1787
- PageColumns
1788
- Dataset item output columns
2369
+ DatasetVersionPublic
2370
+ Version restored successfully
1789
2371
 
1790
2372
  Examples
1791
2373
  --------
1792
- import asyncio
1793
-
1794
2374
  from Opik import AsyncOpikApi
1795
-
1796
- client = AsyncOpikApi(
1797
- api_key="YOUR_API_KEY",
1798
- workspace_name="YOUR_WORKSPACE_NAME",
1799
- )
1800
-
1801
-
2375
+ import asyncio
2376
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1802
2377
  async def main() -> None:
1803
- await client.datasets.get_dataset_items_output_columns(
1804
- id="id",
1805
- )
1806
-
1807
-
2378
+ await client.datasets.restore_dataset_version(id='id', version_ref='version_ref', )
1808
2379
  asyncio.run(main())
1809
2380
  """
1810
- _response = await self._client_wrapper.httpx_client.request(
1811
- f"v1/private/datasets/{jsonable_encoder(id)}/items/experiments/items/output/columns",
1812
- method="GET",
1813
- params={
1814
- "experiment_ids": experiment_ids,
1815
- },
1816
- request_options=request_options,
2381
+ _response = await self._raw_client.restore_dataset_version(
2382
+ id, version_ref=version_ref, request_options=request_options
1817
2383
  )
1818
- try:
1819
- if 200 <= _response.status_code < 300:
1820
- return typing.cast(
1821
- PageColumns,
1822
- parse_obj_as(
1823
- type_=PageColumns, # type: ignore
1824
- object_=_response.json(),
1825
- ),
1826
- )
1827
- _response_json = _response.json()
1828
- except JSONDecodeError:
1829
- raise ApiError(status_code=_response.status_code, body=_response.text)
1830
- raise ApiError(status_code=_response.status_code, body=_response_json)
2384
+ return _response.data
1831
2385
 
1832
- async def stream_dataset_items(
2386
+ async def update_dataset_version(
1833
2387
  self,
2388
+ version_hash: str,
2389
+ id: str,
1834
2390
  *,
1835
- dataset_name: str,
1836
- last_retrieved_id: typing.Optional[str] = OMIT,
1837
- steam_limit: typing.Optional[int] = OMIT,
2391
+ change_description: typing.Optional[str] = OMIT,
2392
+ tags_to_add: typing.Optional[typing.Sequence[str]] = OMIT,
1838
2393
  request_options: typing.Optional[RequestOptions] = None,
1839
- ) -> typing.AsyncIterator[bytes]:
2394
+ ) -> DatasetVersionPublic:
1840
2395
  """
1841
- Stream dataset items
2396
+ Update a dataset version's change_description and/or add new tags
1842
2397
 
1843
2398
  Parameters
1844
2399
  ----------
1845
- dataset_name : str
2400
+ version_hash : str
1846
2401
 
1847
- last_retrieved_id : typing.Optional[str]
2402
+ id : str
1848
2403
 
1849
- steam_limit : typing.Optional[int]
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
1850
2409
 
1851
2410
  request_options : typing.Optional[RequestOptions]
1852
- Request-specific configuration. You can pass in configuration such as `chunk_size`, and more to customize the request and response.
2411
+ Request-specific configuration.
1853
2412
 
1854
- Yields
1855
- ------
1856
- typing.AsyncIterator[bytes]
1857
- Dataset items stream or error during process
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())
1858
2426
  """
1859
- async with self._client_wrapper.httpx_client.stream(
1860
- "v1/private/datasets/items/stream",
1861
- method="POST",
1862
- json={
1863
- "dataset_name": dataset_name,
1864
- "last_retrieved_id": last_retrieved_id,
1865
- "steam_limit": steam_limit,
1866
- },
1867
- headers={
1868
- "content-type": "application/json",
1869
- },
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,
1870
2432
  request_options=request_options,
1871
- omit=OMIT,
1872
- ) as _response:
1873
- try:
1874
- if 200 <= _response.status_code < 300:
1875
- _chunk_size = (
1876
- request_options.get("chunk_size", None)
1877
- if request_options is not None
1878
- else None
1879
- )
1880
- async for _chunk in _response.aiter_bytes(chunk_size=_chunk_size):
1881
- yield _chunk
1882
- return
1883
- await _response.aread()
1884
- _response_json = _response.json()
1885
- except JSONDecodeError:
1886
- raise ApiError(status_code=_response.status_code, body=_response.text)
1887
- raise ApiError(status_code=_response.status_code, body=_response_json)
2433
+ )
2434
+ return _response.data