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,24 +1,19 @@
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.prompt_page_public import PromptPagePublic
7
- from ..core.pydantic_utilities import parse_obj_as
8
- from json.decoder import JSONDecodeError
9
- from ..core.api_error import ApiError
10
7
  from ..types.json_node_write import JsonNodeWrite
11
- from .types.prompt_write_type import PromptWriteType
12
- from ..errors.bad_request_error import BadRequestError
13
- from ..errors.conflict_error import ConflictError
14
- from ..errors.unprocessable_entity_error import UnprocessableEntityError
15
- from ..types.prompt_version_detail import PromptVersionDetail
16
- from ..core.serialization import convert_and_respect_annotation_metadata
17
8
  from ..types.prompt_detail import PromptDetail
18
- from ..core.jsonable_encoder import jsonable_encoder
19
- from ..errors.not_found_error import NotFoundError
9
+ from ..types.prompt_page_public import PromptPagePublic
10
+ from ..types.prompt_version_detail import PromptVersionDetail
20
11
  from ..types.prompt_version_page_public import PromptVersionPagePublic
21
- from ..core.client_wrapper import AsyncClientWrapper
12
+ from ..types.prompt_version_update import PromptVersionUpdate
13
+ from .raw_client import AsyncRawPromptsClient, RawPromptsClient
14
+ from .types.create_prompt_version_detail_template_structure import CreatePromptVersionDetailTemplateStructure
15
+ from .types.prompt_write_template_structure import PromptWriteTemplateStructure
16
+ from .types.prompt_write_type import PromptWriteType
22
17
 
23
18
  # this is used as the default value for optional parameters
24
19
  OMIT = typing.cast(typing.Any, ...)
@@ -26,7 +21,18 @@ OMIT = typing.cast(typing.Any, ...)
26
21
 
27
22
  class PromptsClient:
28
23
  def __init__(self, *, client_wrapper: SyncClientWrapper):
29
- self._client_wrapper = client_wrapper
24
+ self._raw_client = RawPromptsClient(client_wrapper=client_wrapper)
25
+
26
+ @property
27
+ def with_raw_response(self) -> RawPromptsClient:
28
+ """
29
+ Retrieves a raw implementation of this client that returns raw responses.
30
+
31
+ Returns
32
+ -------
33
+ RawPromptsClient
34
+ """
35
+ return self._raw_client
30
36
 
31
37
  def get_prompts(
32
38
  self,
@@ -34,6 +40,8 @@ class PromptsClient:
34
40
  page: typing.Optional[int] = None,
35
41
  size: typing.Optional[int] = None,
36
42
  name: typing.Optional[str] = None,
43
+ sorting: typing.Optional[str] = None,
44
+ filters: typing.Optional[str] = None,
37
45
  request_options: typing.Optional[RequestOptions] = None,
38
46
  ) -> PromptPagePublic:
39
47
  """
@@ -47,6 +55,10 @@ class PromptsClient:
47
55
 
48
56
  name : typing.Optional[str]
49
57
 
58
+ sorting : typing.Optional[str]
59
+
60
+ filters : typing.Optional[str]
61
+
50
62
  request_options : typing.Optional[RequestOptions]
51
63
  Request-specific configuration.
52
64
 
@@ -58,36 +70,13 @@ class PromptsClient:
58
70
  Examples
59
71
  --------
60
72
  from Opik import OpikApi
61
-
62
- client = OpikApi(
63
- api_key="YOUR_API_KEY",
64
- workspace_name="YOUR_WORKSPACE_NAME",
65
- )
73
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
66
74
  client.prompts.get_prompts()
67
75
  """
68
- _response = self._client_wrapper.httpx_client.request(
69
- "v1/private/prompts",
70
- method="GET",
71
- params={
72
- "page": page,
73
- "size": size,
74
- "name": name,
75
- },
76
- request_options=request_options,
76
+ _response = self._raw_client.get_prompts(
77
+ page=page, size=size, name=name, sorting=sorting, filters=filters, request_options=request_options
77
78
  )
78
- try:
79
- if 200 <= _response.status_code < 300:
80
- return typing.cast(
81
- PromptPagePublic,
82
- parse_obj_as(
83
- type_=PromptPagePublic, # type: ignore
84
- object_=_response.json(),
85
- ),
86
- )
87
- _response_json = _response.json()
88
- except JSONDecodeError:
89
- raise ApiError(status_code=_response.status_code, body=_response.text)
90
- raise ApiError(status_code=_response.status_code, body=_response_json)
79
+ return _response.data
91
80
 
92
81
  def create_prompt(
93
82
  self,
@@ -99,6 +88,8 @@ class PromptsClient:
99
88
  metadata: typing.Optional[JsonNodeWrite] = OMIT,
100
89
  change_description: typing.Optional[str] = OMIT,
101
90
  type: typing.Optional[PromptWriteType] = OMIT,
91
+ template_structure: typing.Optional[PromptWriteTemplateStructure] = OMIT,
92
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
102
93
  request_options: typing.Optional[RequestOptions] = None,
103
94
  ) -> None:
104
95
  """
@@ -120,6 +111,11 @@ class PromptsClient:
120
111
 
121
112
  type : typing.Optional[PromptWriteType]
122
113
 
114
+ template_structure : typing.Optional[PromptWriteTemplateStructure]
115
+ Template structure type: 'text' or 'chat'. Immutable after creation.
116
+
117
+ tags : typing.Optional[typing.Sequence[str]]
118
+
123
119
  request_options : typing.Optional[RequestOptions]
124
120
  Request-specific configuration.
125
121
 
@@ -130,76 +126,29 @@ class PromptsClient:
130
126
  Examples
131
127
  --------
132
128
  from Opik import OpikApi
133
-
134
- client = OpikApi(
135
- api_key="YOUR_API_KEY",
136
- workspace_name="YOUR_WORKSPACE_NAME",
137
- )
138
- client.prompts.create_prompt(
139
- name="name",
140
- )
141
- """
142
- _response = self._client_wrapper.httpx_client.request(
143
- "v1/private/prompts",
144
- method="POST",
145
- json={
146
- "id": id,
147
- "name": name,
148
- "description": description,
149
- "template": template,
150
- "metadata": metadata,
151
- "change_description": change_description,
152
- "type": type,
153
- },
154
- headers={
155
- "content-type": "application/json",
156
- },
129
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
130
+ client.prompts.create_prompt(name='name', )
131
+ """
132
+ _response = self._raw_client.create_prompt(
133
+ name=name,
134
+ id=id,
135
+ description=description,
136
+ template=template,
137
+ metadata=metadata,
138
+ change_description=change_description,
139
+ type=type,
140
+ template_structure=template_structure,
141
+ tags=tags,
157
142
  request_options=request_options,
158
- omit=OMIT,
159
143
  )
160
- try:
161
- if 200 <= _response.status_code < 300:
162
- return
163
- if _response.status_code == 400:
164
- raise BadRequestError(
165
- typing.cast(
166
- typing.Optional[typing.Any],
167
- parse_obj_as(
168
- type_=typing.Optional[typing.Any], # type: ignore
169
- object_=_response.json(),
170
- ),
171
- )
172
- )
173
- if _response.status_code == 409:
174
- raise ConflictError(
175
- typing.cast(
176
- typing.Optional[typing.Any],
177
- parse_obj_as(
178
- type_=typing.Optional[typing.Any], # type: ignore
179
- object_=_response.json(),
180
- ),
181
- )
182
- )
183
- if _response.status_code == 422:
184
- raise UnprocessableEntityError(
185
- typing.cast(
186
- typing.Optional[typing.Any],
187
- parse_obj_as(
188
- type_=typing.Optional[typing.Any], # type: ignore
189
- object_=_response.json(),
190
- ),
191
- )
192
- )
193
- _response_json = _response.json()
194
- except JSONDecodeError:
195
- raise ApiError(status_code=_response.status_code, body=_response.text)
196
- raise ApiError(status_code=_response.status_code, body=_response_json)
144
+ return _response.data
197
145
 
198
146
  def create_prompt_version(
199
147
  self,
200
148
  *,
201
149
  name: str,
202
150
  version: PromptVersionDetail,
151
+ template_structure: typing.Optional[CreatePromptVersionDetailTemplateStructure] = OMIT,
203
152
  request_options: typing.Optional[RequestOptions] = None,
204
153
  ) -> PromptVersionDetail:
205
154
  """
@@ -211,6 +160,9 @@ class PromptsClient:
211
160
 
212
161
  version : PromptVersionDetail
213
162
 
163
+ template_structure : typing.Optional[CreatePromptVersionDetailTemplateStructure]
164
+ Template structure for the prompt: 'text' or 'chat'. Note: This field is only used when creating a new prompt. If a prompt with the given name already exists, this field is ignored and the existing prompt's template structure is used. Template structure is immutable after prompt creation.
165
+
214
166
  request_options : typing.Optional[RequestOptions]
215
167
  Request-specific configuration.
216
168
 
@@ -221,81 +173,68 @@ class PromptsClient:
221
173
 
222
174
  Examples
223
175
  --------
224
- from Opik import OpikApi, PromptVersionDetail
225
-
226
- client = OpikApi(
227
- api_key="YOUR_API_KEY",
228
- workspace_name="YOUR_WORKSPACE_NAME",
229
- )
230
- client.prompts.create_prompt_version(
231
- name="name",
232
- version=PromptVersionDetail(
233
- template="template",
234
- ),
176
+ from Opik import OpikApi
177
+ from Opik import PromptVersionDetail
178
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
179
+ client.prompts.create_prompt_version(name='name', version=PromptVersionDetail(template='template', ), )
180
+ """
181
+ _response = self._raw_client.create_prompt_version(
182
+ name=name, version=version, template_structure=template_structure, request_options=request_options
235
183
  )
184
+ return _response.data
185
+
186
+ def update_prompt_versions(
187
+ self,
188
+ *,
189
+ ids: typing.Sequence[str],
190
+ update: PromptVersionUpdate,
191
+ merge_tags: typing.Optional[bool] = OMIT,
192
+ request_options: typing.Optional[RequestOptions] = None,
193
+ ) -> None:
236
194
  """
237
- _response = self._client_wrapper.httpx_client.request(
238
- "v1/private/prompts/versions",
239
- method="POST",
240
- json={
241
- "name": name,
242
- "version": convert_and_respect_annotation_metadata(
243
- object_=version, annotation=PromptVersionDetail, direction="write"
244
- ),
245
- },
246
- headers={
247
- "content-type": "application/json",
248
- },
249
- request_options=request_options,
250
- omit=OMIT,
195
+ Update one or more prompt versions.
196
+
197
+ Note: Prompt versions are immutable by design.
198
+ Only organizational properties, such as tags etc., can be updated.
199
+ Core properties like template and metadata cannot be modified after creation.
200
+
201
+ PATCH semantics:
202
+ - non-empty values update the field
203
+ - null values preserve existing field values (no change)
204
+ - empty values explicitly clear the field
205
+
206
+ Parameters
207
+ ----------
208
+ ids : typing.Sequence[str]
209
+ IDs of prompt versions to update
210
+
211
+ update : PromptVersionUpdate
212
+
213
+ merge_tags : typing.Optional[bool]
214
+ Tag merge behavior:
215
+ - true: Add new tags to existing tags (union)
216
+ - false: Replace all existing tags with new tags (default behaviour if not provided)
217
+
218
+ request_options : typing.Optional[RequestOptions]
219
+ Request-specific configuration.
220
+
221
+ Returns
222
+ -------
223
+ None
224
+
225
+ Examples
226
+ --------
227
+ from Opik import OpikApi
228
+ from Opik import PromptVersionUpdate
229
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
230
+ client.prompts.update_prompt_versions(ids=['ids'], update=PromptVersionUpdate(), )
231
+ """
232
+ _response = self._raw_client.update_prompt_versions(
233
+ ids=ids, update=update, merge_tags=merge_tags, request_options=request_options
251
234
  )
252
- try:
253
- if 200 <= _response.status_code < 300:
254
- return typing.cast(
255
- PromptVersionDetail,
256
- parse_obj_as(
257
- type_=PromptVersionDetail, # type: ignore
258
- object_=_response.json(),
259
- ),
260
- )
261
- if _response.status_code == 400:
262
- raise BadRequestError(
263
- typing.cast(
264
- typing.Optional[typing.Any],
265
- parse_obj_as(
266
- type_=typing.Optional[typing.Any], # type: ignore
267
- object_=_response.json(),
268
- ),
269
- )
270
- )
271
- if _response.status_code == 409:
272
- raise ConflictError(
273
- typing.cast(
274
- typing.Optional[typing.Any],
275
- parse_obj_as(
276
- type_=typing.Optional[typing.Any], # type: ignore
277
- object_=_response.json(),
278
- ),
279
- )
280
- )
281
- if _response.status_code == 422:
282
- raise UnprocessableEntityError(
283
- typing.cast(
284
- typing.Optional[typing.Any],
285
- parse_obj_as(
286
- type_=typing.Optional[typing.Any], # type: ignore
287
- object_=_response.json(),
288
- ),
289
- )
290
- )
291
- _response_json = _response.json()
292
- except JSONDecodeError:
293
- raise ApiError(status_code=_response.status_code, body=_response.text)
294
- raise ApiError(status_code=_response.status_code, body=_response_json)
295
-
296
- def get_prompt_by_id(
297
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
298
- ) -> PromptDetail:
235
+ return _response.data
236
+
237
+ def get_prompt_by_id(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> PromptDetail:
299
238
  """
300
239
  Get prompt by id
301
240
 
@@ -314,43 +253,11 @@ class PromptsClient:
314
253
  Examples
315
254
  --------
316
255
  from Opik import OpikApi
317
-
318
- client = OpikApi(
319
- api_key="YOUR_API_KEY",
320
- workspace_name="YOUR_WORKSPACE_NAME",
321
- )
322
- client.prompts.get_prompt_by_id(
323
- id="id",
324
- )
256
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
257
+ client.prompts.get_prompt_by_id(id='id', )
325
258
  """
326
- _response = self._client_wrapper.httpx_client.request(
327
- f"v1/private/prompts/{jsonable_encoder(id)}",
328
- method="GET",
329
- request_options=request_options,
330
- )
331
- try:
332
- if 200 <= _response.status_code < 300:
333
- return typing.cast(
334
- PromptDetail,
335
- parse_obj_as(
336
- type_=PromptDetail, # type: ignore
337
- object_=_response.json(),
338
- ),
339
- )
340
- if _response.status_code == 404:
341
- raise NotFoundError(
342
- typing.cast(
343
- typing.Optional[typing.Any],
344
- parse_obj_as(
345
- type_=typing.Optional[typing.Any], # type: ignore
346
- object_=_response.json(),
347
- ),
348
- )
349
- )
350
- _response_json = _response.json()
351
- except JSONDecodeError:
352
- raise ApiError(status_code=_response.status_code, body=_response.text)
353
- raise ApiError(status_code=_response.status_code, body=_response_json)
259
+ _response = self._raw_client.get_prompt_by_id(id, request_options=request_options)
260
+ return _response.data
354
261
 
355
262
  def update_prompt(
356
263
  self,
@@ -358,6 +265,7 @@ class PromptsClient:
358
265
  *,
359
266
  name: str,
360
267
  description: typing.Optional[str] = OMIT,
268
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
361
269
  request_options: typing.Optional[RequestOptions] = None,
362
270
  ) -> None:
363
271
  """
@@ -371,6 +279,8 @@ class PromptsClient:
371
279
 
372
280
  description : typing.Optional[str]
373
281
 
282
+ tags : typing.Optional[typing.Sequence[str]]
283
+
374
284
  request_options : typing.Optional[RequestOptions]
375
285
  Request-specific configuration.
376
286
 
@@ -381,80 +291,15 @@ class PromptsClient:
381
291
  Examples
382
292
  --------
383
293
  from Opik import OpikApi
384
-
385
- client = OpikApi(
386
- api_key="YOUR_API_KEY",
387
- workspace_name="YOUR_WORKSPACE_NAME",
388
- )
389
- client.prompts.update_prompt(
390
- id="id",
391
- name="name",
392
- )
294
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
295
+ client.prompts.update_prompt(id='id', name='name', )
393
296
  """
394
- _response = self._client_wrapper.httpx_client.request(
395
- f"v1/private/prompts/{jsonable_encoder(id)}",
396
- method="PUT",
397
- json={
398
- "name": name,
399
- "description": description,
400
- },
401
- headers={
402
- "content-type": "application/json",
403
- },
404
- request_options=request_options,
405
- omit=OMIT,
297
+ _response = self._raw_client.update_prompt(
298
+ id, name=name, description=description, tags=tags, request_options=request_options
406
299
  )
407
- try:
408
- if 200 <= _response.status_code < 300:
409
- return
410
- if _response.status_code == 400:
411
- raise BadRequestError(
412
- typing.cast(
413
- typing.Optional[typing.Any],
414
- parse_obj_as(
415
- type_=typing.Optional[typing.Any], # type: ignore
416
- object_=_response.json(),
417
- ),
418
- )
419
- )
420
- if _response.status_code == 404:
421
- raise NotFoundError(
422
- typing.cast(
423
- typing.Optional[typing.Any],
424
- parse_obj_as(
425
- type_=typing.Optional[typing.Any], # type: ignore
426
- object_=_response.json(),
427
- ),
428
- )
429
- )
430
- if _response.status_code == 409:
431
- raise ConflictError(
432
- typing.cast(
433
- typing.Optional[typing.Any],
434
- parse_obj_as(
435
- type_=typing.Optional[typing.Any], # type: ignore
436
- object_=_response.json(),
437
- ),
438
- )
439
- )
440
- if _response.status_code == 422:
441
- raise UnprocessableEntityError(
442
- typing.cast(
443
- typing.Optional[typing.Any],
444
- parse_obj_as(
445
- type_=typing.Optional[typing.Any], # type: ignore
446
- object_=_response.json(),
447
- ),
448
- )
449
- )
450
- _response_json = _response.json()
451
- except JSONDecodeError:
452
- raise ApiError(status_code=_response.status_code, body=_response.text)
453
- raise ApiError(status_code=_response.status_code, body=_response_json)
454
-
455
- def delete_prompt(
456
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
457
- ) -> None:
300
+ return _response.data
301
+
302
+ def delete_prompt(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
458
303
  """
459
304
  Delete prompt
460
305
 
@@ -472,33 +317,14 @@ class PromptsClient:
472
317
  Examples
473
318
  --------
474
319
  from Opik import OpikApi
475
-
476
- client = OpikApi(
477
- api_key="YOUR_API_KEY",
478
- workspace_name="YOUR_WORKSPACE_NAME",
479
- )
480
- client.prompts.delete_prompt(
481
- id="id",
482
- )
320
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
321
+ client.prompts.delete_prompt(id='id', )
483
322
  """
484
- _response = self._client_wrapper.httpx_client.request(
485
- f"v1/private/prompts/{jsonable_encoder(id)}",
486
- method="DELETE",
487
- request_options=request_options,
488
- )
489
- try:
490
- if 200 <= _response.status_code < 300:
491
- return
492
- _response_json = _response.json()
493
- except JSONDecodeError:
494
- raise ApiError(status_code=_response.status_code, body=_response.text)
495
- raise ApiError(status_code=_response.status_code, body=_response_json)
323
+ _response = self._raw_client.delete_prompt(id, request_options=request_options)
324
+ return _response.data
496
325
 
497
326
  def delete_prompts_batch(
498
- self,
499
- *,
500
- ids: typing.Sequence[str],
501
- request_options: typing.Optional[RequestOptions] = None,
327
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
502
328
  ) -> None:
503
329
  """
504
330
  Delete prompts batch
@@ -517,37 +343,14 @@ class PromptsClient:
517
343
  Examples
518
344
  --------
519
345
  from Opik import OpikApi
520
-
521
- client = OpikApi(
522
- api_key="YOUR_API_KEY",
523
- workspace_name="YOUR_WORKSPACE_NAME",
524
- )
525
- client.prompts.delete_prompts_batch(
526
- ids=["ids"],
527
- )
346
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
347
+ client.prompts.delete_prompts_batch(ids=['ids'], )
528
348
  """
529
- _response = self._client_wrapper.httpx_client.request(
530
- "v1/private/prompts/delete",
531
- method="POST",
532
- json={
533
- "ids": ids,
534
- },
535
- request_options=request_options,
536
- omit=OMIT,
537
- )
538
- try:
539
- if 200 <= _response.status_code < 300:
540
- return
541
- _response_json = _response.json()
542
- except JSONDecodeError:
543
- raise ApiError(status_code=_response.status_code, body=_response.text)
544
- raise ApiError(status_code=_response.status_code, body=_response_json)
349
+ _response = self._raw_client.delete_prompts_batch(ids=ids, request_options=request_options)
350
+ return _response.data
545
351
 
546
352
  def get_prompt_version_by_id(
547
- self,
548
- version_id: str,
549
- *,
550
- request_options: typing.Optional[RequestOptions] = None,
353
+ self, version_id: str, *, request_options: typing.Optional[RequestOptions] = None
551
354
  ) -> PromptVersionDetail:
552
355
  """
553
356
  Get prompt version by id
@@ -567,43 +370,11 @@ class PromptsClient:
567
370
  Examples
568
371
  --------
569
372
  from Opik import OpikApi
570
-
571
- client = OpikApi(
572
- api_key="YOUR_API_KEY",
573
- workspace_name="YOUR_WORKSPACE_NAME",
574
- )
575
- client.prompts.get_prompt_version_by_id(
576
- version_id="versionId",
577
- )
373
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
374
+ client.prompts.get_prompt_version_by_id(version_id='versionId', )
578
375
  """
579
- _response = self._client_wrapper.httpx_client.request(
580
- f"v1/private/prompts/versions/{jsonable_encoder(version_id)}",
581
- method="GET",
582
- request_options=request_options,
583
- )
584
- try:
585
- if 200 <= _response.status_code < 300:
586
- return typing.cast(
587
- PromptVersionDetail,
588
- parse_obj_as(
589
- type_=PromptVersionDetail, # type: ignore
590
- object_=_response.json(),
591
- ),
592
- )
593
- if _response.status_code == 404:
594
- raise NotFoundError(
595
- typing.cast(
596
- typing.Optional[typing.Any],
597
- parse_obj_as(
598
- type_=typing.Optional[typing.Any], # type: ignore
599
- object_=_response.json(),
600
- ),
601
- )
602
- )
603
- _response_json = _response.json()
604
- except JSONDecodeError:
605
- raise ApiError(status_code=_response.status_code, body=_response.text)
606
- raise ApiError(status_code=_response.status_code, body=_response_json)
376
+ _response = self._raw_client.get_prompt_version_by_id(version_id, request_options=request_options)
377
+ return _response.data
607
378
 
608
379
  def get_prompt_versions(
609
380
  self,
@@ -611,6 +382,9 @@ class PromptsClient:
611
382
  *,
612
383
  page: typing.Optional[int] = None,
613
384
  size: typing.Optional[int] = None,
385
+ search: typing.Optional[str] = None,
386
+ sorting: typing.Optional[str] = None,
387
+ filters: typing.Optional[str] = None,
614
388
  request_options: typing.Optional[RequestOptions] = None,
615
389
  ) -> PromptVersionPagePublic:
616
390
  """
@@ -624,6 +398,13 @@ class PromptsClient:
624
398
 
625
399
  size : typing.Optional[int]
626
400
 
401
+ search : typing.Optional[str]
402
+ Search text to find in template or change description fields
403
+
404
+ sorting : typing.Optional[str]
405
+
406
+ filters : typing.Optional[str]
407
+
627
408
  request_options : typing.Optional[RequestOptions]
628
409
  Request-specific configuration.
629
410
 
@@ -635,44 +416,45 @@ class PromptsClient:
635
416
  Examples
636
417
  --------
637
418
  from Opik import OpikApi
638
-
639
- client = OpikApi(
640
- api_key="YOUR_API_KEY",
641
- workspace_name="YOUR_WORKSPACE_NAME",
642
- )
643
- client.prompts.get_prompt_versions(
644
- id="id",
645
- )
419
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
420
+ client.prompts.get_prompt_versions(id='id', )
646
421
  """
647
- _response = self._client_wrapper.httpx_client.request(
648
- f"v1/private/prompts/{jsonable_encoder(id)}/versions",
649
- method="GET",
650
- params={
651
- "page": page,
652
- "size": size,
653
- },
654
- request_options=request_options,
422
+ _response = self._raw_client.get_prompt_versions(
423
+ id, page=page, size=size, search=search, sorting=sorting, filters=filters, request_options=request_options
655
424
  )
656
- try:
657
- if 200 <= _response.status_code < 300:
658
- return typing.cast(
659
- PromptVersionPagePublic,
660
- parse_obj_as(
661
- type_=PromptVersionPagePublic, # 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)
425
+ return _response.data
426
+
427
+ def restore_prompt_version(
428
+ self, prompt_id: str, version_id: str, *, request_options: typing.Optional[RequestOptions] = None
429
+ ) -> PromptVersionDetail:
430
+ """
431
+ Restore a prompt version by creating a new version with the content from the specified version
432
+
433
+ Parameters
434
+ ----------
435
+ prompt_id : str
436
+
437
+ version_id : str
438
+
439
+ request_options : typing.Optional[RequestOptions]
440
+ Request-specific configuration.
441
+
442
+ Returns
443
+ -------
444
+ PromptVersionDetail
445
+ OK
446
+
447
+ Examples
448
+ --------
449
+ from Opik import OpikApi
450
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
451
+ client.prompts.restore_prompt_version(prompt_id='promptId', version_id='versionId', )
452
+ """
453
+ _response = self._raw_client.restore_prompt_version(prompt_id, version_id, request_options=request_options)
454
+ return _response.data
669
455
 
670
456
  def retrieve_prompt_version(
671
- self,
672
- *,
673
- name: str,
674
- commit: typing.Optional[str] = OMIT,
675
- request_options: typing.Optional[RequestOptions] = None,
457
+ self, *, name: str, commit: typing.Optional[str] = OMIT, request_options: typing.Optional[RequestOptions] = None
676
458
  ) -> PromptVersionDetail:
677
459
  """
678
460
  Retrieve prompt version
@@ -694,76 +476,27 @@ class PromptsClient:
694
476
  Examples
695
477
  --------
696
478
  from Opik import OpikApi
697
-
698
- client = OpikApi(
699
- api_key="YOUR_API_KEY",
700
- workspace_name="YOUR_WORKSPACE_NAME",
701
- )
702
- client.prompts.retrieve_prompt_version(
703
- name="name",
704
- )
479
+ client = OpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
480
+ client.prompts.retrieve_prompt_version(name='name', )
705
481
  """
706
- _response = self._client_wrapper.httpx_client.request(
707
- "v1/private/prompts/versions/retrieve",
708
- method="POST",
709
- json={
710
- "name": name,
711
- "commit": commit,
712
- },
713
- headers={
714
- "content-type": "application/json",
715
- },
716
- request_options=request_options,
717
- omit=OMIT,
718
- )
719
- try:
720
- if 200 <= _response.status_code < 300:
721
- return typing.cast(
722
- PromptVersionDetail,
723
- parse_obj_as(
724
- type_=PromptVersionDetail, # type: ignore
725
- object_=_response.json(),
726
- ),
727
- )
728
- if _response.status_code == 400:
729
- raise BadRequestError(
730
- typing.cast(
731
- typing.Optional[typing.Any],
732
- parse_obj_as(
733
- type_=typing.Optional[typing.Any], # type: ignore
734
- object_=_response.json(),
735
- ),
736
- )
737
- )
738
- if _response.status_code == 404:
739
- raise NotFoundError(
740
- typing.cast(
741
- typing.Optional[typing.Any],
742
- parse_obj_as(
743
- type_=typing.Optional[typing.Any], # type: ignore
744
- object_=_response.json(),
745
- ),
746
- )
747
- )
748
- if _response.status_code == 422:
749
- raise UnprocessableEntityError(
750
- typing.cast(
751
- typing.Optional[typing.Any],
752
- parse_obj_as(
753
- type_=typing.Optional[typing.Any], # type: ignore
754
- object_=_response.json(),
755
- ),
756
- )
757
- )
758
- _response_json = _response.json()
759
- except JSONDecodeError:
760
- raise ApiError(status_code=_response.status_code, body=_response.text)
761
- raise ApiError(status_code=_response.status_code, body=_response_json)
482
+ _response = self._raw_client.retrieve_prompt_version(name=name, commit=commit, request_options=request_options)
483
+ return _response.data
762
484
 
763
485
 
764
486
  class AsyncPromptsClient:
765
487
  def __init__(self, *, client_wrapper: AsyncClientWrapper):
766
- self._client_wrapper = client_wrapper
488
+ self._raw_client = AsyncRawPromptsClient(client_wrapper=client_wrapper)
489
+
490
+ @property
491
+ def with_raw_response(self) -> AsyncRawPromptsClient:
492
+ """
493
+ Retrieves a raw implementation of this client that returns raw responses.
494
+
495
+ Returns
496
+ -------
497
+ AsyncRawPromptsClient
498
+ """
499
+ return self._raw_client
767
500
 
768
501
  async def get_prompts(
769
502
  self,
@@ -771,6 +504,8 @@ class AsyncPromptsClient:
771
504
  page: typing.Optional[int] = None,
772
505
  size: typing.Optional[int] = None,
773
506
  name: typing.Optional[str] = None,
507
+ sorting: typing.Optional[str] = None,
508
+ filters: typing.Optional[str] = None,
774
509
  request_options: typing.Optional[RequestOptions] = None,
775
510
  ) -> PromptPagePublic:
776
511
  """
@@ -784,6 +519,10 @@ class AsyncPromptsClient:
784
519
 
785
520
  name : typing.Optional[str]
786
521
 
522
+ sorting : typing.Optional[str]
523
+
524
+ filters : typing.Optional[str]
525
+
787
526
  request_options : typing.Optional[RequestOptions]
788
527
  Request-specific configuration.
789
528
 
@@ -794,45 +533,17 @@ class AsyncPromptsClient:
794
533
 
795
534
  Examples
796
535
  --------
797
- import asyncio
798
-
799
536
  from Opik import AsyncOpikApi
800
-
801
- client = AsyncOpikApi(
802
- api_key="YOUR_API_KEY",
803
- workspace_name="YOUR_WORKSPACE_NAME",
804
- )
805
-
806
-
537
+ import asyncio
538
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
807
539
  async def main() -> None:
808
540
  await client.prompts.get_prompts()
809
-
810
-
811
541
  asyncio.run(main())
812
542
  """
813
- _response = await self._client_wrapper.httpx_client.request(
814
- "v1/private/prompts",
815
- method="GET",
816
- params={
817
- "page": page,
818
- "size": size,
819
- "name": name,
820
- },
821
- request_options=request_options,
543
+ _response = await self._raw_client.get_prompts(
544
+ page=page, size=size, name=name, sorting=sorting, filters=filters, request_options=request_options
822
545
  )
823
- try:
824
- if 200 <= _response.status_code < 300:
825
- return typing.cast(
826
- PromptPagePublic,
827
- parse_obj_as(
828
- type_=PromptPagePublic, # type: ignore
829
- object_=_response.json(),
830
- ),
831
- )
832
- _response_json = _response.json()
833
- except JSONDecodeError:
834
- raise ApiError(status_code=_response.status_code, body=_response.text)
835
- raise ApiError(status_code=_response.status_code, body=_response_json)
546
+ return _response.data
836
547
 
837
548
  async def create_prompt(
838
549
  self,
@@ -844,6 +555,8 @@ class AsyncPromptsClient:
844
555
  metadata: typing.Optional[JsonNodeWrite] = OMIT,
845
556
  change_description: typing.Optional[str] = OMIT,
846
557
  type: typing.Optional[PromptWriteType] = OMIT,
558
+ template_structure: typing.Optional[PromptWriteTemplateStructure] = OMIT,
559
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
847
560
  request_options: typing.Optional[RequestOptions] = None,
848
561
  ) -> None:
849
562
  """
@@ -865,6 +578,11 @@ class AsyncPromptsClient:
865
578
 
866
579
  type : typing.Optional[PromptWriteType]
867
580
 
581
+ template_structure : typing.Optional[PromptWriteTemplateStructure]
582
+ Template structure type: 'text' or 'chat'. Immutable after creation.
583
+
584
+ tags : typing.Optional[typing.Sequence[str]]
585
+
868
586
  request_options : typing.Optional[RequestOptions]
869
587
  Request-specific configuration.
870
588
 
@@ -874,85 +592,33 @@ class AsyncPromptsClient:
874
592
 
875
593
  Examples
876
594
  --------
877
- import asyncio
878
-
879
595
  from Opik import AsyncOpikApi
880
-
881
- client = AsyncOpikApi(
882
- api_key="YOUR_API_KEY",
883
- workspace_name="YOUR_WORKSPACE_NAME",
884
- )
885
-
886
-
596
+ import asyncio
597
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
887
598
  async def main() -> None:
888
- await client.prompts.create_prompt(
889
- name="name",
890
- )
891
-
892
-
599
+ await client.prompts.create_prompt(name='name', )
893
600
  asyncio.run(main())
894
601
  """
895
- _response = await self._client_wrapper.httpx_client.request(
896
- "v1/private/prompts",
897
- method="POST",
898
- json={
899
- "id": id,
900
- "name": name,
901
- "description": description,
902
- "template": template,
903
- "metadata": metadata,
904
- "change_description": change_description,
905
- "type": type,
906
- },
907
- headers={
908
- "content-type": "application/json",
909
- },
602
+ _response = await self._raw_client.create_prompt(
603
+ name=name,
604
+ id=id,
605
+ description=description,
606
+ template=template,
607
+ metadata=metadata,
608
+ change_description=change_description,
609
+ type=type,
610
+ template_structure=template_structure,
611
+ tags=tags,
910
612
  request_options=request_options,
911
- omit=OMIT,
912
613
  )
913
- try:
914
- if 200 <= _response.status_code < 300:
915
- return
916
- if _response.status_code == 400:
917
- raise BadRequestError(
918
- typing.cast(
919
- typing.Optional[typing.Any],
920
- parse_obj_as(
921
- type_=typing.Optional[typing.Any], # type: ignore
922
- object_=_response.json(),
923
- ),
924
- )
925
- )
926
- if _response.status_code == 409:
927
- raise ConflictError(
928
- typing.cast(
929
- typing.Optional[typing.Any],
930
- parse_obj_as(
931
- type_=typing.Optional[typing.Any], # type: ignore
932
- object_=_response.json(),
933
- ),
934
- )
935
- )
936
- if _response.status_code == 422:
937
- raise UnprocessableEntityError(
938
- typing.cast(
939
- typing.Optional[typing.Any],
940
- parse_obj_as(
941
- type_=typing.Optional[typing.Any], # type: ignore
942
- object_=_response.json(),
943
- ),
944
- )
945
- )
946
- _response_json = _response.json()
947
- except JSONDecodeError:
948
- raise ApiError(status_code=_response.status_code, body=_response.text)
949
- raise ApiError(status_code=_response.status_code, body=_response_json)
614
+ return _response.data
950
615
 
951
616
  async def create_prompt_version(
952
617
  self,
953
618
  *,
954
619
  name: str,
955
620
  version: PromptVersionDetail,
621
+ template_structure: typing.Optional[CreatePromptVersionDetailTemplateStructure] = OMIT,
956
622
  request_options: typing.Optional[RequestOptions] = None,
957
623
  ) -> PromptVersionDetail:
958
624
  """
@@ -964,6 +630,9 @@ class AsyncPromptsClient:
964
630
 
965
631
  version : PromptVersionDetail
966
632
 
633
+ template_structure : typing.Optional[CreatePromptVersionDetailTemplateStructure]
634
+ Template structure for the prompt: 'text' or 'chat'. Note: This field is only used when creating a new prompt. If a prompt with the given name already exists, this field is ignored and the existing prompt's template structure is used. Template structure is immutable after prompt creation.
635
+
967
636
  request_options : typing.Optional[RequestOptions]
968
637
  Request-specific configuration.
969
638
 
@@ -974,85 +643,72 @@ class AsyncPromptsClient:
974
643
 
975
644
  Examples
976
645
  --------
646
+ from Opik import AsyncOpikApi
647
+ from Opik import PromptVersionDetail
977
648
  import asyncio
649
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
650
+ async def main() -> None:
651
+ await client.prompts.create_prompt_version(name='name', version=PromptVersionDetail(template='template', ), )
652
+ asyncio.run(main())
653
+ """
654
+ _response = await self._raw_client.create_prompt_version(
655
+ name=name, version=version, template_structure=template_structure, request_options=request_options
656
+ )
657
+ return _response.data
658
+
659
+ async def update_prompt_versions(
660
+ self,
661
+ *,
662
+ ids: typing.Sequence[str],
663
+ update: PromptVersionUpdate,
664
+ merge_tags: typing.Optional[bool] = OMIT,
665
+ request_options: typing.Optional[RequestOptions] = None,
666
+ ) -> None:
667
+ """
668
+ Update one or more prompt versions.
978
669
 
979
- from Opik import AsyncOpikApi, PromptVersionDetail
670
+ Note: Prompt versions are immutable by design.
671
+ Only organizational properties, such as tags etc., can be updated.
672
+ Core properties like template and metadata cannot be modified after creation.
980
673
 
981
- client = AsyncOpikApi(
982
- api_key="YOUR_API_KEY",
983
- workspace_name="YOUR_WORKSPACE_NAME",
984
- )
674
+ PATCH semantics:
675
+ - non-empty values update the field
676
+ - null values preserve existing field values (no change)
677
+ - empty values explicitly clear the field
985
678
 
679
+ Parameters
680
+ ----------
681
+ ids : typing.Sequence[str]
682
+ IDs of prompt versions to update
986
683
 
987
- async def main() -> None:
988
- await client.prompts.create_prompt_version(
989
- name="name",
990
- version=PromptVersionDetail(
991
- template="template",
992
- ),
993
- )
684
+ update : PromptVersionUpdate
994
685
 
686
+ merge_tags : typing.Optional[bool]
687
+ Tag merge behavior:
688
+ - true: Add new tags to existing tags (union)
689
+ - false: Replace all existing tags with new tags (default behaviour if not provided)
995
690
 
691
+ request_options : typing.Optional[RequestOptions]
692
+ Request-specific configuration.
693
+
694
+ Returns
695
+ -------
696
+ None
697
+
698
+ Examples
699
+ --------
700
+ from Opik import AsyncOpikApi
701
+ from Opik import PromptVersionUpdate
702
+ import asyncio
703
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
704
+ async def main() -> None:
705
+ await client.prompts.update_prompt_versions(ids=['ids'], update=PromptVersionUpdate(), )
996
706
  asyncio.run(main())
997
707
  """
998
- _response = await self._client_wrapper.httpx_client.request(
999
- "v1/private/prompts/versions",
1000
- method="POST",
1001
- json={
1002
- "name": name,
1003
- "version": convert_and_respect_annotation_metadata(
1004
- object_=version, annotation=PromptVersionDetail, direction="write"
1005
- ),
1006
- },
1007
- headers={
1008
- "content-type": "application/json",
1009
- },
1010
- request_options=request_options,
1011
- omit=OMIT,
708
+ _response = await self._raw_client.update_prompt_versions(
709
+ ids=ids, update=update, merge_tags=merge_tags, request_options=request_options
1012
710
  )
1013
- try:
1014
- if 200 <= _response.status_code < 300:
1015
- return typing.cast(
1016
- PromptVersionDetail,
1017
- parse_obj_as(
1018
- type_=PromptVersionDetail, # type: ignore
1019
- object_=_response.json(),
1020
- ),
1021
- )
1022
- if _response.status_code == 400:
1023
- raise BadRequestError(
1024
- typing.cast(
1025
- typing.Optional[typing.Any],
1026
- parse_obj_as(
1027
- type_=typing.Optional[typing.Any], # type: ignore
1028
- object_=_response.json(),
1029
- ),
1030
- )
1031
- )
1032
- if _response.status_code == 409:
1033
- raise ConflictError(
1034
- typing.cast(
1035
- typing.Optional[typing.Any],
1036
- parse_obj_as(
1037
- type_=typing.Optional[typing.Any], # type: ignore
1038
- object_=_response.json(),
1039
- ),
1040
- )
1041
- )
1042
- if _response.status_code == 422:
1043
- raise UnprocessableEntityError(
1044
- typing.cast(
1045
- typing.Optional[typing.Any],
1046
- parse_obj_as(
1047
- type_=typing.Optional[typing.Any], # type: ignore
1048
- object_=_response.json(),
1049
- ),
1050
- )
1051
- )
1052
- _response_json = _response.json()
1053
- except JSONDecodeError:
1054
- raise ApiError(status_code=_response.status_code, body=_response.text)
1055
- raise ApiError(status_code=_response.status_code, body=_response_json)
711
+ return _response.data
1056
712
 
1057
713
  async def get_prompt_by_id(
1058
714
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
@@ -1074,52 +730,15 @@ class AsyncPromptsClient:
1074
730
 
1075
731
  Examples
1076
732
  --------
1077
- import asyncio
1078
-
1079
733
  from Opik import AsyncOpikApi
1080
-
1081
- client = AsyncOpikApi(
1082
- api_key="YOUR_API_KEY",
1083
- workspace_name="YOUR_WORKSPACE_NAME",
1084
- )
1085
-
1086
-
734
+ import asyncio
735
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1087
736
  async def main() -> None:
1088
- await client.prompts.get_prompt_by_id(
1089
- id="id",
1090
- )
1091
-
1092
-
737
+ await client.prompts.get_prompt_by_id(id='id', )
1093
738
  asyncio.run(main())
1094
739
  """
1095
- _response = await self._client_wrapper.httpx_client.request(
1096
- f"v1/private/prompts/{jsonable_encoder(id)}",
1097
- method="GET",
1098
- request_options=request_options,
1099
- )
1100
- try:
1101
- if 200 <= _response.status_code < 300:
1102
- return typing.cast(
1103
- PromptDetail,
1104
- parse_obj_as(
1105
- type_=PromptDetail, # type: ignore
1106
- object_=_response.json(),
1107
- ),
1108
- )
1109
- if _response.status_code == 404:
1110
- raise NotFoundError(
1111
- typing.cast(
1112
- typing.Optional[typing.Any],
1113
- parse_obj_as(
1114
- type_=typing.Optional[typing.Any], # type: ignore
1115
- object_=_response.json(),
1116
- ),
1117
- )
1118
- )
1119
- _response_json = _response.json()
1120
- except JSONDecodeError:
1121
- raise ApiError(status_code=_response.status_code, body=_response.text)
1122
- raise ApiError(status_code=_response.status_code, body=_response_json)
740
+ _response = await self._raw_client.get_prompt_by_id(id, request_options=request_options)
741
+ return _response.data
1123
742
 
1124
743
  async def update_prompt(
1125
744
  self,
@@ -1127,6 +746,7 @@ class AsyncPromptsClient:
1127
746
  *,
1128
747
  name: str,
1129
748
  description: typing.Optional[str] = OMIT,
749
+ tags: typing.Optional[typing.Sequence[str]] = OMIT,
1130
750
  request_options: typing.Optional[RequestOptions] = None,
1131
751
  ) -> None:
1132
752
  """
@@ -1140,6 +760,8 @@ class AsyncPromptsClient:
1140
760
 
1141
761
  description : typing.Optional[str]
1142
762
 
763
+ tags : typing.Optional[typing.Sequence[str]]
764
+
1143
765
  request_options : typing.Optional[RequestOptions]
1144
766
  Request-specific configuration.
1145
767
 
@@ -1149,89 +771,19 @@ class AsyncPromptsClient:
1149
771
 
1150
772
  Examples
1151
773
  --------
1152
- import asyncio
1153
-
1154
774
  from Opik import AsyncOpikApi
1155
-
1156
- client = AsyncOpikApi(
1157
- api_key="YOUR_API_KEY",
1158
- workspace_name="YOUR_WORKSPACE_NAME",
1159
- )
1160
-
1161
-
775
+ import asyncio
776
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1162
777
  async def main() -> None:
1163
- await client.prompts.update_prompt(
1164
- id="id",
1165
- name="name",
1166
- )
1167
-
1168
-
778
+ await client.prompts.update_prompt(id='id', name='name', )
1169
779
  asyncio.run(main())
1170
780
  """
1171
- _response = await self._client_wrapper.httpx_client.request(
1172
- f"v1/private/prompts/{jsonable_encoder(id)}",
1173
- method="PUT",
1174
- json={
1175
- "name": name,
1176
- "description": description,
1177
- },
1178
- headers={
1179
- "content-type": "application/json",
1180
- },
1181
- request_options=request_options,
1182
- omit=OMIT,
781
+ _response = await self._raw_client.update_prompt(
782
+ id, name=name, description=description, tags=tags, request_options=request_options
1183
783
  )
1184
- try:
1185
- if 200 <= _response.status_code < 300:
1186
- return
1187
- if _response.status_code == 400:
1188
- raise BadRequestError(
1189
- typing.cast(
1190
- typing.Optional[typing.Any],
1191
- parse_obj_as(
1192
- type_=typing.Optional[typing.Any], # type: ignore
1193
- object_=_response.json(),
1194
- ),
1195
- )
1196
- )
1197
- if _response.status_code == 404:
1198
- raise NotFoundError(
1199
- typing.cast(
1200
- typing.Optional[typing.Any],
1201
- parse_obj_as(
1202
- type_=typing.Optional[typing.Any], # type: ignore
1203
- object_=_response.json(),
1204
- ),
1205
- )
1206
- )
1207
- if _response.status_code == 409:
1208
- raise ConflictError(
1209
- typing.cast(
1210
- typing.Optional[typing.Any],
1211
- parse_obj_as(
1212
- type_=typing.Optional[typing.Any], # type: ignore
1213
- object_=_response.json(),
1214
- ),
1215
- )
1216
- )
1217
- if _response.status_code == 422:
1218
- raise UnprocessableEntityError(
1219
- typing.cast(
1220
- typing.Optional[typing.Any],
1221
- parse_obj_as(
1222
- type_=typing.Optional[typing.Any], # type: ignore
1223
- object_=_response.json(),
1224
- ),
1225
- )
1226
- )
1227
- _response_json = _response.json()
1228
- except JSONDecodeError:
1229
- raise ApiError(status_code=_response.status_code, body=_response.text)
1230
- raise ApiError(status_code=_response.status_code, body=_response_json)
1231
-
1232
- async def delete_prompt(
1233
- self, id: str, *, request_options: typing.Optional[RequestOptions] = None
1234
- ) -> None:
784
+ return _response.data
785
+
786
+ async def delete_prompt(self, id: str, *, request_options: typing.Optional[RequestOptions] = None) -> None:
1235
787
  """
1236
788
  Delete prompt
1237
789
 
@@ -1248,42 +800,18 @@ class AsyncPromptsClient:
1248
800
 
1249
801
  Examples
1250
802
  --------
1251
- import asyncio
1252
-
1253
803
  from Opik import AsyncOpikApi
1254
-
1255
- client = AsyncOpikApi(
1256
- api_key="YOUR_API_KEY",
1257
- workspace_name="YOUR_WORKSPACE_NAME",
1258
- )
1259
-
1260
-
804
+ import asyncio
805
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1261
806
  async def main() -> None:
1262
- await client.prompts.delete_prompt(
1263
- id="id",
1264
- )
1265
-
1266
-
807
+ await client.prompts.delete_prompt(id='id', )
1267
808
  asyncio.run(main())
1268
809
  """
1269
- _response = await self._client_wrapper.httpx_client.request(
1270
- f"v1/private/prompts/{jsonable_encoder(id)}",
1271
- method="DELETE",
1272
- request_options=request_options,
1273
- )
1274
- try:
1275
- if 200 <= _response.status_code < 300:
1276
- return
1277
- _response_json = _response.json()
1278
- except JSONDecodeError:
1279
- raise ApiError(status_code=_response.status_code, body=_response.text)
1280
- raise ApiError(status_code=_response.status_code, body=_response_json)
810
+ _response = await self._raw_client.delete_prompt(id, request_options=request_options)
811
+ return _response.data
1281
812
 
1282
813
  async def delete_prompts_batch(
1283
- self,
1284
- *,
1285
- ids: typing.Sequence[str],
1286
- request_options: typing.Optional[RequestOptions] = None,
814
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
1287
815
  ) -> None:
1288
816
  """
1289
817
  Delete prompts batch
@@ -1301,46 +829,18 @@ class AsyncPromptsClient:
1301
829
 
1302
830
  Examples
1303
831
  --------
1304
- import asyncio
1305
-
1306
832
  from Opik import AsyncOpikApi
1307
-
1308
- client = AsyncOpikApi(
1309
- api_key="YOUR_API_KEY",
1310
- workspace_name="YOUR_WORKSPACE_NAME",
1311
- )
1312
-
1313
-
833
+ import asyncio
834
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1314
835
  async def main() -> None:
1315
- await client.prompts.delete_prompts_batch(
1316
- ids=["ids"],
1317
- )
1318
-
1319
-
836
+ await client.prompts.delete_prompts_batch(ids=['ids'], )
1320
837
  asyncio.run(main())
1321
838
  """
1322
- _response = await self._client_wrapper.httpx_client.request(
1323
- "v1/private/prompts/delete",
1324
- method="POST",
1325
- json={
1326
- "ids": ids,
1327
- },
1328
- request_options=request_options,
1329
- omit=OMIT,
1330
- )
1331
- try:
1332
- if 200 <= _response.status_code < 300:
1333
- return
1334
- _response_json = _response.json()
1335
- except JSONDecodeError:
1336
- raise ApiError(status_code=_response.status_code, body=_response.text)
1337
- raise ApiError(status_code=_response.status_code, body=_response_json)
839
+ _response = await self._raw_client.delete_prompts_batch(ids=ids, request_options=request_options)
840
+ return _response.data
1338
841
 
1339
842
  async def get_prompt_version_by_id(
1340
- self,
1341
- version_id: str,
1342
- *,
1343
- request_options: typing.Optional[RequestOptions] = None,
843
+ self, version_id: str, *, request_options: typing.Optional[RequestOptions] = None
1344
844
  ) -> PromptVersionDetail:
1345
845
  """
1346
846
  Get prompt version by id
@@ -1359,52 +859,15 @@ class AsyncPromptsClient:
1359
859
 
1360
860
  Examples
1361
861
  --------
1362
- import asyncio
1363
-
1364
862
  from Opik import AsyncOpikApi
1365
-
1366
- client = AsyncOpikApi(
1367
- api_key="YOUR_API_KEY",
1368
- workspace_name="YOUR_WORKSPACE_NAME",
1369
- )
1370
-
1371
-
863
+ import asyncio
864
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1372
865
  async def main() -> None:
1373
- await client.prompts.get_prompt_version_by_id(
1374
- version_id="versionId",
1375
- )
1376
-
1377
-
866
+ await client.prompts.get_prompt_version_by_id(version_id='versionId', )
1378
867
  asyncio.run(main())
1379
868
  """
1380
- _response = await self._client_wrapper.httpx_client.request(
1381
- f"v1/private/prompts/versions/{jsonable_encoder(version_id)}",
1382
- method="GET",
1383
- request_options=request_options,
1384
- )
1385
- try:
1386
- if 200 <= _response.status_code < 300:
1387
- return typing.cast(
1388
- PromptVersionDetail,
1389
- parse_obj_as(
1390
- type_=PromptVersionDetail, # type: ignore
1391
- object_=_response.json(),
1392
- ),
1393
- )
1394
- if _response.status_code == 404:
1395
- raise NotFoundError(
1396
- typing.cast(
1397
- typing.Optional[typing.Any],
1398
- parse_obj_as(
1399
- type_=typing.Optional[typing.Any], # type: ignore
1400
- object_=_response.json(),
1401
- ),
1402
- )
1403
- )
1404
- _response_json = _response.json()
1405
- except JSONDecodeError:
1406
- raise ApiError(status_code=_response.status_code, body=_response.text)
1407
- raise ApiError(status_code=_response.status_code, body=_response_json)
869
+ _response = await self._raw_client.get_prompt_version_by_id(version_id, request_options=request_options)
870
+ return _response.data
1408
871
 
1409
872
  async def get_prompt_versions(
1410
873
  self,
@@ -1412,6 +875,9 @@ class AsyncPromptsClient:
1412
875
  *,
1413
876
  page: typing.Optional[int] = None,
1414
877
  size: typing.Optional[int] = None,
878
+ search: typing.Optional[str] = None,
879
+ sorting: typing.Optional[str] = None,
880
+ filters: typing.Optional[str] = None,
1415
881
  request_options: typing.Optional[RequestOptions] = None,
1416
882
  ) -> PromptVersionPagePublic:
1417
883
  """
@@ -1425,6 +891,13 @@ class AsyncPromptsClient:
1425
891
 
1426
892
  size : typing.Optional[int]
1427
893
 
894
+ search : typing.Optional[str]
895
+ Search text to find in template or change description fields
896
+
897
+ sorting : typing.Optional[str]
898
+
899
+ filters : typing.Optional[str]
900
+
1428
901
  request_options : typing.Optional[RequestOptions]
1429
902
  Request-specific configuration.
1430
903
 
@@ -1435,53 +908,54 @@ class AsyncPromptsClient:
1435
908
 
1436
909
  Examples
1437
910
  --------
911
+ from Opik import AsyncOpikApi
1438
912
  import asyncio
913
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
914
+ async def main() -> None:
915
+ await client.prompts.get_prompt_versions(id='id', )
916
+ asyncio.run(main())
917
+ """
918
+ _response = await self._raw_client.get_prompt_versions(
919
+ id, page=page, size=size, search=search, sorting=sorting, filters=filters, request_options=request_options
920
+ )
921
+ return _response.data
1439
922
 
1440
- from Opik import AsyncOpikApi
923
+ async def restore_prompt_version(
924
+ self, prompt_id: str, version_id: str, *, request_options: typing.Optional[RequestOptions] = None
925
+ ) -> PromptVersionDetail:
926
+ """
927
+ Restore a prompt version by creating a new version with the content from the specified version
1441
928
 
1442
- client = AsyncOpikApi(
1443
- api_key="YOUR_API_KEY",
1444
- workspace_name="YOUR_WORKSPACE_NAME",
1445
- )
929
+ Parameters
930
+ ----------
931
+ prompt_id : str
1446
932
 
933
+ version_id : str
1447
934
 
1448
- async def main() -> None:
1449
- await client.prompts.get_prompt_versions(
1450
- id="id",
1451
- )
935
+ request_options : typing.Optional[RequestOptions]
936
+ Request-specific configuration.
1452
937
 
938
+ Returns
939
+ -------
940
+ PromptVersionDetail
941
+ OK
1453
942
 
943
+ Examples
944
+ --------
945
+ from Opik import AsyncOpikApi
946
+ import asyncio
947
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
948
+ async def main() -> None:
949
+ await client.prompts.restore_prompt_version(prompt_id='promptId', version_id='versionId', )
1454
950
  asyncio.run(main())
1455
951
  """
1456
- _response = await self._client_wrapper.httpx_client.request(
1457
- f"v1/private/prompts/{jsonable_encoder(id)}/versions",
1458
- method="GET",
1459
- params={
1460
- "page": page,
1461
- "size": size,
1462
- },
1463
- request_options=request_options,
952
+ _response = await self._raw_client.restore_prompt_version(
953
+ prompt_id, version_id, request_options=request_options
1464
954
  )
1465
- try:
1466
- if 200 <= _response.status_code < 300:
1467
- return typing.cast(
1468
- PromptVersionPagePublic,
1469
- parse_obj_as(
1470
- type_=PromptVersionPagePublic, # type: ignore
1471
- object_=_response.json(),
1472
- ),
1473
- )
1474
- _response_json = _response.json()
1475
- except JSONDecodeError:
1476
- raise ApiError(status_code=_response.status_code, body=_response.text)
1477
- raise ApiError(status_code=_response.status_code, body=_response_json)
955
+ return _response.data
1478
956
 
1479
957
  async def retrieve_prompt_version(
1480
- self,
1481
- *,
1482
- name: str,
1483
- commit: typing.Optional[str] = OMIT,
1484
- request_options: typing.Optional[RequestOptions] = None,
958
+ self, *, name: str, commit: typing.Optional[str] = OMIT, request_options: typing.Optional[RequestOptions] = None
1485
959
  ) -> PromptVersionDetail:
1486
960
  """
1487
961
  Retrieve prompt version
@@ -1502,77 +976,14 @@ class AsyncPromptsClient:
1502
976
 
1503
977
  Examples
1504
978
  --------
1505
- import asyncio
1506
-
1507
979
  from Opik import AsyncOpikApi
1508
-
1509
- client = AsyncOpikApi(
1510
- api_key="YOUR_API_KEY",
1511
- workspace_name="YOUR_WORKSPACE_NAME",
1512
- )
1513
-
1514
-
980
+ import asyncio
981
+ client = AsyncOpikApi(api_key="YOUR_API_KEY", workspace_name="YOUR_WORKSPACE_NAME", )
1515
982
  async def main() -> None:
1516
- await client.prompts.retrieve_prompt_version(
1517
- name="name",
1518
- )
1519
-
1520
-
983
+ await client.prompts.retrieve_prompt_version(name='name', )
1521
984
  asyncio.run(main())
1522
985
  """
1523
- _response = await self._client_wrapper.httpx_client.request(
1524
- "v1/private/prompts/versions/retrieve",
1525
- method="POST",
1526
- json={
1527
- "name": name,
1528
- "commit": commit,
1529
- },
1530
- headers={
1531
- "content-type": "application/json",
1532
- },
1533
- request_options=request_options,
1534
- omit=OMIT,
986
+ _response = await self._raw_client.retrieve_prompt_version(
987
+ name=name, commit=commit, request_options=request_options
1535
988
  )
1536
- try:
1537
- if 200 <= _response.status_code < 300:
1538
- return typing.cast(
1539
- PromptVersionDetail,
1540
- parse_obj_as(
1541
- type_=PromptVersionDetail, # type: ignore
1542
- object_=_response.json(),
1543
- ),
1544
- )
1545
- if _response.status_code == 400:
1546
- raise BadRequestError(
1547
- typing.cast(
1548
- typing.Optional[typing.Any],
1549
- parse_obj_as(
1550
- type_=typing.Optional[typing.Any], # type: ignore
1551
- object_=_response.json(),
1552
- ),
1553
- )
1554
- )
1555
- if _response.status_code == 404:
1556
- raise NotFoundError(
1557
- typing.cast(
1558
- typing.Optional[typing.Any],
1559
- parse_obj_as(
1560
- type_=typing.Optional[typing.Any], # type: ignore
1561
- object_=_response.json(),
1562
- ),
1563
- )
1564
- )
1565
- if _response.status_code == 422:
1566
- raise UnprocessableEntityError(
1567
- typing.cast(
1568
- typing.Optional[typing.Any],
1569
- parse_obj_as(
1570
- type_=typing.Optional[typing.Any], # type: ignore
1571
- object_=_response.json(),
1572
- ),
1573
- )
1574
- )
1575
- _response_json = _response.json()
1576
- except JSONDecodeError:
1577
- raise ApiError(status_code=_response.status_code, body=_response.text)
1578
- raise ApiError(status_code=_response.status_code, body=_response_json)
989
+ return _response.data