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
@@ -0,0 +1,1015 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ..core.api_error import ApiError
7
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ..core.jsonable_encoder import jsonable_encoder
10
+ from ..core.pydantic_utilities import parse_obj_as
11
+ from ..core.request_options import RequestOptions
12
+ from ..core.serialization import convert_and_respect_annotation_metadata
13
+ from ..errors.bad_request_error import BadRequestError
14
+ from ..errors.conflict_error import ConflictError
15
+ from ..errors.not_found_error import NotFoundError
16
+ from ..errors.unprocessable_entity_error import UnprocessableEntityError
17
+ from ..types.alert_page_public import AlertPagePublic
18
+ from ..types.alert_public import AlertPublic
19
+ from ..types.alert_trigger_write import AlertTriggerWrite
20
+ from ..types.alert_write_alert_type import AlertWriteAlertType
21
+ from ..types.webhook_examples import WebhookExamples
22
+ from ..types.webhook_test_result import WebhookTestResult
23
+ from ..types.webhook_write import WebhookWrite
24
+ from .types.get_webhook_examples_request_alert_type import GetWebhookExamplesRequestAlertType
25
+
26
+ # this is used as the default value for optional parameters
27
+ OMIT = typing.cast(typing.Any, ...)
28
+
29
+
30
+ class RawAlertsClient:
31
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
32
+ self._client_wrapper = client_wrapper
33
+
34
+ def find_alerts(
35
+ self,
36
+ *,
37
+ page: typing.Optional[int] = None,
38
+ size: typing.Optional[int] = None,
39
+ sorting: typing.Optional[str] = None,
40
+ filters: typing.Optional[str] = None,
41
+ request_options: typing.Optional[RequestOptions] = None,
42
+ ) -> HttpResponse[AlertPagePublic]:
43
+ """
44
+ Find alerts
45
+
46
+ Parameters
47
+ ----------
48
+ page : typing.Optional[int]
49
+
50
+ size : typing.Optional[int]
51
+
52
+ sorting : typing.Optional[str]
53
+
54
+ filters : typing.Optional[str]
55
+
56
+ request_options : typing.Optional[RequestOptions]
57
+ Request-specific configuration.
58
+
59
+ Returns
60
+ -------
61
+ HttpResponse[AlertPagePublic]
62
+ OK
63
+ """
64
+ _response = self._client_wrapper.httpx_client.request(
65
+ "v1/private/alerts",
66
+ method="GET",
67
+ params={
68
+ "page": page,
69
+ "size": size,
70
+ "sorting": sorting,
71
+ "filters": filters,
72
+ },
73
+ request_options=request_options,
74
+ )
75
+ try:
76
+ if 200 <= _response.status_code < 300:
77
+ _data = typing.cast(
78
+ AlertPagePublic,
79
+ parse_obj_as(
80
+ type_=AlertPagePublic, # type: ignore
81
+ object_=_response.json(),
82
+ ),
83
+ )
84
+ return HttpResponse(response=_response, data=_data)
85
+ _response_json = _response.json()
86
+ except JSONDecodeError:
87
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
88
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
89
+
90
+ def create_alert(
91
+ self,
92
+ *,
93
+ webhook: WebhookWrite,
94
+ id: typing.Optional[str] = OMIT,
95
+ name: typing.Optional[str] = OMIT,
96
+ enabled: typing.Optional[bool] = OMIT,
97
+ alert_type: typing.Optional[AlertWriteAlertType] = OMIT,
98
+ metadata: typing.Optional[typing.Dict[str, str]] = OMIT,
99
+ triggers: typing.Optional[typing.Sequence[AlertTriggerWrite]] = OMIT,
100
+ request_options: typing.Optional[RequestOptions] = None,
101
+ ) -> HttpResponse[None]:
102
+ """
103
+ Create alert
104
+
105
+ Parameters
106
+ ----------
107
+ webhook : WebhookWrite
108
+
109
+ id : typing.Optional[str]
110
+
111
+ name : typing.Optional[str]
112
+
113
+ enabled : typing.Optional[bool]
114
+
115
+ alert_type : typing.Optional[AlertWriteAlertType]
116
+
117
+ metadata : typing.Optional[typing.Dict[str, str]]
118
+
119
+ triggers : typing.Optional[typing.Sequence[AlertTriggerWrite]]
120
+
121
+ request_options : typing.Optional[RequestOptions]
122
+ Request-specific configuration.
123
+
124
+ Returns
125
+ -------
126
+ HttpResponse[None]
127
+ """
128
+ _response = self._client_wrapper.httpx_client.request(
129
+ "v1/private/alerts",
130
+ method="POST",
131
+ json={
132
+ "id": id,
133
+ "name": name,
134
+ "enabled": enabled,
135
+ "alert_type": alert_type,
136
+ "metadata": metadata,
137
+ "webhook": convert_and_respect_annotation_metadata(
138
+ object_=webhook, annotation=WebhookWrite, direction="write"
139
+ ),
140
+ "triggers": convert_and_respect_annotation_metadata(
141
+ object_=triggers, annotation=typing.Sequence[AlertTriggerWrite], direction="write"
142
+ ),
143
+ },
144
+ headers={
145
+ "content-type": "application/json",
146
+ },
147
+ request_options=request_options,
148
+ omit=OMIT,
149
+ )
150
+ try:
151
+ if 200 <= _response.status_code < 300:
152
+ return HttpResponse(response=_response, data=None)
153
+ if _response.status_code == 400:
154
+ raise BadRequestError(
155
+ headers=dict(_response.headers),
156
+ body=typing.cast(
157
+ typing.Optional[typing.Any],
158
+ parse_obj_as(
159
+ type_=typing.Optional[typing.Any], # type: ignore
160
+ object_=_response.json(),
161
+ ),
162
+ ),
163
+ )
164
+ if _response.status_code == 409:
165
+ raise ConflictError(
166
+ headers=dict(_response.headers),
167
+ body=typing.cast(
168
+ typing.Optional[typing.Any],
169
+ parse_obj_as(
170
+ type_=typing.Optional[typing.Any], # type: ignore
171
+ object_=_response.json(),
172
+ ),
173
+ ),
174
+ )
175
+ if _response.status_code == 422:
176
+ raise UnprocessableEntityError(
177
+ headers=dict(_response.headers),
178
+ body=typing.cast(
179
+ typing.Optional[typing.Any],
180
+ parse_obj_as(
181
+ type_=typing.Optional[typing.Any], # type: ignore
182
+ object_=_response.json(),
183
+ ),
184
+ ),
185
+ )
186
+ _response_json = _response.json()
187
+ except JSONDecodeError:
188
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
189
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
190
+
191
+ def delete_alert_batch(
192
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
193
+ ) -> HttpResponse[None]:
194
+ """
195
+ Delete multiple alerts by their IDs
196
+
197
+ Parameters
198
+ ----------
199
+ ids : typing.Sequence[str]
200
+
201
+ request_options : typing.Optional[RequestOptions]
202
+ Request-specific configuration.
203
+
204
+ Returns
205
+ -------
206
+ HttpResponse[None]
207
+ """
208
+ _response = self._client_wrapper.httpx_client.request(
209
+ "v1/private/alerts/delete",
210
+ method="POST",
211
+ json={
212
+ "ids": ids,
213
+ },
214
+ headers={
215
+ "content-type": "application/json",
216
+ },
217
+ request_options=request_options,
218
+ omit=OMIT,
219
+ )
220
+ try:
221
+ if 200 <= _response.status_code < 300:
222
+ return HttpResponse(response=_response, data=None)
223
+ if _response.status_code == 400:
224
+ raise BadRequestError(
225
+ headers=dict(_response.headers),
226
+ body=typing.cast(
227
+ typing.Optional[typing.Any],
228
+ parse_obj_as(
229
+ type_=typing.Optional[typing.Any], # type: ignore
230
+ object_=_response.json(),
231
+ ),
232
+ ),
233
+ )
234
+ _response_json = _response.json()
235
+ except JSONDecodeError:
236
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
237
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
238
+
239
+ def get_alert_by_id(
240
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
241
+ ) -> HttpResponse[AlertPublic]:
242
+ """
243
+ Get Alert by id
244
+
245
+ Parameters
246
+ ----------
247
+ id : str
248
+
249
+ request_options : typing.Optional[RequestOptions]
250
+ Request-specific configuration.
251
+
252
+ Returns
253
+ -------
254
+ HttpResponse[AlertPublic]
255
+ Alert resource
256
+ """
257
+ _response = self._client_wrapper.httpx_client.request(
258
+ f"v1/private/alerts/{jsonable_encoder(id)}",
259
+ method="GET",
260
+ request_options=request_options,
261
+ )
262
+ try:
263
+ if 200 <= _response.status_code < 300:
264
+ _data = typing.cast(
265
+ AlertPublic,
266
+ parse_obj_as(
267
+ type_=AlertPublic, # type: ignore
268
+ object_=_response.json(),
269
+ ),
270
+ )
271
+ return HttpResponse(response=_response, data=_data)
272
+ if _response.status_code == 404:
273
+ raise NotFoundError(
274
+ headers=dict(_response.headers),
275
+ body=typing.cast(
276
+ typing.Optional[typing.Any],
277
+ parse_obj_as(
278
+ type_=typing.Optional[typing.Any], # type: ignore
279
+ object_=_response.json(),
280
+ ),
281
+ ),
282
+ )
283
+ _response_json = _response.json()
284
+ except JSONDecodeError:
285
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
286
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
287
+
288
+ def update_alert(
289
+ self,
290
+ id_: str,
291
+ *,
292
+ webhook: WebhookWrite,
293
+ id: typing.Optional[str] = OMIT,
294
+ name: typing.Optional[str] = OMIT,
295
+ enabled: typing.Optional[bool] = OMIT,
296
+ alert_type: typing.Optional[AlertWriteAlertType] = OMIT,
297
+ metadata: typing.Optional[typing.Dict[str, str]] = OMIT,
298
+ triggers: typing.Optional[typing.Sequence[AlertTriggerWrite]] = OMIT,
299
+ request_options: typing.Optional[RequestOptions] = None,
300
+ ) -> HttpResponse[None]:
301
+ """
302
+ Update alert
303
+
304
+ Parameters
305
+ ----------
306
+ id_ : str
307
+
308
+ webhook : WebhookWrite
309
+
310
+ id : typing.Optional[str]
311
+
312
+ name : typing.Optional[str]
313
+
314
+ enabled : typing.Optional[bool]
315
+
316
+ alert_type : typing.Optional[AlertWriteAlertType]
317
+
318
+ metadata : typing.Optional[typing.Dict[str, str]]
319
+
320
+ triggers : typing.Optional[typing.Sequence[AlertTriggerWrite]]
321
+
322
+ request_options : typing.Optional[RequestOptions]
323
+ Request-specific configuration.
324
+
325
+ Returns
326
+ -------
327
+ HttpResponse[None]
328
+ """
329
+ _response = self._client_wrapper.httpx_client.request(
330
+ f"v1/private/alerts/{jsonable_encoder(id_)}",
331
+ method="PUT",
332
+ json={
333
+ "id": id,
334
+ "name": name,
335
+ "enabled": enabled,
336
+ "alert_type": alert_type,
337
+ "metadata": metadata,
338
+ "webhook": convert_and_respect_annotation_metadata(
339
+ object_=webhook, annotation=WebhookWrite, direction="write"
340
+ ),
341
+ "triggers": convert_and_respect_annotation_metadata(
342
+ object_=triggers, annotation=typing.Sequence[AlertTriggerWrite], direction="write"
343
+ ),
344
+ },
345
+ headers={
346
+ "content-type": "application/json",
347
+ },
348
+ request_options=request_options,
349
+ omit=OMIT,
350
+ )
351
+ try:
352
+ if 200 <= _response.status_code < 300:
353
+ return HttpResponse(response=_response, data=None)
354
+ if _response.status_code == 400:
355
+ raise BadRequestError(
356
+ headers=dict(_response.headers),
357
+ body=typing.cast(
358
+ typing.Optional[typing.Any],
359
+ parse_obj_as(
360
+ type_=typing.Optional[typing.Any], # type: ignore
361
+ object_=_response.json(),
362
+ ),
363
+ ),
364
+ )
365
+ if _response.status_code == 409:
366
+ raise ConflictError(
367
+ headers=dict(_response.headers),
368
+ body=typing.cast(
369
+ typing.Optional[typing.Any],
370
+ parse_obj_as(
371
+ type_=typing.Optional[typing.Any], # type: ignore
372
+ object_=_response.json(),
373
+ ),
374
+ ),
375
+ )
376
+ if _response.status_code == 422:
377
+ raise UnprocessableEntityError(
378
+ headers=dict(_response.headers),
379
+ body=typing.cast(
380
+ typing.Optional[typing.Any],
381
+ parse_obj_as(
382
+ type_=typing.Optional[typing.Any], # type: ignore
383
+ object_=_response.json(),
384
+ ),
385
+ ),
386
+ )
387
+ _response_json = _response.json()
388
+ except JSONDecodeError:
389
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
390
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
391
+
392
+ def get_webhook_examples(
393
+ self,
394
+ *,
395
+ alert_type: typing.Optional[GetWebhookExamplesRequestAlertType] = None,
396
+ request_options: typing.Optional[RequestOptions] = None,
397
+ ) -> HttpResponse[WebhookExamples]:
398
+ """
399
+ Get webhook payload examples for all alert event types, optionally filtered by alert type
400
+
401
+ Parameters
402
+ ----------
403
+ alert_type : typing.Optional[GetWebhookExamplesRequestAlertType]
404
+
405
+ request_options : typing.Optional[RequestOptions]
406
+ Request-specific configuration.
407
+
408
+ Returns
409
+ -------
410
+ HttpResponse[WebhookExamples]
411
+ Webhook examples
412
+ """
413
+ _response = self._client_wrapper.httpx_client.request(
414
+ "v1/private/alerts/webhooks/examples",
415
+ method="GET",
416
+ params={
417
+ "alert_type": alert_type,
418
+ },
419
+ request_options=request_options,
420
+ )
421
+ try:
422
+ if 200 <= _response.status_code < 300:
423
+ _data = typing.cast(
424
+ WebhookExamples,
425
+ parse_obj_as(
426
+ type_=WebhookExamples, # type: ignore
427
+ object_=_response.json(),
428
+ ),
429
+ )
430
+ return HttpResponse(response=_response, data=_data)
431
+ _response_json = _response.json()
432
+ except JSONDecodeError:
433
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
434
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
435
+
436
+ def test_webhook(
437
+ self,
438
+ *,
439
+ webhook: WebhookWrite,
440
+ id: typing.Optional[str] = OMIT,
441
+ name: typing.Optional[str] = OMIT,
442
+ enabled: typing.Optional[bool] = OMIT,
443
+ alert_type: typing.Optional[AlertWriteAlertType] = OMIT,
444
+ metadata: typing.Optional[typing.Dict[str, str]] = OMIT,
445
+ triggers: typing.Optional[typing.Sequence[AlertTriggerWrite]] = OMIT,
446
+ request_options: typing.Optional[RequestOptions] = None,
447
+ ) -> HttpResponse[WebhookTestResult]:
448
+ """
449
+ Test alert webhook
450
+
451
+ Parameters
452
+ ----------
453
+ webhook : WebhookWrite
454
+
455
+ id : typing.Optional[str]
456
+
457
+ name : typing.Optional[str]
458
+
459
+ enabled : typing.Optional[bool]
460
+
461
+ alert_type : typing.Optional[AlertWriteAlertType]
462
+
463
+ metadata : typing.Optional[typing.Dict[str, str]]
464
+
465
+ triggers : typing.Optional[typing.Sequence[AlertTriggerWrite]]
466
+
467
+ request_options : typing.Optional[RequestOptions]
468
+ Request-specific configuration.
469
+
470
+ Returns
471
+ -------
472
+ HttpResponse[WebhookTestResult]
473
+ Webhook test
474
+ """
475
+ _response = self._client_wrapper.httpx_client.request(
476
+ "v1/private/alerts/webhooks/tests",
477
+ method="POST",
478
+ json={
479
+ "id": id,
480
+ "name": name,
481
+ "enabled": enabled,
482
+ "alert_type": alert_type,
483
+ "metadata": metadata,
484
+ "webhook": convert_and_respect_annotation_metadata(
485
+ object_=webhook, annotation=WebhookWrite, direction="write"
486
+ ),
487
+ "triggers": convert_and_respect_annotation_metadata(
488
+ object_=triggers, annotation=typing.Sequence[AlertTriggerWrite], direction="write"
489
+ ),
490
+ },
491
+ headers={
492
+ "content-type": "application/json",
493
+ },
494
+ request_options=request_options,
495
+ omit=OMIT,
496
+ )
497
+ try:
498
+ if 200 <= _response.status_code < 300:
499
+ _data = typing.cast(
500
+ WebhookTestResult,
501
+ parse_obj_as(
502
+ type_=WebhookTestResult, # type: ignore
503
+ object_=_response.json(),
504
+ ),
505
+ )
506
+ return HttpResponse(response=_response, data=_data)
507
+ if _response.status_code == 422:
508
+ raise UnprocessableEntityError(
509
+ headers=dict(_response.headers),
510
+ body=typing.cast(
511
+ typing.Optional[typing.Any],
512
+ parse_obj_as(
513
+ type_=typing.Optional[typing.Any], # type: ignore
514
+ object_=_response.json(),
515
+ ),
516
+ ),
517
+ )
518
+ _response_json = _response.json()
519
+ except JSONDecodeError:
520
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
521
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
522
+
523
+
524
+ class AsyncRawAlertsClient:
525
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
526
+ self._client_wrapper = client_wrapper
527
+
528
+ async def find_alerts(
529
+ self,
530
+ *,
531
+ page: typing.Optional[int] = None,
532
+ size: typing.Optional[int] = None,
533
+ sorting: typing.Optional[str] = None,
534
+ filters: typing.Optional[str] = None,
535
+ request_options: typing.Optional[RequestOptions] = None,
536
+ ) -> AsyncHttpResponse[AlertPagePublic]:
537
+ """
538
+ Find alerts
539
+
540
+ Parameters
541
+ ----------
542
+ page : typing.Optional[int]
543
+
544
+ size : typing.Optional[int]
545
+
546
+ sorting : typing.Optional[str]
547
+
548
+ filters : typing.Optional[str]
549
+
550
+ request_options : typing.Optional[RequestOptions]
551
+ Request-specific configuration.
552
+
553
+ Returns
554
+ -------
555
+ AsyncHttpResponse[AlertPagePublic]
556
+ OK
557
+ """
558
+ _response = await self._client_wrapper.httpx_client.request(
559
+ "v1/private/alerts",
560
+ method="GET",
561
+ params={
562
+ "page": page,
563
+ "size": size,
564
+ "sorting": sorting,
565
+ "filters": filters,
566
+ },
567
+ request_options=request_options,
568
+ )
569
+ try:
570
+ if 200 <= _response.status_code < 300:
571
+ _data = typing.cast(
572
+ AlertPagePublic,
573
+ parse_obj_as(
574
+ type_=AlertPagePublic, # type: ignore
575
+ object_=_response.json(),
576
+ ),
577
+ )
578
+ return AsyncHttpResponse(response=_response, data=_data)
579
+ _response_json = _response.json()
580
+ except JSONDecodeError:
581
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
582
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
583
+
584
+ async def create_alert(
585
+ self,
586
+ *,
587
+ webhook: WebhookWrite,
588
+ id: typing.Optional[str] = OMIT,
589
+ name: typing.Optional[str] = OMIT,
590
+ enabled: typing.Optional[bool] = OMIT,
591
+ alert_type: typing.Optional[AlertWriteAlertType] = OMIT,
592
+ metadata: typing.Optional[typing.Dict[str, str]] = OMIT,
593
+ triggers: typing.Optional[typing.Sequence[AlertTriggerWrite]] = OMIT,
594
+ request_options: typing.Optional[RequestOptions] = None,
595
+ ) -> AsyncHttpResponse[None]:
596
+ """
597
+ Create alert
598
+
599
+ Parameters
600
+ ----------
601
+ webhook : WebhookWrite
602
+
603
+ id : typing.Optional[str]
604
+
605
+ name : typing.Optional[str]
606
+
607
+ enabled : typing.Optional[bool]
608
+
609
+ alert_type : typing.Optional[AlertWriteAlertType]
610
+
611
+ metadata : typing.Optional[typing.Dict[str, str]]
612
+
613
+ triggers : typing.Optional[typing.Sequence[AlertTriggerWrite]]
614
+
615
+ request_options : typing.Optional[RequestOptions]
616
+ Request-specific configuration.
617
+
618
+ Returns
619
+ -------
620
+ AsyncHttpResponse[None]
621
+ """
622
+ _response = await self._client_wrapper.httpx_client.request(
623
+ "v1/private/alerts",
624
+ method="POST",
625
+ json={
626
+ "id": id,
627
+ "name": name,
628
+ "enabled": enabled,
629
+ "alert_type": alert_type,
630
+ "metadata": metadata,
631
+ "webhook": convert_and_respect_annotation_metadata(
632
+ object_=webhook, annotation=WebhookWrite, direction="write"
633
+ ),
634
+ "triggers": convert_and_respect_annotation_metadata(
635
+ object_=triggers, annotation=typing.Sequence[AlertTriggerWrite], direction="write"
636
+ ),
637
+ },
638
+ headers={
639
+ "content-type": "application/json",
640
+ },
641
+ request_options=request_options,
642
+ omit=OMIT,
643
+ )
644
+ try:
645
+ if 200 <= _response.status_code < 300:
646
+ return AsyncHttpResponse(response=_response, data=None)
647
+ if _response.status_code == 400:
648
+ raise BadRequestError(
649
+ headers=dict(_response.headers),
650
+ body=typing.cast(
651
+ typing.Optional[typing.Any],
652
+ parse_obj_as(
653
+ type_=typing.Optional[typing.Any], # type: ignore
654
+ object_=_response.json(),
655
+ ),
656
+ ),
657
+ )
658
+ if _response.status_code == 409:
659
+ raise ConflictError(
660
+ headers=dict(_response.headers),
661
+ body=typing.cast(
662
+ typing.Optional[typing.Any],
663
+ parse_obj_as(
664
+ type_=typing.Optional[typing.Any], # type: ignore
665
+ object_=_response.json(),
666
+ ),
667
+ ),
668
+ )
669
+ if _response.status_code == 422:
670
+ raise UnprocessableEntityError(
671
+ headers=dict(_response.headers),
672
+ body=typing.cast(
673
+ typing.Optional[typing.Any],
674
+ parse_obj_as(
675
+ type_=typing.Optional[typing.Any], # type: ignore
676
+ object_=_response.json(),
677
+ ),
678
+ ),
679
+ )
680
+ _response_json = _response.json()
681
+ except JSONDecodeError:
682
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
683
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
684
+
685
+ async def delete_alert_batch(
686
+ self, *, ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
687
+ ) -> AsyncHttpResponse[None]:
688
+ """
689
+ Delete multiple alerts by their IDs
690
+
691
+ Parameters
692
+ ----------
693
+ ids : typing.Sequence[str]
694
+
695
+ request_options : typing.Optional[RequestOptions]
696
+ Request-specific configuration.
697
+
698
+ Returns
699
+ -------
700
+ AsyncHttpResponse[None]
701
+ """
702
+ _response = await self._client_wrapper.httpx_client.request(
703
+ "v1/private/alerts/delete",
704
+ method="POST",
705
+ json={
706
+ "ids": ids,
707
+ },
708
+ headers={
709
+ "content-type": "application/json",
710
+ },
711
+ request_options=request_options,
712
+ omit=OMIT,
713
+ )
714
+ try:
715
+ if 200 <= _response.status_code < 300:
716
+ return AsyncHttpResponse(response=_response, data=None)
717
+ if _response.status_code == 400:
718
+ raise BadRequestError(
719
+ headers=dict(_response.headers),
720
+ body=typing.cast(
721
+ typing.Optional[typing.Any],
722
+ parse_obj_as(
723
+ type_=typing.Optional[typing.Any], # type: ignore
724
+ object_=_response.json(),
725
+ ),
726
+ ),
727
+ )
728
+ _response_json = _response.json()
729
+ except JSONDecodeError:
730
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
731
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
732
+
733
+ async def get_alert_by_id(
734
+ self, id: str, *, request_options: typing.Optional[RequestOptions] = None
735
+ ) -> AsyncHttpResponse[AlertPublic]:
736
+ """
737
+ Get Alert by id
738
+
739
+ Parameters
740
+ ----------
741
+ id : str
742
+
743
+ request_options : typing.Optional[RequestOptions]
744
+ Request-specific configuration.
745
+
746
+ Returns
747
+ -------
748
+ AsyncHttpResponse[AlertPublic]
749
+ Alert resource
750
+ """
751
+ _response = await self._client_wrapper.httpx_client.request(
752
+ f"v1/private/alerts/{jsonable_encoder(id)}",
753
+ method="GET",
754
+ request_options=request_options,
755
+ )
756
+ try:
757
+ if 200 <= _response.status_code < 300:
758
+ _data = typing.cast(
759
+ AlertPublic,
760
+ parse_obj_as(
761
+ type_=AlertPublic, # type: ignore
762
+ object_=_response.json(),
763
+ ),
764
+ )
765
+ return AsyncHttpResponse(response=_response, data=_data)
766
+ if _response.status_code == 404:
767
+ raise NotFoundError(
768
+ headers=dict(_response.headers),
769
+ body=typing.cast(
770
+ typing.Optional[typing.Any],
771
+ parse_obj_as(
772
+ type_=typing.Optional[typing.Any], # type: ignore
773
+ object_=_response.json(),
774
+ ),
775
+ ),
776
+ )
777
+ _response_json = _response.json()
778
+ except JSONDecodeError:
779
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
780
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
781
+
782
+ async def update_alert(
783
+ self,
784
+ id_: str,
785
+ *,
786
+ webhook: WebhookWrite,
787
+ id: typing.Optional[str] = OMIT,
788
+ name: typing.Optional[str] = OMIT,
789
+ enabled: typing.Optional[bool] = OMIT,
790
+ alert_type: typing.Optional[AlertWriteAlertType] = OMIT,
791
+ metadata: typing.Optional[typing.Dict[str, str]] = OMIT,
792
+ triggers: typing.Optional[typing.Sequence[AlertTriggerWrite]] = OMIT,
793
+ request_options: typing.Optional[RequestOptions] = None,
794
+ ) -> AsyncHttpResponse[None]:
795
+ """
796
+ Update alert
797
+
798
+ Parameters
799
+ ----------
800
+ id_ : str
801
+
802
+ webhook : WebhookWrite
803
+
804
+ id : typing.Optional[str]
805
+
806
+ name : typing.Optional[str]
807
+
808
+ enabled : typing.Optional[bool]
809
+
810
+ alert_type : typing.Optional[AlertWriteAlertType]
811
+
812
+ metadata : typing.Optional[typing.Dict[str, str]]
813
+
814
+ triggers : typing.Optional[typing.Sequence[AlertTriggerWrite]]
815
+
816
+ request_options : typing.Optional[RequestOptions]
817
+ Request-specific configuration.
818
+
819
+ Returns
820
+ -------
821
+ AsyncHttpResponse[None]
822
+ """
823
+ _response = await self._client_wrapper.httpx_client.request(
824
+ f"v1/private/alerts/{jsonable_encoder(id_)}",
825
+ method="PUT",
826
+ json={
827
+ "id": id,
828
+ "name": name,
829
+ "enabled": enabled,
830
+ "alert_type": alert_type,
831
+ "metadata": metadata,
832
+ "webhook": convert_and_respect_annotation_metadata(
833
+ object_=webhook, annotation=WebhookWrite, direction="write"
834
+ ),
835
+ "triggers": convert_and_respect_annotation_metadata(
836
+ object_=triggers, annotation=typing.Sequence[AlertTriggerWrite], direction="write"
837
+ ),
838
+ },
839
+ headers={
840
+ "content-type": "application/json",
841
+ },
842
+ request_options=request_options,
843
+ omit=OMIT,
844
+ )
845
+ try:
846
+ if 200 <= _response.status_code < 300:
847
+ return AsyncHttpResponse(response=_response, data=None)
848
+ if _response.status_code == 400:
849
+ raise BadRequestError(
850
+ headers=dict(_response.headers),
851
+ body=typing.cast(
852
+ typing.Optional[typing.Any],
853
+ parse_obj_as(
854
+ type_=typing.Optional[typing.Any], # type: ignore
855
+ object_=_response.json(),
856
+ ),
857
+ ),
858
+ )
859
+ if _response.status_code == 409:
860
+ raise ConflictError(
861
+ headers=dict(_response.headers),
862
+ body=typing.cast(
863
+ typing.Optional[typing.Any],
864
+ parse_obj_as(
865
+ type_=typing.Optional[typing.Any], # type: ignore
866
+ object_=_response.json(),
867
+ ),
868
+ ),
869
+ )
870
+ if _response.status_code == 422:
871
+ raise UnprocessableEntityError(
872
+ headers=dict(_response.headers),
873
+ body=typing.cast(
874
+ typing.Optional[typing.Any],
875
+ parse_obj_as(
876
+ type_=typing.Optional[typing.Any], # type: ignore
877
+ object_=_response.json(),
878
+ ),
879
+ ),
880
+ )
881
+ _response_json = _response.json()
882
+ except JSONDecodeError:
883
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
884
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
885
+
886
+ async def get_webhook_examples(
887
+ self,
888
+ *,
889
+ alert_type: typing.Optional[GetWebhookExamplesRequestAlertType] = None,
890
+ request_options: typing.Optional[RequestOptions] = None,
891
+ ) -> AsyncHttpResponse[WebhookExamples]:
892
+ """
893
+ Get webhook payload examples for all alert event types, optionally filtered by alert type
894
+
895
+ Parameters
896
+ ----------
897
+ alert_type : typing.Optional[GetWebhookExamplesRequestAlertType]
898
+
899
+ request_options : typing.Optional[RequestOptions]
900
+ Request-specific configuration.
901
+
902
+ Returns
903
+ -------
904
+ AsyncHttpResponse[WebhookExamples]
905
+ Webhook examples
906
+ """
907
+ _response = await self._client_wrapper.httpx_client.request(
908
+ "v1/private/alerts/webhooks/examples",
909
+ method="GET",
910
+ params={
911
+ "alert_type": alert_type,
912
+ },
913
+ request_options=request_options,
914
+ )
915
+ try:
916
+ if 200 <= _response.status_code < 300:
917
+ _data = typing.cast(
918
+ WebhookExamples,
919
+ parse_obj_as(
920
+ type_=WebhookExamples, # type: ignore
921
+ object_=_response.json(),
922
+ ),
923
+ )
924
+ return AsyncHttpResponse(response=_response, data=_data)
925
+ _response_json = _response.json()
926
+ except JSONDecodeError:
927
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
928
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
929
+
930
+ async def test_webhook(
931
+ self,
932
+ *,
933
+ webhook: WebhookWrite,
934
+ id: typing.Optional[str] = OMIT,
935
+ name: typing.Optional[str] = OMIT,
936
+ enabled: typing.Optional[bool] = OMIT,
937
+ alert_type: typing.Optional[AlertWriteAlertType] = OMIT,
938
+ metadata: typing.Optional[typing.Dict[str, str]] = OMIT,
939
+ triggers: typing.Optional[typing.Sequence[AlertTriggerWrite]] = OMIT,
940
+ request_options: typing.Optional[RequestOptions] = None,
941
+ ) -> AsyncHttpResponse[WebhookTestResult]:
942
+ """
943
+ Test alert webhook
944
+
945
+ Parameters
946
+ ----------
947
+ webhook : WebhookWrite
948
+
949
+ id : typing.Optional[str]
950
+
951
+ name : typing.Optional[str]
952
+
953
+ enabled : typing.Optional[bool]
954
+
955
+ alert_type : typing.Optional[AlertWriteAlertType]
956
+
957
+ metadata : typing.Optional[typing.Dict[str, str]]
958
+
959
+ triggers : typing.Optional[typing.Sequence[AlertTriggerWrite]]
960
+
961
+ request_options : typing.Optional[RequestOptions]
962
+ Request-specific configuration.
963
+
964
+ Returns
965
+ -------
966
+ AsyncHttpResponse[WebhookTestResult]
967
+ Webhook test
968
+ """
969
+ _response = await self._client_wrapper.httpx_client.request(
970
+ "v1/private/alerts/webhooks/tests",
971
+ method="POST",
972
+ json={
973
+ "id": id,
974
+ "name": name,
975
+ "enabled": enabled,
976
+ "alert_type": alert_type,
977
+ "metadata": metadata,
978
+ "webhook": convert_and_respect_annotation_metadata(
979
+ object_=webhook, annotation=WebhookWrite, direction="write"
980
+ ),
981
+ "triggers": convert_and_respect_annotation_metadata(
982
+ object_=triggers, annotation=typing.Sequence[AlertTriggerWrite], direction="write"
983
+ ),
984
+ },
985
+ headers={
986
+ "content-type": "application/json",
987
+ },
988
+ request_options=request_options,
989
+ omit=OMIT,
990
+ )
991
+ try:
992
+ if 200 <= _response.status_code < 300:
993
+ _data = typing.cast(
994
+ WebhookTestResult,
995
+ parse_obj_as(
996
+ type_=WebhookTestResult, # type: ignore
997
+ object_=_response.json(),
998
+ ),
999
+ )
1000
+ return AsyncHttpResponse(response=_response, data=_data)
1001
+ if _response.status_code == 422:
1002
+ raise UnprocessableEntityError(
1003
+ headers=dict(_response.headers),
1004
+ body=typing.cast(
1005
+ typing.Optional[typing.Any],
1006
+ parse_obj_as(
1007
+ type_=typing.Optional[typing.Any], # type: ignore
1008
+ object_=_response.json(),
1009
+ ),
1010
+ ),
1011
+ )
1012
+ _response_json = _response.json()
1013
+ except JSONDecodeError:
1014
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1015
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)