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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. opik/__init__.py +19 -3
  2. opik/anonymizer/__init__.py +5 -0
  3. opik/anonymizer/anonymizer.py +12 -0
  4. opik/anonymizer/factory.py +80 -0
  5. opik/anonymizer/recursive_anonymizer.py +64 -0
  6. opik/anonymizer/rules.py +56 -0
  7. opik/anonymizer/rules_anonymizer.py +35 -0
  8. opik/api_objects/attachment/attachment_context.py +36 -0
  9. opik/api_objects/attachment/attachments_extractor.py +153 -0
  10. opik/api_objects/attachment/client.py +1 -0
  11. opik/api_objects/attachment/converters.py +2 -0
  12. opik/api_objects/attachment/decoder.py +18 -0
  13. opik/api_objects/attachment/decoder_base64.py +83 -0
  14. opik/api_objects/attachment/decoder_helpers.py +137 -0
  15. opik/api_objects/data_helpers.py +79 -0
  16. opik/api_objects/dataset/dataset.py +64 -4
  17. opik/api_objects/dataset/rest_operations.py +11 -2
  18. opik/api_objects/experiment/experiment.py +57 -57
  19. opik/api_objects/experiment/experiment_item.py +2 -1
  20. opik/api_objects/experiment/experiments_client.py +64 -0
  21. opik/api_objects/experiment/helpers.py +35 -11
  22. opik/api_objects/experiment/rest_operations.py +65 -5
  23. opik/api_objects/helpers.py +8 -5
  24. opik/api_objects/local_recording.py +81 -0
  25. opik/api_objects/opik_client.py +600 -108
  26. opik/api_objects/opik_query_language.py +39 -5
  27. opik/api_objects/prompt/__init__.py +12 -2
  28. opik/api_objects/prompt/base_prompt.py +69 -0
  29. opik/api_objects/prompt/base_prompt_template.py +29 -0
  30. opik/api_objects/prompt/chat/__init__.py +1 -0
  31. opik/api_objects/prompt/chat/chat_prompt.py +210 -0
  32. opik/api_objects/prompt/chat/chat_prompt_template.py +350 -0
  33. opik/api_objects/prompt/chat/content_renderer_registry.py +203 -0
  34. opik/api_objects/prompt/client.py +189 -47
  35. opik/api_objects/prompt/text/__init__.py +1 -0
  36. opik/api_objects/prompt/text/prompt.py +174 -0
  37. opik/api_objects/prompt/{prompt_template.py → text/prompt_template.py} +10 -6
  38. opik/api_objects/prompt/types.py +23 -0
  39. opik/api_objects/search_helpers.py +89 -0
  40. opik/api_objects/span/span_data.py +35 -25
  41. opik/api_objects/threads/threads_client.py +39 -5
  42. opik/api_objects/trace/trace_client.py +52 -2
  43. opik/api_objects/trace/trace_data.py +15 -24
  44. opik/api_objects/validation_helpers.py +3 -3
  45. opik/cli/__init__.py +5 -0
  46. opik/cli/__main__.py +6 -0
  47. opik/cli/configure.py +66 -0
  48. opik/cli/exports/__init__.py +131 -0
  49. opik/cli/exports/dataset.py +278 -0
  50. opik/cli/exports/experiment.py +784 -0
  51. opik/cli/exports/project.py +685 -0
  52. opik/cli/exports/prompt.py +578 -0
  53. opik/cli/exports/utils.py +406 -0
  54. opik/cli/harbor.py +39 -0
  55. opik/cli/healthcheck.py +21 -0
  56. opik/cli/imports/__init__.py +439 -0
  57. opik/cli/imports/dataset.py +143 -0
  58. opik/cli/imports/experiment.py +1192 -0
  59. opik/cli/imports/project.py +262 -0
  60. opik/cli/imports/prompt.py +177 -0
  61. opik/cli/imports/utils.py +280 -0
  62. opik/cli/main.py +49 -0
  63. opik/cli/proxy.py +93 -0
  64. opik/cli/usage_report/__init__.py +16 -0
  65. opik/cli/usage_report/charts.py +783 -0
  66. opik/cli/usage_report/cli.py +274 -0
  67. opik/cli/usage_report/constants.py +9 -0
  68. opik/cli/usage_report/extraction.py +749 -0
  69. opik/cli/usage_report/pdf.py +244 -0
  70. opik/cli/usage_report/statistics.py +78 -0
  71. opik/cli/usage_report/utils.py +235 -0
  72. opik/config.py +13 -7
  73. opik/configurator/configure.py +17 -0
  74. opik/datetime_helpers.py +12 -0
  75. opik/decorator/arguments_helpers.py +9 -1
  76. opik/decorator/base_track_decorator.py +205 -133
  77. opik/decorator/context_manager/span_context_manager.py +123 -0
  78. opik/decorator/context_manager/trace_context_manager.py +84 -0
  79. opik/decorator/opik_args/__init__.py +13 -0
  80. opik/decorator/opik_args/api_classes.py +71 -0
  81. opik/decorator/opik_args/helpers.py +120 -0
  82. opik/decorator/span_creation_handler.py +25 -6
  83. opik/dict_utils.py +3 -3
  84. opik/evaluation/__init__.py +13 -2
  85. opik/evaluation/engine/engine.py +272 -75
  86. opik/evaluation/engine/evaluation_tasks_executor.py +6 -3
  87. opik/evaluation/engine/helpers.py +31 -6
  88. opik/evaluation/engine/metrics_evaluator.py +237 -0
  89. opik/evaluation/evaluation_result.py +168 -2
  90. opik/evaluation/evaluator.py +533 -62
  91. opik/evaluation/metrics/__init__.py +103 -4
  92. opik/evaluation/metrics/aggregated_metric.py +35 -6
  93. opik/evaluation/metrics/base_metric.py +1 -1
  94. opik/evaluation/metrics/conversation/__init__.py +48 -0
  95. opik/evaluation/metrics/conversation/conversation_thread_metric.py +56 -2
  96. opik/evaluation/metrics/conversation/g_eval_wrappers.py +19 -0
  97. opik/evaluation/metrics/conversation/helpers.py +14 -15
  98. opik/evaluation/metrics/conversation/heuristics/__init__.py +14 -0
  99. opik/evaluation/metrics/conversation/heuristics/degeneration/__init__.py +3 -0
  100. opik/evaluation/metrics/conversation/heuristics/degeneration/metric.py +189 -0
  101. opik/evaluation/metrics/conversation/heuristics/degeneration/phrases.py +12 -0
  102. opik/evaluation/metrics/conversation/heuristics/knowledge_retention/__init__.py +3 -0
  103. opik/evaluation/metrics/conversation/heuristics/knowledge_retention/metric.py +172 -0
  104. opik/evaluation/metrics/conversation/llm_judges/__init__.py +32 -0
  105. opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/metric.py +22 -17
  106. opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/templates.py +1 -1
  107. opik/evaluation/metrics/conversation/llm_judges/g_eval_wrappers.py +442 -0
  108. opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/metric.py +13 -7
  109. opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/templates.py +1 -1
  110. opik/evaluation/metrics/conversation/llm_judges/user_frustration/__init__.py +0 -0
  111. opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/metric.py +21 -14
  112. opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/templates.py +1 -1
  113. opik/evaluation/metrics/conversation/types.py +4 -5
  114. opik/evaluation/metrics/conversation_types.py +9 -0
  115. opik/evaluation/metrics/heuristics/bertscore.py +107 -0
  116. opik/evaluation/metrics/heuristics/bleu.py +35 -15
  117. opik/evaluation/metrics/heuristics/chrf.py +127 -0
  118. opik/evaluation/metrics/heuristics/contains.py +47 -11
  119. opik/evaluation/metrics/heuristics/distribution_metrics.py +331 -0
  120. opik/evaluation/metrics/heuristics/gleu.py +113 -0
  121. opik/evaluation/metrics/heuristics/language_adherence.py +123 -0
  122. opik/evaluation/metrics/heuristics/meteor.py +119 -0
  123. opik/evaluation/metrics/heuristics/prompt_injection.py +150 -0
  124. opik/evaluation/metrics/heuristics/readability.py +129 -0
  125. opik/evaluation/metrics/heuristics/rouge.py +26 -9
  126. opik/evaluation/metrics/heuristics/spearman.py +88 -0
  127. opik/evaluation/metrics/heuristics/tone.py +155 -0
  128. opik/evaluation/metrics/heuristics/vader_sentiment.py +77 -0
  129. opik/evaluation/metrics/llm_judges/answer_relevance/metric.py +20 -5
  130. opik/evaluation/metrics/llm_judges/context_precision/metric.py +20 -6
  131. opik/evaluation/metrics/llm_judges/context_recall/metric.py +20 -6
  132. opik/evaluation/metrics/llm_judges/g_eval/__init__.py +5 -0
  133. opik/evaluation/metrics/llm_judges/g_eval/metric.py +219 -68
  134. opik/evaluation/metrics/llm_judges/g_eval/parser.py +102 -52
  135. opik/evaluation/metrics/llm_judges/g_eval/presets.py +209 -0
  136. opik/evaluation/metrics/llm_judges/g_eval_presets/__init__.py +36 -0
  137. opik/evaluation/metrics/llm_judges/g_eval_presets/agent_assessment.py +77 -0
  138. opik/evaluation/metrics/llm_judges/g_eval_presets/bias_classifier.py +181 -0
  139. opik/evaluation/metrics/llm_judges/g_eval_presets/compliance_risk.py +41 -0
  140. opik/evaluation/metrics/llm_judges/g_eval_presets/prompt_uncertainty.py +41 -0
  141. opik/evaluation/metrics/llm_judges/g_eval_presets/qa_suite.py +146 -0
  142. opik/evaluation/metrics/llm_judges/hallucination/metric.py +16 -3
  143. opik/evaluation/metrics/llm_judges/llm_juries/__init__.py +3 -0
  144. opik/evaluation/metrics/llm_judges/llm_juries/metric.py +76 -0
  145. opik/evaluation/metrics/llm_judges/moderation/metric.py +16 -4
  146. opik/evaluation/metrics/llm_judges/structure_output_compliance/__init__.py +0 -0
  147. opik/evaluation/metrics/llm_judges/structure_output_compliance/metric.py +144 -0
  148. opik/evaluation/metrics/llm_judges/structure_output_compliance/parser.py +79 -0
  149. opik/evaluation/metrics/llm_judges/structure_output_compliance/schema.py +15 -0
  150. opik/evaluation/metrics/llm_judges/structure_output_compliance/template.py +50 -0
  151. opik/evaluation/metrics/llm_judges/syc_eval/__init__.py +0 -0
  152. opik/evaluation/metrics/llm_judges/syc_eval/metric.py +252 -0
  153. opik/evaluation/metrics/llm_judges/syc_eval/parser.py +82 -0
  154. opik/evaluation/metrics/llm_judges/syc_eval/template.py +155 -0
  155. opik/evaluation/metrics/llm_judges/trajectory_accuracy/metric.py +20 -5
  156. opik/evaluation/metrics/llm_judges/usefulness/metric.py +16 -4
  157. opik/evaluation/metrics/ragas_metric.py +43 -23
  158. opik/evaluation/models/__init__.py +8 -0
  159. opik/evaluation/models/base_model.py +107 -1
  160. opik/evaluation/models/langchain/langchain_chat_model.py +15 -7
  161. opik/evaluation/models/langchain/message_converters.py +97 -15
  162. opik/evaluation/models/litellm/litellm_chat_model.py +156 -29
  163. opik/evaluation/models/litellm/util.py +125 -0
  164. opik/evaluation/models/litellm/warning_filters.py +16 -4
  165. opik/evaluation/models/model_capabilities.py +187 -0
  166. opik/evaluation/models/models_factory.py +25 -3
  167. opik/evaluation/preprocessing.py +92 -0
  168. opik/evaluation/report.py +70 -12
  169. opik/evaluation/rest_operations.py +49 -45
  170. opik/evaluation/samplers/__init__.py +4 -0
  171. opik/evaluation/samplers/base_dataset_sampler.py +40 -0
  172. opik/evaluation/samplers/random_dataset_sampler.py +48 -0
  173. opik/evaluation/score_statistics.py +66 -0
  174. opik/evaluation/scorers/__init__.py +4 -0
  175. opik/evaluation/scorers/scorer_function.py +55 -0
  176. opik/evaluation/scorers/scorer_wrapper_metric.py +130 -0
  177. opik/evaluation/test_case.py +3 -2
  178. opik/evaluation/test_result.py +1 -0
  179. opik/evaluation/threads/evaluator.py +31 -3
  180. opik/evaluation/threads/helpers.py +3 -2
  181. opik/evaluation/types.py +9 -1
  182. opik/exceptions.py +33 -0
  183. opik/file_upload/file_uploader.py +13 -0
  184. opik/file_upload/upload_options.py +2 -0
  185. opik/hooks/__init__.py +23 -0
  186. opik/hooks/anonymizer_hook.py +36 -0
  187. opik/hooks/httpx_client_hook.py +112 -0
  188. opik/httpx_client.py +12 -9
  189. opik/id_helpers.py +18 -0
  190. opik/integrations/adk/graph/subgraph_edges_builders.py +1 -2
  191. opik/integrations/adk/helpers.py +16 -7
  192. opik/integrations/adk/legacy_opik_tracer.py +7 -4
  193. opik/integrations/adk/opik_tracer.py +14 -1
  194. opik/integrations/adk/patchers/adk_otel_tracer/opik_adk_otel_tracer.py +7 -3
  195. opik/integrations/adk/recursive_callback_injector.py +4 -7
  196. opik/integrations/bedrock/converse/__init__.py +0 -0
  197. opik/integrations/bedrock/converse/chunks_aggregator.py +188 -0
  198. opik/integrations/bedrock/{converse_decorator.py → converse/converse_decorator.py} +4 -3
  199. opik/integrations/bedrock/invoke_agent_decorator.py +5 -4
  200. opik/integrations/bedrock/invoke_model/__init__.py +0 -0
  201. opik/integrations/bedrock/invoke_model/chunks_aggregator/__init__.py +78 -0
  202. opik/integrations/bedrock/invoke_model/chunks_aggregator/api.py +45 -0
  203. opik/integrations/bedrock/invoke_model/chunks_aggregator/base.py +23 -0
  204. opik/integrations/bedrock/invoke_model/chunks_aggregator/claude.py +121 -0
  205. opik/integrations/bedrock/invoke_model/chunks_aggregator/format_detector.py +107 -0
  206. opik/integrations/bedrock/invoke_model/chunks_aggregator/llama.py +108 -0
  207. opik/integrations/bedrock/invoke_model/chunks_aggregator/mistral.py +118 -0
  208. opik/integrations/bedrock/invoke_model/chunks_aggregator/nova.py +99 -0
  209. opik/integrations/bedrock/invoke_model/invoke_model_decorator.py +178 -0
  210. opik/integrations/bedrock/invoke_model/response_types.py +34 -0
  211. opik/integrations/bedrock/invoke_model/stream_wrappers.py +122 -0
  212. opik/integrations/bedrock/invoke_model/usage_converters.py +87 -0
  213. opik/integrations/bedrock/invoke_model/usage_extraction.py +108 -0
  214. opik/integrations/bedrock/opik_tracker.py +42 -4
  215. opik/integrations/bedrock/types.py +19 -0
  216. opik/integrations/crewai/crewai_decorator.py +8 -51
  217. opik/integrations/crewai/opik_tracker.py +31 -10
  218. opik/integrations/crewai/patchers/__init__.py +5 -0
  219. opik/integrations/crewai/patchers/flow.py +118 -0
  220. opik/integrations/crewai/patchers/litellm_completion.py +30 -0
  221. opik/integrations/crewai/patchers/llm_client.py +207 -0
  222. opik/integrations/dspy/callback.py +80 -17
  223. opik/integrations/dspy/parsers.py +168 -0
  224. opik/integrations/harbor/__init__.py +17 -0
  225. opik/integrations/harbor/experiment_service.py +269 -0
  226. opik/integrations/harbor/opik_tracker.py +528 -0
  227. opik/integrations/haystack/opik_connector.py +2 -2
  228. opik/integrations/haystack/opik_tracer.py +3 -7
  229. opik/integrations/langchain/__init__.py +3 -1
  230. opik/integrations/langchain/helpers.py +96 -0
  231. opik/integrations/langchain/langgraph_async_context_bridge.py +131 -0
  232. opik/integrations/langchain/langgraph_tracer_injector.py +88 -0
  233. opik/integrations/langchain/opik_encoder_extension.py +1 -1
  234. opik/integrations/langchain/opik_tracer.py +474 -229
  235. opik/integrations/litellm/__init__.py +5 -0
  236. opik/integrations/litellm/completion_chunks_aggregator.py +115 -0
  237. opik/integrations/litellm/litellm_completion_decorator.py +242 -0
  238. opik/integrations/litellm/opik_tracker.py +43 -0
  239. opik/integrations/litellm/stream_patchers.py +151 -0
  240. opik/integrations/llama_index/callback.py +146 -107
  241. opik/integrations/openai/agents/opik_tracing_processor.py +1 -2
  242. opik/integrations/openai/openai_chat_completions_decorator.py +2 -16
  243. opik/integrations/openai/opik_tracker.py +1 -1
  244. opik/integrations/sagemaker/auth.py +5 -1
  245. opik/llm_usage/google_usage.py +3 -1
  246. opik/llm_usage/opik_usage.py +7 -8
  247. opik/llm_usage/opik_usage_factory.py +4 -2
  248. opik/logging_messages.py +6 -0
  249. opik/message_processing/batching/base_batcher.py +14 -21
  250. opik/message_processing/batching/batch_manager.py +22 -10
  251. opik/message_processing/batching/batch_manager_constuctors.py +10 -0
  252. opik/message_processing/batching/batchers.py +59 -27
  253. opik/message_processing/batching/flushing_thread.py +0 -3
  254. opik/message_processing/emulation/__init__.py +0 -0
  255. opik/message_processing/emulation/emulator_message_processor.py +578 -0
  256. opik/message_processing/emulation/local_emulator_message_processor.py +140 -0
  257. opik/message_processing/emulation/models.py +162 -0
  258. opik/message_processing/encoder_helpers.py +79 -0
  259. opik/message_processing/messages.py +56 -1
  260. opik/message_processing/preprocessing/__init__.py +0 -0
  261. opik/message_processing/preprocessing/attachments_preprocessor.py +70 -0
  262. opik/message_processing/preprocessing/batching_preprocessor.py +53 -0
  263. opik/message_processing/preprocessing/constants.py +1 -0
  264. opik/message_processing/preprocessing/file_upload_preprocessor.py +38 -0
  265. opik/message_processing/preprocessing/preprocessor.py +36 -0
  266. opik/message_processing/processors/__init__.py +0 -0
  267. opik/message_processing/processors/attachments_extraction_processor.py +146 -0
  268. opik/message_processing/processors/message_processors.py +92 -0
  269. opik/message_processing/processors/message_processors_chain.py +96 -0
  270. opik/message_processing/{message_processors.py → processors/online_message_processor.py} +85 -29
  271. opik/message_processing/queue_consumer.py +9 -3
  272. opik/message_processing/streamer.py +71 -33
  273. opik/message_processing/streamer_constructors.py +43 -10
  274. opik/opik_context.py +16 -4
  275. opik/plugins/pytest/hooks.py +5 -3
  276. opik/rest_api/__init__.py +346 -15
  277. opik/rest_api/alerts/__init__.py +7 -0
  278. opik/rest_api/alerts/client.py +667 -0
  279. opik/rest_api/alerts/raw_client.py +1015 -0
  280. opik/rest_api/alerts/types/__init__.py +7 -0
  281. opik/rest_api/alerts/types/get_webhook_examples_request_alert_type.py +5 -0
  282. opik/rest_api/annotation_queues/__init__.py +4 -0
  283. opik/rest_api/annotation_queues/client.py +668 -0
  284. opik/rest_api/annotation_queues/raw_client.py +1019 -0
  285. opik/rest_api/automation_rule_evaluators/client.py +34 -2
  286. opik/rest_api/automation_rule_evaluators/raw_client.py +24 -0
  287. opik/rest_api/client.py +15 -0
  288. opik/rest_api/dashboards/__init__.py +4 -0
  289. opik/rest_api/dashboards/client.py +462 -0
  290. opik/rest_api/dashboards/raw_client.py +648 -0
  291. opik/rest_api/datasets/client.py +1310 -44
  292. opik/rest_api/datasets/raw_client.py +2269 -358
  293. opik/rest_api/experiments/__init__.py +2 -2
  294. opik/rest_api/experiments/client.py +191 -5
  295. opik/rest_api/experiments/raw_client.py +301 -7
  296. opik/rest_api/experiments/types/__init__.py +4 -1
  297. opik/rest_api/experiments/types/experiment_update_status.py +5 -0
  298. opik/rest_api/experiments/types/experiment_update_type.py +5 -0
  299. opik/rest_api/experiments/types/experiment_write_status.py +5 -0
  300. opik/rest_api/feedback_definitions/types/find_feedback_definitions_request_type.py +1 -1
  301. opik/rest_api/llm_provider_key/client.py +20 -0
  302. opik/rest_api/llm_provider_key/raw_client.py +20 -0
  303. opik/rest_api/llm_provider_key/types/provider_api_key_write_provider.py +1 -1
  304. opik/rest_api/manual_evaluation/__init__.py +4 -0
  305. opik/rest_api/manual_evaluation/client.py +347 -0
  306. opik/rest_api/manual_evaluation/raw_client.py +543 -0
  307. opik/rest_api/optimizations/client.py +145 -9
  308. opik/rest_api/optimizations/raw_client.py +237 -13
  309. opik/rest_api/optimizations/types/optimization_update_status.py +3 -1
  310. opik/rest_api/prompts/__init__.py +2 -2
  311. opik/rest_api/prompts/client.py +227 -6
  312. opik/rest_api/prompts/raw_client.py +331 -2
  313. opik/rest_api/prompts/types/__init__.py +3 -1
  314. opik/rest_api/prompts/types/create_prompt_version_detail_template_structure.py +5 -0
  315. opik/rest_api/prompts/types/prompt_write_template_structure.py +5 -0
  316. opik/rest_api/spans/__init__.py +0 -2
  317. opik/rest_api/spans/client.py +238 -76
  318. opik/rest_api/spans/raw_client.py +307 -95
  319. opik/rest_api/spans/types/__init__.py +0 -2
  320. opik/rest_api/traces/client.py +572 -161
  321. opik/rest_api/traces/raw_client.py +736 -229
  322. opik/rest_api/types/__init__.py +352 -17
  323. opik/rest_api/types/aggregation_data.py +1 -0
  324. opik/rest_api/types/alert.py +33 -0
  325. opik/rest_api/types/alert_alert_type.py +5 -0
  326. opik/rest_api/types/alert_page_public.py +24 -0
  327. opik/rest_api/types/alert_public.py +33 -0
  328. opik/rest_api/types/alert_public_alert_type.py +5 -0
  329. opik/rest_api/types/alert_trigger.py +27 -0
  330. opik/rest_api/types/alert_trigger_config.py +28 -0
  331. opik/rest_api/types/alert_trigger_config_public.py +28 -0
  332. opik/rest_api/types/alert_trigger_config_public_type.py +10 -0
  333. opik/rest_api/types/alert_trigger_config_type.py +10 -0
  334. opik/rest_api/types/alert_trigger_config_write.py +22 -0
  335. opik/rest_api/types/alert_trigger_config_write_type.py +10 -0
  336. opik/rest_api/types/alert_trigger_event_type.py +19 -0
  337. opik/rest_api/types/alert_trigger_public.py +27 -0
  338. opik/rest_api/types/alert_trigger_public_event_type.py +19 -0
  339. opik/rest_api/types/alert_trigger_write.py +23 -0
  340. opik/rest_api/types/alert_trigger_write_event_type.py +19 -0
  341. opik/rest_api/types/alert_write.py +28 -0
  342. opik/rest_api/types/alert_write_alert_type.py +5 -0
  343. opik/rest_api/types/annotation_queue.py +42 -0
  344. opik/rest_api/types/annotation_queue_batch.py +27 -0
  345. opik/rest_api/types/annotation_queue_item_ids.py +19 -0
  346. opik/rest_api/types/annotation_queue_page_public.py +28 -0
  347. opik/rest_api/types/annotation_queue_public.py +38 -0
  348. opik/rest_api/types/annotation_queue_public_scope.py +5 -0
  349. opik/rest_api/types/annotation_queue_reviewer.py +20 -0
  350. opik/rest_api/types/annotation_queue_reviewer_public.py +20 -0
  351. opik/rest_api/types/annotation_queue_scope.py +5 -0
  352. opik/rest_api/types/annotation_queue_write.py +31 -0
  353. opik/rest_api/types/annotation_queue_write_scope.py +5 -0
  354. opik/rest_api/types/audio_url.py +19 -0
  355. opik/rest_api/types/audio_url_public.py +19 -0
  356. opik/rest_api/types/audio_url_write.py +19 -0
  357. opik/rest_api/types/automation_rule_evaluator.py +62 -2
  358. opik/rest_api/types/automation_rule_evaluator_llm_as_judge.py +2 -0
  359. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_public.py +2 -0
  360. opik/rest_api/types/automation_rule_evaluator_llm_as_judge_write.py +2 -0
  361. opik/rest_api/types/automation_rule_evaluator_object_object_public.py +155 -0
  362. opik/rest_api/types/automation_rule_evaluator_page_public.py +3 -2
  363. opik/rest_api/types/automation_rule_evaluator_public.py +57 -2
  364. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge.py +22 -0
  365. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_public.py +22 -0
  366. opik/rest_api/types/automation_rule_evaluator_span_llm_as_judge_write.py +22 -0
  367. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python.py +22 -0
  368. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_public.py +22 -0
  369. opik/rest_api/types/automation_rule_evaluator_span_user_defined_metric_python_write.py +22 -0
  370. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge.py +2 -0
  371. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_public.py +2 -0
  372. opik/rest_api/types/automation_rule_evaluator_trace_thread_llm_as_judge_write.py +2 -0
  373. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python.py +2 -0
  374. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_public.py +2 -0
  375. opik/rest_api/types/automation_rule_evaluator_trace_thread_user_defined_metric_python_write.py +2 -0
  376. opik/rest_api/types/automation_rule_evaluator_update.py +51 -1
  377. opik/rest_api/types/automation_rule_evaluator_update_llm_as_judge.py +2 -0
  378. opik/rest_api/types/automation_rule_evaluator_update_span_llm_as_judge.py +22 -0
  379. opik/rest_api/types/automation_rule_evaluator_update_span_user_defined_metric_python.py +22 -0
  380. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_llm_as_judge.py +2 -0
  381. opik/rest_api/types/automation_rule_evaluator_update_trace_thread_user_defined_metric_python.py +2 -0
  382. opik/rest_api/types/automation_rule_evaluator_update_user_defined_metric_python.py +2 -0
  383. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python.py +2 -0
  384. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_public.py +2 -0
  385. opik/rest_api/types/automation_rule_evaluator_user_defined_metric_python_write.py +2 -0
  386. opik/rest_api/types/automation_rule_evaluator_write.py +51 -1
  387. opik/rest_api/types/boolean_feedback_definition.py +25 -0
  388. opik/rest_api/types/boolean_feedback_definition_create.py +20 -0
  389. opik/rest_api/types/boolean_feedback_definition_public.py +25 -0
  390. opik/rest_api/types/boolean_feedback_definition_update.py +20 -0
  391. opik/rest_api/types/boolean_feedback_detail.py +29 -0
  392. opik/rest_api/types/boolean_feedback_detail_create.py +29 -0
  393. opik/rest_api/types/boolean_feedback_detail_public.py +29 -0
  394. opik/rest_api/types/boolean_feedback_detail_update.py +29 -0
  395. opik/rest_api/types/dashboard_page_public.py +24 -0
  396. opik/rest_api/types/dashboard_public.py +30 -0
  397. opik/rest_api/types/dataset.py +4 -0
  398. opik/rest_api/types/dataset_expansion.py +42 -0
  399. opik/rest_api/types/dataset_expansion_response.py +39 -0
  400. opik/rest_api/types/dataset_item.py +2 -0
  401. opik/rest_api/types/dataset_item_changes_public.py +5 -0
  402. opik/rest_api/types/dataset_item_compare.py +2 -0
  403. opik/rest_api/types/dataset_item_filter.py +27 -0
  404. opik/rest_api/types/dataset_item_filter_operator.py +21 -0
  405. opik/rest_api/types/dataset_item_page_compare.py +5 -0
  406. opik/rest_api/types/dataset_item_page_public.py +5 -0
  407. opik/rest_api/types/dataset_item_public.py +2 -0
  408. opik/rest_api/types/dataset_item_update.py +39 -0
  409. opik/rest_api/types/dataset_item_write.py +1 -0
  410. opik/rest_api/types/dataset_public.py +4 -0
  411. opik/rest_api/types/dataset_public_status.py +5 -0
  412. opik/rest_api/types/dataset_status.py +5 -0
  413. opik/rest_api/types/dataset_version_diff.py +22 -0
  414. opik/rest_api/types/dataset_version_diff_stats.py +24 -0
  415. opik/rest_api/types/dataset_version_page_public.py +23 -0
  416. opik/rest_api/types/dataset_version_public.py +59 -0
  417. opik/rest_api/types/dataset_version_summary.py +46 -0
  418. opik/rest_api/types/dataset_version_summary_public.py +46 -0
  419. opik/rest_api/types/experiment.py +7 -2
  420. opik/rest_api/types/experiment_group_response.py +2 -0
  421. opik/rest_api/types/experiment_public.py +7 -2
  422. opik/rest_api/types/experiment_public_status.py +5 -0
  423. opik/rest_api/types/experiment_score.py +20 -0
  424. opik/rest_api/types/experiment_score_public.py +20 -0
  425. opik/rest_api/types/experiment_score_write.py +20 -0
  426. opik/rest_api/types/experiment_status.py +5 -0
  427. opik/rest_api/types/feedback.py +25 -1
  428. opik/rest_api/types/feedback_create.py +20 -1
  429. opik/rest_api/types/feedback_object_public.py +27 -1
  430. opik/rest_api/types/feedback_public.py +25 -1
  431. opik/rest_api/types/feedback_score_batch_item.py +2 -1
  432. opik/rest_api/types/feedback_score_batch_item_thread.py +2 -1
  433. opik/rest_api/types/feedback_score_public.py +4 -0
  434. opik/rest_api/types/feedback_update.py +20 -1
  435. opik/rest_api/types/group_content_with_aggregations.py +1 -0
  436. opik/rest_api/types/group_detail.py +19 -0
  437. opik/rest_api/types/group_details.py +20 -0
  438. opik/rest_api/types/guardrail.py +1 -0
  439. opik/rest_api/types/guardrail_write.py +1 -0
  440. opik/rest_api/types/ids_holder.py +19 -0
  441. opik/rest_api/types/image_url.py +20 -0
  442. opik/rest_api/types/image_url_public.py +20 -0
  443. opik/rest_api/types/image_url_write.py +20 -0
  444. opik/rest_api/types/llm_as_judge_message.py +5 -1
  445. opik/rest_api/types/llm_as_judge_message_content.py +26 -0
  446. opik/rest_api/types/llm_as_judge_message_content_public.py +26 -0
  447. opik/rest_api/types/llm_as_judge_message_content_write.py +26 -0
  448. opik/rest_api/types/llm_as_judge_message_public.py +5 -1
  449. opik/rest_api/types/llm_as_judge_message_write.py +5 -1
  450. opik/rest_api/types/llm_as_judge_model_parameters.py +3 -0
  451. opik/rest_api/types/llm_as_judge_model_parameters_public.py +3 -0
  452. opik/rest_api/types/llm_as_judge_model_parameters_write.py +3 -0
  453. opik/rest_api/types/manual_evaluation_request.py +38 -0
  454. opik/rest_api/types/manual_evaluation_request_entity_type.py +5 -0
  455. opik/rest_api/types/manual_evaluation_response.py +27 -0
  456. opik/rest_api/types/optimization.py +4 -2
  457. opik/rest_api/types/optimization_public.py +4 -2
  458. opik/rest_api/types/optimization_public_status.py +3 -1
  459. opik/rest_api/types/optimization_status.py +3 -1
  460. opik/rest_api/types/optimization_studio_config.py +27 -0
  461. opik/rest_api/types/optimization_studio_config_public.py +27 -0
  462. opik/rest_api/types/optimization_studio_config_write.py +27 -0
  463. opik/rest_api/types/optimization_studio_log.py +22 -0
  464. opik/rest_api/types/optimization_write.py +4 -2
  465. opik/rest_api/types/optimization_write_status.py +3 -1
  466. opik/rest_api/types/project.py +1 -0
  467. opik/rest_api/types/project_detailed.py +1 -0
  468. opik/rest_api/types/project_reference.py +31 -0
  469. opik/rest_api/types/project_reference_public.py +31 -0
  470. opik/rest_api/types/project_stats_summary_item.py +1 -0
  471. opik/rest_api/types/prompt.py +6 -0
  472. opik/rest_api/types/prompt_detail.py +6 -0
  473. opik/rest_api/types/prompt_detail_template_structure.py +5 -0
  474. opik/rest_api/types/prompt_public.py +6 -0
  475. opik/rest_api/types/prompt_public_template_structure.py +5 -0
  476. opik/rest_api/types/prompt_template_structure.py +5 -0
  477. opik/rest_api/types/prompt_version.py +3 -0
  478. opik/rest_api/types/prompt_version_detail.py +3 -0
  479. opik/rest_api/types/prompt_version_detail_template_structure.py +5 -0
  480. opik/rest_api/types/prompt_version_link.py +1 -0
  481. opik/rest_api/types/prompt_version_link_public.py +1 -0
  482. opik/rest_api/types/prompt_version_page_public.py +5 -0
  483. opik/rest_api/types/prompt_version_public.py +3 -0
  484. opik/rest_api/types/prompt_version_public_template_structure.py +5 -0
  485. opik/rest_api/types/prompt_version_template_structure.py +5 -0
  486. opik/rest_api/types/prompt_version_update.py +33 -0
  487. opik/rest_api/types/provider_api_key.py +9 -0
  488. opik/rest_api/types/provider_api_key_provider.py +1 -1
  489. opik/rest_api/types/provider_api_key_public.py +9 -0
  490. opik/rest_api/types/provider_api_key_public_provider.py +1 -1
  491. opik/rest_api/types/score_name.py +1 -0
  492. opik/rest_api/types/service_toggles_config.py +18 -0
  493. opik/rest_api/types/span.py +1 -2
  494. opik/rest_api/types/span_enrichment_options.py +31 -0
  495. opik/rest_api/types/span_experiment_item_bulk_write_view.py +1 -2
  496. opik/rest_api/types/span_filter.py +23 -0
  497. opik/rest_api/types/span_filter_operator.py +21 -0
  498. opik/rest_api/types/span_filter_write.py +23 -0
  499. opik/rest_api/types/span_filter_write_operator.py +21 -0
  500. opik/rest_api/types/span_llm_as_judge_code.py +27 -0
  501. opik/rest_api/types/span_llm_as_judge_code_public.py +27 -0
  502. opik/rest_api/types/span_llm_as_judge_code_write.py +27 -0
  503. opik/rest_api/types/span_public.py +1 -2
  504. opik/rest_api/types/span_update.py +46 -0
  505. opik/rest_api/types/span_user_defined_metric_python_code.py +20 -0
  506. opik/rest_api/types/span_user_defined_metric_python_code_public.py +20 -0
  507. opik/rest_api/types/span_user_defined_metric_python_code_write.py +20 -0
  508. opik/rest_api/types/span_write.py +1 -2
  509. opik/rest_api/types/studio_evaluation.py +20 -0
  510. opik/rest_api/types/studio_evaluation_public.py +20 -0
  511. opik/rest_api/types/studio_evaluation_write.py +20 -0
  512. opik/rest_api/types/studio_llm_model.py +21 -0
  513. opik/rest_api/types/studio_llm_model_public.py +21 -0
  514. opik/rest_api/types/studio_llm_model_write.py +21 -0
  515. opik/rest_api/types/studio_message.py +20 -0
  516. opik/rest_api/types/studio_message_public.py +20 -0
  517. opik/rest_api/types/studio_message_write.py +20 -0
  518. opik/rest_api/types/studio_metric.py +21 -0
  519. opik/rest_api/types/studio_metric_public.py +21 -0
  520. opik/rest_api/types/studio_metric_write.py +21 -0
  521. opik/rest_api/types/studio_optimizer.py +21 -0
  522. opik/rest_api/types/studio_optimizer_public.py +21 -0
  523. opik/rest_api/types/studio_optimizer_write.py +21 -0
  524. opik/rest_api/types/studio_prompt.py +20 -0
  525. opik/rest_api/types/studio_prompt_public.py +20 -0
  526. opik/rest_api/types/studio_prompt_write.py +20 -0
  527. opik/rest_api/types/trace.py +11 -2
  528. opik/rest_api/types/trace_enrichment_options.py +32 -0
  529. opik/rest_api/types/trace_experiment_item_bulk_write_view.py +1 -2
  530. opik/rest_api/types/trace_filter.py +23 -0
  531. opik/rest_api/types/trace_filter_operator.py +21 -0
  532. opik/rest_api/types/trace_filter_write.py +23 -0
  533. opik/rest_api/types/trace_filter_write_operator.py +21 -0
  534. opik/rest_api/types/trace_public.py +11 -2
  535. opik/rest_api/types/trace_thread_filter_write.py +23 -0
  536. opik/rest_api/types/trace_thread_filter_write_operator.py +21 -0
  537. opik/rest_api/types/trace_thread_identifier.py +1 -0
  538. opik/rest_api/types/trace_update.py +39 -0
  539. opik/rest_api/types/trace_write.py +1 -2
  540. opik/rest_api/types/value_entry.py +2 -0
  541. opik/rest_api/types/value_entry_compare.py +2 -0
  542. opik/rest_api/types/value_entry_experiment_item_bulk_write_view.py +2 -0
  543. opik/rest_api/types/value_entry_public.py +2 -0
  544. opik/rest_api/types/video_url.py +19 -0
  545. opik/rest_api/types/video_url_public.py +19 -0
  546. opik/rest_api/types/video_url_write.py +19 -0
  547. opik/rest_api/types/webhook.py +28 -0
  548. opik/rest_api/types/webhook_examples.py +19 -0
  549. opik/rest_api/types/webhook_public.py +28 -0
  550. opik/rest_api/types/webhook_test_result.py +23 -0
  551. opik/rest_api/types/webhook_test_result_status.py +5 -0
  552. opik/rest_api/types/webhook_write.py +23 -0
  553. opik/rest_api/types/welcome_wizard_tracking.py +22 -0
  554. opik/rest_api/types/workspace_configuration.py +5 -0
  555. opik/rest_api/welcome_wizard/__init__.py +4 -0
  556. opik/rest_api/welcome_wizard/client.py +195 -0
  557. opik/rest_api/welcome_wizard/raw_client.py +208 -0
  558. opik/rest_api/workspaces/client.py +14 -2
  559. opik/rest_api/workspaces/raw_client.py +10 -0
  560. opik/s3_httpx_client.py +14 -1
  561. opik/simulation/__init__.py +6 -0
  562. opik/simulation/simulated_user.py +99 -0
  563. opik/simulation/simulator.py +108 -0
  564. opik/synchronization.py +5 -6
  565. opik/{decorator/tracing_runtime_config.py → tracing_runtime_config.py} +6 -7
  566. opik/types.py +36 -0
  567. opik/validation/chat_prompt_messages.py +241 -0
  568. opik/validation/feedback_score.py +3 -3
  569. opik/validation/validator.py +28 -0
  570. opik-1.9.71.dist-info/METADATA +370 -0
  571. opik-1.9.71.dist-info/RECORD +1110 -0
  572. opik/api_objects/prompt/prompt.py +0 -112
  573. opik/cli.py +0 -193
  574. opik/hooks.py +0 -13
  575. opik/integrations/bedrock/chunks_aggregator.py +0 -55
  576. opik/integrations/bedrock/helpers.py +0 -8
  577. opik/rest_api/types/automation_rule_evaluator_object_public.py +0 -100
  578. opik/rest_api/types/json_node_experiment_item_bulk_write_view.py +0 -5
  579. opik-1.8.39.dist-info/METADATA +0 -339
  580. opik-1.8.39.dist-info/RECORD +0 -790
  581. /opik/{evaluation/metrics/conversation/conversational_coherence → decorator/context_manager}/__init__.py +0 -0
  582. /opik/evaluation/metrics/conversation/{session_completeness → llm_judges/conversational_coherence}/__init__.py +0 -0
  583. /opik/evaluation/metrics/conversation/{conversational_coherence → llm_judges/conversational_coherence}/schema.py +0 -0
  584. /opik/evaluation/metrics/conversation/{user_frustration → llm_judges/session_completeness}/__init__.py +0 -0
  585. /opik/evaluation/metrics/conversation/{session_completeness → llm_judges/session_completeness}/schema.py +0 -0
  586. /opik/evaluation/metrics/conversation/{user_frustration → llm_judges/user_frustration}/schema.py +0 -0
  587. /opik/integrations/bedrock/{stream_wrappers.py → converse/stream_wrappers.py} +0 -0
  588. /opik/rest_api/{spans/types → types}/span_update_type.py +0 -0
  589. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/WHEEL +0 -0
  590. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/entry_points.txt +0 -0
  591. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/licenses/LICENSE +0 -0
  592. {opik-1.8.39.dist-info → opik-1.9.71.dist-info}/top_level.txt +0 -0
@@ -19,6 +19,9 @@ from ..types.prompt_detail import PromptDetail
19
19
  from ..types.prompt_page_public import PromptPagePublic
20
20
  from ..types.prompt_version_detail import PromptVersionDetail
21
21
  from ..types.prompt_version_page_public import PromptVersionPagePublic
22
+ from ..types.prompt_version_update import PromptVersionUpdate
23
+ from .types.create_prompt_version_detail_template_structure import CreatePromptVersionDetailTemplateStructure
24
+ from .types.prompt_write_template_structure import PromptWriteTemplateStructure
22
25
  from .types.prompt_write_type import PromptWriteType
23
26
 
24
27
  # this is used as the default value for optional parameters
@@ -99,6 +102,7 @@ class RawPromptsClient:
99
102
  metadata: typing.Optional[JsonNodeWrite] = OMIT,
100
103
  change_description: typing.Optional[str] = OMIT,
101
104
  type: typing.Optional[PromptWriteType] = OMIT,
105
+ template_structure: typing.Optional[PromptWriteTemplateStructure] = OMIT,
102
106
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
103
107
  request_options: typing.Optional[RequestOptions] = None,
104
108
  ) -> HttpResponse[None]:
@@ -121,6 +125,9 @@ class RawPromptsClient:
121
125
 
122
126
  type : typing.Optional[PromptWriteType]
123
127
 
128
+ template_structure : typing.Optional[PromptWriteTemplateStructure]
129
+ Template structure type: 'text' or 'chat'. Immutable after creation.
130
+
124
131
  tags : typing.Optional[typing.Sequence[str]]
125
132
 
126
133
  request_options : typing.Optional[RequestOptions]
@@ -141,6 +148,7 @@ class RawPromptsClient:
141
148
  "metadata": metadata,
142
149
  "change_description": change_description,
143
150
  "type": type,
151
+ "template_structure": template_structure,
144
152
  "tags": tags,
145
153
  },
146
154
  headers={
@@ -191,7 +199,12 @@ class RawPromptsClient:
191
199
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
192
200
 
193
201
  def create_prompt_version(
194
- self, *, name: str, version: PromptVersionDetail, request_options: typing.Optional[RequestOptions] = None
202
+ self,
203
+ *,
204
+ name: str,
205
+ version: PromptVersionDetail,
206
+ template_structure: typing.Optional[CreatePromptVersionDetailTemplateStructure] = OMIT,
207
+ request_options: typing.Optional[RequestOptions] = None,
195
208
  ) -> HttpResponse[PromptVersionDetail]:
196
209
  """
197
210
  Create prompt version
@@ -202,6 +215,9 @@ class RawPromptsClient:
202
215
 
203
216
  version : PromptVersionDetail
204
217
 
218
+ template_structure : typing.Optional[CreatePromptVersionDetailTemplateStructure]
219
+ 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.
220
+
205
221
  request_options : typing.Optional[RequestOptions]
206
222
  Request-specific configuration.
207
223
 
@@ -218,6 +234,7 @@ class RawPromptsClient:
218
234
  "version": convert_and_respect_annotation_metadata(
219
235
  object_=version, annotation=PromptVersionDetail, direction="write"
220
236
  ),
237
+ "template_structure": template_structure,
221
238
  },
222
239
  headers={
223
240
  "content-type": "application/json",
@@ -273,6 +290,80 @@ class RawPromptsClient:
273
290
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
274
291
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
275
292
 
293
+ def update_prompt_versions(
294
+ self,
295
+ *,
296
+ ids: typing.Sequence[str],
297
+ update: PromptVersionUpdate,
298
+ merge_tags: typing.Optional[bool] = OMIT,
299
+ request_options: typing.Optional[RequestOptions] = None,
300
+ ) -> HttpResponse[None]:
301
+ """
302
+ Update one or more prompt versions.
303
+
304
+ Note: Prompt versions are immutable by design.
305
+ Only organizational properties, such as tags etc., can be updated.
306
+ Core properties like template and metadata cannot be modified after creation.
307
+
308
+ PATCH semantics:
309
+ - non-empty values update the field
310
+ - null values preserve existing field values (no change)
311
+ - empty values explicitly clear the field
312
+
313
+ Parameters
314
+ ----------
315
+ ids : typing.Sequence[str]
316
+ IDs of prompt versions to update
317
+
318
+ update : PromptVersionUpdate
319
+
320
+ merge_tags : typing.Optional[bool]
321
+ Tag merge behavior:
322
+ - true: Add new tags to existing tags (union)
323
+ - false: Replace all existing tags with new tags (default behaviour if not provided)
324
+
325
+ request_options : typing.Optional[RequestOptions]
326
+ Request-specific configuration.
327
+
328
+ Returns
329
+ -------
330
+ HttpResponse[None]
331
+ """
332
+ _response = self._client_wrapper.httpx_client.request(
333
+ "v1/private/prompts/versions",
334
+ method="PATCH",
335
+ json={
336
+ "ids": ids,
337
+ "update": convert_and_respect_annotation_metadata(
338
+ object_=update, annotation=PromptVersionUpdate, direction="write"
339
+ ),
340
+ "merge_tags": merge_tags,
341
+ },
342
+ headers={
343
+ "content-type": "application/json",
344
+ },
345
+ request_options=request_options,
346
+ omit=OMIT,
347
+ )
348
+ try:
349
+ if 200 <= _response.status_code < 300:
350
+ return HttpResponse(response=_response, data=None)
351
+ if _response.status_code == 400:
352
+ raise BadRequestError(
353
+ headers=dict(_response.headers),
354
+ body=typing.cast(
355
+ typing.Optional[typing.Any],
356
+ parse_obj_as(
357
+ type_=typing.Optional[typing.Any], # type: ignore
358
+ object_=_response.json(),
359
+ ),
360
+ ),
361
+ )
362
+ _response_json = _response.json()
363
+ except JSONDecodeError:
364
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
365
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
366
+
276
367
  def get_prompt_by_id(
277
368
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
278
369
  ) -> HttpResponse[PromptDetail]:
@@ -537,6 +628,9 @@ class RawPromptsClient:
537
628
  *,
538
629
  page: typing.Optional[int] = None,
539
630
  size: typing.Optional[int] = None,
631
+ search: typing.Optional[str] = None,
632
+ sorting: typing.Optional[str] = None,
633
+ filters: typing.Optional[str] = None,
540
634
  request_options: typing.Optional[RequestOptions] = None,
541
635
  ) -> HttpResponse[PromptVersionPagePublic]:
542
636
  """
@@ -550,6 +644,13 @@ class RawPromptsClient:
550
644
 
551
645
  size : typing.Optional[int]
552
646
 
647
+ search : typing.Optional[str]
648
+ Search text to find in template or change description fields
649
+
650
+ sorting : typing.Optional[str]
651
+
652
+ filters : typing.Optional[str]
653
+
553
654
  request_options : typing.Optional[RequestOptions]
554
655
  Request-specific configuration.
555
656
 
@@ -564,6 +665,9 @@ class RawPromptsClient:
564
665
  params={
565
666
  "page": page,
566
667
  "size": size,
668
+ "search": search,
669
+ "sorting": sorting,
670
+ "filters": filters,
567
671
  },
568
672
  request_options=request_options,
569
673
  )
@@ -582,6 +686,68 @@ class RawPromptsClient:
582
686
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
583
687
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
584
688
 
689
+ def restore_prompt_version(
690
+ self, prompt_id: str, version_id: str, *, request_options: typing.Optional[RequestOptions] = None
691
+ ) -> HttpResponse[PromptVersionDetail]:
692
+ """
693
+ Restore a prompt version by creating a new version with the content from the specified version
694
+
695
+ Parameters
696
+ ----------
697
+ prompt_id : str
698
+
699
+ version_id : str
700
+
701
+ request_options : typing.Optional[RequestOptions]
702
+ Request-specific configuration.
703
+
704
+ Returns
705
+ -------
706
+ HttpResponse[PromptVersionDetail]
707
+ OK
708
+ """
709
+ _response = self._client_wrapper.httpx_client.request(
710
+ f"v1/private/prompts/{jsonable_encoder(prompt_id)}/versions/{jsonable_encoder(version_id)}/restore",
711
+ method="POST",
712
+ request_options=request_options,
713
+ )
714
+ try:
715
+ if 200 <= _response.status_code < 300:
716
+ _data = typing.cast(
717
+ PromptVersionDetail,
718
+ parse_obj_as(
719
+ type_=PromptVersionDetail, # type: ignore
720
+ object_=_response.json(),
721
+ ),
722
+ )
723
+ return HttpResponse(response=_response, data=_data)
724
+ if _response.status_code == 400:
725
+ raise BadRequestError(
726
+ headers=dict(_response.headers),
727
+ body=typing.cast(
728
+ typing.Optional[typing.Any],
729
+ parse_obj_as(
730
+ type_=typing.Optional[typing.Any], # type: ignore
731
+ object_=_response.json(),
732
+ ),
733
+ ),
734
+ )
735
+ if _response.status_code == 404:
736
+ raise NotFoundError(
737
+ headers=dict(_response.headers),
738
+ body=typing.cast(
739
+ typing.Optional[typing.Any],
740
+ parse_obj_as(
741
+ type_=typing.Optional[typing.Any], # type: ignore
742
+ object_=_response.json(),
743
+ ),
744
+ ),
745
+ )
746
+ _response_json = _response.json()
747
+ except JSONDecodeError:
748
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
749
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
750
+
585
751
  def retrieve_prompt_version(
586
752
  self, *, name: str, commit: typing.Optional[str] = OMIT, request_options: typing.Optional[RequestOptions] = None
587
753
  ) -> HttpResponse[PromptVersionDetail]:
@@ -738,6 +904,7 @@ class AsyncRawPromptsClient:
738
904
  metadata: typing.Optional[JsonNodeWrite] = OMIT,
739
905
  change_description: typing.Optional[str] = OMIT,
740
906
  type: typing.Optional[PromptWriteType] = OMIT,
907
+ template_structure: typing.Optional[PromptWriteTemplateStructure] = OMIT,
741
908
  tags: typing.Optional[typing.Sequence[str]] = OMIT,
742
909
  request_options: typing.Optional[RequestOptions] = None,
743
910
  ) -> AsyncHttpResponse[None]:
@@ -760,6 +927,9 @@ class AsyncRawPromptsClient:
760
927
 
761
928
  type : typing.Optional[PromptWriteType]
762
929
 
930
+ template_structure : typing.Optional[PromptWriteTemplateStructure]
931
+ Template structure type: 'text' or 'chat'. Immutable after creation.
932
+
763
933
  tags : typing.Optional[typing.Sequence[str]]
764
934
 
765
935
  request_options : typing.Optional[RequestOptions]
@@ -780,6 +950,7 @@ class AsyncRawPromptsClient:
780
950
  "metadata": metadata,
781
951
  "change_description": change_description,
782
952
  "type": type,
953
+ "template_structure": template_structure,
783
954
  "tags": tags,
784
955
  },
785
956
  headers={
@@ -830,7 +1001,12 @@ class AsyncRawPromptsClient:
830
1001
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
831
1002
 
832
1003
  async def create_prompt_version(
833
- self, *, name: str, version: PromptVersionDetail, request_options: typing.Optional[RequestOptions] = None
1004
+ self,
1005
+ *,
1006
+ name: str,
1007
+ version: PromptVersionDetail,
1008
+ template_structure: typing.Optional[CreatePromptVersionDetailTemplateStructure] = OMIT,
1009
+ request_options: typing.Optional[RequestOptions] = None,
834
1010
  ) -> AsyncHttpResponse[PromptVersionDetail]:
835
1011
  """
836
1012
  Create prompt version
@@ -841,6 +1017,9 @@ class AsyncRawPromptsClient:
841
1017
 
842
1018
  version : PromptVersionDetail
843
1019
 
1020
+ template_structure : typing.Optional[CreatePromptVersionDetailTemplateStructure]
1021
+ 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.
1022
+
844
1023
  request_options : typing.Optional[RequestOptions]
845
1024
  Request-specific configuration.
846
1025
 
@@ -857,6 +1036,7 @@ class AsyncRawPromptsClient:
857
1036
  "version": convert_and_respect_annotation_metadata(
858
1037
  object_=version, annotation=PromptVersionDetail, direction="write"
859
1038
  ),
1039
+ "template_structure": template_structure,
860
1040
  },
861
1041
  headers={
862
1042
  "content-type": "application/json",
@@ -912,6 +1092,80 @@ class AsyncRawPromptsClient:
912
1092
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
913
1093
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
914
1094
 
1095
+ async def update_prompt_versions(
1096
+ self,
1097
+ *,
1098
+ ids: typing.Sequence[str],
1099
+ update: PromptVersionUpdate,
1100
+ merge_tags: typing.Optional[bool] = OMIT,
1101
+ request_options: typing.Optional[RequestOptions] = None,
1102
+ ) -> AsyncHttpResponse[None]:
1103
+ """
1104
+ Update one or more prompt versions.
1105
+
1106
+ Note: Prompt versions are immutable by design.
1107
+ Only organizational properties, such as tags etc., can be updated.
1108
+ Core properties like template and metadata cannot be modified after creation.
1109
+
1110
+ PATCH semantics:
1111
+ - non-empty values update the field
1112
+ - null values preserve existing field values (no change)
1113
+ - empty values explicitly clear the field
1114
+
1115
+ Parameters
1116
+ ----------
1117
+ ids : typing.Sequence[str]
1118
+ IDs of prompt versions to update
1119
+
1120
+ update : PromptVersionUpdate
1121
+
1122
+ merge_tags : typing.Optional[bool]
1123
+ Tag merge behavior:
1124
+ - true: Add new tags to existing tags (union)
1125
+ - false: Replace all existing tags with new tags (default behaviour if not provided)
1126
+
1127
+ request_options : typing.Optional[RequestOptions]
1128
+ Request-specific configuration.
1129
+
1130
+ Returns
1131
+ -------
1132
+ AsyncHttpResponse[None]
1133
+ """
1134
+ _response = await self._client_wrapper.httpx_client.request(
1135
+ "v1/private/prompts/versions",
1136
+ method="PATCH",
1137
+ json={
1138
+ "ids": ids,
1139
+ "update": convert_and_respect_annotation_metadata(
1140
+ object_=update, annotation=PromptVersionUpdate, direction="write"
1141
+ ),
1142
+ "merge_tags": merge_tags,
1143
+ },
1144
+ headers={
1145
+ "content-type": "application/json",
1146
+ },
1147
+ request_options=request_options,
1148
+ omit=OMIT,
1149
+ )
1150
+ try:
1151
+ if 200 <= _response.status_code < 300:
1152
+ return AsyncHttpResponse(response=_response, data=None)
1153
+ if _response.status_code == 400:
1154
+ raise BadRequestError(
1155
+ headers=dict(_response.headers),
1156
+ body=typing.cast(
1157
+ typing.Optional[typing.Any],
1158
+ parse_obj_as(
1159
+ type_=typing.Optional[typing.Any], # type: ignore
1160
+ object_=_response.json(),
1161
+ ),
1162
+ ),
1163
+ )
1164
+ _response_json = _response.json()
1165
+ except JSONDecodeError:
1166
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1167
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1168
+
915
1169
  async def get_prompt_by_id(
916
1170
  self, id: str, *, request_options: typing.Optional[RequestOptions] = None
917
1171
  ) -> AsyncHttpResponse[PromptDetail]:
@@ -1178,6 +1432,9 @@ class AsyncRawPromptsClient:
1178
1432
  *,
1179
1433
  page: typing.Optional[int] = None,
1180
1434
  size: typing.Optional[int] = None,
1435
+ search: typing.Optional[str] = None,
1436
+ sorting: typing.Optional[str] = None,
1437
+ filters: typing.Optional[str] = None,
1181
1438
  request_options: typing.Optional[RequestOptions] = None,
1182
1439
  ) -> AsyncHttpResponse[PromptVersionPagePublic]:
1183
1440
  """
@@ -1191,6 +1448,13 @@ class AsyncRawPromptsClient:
1191
1448
 
1192
1449
  size : typing.Optional[int]
1193
1450
 
1451
+ search : typing.Optional[str]
1452
+ Search text to find in template or change description fields
1453
+
1454
+ sorting : typing.Optional[str]
1455
+
1456
+ filters : typing.Optional[str]
1457
+
1194
1458
  request_options : typing.Optional[RequestOptions]
1195
1459
  Request-specific configuration.
1196
1460
 
@@ -1205,6 +1469,9 @@ class AsyncRawPromptsClient:
1205
1469
  params={
1206
1470
  "page": page,
1207
1471
  "size": size,
1472
+ "search": search,
1473
+ "sorting": sorting,
1474
+ "filters": filters,
1208
1475
  },
1209
1476
  request_options=request_options,
1210
1477
  )
@@ -1223,6 +1490,68 @@ class AsyncRawPromptsClient:
1223
1490
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1224
1491
  raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1225
1492
 
1493
+ async def restore_prompt_version(
1494
+ self, prompt_id: str, version_id: str, *, request_options: typing.Optional[RequestOptions] = None
1495
+ ) -> AsyncHttpResponse[PromptVersionDetail]:
1496
+ """
1497
+ Restore a prompt version by creating a new version with the content from the specified version
1498
+
1499
+ Parameters
1500
+ ----------
1501
+ prompt_id : str
1502
+
1503
+ version_id : str
1504
+
1505
+ request_options : typing.Optional[RequestOptions]
1506
+ Request-specific configuration.
1507
+
1508
+ Returns
1509
+ -------
1510
+ AsyncHttpResponse[PromptVersionDetail]
1511
+ OK
1512
+ """
1513
+ _response = await self._client_wrapper.httpx_client.request(
1514
+ f"v1/private/prompts/{jsonable_encoder(prompt_id)}/versions/{jsonable_encoder(version_id)}/restore",
1515
+ method="POST",
1516
+ request_options=request_options,
1517
+ )
1518
+ try:
1519
+ if 200 <= _response.status_code < 300:
1520
+ _data = typing.cast(
1521
+ PromptVersionDetail,
1522
+ parse_obj_as(
1523
+ type_=PromptVersionDetail, # type: ignore
1524
+ object_=_response.json(),
1525
+ ),
1526
+ )
1527
+ return AsyncHttpResponse(response=_response, data=_data)
1528
+ if _response.status_code == 400:
1529
+ raise BadRequestError(
1530
+ headers=dict(_response.headers),
1531
+ body=typing.cast(
1532
+ typing.Optional[typing.Any],
1533
+ parse_obj_as(
1534
+ type_=typing.Optional[typing.Any], # type: ignore
1535
+ object_=_response.json(),
1536
+ ),
1537
+ ),
1538
+ )
1539
+ if _response.status_code == 404:
1540
+ raise NotFoundError(
1541
+ headers=dict(_response.headers),
1542
+ body=typing.cast(
1543
+ typing.Optional[typing.Any],
1544
+ parse_obj_as(
1545
+ type_=typing.Optional[typing.Any], # type: ignore
1546
+ object_=_response.json(),
1547
+ ),
1548
+ ),
1549
+ )
1550
+ _response_json = _response.json()
1551
+ except JSONDecodeError:
1552
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1553
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1554
+
1226
1555
  async def retrieve_prompt_version(
1227
1556
  self, *, name: str, commit: typing.Optional[str] = OMIT, request_options: typing.Optional[RequestOptions] = None
1228
1557
  ) -> AsyncHttpResponse[PromptVersionDetail]:
@@ -2,6 +2,8 @@
2
2
 
3
3
  # isort: skip_file
4
4
 
5
+ from .create_prompt_version_detail_template_structure import CreatePromptVersionDetailTemplateStructure
6
+ from .prompt_write_template_structure import PromptWriteTemplateStructure
5
7
  from .prompt_write_type import PromptWriteType
6
8
 
7
- __all__ = ["PromptWriteType"]
9
+ __all__ = ["CreatePromptVersionDetailTemplateStructure", "PromptWriteTemplateStructure", "PromptWriteType"]
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ CreatePromptVersionDetailTemplateStructure = typing.Union[typing.Literal["text", "chat"], typing.Any]
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ PromptWriteTemplateStructure = typing.Union[typing.Literal["text", "chat"], typing.Any]
@@ -7,7 +7,6 @@ from .types import (
7
7
  GetSpanStatsRequestType,
8
8
  GetSpansByProjectRequestType,
9
9
  SpanSearchStreamRequestPublicType,
10
- SpanUpdateType,
11
10
  )
12
11
 
13
12
  __all__ = [
@@ -15,5 +14,4 @@ __all__ = [
15
14
  "GetSpanStatsRequestType",
16
15
  "GetSpansByProjectRequestType",
17
16
  "SpanSearchStreamRequestPublicType",
18
- "SpanUpdateType",
19
17
  ]