opik 1.8.39__py3-none-any.whl → 1.9.71__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. opik/__init__.py +19 -3
  2. opik/anonymizer/__init__.py +5 -0
  3. opik/anonymizer/anonymizer.py +12 -0
  4. opik/anonymizer/factory.py +80 -0
  5. opik/anonymizer/recursive_anonymizer.py +64 -0
  6. opik/anonymizer/rules.py +56 -0
  7. opik/anonymizer/rules_anonymizer.py +35 -0
  8. opik/api_objects/attachment/attachment_context.py +36 -0
  9. opik/api_objects/attachment/attachments_extractor.py +153 -0
  10. opik/api_objects/attachment/client.py +1 -0
  11. opik/api_objects/attachment/converters.py +2 -0
  12. opik/api_objects/attachment/decoder.py +18 -0
  13. opik/api_objects/attachment/decoder_base64.py +83 -0
  14. opik/api_objects/attachment/decoder_helpers.py +137 -0
  15. opik/api_objects/data_helpers.py +79 -0
  16. opik/api_objects/dataset/dataset.py +64 -4
  17. opik/api_objects/dataset/rest_operations.py +11 -2
  18. opik/api_objects/experiment/experiment.py +57 -57
  19. opik/api_objects/experiment/experiment_item.py +2 -1
  20. opik/api_objects/experiment/experiments_client.py +64 -0
  21. opik/api_objects/experiment/helpers.py +35 -11
  22. opik/api_objects/experiment/rest_operations.py +65 -5
  23. opik/api_objects/helpers.py +8 -5
  24. opik/api_objects/local_recording.py +81 -0
  25. opik/api_objects/opik_client.py +600 -108
  26. opik/api_objects/opik_query_language.py +39 -5
  27. opik/api_objects/prompt/__init__.py +12 -2
  28. opik/api_objects/prompt/base_prompt.py +69 -0
  29. opik/api_objects/prompt/base_prompt_template.py +29 -0
  30. opik/api_objects/prompt/chat/__init__.py +1 -0
  31. opik/api_objects/prompt/chat/chat_prompt.py +210 -0
  32. opik/api_objects/prompt/chat/chat_prompt_template.py +350 -0
  33. opik/api_objects/prompt/chat/content_renderer_registry.py +203 -0
  34. opik/api_objects/prompt/client.py +189 -47
  35. opik/api_objects/prompt/text/__init__.py +1 -0
  36. opik/api_objects/prompt/text/prompt.py +174 -0
  37. opik/api_objects/prompt/{prompt_template.py → text/prompt_template.py} +10 -6
  38. opik/api_objects/prompt/types.py +23 -0
  39. opik/api_objects/search_helpers.py +89 -0
  40. opik/api_objects/span/span_data.py +35 -25
  41. opik/api_objects/threads/threads_client.py +39 -5
  42. opik/api_objects/trace/trace_client.py +52 -2
  43. opik/api_objects/trace/trace_data.py +15 -24
  44. opik/api_objects/validation_helpers.py +3 -3
  45. opik/cli/__init__.py +5 -0
  46. opik/cli/__main__.py +6 -0
  47. opik/cli/configure.py +66 -0
  48. opik/cli/exports/__init__.py +131 -0
  49. opik/cli/exports/dataset.py +278 -0
  50. opik/cli/exports/experiment.py +784 -0
  51. opik/cli/exports/project.py +685 -0
  52. opik/cli/exports/prompt.py +578 -0
  53. opik/cli/exports/utils.py +406 -0
  54. opik/cli/harbor.py +39 -0
  55. opik/cli/healthcheck.py +21 -0
  56. opik/cli/imports/__init__.py +439 -0
  57. opik/cli/imports/dataset.py +143 -0
  58. opik/cli/imports/experiment.py +1192 -0
  59. opik/cli/imports/project.py +262 -0
  60. opik/cli/imports/prompt.py +177 -0
  61. opik/cli/imports/utils.py +280 -0
  62. opik/cli/main.py +49 -0
  63. opik/cli/proxy.py +93 -0
  64. opik/cli/usage_report/__init__.py +16 -0
  65. opik/cli/usage_report/charts.py +783 -0
  66. opik/cli/usage_report/cli.py +274 -0
  67. opik/cli/usage_report/constants.py +9 -0
  68. opik/cli/usage_report/extraction.py +749 -0
  69. opik/cli/usage_report/pdf.py +244 -0
  70. opik/cli/usage_report/statistics.py +78 -0
  71. opik/cli/usage_report/utils.py +235 -0
  72. opik/config.py +13 -7
  73. opik/configurator/configure.py +17 -0
  74. opik/datetime_helpers.py +12 -0
  75. opik/decorator/arguments_helpers.py +9 -1
  76. opik/decorator/base_track_decorator.py +205 -133
  77. opik/decorator/context_manager/span_context_manager.py +123 -0
  78. opik/decorator/context_manager/trace_context_manager.py +84 -0
  79. opik/decorator/opik_args/__init__.py +13 -0
  80. opik/decorator/opik_args/api_classes.py +71 -0
  81. opik/decorator/opik_args/helpers.py +120 -0
  82. opik/decorator/span_creation_handler.py +25 -6
  83. opik/dict_utils.py +3 -3
  84. opik/evaluation/__init__.py +13 -2
  85. opik/evaluation/engine/engine.py +272 -75
  86. opik/evaluation/engine/evaluation_tasks_executor.py +6 -3
  87. opik/evaluation/engine/helpers.py +31 -6
  88. opik/evaluation/engine/metrics_evaluator.py +237 -0
  89. opik/evaluation/evaluation_result.py +168 -2
  90. opik/evaluation/evaluator.py +533 -62
  91. opik/evaluation/metrics/__init__.py +103 -4
  92. opik/evaluation/metrics/aggregated_metric.py +35 -6
  93. opik/evaluation/metrics/base_metric.py +1 -1
  94. opik/evaluation/metrics/conversation/__init__.py +48 -0
  95. opik/evaluation/metrics/conversation/conversation_thread_metric.py +56 -2
  96. opik/evaluation/metrics/conversation/g_eval_wrappers.py +19 -0
  97. opik/evaluation/metrics/conversation/helpers.py +14 -15
  98. opik/evaluation/metrics/conversation/heuristics/__init__.py +14 -0
  99. opik/evaluation/metrics/conversation/heuristics/degeneration/__init__.py +3 -0
  100. opik/evaluation/metrics/conversation/heuristics/degeneration/metric.py +189 -0
  101. opik/evaluation/metrics/conversation/heuristics/degeneration/phrases.py +12 -0
  102. opik/evaluation/metrics/conversation/heuristics/knowledge_retention/__init__.py +3 -0
  103. opik/evaluation/metrics/conversation/heuristics/knowledge_retention/metric.py +172 -0
  104. opik/evaluation/metrics/conversation/llm_judges/__init__.py +32 -0
  105. opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/metric.py +22 -17
  106. opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/templates.py +1 -1
  107. opik/evaluation/metrics/conversation/llm_judges/g_eval_wrappers.py +442 -0
  108. opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/metric.py +13 -7
  109. opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/templates.py +1 -1
  110. opik/evaluation/metrics/conversation/llm_judges/user_frustration/__init__.py +0 -0
  111. opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/metric.py +21 -14
  112. opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/templates.py +1 -1
  113. opik/evaluation/metrics/conversation/types.py +4 -5
  114. opik/evaluation/metrics/conversation_types.py +9 -0
  115. opik/evaluation/metrics/heuristics/bertscore.py +107 -0
  116. opik/evaluation/metrics/heuristics/bleu.py +35 -15
  117. opik/evaluation/metrics/heuristics/chrf.py +127 -0
  118. opik/evaluation/metrics/heuristics/contains.py +47 -11
  119. opik/evaluation/metrics/heuristics/distribution_metrics.py +331 -0
  120. opik/evaluation/metrics/heuristics/gleu.py +113 -0
  121. opik/evaluation/metrics/heuristics/language_adherence.py +123 -0
  122. opik/evaluation/metrics/heuristics/meteor.py +119 -0
  123. opik/evaluation/metrics/heuristics/prompt_injection.py +150 -0
  124. opik/evaluation/metrics/heuristics/readability.py +129 -0
  125. opik/evaluation/metrics/heuristics/rouge.py +26 -9
  126. opik/evaluation/metrics/heuristics/spearman.py +88 -0
  127. opik/evaluation/metrics/heuristics/tone.py +155 -0
  128. opik/evaluation/metrics/heuristics/vader_sentiment.py +77 -0
  129. opik/evaluation/metrics/llm_judges/answer_relevance/metric.py +20 -5
  130. opik/evaluation/metrics/llm_judges/context_precision/metric.py +20 -6
  131. opik/evaluation/metrics/llm_judges/context_recall/metric.py +20 -6
  132. opik/evaluation/metrics/llm_judges/g_eval/__init__.py +5 -0
  133. opik/evaluation/metrics/llm_judges/g_eval/metric.py +219 -68
  134. opik/evaluation/metrics/llm_judges/g_eval/parser.py +102 -52
  135. opik/evaluation/metrics/llm_judges/g_eval/presets.py +209 -0
  136. opik/evaluation/metrics/llm_judges/g_eval_presets/__init__.py +36 -0
  137. opik/evaluation/metrics/llm_judges/g_eval_presets/agent_assessment.py +77 -0
  138. opik/evaluation/metrics/llm_judges/g_eval_presets/bias_classifier.py +181 -0
  139. opik/evaluation/metrics/llm_judges/g_eval_presets/compliance_risk.py +41 -0
  140. opik/evaluation/metrics/llm_judges/g_eval_presets/prompt_uncertainty.py +41 -0
  141. opik/evaluation/metrics/llm_judges/g_eval_presets/qa_suite.py +146 -0
  142. opik/evaluation/metrics/llm_judges/hallucination/metric.py +16 -3
  143. opik/evaluation/metrics/llm_judges/llm_juries/__init__.py +3 -0
  144. opik/evaluation/metrics/llm_judges/llm_juries/metric.py +76 -0
  145. opik/evaluation/metrics/llm_judges/moderation/metric.py +16 -4
  146. opik/evaluation/metrics/llm_judges/structure_output_compliance/__init__.py +0 -0
  147. opik/evaluation/metrics/llm_judges/structure_output_compliance/metric.py +144 -0
  148. opik/evaluation/metrics/llm_judges/structure_output_compliance/parser.py +79 -0
  149. opik/evaluation/metrics/llm_judges/structure_output_compliance/schema.py +15 -0
  150. opik/evaluation/metrics/llm_judges/structure_output_compliance/template.py +50 -0
  151. opik/evaluation/metrics/llm_judges/syc_eval/__init__.py +0 -0
  152. opik/evaluation/metrics/llm_judges/syc_eval/metric.py +252 -0
  153. opik/evaluation/metrics/llm_judges/syc_eval/parser.py +82 -0
  154. opik/evaluation/metrics/llm_judges/syc_eval/template.py +155 -0
  155. opik/evaluation/metrics/llm_judges/trajectory_accuracy/metric.py +20 -5
  156. opik/evaluation/metrics/llm_judges/usefulness/metric.py +16 -4
  157. opik/evaluation/metrics/ragas_metric.py +43 -23
  158. opik/evaluation/models/__init__.py +8 -0
  159. opik/evaluation/models/base_model.py +107 -1
  160. opik/evaluation/models/langchain/langchain_chat_model.py +15 -7
  161. opik/evaluation/models/langchain/message_converters.py +97 -15
  162. opik/evaluation/models/litellm/litellm_chat_model.py +156 -29
  163. opik/evaluation/models/litellm/util.py +125 -0
  164. opik/evaluation/models/litellm/warning_filters.py +16 -4
  165. opik/evaluation/models/model_capabilities.py +187 -0
  166. opik/evaluation/models/models_factory.py +25 -3
  167. opik/evaluation/preprocessing.py +92 -0
  168. opik/evaluation/report.py +70 -12
  169. opik/evaluation/rest_operations.py +49 -45
  170. opik/evaluation/samplers/__init__.py +4 -0
  171. opik/evaluation/samplers/base_dataset_sampler.py +40 -0
  172. opik/evaluation/samplers/random_dataset_sampler.py +48 -0
  173. opik/evaluation/score_statistics.py +66 -0
  174. opik/evaluation/scorers/__init__.py +4 -0
  175. opik/evaluation/scorers/scorer_function.py +55 -0
  176. opik/evaluation/scorers/scorer_wrapper_metric.py +130 -0
  177. opik/evaluation/test_case.py +3 -2
  178. opik/evaluation/test_result.py +1 -0
  179. opik/evaluation/threads/evaluator.py +31 -3
  180. opik/evaluation/threads/helpers.py +3 -2
  181. opik/evaluation/types.py +9 -1
  182. opik/exceptions.py +33 -0
  183. opik/file_upload/file_uploader.py +13 -0
  184. opik/file_upload/upload_options.py +2 -0
  185. opik/hooks/__init__.py +23 -0
  186. opik/hooks/anonymizer_hook.py +36 -0
  187. opik/hooks/httpx_client_hook.py +112 -0
  188. opik/httpx_client.py +12 -9
  189. opik/id_helpers.py +18 -0
  190. opik/integrations/adk/graph/subgraph_edges_builders.py +1 -2
  191. opik/integrations/adk/helpers.py +16 -7
  192. opik/integrations/adk/legacy_opik_tracer.py +7 -4
  193. opik/integrations/adk/opik_tracer.py +14 -1
  194. opik/integrations/adk/patchers/adk_otel_tracer/opik_adk_otel_tracer.py +7 -3
  195. opik/integrations/adk/recursive_callback_injector.py +4 -7
  196. opik/integrations/bedrock/converse/__init__.py +0 -0
  197. opik/integrations/bedrock/converse/chunks_aggregator.py +188 -0
  198. opik/integrations/bedrock/{converse_decorator.py → converse/converse_decorator.py} +4 -3
  199. opik/integrations/bedrock/invoke_agent_decorator.py +5 -4
  200. opik/integrations/bedrock/invoke_model/__init__.py +0 -0
  201. opik/integrations/bedrock/invoke_model/chunks_aggregator/__init__.py +78 -0
  202. opik/integrations/bedrock/invoke_model/chunks_aggregator/api.py +45 -0
  203. opik/integrations/bedrock/invoke_model/chunks_aggregator/base.py +23 -0
  204. opik/integrations/bedrock/invoke_model/chunks_aggregator/claude.py +121 -0
  205. opik/integrations/bedrock/invoke_model/chunks_aggregator/format_detector.py +107 -0
  206. opik/integrations/bedrock/invoke_model/chunks_aggregator/llama.py +108 -0
  207. opik/integrations/bedrock/invoke_model/chunks_aggregator/mistral.py +118 -0
  208. opik/integrations/bedrock/invoke_model/chunks_aggregator/nova.py +99 -0
  209. opik/integrations/bedrock/invoke_model/invoke_model_decorator.py +178 -0
  210. opik/integrations/bedrock/invoke_model/response_types.py +34 -0
  211. opik/integrations/bedrock/invoke_model/stream_wrappers.py +122 -0
  212. opik/integrations/bedrock/invoke_model/usage_converters.py +87 -0
  213. opik/integrations/bedrock/invoke_model/usage_extraction.py +108 -0
  214. opik/integrations/bedrock/opik_tracker.py +42 -4
  215. opik/integrations/bedrock/types.py +19 -0
  216. opik/integrations/crewai/crewai_decorator.py +8 -51
  217. opik/integrations/crewai/opik_tracker.py +31 -10
  218. opik/integrations/crewai/patchers/__init__.py +5 -0
  219. opik/integrations/crewai/patchers/flow.py +118 -0
  220. opik/integrations/crewai/patchers/litellm_completion.py +30 -0
  221. opik/integrations/crewai/patchers/llm_client.py +207 -0
  222. opik/integrations/dspy/callback.py +80 -17
  223. opik/integrations/dspy/parsers.py +168 -0
  224. opik/integrations/harbor/__init__.py +17 -0
  225. opik/integrations/harbor/experiment_service.py +269 -0
  226. opik/integrations/harbor/opik_tracker.py +528 -0
  227. opik/integrations/haystack/opik_connector.py +2 -2
  228. opik/integrations/haystack/opik_tracer.py +3 -7
  229. opik/integrations/langchain/__init__.py +3 -1
  230. opik/integrations/langchain/helpers.py +96 -0
  231. opik/integrations/langchain/langgraph_async_context_bridge.py +131 -0
  232. opik/integrations/langchain/langgraph_tracer_injector.py +88 -0
  233. opik/integrations/langchain/opik_encoder_extension.py +1 -1
  234. opik/integrations/langchain/opik_tracer.py +474 -229
  235. opik/integrations/litellm/__init__.py +5 -0
  236. opik/integrations/litellm/completion_chunks_aggregator.py +115 -0
  237. opik/integrations/litellm/litellm_completion_decorator.py +242 -0
  238. opik/integrations/litellm/opik_tracker.py +43 -0
  239. opik/integrations/litellm/stream_patchers.py +151 -0
  240. opik/integrations/llama_index/callback.py +146 -107
  241. opik/integrations/openai/agents/opik_tracing_processor.py +1 -2
  242. opik/integrations/openai/openai_chat_completions_decorator.py +2 -16
  243. opik/integrations/openai/opik_tracker.py +1 -1
  244. opik/integrations/sagemaker/auth.py +5 -1
  245. opik/llm_usage/google_usage.py +3 -1
  246. opik/llm_usage/opik_usage.py +7 -8
  247. opik/llm_usage/opik_usage_factory.py +4 -2
  248. opik/logging_messages.py +6 -0
  249. opik/message_processing/batching/base_batcher.py +14 -21
  250. opik/message_processing/batching/batch_manager.py +22 -10
  251. opik/message_processing/batching/batch_manager_constuctors.py +10 -0
  252. opik/message_processing/batching/batchers.py +59 -27
  253. opik/message_processing/batching/flushing_thread.py +0 -3
  254. opik/message_processing/emulation/__init__.py +0 -0
  255. opik/message_processing/emulation/emulator_message_processor.py +578 -0
  256. opik/message_processing/emulation/local_emulator_message_processor.py +140 -0
  257. opik/message_processing/emulation/models.py +162 -0
  258. opik/message_processing/encoder_helpers.py +79 -0
  259. opik/message_processing/messages.py +56 -1
  260. opik/message_processing/preprocessing/__init__.py +0 -0
  261. opik/message_processing/preprocessing/attachments_preprocessor.py +70 -0
  262. opik/message_processing/preprocessing/batching_preprocessor.py +53 -0
  263. opik/message_processing/preprocessing/constants.py +1 -0
  264. opik/message_processing/preprocessing/file_upload_preprocessor.py +38 -0
  265. opik/message_processing/preprocessing/preprocessor.py +36 -0
  266. opik/message_processing/processors/__init__.py +0 -0
  267. opik/message_processing/processors/attachments_extraction_processor.py +146 -0
  268. opik/message_processing/processors/message_processors.py +92 -0
  269. opik/message_processing/processors/message_processors_chain.py +96 -0
  270. opik/message_processing/{message_processors.py → processors/online_message_processor.py} +85 -29
  271. opik/message_processing/queue_consumer.py +9 -3
  272. opik/message_processing/streamer.py +71 -33
  273. opik/message_processing/streamer_constructors.py +43 -10
  274. opik/opik_context.py +16 -4
  275. opik/plugins/pytest/hooks.py +5 -3
  276. opik/rest_api/__init__.py +346 -15
  277. opik/rest_api/alerts/__init__.py +7 -0
  278. opik/rest_api/alerts/client.py +667 -0
  279. opik/rest_api/alerts/raw_client.py +1015 -0
  280. opik/rest_api/alerts/types/__init__.py +7 -0
  281. opik/rest_api/alerts/types/get_webhook_examples_request_alert_type.py +5 -0
  282. opik/rest_api/annotation_queues/__init__.py +4 -0
  283. opik/rest_api/annotation_queues/client.py +668 -0
  284. opik/rest_api/annotation_queues/raw_client.py +1019 -0
  285. opik/rest_api/automation_rule_evaluators/client.py +34 -2
  286. opik/rest_api/automation_rule_evaluators/raw_client.py +24 -0
  287. opik/rest_api/client.py +15 -0
  288. opik/rest_api/dashboards/__init__.py +4 -0
  289. opik/rest_api/dashboards/client.py +462 -0
  290. opik/rest_api/dashboards/raw_client.py +648 -0
  291. opik/rest_api/datasets/client.py +1310 -44
  292. opik/rest_api/datasets/raw_client.py +2269 -358
  293. opik/rest_api/experiments/__init__.py +2 -2
  294. opik/rest_api/experiments/client.py +191 -5
  295. opik/rest_api/experiments/raw_client.py +301 -7
  296. opik/rest_api/experiments/types/__init__.py +4 -1
  297. opik/rest_api/experiments/types/experiment_update_status.py +5 -0
  298. opik/rest_api/experiments/types/experiment_update_type.py +5 -0
  299. opik/rest_api/experiments/types/experiment_write_status.py +5 -0
  300. opik/rest_api/feedback_definitions/types/find_feedback_definitions_request_type.py +1 -1
  301. opik/rest_api/llm_provider_key/client.py +20 -0
  302. opik/rest_api/llm_provider_key/raw_client.py +20 -0
  303. opik/rest_api/llm_provider_key/types/provider_api_key_write_provider.py +1 -1
  304. opik/rest_api/manual_evaluation/__init__.py +4 -0
  305. opik/rest_api/manual_evaluation/client.py +347 -0
  306. opik/rest_api/manual_evaluation/raw_client.py +543 -0
  307. opik/rest_api/optimizations/client.py +145 -9
  308. opik/rest_api/optimizations/raw_client.py +237 -13
  309. opik/rest_api/optimizations/types/optimization_update_status.py +3 -1
  310. opik/rest_api/prompts/__init__.py +2 -2
  311. opik/rest_api/prompts/client.py +227 -6
  312. opik/rest_api/prompts/raw_client.py +331 -2
  313. opik/rest_api/prompts/types/__init__.py +3 -1
  314. opik/rest_api/prompts/types/create_prompt_version_detail_template_structure.py +5 -0
  315. opik/rest_api/prompts/types/prompt_write_template_structure.py +5 -0
  316. opik/rest_api/spans/__init__.py +0 -2
  317. opik/rest_api/spans/client.py +238 -76
  318. opik/rest_api/spans/raw_client.py +307 -95
  319. opik/rest_api/spans/types/__init__.py +0 -2
  320. opik/rest_api/traces/client.py +572 -161
  321. opik/rest_api/traces/raw_client.py +736 -229
  322. opik/rest_api/types/__init__.py +352 -17
  323. opik/rest_api/types/aggregation_data.py +1 -0
  324. opik/rest_api/types/alert.py +33 -0
  325. opik/rest_api/types/alert_alert_type.py +5 -0
  326. opik/rest_api/types/alert_page_public.py +24 -0
  327. opik/rest_api/types/alert_public.py +33 -0
  328. opik/rest_api/types/alert_public_alert_type.py +5 -0
  329. opik/rest_api/types/alert_trigger.py +27 -0
  330. opik/rest_api/types/alert_trigger_config.py +28 -0
  331. opik/rest_api/types/alert_trigger_config_public.py +28 -0
  332. opik/rest_api/types/alert_trigger_config_public_type.py +10 -0
  333. opik/rest_api/types/alert_trigger_config_type.py +10 -0
  334. opik/rest_api/types/alert_trigger_config_write.py +22 -0
  335. opik/rest_api/types/alert_trigger_config_write_type.py +10 -0
  336. opik/rest_api/types/alert_trigger_event_type.py +19 -0
  337. opik/rest_api/types/alert_trigger_public.py +27 -0
  338. opik/rest_api/types/alert_trigger_public_event_type.py +19 -0
  339. opik/rest_api/types/alert_trigger_write.py +23 -0
  340. opik/rest_api/types/alert_trigger_write_event_type.py +19 -0
  341. opik/rest_api/types/alert_write.py +28 -0
  342. opik/rest_api/types/alert_write_alert_type.py +5 -0
  343. opik/rest_api/types/annotation_queue.py +42 -0
  344. opik/rest_api/types/annotation_queue_batch.py +27 -0
  345. opik/rest_api/types/annotation_queue_item_ids.py +19 -0
  346. opik/rest_api/types/annotation_queue_page_public.py +28 -0
  347. opik/rest_api/types/annotation_queue_public.py +38 -0
  348. opik/rest_api/types/annotation_queue_public_scope.py +5 -0
  349. opik/rest_api/types/annotation_queue_reviewer.py +20 -0
  350. opik/rest_api/types/annotation_queue_reviewer_public.py +20 -0
  351. opik/rest_api/types/annotation_queue_scope.py +5 -0
  352. opik/rest_api/types/annotation_queue_write.py +31 -0
  353. opik/rest_api/types/annotation_queue_write_scope.py +5 -0
  354. opik/rest_api/types/audio_url.py +19 -0
  355. opik/rest_api/types/audio_url_public.py +19 -0
  356. opik/rest_api/types/audio_url_write.py +19 -0
  357. opik/rest_api/types/automation_rule_evaluator.py +62 -2
  358. opik/rest_api/types/automation_rule_evaluator_llm_as_judge.py +2 -0
  359. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_public.py +2 -0
  360. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_write.py +2 -0
  361. opik/rest_api/types/automation_rule_evaluator_object_object_public.py +155 -0
  362. opik/rest_api/types/automation_rule_evaluator_page_public.py +3 -2
  363. opik/rest_api/types/automation_rule_evaluator_public.py +57 -2
  364. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge.py +22 -0
  365. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_public.py +22 -0
  366. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_write.py +22 -0
  367. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python.py +22 -0
  368. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_public.py +22 -0
  369. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_write.py +22 -0
  370. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge.py +2 -0
  371. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_public.py +2 -0
  372. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_write.py +2 -0
  373. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python.py +2 -0
  374. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_public.py +2 -0
  375. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_write.py +2 -0
  376. opik/rest_api/types/automation_rule_evaluator_update.py +51 -1
  377. opik/rest_api/types/automation_rule_evaluator_update_llm_as_judge.py +2 -0
  378. opik/rest_api/types/automation_rule_evaluator_update_span_llm_as_judge.py +22 -0
  379. opik/rest_api/types/automation_rule_evaluator_update_span_user_defined_metric_python.py +22 -0
  380. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_llm_as_judge.py +2 -0
  381. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_user_defined_metric_python.py +2 -0
  382. opik/rest_api/types/automation_rule_evaluator_update_user_defined_metric_python.py +2 -0
  383. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python.py +2 -0
  384. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_public.py +2 -0
  385. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_write.py +2 -0
  386. opik/rest_api/types/automation_rule_evaluator_write.py +51 -1
  387. opik/rest_api/types/boolean_feedback_definition.py +25 -0
  388. opik/rest_api/types/boolean_feedback_definition_create.py +20 -0
  389. opik/rest_api/types/boolean_feedback_definition_public.py +25 -0
  390. opik/rest_api/types/boolean_feedback_definition_update.py +20 -0
  391. opik/rest_api/types/boolean_feedback_detail.py +29 -0
  392. opik/rest_api/types/boolean_feedback_detail_create.py +29 -0
  393. opik/rest_api/types/boolean_feedback_detail_public.py +29 -0
  394. opik/rest_api/types/boolean_feedback_detail_update.py +29 -0
  395. opik/rest_api/types/dashboard_page_public.py +24 -0
  396. opik/rest_api/types/dashboard_public.py +30 -0
  397. opik/rest_api/types/dataset.py +4 -0
  398. opik/rest_api/types/dataset_expansion.py +42 -0
  399. opik/rest_api/types/dataset_expansion_response.py +39 -0
  400. opik/rest_api/types/dataset_item.py +2 -0
  401. opik/rest_api/types/dataset_item_changes_public.py +5 -0
  402. opik/rest_api/types/dataset_item_compare.py +2 -0
  403. opik/rest_api/types/dataset_item_filter.py +27 -0
  404. opik/rest_api/types/dataset_item_filter_operator.py +21 -0
  405. opik/rest_api/types/dataset_item_page_compare.py +5 -0
  406. opik/rest_api/types/dataset_item_page_public.py +5 -0
  407. opik/rest_api/types/dataset_item_public.py +2 -0
  408. opik/rest_api/types/dataset_item_update.py +39 -0
  409. opik/rest_api/types/dataset_item_write.py +1 -0
  410. opik/rest_api/types/dataset_public.py +4 -0
  411. opik/rest_api/types/dataset_public_status.py +5 -0
  412. opik/rest_api/types/dataset_status.py +5 -0
  413. opik/rest_api/types/dataset_version_diff.py +22 -0
  414. opik/rest_api/types/dataset_version_diff_stats.py +24 -0
  415. opik/rest_api/types/dataset_version_page_public.py +23 -0
  416. opik/rest_api/types/dataset_version_public.py +59 -0
  417. opik/rest_api/types/dataset_version_summary.py +46 -0
  418. opik/rest_api/types/dataset_version_summary_public.py +46 -0
  419. opik/rest_api/types/experiment.py +7 -2
  420. opik/rest_api/types/experiment_group_response.py +2 -0
  421. opik/rest_api/types/experiment_public.py +7 -2
  422. opik/rest_api/types/experiment_public_status.py +5 -0
  423. opik/rest_api/types/experiment_score.py +20 -0
  424. opik/rest_api/types/experiment_score_public.py +20 -0
  425. opik/rest_api/types/experiment_score_write.py +20 -0
  426. opik/rest_api/types/experiment_status.py +5 -0
  427. opik/rest_api/types/feedback.py +25 -1
  428. opik/rest_api/types/feedback_create.py +20 -1
  429. opik/rest_api/types/feedback_object_public.py +27 -1
  430. opik/rest_api/types/feedback_public.py +25 -1
  431. opik/rest_api/types/feedback_score_batch_item.py +2 -1
  432. opik/rest_api/types/feedback_score_batch_item_thread.py +2 -1
  433. opik/rest_api/types/feedback_score_public.py +4 -0
  434. opik/rest_api/types/feedback_update.py +20 -1
  435. opik/rest_api/types/group_content_with_aggregations.py +1 -0
  436. opik/rest_api/types/group_detail.py +19 -0
  437. opik/rest_api/types/group_details.py +20 -0
  438. opik/rest_api/types/guardrail.py +1 -0
  439. opik/rest_api/types/guardrail_write.py +1 -0
  440. opik/rest_api/types/ids_holder.py +19 -0
  441. opik/rest_api/types/image_url.py +20 -0
  442. opik/rest_api/types/image_url_public.py +20 -0
  443. opik/rest_api/types/image_url_write.py +20 -0
  444. opik/rest_api/types/llm_as_judge_message.py +5 -1
  445. opik/rest_api/types/llm_as_judge_message_content.py +26 -0
  446. opik/rest_api/types/llm_as_judge_message_content_public.py +26 -0
  447. opik/rest_api/types/llm_as_judge_message_content_write.py +26 -0
  448. opik/rest_api/types/llm_as_judge_message_public.py +5 -1
  449. opik/rest_api/types/llm_as_judge_message_write.py +5 -1
  450. opik/rest_api/types/llm_as_judge_model_parameters.py +3 -0
  451. opik/rest_api/types/llm_as_judge_model_parameters_public.py +3 -0
  452. opik/rest_api/types/llm_as_judge_model_parameters_write.py +3 -0
  453. opik/rest_api/types/manual_evaluation_request.py +38 -0
  454. opik/rest_api/types/manual_evaluation_request_entity_type.py +5 -0
  455. opik/rest_api/types/manual_evaluation_response.py +27 -0
  456. opik/rest_api/types/optimization.py +4 -2
  457. opik/rest_api/types/optimization_public.py +4 -2
  458. opik/rest_api/types/optimization_public_status.py +3 -1
  459. opik/rest_api/types/optimization_status.py +3 -1
  460. opik/rest_api/types/optimization_studio_config.py +27 -0
  461. opik/rest_api/types/optimization_studio_config_public.py +27 -0
  462. opik/rest_api/types/optimization_studio_config_write.py +27 -0
  463. opik/rest_api/types/optimization_studio_log.py +22 -0
  464. opik/rest_api/types/optimization_write.py +4 -2
  465. opik/rest_api/types/optimization_write_status.py +3 -1
  466. opik/rest_api/types/project.py +1 -0
  467. opik/rest_api/types/project_detailed.py +1 -0
  468. opik/rest_api/types/project_reference.py +31 -0
  469. opik/rest_api/types/project_reference_public.py +31 -0
  470. opik/rest_api/types/project_stats_summary_item.py +1 -0
  471. opik/rest_api/types/prompt.py +6 -0
  472. opik/rest_api/types/prompt_detail.py +6 -0
  473. opik/rest_api/types/prompt_detail_template_structure.py +5 -0
  474. opik/rest_api/types/prompt_public.py +6 -0
  475. opik/rest_api/types/prompt_public_template_structure.py +5 -0
  476. opik/rest_api/types/prompt_template_structure.py +5 -0
  477. opik/rest_api/types/prompt_version.py +3 -0
  478. opik/rest_api/types/prompt_version_detail.py +3 -0
  479. opik/rest_api/types/prompt_version_detail_template_structure.py +5 -0
  480. opik/rest_api/types/prompt_version_link.py +1 -0
  481. opik/rest_api/types/prompt_version_link_public.py +1 -0
  482. opik/rest_api/types/prompt_version_page_public.py +5 -0
  483. opik/rest_api/types/prompt_version_public.py +3 -0
  484. opik/rest_api/types/prompt_version_public_template_structure.py +5 -0
  485. opik/rest_api/types/prompt_version_template_structure.py +5 -0
  486. opik/rest_api/types/prompt_version_update.py +33 -0
  487. opik/rest_api/types/provider_api_key.py +9 -0
  488. opik/rest_api/types/provider_api_key_provider.py +1 -1
  489. opik/rest_api/types/provider_api_key_public.py +9 -0
  490. opik/rest_api/types/provider_api_key_public_provider.py +1 -1
  491. opik/rest_api/types/score_name.py +1 -0
  492. opik/rest_api/types/service_toggles_config.py +18 -0
  493. opik/rest_api/types/span.py +1 -2
  494. opik/rest_api/types/span_enrichment_options.py +31 -0
  495. opik/rest_api/types/span_experiment_item_bulk_write_view.py +1 -2
  496. opik/rest_api/types/span_filter.py +23 -0
  497. opik/rest_api/types/span_filter_operator.py +21 -0
  498. opik/rest_api/types/span_filter_write.py +23 -0
  499. opik/rest_api/types/span_filter_write_operator.py +21 -0
  500. opik/rest_api/types/span_llm_as_judge_code.py +27 -0
  501. opik/rest_api/types/span_llm_as_judge_code_public.py +27 -0
  502. opik/rest_api/types/span_llm_as_judge_code_write.py +27 -0
  503. opik/rest_api/types/span_public.py +1 -2
  504. opik/rest_api/types/span_update.py +46 -0
  505. opik/rest_api/types/span_user_defined_metric_python_code.py +20 -0
  506. opik/rest_api/types/span_user_defined_metric_python_code_public.py +20 -0
  507. opik/rest_api/types/span_user_defined_metric_python_code_write.py +20 -0
  508. opik/rest_api/types/span_write.py +1 -2
  509. opik/rest_api/types/studio_evaluation.py +20 -0
  510. opik/rest_api/types/studio_evaluation_public.py +20 -0
  511. opik/rest_api/types/studio_evaluation_write.py +20 -0
  512. opik/rest_api/types/studio_llm_model.py +21 -0
  513. opik/rest_api/types/studio_llm_model_public.py +21 -0
  514. opik/rest_api/types/studio_llm_model_write.py +21 -0
  515. opik/rest_api/types/studio_message.py +20 -0
  516. opik/rest_api/types/studio_message_public.py +20 -0
  517. opik/rest_api/types/studio_message_write.py +20 -0
  518. opik/rest_api/types/studio_metric.py +21 -0
  519. opik/rest_api/types/studio_metric_public.py +21 -0
  520. opik/rest_api/types/studio_metric_write.py +21 -0
  521. opik/rest_api/types/studio_optimizer.py +21 -0
  522. opik/rest_api/types/studio_optimizer_public.py +21 -0
  523. opik/rest_api/types/studio_optimizer_write.py +21 -0
  524. opik/rest_api/types/studio_prompt.py +20 -0
  525. opik/rest_api/types/studio_prompt_public.py +20 -0
  526. opik/rest_api/types/studio_prompt_write.py +20 -0
  527. opik/rest_api/types/trace.py +11 -2
  528. opik/rest_api/types/trace_enrichment_options.py +32 -0
  529. opik/rest_api/types/trace_experiment_item_bulk_write_view.py +1 -2
  530. opik/rest_api/types/trace_filter.py +23 -0
  531. opik/rest_api/types/trace_filter_operator.py +21 -0
  532. opik/rest_api/types/trace_filter_write.py +23 -0
  533. opik/rest_api/types/trace_filter_write_operator.py +21 -0
  534. opik/rest_api/types/trace_public.py +11 -2
  535. opik/rest_api/types/trace_thread_filter_write.py +23 -0
  536. opik/rest_api/types/trace_thread_filter_write_operator.py +21 -0
  537. opik/rest_api/types/trace_thread_identifier.py +1 -0
  538. opik/rest_api/types/trace_update.py +39 -0
  539. opik/rest_api/types/trace_write.py +1 -2
  540. opik/rest_api/types/value_entry.py +2 -0
  541. opik/rest_api/types/value_entry_compare.py +2 -0
  542. opik/rest_api/types/value_entry_experiment_item_bulk_write_view.py +2 -0
  543. opik/rest_api/types/value_entry_public.py +2 -0
  544. opik/rest_api/types/video_url.py +19 -0
  545. opik/rest_api/types/video_url_public.py +19 -0
  546. opik/rest_api/types/video_url_write.py +19 -0
  547. opik/rest_api/types/webhook.py +28 -0
  548. opik/rest_api/types/webhook_examples.py +19 -0
  549. opik/rest_api/types/webhook_public.py +28 -0
  550. opik/rest_api/types/webhook_test_result.py +23 -0
  551. opik/rest_api/types/webhook_test_result_status.py +5 -0
  552. opik/rest_api/types/webhook_write.py +23 -0
  553. opik/rest_api/types/welcome_wizard_tracking.py +22 -0
  554. opik/rest_api/types/workspace_configuration.py +5 -0
  555. opik/rest_api/welcome_wizard/__init__.py +4 -0
  556. opik/rest_api/welcome_wizard/client.py +195 -0
  557. opik/rest_api/welcome_wizard/raw_client.py +208 -0
  558. opik/rest_api/workspaces/client.py +14 -2
  559. opik/rest_api/workspaces/raw_client.py +10 -0
  560. opik/s3_httpx_client.py +14 -1
  561. opik/simulation/__init__.py +6 -0
  562. opik/simulation/simulated_user.py +99 -0
  563. opik/simulation/simulator.py +108 -0
  564. opik/synchronization.py +5 -6
  565. opik/{decorator/tracing_runtime_config.py → tracing_runtime_config.py} +6 -7
  566. opik/types.py +36 -0
  567. opik/validation/chat_prompt_messages.py +241 -0
  568. opik/validation/feedback_score.py +3 -3
  569. opik/validation/validator.py +28 -0
  570. opik-1.9.71.dist-info/METADATA +370 -0
  571. opik-1.9.71.dist-info/RECORD +1110 -0
  572. opik/api_objects/prompt/prompt.py +0 -112
  573. opik/cli.py +0 -193
  574. opik/hooks.py +0 -13
  575. opik/integrations/bedrock/chunks_aggregator.py +0 -55
  576. opik/integrations/bedrock/helpers.py +0 -8
  577. opik/rest_api/types/automation_rule_evaluator_object_public.py +0 -100
  578. opik/rest_api/types/json_node_experiment_item_bulk_write_view.py +0 -5
  579. opik-1.8.39.dist-info/METADATA +0 -339
  580. opik-1.8.39.dist-info/RECORD +0 -790
  581. /opik/{evaluation/metrics/conversation/conversational_coherence → decorator/context_manager}/__init__.py +0 -0
  582. /opik/evaluation/metrics/conversation/{session_completeness → llm_judges/conversational_coherence}/__init__.py +0 -0
  583. /opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/schema.py +0 -0
  584. /opik/evaluation/metrics/conversation/{user_frustration → llm_judges/session_completeness}/__init__.py +0 -0
  585. /opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/schema.py +0 -0
  586. /opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/schema.py +0 -0
  587. /opik/integrations/bedrock/{stream_wrappers.py → converse/stream_wrappers.py} +0 -0
  588. /opik/rest_api/{spans/types → types}/span_update_type.py +0 -0
  589. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/WHEEL +0 -0
  590. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/entry_points.txt +0 -0
  591. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/licenses/LICENSE +0 -0
  592. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,6 @@
2
2
 
3
3
  # isort: skip_file
4
4
 
5
- from .types import ExperimentWriteType
5
+ from .types import ExperimentUpdateStatus, ExperimentUpdateType, ExperimentWriteStatus, ExperimentWriteType
6
6
 
7
- __all__ = ["ExperimentWriteType"]
7
+ __all__ = ["ExperimentUpdateStatus", "ExperimentUpdateType", "ExperimentWriteStatus", "ExperimentWriteType"]
@@ -13,9 +13,15 @@ from ..types.experiment_item_bulk_record_experiment_item_bulk_write_view import
13
13
  from ..types.experiment_item_public import ExperimentItemPublic
14
14
  from ..types.experiment_page_public import ExperimentPagePublic
15
15
  from ..types.experiment_public import ExperimentPublic
16
- from ..types.json_node_write import JsonNodeWrite
16
+ from ..types.experiment_score import ExperimentScore
17
+ from ..types.experiment_score_write import ExperimentScoreWrite
18
+ from ..types.json_list_string_write import JsonListStringWrite
19
+ from ..types.json_node import JsonNode
17
20
  from ..types.prompt_version_link_write import PromptVersionLinkWrite
18
21
  from .raw_client import AsyncRawExperimentsClient, RawExperimentsClient
22
+ from .types.experiment_update_status import ExperimentUpdateStatus
23
+ from .types.experiment_update_type import ExperimentUpdateType
24
+ from .types.experiment_write_status import ExperimentWriteStatus
19
25
  from .types.experiment_write_type import ExperimentWriteType
20
26
 
21
27
  # this is used as the default value for optional parameters
@@ -112,9 +118,11 @@ class ExperimentsClient:
112
118
  dataset_name: str,
113
119
  id: typing.Optional[str] = OMIT,
114
120
  name: typing.Optional[str] = OMIT,
115
- metadata: typing.Optional[JsonNodeWrite] = OMIT,
121
+ metadata: typing.Optional[JsonListStringWrite] = OMIT,
116
122
  type: typing.Optional[ExperimentWriteType] = OMIT,
117
123
  optimization_id: typing.Optional[str] = OMIT,
124
+ status: typing.Optional[ExperimentWriteStatus] = OMIT,
125
+ experiment_scores: typing.Optional[typing.Sequence[ExperimentScoreWrite]] = OMIT,
118
126
  prompt_version: typing.Optional[PromptVersionLinkWrite] = OMIT,
119
127
  prompt_versions: typing.Optional[typing.Sequence[PromptVersionLinkWrite]] = OMIT,
120
128
  request_options: typing.Optional[RequestOptions] = None,
@@ -130,12 +138,16 @@ class ExperimentsClient:
130
138
 
131
139
  name : typing.Optional[str]
132
140
 
133
- metadata : typing.Optional[JsonNodeWrite]
141
+ metadata : typing.Optional[JsonListStringWrite]
134
142
 
135
143
  type : typing.Optional[ExperimentWriteType]
136
144
 
137
145
  optimization_id : typing.Optional[str]
138
146
 
147
+ status : typing.Optional[ExperimentWriteStatus]
148
+
149
+ experiment_scores : typing.Optional[typing.Sequence[ExperimentScoreWrite]]
150
+
139
151
  prompt_version : typing.Optional[PromptVersionLinkWrite]
140
152
 
141
153
  prompt_versions : typing.Optional[typing.Sequence[PromptVersionLinkWrite]]
@@ -160,6 +172,8 @@ class ExperimentsClient:
160
172
  metadata=metadata,
161
173
  type=type,
162
174
  optimization_id=optimization_id,
175
+ status=status,
176
+ experiment_scores=experiment_scores,
163
177
  prompt_version=prompt_version,
164
178
  prompt_versions=prompt_versions,
165
179
  request_options=request_options,
@@ -407,6 +421,32 @@ class ExperimentsClient:
407
421
  )
408
422
  return _response.data
409
423
 
424
+ def finish_experiments(
425
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
426
+ ) -> None:
427
+ """
428
+ Finish experiments and trigger alert events
429
+
430
+ Parameters
431
+ ----------
432
+ ids : typing.Sequence[str]
433
+
434
+ request_options : typing.Optional[RequestOptions]
435
+ Request-specific configuration.
436
+
437
+ Returns
438
+ -------
439
+ None
440
+
441
+ Examples
442
+ --------
443
+ from Opik import OpikApi
444
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
445
+ client.experiments.finish_experiments(ids=['ids'], )
446
+ """
447
+ _response = self._raw_client.finish_experiments(ids=ids, request_options=request_options)
448
+ return _response.data
449
+
410
450
  def get_experiment_by_id(
411
451
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
412
452
  ) -> ExperimentPublic:
@@ -434,6 +474,59 @@ class ExperimentsClient:
434
474
  _response = self._raw_client.get_experiment_by_id(id, request_options=request_options)
435
475
  return _response.data
436
476
 
477
+ def update_experiment(
478
+ self,
479
+ id: str,
480
+ *,
481
+ name: typing.Optional[str] = OMIT,
482
+ metadata: typing.Optional[JsonNode] = OMIT,
483
+ type: typing.Optional[ExperimentUpdateType] = OMIT,
484
+ status: typing.Optional[ExperimentUpdateStatus] = OMIT,
485
+ experiment_scores: typing.Optional[typing.Sequence[ExperimentScore]] = OMIT,
486
+ request_options: typing.Optional[RequestOptions] = None,
487
+ ) -> None:
488
+ """
489
+ Update experiment by id
490
+
491
+ Parameters
492
+ ----------
493
+ id : str
494
+
495
+ name : typing.Optional[str]
496
+
497
+ metadata : typing.Optional[JsonNode]
498
+
499
+ type : typing.Optional[ExperimentUpdateType]
500
+
501
+ status : typing.Optional[ExperimentUpdateStatus]
502
+ The status of the experiment
503
+
504
+ experiment_scores : typing.Optional[typing.Sequence[ExperimentScore]]
505
+
506
+ request_options : typing.Optional[RequestOptions]
507
+ Request-specific configuration.
508
+
509
+ Returns
510
+ -------
511
+ None
512
+
513
+ Examples
514
+ --------
515
+ from Opik import OpikApi
516
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
517
+ client.experiments.update_experiment(id='id', )
518
+ """
519
+ _response = self._raw_client.update_experiment(
520
+ id,
521
+ name=name,
522
+ metadata=metadata,
523
+ type=type,
524
+ status=status,
525
+ experiment_scores=experiment_scores,
526
+ request_options=request_options,
527
+ )
528
+ return _response.data
529
+
437
530
  def get_experiment_item_by_id(
438
531
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
439
532
  ) -> ExperimentItemPublic:
@@ -627,9 +720,11 @@ class AsyncExperimentsClient:
627
720
  dataset_name: str,
628
721
  id: typing.Optional[str] = OMIT,
629
722
  name: typing.Optional[str] = OMIT,
630
- metadata: typing.Optional[JsonNodeWrite] = OMIT,
723
+ metadata: typing.Optional[JsonListStringWrite] = OMIT,
631
724
  type: typing.Optional[ExperimentWriteType] = OMIT,
632
725
  optimization_id: typing.Optional[str] = OMIT,
726
+ status: typing.Optional[ExperimentWriteStatus] = OMIT,
727
+ experiment_scores: typing.Optional[typing.Sequence[ExperimentScoreWrite]] = OMIT,
633
728
  prompt_version: typing.Optional[PromptVersionLinkWrite] = OMIT,
634
729
  prompt_versions: typing.Optional[typing.Sequence[PromptVersionLinkWrite]] = OMIT,
635
730
  request_options: typing.Optional[RequestOptions] = None,
@@ -645,12 +740,16 @@ class AsyncExperimentsClient:
645
740
 
646
741
  name : typing.Optional[str]
647
742
 
648
- metadata : typing.Optional[JsonNodeWrite]
743
+ metadata : typing.Optional[JsonListStringWrite]
649
744
 
650
745
  type : typing.Optional[ExperimentWriteType]
651
746
 
652
747
  optimization_id : typing.Optional[str]
653
748
 
749
+ status : typing.Optional[ExperimentWriteStatus]
750
+
751
+ experiment_scores : typing.Optional[typing.Sequence[ExperimentScoreWrite]]
752
+
654
753
  prompt_version : typing.Optional[PromptVersionLinkWrite]
655
754
 
656
755
  prompt_versions : typing.Optional[typing.Sequence[PromptVersionLinkWrite]]
@@ -678,6 +777,8 @@ class AsyncExperimentsClient:
678
777
  metadata=metadata,
679
778
  type=type,
680
779
  optimization_id=optimization_id,
780
+ status=status,
781
+ experiment_scores=experiment_scores,
681
782
  prompt_version=prompt_version,
682
783
  prompt_versions=prompt_versions,
683
784
  request_options=request_options,
@@ -946,6 +1047,35 @@ class AsyncExperimentsClient:
946
1047
  )
947
1048
  return _response.data
948
1049
 
1050
+ async def finish_experiments(
1051
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
1052
+ ) -> None:
1053
+ """
1054
+ Finish experiments and trigger alert events
1055
+
1056
+ Parameters
1057
+ ----------
1058
+ ids : typing.Sequence[str]
1059
+
1060
+ request_options : typing.Optional[RequestOptions]
1061
+ Request-specific configuration.
1062
+
1063
+ Returns
1064
+ -------
1065
+ None
1066
+
1067
+ Examples
1068
+ --------
1069
+ from Opik import AsyncOpikApi
1070
+ import asyncio
1071
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1072
+ async def main() -> None:
1073
+ await client.experiments.finish_experiments(ids=['ids'], )
1074
+ asyncio.run(main())
1075
+ """
1076
+ _response = await self._raw_client.finish_experiments(ids=ids, request_options=request_options)
1077
+ return _response.data
1078
+
949
1079
  async def get_experiment_by_id(
950
1080
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
951
1081
  ) -> ExperimentPublic:
@@ -976,6 +1106,62 @@ class AsyncExperimentsClient:
976
1106
  _response = await self._raw_client.get_experiment_by_id(id, request_options=request_options)
977
1107
  return _response.data
978
1108
 
1109
+ async def update_experiment(
1110
+ self,
1111
+ id: str,
1112
+ *,
1113
+ name: typing.Optional[str] = OMIT,
1114
+ metadata: typing.Optional[JsonNode] = OMIT,
1115
+ type: typing.Optional[ExperimentUpdateType] = OMIT,
1116
+ status: typing.Optional[ExperimentUpdateStatus] = OMIT,
1117
+ experiment_scores: typing.Optional[typing.Sequence[ExperimentScore]] = OMIT,
1118
+ request_options: typing.Optional[RequestOptions] = None,
1119
+ ) -> None:
1120
+ """
1121
+ Update experiment by id
1122
+
1123
+ Parameters
1124
+ ----------
1125
+ id : str
1126
+
1127
+ name : typing.Optional[str]
1128
+
1129
+ metadata : typing.Optional[JsonNode]
1130
+
1131
+ type : typing.Optional[ExperimentUpdateType]
1132
+
1133
+ status : typing.Optional[ExperimentUpdateStatus]
1134
+ The status of the experiment
1135
+
1136
+ experiment_scores : typing.Optional[typing.Sequence[ExperimentScore]]
1137
+
1138
+ request_options : typing.Optional[RequestOptions]
1139
+ Request-specific configuration.
1140
+
1141
+ Returns
1142
+ -------
1143
+ None
1144
+
1145
+ Examples
1146
+ --------
1147
+ from Opik import AsyncOpikApi
1148
+ import asyncio
1149
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1150
+ async def main() -> None:
1151
+ await client.experiments.update_experiment(id='id', )
1152
+ asyncio.run(main())
1153
+ """
1154
+ _response = await self._raw_client.update_experiment(
1155
+ id,
1156
+ name=name,
1157
+ metadata=metadata,
1158
+ type=type,
1159
+ status=status,
1160
+ experiment_scores=experiment_scores,
1161
+ request_options=request_options,
1162
+ )
1163
+ return _response.data
1164
+
979
1165
  async def get_experiment_item_by_id(
980
1166
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
981
1167
  ) -> ExperimentItemPublic:
@@ -24,8 +24,14 @@ from ..types.experiment_item_bulk_record_experiment_item_bulk_write_view import
24
24
  from ..types.experiment_item_public import ExperimentItemPublic
25
25
  from ..types.experiment_page_public import ExperimentPagePublic
26
26
  from ..types.experiment_public import ExperimentPublic
27
- from ..types.json_node_write import JsonNodeWrite
27
+ from ..types.experiment_score import ExperimentScore
28
+ from ..types.experiment_score_write import ExperimentScoreWrite
29
+ from ..types.json_list_string_write import JsonListStringWrite
30
+ from ..types.json_node import JsonNode
28
31
  from ..types.prompt_version_link_write import PromptVersionLinkWrite
32
+ from .types.experiment_update_status import ExperimentUpdateStatus
33
+ from .types.experiment_update_type import ExperimentUpdateType
34
+ from .types.experiment_write_status import ExperimentWriteStatus
29
35
  from .types.experiment_write_type import ExperimentWriteType
30
36
 
31
37
  # this is used as the default value for optional parameters
@@ -133,9 +139,11 @@ class RawExperimentsClient:
133
139
  dataset_name: str,
134
140
  id: typing.Optional[str] = OMIT,
135
141
  name: typing.Optional[str] = OMIT,
136
- metadata: typing.Optional[JsonNodeWrite] = OMIT,
142
+ metadata: typing.Optional[JsonListStringWrite] = OMIT,
137
143
  type: typing.Optional[ExperimentWriteType] = OMIT,
138
144
  optimization_id: typing.Optional[str] = OMIT,
145
+ status: typing.Optional[ExperimentWriteStatus] = OMIT,
146
+ experiment_scores: typing.Optional[typing.Sequence[ExperimentScoreWrite]] = OMIT,
139
147
  prompt_version: typing.Optional[PromptVersionLinkWrite] = OMIT,
140
148
  prompt_versions: typing.Optional[typing.Sequence[PromptVersionLinkWrite]] = OMIT,
141
149
  request_options: typing.Optional[RequestOptions] = None,
@@ -151,12 +159,16 @@ class RawExperimentsClient:
151
159
 
152
160
  name : typing.Optional[str]
153
161
 
154
- metadata : typing.Optional[JsonNodeWrite]
162
+ metadata : typing.Optional[JsonListStringWrite]
155
163
 
156
164
  type : typing.Optional[ExperimentWriteType]
157
165
 
158
166
  optimization_id : typing.Optional[str]
159
167
 
168
+ status : typing.Optional[ExperimentWriteStatus]
169
+
170
+ experiment_scores : typing.Optional[typing.Sequence[ExperimentScoreWrite]]
171
+
160
172
  prompt_version : typing.Optional[PromptVersionLinkWrite]
161
173
 
162
174
  prompt_versions : typing.Optional[typing.Sequence[PromptVersionLinkWrite]]
@@ -175,9 +187,15 @@ class RawExperimentsClient:
175
187
  "id": id,
176
188
  "dataset_name": dataset_name,
177
189
  "name": name,
178
- "metadata": metadata,
190
+ "metadata": convert_and_respect_annotation_metadata(
191
+ object_=metadata, annotation=JsonListStringWrite, direction="write"
192
+ ),
179
193
  "type": type,
180
194
  "optimization_id": optimization_id,
195
+ "status": status,
196
+ "experiment_scores": convert_and_respect_annotation_metadata(
197
+ object_=experiment_scores, annotation=typing.Sequence[ExperimentScoreWrite], direction="write"
198
+ ),
181
199
  "prompt_version": convert_and_respect_annotation_metadata(
182
200
  object_=prompt_version, annotation=PromptVersionLinkWrite, direction="write"
183
201
  ),
@@ -580,6 +598,54 @@ class RawExperimentsClient:
580
598
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
581
599
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
582
600
 
601
+ def finish_experiments(
602
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
603
+ ) -> HttpResponse[None]:
604
+ """
605
+ Finish experiments and trigger alert events
606
+
607
+ Parameters
608
+ ----------
609
+ ids : typing.Sequence[str]
610
+
611
+ request_options : typing.Optional[RequestOptions]
612
+ Request-specific configuration.
613
+
614
+ Returns
615
+ -------
616
+ HttpResponse[None]
617
+ """
618
+ _response = self._client_wrapper.httpx_client.request(
619
+ "v1/private/experiments/finish",
620
+ method="POST",
621
+ json={
622
+ "ids": ids,
623
+ },
624
+ headers={
625
+ "content-type": "application/json",
626
+ },
627
+ request_options=request_options,
628
+ omit=OMIT,
629
+ )
630
+ try:
631
+ if 200 <= _response.status_code < 300:
632
+ return HttpResponse(response=_response, data=None)
633
+ if _response.status_code == 400:
634
+ raise BadRequestError(
635
+ headers=dict(_response.headers),
636
+ body=typing.cast(
637
+ typing.Optional[typing.Any],
638
+ parse_obj_as(
639
+ type_=typing.Optional[typing.Any], # type: ignore
640
+ object_=_response.json(),
641
+ ),
642
+ ),
643
+ )
644
+ _response_json = _response.json()
645
+ except JSONDecodeError:
646
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
647
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
648
+
583
649
  def get_experiment_by_id(
584
650
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
585
651
  ) -> HttpResponse[ExperimentPublic]:
@@ -629,6 +695,90 @@ class RawExperimentsClient:
629
695
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
630
696
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
631
697
 
698
+ def update_experiment(
699
+ self,
700
+ id: str,
701
+ *,
702
+ name: typing.Optional[str] = OMIT,
703
+ metadata: typing.Optional[JsonNode] = OMIT,
704
+ type: typing.Optional[ExperimentUpdateType] = OMIT,
705
+ status: typing.Optional[ExperimentUpdateStatus] = OMIT,
706
+ experiment_scores: typing.Optional[typing.Sequence[ExperimentScore]] = OMIT,
707
+ request_options: typing.Optional[RequestOptions] = None,
708
+ ) -> HttpResponse[None]:
709
+ """
710
+ Update experiment by id
711
+
712
+ Parameters
713
+ ----------
714
+ id : str
715
+
716
+ name : typing.Optional[str]
717
+
718
+ metadata : typing.Optional[JsonNode]
719
+
720
+ type : typing.Optional[ExperimentUpdateType]
721
+
722
+ status : typing.Optional[ExperimentUpdateStatus]
723
+ The status of the experiment
724
+
725
+ experiment_scores : typing.Optional[typing.Sequence[ExperimentScore]]
726
+
727
+ request_options : typing.Optional[RequestOptions]
728
+ Request-specific configuration.
729
+
730
+ Returns
731
+ -------
732
+ HttpResponse[None]
733
+ """
734
+ _response = self._client_wrapper.httpx_client.request(
735
+ f"v1/private/experiments/{jsonable_encoder(id)}",
736
+ method="PATCH",
737
+ json={
738
+ "name": name,
739
+ "metadata": metadata,
740
+ "type": type,
741
+ "status": status,
742
+ "experiment_scores": convert_and_respect_annotation_metadata(
743
+ object_=experiment_scores, annotation=typing.Sequence[ExperimentScore], direction="write"
744
+ ),
745
+ },
746
+ headers={
747
+ "content-type": "application/json",
748
+ },
749
+ request_options=request_options,
750
+ omit=OMIT,
751
+ )
752
+ try:
753
+ if 200 <= _response.status_code < 300:
754
+ return HttpResponse(response=_response, data=None)
755
+ if _response.status_code == 400:
756
+ raise BadRequestError(
757
+ headers=dict(_response.headers),
758
+ body=typing.cast(
759
+ typing.Optional[typing.Any],
760
+ parse_obj_as(
761
+ type_=typing.Optional[typing.Any], # type: ignore
762
+ object_=_response.json(),
763
+ ),
764
+ ),
765
+ )
766
+ if _response.status_code == 404:
767
+ raise NotFoundError(
768
+ headers=dict(_response.headers),
769
+ body=typing.cast(
770
+ typing.Optional[typing.Any],
771
+ parse_obj_as(
772
+ type_=typing.Optional[typing.Any], # type: ignore
773
+ object_=_response.json(),
774
+ ),
775
+ ),
776
+ )
777
+ _response_json = _response.json()
778
+ except JSONDecodeError:
779
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
780
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
781
+
632
782
  def get_experiment_item_by_id(
633
783
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
634
784
  ) -> HttpResponse[ExperimentItemPublic]:
@@ -905,9 +1055,11 @@ class AsyncRawExperimentsClient:
905
1055
  dataset_name: str,
906
1056
  id: typing.Optional[str] = OMIT,
907
1057
  name: typing.Optional[str] = OMIT,
908
- metadata: typing.Optional[JsonNodeWrite] = OMIT,
1058
+ metadata: typing.Optional[JsonListStringWrite] = OMIT,
909
1059
  type: typing.Optional[ExperimentWriteType] = OMIT,
910
1060
  optimization_id: typing.Optional[str] = OMIT,
1061
+ status: typing.Optional[ExperimentWriteStatus] = OMIT,
1062
+ experiment_scores: typing.Optional[typing.Sequence[ExperimentScoreWrite]] = OMIT,
911
1063
  prompt_version: typing.Optional[PromptVersionLinkWrite] = OMIT,
912
1064
  prompt_versions: typing.Optional[typing.Sequence[PromptVersionLinkWrite]] = OMIT,
913
1065
  request_options: typing.Optional[RequestOptions] = None,
@@ -923,12 +1075,16 @@ class AsyncRawExperimentsClient:
923
1075
 
924
1076
  name : typing.Optional[str]
925
1077
 
926
- metadata : typing.Optional[JsonNodeWrite]
1078
+ metadata : typing.Optional[JsonListStringWrite]
927
1079
 
928
1080
  type : typing.Optional[ExperimentWriteType]
929
1081
 
930
1082
  optimization_id : typing.Optional[str]
931
1083
 
1084
+ status : typing.Optional[ExperimentWriteStatus]
1085
+
1086
+ experiment_scores : typing.Optional[typing.Sequence[ExperimentScoreWrite]]
1087
+
932
1088
  prompt_version : typing.Optional[PromptVersionLinkWrite]
933
1089
 
934
1090
  prompt_versions : typing.Optional[typing.Sequence[PromptVersionLinkWrite]]
@@ -947,9 +1103,15 @@ class AsyncRawExperimentsClient:
947
1103
  "id": id,
948
1104
  "dataset_name": dataset_name,
949
1105
  "name": name,
950
- "metadata": metadata,
1106
+ "metadata": convert_and_respect_annotation_metadata(
1107
+ object_=metadata, annotation=JsonListStringWrite, direction="write"
1108
+ ),
951
1109
  "type": type,
952
1110
  "optimization_id": optimization_id,
1111
+ "status": status,
1112
+ "experiment_scores": convert_and_respect_annotation_metadata(
1113
+ object_=experiment_scores, annotation=typing.Sequence[ExperimentScoreWrite], direction="write"
1114
+ ),
953
1115
  "prompt_version": convert_and_respect_annotation_metadata(
954
1116
  object_=prompt_version, annotation=PromptVersionLinkWrite, direction="write"
955
1117
  ),
@@ -1352,6 +1514,54 @@ class AsyncRawExperimentsClient:
1352
1514
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1353
1515
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1354
1516
 
1517
+ async def finish_experiments(
1518
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
1519
+ ) -> AsyncHttpResponse[None]:
1520
+ """
1521
+ Finish experiments and trigger alert events
1522
+
1523
+ Parameters
1524
+ ----------
1525
+ ids : typing.Sequence[str]
1526
+
1527
+ request_options : typing.Optional[RequestOptions]
1528
+ Request-specific configuration.
1529
+
1530
+ Returns
1531
+ -------
1532
+ AsyncHttpResponse[None]
1533
+ """
1534
+ _response = await self._client_wrapper.httpx_client.request(
1535
+ "v1/private/experiments/finish",
1536
+ method="POST",
1537
+ json={
1538
+ "ids": ids,
1539
+ },
1540
+ headers={
1541
+ "content-type": "application/json",
1542
+ },
1543
+ request_options=request_options,
1544
+ omit=OMIT,
1545
+ )
1546
+ try:
1547
+ if 200 <= _response.status_code < 300:
1548
+ return AsyncHttpResponse(response=_response, data=None)
1549
+ if _response.status_code == 400:
1550
+ raise BadRequestError(
1551
+ headers=dict(_response.headers),
1552
+ body=typing.cast(
1553
+ typing.Optional[typing.Any],
1554
+ parse_obj_as(
1555
+ type_=typing.Optional[typing.Any], # type: ignore
1556
+ object_=_response.json(),
1557
+ ),
1558
+ ),
1559
+ )
1560
+ _response_json = _response.json()
1561
+ except JSONDecodeError:
1562
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1563
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1564
+
1355
1565
  async def get_experiment_by_id(
1356
1566
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
1357
1567
  ) -> AsyncHttpResponse[ExperimentPublic]:
@@ -1401,6 +1611,90 @@ class AsyncRawExperimentsClient:
1401
1611
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1402
1612
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1403
1613
 
1614
+ async def update_experiment(
1615
+ self,
1616
+ id: str,
1617
+ *,
1618
+ name: typing.Optional[str] = OMIT,
1619
+ metadata: typing.Optional[JsonNode] = OMIT,
1620
+ type: typing.Optional[ExperimentUpdateType] = OMIT,
1621
+ status: typing.Optional[ExperimentUpdateStatus] = OMIT,
1622
+ experiment_scores: typing.Optional[typing.Sequence[ExperimentScore]] = OMIT,
1623
+ request_options: typing.Optional[RequestOptions] = None,
1624
+ ) -> AsyncHttpResponse[None]:
1625
+ """
1626
+ Update experiment by id
1627
+
1628
+ Parameters
1629
+ ----------
1630
+ id : str
1631
+
1632
+ name : typing.Optional[str]
1633
+
1634
+ metadata : typing.Optional[JsonNode]
1635
+
1636
+ type : typing.Optional[ExperimentUpdateType]
1637
+
1638
+ status : typing.Optional[ExperimentUpdateStatus]
1639
+ The status of the experiment
1640
+
1641
+ experiment_scores : typing.Optional[typing.Sequence[ExperimentScore]]
1642
+
1643
+ request_options : typing.Optional[RequestOptions]
1644
+ Request-specific configuration.
1645
+
1646
+ Returns
1647
+ -------
1648
+ AsyncHttpResponse[None]
1649
+ """
1650
+ _response = await self._client_wrapper.httpx_client.request(
1651
+ f"v1/private/experiments/{jsonable_encoder(id)}",
1652
+ method="PATCH",
1653
+ json={
1654
+ "name": name,
1655
+ "metadata": metadata,
1656
+ "type": type,
1657
+ "status": status,
1658
+ "experiment_scores": convert_and_respect_annotation_metadata(
1659
+ object_=experiment_scores, annotation=typing.Sequence[ExperimentScore], direction="write"
1660
+ ),
1661
+ },
1662
+ headers={
1663
+ "content-type": "application/json",
1664
+ },
1665
+ request_options=request_options,
1666
+ omit=OMIT,
1667
+ )
1668
+ try:
1669
+ if 200 <= _response.status_code < 300:
1670
+ return AsyncHttpResponse(response=_response, data=None)
1671
+ if _response.status_code == 400:
1672
+ raise BadRequestError(
1673
+ headers=dict(_response.headers),
1674
+ body=typing.cast(
1675
+ typing.Optional[typing.Any],
1676
+ parse_obj_as(
1677
+ type_=typing.Optional[typing.Any], # type: ignore
1678
+ object_=_response.json(),
1679
+ ),
1680
+ ),
1681
+ )
1682
+ if _response.status_code == 404:
1683
+ raise NotFoundError(
1684
+ headers=dict(_response.headers),
1685
+ body=typing.cast(
1686
+ typing.Optional[typing.Any],
1687
+ parse_obj_as(
1688
+ type_=typing.Optional[typing.Any], # type: ignore
1689
+ object_=_response.json(),
1690
+ ),
1691
+ ),
1692
+ )
1693
+ _response_json = _response.json()
1694
+ except JSONDecodeError:
1695
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1696
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1697
+
1404
1698
  async def get_experiment_item_by_id(
1405
1699
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
1406
1700
  ) -> AsyncHttpResponse[ExperimentItemPublic]: