elasticsearch 8.11.1__py3-none-any.whl → 8.12.0__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 (90) hide show
  1. elasticsearch/_async/client/__init__.py +493 -347
  2. elasticsearch/_async/client/async_search.py +108 -72
  3. elasticsearch/_async/client/autoscaling.py +13 -8
  4. elasticsearch/_async/client/cat.py +26 -26
  5. elasticsearch/_async/client/ccr.py +178 -117
  6. elasticsearch/_async/client/cluster.py +56 -48
  7. elasticsearch/_async/client/dangling_indices.py +3 -3
  8. elasticsearch/_async/client/enrich.py +15 -13
  9. elasticsearch/_async/client/eql.py +53 -36
  10. elasticsearch/_async/client/esql.py +99 -0
  11. elasticsearch/_async/client/features.py +2 -2
  12. elasticsearch/_async/client/fleet.py +111 -71
  13. elasticsearch/_async/client/graph.py +13 -11
  14. elasticsearch/_async/client/ilm.py +33 -27
  15. elasticsearch/_async/client/indices.py +326 -227
  16. elasticsearch/_async/client/inference.py +212 -0
  17. elasticsearch/_async/client/ingest.py +28 -24
  18. elasticsearch/_async/client/license.py +15 -13
  19. elasticsearch/_async/client/logstash.py +13 -10
  20. elasticsearch/_async/client/migration.py +3 -3
  21. elasticsearch/_async/client/ml.py +758 -538
  22. elasticsearch/_async/client/monitoring.py +10 -5
  23. elasticsearch/_async/client/nodes.py +13 -11
  24. elasticsearch/_async/client/query_ruleset.py +12 -10
  25. elasticsearch/_async/client/rollup.py +59 -46
  26. elasticsearch/_async/client/search_application.py +23 -16
  27. elasticsearch/_async/client/searchable_snapshots.py +23 -16
  28. elasticsearch/_async/client/security.py +391 -289
  29. elasticsearch/_async/client/shutdown.py +18 -14
  30. elasticsearch/_async/client/slm.py +23 -21
  31. elasticsearch/_async/client/snapshot.py +91 -65
  32. elasticsearch/_async/client/sql.py +81 -58
  33. elasticsearch/_async/client/ssl.py +1 -1
  34. elasticsearch/_async/client/synonyms.py +23 -19
  35. elasticsearch/_async/client/tasks.py +3 -3
  36. elasticsearch/_async/client/text_structure.py +10 -5
  37. elasticsearch/_async/client/transform.py +111 -75
  38. elasticsearch/_async/client/watcher.py +77 -55
  39. elasticsearch/_async/client/xpack.py +2 -2
  40. elasticsearch/_async/helpers.py +1 -1
  41. elasticsearch/_sync/client/__init__.py +493 -347
  42. elasticsearch/_sync/client/async_search.py +108 -72
  43. elasticsearch/_sync/client/autoscaling.py +13 -8
  44. elasticsearch/_sync/client/cat.py +26 -26
  45. elasticsearch/_sync/client/ccr.py +178 -117
  46. elasticsearch/_sync/client/cluster.py +56 -48
  47. elasticsearch/_sync/client/dangling_indices.py +3 -3
  48. elasticsearch/_sync/client/enrich.py +15 -13
  49. elasticsearch/_sync/client/eql.py +53 -36
  50. elasticsearch/_sync/client/esql.py +99 -0
  51. elasticsearch/_sync/client/features.py +2 -2
  52. elasticsearch/_sync/client/fleet.py +111 -71
  53. elasticsearch/_sync/client/graph.py +13 -11
  54. elasticsearch/_sync/client/ilm.py +33 -27
  55. elasticsearch/_sync/client/indices.py +326 -227
  56. elasticsearch/_sync/client/inference.py +212 -0
  57. elasticsearch/_sync/client/ingest.py +28 -24
  58. elasticsearch/_sync/client/license.py +15 -13
  59. elasticsearch/_sync/client/logstash.py +13 -10
  60. elasticsearch/_sync/client/migration.py +3 -3
  61. elasticsearch/_sync/client/ml.py +758 -538
  62. elasticsearch/_sync/client/monitoring.py +10 -5
  63. elasticsearch/_sync/client/nodes.py +13 -11
  64. elasticsearch/_sync/client/query_ruleset.py +12 -10
  65. elasticsearch/_sync/client/rollup.py +59 -46
  66. elasticsearch/_sync/client/search_application.py +23 -16
  67. elasticsearch/_sync/client/searchable_snapshots.py +23 -16
  68. elasticsearch/_sync/client/security.py +391 -289
  69. elasticsearch/_sync/client/shutdown.py +18 -14
  70. elasticsearch/_sync/client/slm.py +23 -21
  71. elasticsearch/_sync/client/snapshot.py +91 -65
  72. elasticsearch/_sync/client/sql.py +81 -58
  73. elasticsearch/_sync/client/ssl.py +1 -1
  74. elasticsearch/_sync/client/synonyms.py +23 -19
  75. elasticsearch/_sync/client/tasks.py +3 -3
  76. elasticsearch/_sync/client/text_structure.py +10 -5
  77. elasticsearch/_sync/client/transform.py +111 -75
  78. elasticsearch/_sync/client/utils.py +34 -10
  79. elasticsearch/_sync/client/watcher.py +77 -55
  80. elasticsearch/_sync/client/xpack.py +2 -2
  81. elasticsearch/_version.py +1 -1
  82. elasticsearch/client.py +2 -0
  83. elasticsearch/helpers/actions.py +1 -1
  84. {elasticsearch-8.11.1.dist-info → elasticsearch-8.12.0.dist-info}/METADATA +2 -3
  85. elasticsearch-8.12.0.dist-info/RECORD +103 -0
  86. elasticsearch-8.11.1.dist-info/RECORD +0 -99
  87. {elasticsearch-8.11.1.dist-info → elasticsearch-8.12.0.dist-info}/LICENSE +0 -0
  88. {elasticsearch-8.11.1.dist-info → elasticsearch-8.12.0.dist-info}/NOTICE +0 -0
  89. {elasticsearch-8.11.1.dist-info → elasticsearch-8.12.0.dist-info}/WHEEL +0 -0
  90. {elasticsearch-8.11.1.dist-info → elasticsearch-8.12.0.dist-info}/top_level.txt +0 -0
@@ -37,7 +37,7 @@ class MlClient(NamespacedClient):
37
37
  """
38
38
  Clear the cached results from a trained model deployment
39
39
 
40
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/clear-trained-model-deployment-cache.html>`_
40
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/clear-trained-model-deployment-cache.html>`_
41
41
 
42
42
  :param model_id: The unique identifier of the trained model.
43
43
  """
@@ -59,7 +59,7 @@ class MlClient(NamespacedClient):
59
59
  )
60
60
 
61
61
  @_rewrite_parameters(
62
- body_fields=True,
62
+ body_fields=("allow_no_match", "force", "timeout"),
63
63
  )
64
64
  async def close_job(
65
65
  self,
@@ -72,12 +72,13 @@ class MlClient(NamespacedClient):
72
72
  human: t.Optional[bool] = None,
73
73
  pretty: t.Optional[bool] = None,
74
74
  timeout: t.Optional[t.Union["t.Literal[-1]", "t.Literal[0]", str]] = None,
75
+ body: t.Optional[t.Dict[str, t.Any]] = None,
75
76
  ) -> ObjectApiResponse[t.Any]:
76
77
  """
77
78
  Closes one or more anomaly detection jobs. A job can be opened and closed multiple
78
79
  times throughout its lifecycle.
79
80
 
80
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-close-job.html>`_
81
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-close-job.html>`_
81
82
 
82
83
  :param job_id: Identifier for the anomaly detection job. It can be a job identifier,
83
84
  a group name, or a wildcard expression. You can close multiple anomaly detection
@@ -92,22 +93,23 @@ class MlClient(NamespacedClient):
92
93
  if job_id in SKIP_IN_PATH:
93
94
  raise ValueError("Empty value passed for parameter 'job_id'")
94
95
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_close"
95
- __body: t.Dict[str, t.Any] = {}
96
96
  __query: t.Dict[str, t.Any] = {}
97
- if allow_no_match is not None:
98
- __body["allow_no_match"] = allow_no_match
97
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
99
98
  if error_trace is not None:
100
99
  __query["error_trace"] = error_trace
101
100
  if filter_path is not None:
102
101
  __query["filter_path"] = filter_path
103
- if force is not None:
104
- __body["force"] = force
105
102
  if human is not None:
106
103
  __query["human"] = human
107
104
  if pretty is not None:
108
105
  __query["pretty"] = pretty
109
- if timeout is not None:
110
- __body["timeout"] = timeout
106
+ if not __body:
107
+ if allow_no_match is not None:
108
+ __body["allow_no_match"] = allow_no_match
109
+ if force is not None:
110
+ __body["force"] = force
111
+ if timeout is not None:
112
+ __body["timeout"] = timeout
111
113
  if not __body:
112
114
  __body = None # type: ignore[assignment]
113
115
  __headers = {"accept": "application/json"}
@@ -130,7 +132,7 @@ class MlClient(NamespacedClient):
130
132
  """
131
133
  Deletes a calendar.
132
134
 
133
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-calendar.html>`_
135
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-calendar.html>`_
134
136
 
135
137
  :param calendar_id: A string that uniquely identifies a calendar.
136
138
  """
@@ -165,7 +167,7 @@ class MlClient(NamespacedClient):
165
167
  """
166
168
  Deletes scheduled events from a calendar.
167
169
 
168
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-calendar-event.html>`_
170
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-calendar-event.html>`_
169
171
 
170
172
  :param calendar_id: A string that uniquely identifies a calendar.
171
173
  :param event_id: Identifier for the scheduled event. You can obtain this identifier
@@ -204,7 +206,7 @@ class MlClient(NamespacedClient):
204
206
  """
205
207
  Deletes anomaly detection jobs from a calendar.
206
208
 
207
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-calendar-job.html>`_
209
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-calendar-job.html>`_
208
210
 
209
211
  :param calendar_id: A string that uniquely identifies a calendar.
210
212
  :param job_id: An identifier for the anomaly detection jobs. It can be a job
@@ -244,7 +246,7 @@ class MlClient(NamespacedClient):
244
246
  """
245
247
  Deletes an existing data frame analytics job.
246
248
 
247
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/delete-dfanalytics.html>`_
249
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/delete-dfanalytics.html>`_
248
250
 
249
251
  :param id: Identifier for the data frame analytics job.
250
252
  :param force: If `true`, it deletes a job that is not stopped; this method is
@@ -286,7 +288,7 @@ class MlClient(NamespacedClient):
286
288
  """
287
289
  Deletes an existing datafeed.
288
290
 
289
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-datafeed.html>`_
291
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-datafeed.html>`_
290
292
 
291
293
  :param datafeed_id: A numerical character string that uniquely identifies the
292
294
  datafeed. This identifier can contain lowercase alphanumeric characters (a-z
@@ -315,7 +317,7 @@ class MlClient(NamespacedClient):
315
317
  )
316
318
 
317
319
  @_rewrite_parameters(
318
- body_fields=True,
320
+ body_fields=("requests_per_second", "timeout"),
319
321
  )
320
322
  async def delete_expired_data(
321
323
  self,
@@ -327,11 +329,12 @@ class MlClient(NamespacedClient):
327
329
  pretty: t.Optional[bool] = None,
328
330
  requests_per_second: t.Optional[float] = None,
329
331
  timeout: t.Optional[t.Union["t.Literal[-1]", "t.Literal[0]", str]] = None,
332
+ body: t.Optional[t.Dict[str, t.Any]] = None,
330
333
  ) -> ObjectApiResponse[t.Any]:
331
334
  """
332
335
  Deletes expired and unused machine learning data.
333
336
 
334
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-expired-data.html>`_
337
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-expired-data.html>`_
335
338
 
336
339
  :param job_id: Identifier for an anomaly detection job. It can be a job identifier,
337
340
  a group name, or a wildcard expression.
@@ -345,7 +348,7 @@ class MlClient(NamespacedClient):
345
348
  else:
346
349
  __path = "/_ml/_delete_expired_data"
347
350
  __query: t.Dict[str, t.Any] = {}
348
- __body: t.Dict[str, t.Any] = {}
351
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
349
352
  if error_trace is not None:
350
353
  __query["error_trace"] = error_trace
351
354
  if filter_path is not None:
@@ -354,10 +357,11 @@ class MlClient(NamespacedClient):
354
357
  __query["human"] = human
355
358
  if pretty is not None:
356
359
  __query["pretty"] = pretty
357
- if requests_per_second is not None:
358
- __body["requests_per_second"] = requests_per_second
359
- if timeout is not None:
360
- __body["timeout"] = timeout
360
+ if not __body:
361
+ if requests_per_second is not None:
362
+ __body["requests_per_second"] = requests_per_second
363
+ if timeout is not None:
364
+ __body["timeout"] = timeout
361
365
  if not __body:
362
366
  __body = None # type: ignore[assignment]
363
367
  __headers = {"accept": "application/json"}
@@ -380,7 +384,7 @@ class MlClient(NamespacedClient):
380
384
  """
381
385
  Deletes a filter.
382
386
 
383
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-filter.html>`_
387
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-filter.html>`_
384
388
 
385
389
  :param filter_id: A string that uniquely identifies a filter.
386
390
  """
@@ -417,7 +421,7 @@ class MlClient(NamespacedClient):
417
421
  """
418
422
  Deletes forecasts from a machine learning job.
419
423
 
420
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-forecast.html>`_
424
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-forecast.html>`_
421
425
 
422
426
  :param job_id: Identifier for the anomaly detection job.
423
427
  :param forecast_id: A comma-separated list of forecast identifiers. If you do
@@ -473,7 +477,7 @@ class MlClient(NamespacedClient):
473
477
  """
474
478
  Deletes an existing anomaly detection job.
475
479
 
476
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-job.html>`_
480
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-job.html>`_
477
481
 
478
482
  :param job_id: Identifier for the anomaly detection job.
479
483
  :param delete_user_annotations: Specifies whether annotations that have been
@@ -521,7 +525,7 @@ class MlClient(NamespacedClient):
521
525
  """
522
526
  Deletes an existing model snapshot.
523
527
 
524
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-delete-snapshot.html>`_
528
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-delete-snapshot.html>`_
525
529
 
526
530
  :param job_id: Identifier for the anomaly detection job.
527
531
  :param snapshot_id: Identifier for the model snapshot.
@@ -560,7 +564,7 @@ class MlClient(NamespacedClient):
560
564
  Deletes an existing trained inference model that is currently not referenced
561
565
  by an ingest pipeline.
562
566
 
563
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/delete-trained-models.html>`_
567
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/delete-trained-models.html>`_
564
568
 
565
569
  :param model_id: The unique identifier of the trained model.
566
570
  :param force: Forcefully deletes a trained model that is referenced by ingest
@@ -599,7 +603,7 @@ class MlClient(NamespacedClient):
599
603
  """
600
604
  Deletes a model alias that refers to the trained model
601
605
 
602
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/delete-trained-models-aliases.html>`_
606
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/delete-trained-models-aliases.html>`_
603
607
 
604
608
  :param model_id: The trained model ID to which the model alias refers.
605
609
  :param model_alias: The model alias to delete.
@@ -624,7 +628,11 @@ class MlClient(NamespacedClient):
624
628
  )
625
629
 
626
630
  @_rewrite_parameters(
627
- body_fields=True,
631
+ body_fields=(
632
+ "analysis_config",
633
+ "max_bucket_cardinality",
634
+ "overall_cardinality",
635
+ ),
628
636
  )
629
637
  async def estimate_model_memory(
630
638
  self,
@@ -636,11 +644,12 @@ class MlClient(NamespacedClient):
636
644
  max_bucket_cardinality: t.Optional[t.Mapping[str, int]] = None,
637
645
  overall_cardinality: t.Optional[t.Mapping[str, int]] = None,
638
646
  pretty: t.Optional[bool] = None,
647
+ body: t.Optional[t.Dict[str, t.Any]] = None,
639
648
  ) -> ObjectApiResponse[t.Any]:
640
649
  """
641
650
  Estimates the model memory
642
651
 
643
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-apis.html>`_
652
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-apis.html>`_
644
653
 
645
654
  :param analysis_config: For a list of the properties that you can specify in
646
655
  the `analysis_config` component of the body of this API.
@@ -658,62 +667,60 @@ class MlClient(NamespacedClient):
658
667
  or `partition_field_name`.
659
668
  """
660
669
  __path = "/_ml/anomaly_detectors/_estimate_model_memory"
661
- __body: t.Dict[str, t.Any] = {}
662
670
  __query: t.Dict[str, t.Any] = {}
663
- if analysis_config is not None:
664
- __body["analysis_config"] = analysis_config
671
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
665
672
  if error_trace is not None:
666
673
  __query["error_trace"] = error_trace
667
674
  if filter_path is not None:
668
675
  __query["filter_path"] = filter_path
669
676
  if human is not None:
670
677
  __query["human"] = human
671
- if max_bucket_cardinality is not None:
672
- __body["max_bucket_cardinality"] = max_bucket_cardinality
673
- if overall_cardinality is not None:
674
- __body["overall_cardinality"] = overall_cardinality
675
678
  if pretty is not None:
676
679
  __query["pretty"] = pretty
680
+ if not __body:
681
+ if analysis_config is not None:
682
+ __body["analysis_config"] = analysis_config
683
+ if max_bucket_cardinality is not None:
684
+ __body["max_bucket_cardinality"] = max_bucket_cardinality
685
+ if overall_cardinality is not None:
686
+ __body["overall_cardinality"] = overall_cardinality
677
687
  __headers = {"accept": "application/json", "content-type": "application/json"}
678
688
  return await self.perform_request( # type: ignore[return-value]
679
689
  "POST", __path, params=__query, headers=__headers, body=__body
680
690
  )
681
691
 
682
692
  @_rewrite_parameters(
683
- body_fields=True,
693
+ body_fields=("evaluation", "index", "query"),
684
694
  )
685
695
  async def evaluate_data_frame(
686
696
  self,
687
697
  *,
688
- evaluation: t.Mapping[str, t.Any],
689
- index: str,
698
+ evaluation: t.Optional[t.Mapping[str, t.Any]] = None,
699
+ index: t.Optional[str] = None,
690
700
  error_trace: t.Optional[bool] = None,
691
701
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
692
702
  human: t.Optional[bool] = None,
693
703
  pretty: t.Optional[bool] = None,
694
704
  query: t.Optional[t.Mapping[str, t.Any]] = None,
705
+ body: t.Optional[t.Dict[str, t.Any]] = None,
695
706
  ) -> ObjectApiResponse[t.Any]:
696
707
  """
697
708
  Evaluates the data frame analytics for an annotated index.
698
709
 
699
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/evaluate-dfanalytics.html>`_
710
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/evaluate-dfanalytics.html>`_
700
711
 
701
712
  :param evaluation: Defines the type of evaluation you want to perform.
702
713
  :param index: Defines the `index` in which the evaluation will be performed.
703
714
  :param query: A query clause that retrieves a subset of data from the source
704
715
  index.
705
716
  """
706
- if evaluation is None:
717
+ if evaluation is None and body is None:
707
718
  raise ValueError("Empty value passed for parameter 'evaluation'")
708
- if index is None:
719
+ if index is None and body is None:
709
720
  raise ValueError("Empty value passed for parameter 'index'")
710
721
  __path = "/_ml/data_frame/_evaluate"
711
- __body: t.Dict[str, t.Any] = {}
712
722
  __query: t.Dict[str, t.Any] = {}
713
- if evaluation is not None:
714
- __body["evaluation"] = evaluation
715
- if index is not None:
716
- __body["index"] = index
723
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
717
724
  if error_trace is not None:
718
725
  __query["error_trace"] = error_trace
719
726
  if filter_path is not None:
@@ -722,15 +729,29 @@ class MlClient(NamespacedClient):
722
729
  __query["human"] = human
723
730
  if pretty is not None:
724
731
  __query["pretty"] = pretty
725
- if query is not None:
726
- __body["query"] = query
732
+ if not __body:
733
+ if evaluation is not None:
734
+ __body["evaluation"] = evaluation
735
+ if index is not None:
736
+ __body["index"] = index
737
+ if query is not None:
738
+ __body["query"] = query
727
739
  __headers = {"accept": "application/json", "content-type": "application/json"}
728
740
  return await self.perform_request( # type: ignore[return-value]
729
741
  "POST", __path, params=__query, headers=__headers, body=__body
730
742
  )
731
743
 
732
744
  @_rewrite_parameters(
733
- body_fields=True,
745
+ body_fields=(
746
+ "allow_lazy_start",
747
+ "analysis",
748
+ "analyzed_fields",
749
+ "description",
750
+ "dest",
751
+ "max_num_threads",
752
+ "model_memory_limit",
753
+ "source",
754
+ ),
734
755
  )
735
756
  async def explain_data_frame_analytics(
736
757
  self,
@@ -748,11 +769,12 @@ class MlClient(NamespacedClient):
748
769
  model_memory_limit: t.Optional[str] = None,
749
770
  pretty: t.Optional[bool] = None,
750
771
  source: t.Optional[t.Mapping[str, t.Any]] = None,
772
+ body: t.Optional[t.Dict[str, t.Any]] = None,
751
773
  ) -> ObjectApiResponse[t.Any]:
752
774
  """
753
775
  Explains a data frame analytics config.
754
776
 
755
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/explain-dfanalytics.html>`_
777
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/explain-dfanalytics.html>`_
756
778
 
757
779
  :param id: Identifier for the data frame analytics job. This identifier can contain
758
780
  lowercase alphanumeric characters (a-z and 0-9), hyphens, and underscores.
@@ -786,32 +808,33 @@ class MlClient(NamespacedClient):
786
808
  __path = f"/_ml/data_frame/analytics/{_quote(id)}/_explain"
787
809
  else:
788
810
  __path = "/_ml/data_frame/analytics/_explain"
789
- __body: t.Dict[str, t.Any] = {}
790
811
  __query: t.Dict[str, t.Any] = {}
791
- if allow_lazy_start is not None:
792
- __body["allow_lazy_start"] = allow_lazy_start
793
- if analysis is not None:
794
- __body["analysis"] = analysis
795
- if analyzed_fields is not None:
796
- __body["analyzed_fields"] = analyzed_fields
797
- if description is not None:
798
- __body["description"] = description
799
- if dest is not None:
800
- __body["dest"] = dest
812
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
801
813
  if error_trace is not None:
802
814
  __query["error_trace"] = error_trace
803
815
  if filter_path is not None:
804
816
  __query["filter_path"] = filter_path
805
817
  if human is not None:
806
818
  __query["human"] = human
807
- if max_num_threads is not None:
808
- __body["max_num_threads"] = max_num_threads
809
- if model_memory_limit is not None:
810
- __body["model_memory_limit"] = model_memory_limit
811
819
  if pretty is not None:
812
820
  __query["pretty"] = pretty
813
- if source is not None:
814
- __body["source"] = source
821
+ if not __body:
822
+ if allow_lazy_start is not None:
823
+ __body["allow_lazy_start"] = allow_lazy_start
824
+ if analysis is not None:
825
+ __body["analysis"] = analysis
826
+ if analyzed_fields is not None:
827
+ __body["analyzed_fields"] = analyzed_fields
828
+ if description is not None:
829
+ __body["description"] = description
830
+ if dest is not None:
831
+ __body["dest"] = dest
832
+ if max_num_threads is not None:
833
+ __body["max_num_threads"] = max_num_threads
834
+ if model_memory_limit is not None:
835
+ __body["model_memory_limit"] = model_memory_limit
836
+ if source is not None:
837
+ __body["source"] = source
815
838
  if not __body:
816
839
  __body = None # type: ignore[assignment]
817
840
  __headers = {"accept": "application/json"}
@@ -822,7 +845,7 @@ class MlClient(NamespacedClient):
822
845
  )
823
846
 
824
847
  @_rewrite_parameters(
825
- body_fields=True,
848
+ body_fields=("advance_time", "calc_interim", "end", "skip_time", "start"),
826
849
  )
827
850
  async def flush_job(
828
851
  self,
@@ -837,11 +860,12 @@ class MlClient(NamespacedClient):
837
860
  pretty: t.Optional[bool] = None,
838
861
  skip_time: t.Optional[t.Union[str, t.Any]] = None,
839
862
  start: t.Optional[t.Union[str, t.Any]] = None,
863
+ body: t.Optional[t.Dict[str, t.Any]] = None,
840
864
  ) -> ObjectApiResponse[t.Any]:
841
865
  """
842
866
  Forces any buffered data to be processed by the job.
843
867
 
844
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-flush-job.html>`_
868
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-flush-job.html>`_
845
869
 
846
870
  :param job_id: Identifier for the anomaly detection job.
847
871
  :param advance_time: Refer to the description for the `advance_time` query parameter.
@@ -853,14 +877,8 @@ class MlClient(NamespacedClient):
853
877
  if job_id in SKIP_IN_PATH:
854
878
  raise ValueError("Empty value passed for parameter 'job_id'")
855
879
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_flush"
856
- __body: t.Dict[str, t.Any] = {}
857
880
  __query: t.Dict[str, t.Any] = {}
858
- if advance_time is not None:
859
- __body["advance_time"] = advance_time
860
- if calc_interim is not None:
861
- __body["calc_interim"] = calc_interim
862
- if end is not None:
863
- __body["end"] = end
881
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
864
882
  if error_trace is not None:
865
883
  __query["error_trace"] = error_trace
866
884
  if filter_path is not None:
@@ -869,10 +887,17 @@ class MlClient(NamespacedClient):
869
887
  __query["human"] = human
870
888
  if pretty is not None:
871
889
  __query["pretty"] = pretty
872
- if skip_time is not None:
873
- __body["skip_time"] = skip_time
874
- if start is not None:
875
- __body["start"] = start
890
+ if not __body:
891
+ if advance_time is not None:
892
+ __body["advance_time"] = advance_time
893
+ if calc_interim is not None:
894
+ __body["calc_interim"] = calc_interim
895
+ if end is not None:
896
+ __body["end"] = end
897
+ if skip_time is not None:
898
+ __body["skip_time"] = skip_time
899
+ if start is not None:
900
+ __body["start"] = start
876
901
  if not __body:
877
902
  __body = None # type: ignore[assignment]
878
903
  __headers = {"accept": "application/json"}
@@ -883,7 +908,7 @@ class MlClient(NamespacedClient):
883
908
  )
884
909
 
885
910
  @_rewrite_parameters(
886
- body_fields=True,
911
+ body_fields=("duration", "expires_in", "max_model_memory"),
887
912
  )
888
913
  async def forecast(
889
914
  self,
@@ -896,11 +921,12 @@ class MlClient(NamespacedClient):
896
921
  human: t.Optional[bool] = None,
897
922
  max_model_memory: t.Optional[str] = None,
898
923
  pretty: t.Optional[bool] = None,
924
+ body: t.Optional[t.Dict[str, t.Any]] = None,
899
925
  ) -> ObjectApiResponse[t.Any]:
900
926
  """
901
927
  Predicts the future behavior of a time series by using its historical behavior.
902
928
 
903
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-forecast.html>`_
929
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-forecast.html>`_
904
930
 
905
931
  :param job_id: Identifier for the anomaly detection job. The job must be open
906
932
  when you create a forecast; otherwise, an error occurs.
@@ -912,22 +938,23 @@ class MlClient(NamespacedClient):
912
938
  if job_id in SKIP_IN_PATH:
913
939
  raise ValueError("Empty value passed for parameter 'job_id'")
914
940
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_forecast"
915
- __body: t.Dict[str, t.Any] = {}
916
941
  __query: t.Dict[str, t.Any] = {}
917
- if duration is not None:
918
- __body["duration"] = duration
942
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
919
943
  if error_trace is not None:
920
944
  __query["error_trace"] = error_trace
921
- if expires_in is not None:
922
- __body["expires_in"] = expires_in
923
945
  if filter_path is not None:
924
946
  __query["filter_path"] = filter_path
925
947
  if human is not None:
926
948
  __query["human"] = human
927
- if max_model_memory is not None:
928
- __body["max_model_memory"] = max_model_memory
929
949
  if pretty is not None:
930
950
  __query["pretty"] = pretty
951
+ if not __body:
952
+ if duration is not None:
953
+ __body["duration"] = duration
954
+ if expires_in is not None:
955
+ __body["expires_in"] = expires_in
956
+ if max_model_memory is not None:
957
+ __body["max_model_memory"] = max_model_memory
931
958
  if not __body:
932
959
  __body = None # type: ignore[assignment]
933
960
  __headers = {"accept": "application/json"}
@@ -938,7 +965,16 @@ class MlClient(NamespacedClient):
938
965
  )
939
966
 
940
967
  @_rewrite_parameters(
941
- body_fields=True,
968
+ body_fields=(
969
+ "anomaly_score",
970
+ "desc",
971
+ "end",
972
+ "exclude_interim",
973
+ "expand",
974
+ "page",
975
+ "sort",
976
+ "start",
977
+ ),
942
978
  parameter_aliases={"from": "from_"},
943
979
  )
944
980
  async def get_buckets(
@@ -960,11 +996,12 @@ class MlClient(NamespacedClient):
960
996
  size: t.Optional[int] = None,
961
997
  sort: t.Optional[str] = None,
962
998
  start: t.Optional[t.Union[str, t.Any]] = None,
999
+ body: t.Optional[t.Dict[str, t.Any]] = None,
963
1000
  ) -> ObjectApiResponse[t.Any]:
964
1001
  """
965
1002
  Retrieves anomaly detection job results for one or more buckets.
966
1003
 
967
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-bucket.html>`_
1004
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-bucket.html>`_
968
1005
 
969
1006
  :param job_id: Identifier for the anomaly detection job.
970
1007
  :param timestamp: The timestamp of a single bucket result. If you do not specify
@@ -990,36 +1027,37 @@ class MlClient(NamespacedClient):
990
1027
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/results/buckets"
991
1028
  else:
992
1029
  raise ValueError("Couldn't find a path for the given parameters")
993
- __body: t.Dict[str, t.Any] = {}
994
1030
  __query: t.Dict[str, t.Any] = {}
995
- if anomaly_score is not None:
996
- __body["anomaly_score"] = anomaly_score
997
- if desc is not None:
998
- __body["desc"] = desc
999
- if end is not None:
1000
- __body["end"] = end
1031
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
1001
1032
  if error_trace is not None:
1002
1033
  __query["error_trace"] = error_trace
1003
- if exclude_interim is not None:
1004
- __body["exclude_interim"] = exclude_interim
1005
- if expand is not None:
1006
- __body["expand"] = expand
1007
1034
  if filter_path is not None:
1008
1035
  __query["filter_path"] = filter_path
1009
1036
  if from_ is not None:
1010
1037
  __query["from"] = from_
1011
1038
  if human is not None:
1012
1039
  __query["human"] = human
1013
- if page is not None:
1014
- __body["page"] = page
1015
1040
  if pretty is not None:
1016
1041
  __query["pretty"] = pretty
1017
1042
  if size is not None:
1018
1043
  __query["size"] = size
1019
- if sort is not None:
1020
- __body["sort"] = sort
1021
- if start is not None:
1022
- __body["start"] = start
1044
+ if not __body:
1045
+ if anomaly_score is not None:
1046
+ __body["anomaly_score"] = anomaly_score
1047
+ if desc is not None:
1048
+ __body["desc"] = desc
1049
+ if end is not None:
1050
+ __body["end"] = end
1051
+ if exclude_interim is not None:
1052
+ __body["exclude_interim"] = exclude_interim
1053
+ if expand is not None:
1054
+ __body["expand"] = expand
1055
+ if page is not None:
1056
+ __body["page"] = page
1057
+ if sort is not None:
1058
+ __body["sort"] = sort
1059
+ if start is not None:
1060
+ __body["start"] = start
1023
1061
  if not __body:
1024
1062
  __body = None # type: ignore[assignment]
1025
1063
  __headers = {"accept": "application/json"}
@@ -1049,7 +1087,7 @@ class MlClient(NamespacedClient):
1049
1087
  """
1050
1088
  Retrieves information about the scheduled events in calendars.
1051
1089
 
1052
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-calendar-event.html>`_
1090
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-calendar-event.html>`_
1053
1091
 
1054
1092
  :param calendar_id: A string that uniquely identifies a calendar. You can get
1055
1093
  information for multiple calendars by using a comma-separated list of ids
@@ -1090,7 +1128,7 @@ class MlClient(NamespacedClient):
1090
1128
  )
1091
1129
 
1092
1130
  @_rewrite_parameters(
1093
- body_fields=True,
1131
+ body_fields=("page",),
1094
1132
  parameter_aliases={"from": "from_"},
1095
1133
  )
1096
1134
  async def get_calendars(
@@ -1104,11 +1142,12 @@ class MlClient(NamespacedClient):
1104
1142
  page: t.Optional[t.Mapping[str, t.Any]] = None,
1105
1143
  pretty: t.Optional[bool] = None,
1106
1144
  size: t.Optional[int] = None,
1145
+ body: t.Optional[t.Dict[str, t.Any]] = None,
1107
1146
  ) -> ObjectApiResponse[t.Any]:
1108
1147
  """
1109
1148
  Retrieves configuration information for calendars.
1110
1149
 
1111
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-calendar.html>`_
1150
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-calendar.html>`_
1112
1151
 
1113
1152
  :param calendar_id: A string that uniquely identifies a calendar. You can get
1114
1153
  information for multiple calendars by using a comma-separated list of ids
@@ -1125,7 +1164,7 @@ class MlClient(NamespacedClient):
1125
1164
  else:
1126
1165
  __path = "/_ml/calendars"
1127
1166
  __query: t.Dict[str, t.Any] = {}
1128
- __body: t.Dict[str, t.Any] = {}
1167
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
1129
1168
  if error_trace is not None:
1130
1169
  __query["error_trace"] = error_trace
1131
1170
  if filter_path is not None:
@@ -1134,12 +1173,13 @@ class MlClient(NamespacedClient):
1134
1173
  __query["from"] = from_
1135
1174
  if human is not None:
1136
1175
  __query["human"] = human
1137
- if page is not None:
1138
- __body["page"] = page
1139
1176
  if pretty is not None:
1140
1177
  __query["pretty"] = pretty
1141
1178
  if size is not None:
1142
1179
  __query["size"] = size
1180
+ if not __body:
1181
+ if page is not None:
1182
+ __body["page"] = page
1143
1183
  if not __body:
1144
1184
  __body = None # type: ignore[assignment]
1145
1185
  __headers = {"accept": "application/json"}
@@ -1150,7 +1190,7 @@ class MlClient(NamespacedClient):
1150
1190
  )
1151
1191
 
1152
1192
  @_rewrite_parameters(
1153
- body_fields=True,
1193
+ body_fields=("page",),
1154
1194
  parameter_aliases={"from": "from_"},
1155
1195
  )
1156
1196
  async def get_categories(
@@ -1166,11 +1206,12 @@ class MlClient(NamespacedClient):
1166
1206
  partition_field_value: t.Optional[str] = None,
1167
1207
  pretty: t.Optional[bool] = None,
1168
1208
  size: t.Optional[int] = None,
1209
+ body: t.Optional[t.Dict[str, t.Any]] = None,
1169
1210
  ) -> ObjectApiResponse[t.Any]:
1170
1211
  """
1171
1212
  Retrieves anomaly detection job results for one or more categories.
1172
1213
 
1173
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-category.html>`_
1214
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-category.html>`_
1174
1215
 
1175
1216
  :param job_id: Identifier for the anomaly detection job.
1176
1217
  :param category_id: Identifier for the category, which is unique in the job.
@@ -1192,7 +1233,7 @@ class MlClient(NamespacedClient):
1192
1233
  else:
1193
1234
  raise ValueError("Couldn't find a path for the given parameters")
1194
1235
  __query: t.Dict[str, t.Any] = {}
1195
- __body: t.Dict[str, t.Any] = {}
1236
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
1196
1237
  if error_trace is not None:
1197
1238
  __query["error_trace"] = error_trace
1198
1239
  if filter_path is not None:
@@ -1201,14 +1242,15 @@ class MlClient(NamespacedClient):
1201
1242
  __query["from"] = from_
1202
1243
  if human is not None:
1203
1244
  __query["human"] = human
1204
- if page is not None:
1205
- __body["page"] = page
1206
1245
  if partition_field_value is not None:
1207
1246
  __query["partition_field_value"] = partition_field_value
1208
1247
  if pretty is not None:
1209
1248
  __query["pretty"] = pretty
1210
1249
  if size is not None:
1211
1250
  __query["size"] = size
1251
+ if not __body:
1252
+ if page is not None:
1253
+ __body["page"] = page
1212
1254
  if not __body:
1213
1255
  __body = None # type: ignore[assignment]
1214
1256
  __headers = {"accept": "application/json"}
@@ -1237,7 +1279,7 @@ class MlClient(NamespacedClient):
1237
1279
  """
1238
1280
  Retrieves configuration information for data frame analytics jobs.
1239
1281
 
1240
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/get-dfanalytics.html>`_
1282
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/get-dfanalytics.html>`_
1241
1283
 
1242
1284
  :param id: Identifier for the data frame analytics job. If you do not specify
1243
1285
  this option, the API returns information for the first hundred data frame
@@ -1301,7 +1343,7 @@ class MlClient(NamespacedClient):
1301
1343
  """
1302
1344
  Retrieves usage information for data frame analytics jobs.
1303
1345
 
1304
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/get-dfanalytics-stats.html>`_
1346
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/get-dfanalytics-stats.html>`_
1305
1347
 
1306
1348
  :param id: Identifier for the data frame analytics job. If you do not specify
1307
1349
  this option, the API returns information for the first hundred data frame
@@ -1358,7 +1400,7 @@ class MlClient(NamespacedClient):
1358
1400
  """
1359
1401
  Retrieves usage information for datafeeds.
1360
1402
 
1361
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-datafeed-stats.html>`_
1403
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-datafeed-stats.html>`_
1362
1404
 
1363
1405
  :param datafeed_id: Identifier for the datafeed. It can be a datafeed identifier
1364
1406
  or a wildcard expression. If you do not specify one of these options, the
@@ -1406,7 +1448,7 @@ class MlClient(NamespacedClient):
1406
1448
  """
1407
1449
  Retrieves configuration information for datafeeds.
1408
1450
 
1409
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-datafeed.html>`_
1451
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-datafeed.html>`_
1410
1452
 
1411
1453
  :param datafeed_id: Identifier for the datafeed. It can be a datafeed identifier
1412
1454
  or a wildcard expression. If you do not specify one of these options, the
@@ -1461,7 +1503,7 @@ class MlClient(NamespacedClient):
1461
1503
  """
1462
1504
  Retrieves filters.
1463
1505
 
1464
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-filter.html>`_
1506
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-filter.html>`_
1465
1507
 
1466
1508
  :param filter_id: A string that uniquely identifies a filter.
1467
1509
  :param from_: Skips the specified number of filters.
@@ -1490,7 +1532,7 @@ class MlClient(NamespacedClient):
1490
1532
  )
1491
1533
 
1492
1534
  @_rewrite_parameters(
1493
- body_fields=True,
1535
+ body_fields=("page",),
1494
1536
  parameter_aliases={"from": "from_"},
1495
1537
  )
1496
1538
  async def get_influencers(
@@ -1510,11 +1552,12 @@ class MlClient(NamespacedClient):
1510
1552
  size: t.Optional[int] = None,
1511
1553
  sort: t.Optional[str] = None,
1512
1554
  start: t.Optional[t.Union[str, t.Any]] = None,
1555
+ body: t.Optional[t.Dict[str, t.Any]] = None,
1513
1556
  ) -> ObjectApiResponse[t.Any]:
1514
1557
  """
1515
1558
  Retrieves anomaly detection job results for one or more influencers.
1516
1559
 
1517
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-influencer.html>`_
1560
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-influencer.html>`_
1518
1561
 
1519
1562
  :param job_id: Identifier for the anomaly detection job.
1520
1563
  :param desc: If true, the results are sorted in descending order.
@@ -1537,7 +1580,7 @@ class MlClient(NamespacedClient):
1537
1580
  raise ValueError("Empty value passed for parameter 'job_id'")
1538
1581
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/results/influencers"
1539
1582
  __query: t.Dict[str, t.Any] = {}
1540
- __body: t.Dict[str, t.Any] = {}
1583
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
1541
1584
  if desc is not None:
1542
1585
  __query["desc"] = desc
1543
1586
  if end is not None:
@@ -1554,8 +1597,6 @@ class MlClient(NamespacedClient):
1554
1597
  __query["human"] = human
1555
1598
  if influencer_score is not None:
1556
1599
  __query["influencer_score"] = influencer_score
1557
- if page is not None:
1558
- __body["page"] = page
1559
1600
  if pretty is not None:
1560
1601
  __query["pretty"] = pretty
1561
1602
  if size is not None:
@@ -1564,6 +1605,9 @@ class MlClient(NamespacedClient):
1564
1605
  __query["sort"] = sort
1565
1606
  if start is not None:
1566
1607
  __query["start"] = start
1608
+ if not __body:
1609
+ if page is not None:
1610
+ __body["page"] = page
1567
1611
  if not __body:
1568
1612
  __body = None # type: ignore[assignment]
1569
1613
  __headers = {"accept": "application/json"}
@@ -1587,7 +1631,7 @@ class MlClient(NamespacedClient):
1587
1631
  """
1588
1632
  Retrieves usage information for anomaly detection jobs.
1589
1633
 
1590
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-job-stats.html>`_
1634
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-job-stats.html>`_
1591
1635
 
1592
1636
  :param job_id: Identifier for the anomaly detection job. It can be a job identifier,
1593
1637
  a group name, a comma-separated list of jobs, or a wildcard expression. If
@@ -1636,7 +1680,7 @@ class MlClient(NamespacedClient):
1636
1680
  """
1637
1681
  Retrieves configuration information for anomaly detection jobs.
1638
1682
 
1639
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-job.html>`_
1683
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-job.html>`_
1640
1684
 
1641
1685
  :param job_id: Identifier for the anomaly detection job. It can be a job identifier,
1642
1686
  a group name, or a wildcard expression. If you do not specify one of these
@@ -1691,7 +1735,7 @@ class MlClient(NamespacedClient):
1691
1735
  """
1692
1736
  Returns information on how ML is using memory.
1693
1737
 
1694
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/get-ml-memory.html>`_
1738
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/get-ml-memory.html>`_
1695
1739
 
1696
1740
  :param node_id: The names of particular nodes in the cluster to target. For example,
1697
1741
  `nodeId1,nodeId2` or `ml:true`
@@ -1738,7 +1782,7 @@ class MlClient(NamespacedClient):
1738
1782
  """
1739
1783
  Gets stats for anomaly detection job model snapshot upgrades that are in progress.
1740
1784
 
1741
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-job-model-snapshot-upgrade-stats.html>`_
1785
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-job-model-snapshot-upgrade-stats.html>`_
1742
1786
 
1743
1787
  :param job_id: Identifier for the anomaly detection job.
1744
1788
  :param snapshot_id: A numerical character string that uniquely identifies the
@@ -1776,7 +1820,7 @@ class MlClient(NamespacedClient):
1776
1820
  )
1777
1821
 
1778
1822
  @_rewrite_parameters(
1779
- body_fields=True,
1823
+ body_fields=("desc", "end", "page", "sort", "start"),
1780
1824
  parameter_aliases={"from": "from_"},
1781
1825
  )
1782
1826
  async def get_model_snapshots(
@@ -1795,11 +1839,12 @@ class MlClient(NamespacedClient):
1795
1839
  size: t.Optional[int] = None,
1796
1840
  sort: t.Optional[str] = None,
1797
1841
  start: t.Optional[t.Union[str, t.Any]] = None,
1842
+ body: t.Optional[t.Dict[str, t.Any]] = None,
1798
1843
  ) -> ObjectApiResponse[t.Any]:
1799
1844
  """
1800
1845
  Retrieves information about model snapshots.
1801
1846
 
1802
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-snapshot.html>`_
1847
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-snapshot.html>`_
1803
1848
 
1804
1849
  :param job_id: Identifier for the anomaly detection job.
1805
1850
  :param snapshot_id: A numerical character string that uniquely identifies the
@@ -1823,12 +1868,8 @@ class MlClient(NamespacedClient):
1823
1868
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/model_snapshots"
1824
1869
  else:
1825
1870
  raise ValueError("Couldn't find a path for the given parameters")
1826
- __body: t.Dict[str, t.Any] = {}
1827
1871
  __query: t.Dict[str, t.Any] = {}
1828
- if desc is not None:
1829
- __body["desc"] = desc
1830
- if end is not None:
1831
- __body["end"] = end
1872
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
1832
1873
  if error_trace is not None:
1833
1874
  __query["error_trace"] = error_trace
1834
1875
  if filter_path is not None:
@@ -1837,16 +1878,21 @@ class MlClient(NamespacedClient):
1837
1878
  __query["from"] = from_
1838
1879
  if human is not None:
1839
1880
  __query["human"] = human
1840
- if page is not None:
1841
- __body["page"] = page
1842
1881
  if pretty is not None:
1843
1882
  __query["pretty"] = pretty
1844
1883
  if size is not None:
1845
1884
  __query["size"] = size
1846
- if sort is not None:
1847
- __body["sort"] = sort
1848
- if start is not None:
1849
- __body["start"] = start
1885
+ if not __body:
1886
+ if desc is not None:
1887
+ __body["desc"] = desc
1888
+ if end is not None:
1889
+ __body["end"] = end
1890
+ if page is not None:
1891
+ __body["page"] = page
1892
+ if sort is not None:
1893
+ __body["sort"] = sort
1894
+ if start is not None:
1895
+ __body["start"] = start
1850
1896
  if not __body:
1851
1897
  __body = None # type: ignore[assignment]
1852
1898
  __headers = {"accept": "application/json"}
@@ -1857,7 +1903,15 @@ class MlClient(NamespacedClient):
1857
1903
  )
1858
1904
 
1859
1905
  @_rewrite_parameters(
1860
- body_fields=True,
1906
+ body_fields=(
1907
+ "allow_no_match",
1908
+ "bucket_span",
1909
+ "end",
1910
+ "exclude_interim",
1911
+ "overall_score",
1912
+ "start",
1913
+ "top_n",
1914
+ ),
1861
1915
  )
1862
1916
  async def get_overall_buckets(
1863
1917
  self,
@@ -1874,12 +1928,13 @@ class MlClient(NamespacedClient):
1874
1928
  pretty: t.Optional[bool] = None,
1875
1929
  start: t.Optional[t.Union[str, t.Any]] = None,
1876
1930
  top_n: t.Optional[int] = None,
1931
+ body: t.Optional[t.Dict[str, t.Any]] = None,
1877
1932
  ) -> ObjectApiResponse[t.Any]:
1878
1933
  """
1879
1934
  Retrieves overall bucket results that summarize the bucket results of multiple
1880
1935
  anomaly detection jobs.
1881
1936
 
1882
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-overall-buckets.html>`_
1937
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-overall-buckets.html>`_
1883
1938
 
1884
1939
  :param job_id: Identifier for the anomaly detection job. It can be a job identifier,
1885
1940
  a group name, a comma-separated list of jobs or groups, or a wildcard expression.
@@ -1899,30 +1954,31 @@ class MlClient(NamespacedClient):
1899
1954
  if job_id in SKIP_IN_PATH:
1900
1955
  raise ValueError("Empty value passed for parameter 'job_id'")
1901
1956
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/results/overall_buckets"
1902
- __body: t.Dict[str, t.Any] = {}
1903
1957
  __query: t.Dict[str, t.Any] = {}
1904
- if allow_no_match is not None:
1905
- __body["allow_no_match"] = allow_no_match
1906
- if bucket_span is not None:
1907
- __body["bucket_span"] = bucket_span
1908
- if end is not None:
1909
- __body["end"] = end
1958
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
1910
1959
  if error_trace is not None:
1911
1960
  __query["error_trace"] = error_trace
1912
- if exclude_interim is not None:
1913
- __body["exclude_interim"] = exclude_interim
1914
1961
  if filter_path is not None:
1915
1962
  __query["filter_path"] = filter_path
1916
1963
  if human is not None:
1917
1964
  __query["human"] = human
1918
- if overall_score is not None:
1919
- __body["overall_score"] = overall_score
1920
1965
  if pretty is not None:
1921
1966
  __query["pretty"] = pretty
1922
- if start is not None:
1923
- __body["start"] = start
1924
- if top_n is not None:
1925
- __body["top_n"] = top_n
1967
+ if not __body:
1968
+ if allow_no_match is not None:
1969
+ __body["allow_no_match"] = allow_no_match
1970
+ if bucket_span is not None:
1971
+ __body["bucket_span"] = bucket_span
1972
+ if end is not None:
1973
+ __body["end"] = end
1974
+ if exclude_interim is not None:
1975
+ __body["exclude_interim"] = exclude_interim
1976
+ if overall_score is not None:
1977
+ __body["overall_score"] = overall_score
1978
+ if start is not None:
1979
+ __body["start"] = start
1980
+ if top_n is not None:
1981
+ __body["top_n"] = top_n
1926
1982
  if not __body:
1927
1983
  __body = None # type: ignore[assignment]
1928
1984
  __headers = {"accept": "application/json"}
@@ -1933,7 +1989,15 @@ class MlClient(NamespacedClient):
1933
1989
  )
1934
1990
 
1935
1991
  @_rewrite_parameters(
1936
- body_fields=True,
1992
+ body_fields=(
1993
+ "desc",
1994
+ "end",
1995
+ "exclude_interim",
1996
+ "page",
1997
+ "record_score",
1998
+ "sort",
1999
+ "start",
2000
+ ),
1937
2001
  parameter_aliases={"from": "from_"},
1938
2002
  )
1939
2003
  async def get_records(
@@ -1953,11 +2017,12 @@ class MlClient(NamespacedClient):
1953
2017
  size: t.Optional[int] = None,
1954
2018
  sort: t.Optional[str] = None,
1955
2019
  start: t.Optional[t.Union[str, t.Any]] = None,
2020
+ body: t.Optional[t.Dict[str, t.Any]] = None,
1956
2021
  ) -> ObjectApiResponse[t.Any]:
1957
2022
  """
1958
2023
  Retrieves anomaly records for an anomaly detection job.
1959
2024
 
1960
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-get-record.html>`_
2025
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-get-record.html>`_
1961
2026
 
1962
2027
  :param job_id: Identifier for the anomaly detection job.
1963
2028
  :param desc: Refer to the description for the `desc` query parameter.
@@ -1974,34 +2039,35 @@ class MlClient(NamespacedClient):
1974
2039
  if job_id in SKIP_IN_PATH:
1975
2040
  raise ValueError("Empty value passed for parameter 'job_id'")
1976
2041
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/results/records"
1977
- __body: t.Dict[str, t.Any] = {}
1978
2042
  __query: t.Dict[str, t.Any] = {}
1979
- if desc is not None:
1980
- __body["desc"] = desc
1981
- if end is not None:
1982
- __body["end"] = end
2043
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
1983
2044
  if error_trace is not None:
1984
2045
  __query["error_trace"] = error_trace
1985
- if exclude_interim is not None:
1986
- __body["exclude_interim"] = exclude_interim
1987
2046
  if filter_path is not None:
1988
2047
  __query["filter_path"] = filter_path
1989
2048
  if from_ is not None:
1990
2049
  __query["from"] = from_
1991
2050
  if human is not None:
1992
2051
  __query["human"] = human
1993
- if page is not None:
1994
- __body["page"] = page
1995
2052
  if pretty is not None:
1996
2053
  __query["pretty"] = pretty
1997
- if record_score is not None:
1998
- __body["record_score"] = record_score
1999
2054
  if size is not None:
2000
2055
  __query["size"] = size
2001
- if sort is not None:
2002
- __body["sort"] = sort
2003
- if start is not None:
2004
- __body["start"] = start
2056
+ if not __body:
2057
+ if desc is not None:
2058
+ __body["desc"] = desc
2059
+ if end is not None:
2060
+ __body["end"] = end
2061
+ if exclude_interim is not None:
2062
+ __body["exclude_interim"] = exclude_interim
2063
+ if page is not None:
2064
+ __body["page"] = page
2065
+ if record_score is not None:
2066
+ __body["record_score"] = record_score
2067
+ if sort is not None:
2068
+ __body["sort"] = sort
2069
+ if start is not None:
2070
+ __body["start"] = start
2005
2071
  if not __body:
2006
2072
  __body = None # type: ignore[assignment]
2007
2073
  __headers = {"accept": "application/json"}
@@ -2038,7 +2104,7 @@ class MlClient(NamespacedClient):
2038
2104
  """
2039
2105
  Retrieves configuration information for a trained inference model.
2040
2106
 
2041
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/get-trained-models.html>`_
2107
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/get-trained-models.html>`_
2042
2108
 
2043
2109
  :param model_id: The unique identifier of the trained model.
2044
2110
  :param allow_no_match: Specifies what to do when the request: - Contains wildcard
@@ -2110,7 +2176,7 @@ class MlClient(NamespacedClient):
2110
2176
  """
2111
2177
  Retrieves usage information for trained inference models.
2112
2178
 
2113
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/get-trained-models-stats.html>`_
2179
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/get-trained-models-stats.html>`_
2114
2180
 
2115
2181
  :param model_id: The unique identifier of the trained model or a model alias.
2116
2182
  It can be a comma-separated list or a wildcard expression.
@@ -2147,24 +2213,25 @@ class MlClient(NamespacedClient):
2147
2213
  )
2148
2214
 
2149
2215
  @_rewrite_parameters(
2150
- body_fields=True,
2216
+ body_fields=("docs", "inference_config"),
2151
2217
  )
2152
2218
  async def infer_trained_model(
2153
2219
  self,
2154
2220
  *,
2155
2221
  model_id: str,
2156
- docs: t.Sequence[t.Mapping[str, t.Any]],
2222
+ docs: t.Optional[t.Sequence[t.Mapping[str, t.Any]]] = None,
2157
2223
  error_trace: t.Optional[bool] = None,
2158
2224
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
2159
2225
  human: t.Optional[bool] = None,
2160
2226
  inference_config: t.Optional[t.Mapping[str, t.Any]] = None,
2161
2227
  pretty: t.Optional[bool] = None,
2162
2228
  timeout: t.Optional[t.Union["t.Literal[-1]", "t.Literal[0]", str]] = None,
2229
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2163
2230
  ) -> ObjectApiResponse[t.Any]:
2164
2231
  """
2165
2232
  Evaluate a trained model.
2166
2233
 
2167
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/infer-trained-model.html>`_
2234
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/infer-trained-model.html>`_
2168
2235
 
2169
2236
  :param model_id: The unique identifier of the trained model.
2170
2237
  :param docs: An array of objects to pass to the model for inference. The objects
@@ -2177,25 +2244,26 @@ class MlClient(NamespacedClient):
2177
2244
  """
2178
2245
  if model_id in SKIP_IN_PATH:
2179
2246
  raise ValueError("Empty value passed for parameter 'model_id'")
2180
- if docs is None:
2247
+ if docs is None and body is None:
2181
2248
  raise ValueError("Empty value passed for parameter 'docs'")
2182
2249
  __path = f"/_ml/trained_models/{_quote(model_id)}/_infer"
2183
- __body: t.Dict[str, t.Any] = {}
2184
2250
  __query: t.Dict[str, t.Any] = {}
2185
- if docs is not None:
2186
- __body["docs"] = docs
2251
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2187
2252
  if error_trace is not None:
2188
2253
  __query["error_trace"] = error_trace
2189
2254
  if filter_path is not None:
2190
2255
  __query["filter_path"] = filter_path
2191
2256
  if human is not None:
2192
2257
  __query["human"] = human
2193
- if inference_config is not None:
2194
- __body["inference_config"] = inference_config
2195
2258
  if pretty is not None:
2196
2259
  __query["pretty"] = pretty
2197
2260
  if timeout is not None:
2198
2261
  __query["timeout"] = timeout
2262
+ if not __body:
2263
+ if docs is not None:
2264
+ __body["docs"] = docs
2265
+ if inference_config is not None:
2266
+ __body["inference_config"] = inference_config
2199
2267
  __headers = {"accept": "application/json", "content-type": "application/json"}
2200
2268
  return await self.perform_request( # type: ignore[return-value]
2201
2269
  "POST", __path, params=__query, headers=__headers, body=__body
@@ -2213,7 +2281,7 @@ class MlClient(NamespacedClient):
2213
2281
  """
2214
2282
  Returns defaults and limits used by machine learning.
2215
2283
 
2216
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/get-ml-info.html>`_
2284
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/get-ml-info.html>`_
2217
2285
  """
2218
2286
  __path = "/_ml/info"
2219
2287
  __query: t.Dict[str, t.Any] = {}
@@ -2231,7 +2299,7 @@ class MlClient(NamespacedClient):
2231
2299
  )
2232
2300
 
2233
2301
  @_rewrite_parameters(
2234
- body_fields=True,
2302
+ body_fields=("timeout",),
2235
2303
  )
2236
2304
  async def open_job(
2237
2305
  self,
@@ -2242,11 +2310,12 @@ class MlClient(NamespacedClient):
2242
2310
  human: t.Optional[bool] = None,
2243
2311
  pretty: t.Optional[bool] = None,
2244
2312
  timeout: t.Optional[t.Union["t.Literal[-1]", "t.Literal[0]", str]] = None,
2313
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2245
2314
  ) -> ObjectApiResponse[t.Any]:
2246
2315
  """
2247
2316
  Opens one or more anomaly detection jobs.
2248
2317
 
2249
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-open-job.html>`_
2318
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-open-job.html>`_
2250
2319
 
2251
2320
  :param job_id: Identifier for the anomaly detection job.
2252
2321
  :param timeout: Refer to the description for the `timeout` query parameter.
@@ -2255,7 +2324,7 @@ class MlClient(NamespacedClient):
2255
2324
  raise ValueError("Empty value passed for parameter 'job_id'")
2256
2325
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_open"
2257
2326
  __query: t.Dict[str, t.Any] = {}
2258
- __body: t.Dict[str, t.Any] = {}
2327
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2259
2328
  if error_trace is not None:
2260
2329
  __query["error_trace"] = error_trace
2261
2330
  if filter_path is not None:
@@ -2264,8 +2333,9 @@ class MlClient(NamespacedClient):
2264
2333
  __query["human"] = human
2265
2334
  if pretty is not None:
2266
2335
  __query["pretty"] = pretty
2267
- if timeout is not None:
2268
- __body["timeout"] = timeout
2336
+ if not __body:
2337
+ if timeout is not None:
2338
+ __body["timeout"] = timeout
2269
2339
  if not __body:
2270
2340
  __body = None # type: ignore[assignment]
2271
2341
  __headers = {"accept": "application/json"}
@@ -2276,22 +2346,23 @@ class MlClient(NamespacedClient):
2276
2346
  )
2277
2347
 
2278
2348
  @_rewrite_parameters(
2279
- body_fields=True,
2349
+ body_fields=("events",),
2280
2350
  )
2281
2351
  async def post_calendar_events(
2282
2352
  self,
2283
2353
  *,
2284
2354
  calendar_id: str,
2285
- events: t.Sequence[t.Mapping[str, t.Any]],
2355
+ events: t.Optional[t.Sequence[t.Mapping[str, t.Any]]] = None,
2286
2356
  error_trace: t.Optional[bool] = None,
2287
2357
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
2288
2358
  human: t.Optional[bool] = None,
2289
2359
  pretty: t.Optional[bool] = None,
2360
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2290
2361
  ) -> ObjectApiResponse[t.Any]:
2291
2362
  """
2292
2363
  Posts scheduled events in a calendar.
2293
2364
 
2294
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-post-calendar-event.html>`_
2365
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-post-calendar-event.html>`_
2295
2366
 
2296
2367
  :param calendar_id: A string that uniquely identifies a calendar.
2297
2368
  :param events: A list of one of more scheduled events. The event’s start and
@@ -2300,13 +2371,11 @@ class MlClient(NamespacedClient):
2300
2371
  """
2301
2372
  if calendar_id in SKIP_IN_PATH:
2302
2373
  raise ValueError("Empty value passed for parameter 'calendar_id'")
2303
- if events is None:
2374
+ if events is None and body is None:
2304
2375
  raise ValueError("Empty value passed for parameter 'events'")
2305
2376
  __path = f"/_ml/calendars/{_quote(calendar_id)}/events"
2306
- __body: t.Dict[str, t.Any] = {}
2307
2377
  __query: t.Dict[str, t.Any] = {}
2308
- if events is not None:
2309
- __body["events"] = events
2378
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2310
2379
  if error_trace is not None:
2311
2380
  __query["error_trace"] = error_trace
2312
2381
  if filter_path is not None:
@@ -2315,6 +2384,9 @@ class MlClient(NamespacedClient):
2315
2384
  __query["human"] = human
2316
2385
  if pretty is not None:
2317
2386
  __query["pretty"] = pretty
2387
+ if not __body:
2388
+ if events is not None:
2389
+ __body["events"] = events
2318
2390
  __headers = {"accept": "application/json", "content-type": "application/json"}
2319
2391
  return await self.perform_request( # type: ignore[return-value]
2320
2392
  "POST", __path, params=__query, headers=__headers, body=__body
@@ -2327,7 +2399,8 @@ class MlClient(NamespacedClient):
2327
2399
  self,
2328
2400
  *,
2329
2401
  job_id: str,
2330
- data: t.Sequence[t.Any],
2402
+ data: t.Optional[t.Sequence[t.Any]] = None,
2403
+ body: t.Optional[t.Sequence[t.Any]] = None,
2331
2404
  error_trace: t.Optional[bool] = None,
2332
2405
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
2333
2406
  human: t.Optional[bool] = None,
@@ -2338,7 +2411,7 @@ class MlClient(NamespacedClient):
2338
2411
  """
2339
2412
  Sends data to an anomaly detection job for analysis.
2340
2413
 
2341
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-post-data.html>`_
2414
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-post-data.html>`_
2342
2415
 
2343
2416
  :param job_id: Identifier for the anomaly detection job. The job must have a
2344
2417
  state of open to receive and process the data.
@@ -2348,8 +2421,12 @@ class MlClient(NamespacedClient):
2348
2421
  """
2349
2422
  if job_id in SKIP_IN_PATH:
2350
2423
  raise ValueError("Empty value passed for parameter 'job_id'")
2351
- if data is None:
2352
- raise ValueError("Empty value passed for parameter 'data'")
2424
+ if data is None and body is None:
2425
+ raise ValueError(
2426
+ "Empty value passed for parameters 'data' and 'body', one of them should be set."
2427
+ )
2428
+ elif data is not None and body is not None:
2429
+ raise ValueError("Cannot set both 'data' and 'body'")
2353
2430
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_data"
2354
2431
  __query: t.Dict[str, t.Any] = {}
2355
2432
  if error_trace is not None:
@@ -2364,7 +2441,7 @@ class MlClient(NamespacedClient):
2364
2441
  __query["reset_end"] = reset_end
2365
2442
  if reset_start is not None:
2366
2443
  __query["reset_start"] = reset_start
2367
- __body = data
2444
+ __body = data if data is not None else body
2368
2445
  __headers = {
2369
2446
  "accept": "application/json",
2370
2447
  "content-type": "application/x-ndjson",
@@ -2374,7 +2451,7 @@ class MlClient(NamespacedClient):
2374
2451
  )
2375
2452
 
2376
2453
  @_rewrite_parameters(
2377
- body_fields=True,
2454
+ body_fields=("config",),
2378
2455
  )
2379
2456
  async def preview_data_frame_analytics(
2380
2457
  self,
@@ -2385,11 +2462,12 @@ class MlClient(NamespacedClient):
2385
2462
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
2386
2463
  human: t.Optional[bool] = None,
2387
2464
  pretty: t.Optional[bool] = None,
2465
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2388
2466
  ) -> ObjectApiResponse[t.Any]:
2389
2467
  """
2390
2468
  Previews that will be analyzed given a data frame analytics config.
2391
2469
 
2392
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/preview-dfanalytics.html>`_
2470
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/preview-dfanalytics.html>`_
2393
2471
 
2394
2472
  :param id: Identifier for the data frame analytics job.
2395
2473
  :param config: A data frame analytics config as described in create data frame
@@ -2400,10 +2478,8 @@ class MlClient(NamespacedClient):
2400
2478
  __path = f"/_ml/data_frame/analytics/{_quote(id)}/_preview"
2401
2479
  else:
2402
2480
  __path = "/_ml/data_frame/analytics/_preview"
2403
- __body: t.Dict[str, t.Any] = {}
2404
2481
  __query: t.Dict[str, t.Any] = {}
2405
- if config is not None:
2406
- __body["config"] = config
2482
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2407
2483
  if error_trace is not None:
2408
2484
  __query["error_trace"] = error_trace
2409
2485
  if filter_path is not None:
@@ -2412,6 +2488,9 @@ class MlClient(NamespacedClient):
2412
2488
  __query["human"] = human
2413
2489
  if pretty is not None:
2414
2490
  __query["pretty"] = pretty
2491
+ if not __body:
2492
+ if config is not None:
2493
+ __body["config"] = config
2415
2494
  if not __body:
2416
2495
  __body = None # type: ignore[assignment]
2417
2496
  __headers = {"accept": "application/json"}
@@ -2422,7 +2501,7 @@ class MlClient(NamespacedClient):
2422
2501
  )
2423
2502
 
2424
2503
  @_rewrite_parameters(
2425
- body_fields=True,
2504
+ body_fields=("datafeed_config", "job_config"),
2426
2505
  )
2427
2506
  async def preview_datafeed(
2428
2507
  self,
@@ -2436,11 +2515,12 @@ class MlClient(NamespacedClient):
2436
2515
  job_config: t.Optional[t.Mapping[str, t.Any]] = None,
2437
2516
  pretty: t.Optional[bool] = None,
2438
2517
  start: t.Optional[t.Union[str, t.Any]] = None,
2518
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2439
2519
  ) -> ObjectApiResponse[t.Any]:
2440
2520
  """
2441
2521
  Previews a datafeed.
2442
2522
 
2443
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-preview-datafeed.html>`_
2523
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-preview-datafeed.html>`_
2444
2524
 
2445
2525
  :param datafeed_id: A numerical character string that uniquely identifies the
2446
2526
  datafeed. This identifier can contain lowercase alphanumeric characters (a-z
@@ -2461,10 +2541,8 @@ class MlClient(NamespacedClient):
2461
2541
  __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_preview"
2462
2542
  else:
2463
2543
  __path = "/_ml/datafeeds/_preview"
2464
- __body: t.Dict[str, t.Any] = {}
2465
2544
  __query: t.Dict[str, t.Any] = {}
2466
- if datafeed_config is not None:
2467
- __body["datafeed_config"] = datafeed_config
2545
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2468
2546
  if end is not None:
2469
2547
  __query["end"] = end
2470
2548
  if error_trace is not None:
@@ -2473,12 +2551,15 @@ class MlClient(NamespacedClient):
2473
2551
  __query["filter_path"] = filter_path
2474
2552
  if human is not None:
2475
2553
  __query["human"] = human
2476
- if job_config is not None:
2477
- __body["job_config"] = job_config
2478
2554
  if pretty is not None:
2479
2555
  __query["pretty"] = pretty
2480
2556
  if start is not None:
2481
2557
  __query["start"] = start
2558
+ if not __body:
2559
+ if datafeed_config is not None:
2560
+ __body["datafeed_config"] = datafeed_config
2561
+ if job_config is not None:
2562
+ __body["job_config"] = job_config
2482
2563
  if not __body:
2483
2564
  __body = None # type: ignore[assignment]
2484
2565
  __headers = {"accept": "application/json"}
@@ -2489,7 +2570,7 @@ class MlClient(NamespacedClient):
2489
2570
  )
2490
2571
 
2491
2572
  @_rewrite_parameters(
2492
- body_fields=True,
2573
+ body_fields=("description", "job_ids"),
2493
2574
  )
2494
2575
  async def put_calendar(
2495
2576
  self,
@@ -2501,11 +2582,12 @@ class MlClient(NamespacedClient):
2501
2582
  human: t.Optional[bool] = None,
2502
2583
  job_ids: t.Optional[t.Sequence[str]] = None,
2503
2584
  pretty: t.Optional[bool] = None,
2585
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2504
2586
  ) -> ObjectApiResponse[t.Any]:
2505
2587
  """
2506
2588
  Instantiates a calendar.
2507
2589
 
2508
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-put-calendar.html>`_
2590
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-put-calendar.html>`_
2509
2591
 
2510
2592
  :param calendar_id: A string that uniquely identifies a calendar.
2511
2593
  :param description: A description of the calendar.
@@ -2514,20 +2596,21 @@ class MlClient(NamespacedClient):
2514
2596
  if calendar_id in SKIP_IN_PATH:
2515
2597
  raise ValueError("Empty value passed for parameter 'calendar_id'")
2516
2598
  __path = f"/_ml/calendars/{_quote(calendar_id)}"
2517
- __body: t.Dict[str, t.Any] = {}
2518
2599
  __query: t.Dict[str, t.Any] = {}
2519
- if description is not None:
2520
- __body["description"] = description
2600
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2521
2601
  if error_trace is not None:
2522
2602
  __query["error_trace"] = error_trace
2523
2603
  if filter_path is not None:
2524
2604
  __query["filter_path"] = filter_path
2525
2605
  if human is not None:
2526
2606
  __query["human"] = human
2527
- if job_ids is not None:
2528
- __body["job_ids"] = job_ids
2529
2607
  if pretty is not None:
2530
2608
  __query["pretty"] = pretty
2609
+ if not __body:
2610
+ if description is not None:
2611
+ __body["description"] = description
2612
+ if job_ids is not None:
2613
+ __body["job_ids"] = job_ids
2531
2614
  if not __body:
2532
2615
  __body = None # type: ignore[assignment]
2533
2616
  __headers = {"accept": "application/json"}
@@ -2551,7 +2634,7 @@ class MlClient(NamespacedClient):
2551
2634
  """
2552
2635
  Adds an anomaly detection job to a calendar.
2553
2636
 
2554
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-put-calendar-job.html>`_
2637
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-put-calendar-job.html>`_
2555
2638
 
2556
2639
  :param calendar_id: A string that uniquely identifies a calendar.
2557
2640
  :param job_id: An identifier for the anomaly detection jobs. It can be a job
@@ -2577,16 +2660,27 @@ class MlClient(NamespacedClient):
2577
2660
  )
2578
2661
 
2579
2662
  @_rewrite_parameters(
2580
- body_fields=True,
2663
+ body_fields=(
2664
+ "analysis",
2665
+ "dest",
2666
+ "source",
2667
+ "allow_lazy_start",
2668
+ "analyzed_fields",
2669
+ "description",
2670
+ "headers",
2671
+ "max_num_threads",
2672
+ "model_memory_limit",
2673
+ "version",
2674
+ ),
2581
2675
  ignore_deprecated_options={"headers"},
2582
2676
  )
2583
2677
  async def put_data_frame_analytics(
2584
2678
  self,
2585
2679
  *,
2586
2680
  id: str,
2587
- analysis: t.Mapping[str, t.Any],
2588
- dest: t.Mapping[str, t.Any],
2589
- source: t.Mapping[str, t.Any],
2681
+ analysis: t.Optional[t.Mapping[str, t.Any]] = None,
2682
+ dest: t.Optional[t.Mapping[str, t.Any]] = None,
2683
+ source: t.Optional[t.Mapping[str, t.Any]] = None,
2590
2684
  allow_lazy_start: t.Optional[bool] = None,
2591
2685
  analyzed_fields: t.Optional[t.Mapping[str, t.Any]] = None,
2592
2686
  description: t.Optional[str] = None,
@@ -2598,11 +2692,12 @@ class MlClient(NamespacedClient):
2598
2692
  model_memory_limit: t.Optional[str] = None,
2599
2693
  pretty: t.Optional[bool] = None,
2600
2694
  version: t.Optional[str] = None,
2695
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2601
2696
  ) -> ObjectApiResponse[t.Any]:
2602
2697
  """
2603
2698
  Instantiates a data frame analytics job.
2604
2699
 
2605
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/put-dfanalytics.html>`_
2700
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/put-dfanalytics.html>`_
2606
2701
 
2607
2702
  :param id: Identifier for the data frame analytics job. This identifier can contain
2608
2703
  lowercase alphanumeric characters (a-z and 0-9), hyphens, and underscores.
@@ -2661,50 +2756,67 @@ class MlClient(NamespacedClient):
2661
2756
  """
2662
2757
  if id in SKIP_IN_PATH:
2663
2758
  raise ValueError("Empty value passed for parameter 'id'")
2664
- if analysis is None:
2759
+ if analysis is None and body is None:
2665
2760
  raise ValueError("Empty value passed for parameter 'analysis'")
2666
- if dest is None:
2761
+ if dest is None and body is None:
2667
2762
  raise ValueError("Empty value passed for parameter 'dest'")
2668
- if source is None:
2763
+ if source is None and body is None:
2669
2764
  raise ValueError("Empty value passed for parameter 'source'")
2670
2765
  __path = f"/_ml/data_frame/analytics/{_quote(id)}"
2671
- __body: t.Dict[str, t.Any] = {}
2672
2766
  __query: t.Dict[str, t.Any] = {}
2673
- if analysis is not None:
2674
- __body["analysis"] = analysis
2675
- if dest is not None:
2676
- __body["dest"] = dest
2677
- if source is not None:
2678
- __body["source"] = source
2679
- if allow_lazy_start is not None:
2680
- __body["allow_lazy_start"] = allow_lazy_start
2681
- if analyzed_fields is not None:
2682
- __body["analyzed_fields"] = analyzed_fields
2683
- if description is not None:
2684
- __body["description"] = description
2767
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2685
2768
  if error_trace is not None:
2686
2769
  __query["error_trace"] = error_trace
2687
2770
  if filter_path is not None:
2688
2771
  __query["filter_path"] = filter_path
2689
- if headers is not None:
2690
- __body["headers"] = headers
2691
2772
  if human is not None:
2692
2773
  __query["human"] = human
2693
- if max_num_threads is not None:
2694
- __body["max_num_threads"] = max_num_threads
2695
- if model_memory_limit is not None:
2696
- __body["model_memory_limit"] = model_memory_limit
2697
2774
  if pretty is not None:
2698
2775
  __query["pretty"] = pretty
2699
- if version is not None:
2700
- __body["version"] = version
2776
+ if not __body:
2777
+ if analysis is not None:
2778
+ __body["analysis"] = analysis
2779
+ if dest is not None:
2780
+ __body["dest"] = dest
2781
+ if source is not None:
2782
+ __body["source"] = source
2783
+ if allow_lazy_start is not None:
2784
+ __body["allow_lazy_start"] = allow_lazy_start
2785
+ if analyzed_fields is not None:
2786
+ __body["analyzed_fields"] = analyzed_fields
2787
+ if description is not None:
2788
+ __body["description"] = description
2789
+ if headers is not None:
2790
+ __body["headers"] = headers
2791
+ if max_num_threads is not None:
2792
+ __body["max_num_threads"] = max_num_threads
2793
+ if model_memory_limit is not None:
2794
+ __body["model_memory_limit"] = model_memory_limit
2795
+ if version is not None:
2796
+ __body["version"] = version
2701
2797
  __headers = {"accept": "application/json", "content-type": "application/json"}
2702
2798
  return await self.perform_request( # type: ignore[return-value]
2703
2799
  "PUT", __path, params=__query, headers=__headers, body=__body
2704
2800
  )
2705
2801
 
2706
2802
  @_rewrite_parameters(
2707
- body_fields=True,
2803
+ body_fields=(
2804
+ "aggregations",
2805
+ "chunking_config",
2806
+ "delayed_data_check_config",
2807
+ "frequency",
2808
+ "headers",
2809
+ "indexes",
2810
+ "indices",
2811
+ "indices_options",
2812
+ "job_id",
2813
+ "max_empty_searches",
2814
+ "query",
2815
+ "query_delay",
2816
+ "runtime_mappings",
2817
+ "script_fields",
2818
+ "scroll_size",
2819
+ ),
2708
2820
  ignore_deprecated_options={"headers"},
2709
2821
  )
2710
2822
  async def put_datafeed(
@@ -2741,11 +2853,12 @@ class MlClient(NamespacedClient):
2741
2853
  runtime_mappings: t.Optional[t.Mapping[str, t.Mapping[str, t.Any]]] = None,
2742
2854
  script_fields: t.Optional[t.Mapping[str, t.Mapping[str, t.Any]]] = None,
2743
2855
  scroll_size: t.Optional[int] = None,
2856
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2744
2857
  ) -> ObjectApiResponse[t.Any]:
2745
2858
  """
2746
2859
  Instantiates a datafeed.
2747
2860
 
2748
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-put-datafeed.html>`_
2861
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-put-datafeed.html>`_
2749
2862
 
2750
2863
  :param datafeed_id: A numerical character string that uniquely identifies the
2751
2864
  datafeed. This identifier can contain lowercase alphanumeric characters (a-z
@@ -2819,61 +2932,62 @@ class MlClient(NamespacedClient):
2819
2932
  if datafeed_id in SKIP_IN_PATH:
2820
2933
  raise ValueError("Empty value passed for parameter 'datafeed_id'")
2821
2934
  __path = f"/_ml/datafeeds/{_quote(datafeed_id)}"
2822
- __body: t.Dict[str, t.Any] = {}
2823
2935
  __query: t.Dict[str, t.Any] = {}
2824
- if aggregations is not None:
2825
- __body["aggregations"] = aggregations
2936
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2826
2937
  if allow_no_indices is not None:
2827
2938
  __query["allow_no_indices"] = allow_no_indices
2828
- if chunking_config is not None:
2829
- __body["chunking_config"] = chunking_config
2830
- if delayed_data_check_config is not None:
2831
- __body["delayed_data_check_config"] = delayed_data_check_config
2832
2939
  if error_trace is not None:
2833
2940
  __query["error_trace"] = error_trace
2834
2941
  if expand_wildcards is not None:
2835
2942
  __query["expand_wildcards"] = expand_wildcards
2836
2943
  if filter_path is not None:
2837
2944
  __query["filter_path"] = filter_path
2838
- if frequency is not None:
2839
- __body["frequency"] = frequency
2840
- if headers is not None:
2841
- __body["headers"] = headers
2842
2945
  if human is not None:
2843
2946
  __query["human"] = human
2844
2947
  if ignore_throttled is not None:
2845
2948
  __query["ignore_throttled"] = ignore_throttled
2846
2949
  if ignore_unavailable is not None:
2847
2950
  __query["ignore_unavailable"] = ignore_unavailable
2848
- if indexes is not None:
2849
- __body["indexes"] = indexes
2850
- if indices is not None:
2851
- __body["indices"] = indices
2852
- if indices_options is not None:
2853
- __body["indices_options"] = indices_options
2854
- if job_id is not None:
2855
- __body["job_id"] = job_id
2856
- if max_empty_searches is not None:
2857
- __body["max_empty_searches"] = max_empty_searches
2858
2951
  if pretty is not None:
2859
2952
  __query["pretty"] = pretty
2860
- if query is not None:
2861
- __body["query"] = query
2862
- if query_delay is not None:
2863
- __body["query_delay"] = query_delay
2864
- if runtime_mappings is not None:
2865
- __body["runtime_mappings"] = runtime_mappings
2866
- if script_fields is not None:
2867
- __body["script_fields"] = script_fields
2868
- if scroll_size is not None:
2869
- __body["scroll_size"] = scroll_size
2953
+ if not __body:
2954
+ if aggregations is not None:
2955
+ __body["aggregations"] = aggregations
2956
+ if chunking_config is not None:
2957
+ __body["chunking_config"] = chunking_config
2958
+ if delayed_data_check_config is not None:
2959
+ __body["delayed_data_check_config"] = delayed_data_check_config
2960
+ if frequency is not None:
2961
+ __body["frequency"] = frequency
2962
+ if headers is not None:
2963
+ __body["headers"] = headers
2964
+ if indexes is not None:
2965
+ __body["indexes"] = indexes
2966
+ if indices is not None:
2967
+ __body["indices"] = indices
2968
+ if indices_options is not None:
2969
+ __body["indices_options"] = indices_options
2970
+ if job_id is not None:
2971
+ __body["job_id"] = job_id
2972
+ if max_empty_searches is not None:
2973
+ __body["max_empty_searches"] = max_empty_searches
2974
+ if query is not None:
2975
+ __body["query"] = query
2976
+ if query_delay is not None:
2977
+ __body["query_delay"] = query_delay
2978
+ if runtime_mappings is not None:
2979
+ __body["runtime_mappings"] = runtime_mappings
2980
+ if script_fields is not None:
2981
+ __body["script_fields"] = script_fields
2982
+ if scroll_size is not None:
2983
+ __body["scroll_size"] = scroll_size
2870
2984
  __headers = {"accept": "application/json", "content-type": "application/json"}
2871
2985
  return await self.perform_request( # type: ignore[return-value]
2872
2986
  "PUT", __path, params=__query, headers=__headers, body=__body
2873
2987
  )
2874
2988
 
2875
2989
  @_rewrite_parameters(
2876
- body_fields=True,
2990
+ body_fields=("description", "items"),
2877
2991
  )
2878
2992
  async def put_filter(
2879
2993
  self,
@@ -2885,11 +2999,12 @@ class MlClient(NamespacedClient):
2885
2999
  human: t.Optional[bool] = None,
2886
3000
  items: t.Optional[t.Sequence[str]] = None,
2887
3001
  pretty: t.Optional[bool] = None,
3002
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2888
3003
  ) -> ObjectApiResponse[t.Any]:
2889
3004
  """
2890
3005
  Instantiates a filter.
2891
3006
 
2892
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-put-filter.html>`_
3007
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-put-filter.html>`_
2893
3008
 
2894
3009
  :param filter_id: A string that uniquely identifies a filter.
2895
3010
  :param description: A description of the filter.
@@ -2899,34 +3014,51 @@ class MlClient(NamespacedClient):
2899
3014
  if filter_id in SKIP_IN_PATH:
2900
3015
  raise ValueError("Empty value passed for parameter 'filter_id'")
2901
3016
  __path = f"/_ml/filters/{_quote(filter_id)}"
2902
- __body: t.Dict[str, t.Any] = {}
2903
3017
  __query: t.Dict[str, t.Any] = {}
2904
- if description is not None:
2905
- __body["description"] = description
3018
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
2906
3019
  if error_trace is not None:
2907
3020
  __query["error_trace"] = error_trace
2908
3021
  if filter_path is not None:
2909
3022
  __query["filter_path"] = filter_path
2910
3023
  if human is not None:
2911
3024
  __query["human"] = human
2912
- if items is not None:
2913
- __body["items"] = items
2914
3025
  if pretty is not None:
2915
3026
  __query["pretty"] = pretty
3027
+ if not __body:
3028
+ if description is not None:
3029
+ __body["description"] = description
3030
+ if items is not None:
3031
+ __body["items"] = items
2916
3032
  __headers = {"accept": "application/json", "content-type": "application/json"}
2917
3033
  return await self.perform_request( # type: ignore[return-value]
2918
3034
  "PUT", __path, params=__query, headers=__headers, body=__body
2919
3035
  )
2920
3036
 
2921
3037
  @_rewrite_parameters(
2922
- body_fields=True,
3038
+ body_fields=(
3039
+ "analysis_config",
3040
+ "data_description",
3041
+ "allow_lazy_open",
3042
+ "analysis_limits",
3043
+ "background_persist_interval",
3044
+ "custom_settings",
3045
+ "daily_model_snapshot_retention_after_days",
3046
+ "datafeed_config",
3047
+ "description",
3048
+ "groups",
3049
+ "model_plot_config",
3050
+ "model_snapshot_retention_days",
3051
+ "renormalization_window_days",
3052
+ "results_index_name",
3053
+ "results_retention_days",
3054
+ ),
2923
3055
  )
2924
3056
  async def put_job(
2925
3057
  self,
2926
3058
  *,
2927
3059
  job_id: str,
2928
- analysis_config: t.Mapping[str, t.Any],
2929
- data_description: t.Mapping[str, t.Any],
3060
+ analysis_config: t.Optional[t.Mapping[str, t.Any]] = None,
3061
+ data_description: t.Optional[t.Mapping[str, t.Any]] = None,
2930
3062
  allow_lazy_open: t.Optional[bool] = None,
2931
3063
  analysis_limits: t.Optional[t.Mapping[str, t.Any]] = None,
2932
3064
  background_persist_interval: t.Optional[
@@ -2946,11 +3078,12 @@ class MlClient(NamespacedClient):
2946
3078
  renormalization_window_days: t.Optional[int] = None,
2947
3079
  results_index_name: t.Optional[str] = None,
2948
3080
  results_retention_days: t.Optional[int] = None,
3081
+ body: t.Optional[t.Dict[str, t.Any]] = None,
2949
3082
  ) -> ObjectApiResponse[t.Any]:
2950
3083
  """
2951
3084
  Instantiates an anomaly detection job.
2952
3085
 
2953
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-put-job.html>`_
3086
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-put-job.html>`_
2954
3087
 
2955
3088
  :param job_id: The identifier for the anomaly detection job. This identifier
2956
3089
  can contain lowercase alphanumeric characters (a-z and 0-9), hyphens, and
@@ -3027,60 +3160,72 @@ class MlClient(NamespacedClient):
3027
3160
  """
3028
3161
  if job_id in SKIP_IN_PATH:
3029
3162
  raise ValueError("Empty value passed for parameter 'job_id'")
3030
- if analysis_config is None:
3163
+ if analysis_config is None and body is None:
3031
3164
  raise ValueError("Empty value passed for parameter 'analysis_config'")
3032
- if data_description is None:
3165
+ if data_description is None and body is None:
3033
3166
  raise ValueError("Empty value passed for parameter 'data_description'")
3034
3167
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}"
3035
- __body: t.Dict[str, t.Any] = {}
3036
3168
  __query: t.Dict[str, t.Any] = {}
3037
- if analysis_config is not None:
3038
- __body["analysis_config"] = analysis_config
3039
- if data_description is not None:
3040
- __body["data_description"] = data_description
3041
- if allow_lazy_open is not None:
3042
- __body["allow_lazy_open"] = allow_lazy_open
3043
- if analysis_limits is not None:
3044
- __body["analysis_limits"] = analysis_limits
3045
- if background_persist_interval is not None:
3046
- __body["background_persist_interval"] = background_persist_interval
3047
- if custom_settings is not None:
3048
- __body["custom_settings"] = custom_settings
3049
- if daily_model_snapshot_retention_after_days is not None:
3050
- __body[
3051
- "daily_model_snapshot_retention_after_days"
3052
- ] = daily_model_snapshot_retention_after_days
3053
- if datafeed_config is not None:
3054
- __body["datafeed_config"] = datafeed_config
3055
- if description is not None:
3056
- __body["description"] = description
3169
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
3057
3170
  if error_trace is not None:
3058
3171
  __query["error_trace"] = error_trace
3059
3172
  if filter_path is not None:
3060
3173
  __query["filter_path"] = filter_path
3061
- if groups is not None:
3062
- __body["groups"] = groups
3063
3174
  if human is not None:
3064
3175
  __query["human"] = human
3065
- if model_plot_config is not None:
3066
- __body["model_plot_config"] = model_plot_config
3067
- if model_snapshot_retention_days is not None:
3068
- __body["model_snapshot_retention_days"] = model_snapshot_retention_days
3069
3176
  if pretty is not None:
3070
3177
  __query["pretty"] = pretty
3071
- if renormalization_window_days is not None:
3072
- __body["renormalization_window_days"] = renormalization_window_days
3073
- if results_index_name is not None:
3074
- __body["results_index_name"] = results_index_name
3075
- if results_retention_days is not None:
3076
- __body["results_retention_days"] = results_retention_days
3178
+ if not __body:
3179
+ if analysis_config is not None:
3180
+ __body["analysis_config"] = analysis_config
3181
+ if data_description is not None:
3182
+ __body["data_description"] = data_description
3183
+ if allow_lazy_open is not None:
3184
+ __body["allow_lazy_open"] = allow_lazy_open
3185
+ if analysis_limits is not None:
3186
+ __body["analysis_limits"] = analysis_limits
3187
+ if background_persist_interval is not None:
3188
+ __body["background_persist_interval"] = background_persist_interval
3189
+ if custom_settings is not None:
3190
+ __body["custom_settings"] = custom_settings
3191
+ if daily_model_snapshot_retention_after_days is not None:
3192
+ __body[
3193
+ "daily_model_snapshot_retention_after_days"
3194
+ ] = daily_model_snapshot_retention_after_days
3195
+ if datafeed_config is not None:
3196
+ __body["datafeed_config"] = datafeed_config
3197
+ if description is not None:
3198
+ __body["description"] = description
3199
+ if groups is not None:
3200
+ __body["groups"] = groups
3201
+ if model_plot_config is not None:
3202
+ __body["model_plot_config"] = model_plot_config
3203
+ if model_snapshot_retention_days is not None:
3204
+ __body["model_snapshot_retention_days"] = model_snapshot_retention_days
3205
+ if renormalization_window_days is not None:
3206
+ __body["renormalization_window_days"] = renormalization_window_days
3207
+ if results_index_name is not None:
3208
+ __body["results_index_name"] = results_index_name
3209
+ if results_retention_days is not None:
3210
+ __body["results_retention_days"] = results_retention_days
3077
3211
  __headers = {"accept": "application/json", "content-type": "application/json"}
3078
3212
  return await self.perform_request( # type: ignore[return-value]
3079
3213
  "PUT", __path, params=__query, headers=__headers, body=__body
3080
3214
  )
3081
3215
 
3082
3216
  @_rewrite_parameters(
3083
- body_fields=True,
3217
+ body_fields=(
3218
+ "compressed_definition",
3219
+ "definition",
3220
+ "description",
3221
+ "inference_config",
3222
+ "input",
3223
+ "metadata",
3224
+ "model_size_bytes",
3225
+ "model_type",
3226
+ "platform_architecture",
3227
+ "tags",
3228
+ ),
3084
3229
  )
3085
3230
  async def put_trained_model(
3086
3231
  self,
@@ -3103,11 +3248,12 @@ class MlClient(NamespacedClient):
3103
3248
  platform_architecture: t.Optional[str] = None,
3104
3249
  pretty: t.Optional[bool] = None,
3105
3250
  tags: t.Optional[t.Sequence[str]] = None,
3251
+ body: t.Optional[t.Dict[str, t.Any]] = None,
3106
3252
  ) -> ObjectApiResponse[t.Any]:
3107
3253
  """
3108
3254
  Creates an inference trained model.
3109
3255
 
3110
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/put-trained-models.html>`_
3256
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/put-trained-models.html>`_
3111
3257
 
3112
3258
  :param model_id: The unique identifier of the trained model.
3113
3259
  :param compressed_definition: The compressed (GZipped and Base64 encoded) inference
@@ -3142,38 +3288,39 @@ class MlClient(NamespacedClient):
3142
3288
  if model_id in SKIP_IN_PATH:
3143
3289
  raise ValueError("Empty value passed for parameter 'model_id'")
3144
3290
  __path = f"/_ml/trained_models/{_quote(model_id)}"
3145
- __body: t.Dict[str, t.Any] = {}
3146
3291
  __query: t.Dict[str, t.Any] = {}
3147
- if compressed_definition is not None:
3148
- __body["compressed_definition"] = compressed_definition
3292
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
3149
3293
  if defer_definition_decompression is not None:
3150
3294
  __query["defer_definition_decompression"] = defer_definition_decompression
3151
- if definition is not None:
3152
- __body["definition"] = definition
3153
- if description is not None:
3154
- __body["description"] = description
3155
3295
  if error_trace is not None:
3156
3296
  __query["error_trace"] = error_trace
3157
3297
  if filter_path is not None:
3158
3298
  __query["filter_path"] = filter_path
3159
3299
  if human is not None:
3160
3300
  __query["human"] = human
3161
- if inference_config is not None:
3162
- __body["inference_config"] = inference_config
3163
- if input is not None:
3164
- __body["input"] = input
3165
- if metadata is not None:
3166
- __body["metadata"] = metadata
3167
- if model_size_bytes is not None:
3168
- __body["model_size_bytes"] = model_size_bytes
3169
- if model_type is not None:
3170
- __body["model_type"] = model_type
3171
- if platform_architecture is not None:
3172
- __body["platform_architecture"] = platform_architecture
3173
3301
  if pretty is not None:
3174
3302
  __query["pretty"] = pretty
3175
- if tags is not None:
3176
- __body["tags"] = tags
3303
+ if not __body:
3304
+ if compressed_definition is not None:
3305
+ __body["compressed_definition"] = compressed_definition
3306
+ if definition is not None:
3307
+ __body["definition"] = definition
3308
+ if description is not None:
3309
+ __body["description"] = description
3310
+ if inference_config is not None:
3311
+ __body["inference_config"] = inference_config
3312
+ if input is not None:
3313
+ __body["input"] = input
3314
+ if metadata is not None:
3315
+ __body["metadata"] = metadata
3316
+ if model_size_bytes is not None:
3317
+ __body["model_size_bytes"] = model_size_bytes
3318
+ if model_type is not None:
3319
+ __body["model_type"] = model_type
3320
+ if platform_architecture is not None:
3321
+ __body["platform_architecture"] = platform_architecture
3322
+ if tags is not None:
3323
+ __body["tags"] = tags
3177
3324
  __headers = {"accept": "application/json", "content-type": "application/json"}
3178
3325
  return await self.perform_request( # type: ignore[return-value]
3179
3326
  "PUT", __path, params=__query, headers=__headers, body=__body
@@ -3195,7 +3342,7 @@ class MlClient(NamespacedClient):
3195
3342
  Creates a new model alias (or reassigns an existing one) to refer to the trained
3196
3343
  model
3197
3344
 
3198
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/put-trained-models-aliases.html>`_
3345
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/put-trained-models-aliases.html>`_
3199
3346
 
3200
3347
  :param model_id: The identifier for the trained model that the alias refers to.
3201
3348
  :param model_alias: The alias to create or update. This value cannot end in numbers.
@@ -3225,25 +3372,26 @@ class MlClient(NamespacedClient):
3225
3372
  )
3226
3373
 
3227
3374
  @_rewrite_parameters(
3228
- body_fields=True,
3375
+ body_fields=("definition", "total_definition_length", "total_parts"),
3229
3376
  )
3230
3377
  async def put_trained_model_definition_part(
3231
3378
  self,
3232
3379
  *,
3233
3380
  model_id: str,
3234
3381
  part: int,
3235
- definition: str,
3236
- total_definition_length: int,
3237
- total_parts: int,
3382
+ definition: t.Optional[str] = None,
3383
+ total_definition_length: t.Optional[int] = None,
3384
+ total_parts: t.Optional[int] = None,
3238
3385
  error_trace: t.Optional[bool] = None,
3239
3386
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
3240
3387
  human: t.Optional[bool] = None,
3241
3388
  pretty: t.Optional[bool] = None,
3389
+ body: t.Optional[t.Dict[str, t.Any]] = None,
3242
3390
  ) -> ObjectApiResponse[t.Any]:
3243
3391
  """
3244
3392
  Creates part of a trained model definition
3245
3393
 
3246
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/put-trained-model-definition-part.html>`_
3394
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/put-trained-model-definition-part.html>`_
3247
3395
 
3248
3396
  :param model_id: The unique identifier of the trained model.
3249
3397
  :param part: The definition part number. When the definition is loaded for inference
@@ -3260,23 +3408,17 @@ class MlClient(NamespacedClient):
3260
3408
  raise ValueError("Empty value passed for parameter 'model_id'")
3261
3409
  if part in SKIP_IN_PATH:
3262
3410
  raise ValueError("Empty value passed for parameter 'part'")
3263
- if definition is None:
3411
+ if definition is None and body is None:
3264
3412
  raise ValueError("Empty value passed for parameter 'definition'")
3265
- if total_definition_length is None:
3413
+ if total_definition_length is None and body is None:
3266
3414
  raise ValueError(
3267
3415
  "Empty value passed for parameter 'total_definition_length'"
3268
3416
  )
3269
- if total_parts is None:
3417
+ if total_parts is None and body is None:
3270
3418
  raise ValueError("Empty value passed for parameter 'total_parts'")
3271
3419
  __path = f"/_ml/trained_models/{_quote(model_id)}/definition/{_quote(part)}"
3272
- __body: t.Dict[str, t.Any] = {}
3273
3420
  __query: t.Dict[str, t.Any] = {}
3274
- if definition is not None:
3275
- __body["definition"] = definition
3276
- if total_definition_length is not None:
3277
- __body["total_definition_length"] = total_definition_length
3278
- if total_parts is not None:
3279
- __body["total_parts"] = total_parts
3421
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
3280
3422
  if error_trace is not None:
3281
3423
  __query["error_trace"] = error_trace
3282
3424
  if filter_path is not None:
@@ -3285,30 +3427,38 @@ class MlClient(NamespacedClient):
3285
3427
  __query["human"] = human
3286
3428
  if pretty is not None:
3287
3429
  __query["pretty"] = pretty
3430
+ if not __body:
3431
+ if definition is not None:
3432
+ __body["definition"] = definition
3433
+ if total_definition_length is not None:
3434
+ __body["total_definition_length"] = total_definition_length
3435
+ if total_parts is not None:
3436
+ __body["total_parts"] = total_parts
3288
3437
  __headers = {"accept": "application/json", "content-type": "application/json"}
3289
3438
  return await self.perform_request( # type: ignore[return-value]
3290
3439
  "PUT", __path, params=__query, headers=__headers, body=__body
3291
3440
  )
3292
3441
 
3293
3442
  @_rewrite_parameters(
3294
- body_fields=True,
3443
+ body_fields=("vocabulary", "merges", "scores"),
3295
3444
  )
3296
3445
  async def put_trained_model_vocabulary(
3297
3446
  self,
3298
3447
  *,
3299
3448
  model_id: str,
3300
- vocabulary: t.Sequence[str],
3449
+ vocabulary: t.Optional[t.Sequence[str]] = None,
3301
3450
  error_trace: t.Optional[bool] = None,
3302
3451
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
3303
3452
  human: t.Optional[bool] = None,
3304
3453
  merges: t.Optional[t.Sequence[str]] = None,
3305
3454
  pretty: t.Optional[bool] = None,
3306
3455
  scores: t.Optional[t.Sequence[float]] = None,
3456
+ body: t.Optional[t.Dict[str, t.Any]] = None,
3307
3457
  ) -> ObjectApiResponse[t.Any]:
3308
3458
  """
3309
3459
  Creates a trained model vocabulary
3310
3460
 
3311
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/put-trained-model-vocabulary.html>`_
3461
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/put-trained-model-vocabulary.html>`_
3312
3462
 
3313
3463
  :param model_id: The unique identifier of the trained model.
3314
3464
  :param vocabulary: The model vocabulary, which must not be empty.
@@ -3317,25 +3467,26 @@ class MlClient(NamespacedClient):
3317
3467
  """
3318
3468
  if model_id in SKIP_IN_PATH:
3319
3469
  raise ValueError("Empty value passed for parameter 'model_id'")
3320
- if vocabulary is None:
3470
+ if vocabulary is None and body is None:
3321
3471
  raise ValueError("Empty value passed for parameter 'vocabulary'")
3322
3472
  __path = f"/_ml/trained_models/{_quote(model_id)}/vocabulary"
3323
- __body: t.Dict[str, t.Any] = {}
3324
3473
  __query: t.Dict[str, t.Any] = {}
3325
- if vocabulary is not None:
3326
- __body["vocabulary"] = vocabulary
3474
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
3327
3475
  if error_trace is not None:
3328
3476
  __query["error_trace"] = error_trace
3329
3477
  if filter_path is not None:
3330
3478
  __query["filter_path"] = filter_path
3331
3479
  if human is not None:
3332
3480
  __query["human"] = human
3333
- if merges is not None:
3334
- __body["merges"] = merges
3335
3481
  if pretty is not None:
3336
3482
  __query["pretty"] = pretty
3337
- if scores is not None:
3338
- __body["scores"] = scores
3483
+ if not __body:
3484
+ if vocabulary is not None:
3485
+ __body["vocabulary"] = vocabulary
3486
+ if merges is not None:
3487
+ __body["merges"] = merges
3488
+ if scores is not None:
3489
+ __body["scores"] = scores
3339
3490
  __headers = {"accept": "application/json", "content-type": "application/json"}
3340
3491
  return await self.perform_request( # type: ignore[return-value]
3341
3492
  "PUT", __path, params=__query, headers=__headers, body=__body
@@ -3356,7 +3507,7 @@ class MlClient(NamespacedClient):
3356
3507
  """
3357
3508
  Resets an existing anomaly detection job.
3358
3509
 
3359
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-reset-job.html>`_
3510
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-reset-job.html>`_
3360
3511
 
3361
3512
  :param job_id: The ID of the job to reset.
3362
3513
  :param delete_user_annotations: Specifies whether annotations that have been
@@ -3387,7 +3538,7 @@ class MlClient(NamespacedClient):
3387
3538
  )
3388
3539
 
3389
3540
  @_rewrite_parameters(
3390
- body_fields=True,
3541
+ body_fields=("delete_intervening_results",),
3391
3542
  )
3392
3543
  async def revert_model_snapshot(
3393
3544
  self,
@@ -3399,11 +3550,12 @@ class MlClient(NamespacedClient):
3399
3550
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
3400
3551
  human: t.Optional[bool] = None,
3401
3552
  pretty: t.Optional[bool] = None,
3553
+ body: t.Optional[t.Dict[str, t.Any]] = None,
3402
3554
  ) -> ObjectApiResponse[t.Any]:
3403
3555
  """
3404
3556
  Reverts to a specific snapshot.
3405
3557
 
3406
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-revert-snapshot.html>`_
3558
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-revert-snapshot.html>`_
3407
3559
 
3408
3560
  :param job_id: Identifier for the anomaly detection job.
3409
3561
  :param snapshot_id: You can specify `empty` as the <snapshot_id>. Reverting to
@@ -3417,10 +3569,8 @@ class MlClient(NamespacedClient):
3417
3569
  if snapshot_id in SKIP_IN_PATH:
3418
3570
  raise ValueError("Empty value passed for parameter 'snapshot_id'")
3419
3571
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/model_snapshots/{_quote(snapshot_id)}/_revert"
3420
- __body: t.Dict[str, t.Any] = {}
3421
3572
  __query: t.Dict[str, t.Any] = {}
3422
- if delete_intervening_results is not None:
3423
- __body["delete_intervening_results"] = delete_intervening_results
3573
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
3424
3574
  if error_trace is not None:
3425
3575
  __query["error_trace"] = error_trace
3426
3576
  if filter_path is not None:
@@ -3429,6 +3579,9 @@ class MlClient(NamespacedClient):
3429
3579
  __query["human"] = human
3430
3580
  if pretty is not None:
3431
3581
  __query["pretty"] = pretty
3582
+ if not __body:
3583
+ if delete_intervening_results is not None:
3584
+ __body["delete_intervening_results"] = delete_intervening_results
3432
3585
  if not __body:
3433
3586
  __body = None # type: ignore[assignment]
3434
3587
  __headers = {"accept": "application/json"}
@@ -3453,7 +3606,7 @@ class MlClient(NamespacedClient):
3453
3606
  Sets a cluster wide upgrade_mode setting that prepares machine learning indices
3454
3607
  for an upgrade.
3455
3608
 
3456
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-set-upgrade-mode.html>`_
3609
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-set-upgrade-mode.html>`_
3457
3610
 
3458
3611
  :param enabled: When `true`, it enables `upgrade_mode` which temporarily halts
3459
3612
  all job and datafeed tasks and prohibits new job and datafeed tasks from
@@ -3493,7 +3646,7 @@ class MlClient(NamespacedClient):
3493
3646
  """
3494
3647
  Starts a data frame analytics job.
3495
3648
 
3496
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/start-dfanalytics.html>`_
3649
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/start-dfanalytics.html>`_
3497
3650
 
3498
3651
  :param id: Identifier for the data frame analytics job. This identifier can contain
3499
3652
  lowercase alphanumeric characters (a-z and 0-9), hyphens, and underscores.
@@ -3521,7 +3674,7 @@ class MlClient(NamespacedClient):
3521
3674
  )
3522
3675
 
3523
3676
  @_rewrite_parameters(
3524
- body_fields=True,
3677
+ body_fields=("end", "start", "timeout"),
3525
3678
  )
3526
3679
  async def start_datafeed(
3527
3680
  self,
@@ -3534,11 +3687,12 @@ class MlClient(NamespacedClient):
3534
3687
  pretty: t.Optional[bool] = None,
3535
3688
  start: t.Optional[t.Union[str, t.Any]] = None,
3536
3689
  timeout: t.Optional[t.Union["t.Literal[-1]", "t.Literal[0]", str]] = None,
3690
+ body: t.Optional[t.Dict[str, t.Any]] = None,
3537
3691
  ) -> ObjectApiResponse[t.Any]:
3538
3692
  """
3539
3693
  Starts one or more datafeeds.
3540
3694
 
3541
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-start-datafeed.html>`_
3695
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-start-datafeed.html>`_
3542
3696
 
3543
3697
  :param datafeed_id: A numerical character string that uniquely identifies the
3544
3698
  datafeed. This identifier can contain lowercase alphanumeric characters (a-z
@@ -3551,10 +3705,8 @@ class MlClient(NamespacedClient):
3551
3705
  if datafeed_id in SKIP_IN_PATH:
3552
3706
  raise ValueError("Empty value passed for parameter 'datafeed_id'")
3553
3707
  __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_start"
3554
- __body: t.Dict[str, t.Any] = {}
3555
3708
  __query: t.Dict[str, t.Any] = {}
3556
- if end is not None:
3557
- __body["end"] = end
3709
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
3558
3710
  if error_trace is not None:
3559
3711
  __query["error_trace"] = error_trace
3560
3712
  if filter_path is not None:
@@ -3563,10 +3715,13 @@ class MlClient(NamespacedClient):
3563
3715
  __query["human"] = human
3564
3716
  if pretty is not None:
3565
3717
  __query["pretty"] = pretty
3566
- if start is not None:
3567
- __body["start"] = start
3568
- if timeout is not None:
3569
- __body["timeout"] = timeout
3718
+ if not __body:
3719
+ if end is not None:
3720
+ __body["end"] = end
3721
+ if start is not None:
3722
+ __body["start"] = start
3723
+ if timeout is not None:
3724
+ __body["timeout"] = timeout
3570
3725
  if not __body:
3571
3726
  __body = None # type: ignore[assignment]
3572
3727
  __headers = {"accept": "application/json"}
@@ -3599,7 +3754,7 @@ class MlClient(NamespacedClient):
3599
3754
  """
3600
3755
  Start a trained model deployment.
3601
3756
 
3602
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/start-trained-model-deployment.html>`_
3757
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/start-trained-model-deployment.html>`_
3603
3758
 
3604
3759
  :param model_id: The unique identifier of the trained model. Currently, only
3605
3760
  PyTorch models are supported.
@@ -3676,7 +3831,7 @@ class MlClient(NamespacedClient):
3676
3831
  """
3677
3832
  Stops one or more data frame analytics jobs.
3678
3833
 
3679
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/stop-dfanalytics.html>`_
3834
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/stop-dfanalytics.html>`_
3680
3835
 
3681
3836
  :param id: Identifier for the data frame analytics job. This identifier can contain
3682
3837
  lowercase alphanumeric characters (a-z and 0-9), hyphens, and underscores.
@@ -3717,7 +3872,7 @@ class MlClient(NamespacedClient):
3717
3872
  )
3718
3873
 
3719
3874
  @_rewrite_parameters(
3720
- body_fields=True,
3875
+ body_fields=("allow_no_match", "force", "timeout"),
3721
3876
  )
3722
3877
  async def stop_datafeed(
3723
3878
  self,
@@ -3730,11 +3885,12 @@ class MlClient(NamespacedClient):
3730
3885
  human: t.Optional[bool] = None,
3731
3886
  pretty: t.Optional[bool] = None,
3732
3887
  timeout: t.Optional[t.Union["t.Literal[-1]", "t.Literal[0]", str]] = None,
3888
+ body: t.Optional[t.Dict[str, t.Any]] = None,
3733
3889
  ) -> ObjectApiResponse[t.Any]:
3734
3890
  """
3735
3891
  Stops one or more datafeeds.
3736
3892
 
3737
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-stop-datafeed.html>`_
3893
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-stop-datafeed.html>`_
3738
3894
 
3739
3895
  :param datafeed_id: Identifier for the datafeed. You can stop multiple datafeeds
3740
3896
  in a single API request by using a comma-separated list of datafeeds or a
@@ -3748,22 +3904,23 @@ class MlClient(NamespacedClient):
3748
3904
  if datafeed_id in SKIP_IN_PATH:
3749
3905
  raise ValueError("Empty value passed for parameter 'datafeed_id'")
3750
3906
  __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_stop"
3751
- __body: t.Dict[str, t.Any] = {}
3752
3907
  __query: t.Dict[str, t.Any] = {}
3753
- if allow_no_match is not None:
3754
- __body["allow_no_match"] = allow_no_match
3908
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
3755
3909
  if error_trace is not None:
3756
3910
  __query["error_trace"] = error_trace
3757
3911
  if filter_path is not None:
3758
3912
  __query["filter_path"] = filter_path
3759
- if force is not None:
3760
- __body["force"] = force
3761
3913
  if human is not None:
3762
3914
  __query["human"] = human
3763
3915
  if pretty is not None:
3764
3916
  __query["pretty"] = pretty
3765
- if timeout is not None:
3766
- __body["timeout"] = timeout
3917
+ if not __body:
3918
+ if allow_no_match is not None:
3919
+ __body["allow_no_match"] = allow_no_match
3920
+ if force is not None:
3921
+ __body["force"] = force
3922
+ if timeout is not None:
3923
+ __body["timeout"] = timeout
3767
3924
  if not __body:
3768
3925
  __body = None # type: ignore[assignment]
3769
3926
  __headers = {"accept": "application/json"}
@@ -3788,7 +3945,7 @@ class MlClient(NamespacedClient):
3788
3945
  """
3789
3946
  Stop a trained model deployment.
3790
3947
 
3791
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/stop-trained-model-deployment.html>`_
3948
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/stop-trained-model-deployment.html>`_
3792
3949
 
3793
3950
  :param model_id: The unique identifier of the trained model.
3794
3951
  :param allow_no_match: Specifies what to do when the request: contains wildcard
@@ -3823,7 +3980,12 @@ class MlClient(NamespacedClient):
3823
3980
  )
3824
3981
 
3825
3982
  @_rewrite_parameters(
3826
- body_fields=True,
3983
+ body_fields=(
3984
+ "allow_lazy_start",
3985
+ "description",
3986
+ "max_num_threads",
3987
+ "model_memory_limit",
3988
+ ),
3827
3989
  )
3828
3990
  async def update_data_frame_analytics(
3829
3991
  self,
@@ -3837,11 +3999,12 @@ class MlClient(NamespacedClient):
3837
3999
  max_num_threads: t.Optional[int] = None,
3838
4000
  model_memory_limit: t.Optional[str] = None,
3839
4001
  pretty: t.Optional[bool] = None,
4002
+ body: t.Optional[t.Dict[str, t.Any]] = None,
3840
4003
  ) -> ObjectApiResponse[t.Any]:
3841
4004
  """
3842
4005
  Updates certain properties of a data frame analytics job.
3843
4006
 
3844
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/update-dfanalytics.html>`_
4007
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/update-dfanalytics.html>`_
3845
4008
 
3846
4009
  :param id: Identifier for the data frame analytics job. This identifier can contain
3847
4010
  lowercase alphanumeric characters (a-z and 0-9), hyphens, and underscores.
@@ -3862,31 +4025,47 @@ class MlClient(NamespacedClient):
3862
4025
  if id in SKIP_IN_PATH:
3863
4026
  raise ValueError("Empty value passed for parameter 'id'")
3864
4027
  __path = f"/_ml/data_frame/analytics/{_quote(id)}/_update"
3865
- __body: t.Dict[str, t.Any] = {}
3866
4028
  __query: t.Dict[str, t.Any] = {}
3867
- if allow_lazy_start is not None:
3868
- __body["allow_lazy_start"] = allow_lazy_start
3869
- if description is not None:
3870
- __body["description"] = description
4029
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
3871
4030
  if error_trace is not None:
3872
4031
  __query["error_trace"] = error_trace
3873
4032
  if filter_path is not None:
3874
4033
  __query["filter_path"] = filter_path
3875
4034
  if human is not None:
3876
4035
  __query["human"] = human
3877
- if max_num_threads is not None:
3878
- __body["max_num_threads"] = max_num_threads
3879
- if model_memory_limit is not None:
3880
- __body["model_memory_limit"] = model_memory_limit
3881
4036
  if pretty is not None:
3882
4037
  __query["pretty"] = pretty
4038
+ if not __body:
4039
+ if allow_lazy_start is not None:
4040
+ __body["allow_lazy_start"] = allow_lazy_start
4041
+ if description is not None:
4042
+ __body["description"] = description
4043
+ if max_num_threads is not None:
4044
+ __body["max_num_threads"] = max_num_threads
4045
+ if model_memory_limit is not None:
4046
+ __body["model_memory_limit"] = model_memory_limit
3883
4047
  __headers = {"accept": "application/json", "content-type": "application/json"}
3884
4048
  return await self.perform_request( # type: ignore[return-value]
3885
4049
  "POST", __path, params=__query, headers=__headers, body=__body
3886
4050
  )
3887
4051
 
3888
4052
  @_rewrite_parameters(
3889
- body_fields=True,
4053
+ body_fields=(
4054
+ "aggregations",
4055
+ "chunking_config",
4056
+ "delayed_data_check_config",
4057
+ "frequency",
4058
+ "indexes",
4059
+ "indices",
4060
+ "indices_options",
4061
+ "job_id",
4062
+ "max_empty_searches",
4063
+ "query",
4064
+ "query_delay",
4065
+ "runtime_mappings",
4066
+ "script_fields",
4067
+ "scroll_size",
4068
+ ),
3890
4069
  )
3891
4070
  async def update_datafeed(
3892
4071
  self,
@@ -3921,11 +4100,12 @@ class MlClient(NamespacedClient):
3921
4100
  runtime_mappings: t.Optional[t.Mapping[str, t.Mapping[str, t.Any]]] = None,
3922
4101
  script_fields: t.Optional[t.Mapping[str, t.Mapping[str, t.Any]]] = None,
3923
4102
  scroll_size: t.Optional[int] = None,
4103
+ body: t.Optional[t.Dict[str, t.Any]] = None,
3924
4104
  ) -> ObjectApiResponse[t.Any]:
3925
4105
  """
3926
4106
  Updates certain properties of a datafeed.
3927
4107
 
3928
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-update-datafeed.html>`_
4108
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-update-datafeed.html>`_
3929
4109
 
3930
4110
  :param datafeed_id: A numerical character string that uniquely identifies the
3931
4111
  datafeed. This identifier can contain lowercase alphanumeric characters (a-z
@@ -4010,59 +4190,60 @@ class MlClient(NamespacedClient):
4010
4190
  if datafeed_id in SKIP_IN_PATH:
4011
4191
  raise ValueError("Empty value passed for parameter 'datafeed_id'")
4012
4192
  __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_update"
4013
- __body: t.Dict[str, t.Any] = {}
4014
4193
  __query: t.Dict[str, t.Any] = {}
4015
- if aggregations is not None:
4016
- __body["aggregations"] = aggregations
4194
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
4017
4195
  if allow_no_indices is not None:
4018
4196
  __query["allow_no_indices"] = allow_no_indices
4019
- if chunking_config is not None:
4020
- __body["chunking_config"] = chunking_config
4021
- if delayed_data_check_config is not None:
4022
- __body["delayed_data_check_config"] = delayed_data_check_config
4023
4197
  if error_trace is not None:
4024
4198
  __query["error_trace"] = error_trace
4025
4199
  if expand_wildcards is not None:
4026
4200
  __query["expand_wildcards"] = expand_wildcards
4027
4201
  if filter_path is not None:
4028
4202
  __query["filter_path"] = filter_path
4029
- if frequency is not None:
4030
- __body["frequency"] = frequency
4031
4203
  if human is not None:
4032
4204
  __query["human"] = human
4033
4205
  if ignore_throttled is not None:
4034
4206
  __query["ignore_throttled"] = ignore_throttled
4035
4207
  if ignore_unavailable is not None:
4036
4208
  __query["ignore_unavailable"] = ignore_unavailable
4037
- if indexes is not None:
4038
- __body["indexes"] = indexes
4039
- if indices is not None:
4040
- __body["indices"] = indices
4041
- if indices_options is not None:
4042
- __body["indices_options"] = indices_options
4043
- if job_id is not None:
4044
- __body["job_id"] = job_id
4045
- if max_empty_searches is not None:
4046
- __body["max_empty_searches"] = max_empty_searches
4047
4209
  if pretty is not None:
4048
4210
  __query["pretty"] = pretty
4049
- if query is not None:
4050
- __body["query"] = query
4051
- if query_delay is not None:
4052
- __body["query_delay"] = query_delay
4053
- if runtime_mappings is not None:
4054
- __body["runtime_mappings"] = runtime_mappings
4055
- if script_fields is not None:
4056
- __body["script_fields"] = script_fields
4057
- if scroll_size is not None:
4058
- __body["scroll_size"] = scroll_size
4211
+ if not __body:
4212
+ if aggregations is not None:
4213
+ __body["aggregations"] = aggregations
4214
+ if chunking_config is not None:
4215
+ __body["chunking_config"] = chunking_config
4216
+ if delayed_data_check_config is not None:
4217
+ __body["delayed_data_check_config"] = delayed_data_check_config
4218
+ if frequency is not None:
4219
+ __body["frequency"] = frequency
4220
+ if indexes is not None:
4221
+ __body["indexes"] = indexes
4222
+ if indices is not None:
4223
+ __body["indices"] = indices
4224
+ if indices_options is not None:
4225
+ __body["indices_options"] = indices_options
4226
+ if job_id is not None:
4227
+ __body["job_id"] = job_id
4228
+ if max_empty_searches is not None:
4229
+ __body["max_empty_searches"] = max_empty_searches
4230
+ if query is not None:
4231
+ __body["query"] = query
4232
+ if query_delay is not None:
4233
+ __body["query_delay"] = query_delay
4234
+ if runtime_mappings is not None:
4235
+ __body["runtime_mappings"] = runtime_mappings
4236
+ if script_fields is not None:
4237
+ __body["script_fields"] = script_fields
4238
+ if scroll_size is not None:
4239
+ __body["scroll_size"] = scroll_size
4059
4240
  __headers = {"accept": "application/json", "content-type": "application/json"}
4060
4241
  return await self.perform_request( # type: ignore[return-value]
4061
4242
  "POST", __path, params=__query, headers=__headers, body=__body
4062
4243
  )
4063
4244
 
4064
4245
  @_rewrite_parameters(
4065
- body_fields=True,
4246
+ body_fields=("add_items", "description", "remove_items"),
4066
4247
  )
4067
4248
  async def update_filter(
4068
4249
  self,
@@ -4075,11 +4256,12 @@ class MlClient(NamespacedClient):
4075
4256
  human: t.Optional[bool] = None,
4076
4257
  pretty: t.Optional[bool] = None,
4077
4258
  remove_items: t.Optional[t.Sequence[str]] = None,
4259
+ body: t.Optional[t.Dict[str, t.Any]] = None,
4078
4260
  ) -> ObjectApiResponse[t.Any]:
4079
4261
  """
4080
4262
  Updates the description of a filter, adds items, or removes items.
4081
4263
 
4082
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-update-filter.html>`_
4264
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-update-filter.html>`_
4083
4265
 
4084
4266
  :param filter_id: A string that uniquely identifies a filter.
4085
4267
  :param add_items: The items to add to the filter.
@@ -4089,12 +4271,8 @@ class MlClient(NamespacedClient):
4089
4271
  if filter_id in SKIP_IN_PATH:
4090
4272
  raise ValueError("Empty value passed for parameter 'filter_id'")
4091
4273
  __path = f"/_ml/filters/{_quote(filter_id)}/_update"
4092
- __body: t.Dict[str, t.Any] = {}
4093
4274
  __query: t.Dict[str, t.Any] = {}
4094
- if add_items is not None:
4095
- __body["add_items"] = add_items
4096
- if description is not None:
4097
- __body["description"] = description
4275
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
4098
4276
  if error_trace is not None:
4099
4277
  __query["error_trace"] = error_trace
4100
4278
  if filter_path is not None:
@@ -4103,15 +4281,36 @@ class MlClient(NamespacedClient):
4103
4281
  __query["human"] = human
4104
4282
  if pretty is not None:
4105
4283
  __query["pretty"] = pretty
4106
- if remove_items is not None:
4107
- __body["remove_items"] = remove_items
4284
+ if not __body:
4285
+ if add_items is not None:
4286
+ __body["add_items"] = add_items
4287
+ if description is not None:
4288
+ __body["description"] = description
4289
+ if remove_items is not None:
4290
+ __body["remove_items"] = remove_items
4108
4291
  __headers = {"accept": "application/json", "content-type": "application/json"}
4109
4292
  return await self.perform_request( # type: ignore[return-value]
4110
4293
  "POST", __path, params=__query, headers=__headers, body=__body
4111
4294
  )
4112
4295
 
4113
4296
  @_rewrite_parameters(
4114
- body_fields=True,
4297
+ body_fields=(
4298
+ "allow_lazy_open",
4299
+ "analysis_limits",
4300
+ "background_persist_interval",
4301
+ "categorization_filters",
4302
+ "custom_settings",
4303
+ "daily_model_snapshot_retention_after_days",
4304
+ "description",
4305
+ "detectors",
4306
+ "groups",
4307
+ "model_plot_config",
4308
+ "model_prune_window",
4309
+ "model_snapshot_retention_days",
4310
+ "per_partition_categorization",
4311
+ "renormalization_window_days",
4312
+ "results_retention_days",
4313
+ ),
4115
4314
  )
4116
4315
  async def update_job(
4117
4316
  self,
@@ -4140,11 +4339,12 @@ class MlClient(NamespacedClient):
4140
4339
  pretty: t.Optional[bool] = None,
4141
4340
  renormalization_window_days: t.Optional[int] = None,
4142
4341
  results_retention_days: t.Optional[int] = None,
4342
+ body: t.Optional[t.Dict[str, t.Any]] = None,
4143
4343
  ) -> ObjectApiResponse[t.Any]:
4144
4344
  """
4145
4345
  Updates certain properties of an anomaly detection job.
4146
4346
 
4147
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-update-job.html>`_
4347
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-update-job.html>`_
4148
4348
 
4149
4349
  :param job_id: Identifier for the job.
4150
4350
  :param allow_lazy_open: Advanced configuration option. Specifies whether this
@@ -4198,55 +4398,56 @@ class MlClient(NamespacedClient):
4198
4398
  if job_id in SKIP_IN_PATH:
4199
4399
  raise ValueError("Empty value passed for parameter 'job_id'")
4200
4400
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_update"
4201
- __body: t.Dict[str, t.Any] = {}
4202
4401
  __query: t.Dict[str, t.Any] = {}
4203
- if allow_lazy_open is not None:
4204
- __body["allow_lazy_open"] = allow_lazy_open
4205
- if analysis_limits is not None:
4206
- __body["analysis_limits"] = analysis_limits
4207
- if background_persist_interval is not None:
4208
- __body["background_persist_interval"] = background_persist_interval
4209
- if categorization_filters is not None:
4210
- __body["categorization_filters"] = categorization_filters
4211
- if custom_settings is not None:
4212
- __body["custom_settings"] = custom_settings
4213
- if daily_model_snapshot_retention_after_days is not None:
4214
- __body[
4215
- "daily_model_snapshot_retention_after_days"
4216
- ] = daily_model_snapshot_retention_after_days
4217
- if description is not None:
4218
- __body["description"] = description
4219
- if detectors is not None:
4220
- __body["detectors"] = detectors
4402
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
4221
4403
  if error_trace is not None:
4222
4404
  __query["error_trace"] = error_trace
4223
4405
  if filter_path is not None:
4224
4406
  __query["filter_path"] = filter_path
4225
- if groups is not None:
4226
- __body["groups"] = groups
4227
4407
  if human is not None:
4228
4408
  __query["human"] = human
4229
- if model_plot_config is not None:
4230
- __body["model_plot_config"] = model_plot_config
4231
- if model_prune_window is not None:
4232
- __body["model_prune_window"] = model_prune_window
4233
- if model_snapshot_retention_days is not None:
4234
- __body["model_snapshot_retention_days"] = model_snapshot_retention_days
4235
- if per_partition_categorization is not None:
4236
- __body["per_partition_categorization"] = per_partition_categorization
4237
4409
  if pretty is not None:
4238
4410
  __query["pretty"] = pretty
4239
- if renormalization_window_days is not None:
4240
- __body["renormalization_window_days"] = renormalization_window_days
4241
- if results_retention_days is not None:
4242
- __body["results_retention_days"] = results_retention_days
4411
+ if not __body:
4412
+ if allow_lazy_open is not None:
4413
+ __body["allow_lazy_open"] = allow_lazy_open
4414
+ if analysis_limits is not None:
4415
+ __body["analysis_limits"] = analysis_limits
4416
+ if background_persist_interval is not None:
4417
+ __body["background_persist_interval"] = background_persist_interval
4418
+ if categorization_filters is not None:
4419
+ __body["categorization_filters"] = categorization_filters
4420
+ if custom_settings is not None:
4421
+ __body["custom_settings"] = custom_settings
4422
+ if daily_model_snapshot_retention_after_days is not None:
4423
+ __body[
4424
+ "daily_model_snapshot_retention_after_days"
4425
+ ] = daily_model_snapshot_retention_after_days
4426
+ if description is not None:
4427
+ __body["description"] = description
4428
+ if detectors is not None:
4429
+ __body["detectors"] = detectors
4430
+ if groups is not None:
4431
+ __body["groups"] = groups
4432
+ if model_plot_config is not None:
4433
+ __body["model_plot_config"] = model_plot_config
4434
+ if model_prune_window is not None:
4435
+ __body["model_prune_window"] = model_prune_window
4436
+ if model_snapshot_retention_days is not None:
4437
+ __body["model_snapshot_retention_days"] = model_snapshot_retention_days
4438
+ if per_partition_categorization is not None:
4439
+ __body["per_partition_categorization"] = per_partition_categorization
4440
+ if renormalization_window_days is not None:
4441
+ __body["renormalization_window_days"] = renormalization_window_days
4442
+ if results_retention_days is not None:
4443
+ __body["results_retention_days"] = results_retention_days
4243
4444
  __headers = {"accept": "application/json", "content-type": "application/json"}
4244
4445
  return await self.perform_request( # type: ignore[return-value]
4245
4446
  "POST", __path, params=__query, headers=__headers, body=__body
4246
4447
  )
4247
4448
 
4248
4449
  @_rewrite_parameters(
4249
- body_fields=True,
4450
+ body_fields=("description", "retain"),
4250
4451
  )
4251
4452
  async def update_model_snapshot(
4252
4453
  self,
@@ -4259,11 +4460,12 @@ class MlClient(NamespacedClient):
4259
4460
  human: t.Optional[bool] = None,
4260
4461
  pretty: t.Optional[bool] = None,
4261
4462
  retain: t.Optional[bool] = None,
4463
+ body: t.Optional[t.Dict[str, t.Any]] = None,
4262
4464
  ) -> ObjectApiResponse[t.Any]:
4263
4465
  """
4264
4466
  Updates certain properties of a snapshot.
4265
4467
 
4266
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-update-snapshot.html>`_
4468
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-update-snapshot.html>`_
4267
4469
 
4268
4470
  :param job_id: Identifier for the anomaly detection job.
4269
4471
  :param snapshot_id: Identifier for the model snapshot.
@@ -4277,10 +4479,8 @@ class MlClient(NamespacedClient):
4277
4479
  if snapshot_id in SKIP_IN_PATH:
4278
4480
  raise ValueError("Empty value passed for parameter 'snapshot_id'")
4279
4481
  __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/model_snapshots/{_quote(snapshot_id)}/_update"
4280
- __body: t.Dict[str, t.Any] = {}
4281
4482
  __query: t.Dict[str, t.Any] = {}
4282
- if description is not None:
4283
- __body["description"] = description
4483
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
4284
4484
  if error_trace is not None:
4285
4485
  __query["error_trace"] = error_trace
4286
4486
  if filter_path is not None:
@@ -4289,8 +4489,11 @@ class MlClient(NamespacedClient):
4289
4489
  __query["human"] = human
4290
4490
  if pretty is not None:
4291
4491
  __query["pretty"] = pretty
4292
- if retain is not None:
4293
- __body["retain"] = retain
4492
+ if not __body:
4493
+ if description is not None:
4494
+ __body["description"] = description
4495
+ if retain is not None:
4496
+ __body["retain"] = retain
4294
4497
  __headers = {"accept": "application/json", "content-type": "application/json"}
4295
4498
  return await self.perform_request( # type: ignore[return-value]
4296
4499
  "POST", __path, params=__query, headers=__headers, body=__body
@@ -4312,7 +4515,7 @@ class MlClient(NamespacedClient):
4312
4515
  """
4313
4516
  Upgrades a given job snapshot to the current major version.
4314
4517
 
4315
- `<https://www.elastic.co/guide/en/elasticsearch/reference/8.11/ml-upgrade-job-model-snapshot.html>`_
4518
+ `<https://www.elastic.co/guide/en/elasticsearch/reference/8.12/ml-upgrade-job-model-snapshot.html>`_
4316
4519
 
4317
4520
  :param job_id: Identifier for the anomaly detection job.
4318
4521
  :param snapshot_id: A numerical character string that uniquely identifies the
@@ -4346,7 +4549,17 @@ class MlClient(NamespacedClient):
4346
4549
  )
4347
4550
 
4348
4551
  @_rewrite_parameters(
4349
- body_fields=True,
4552
+ body_fields=(
4553
+ "analysis_config",
4554
+ "analysis_limits",
4555
+ "data_description",
4556
+ "description",
4557
+ "job_id",
4558
+ "model_plot",
4559
+ "model_snapshot_id",
4560
+ "model_snapshot_retention_days",
4561
+ "results_index_name",
4562
+ ),
4350
4563
  )
4351
4564
  async def validate(
4352
4565
  self,
@@ -4364,11 +4577,12 @@ class MlClient(NamespacedClient):
4364
4577
  model_snapshot_retention_days: t.Optional[int] = None,
4365
4578
  pretty: t.Optional[bool] = None,
4366
4579
  results_index_name: t.Optional[str] = None,
4580
+ body: t.Optional[t.Dict[str, t.Any]] = None,
4367
4581
  ) -> ObjectApiResponse[t.Any]:
4368
4582
  """
4369
4583
  Validates an anomaly detection job.
4370
4584
 
4371
- `<https://www.elastic.co/guide/en/machine-learning/8.11/ml-jobs.html>`_
4585
+ `<https://www.elastic.co/guide/en/machine-learning/8.12/ml-jobs.html>`_
4372
4586
 
4373
4587
  :param analysis_config:
4374
4588
  :param analysis_limits:
@@ -4381,34 +4595,35 @@ class MlClient(NamespacedClient):
4381
4595
  :param results_index_name:
4382
4596
  """
4383
4597
  __path = "/_ml/anomaly_detectors/_validate"
4384
- __body: t.Dict[str, t.Any] = {}
4385
4598
  __query: t.Dict[str, t.Any] = {}
4386
- if analysis_config is not None:
4387
- __body["analysis_config"] = analysis_config
4388
- if analysis_limits is not None:
4389
- __body["analysis_limits"] = analysis_limits
4390
- if data_description is not None:
4391
- __body["data_description"] = data_description
4392
- if description is not None:
4393
- __body["description"] = description
4599
+ __body: t.Dict[str, t.Any] = body if body is not None else {}
4394
4600
  if error_trace is not None:
4395
4601
  __query["error_trace"] = error_trace
4396
4602
  if filter_path is not None:
4397
4603
  __query["filter_path"] = filter_path
4398
4604
  if human is not None:
4399
4605
  __query["human"] = human
4400
- if job_id is not None:
4401
- __body["job_id"] = job_id
4402
- if model_plot is not None:
4403
- __body["model_plot"] = model_plot
4404
- if model_snapshot_id is not None:
4405
- __body["model_snapshot_id"] = model_snapshot_id
4406
- if model_snapshot_retention_days is not None:
4407
- __body["model_snapshot_retention_days"] = model_snapshot_retention_days
4408
4606
  if pretty is not None:
4409
4607
  __query["pretty"] = pretty
4410
- if results_index_name is not None:
4411
- __body["results_index_name"] = results_index_name
4608
+ if not __body:
4609
+ if analysis_config is not None:
4610
+ __body["analysis_config"] = analysis_config
4611
+ if analysis_limits is not None:
4612
+ __body["analysis_limits"] = analysis_limits
4613
+ if data_description is not None:
4614
+ __body["data_description"] = data_description
4615
+ if description is not None:
4616
+ __body["description"] = description
4617
+ if job_id is not None:
4618
+ __body["job_id"] = job_id
4619
+ if model_plot is not None:
4620
+ __body["model_plot"] = model_plot
4621
+ if model_snapshot_id is not None:
4622
+ __body["model_snapshot_id"] = model_snapshot_id
4623
+ if model_snapshot_retention_days is not None:
4624
+ __body["model_snapshot_retention_days"] = model_snapshot_retention_days
4625
+ if results_index_name is not None:
4626
+ __body["results_index_name"] = results_index_name
4412
4627
  __headers = {"accept": "application/json", "content-type": "application/json"}
4413
4628
  return await self.perform_request( # type: ignore[return-value]
4414
4629
  "POST", __path, params=__query, headers=__headers, body=__body
@@ -4420,7 +4635,8 @@ class MlClient(NamespacedClient):
4420
4635
  async def validate_detector(
4421
4636
  self,
4422
4637
  *,
4423
- detector: t.Mapping[str, t.Any],
4638
+ detector: t.Optional[t.Mapping[str, t.Any]] = None,
4639
+ body: t.Optional[t.Mapping[str, t.Any]] = None,
4424
4640
  error_trace: t.Optional[bool] = None,
4425
4641
  filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
4426
4642
  human: t.Optional[bool] = None,
@@ -4429,12 +4645,16 @@ class MlClient(NamespacedClient):
4429
4645
  """
4430
4646
  Validates an anomaly detection detector.
4431
4647
 
4432
- `<https://www.elastic.co/guide/en/machine-learning/8.11/ml-jobs.html>`_
4648
+ `<https://www.elastic.co/guide/en/machine-learning/8.12/ml-jobs.html>`_
4433
4649
 
4434
4650
  :param detector:
4435
4651
  """
4436
- if detector is None:
4437
- raise ValueError("Empty value passed for parameter 'detector'")
4652
+ if detector is None and body is None:
4653
+ raise ValueError(
4654
+ "Empty value passed for parameters 'detector' and 'body', one of them should be set."
4655
+ )
4656
+ elif detector is not None and body is not None:
4657
+ raise ValueError("Cannot set both 'detector' and 'body'")
4438
4658
  __path = "/_ml/anomaly_detectors/_validate/detector"
4439
4659
  __query: t.Dict[str, t.Any] = {}
4440
4660
  if error_trace is not None:
@@ -4445,7 +4665,7 @@ class MlClient(NamespacedClient):
4445
4665
  __query["human"] = human
4446
4666
  if pretty is not None:
4447
4667
  __query["pretty"] = pretty
4448
- __body = detector
4668
+ __body = detector if detector is not None else body
4449
4669
  __headers = {"accept": "application/json", "content-type": "application/json"}
4450
4670
  return await self.perform_request( # type: ignore[return-value]
4451
4671
  "POST", __path, params=__query, headers=__headers, body=__body