honeycomb-api 0.1.0__py3-none-any.whl → 0.5.3__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 (443) hide show
  1. honeycomb/__init__.py +9 -0
  2. honeycomb/_generated/api/auth/get_auth.py +2 -5
  3. honeycomb/_generated/api/auth/get_v2_auth.py +2 -5
  4. honeycomb/_generated/api/boards/create_board.py +6 -5
  5. honeycomb/_generated/api/boards/create_board_view.py +14 -9
  6. honeycomb/_generated/api/boards/delete_board.py +2 -5
  7. honeycomb/_generated/api/boards/delete_board_view.py +2 -5
  8. honeycomb/_generated/api/boards/get_board.py +2 -5
  9. honeycomb/_generated/api/boards/get_board_view.py +2 -5
  10. honeycomb/_generated/api/boards/list_board_views.py +10 -9
  11. honeycomb/_generated/api/boards/list_boards.py +2 -5
  12. honeycomb/_generated/api/boards/update_board.py +10 -5
  13. honeycomb/_generated/api/boards/update_board_view.py +2 -5
  14. honeycomb/_generated/api/burn_alerts/create_burn_alert.py +6 -8
  15. honeycomb/_generated/api/burn_alerts/delete_burn_alert.py +2 -5
  16. honeycomb/_generated/api/burn_alerts/get_burn_alert.py +2 -5
  17. honeycomb/_generated/api/burn_alerts/list_burn_alerts_by_slo.py +2 -5
  18. honeycomb/_generated/api/calculated_fields/create_calculated_field.py +2 -5
  19. honeycomb/_generated/api/calculated_fields/delete_calculated_field.py +2 -5
  20. honeycomb/_generated/api/calculated_fields/get_calculated_field.py +2 -5
  21. honeycomb/_generated/api/calculated_fields/list_calculated_fields.py +2 -8
  22. honeycomb/_generated/api/calculated_fields/update_calculated_field.py +2 -5
  23. honeycomb/_generated/api/columns/create_column.py +2 -5
  24. honeycomb/_generated/api/columns/delete_column.py +2 -5
  25. honeycomb/_generated/api/columns/get_column.py +2 -5
  26. honeycomb/_generated/api/columns/list_columns.py +2 -8
  27. honeycomb/_generated/api/columns/update_column.py +2 -5
  28. honeycomb/_generated/api/dataset_definitions/list_dataset_definitions.py +2 -5
  29. honeycomb/_generated/api/dataset_definitions/patch_dataset_definitions.py +2 -5
  30. honeycomb/_generated/api/datasets/create_dataset.py +2 -5
  31. honeycomb/_generated/api/datasets/delete_dataset.py +2 -5
  32. honeycomb/_generated/api/datasets/get_dataset.py +2 -5
  33. honeycomb/_generated/api/datasets/list_datasets.py +2 -5
  34. honeycomb/_generated/api/datasets/update_dataset.py +2 -5
  35. honeycomb/_generated/api/enhance/record_enhance_indexer_usage.py +4 -6
  36. honeycomb/_generated/api/environments/create_environment.py +2 -5
  37. honeycomb/_generated/api/environments/delete_environment.py +2 -5
  38. honeycomb/_generated/api/environments/get_environment.py +2 -5
  39. honeycomb/_generated/api/environments/list_environments.py +2 -7
  40. honeycomb/_generated/api/environments/update_environment.py +2 -5
  41. honeycomb/_generated/api/events/create_event.py +2 -7
  42. honeycomb/_generated/api/events/create_events.py +7 -11
  43. honeycomb/_generated/api/key_management/create_api_key.py +2 -5
  44. honeycomb/_generated/api/key_management/delete_api_key.py +2 -5
  45. honeycomb/_generated/api/key_management/get_api_key.py +2 -5
  46. honeycomb/_generated/api/key_management/list_api_keys.py +2 -7
  47. honeycomb/_generated/api/key_management/update_api_key.py +2 -5
  48. honeycomb/_generated/api/kinesis_events/create_kinesis_events.py +2 -5
  49. honeycomb/_generated/api/marker_settings/create_marker_setting.py +2 -5
  50. honeycomb/_generated/api/marker_settings/delete_marker_settings.py +2 -5
  51. honeycomb/_generated/api/marker_settings/list_marker_settings.py +2 -5
  52. honeycomb/_generated/api/marker_settings/update_marker_settings.py +2 -5
  53. honeycomb/_generated/api/markers/create_marker.py +2 -5
  54. honeycomb/_generated/api/markers/create_marker_v2.py +2 -5
  55. honeycomb/_generated/api/markers/delete_marker.py +2 -5
  56. honeycomb/_generated/api/markers/get_marker.py +2 -5
  57. honeycomb/_generated/api/markers/update_marker.py +2 -5
  58. honeycomb/_generated/api/markers/update_marker_v2.py +2 -5
  59. honeycomb/_generated/api/pipelines/get_pipeline_configuration.py +4 -8
  60. honeycomb/_generated/api/pipelines/record_pipeline_usage.py +4 -6
  61. honeycomb/_generated/api/pipelines/update_pipeline_configuration_rollout.py +6 -7
  62. honeycomb/_generated/api/queries/create_query.py +2 -5
  63. honeycomb/_generated/api/queries/get_query.py +2 -5
  64. honeycomb/_generated/api/query_annotations/create_query_annotation.py +2 -5
  65. honeycomb/_generated/api/query_annotations/delete_query_annotation.py +2 -5
  66. honeycomb/_generated/api/query_annotations/get_query_annotation.py +2 -5
  67. honeycomb/_generated/api/query_annotations/list_query_annotations.py +2 -7
  68. honeycomb/_generated/api/query_annotations/update_query_annotation.py +2 -5
  69. honeycomb/_generated/api/query_data/create_query_result.py +2 -5
  70. honeycomb/_generated/api/query_data/get_query_result.py +2 -5
  71. honeycomb/_generated/api/recipients/create_recipient.py +2 -6
  72. honeycomb/_generated/api/recipients/delete_recipient.py +2 -5
  73. honeycomb/_generated/api/recipients/get_recipient.py +2 -6
  74. honeycomb/_generated/api/recipients/list_recipients.py +2 -6
  75. honeycomb/_generated/api/recipients/update_recipient.py +2 -6
  76. honeycomb/_generated/api/reporting/get_slo_history.py +2 -5
  77. honeycomb/_generated/api/service_maps/create_map_dependency_request.py +6 -9
  78. honeycomb/_generated/api/service_maps/get_map_dependencies.py +2 -7
  79. honeycomb/_generated/api/sl_os/create_slo.py +2 -5
  80. honeycomb/_generated/api/sl_os/delete_slo.py +2 -5
  81. honeycomb/_generated/api/sl_os/get_slo.py +2 -8
  82. honeycomb/_generated/api/sl_os/list_slos.py +2 -5
  83. honeycomb/_generated/api/sl_os/update_slo.py +2 -5
  84. honeycomb/_generated/api/triggers/create_trigger.py +2 -6
  85. honeycomb/_generated/api/triggers/delete_trigger.py +2 -5
  86. honeycomb/_generated/api/triggers/get_trigger.py +2 -5
  87. honeycomb/_generated/api/triggers/list_triggers.py +2 -5
  88. honeycomb/_generated/api/triggers/list_triggers_with_recipient.py +2 -5
  89. honeycomb/_generated/api/triggers/update_trigger.py +2 -5
  90. honeycomb/_generated/client.py +2 -5
  91. honeycomb/_generated/models/__init__.py +195 -88
  92. honeycomb/_generated/models/api_key_create_request.py +6 -5
  93. honeycomb/_generated/models/api_key_create_request_data.py +15 -11
  94. honeycomb/_generated/models/api_key_create_request_data_relationships.py +2 -3
  95. honeycomb/_generated/models/api_key_create_request_data_type.py +1 -0
  96. honeycomb/_generated/models/api_key_list_response.py +2 -5
  97. honeycomb/_generated/models/api_key_object.py +14 -14
  98. honeycomb/_generated/models/api_key_object_links.py +2 -9
  99. honeycomb/_generated/models/api_key_object_relationships.py +5 -9
  100. honeycomb/_generated/models/api_key_object_type.py +1 -0
  101. honeycomb/_generated/models/api_key_response.py +2 -3
  102. honeycomb/_generated/models/api_key_update_request.py +15 -17
  103. honeycomb/_generated/models/auth.py +2 -5
  104. honeycomb/_generated/models/auth_api_key_access.py +2 -9
  105. honeycomb/_generated/models/auth_environment.py +2 -9
  106. honeycomb/_generated/models/auth_team.py +2 -9
  107. honeycomb/_generated/models/auth_type.py +1 -0
  108. honeycomb/_generated/models/auth_v2_response.py +5 -8
  109. honeycomb/_generated/models/auth_v2_response_data.py +14 -11
  110. honeycomb/_generated/models/auth_v2_response_data_attributes.py +10 -9
  111. honeycomb/_generated/models/auth_v2_response_data_attributes_key_type.py +1 -0
  112. honeycomb/_generated/models/auth_v2_response_data_attributes_timestamps.py +4 -12
  113. honeycomb/_generated/models/auth_v2_response_data_relationships.py +1 -7
  114. honeycomb/_generated/models/auth_v2_response_data_type.py +1 -0
  115. honeycomb/_generated/models/base_trigger.py +21 -18
  116. honeycomb/_generated/models/base_trigger_alert_type.py +1 -0
  117. honeycomb/_generated/models/base_trigger_baseline_details_type_0.py +5 -9
  118. honeycomb/_generated/models/base_trigger_baseline_details_type_0_offset_minutes.py +1 -0
  119. honeycomb/_generated/models/base_trigger_baseline_details_type_0_type.py +1 -0
  120. honeycomb/_generated/models/base_trigger_evaluation_schedule.py +8 -6
  121. honeycomb/_generated/models/base_trigger_evaluation_schedule_type.py +1 -0
  122. honeycomb/_generated/models/base_trigger_evaluation_schedule_window.py +4 -9
  123. honeycomb/_generated/models/base_trigger_evaluation_schedule_window_days_of_week_item.py +1 -0
  124. honeycomb/_generated/models/base_trigger_threshold.py +2 -9
  125. honeycomb/_generated/models/base_trigger_threshold_op.py +1 -0
  126. honeycomb/_generated/models/batch_event.py +2 -5
  127. honeycomb/_generated/models/board.py +15 -17
  128. honeycomb/_generated/models/board_layout_generation.py +1 -0
  129. honeycomb/_generated/models/board_links.py +2 -9
  130. honeycomb/_generated/models/board_panel_position.py +2 -9
  131. honeycomb/_generated/models/board_query_visualization_settings.py +8 -8
  132. honeycomb/_generated/models/board_query_visualization_settings_charts_item.py +4 -10
  133. honeycomb/_generated/models/board_query_visualization_settings_charts_item_chart_type.py +1 -0
  134. honeycomb/_generated/models/board_type.py +1 -0
  135. honeycomb/_generated/models/board_view_filter.py +2 -9
  136. honeycomb/_generated/models/board_view_filter_operation.py +1 -0
  137. honeycomb/_generated/models/board_view_response.py +2 -5
  138. honeycomb/_generated/models/budget_rate.py +4 -12
  139. honeycomb/_generated/models/budget_rate_alert_type.py +1 -0
  140. honeycomb/_generated/models/burn_alert_shared_params.py +4 -12
  141. honeycomb/_generated/models/calculated_field.py +2 -9
  142. honeycomb/_generated/models/configuration_key_attributes.py +16 -12
  143. honeycomb/_generated/models/configuration_key_attributes_key_type.py +1 -0
  144. honeycomb/_generated/models/configuration_key_attributes_permissions.py +172 -0
  145. honeycomb/_generated/models/configuration_key_attributes_timestamps.py +4 -12
  146. honeycomb/_generated/models/configuration_key_request.py +101 -0
  147. honeycomb/_generated/models/configuration_key_request_attributes.py +107 -0
  148. honeycomb/_generated/models/configuration_key_request_attributes_permissions.py +168 -0
  149. honeycomb/_generated/models/configuration_key_request_type.py +8 -0
  150. honeycomb/_generated/models/create_board_view_request.py +2 -3
  151. honeycomb/_generated/models/create_budget_rate_burn_alert_request.py +10 -10
  152. honeycomb/_generated/models/create_budget_rate_burn_alert_request_slo.py +1 -7
  153. honeycomb/_generated/models/create_column.py +2 -9
  154. honeycomb/_generated/models/create_column_type.py +1 -0
  155. honeycomb/_generated/models/create_enhance_indexer_usage_record_request.py +8 -6
  156. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data.py +10 -7
  157. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes.py +8 -8
  158. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data.py +8 -6
  159. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
  160. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
  161. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
  162. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
  163. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +1 -0
  164. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +8 -6
  165. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +8 -6
  166. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +2 -9
  167. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_type.py +1 -0
  168. honeycomb/_generated/models/create_environment_request.py +8 -6
  169. honeycomb/_generated/models/create_environment_request_data.py +10 -7
  170. honeycomb/_generated/models/create_environment_request_data_attributes.py +2 -9
  171. honeycomb/_generated/models/create_environment_request_data_type.py +1 -0
  172. honeycomb/_generated/models/create_events_content_encoding.py +1 -0
  173. honeycomb/_generated/models/create_events_response_200_item.py +2 -9
  174. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request.py +10 -10
  175. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request_slo.py +1 -7
  176. honeycomb/_generated/models/create_map_dependencies_request.py +2 -5
  177. honeycomb/_generated/models/create_map_dependencies_response.py +4 -10
  178. honeycomb/_generated/models/create_map_dependencies_response_status.py +1 -0
  179. honeycomb/_generated/models/create_pipeline_health_record_request.py +8 -6
  180. honeycomb/_generated/models/create_pipeline_health_record_request_data.py +10 -7
  181. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes.py +8 -8
  182. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data.py +8 -6
  183. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
  184. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
  185. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
  186. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
  187. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +1 -0
  188. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +8 -6
  189. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +8 -6
  190. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +2 -9
  191. honeycomb/_generated/models/create_pipeline_health_record_request_data_type.py +1 -0
  192. honeycomb/_generated/models/create_query_result_request.py +2 -9
  193. honeycomb/_generated/models/dataset.py +2 -6
  194. honeycomb/_generated/models/dataset_creation_payload.py +2 -9
  195. honeycomb/_generated/models/dataset_definition_type_1.py +4 -10
  196. honeycomb/_generated/models/dataset_definition_type_1_column_type.py +1 -0
  197. honeycomb/_generated/models/dataset_definitions.py +2 -6
  198. honeycomb/_generated/models/dataset_relationship.py +2 -3
  199. honeycomb/_generated/models/dataset_relationship_data.py +2 -8
  200. honeycomb/_generated/models/dataset_relationship_data_type.py +1 -0
  201. honeycomb/_generated/models/dataset_settings.py +2 -9
  202. honeycomb/_generated/models/dataset_update_payload.py +8 -8
  203. honeycomb/_generated/models/dataset_update_payload_settings.py +2 -9
  204. honeycomb/_generated/models/detailed_error.py +2 -9
  205. honeycomb/_generated/models/email_recipient.py +4 -7
  206. honeycomb/_generated/models/email_recipient_details.py +1 -7
  207. honeycomb/_generated/models/email_recipient_type.py +1 -0
  208. honeycomb/_generated/models/environment.py +6 -7
  209. honeycomb/_generated/models/environment_attributes.py +11 -9
  210. honeycomb/_generated/models/environment_attributes_color_type_1.py +1 -0
  211. honeycomb/_generated/models/environment_attributes_settings.py +1 -7
  212. honeycomb/_generated/models/environment_color.py +1 -0
  213. honeycomb/_generated/models/environment_links.py +1 -7
  214. honeycomb/_generated/models/environment_list_response.py +2 -5
  215. honeycomb/_generated/models/environment_relationship.py +8 -6
  216. honeycomb/_generated/models/environment_relationship_data.py +3 -8
  217. honeycomb/_generated/models/environment_relationship_data_type.py +1 -0
  218. honeycomb/_generated/models/environment_response.py +2 -3
  219. honeycomb/_generated/models/environment_type.py +1 -0
  220. honeycomb/_generated/models/error.py +2 -9
  221. honeycomb/_generated/models/event.py +2 -8
  222. honeycomb/_generated/models/exhaustion_time.py +4 -12
  223. honeycomb/_generated/models/exhaustion_time_alert_type.py +1 -0
  224. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response.py +10 -10
  225. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response_slo.py +2 -9
  226. honeycomb/_generated/models/filter_op.py +1 -0
  227. honeycomb/_generated/models/get_map_dependencies_response.py +7 -10
  228. honeycomb/_generated/models/get_map_dependencies_response_status.py +1 -0
  229. honeycomb/_generated/models/having_calculate_op.py +1 -0
  230. honeycomb/_generated/models/having_op.py +1 -0
  231. honeycomb/_generated/models/included_resource.py +6 -7
  232. honeycomb/_generated/models/included_resource_attributes.py +1 -7
  233. honeycomb/_generated/models/ingest_key_attributes.py +14 -11
  234. honeycomb/_generated/models/ingest_key_attributes_key_type.py +1 -0
  235. honeycomb/_generated/models/ingest_key_attributes_permissions.py +2 -9
  236. honeycomb/_generated/models/ingest_key_attributes_timestamps.py +4 -12
  237. honeycomb/_generated/models/ingest_key_request.py +100 -0
  238. honeycomb/_generated/models/ingest_key_request_attributes.py +75 -0
  239. honeycomb/_generated/models/ingest_key_request_type.py +8 -0
  240. honeycomb/_generated/models/ingest_key_type.py +2 -9
  241. honeycomb/_generated/models/ingest_key_type_key_type.py +1 -0
  242. honeycomb/_generated/models/jsonapi_error_source.py +2 -9
  243. honeycomb/_generated/models/kinesis_event.py +2 -5
  244. honeycomb/_generated/models/kinesis_event_record.py +2 -9
  245. honeycomb/_generated/models/kinesis_response.py +2 -9
  246. honeycomb/_generated/models/list_api_keys_filtertype.py +1 -0
  247. honeycomb/_generated/models/map_dependency.py +2 -5
  248. honeycomb/_generated/models/map_node.py +2 -9
  249. honeycomb/_generated/models/map_node_type.py +1 -0
  250. honeycomb/_generated/models/marker.py +2 -9
  251. honeycomb/_generated/models/marker_create_request.py +2 -3
  252. honeycomb/_generated/models/marker_create_request_data.py +16 -10
  253. honeycomb/_generated/models/marker_create_request_data_attributes.py +2 -9
  254. honeycomb/_generated/models/marker_create_request_data_relationships.py +2 -3
  255. honeycomb/_generated/models/marker_create_request_data_type.py +1 -0
  256. honeycomb/_generated/models/marker_object.py +7 -8
  257. honeycomb/_generated/models/marker_object_attributes.py +8 -8
  258. honeycomb/_generated/models/marker_object_attributes_timestamps.py +4 -12
  259. honeycomb/_generated/models/marker_object_links.py +2 -9
  260. honeycomb/_generated/models/marker_object_relationships.py +8 -8
  261. honeycomb/_generated/models/marker_object_relationships_dataset.py +8 -9
  262. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0.py +4 -10
  263. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0_type.py +1 -0
  264. honeycomb/_generated/models/marker_object_type.py +1 -0
  265. honeycomb/_generated/models/marker_response.py +2 -3
  266. honeycomb/_generated/models/marker_setting.py +2 -10
  267. honeycomb/_generated/models/marker_update_request.py +2 -3
  268. honeycomb/_generated/models/marker_update_request_data.py +16 -10
  269. honeycomb/_generated/models/marker_update_request_data_attributes.py +2 -9
  270. honeycomb/_generated/models/marker_update_request_data_relationships.py +2 -3
  271. honeycomb/_generated/models/marker_update_request_data_type.py +1 -0
  272. honeycomb/_generated/models/ms_teams_recipient.py +4 -7
  273. honeycomb/_generated/models/ms_teams_recipient_details.py +1 -7
  274. honeycomb/_generated/models/ms_teams_recipient_type.py +1 -0
  275. honeycomb/_generated/models/ms_teams_workflow_recipient.py +12 -11
  276. honeycomb/_generated/models/ms_teams_workflow_recipient_details.py +1 -7
  277. honeycomb/_generated/models/ms_teams_workflow_recipient_type.py +1 -0
  278. honeycomb/_generated/models/notification_recipient.py +8 -8
  279. honeycomb/_generated/models/notification_recipient_details.py +10 -9
  280. honeycomb/_generated/models/notification_recipient_details_pagerduty_severity.py +1 -0
  281. honeycomb/_generated/models/notification_recipient_details_variables_item.py +2 -9
  282. honeycomb/_generated/models/pager_duty_recipient.py +8 -9
  283. honeycomb/_generated/models/pager_duty_recipient_details.py +1 -7
  284. honeycomb/_generated/models/pager_duty_recipient_type.py +1 -0
  285. honeycomb/_generated/models/pagination_links.py +2 -8
  286. honeycomb/_generated/models/payload_template.py +2 -9
  287. honeycomb/_generated/models/pipeline_configuration_response.py +16 -10
  288. honeycomb/_generated/models/pipeline_configuration_response_attributes.py +8 -8
  289. honeycomb/_generated/models/pipeline_configuration_response_attributes_configs_item.py +1 -7
  290. honeycomb/_generated/models/pipeline_configuration_response_links.py +2 -9
  291. honeycomb/_generated/models/pipeline_configuration_response_type.py +1 -0
  292. honeycomb/_generated/models/pipeline_configuration_rollout.py +16 -10
  293. honeycomb/_generated/models/pipeline_configuration_rollout_attributes.py +3 -8
  294. honeycomb/_generated/models/pipeline_configuration_rollout_attributes_status.py +1 -0
  295. honeycomb/_generated/models/pipeline_configuration_rollout_links.py +2 -9
  296. honeycomb/_generated/models/pipeline_configuration_rollout_type.py +1 -0
  297. honeycomb/_generated/models/preset_filter.py +1 -7
  298. honeycomb/_generated/models/query.py +11 -11
  299. honeycomb/_generated/models/query_annotation.py +4 -12
  300. honeycomb/_generated/models/query_annotation_source.py +1 -0
  301. honeycomb/_generated/models/query_calculated_fields_item.py +1 -7
  302. honeycomb/_generated/models/query_calculations_item.py +2 -10
  303. honeycomb/_generated/models/query_compare_time_offset_seconds.py +1 -0
  304. honeycomb/_generated/models/query_filter_combination.py +1 -0
  305. honeycomb/_generated/models/query_filters_item.py +2 -11
  306. honeycomb/_generated/models/query_havings_item.py +2 -10
  307. honeycomb/_generated/models/query_op.py +1 -0
  308. honeycomb/_generated/models/query_orders_item.py +2 -9
  309. honeycomb/_generated/models/query_orders_item_order.py +1 -0
  310. honeycomb/_generated/models/query_panel.py +2 -6
  311. honeycomb/_generated/models/query_panel_query_panel.py +10 -9
  312. honeycomb/_generated/models/query_panel_query_panel_query_style.py +1 -0
  313. honeycomb/_generated/models/query_result.py +2 -5
  314. honeycomb/_generated/models/query_result_details.py +5 -8
  315. honeycomb/_generated/models/query_result_details_data.py +5 -8
  316. honeycomb/_generated/models/query_result_details_links.py +2 -9
  317. honeycomb/_generated/models/query_result_links.py +2 -9
  318. honeycomb/_generated/models/query_results_data.py +2 -5
  319. honeycomb/_generated/models/query_results_data_data.py +2 -8
  320. honeycomb/_generated/models/query_results_series.py +2 -5
  321. honeycomb/_generated/models/recipient_properties.py +4 -12
  322. honeycomb/_generated/models/recipient_type.py +1 -0
  323. honeycomb/_generated/models/slack_recipient.py +4 -7
  324. honeycomb/_generated/models/slack_recipient_details.py +1 -7
  325. honeycomb/_generated/models/slack_recipient_type.py +1 -0
  326. honeycomb/_generated/models/slo.py +4 -8
  327. honeycomb/_generated/models/slo_create.py +4 -8
  328. honeycomb/_generated/models/slo_create_sli.py +1 -7
  329. honeycomb/_generated/models/slo_detailed_response.py +4 -8
  330. honeycomb/_generated/models/slo_detailed_response_status.py +1 -0
  331. honeycomb/_generated/models/slo_history.py +2 -9
  332. honeycomb/_generated/models/slo_history_request.py +2 -8
  333. honeycomb/_generated/models/slo_history_response.py +2 -3
  334. honeycomb/_generated/models/slo_panel.py +2 -6
  335. honeycomb/_generated/models/slo_panel_slo_panel.py +2 -9
  336. honeycomb/_generated/models/slo_sli.py +1 -7
  337. honeycomb/_generated/models/tag.py +1 -7
  338. honeycomb/_generated/models/team_relationship.py +2 -3
  339. honeycomb/_generated/models/team_relationship_team.py +6 -5
  340. honeycomb/_generated/models/team_relationship_team_data.py +3 -8
  341. honeycomb/_generated/models/team_relationship_team_data_type.py +1 -0
  342. honeycomb/_generated/models/template_variable_definition.py +2 -9
  343. honeycomb/_generated/models/text_panel.py +2 -6
  344. honeycomb/_generated/models/text_panel_text_panel.py +1 -7
  345. honeycomb/_generated/models/trigger_response.py +27 -21
  346. honeycomb/_generated/models/trigger_with_inline_query.py +27 -21
  347. honeycomb/_generated/models/trigger_with_inline_query_query.py +1 -7
  348. honeycomb/_generated/models/trigger_with_query_reference.py +21 -18
  349. honeycomb/_generated/models/update_board_view_request.py +2 -5
  350. honeycomb/_generated/models/update_environment_request.py +8 -6
  351. honeycomb/_generated/models/update_environment_request_data.py +10 -7
  352. honeycomb/_generated/models/update_environment_request_data_attributes.py +8 -8
  353. honeycomb/_generated/models/update_environment_request_data_attributes_settings.py +2 -9
  354. honeycomb/_generated/models/update_environment_request_data_type.py +1 -0
  355. honeycomb/_generated/models/update_exhaustion_time_burn_alert_request.py +4 -7
  356. honeycomb/_generated/models/update_pipeline_configuration_rollout.py +10 -7
  357. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes.py +3 -8
  358. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes_status.py +1 -0
  359. honeycomb/_generated/models/update_pipeline_configuration_rollout_request.py +8 -6
  360. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data.py +10 -7
  361. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes.py +3 -8
  362. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes_status.py +1 -0
  363. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_type.py +1 -0
  364. honeycomb/_generated/models/update_pipeline_configuration_rollout_response.py +8 -6
  365. honeycomb/_generated/models/update_pipeline_configuration_rollout_type.py +1 -0
  366. honeycomb/_generated/models/user_relationship.py +2 -3
  367. honeycomb/_generated/models/user_relationship_data.py +2 -8
  368. honeycomb/_generated/models/user_relationship_data_type.py +1 -0
  369. honeycomb/_generated/models/validation_error.py +8 -8
  370. honeycomb/_generated/models/validation_error_type_detail_item.py +4 -10
  371. honeycomb/_generated/models/validation_error_type_detail_item_code.py +1 -0
  372. honeycomb/_generated/models/webhook_header.py +2 -9
  373. honeycomb/_generated/models/webhook_recipient.py +4 -7
  374. honeycomb/_generated/models/webhook_recipient_details.py +8 -8
  375. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads.py +12 -10
  376. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads_payload_templates.py +2 -5
  377. honeycomb/_generated/models/webhook_recipient_type.py +1 -0
  378. honeycomb/_generated/types.py +1 -1
  379. honeycomb/cli/__init__.py +85 -0
  380. honeycomb/cli/api_keys.py +205 -0
  381. honeycomb/cli/auth.py +70 -0
  382. honeycomb/cli/boards.py +203 -0
  383. honeycomb/cli/columns.py +256 -0
  384. honeycomb/cli/config.py +259 -0
  385. honeycomb/cli/datasets.py +186 -0
  386. honeycomb/cli/derived_columns.py +222 -0
  387. honeycomb/cli/environments.py +240 -0
  388. honeycomb/cli/formatters.py +242 -0
  389. honeycomb/cli/markers.py +151 -0
  390. honeycomb/cli/queries.py +380 -0
  391. honeycomb/cli/recipients.py +211 -0
  392. honeycomb/cli/slos.py +338 -0
  393. honeycomb/cli/triggers.py +271 -0
  394. honeycomb/client.py +13 -7
  395. honeycomb/models/__init__.py +18 -3
  396. honeycomb/models/api_keys.py +49 -5
  397. honeycomb/models/auth.py +71 -0
  398. honeycomb/models/board_builder.py +97 -25
  399. honeycomb/models/boards.py +95 -1
  400. honeycomb/models/datasets.py +42 -0
  401. honeycomb/models/queries.py +21 -0
  402. honeycomb/models/query_builder.py +119 -59
  403. honeycomb/models/recipient_builder.py +51 -4
  404. honeycomb/models/slo_builder.py +24 -19
  405. honeycomb/models/slos.py +50 -3
  406. honeycomb/models/tool_inputs.py +630 -0
  407. honeycomb/models/triggers.py +39 -9
  408. honeycomb/resources/__init__.py +2 -0
  409. honeycomb/resources/api_keys.py +66 -29
  410. honeycomb/resources/auth.py +97 -0
  411. honeycomb/resources/boards.py +272 -18
  412. honeycomb/resources/datasets.py +49 -11
  413. honeycomb/resources/environments.py +54 -31
  414. honeycomb/resources/slos.py +87 -61
  415. honeycomb/tools/__main__.py +40 -4
  416. honeycomb/tools/builders.py +235 -150
  417. honeycomb/tools/descriptions.py +175 -7
  418. honeycomb/tools/executor.py +212 -25
  419. honeycomb/tools/generator.py +61 -2264
  420. honeycomb/tools/resources/__init__.py +42 -0
  421. honeycomb/tools/resources/api_keys.py +249 -0
  422. honeycomb/tools/resources/auth.py +98 -0
  423. honeycomb/tools/resources/boards.py +313 -0
  424. honeycomb/tools/resources/burn_alerts.py +278 -0
  425. honeycomb/tools/resources/columns.py +257 -0
  426. honeycomb/tools/resources/datasets.py +215 -0
  427. honeycomb/tools/resources/derived_columns.py +311 -0
  428. honeycomb/tools/resources/environments.py +211 -0
  429. honeycomb/tools/resources/events.py +158 -0
  430. honeycomb/tools/resources/marker_settings.py +216 -0
  431. honeycomb/tools/resources/markers.py +197 -0
  432. honeycomb/tools/resources/queries.py +220 -0
  433. honeycomb/tools/resources/recipients.py +297 -0
  434. honeycomb/tools/resources/service_map.py +110 -0
  435. honeycomb/tools/resources/slos.py +276 -0
  436. honeycomb/tools/resources/triggers.py +328 -0
  437. honeycomb/tools/schemas.py +81 -0
  438. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/METADATA +33 -8
  439. honeycomb_api-0.5.3.dist-info/RECORD +497 -0
  440. honeycomb_api-0.5.3.dist-info/entry_points.txt +5 -0
  441. honeycomb_api-0.1.0.dist-info/RECORD +0 -453
  442. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/WHEEL +0 -0
  443. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/licenses/LICENSE +0 -0
@@ -13,6 +13,96 @@ from honeycomb.models import (
13
13
  SLOBuilder,
14
14
  TriggerBuilder,
15
15
  )
16
+ from honeycomb.models.tool_inputs import (
17
+ BoardToolInput,
18
+ PositionInput,
19
+ SLOToolInput,
20
+ VisualizationSettingsInput,
21
+ )
22
+
23
+
24
+ def _build_visualization_dict(
25
+ visualization: VisualizationSettingsInput | None,
26
+ chart_type: str | None,
27
+ ) -> dict[str, Any] | None:
28
+ """Build visualization settings dict from typed model and/or chart_type shorthand.
29
+
30
+ Args:
31
+ visualization: Typed VisualizationSettingsInput model or None
32
+ chart_type: Shorthand chart_type (e.g., "line", "stacked") or None
33
+
34
+ Returns:
35
+ Dict for API or None if no settings provided
36
+
37
+ Priority:
38
+ - If visualization is set, use it (converted to dict)
39
+ - If chart_type is set but visualization is None, create minimal dict
40
+ - If both are set, chart_type is ignored (visualization takes precedence)
41
+ """
42
+ if visualization is not None:
43
+ # Convert typed model to dict, excluding None values
44
+ result: dict[str, Any] = {}
45
+ if visualization.hide_compare:
46
+ result["hide_compare"] = True
47
+ if visualization.hide_hovers:
48
+ result["hide_hovers"] = True
49
+ if visualization.hide_markers:
50
+ result["hide_markers"] = True
51
+ if visualization.utc_xaxis:
52
+ result["utc_xaxis"] = True
53
+ if visualization.overlaid_charts:
54
+ result["overlaid_charts"] = True
55
+ if visualization.charts:
56
+ result["charts"] = [
57
+ {
58
+ k: v
59
+ for k, v in {
60
+ "chart_index": chart.chart_index,
61
+ "chart_type": chart.chart_type,
62
+ "log_scale": chart.log_scale if chart.log_scale else None,
63
+ "omit_missing_values": (
64
+ chart.omit_missing_values if chart.omit_missing_values else None
65
+ ),
66
+ }.items()
67
+ if v is not None
68
+ }
69
+ for chart in visualization.charts
70
+ ]
71
+ return result if result else None
72
+
73
+ if chart_type is not None:
74
+ # Shorthand: create minimal visualization with just chart_type
75
+ return {"charts": [{"chart_type": chart_type}]}
76
+
77
+ return None
78
+
79
+
80
+ def _to_position_input(position: dict[str, Any] | list | tuple | None) -> PositionInput | None:
81
+ """Convert position dict/tuple/list to PositionInput.
82
+
83
+ Args:
84
+ position: Position as dict (x_coordinate, y_coordinate, width, height),
85
+ tuple/list (x, y, w, h), or None
86
+
87
+ Returns:
88
+ PositionInput or None
89
+ """
90
+ if position is None:
91
+ return None
92
+ if isinstance(position, dict):
93
+ return PositionInput(
94
+ x_coordinate=position["x_coordinate"],
95
+ y_coordinate=position["y_coordinate"],
96
+ width=position["width"],
97
+ height=position["height"],
98
+ )
99
+ # tuple or list (x, y, w, h)
100
+ return PositionInput(
101
+ x_coordinate=position[0],
102
+ y_coordinate=position[1],
103
+ width=position[2],
104
+ height=position[3],
105
+ )
16
106
 
17
107
 
18
108
  def _build_trigger(data: dict[str, Any]) -> TriggerBuilder:
@@ -231,7 +321,7 @@ def _build_trigger(data: dict[str, Any]) -> TriggerBuilder:
231
321
 
232
322
 
233
323
  def _build_slo(data: dict[str, Any]) -> SLOBuilder:
234
- """Convert tool input to SLOBuilder.
324
+ """Convert tool input to SLOBuilder with Pydantic validation.
235
325
 
236
326
  Args:
237
327
  data: Tool input dict from Claude (includes dataset, name, sli, target, etc.)
@@ -239,94 +329,89 @@ def _build_slo(data: dict[str, Any]) -> SLOBuilder:
239
329
  Returns:
240
330
  Configured SLOBuilder instance ready to build()
241
331
 
332
+ Raises:
333
+ ValidationError: If input data doesn't match SLOToolInput schema
334
+
242
335
  Example:
243
336
  >>> data = {
244
- ... "dataset": "api-logs",
337
+ ... "datasets": ["api-logs"],
245
338
  ... "name": "API Availability",
246
339
  ... "sli": {"alias": "success_rate"},
247
- ... "target_per_million": 999000,
340
+ ... "target_percentage": 99.9,
248
341
  ... "time_period_days": 30
249
342
  ... }
250
343
  >>> builder = _build_slo(data)
251
344
  >>> bundle = builder.build()
252
345
  """
253
- builder = SLOBuilder(data["name"])
346
+ # Validate input with Pydantic (raises ValidationError on invalid input)
347
+ validated = SLOToolInput.model_validate(data)
348
+
349
+ builder = SLOBuilder(validated.name)
254
350
 
255
351
  # Description
256
- if "description" in data:
257
- builder.description(data["description"])
352
+ if validated.description:
353
+ builder.description(validated.description)
258
354
 
259
- # Dataset(s)
260
- if "dataset" in data:
261
- builder.dataset(data["dataset"])
262
- elif "datasets" in data:
263
- builder.datasets(data["datasets"])
355
+ # Dataset(s) - always a list, use single element for one dataset
356
+ if len(validated.datasets) == 1:
357
+ builder.dataset(validated.datasets[0])
358
+ else:
359
+ builder.datasets(validated.datasets)
264
360
 
265
361
  # SLI
266
- sli = data["sli"]
267
- alias = sli["alias"]
362
+ alias = validated.sli.alias
268
363
 
269
- if "expression" in sli:
364
+ if validated.sli.expression:
270
365
  # New derived column
271
- expression = sli["expression"]
272
- description = sli.get("description")
273
- builder.sli(alias, expression, description)
366
+ builder.sli(alias, validated.sli.expression, validated.sli.description)
274
367
  else:
275
368
  # Existing derived column
276
369
  builder.sli(alias)
277
370
 
278
- # Target
279
- if "target_per_million" in data:
280
- builder.target_per_million(data["target_per_million"])
281
- elif "target_percentage" in data:
282
- builder.target_percentage(data["target_percentage"])
283
- elif "target_nines" in data:
284
- builder.target_nines(data["target_nines"])
371
+ # Target (target_percentage is required in SLOToolInput)
372
+ builder.target_percentage(validated.target_percentage)
285
373
 
286
374
  # Time period
287
- if "time_period_days" in data:
288
- builder.time_period_days(data["time_period_days"])
289
- elif "time_period_weeks" in data:
290
- builder.time_period_weeks(data["time_period_weeks"])
375
+ builder.time_period_days(validated.time_period_days)
291
376
 
292
- # Burn alerts
293
- burn_alerts = data.get("burn_alerts", [])
377
+ # Burn alerts (validated as BurnAlertInput models)
378
+ burn_alerts = validated.burn_alerts or []
294
379
  for alert_data in burn_alerts:
295
- alert_type_str = alert_data["alert_type"]
296
- alert_type = BurnAlertType(alert_type_str)
380
+ alert_type = BurnAlertType(alert_data.alert_type)
297
381
 
298
382
  burn_builder = BurnAlertBuilder(alert_type)
299
383
 
300
- if "description" in alert_data:
301
- burn_builder.description(alert_data["description"])
384
+ if alert_data.description:
385
+ burn_builder.description(alert_data.description)
302
386
 
303
387
  if alert_type == BurnAlertType.EXHAUSTION_TIME:
304
- burn_builder.exhaustion_minutes(alert_data["exhaustion_minutes"])
388
+ if alert_data.exhaustion_minutes:
389
+ burn_builder.exhaustion_minutes(alert_data.exhaustion_minutes)
305
390
  elif alert_type == BurnAlertType.BUDGET_RATE:
306
- burn_builder.window_minutes(alert_data["budget_rate_window_minutes"])
307
- # Convert from per_million to percent
308
- threshold_per_million = alert_data["budget_rate_decrease_threshold_per_million"]
309
- threshold_percent = threshold_per_million / 10000 # e.g., 10000 → 1%
310
- burn_builder.threshold_percent(threshold_percent)
311
-
312
- # Recipients for burn alert
313
- recipients = alert_data.get("recipients", [])
391
+ if alert_data.budget_rate_window_minutes:
392
+ burn_builder.window_minutes(alert_data.budget_rate_window_minutes)
393
+ if alert_data.budget_rate_decrease_threshold_per_million:
394
+ # Convert from per_million to percent
395
+ threshold_per_million = alert_data.budget_rate_decrease_threshold_per_million
396
+ threshold_percent = threshold_per_million / 10000 # e.g., 10000 → 1%
397
+ burn_builder.threshold_percent(threshold_percent)
398
+
399
+ # Recipients for burn alert (validated as RecipientInput models)
400
+ recipients = alert_data.recipients or []
314
401
  for recip in recipients:
315
- if "id" in recip:
316
- burn_builder.recipient_id(recip["id"])
317
- elif recip.get("type") == "email":
318
- burn_builder.email(recip["target"])
319
- elif recip.get("type") == "slack":
320
- burn_builder.slack(recip["target"])
321
- elif recip.get("type") == "pagerduty":
322
- severity = recip.get("details", {}).get("severity", "critical")
323
- burn_builder.pagerduty(recip["target"], severity=severity)
324
- elif recip.get("type") == "webhook":
325
- name = recip.get("name", "Webhook")
326
- secret = recip.get("details", {}).get("secret")
327
- burn_builder.webhook(recip["target"], name=name, secret=secret)
328
- elif recip.get("type") in ("msteams", "msteams_workflow"):
329
- burn_builder.msteams(recip["target"])
402
+ if recip.id:
403
+ burn_builder.recipient_id(recip.id)
404
+ elif recip.type == "email" and recip.target:
405
+ burn_builder.email(recip.target)
406
+ elif recip.type == "slack" and recip.target:
407
+ burn_builder.slack(recip.target)
408
+ elif recip.type == "pagerduty" and recip.target:
409
+ # Note: RecipientInput doesn't have details field, default to critical
410
+ burn_builder.pagerduty(recip.target, severity="critical")
411
+ elif recip.type == "webhook" and recip.target:
412
+ burn_builder.webhook(recip.target, name="Webhook", secret=None)
413
+ elif recip.type in ("msteams", "msteams_workflow") and recip.target:
414
+ burn_builder.msteams(recip.target)
330
415
 
331
416
  # Add burn alert using the appropriate method based on type
332
417
  if alert_type == BurnAlertType.EXHAUSTION_TIME:
@@ -338,7 +423,7 @@ def _build_slo(data: dict[str, Any]) -> SLOBuilder:
338
423
 
339
424
 
340
425
  def _build_board(data: dict[str, Any]) -> BoardBuilder:
341
- """Convert tool input to BoardBuilder with inline panel creation.
426
+ """Convert tool input to BoardBuilder with Pydantic validation and inline panel creation.
342
427
 
343
428
  Args:
344
429
  data: Tool input dict from Claude (includes name, inline_query_panels, etc.)
@@ -346,6 +431,9 @@ def _build_board(data: dict[str, Any]) -> BoardBuilder:
346
431
  Returns:
347
432
  Configured BoardBuilder instance ready to build()
348
433
 
434
+ Raises:
435
+ ValidationError: If input data doesn't match BoardToolInput schema
436
+
349
437
  Example:
350
438
  >>> data = {
351
439
  ... "name": "API Dashboard",
@@ -365,142 +453,139 @@ def _build_board(data: dict[str, Any]) -> BoardBuilder:
365
453
  """
366
454
  from honeycomb.models.query_builder import QueryBuilder
367
455
 
368
- builder = BoardBuilder(data["name"])
456
+ # Validate input with Pydantic (raises ValidationError on invalid input)
457
+ validated = BoardToolInput.model_validate(data)
458
+
459
+ builder = BoardBuilder(validated.name)
369
460
 
370
461
  # Description
371
- if "description" in data:
372
- builder.description(data["description"])
462
+ if validated.description:
463
+ builder.description(validated.description)
373
464
 
374
465
  # Layout generation
375
- layout = data.get("layout_generation", "auto")
376
- if layout == "auto":
466
+ if validated.layout_generation == "auto":
377
467
  builder.auto_layout()
378
468
  else:
379
469
  builder.manual_layout()
380
470
 
381
- # Inline query panels (create QueryBuilder instances)
382
- for query_panel in data.get("inline_query_panels", []):
383
- # Build QueryBuilder from panel data
384
- qb = QueryBuilder(query_panel["name"])
471
+ # Inline query panels (create QueryBuilder instances from validated models)
472
+ for query_panel in validated.inline_query_panels or []:
473
+ # Build QueryBuilder from validated QueryPanelInput model
474
+ qb = QueryBuilder(query_panel.name)
385
475
 
386
- if "description" in query_panel:
387
- qb.description(query_panel["description"])
476
+ if query_panel.description:
477
+ qb.description(query_panel.description)
388
478
 
389
479
  # Dataset - optional for environment-wide queries
390
- if "dataset" in query_panel:
391
- qb.dataset(query_panel["dataset"])
480
+ if query_panel.dataset:
481
+ qb.dataset(query_panel.dataset)
392
482
  else:
393
483
  qb.environment_wide() # Default to environment-wide
394
484
 
395
485
  # Time range
396
- if "time_range" in query_panel:
397
- qb.time_range(query_panel["time_range"])
486
+ if query_panel.time_range:
487
+ qb.time_range(query_panel.time_range)
398
488
 
399
- # Calculations - directly append to _calculations
400
- from honeycomb.models.query_builder import Calculation
489
+ # Calculations - these are already validated Calculation models
490
+ for calc in query_panel.calculations or []:
491
+ qb._calculations.append(calc)
401
492
 
402
- for calc in query_panel.get("calculations", []):
403
- qb._calculations.append(Calculation(**calc))
404
-
405
- # Filters
406
- for filt in query_panel.get("filters", []):
407
- qb.filter(filt["column"], filt["op"], filt.get("value"))
493
+ # Filters - these are already validated Filter models
494
+ for filt in query_panel.filters or []:
495
+ qb.filter(filt.column, filt.op, filt.value)
408
496
 
409
497
  # Breakdowns
410
- for breakdown in query_panel.get("breakdowns", []):
498
+ for breakdown in query_panel.breakdowns or []:
411
499
  qb.group_by(breakdown)
412
500
 
413
- # Orders
414
- for order in query_panel.get("orders", []):
415
- qb.order_by(
416
- order.get("column", order.get("op", "COUNT")), order.get("order", "descending")
417
- )
501
+ # Orders - these are already validated Order models
502
+ for order in query_panel.orders or []:
503
+ # Order model has 'op' (CalcOp) and 'order' (OrderDirection) fields
504
+ qb.order_by(order.column or order.op, order.order)
418
505
 
419
506
  # Limit
420
- if "limit" in query_panel:
421
- qb.limit(query_panel["limit"])
507
+ if query_panel.limit:
508
+ qb.limit(query_panel.limit)
509
+
510
+ # Calculated fields (inline derived columns)
511
+ for calc_field in query_panel.calculated_fields or []:
512
+ qb.calculated_field(calc_field.name, calc_field.expression)
513
+
514
+ # Compare time offset for historical comparison
515
+ if query_panel.compare_time_offset_seconds:
516
+ qb.compare_time_offset(query_panel.compare_time_offset_seconds)
517
+
518
+ # Build visualization dict from typed model or chart_type shorthand
519
+ viz_dict = _build_visualization_dict(query_panel.visualization, query_panel.chart_type)
422
520
 
423
521
  # Add to board with position and style
424
522
  builder.query(
425
523
  qb,
426
- position=tuple(query_panel["position"]) if "position" in query_panel else None,
427
- style=query_panel.get("style", "graph"),
428
- visualization=query_panel.get("visualization"),
524
+ position=query_panel.position, # Already a PositionInput or None
525
+ style=query_panel.style,
526
+ visualization=viz_dict,
429
527
  )
430
528
 
431
- # Text panels
432
- for text_panel in data.get("text_panels", []):
433
- content = text_panel["content"] if isinstance(text_panel, dict) else text_panel
434
- position = text_panel.get("position") if isinstance(text_panel, dict) else None
435
- builder.text(content, position=tuple(position) if position else None)
529
+ # Text panels (validated TextPanelInput models)
530
+ for text_panel in validated.text_panels or []:
531
+ builder.text(text_panel.content, position=text_panel.position)
436
532
 
437
- # Existing query panels (by ID)
438
- for existing in data.get("existing_query_panels", []):
439
- builder.query(
440
- existing["query_id"],
441
- existing["annotation_id"],
442
- position=tuple(existing["position"]) if "position" in existing else None,
443
- style=existing.get("style", "graph"),
444
- )
445
-
446
- # Inline SLO panels (create SLOBuilder instances)
447
- for slo_panel in data.get("inline_slo_panels", []):
448
- # Build SLOBuilder from panel data
533
+ # Inline SLO panels (create SLOBuilder instances from validated SLOPanelInput models)
534
+ for slo_panel in validated.inline_slo_panels or []:
535
+ # Build SLOBuilder from validated SLOPanelInput model
449
536
  from honeycomb.models import SLOBuilder
450
537
 
451
- slo_builder = SLOBuilder(slo_panel["name"])
538
+ slo_builder = SLOBuilder(slo_panel.name)
452
539
 
453
- if "description" in slo_panel:
454
- slo_builder.description(slo_panel["description"])
540
+ if slo_panel.description:
541
+ slo_builder.description(slo_panel.description)
455
542
 
456
- # Dataset
457
- slo_builder.dataset(slo_panel["dataset"])
543
+ # Dataset (required in SLOPanelInput)
544
+ slo_builder.dataset(slo_panel.dataset)
458
545
 
459
- # SLI
460
- sli = slo_panel["sli"]
461
- alias = sli["alias"]
462
- if "expression" in sli:
546
+ # SLI (validated SLIInput model)
547
+ alias = slo_panel.sli.alias
548
+ if slo_panel.sli.expression:
463
549
  # Inline derived column
464
- slo_builder.sli(alias, sli["expression"], sli.get("description"))
550
+ slo_builder.sli(alias, slo_panel.sli.expression, slo_panel.sli.description)
465
551
  else:
466
552
  # Existing derived column
467
553
  slo_builder.sli(alias)
468
554
 
469
- # Target
470
- if "target_per_million" in slo_panel:
471
- slo_builder.target_per_million(slo_panel["target_per_million"])
472
- elif "target_percentage" in slo_panel:
473
- slo_builder.target_percentage(slo_panel["target_percentage"])
474
- elif "target_nines" in slo_panel:
475
- slo_builder.target_nines(slo_panel["target_nines"])
555
+ # Target (target_percentage is required in SLOPanelInput)
556
+ slo_builder.target_percentage(slo_panel.target_percentage)
476
557
 
477
558
  # Time period
478
- if "time_period_days" in slo_panel:
479
- slo_builder.time_period_days(slo_panel["time_period_days"])
480
- elif "time_period_weeks" in slo_panel:
481
- slo_builder.time_period_weeks(slo_panel["time_period_weeks"])
482
- else:
483
- slo_builder.time_period_days(30) # Default
559
+ slo_builder.time_period_days(slo_panel.time_period_days)
484
560
 
485
561
  # Add to board
486
- builder.slo(
487
- slo_builder,
488
- position=tuple(slo_panel["position"]) if "position" in slo_panel else None,
489
- )
490
-
491
- # Existing SLO panels (by ID)
492
- for slo in data.get("slo_panels", []):
493
- if isinstance(slo, dict) and "slo_id" in slo:
494
- builder.slo(
495
- slo["slo_id"],
496
- position=tuple(slo["position"]) if "position" in slo else None,
562
+ builder.slo(slo_builder, position=slo_panel.position)
563
+
564
+ # Existing SLO panels (by ID - list of strings)
565
+ for slo_id in validated.slo_panels or []:
566
+ builder.slo(slo_id)
567
+
568
+ # Tags (validated TagInput models)
569
+ for tag in validated.tags or []:
570
+ builder.tag(tag.key, tag.value)
571
+
572
+ # Preset filters (validated PresetFilterInput models)
573
+ for preset in validated.preset_filters or []:
574
+ builder.preset_filter(preset.column, preset.alias)
575
+
576
+ # Board views (validated BoardViewInput models)
577
+ for view in validated.views or []:
578
+ # Convert BoardViewFilter models to dicts for builder compatibility
579
+ filters: list[dict[str, Any]] = []
580
+ for board_view_filter in view.filters or []:
581
+ filters.append(
582
+ {
583
+ "column": board_view_filter.column,
584
+ "operation": board_view_filter.operation,
585
+ "value": board_view_filter.value,
586
+ }
497
587
  )
498
- else:
499
- builder.slo(slo) # Just an ID string
500
-
501
- # Tags
502
- for tag in data.get("tags", []):
503
- builder.tag(tag["key"], tag["value"])
588
+ builder.add_view(view.name, filters)
504
589
 
505
590
  return builder
506
591