Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-elasticsearch for 
openSUSE:Factory checked in at 2026-10-23 20:22:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-elasticsearch (Old)
 and      /work/SRC/openSUSE:Factory/.python-elasticsearch.new.2252680 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-elasticsearch"

Fri Oct 23 20:22:07 2026 rev:27 rq:1387081 version:9.5.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-elasticsearch/python-elasticsearch.changes    
    2026-08-24 12:01:52.790200181 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-elasticsearch.new.2252680/python-elasticsearch.changes
   2026-10-23 20:22:37.767331735 +0200
@@ -1,0 +2,12 @@
+Thu Oct 22 11:30:00 UTC 2026 - Markéta Machová <[email protected]>
+
+- update to 9.5.1
+  * Added esql.delete_data_source, esql.get_data_source, and
+    esql.put_data_source APIs
+  * Updated SemanticText.inference_id default when the Elastic
+    Inference Service is available
+  * Fixed DenseVectorIndexOptions to include missing bbq_disk
+    properties
+  * confidence_interval on DenseVectorIndexOptions is deprecated
+
+-------------------------------------------------------------------

Old:
----
  v9.5.0.tar.gz

New:
----
  v9.5.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-elasticsearch.spec ++++++
--- /var/tmp/diff_new_pack.5SwJUo/_old  2026-10-23 20:22:38.711370937 +0200
+++ /var/tmp/diff_new_pack.5SwJUo/_new  2026-10-23 20:22:38.714371061 +0200
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-elasticsearch
-Version:        9.5.0
+Version:        9.5.1
 Release:        0
 Summary:        Python client for Elasticsearch
 License:        Apache-2.0

++++++ v9.5.0.tar.gz -> v9.5.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elasticsearch-py-9.5.0/.buildkite/pipeline.yml 
new/elasticsearch-py-9.5.1/.buildkite/pipeline.yml
--- old/elasticsearch-py-9.5.0/.buildkite/pipeline.yml  2026-08-04 
03:45:57.000000000 +0200
+++ new/elasticsearch-py-9.5.1/.buildkite/pipeline.yml  2026-08-31 
21:30:18.000000000 +0200
@@ -5,7 +5,7 @@
     env:
       PYTHON_VERSION: "{{ matrix.python }}"
       TEST_SUITE: "platinum"
-      STACK_VERSION: "9.5.0-SNAPSHOT"
+      STACK_VERSION: "9.5.3-SNAPSHOT"
       PYTHON_CONNECTION_CLASS: "{{ matrix.connection }}"
       NOX_SESSION: "{{ matrix.nox_session }}"
     matrix:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/elasticsearch-py-9.5.0/.github/workflows/pypi-publish.yml 
new/elasticsearch-py-9.5.1/.github/workflows/pypi-publish.yml
--- old/elasticsearch-py-9.5.0/.github/workflows/pypi-publish.yml       
1970-01-01 01:00:00.000000000 +0100
+++ new/elasticsearch-py-9.5.1/.github/workflows/pypi-publish.yml       
2026-08-31 21:30:18.000000000 +0200
@@ -0,0 +1,90 @@
+#  Licensed to Elasticsearch B.V. under one or more contributor
+#  license agreements. See the NOTICE file distributed with
+#  this work for additional information regarding copyright
+#  ownership. Elasticsearch B.V. licenses this file to you under
+#  the Apache License, Version 2.0 (the "License"); you may
+#  not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+name: Publish to PyPI
+
+on:
+  release:
+    types: [published]
+  workflow_dispatch:
+    inputs:
+      version:
+        description: "Existing release tag to publish (e.g. 9.5.1 or v9.5.1). 
The tag must already exist."
+        required: true
+        type: string
+
+permissions: {}
+
+jobs:
+  build:
+    name: Build distributions
+    runs-on: ubuntu-latest
+    steps:
+      - name: Derive release tag
+        id: tag
+        run: |
+          if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
+            version="${{ github.event.inputs.version }}"
+          else
+            version="${{ github.event.release.tag_name }}"
+          fi
+          version="${version#v}"
+          echo "version=$version" >> "$GITHUB_OUTPUT"
+          echo "name=v$version" >> "$GITHUB_OUTPUT"
+
+      - uses: actions/checkout@v5
+        with:
+          ref: ${{ steps.tag.outputs.name }}
+
+      - name: Verify package version matches tag
+        run: |
+          actual=$(sed -n 's/^__versionstr__ = "\(.*\)"/\1/p' 
elasticsearch/_version.py)
+          expected="${{ steps.tag.outputs.version }}"
+          if [ "$actual" != "$expected" ]; then
+            echo "elasticsearch/_version.py is $actual, tag is $expected"
+            exit 1
+          fi
+
+      - uses: actions/setup-python@v5
+        with:
+          python-version: "3.x"
+
+      - name: Install build dependencies
+        run: python -m pip install build
+
+      - name: Build dists
+        run: python utils/build-dists.py
+
+      - uses: actions/upload-artifact@v4
+        with:
+          name: dists
+          path: dist/
+
+  publish:
+    name: Publish to PyPI
+    needs: build
+    runs-on: ubuntu-latest
+    environment: pypi
+    permissions:
+      id-token: write
+    steps:
+      - uses: actions/download-artifact@v4
+        with:
+          name: dists
+          path: dist/
+
+      - uses: pypa/gh-action-pypi-publish@release/v1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elasticsearch-py-9.5.0/docs/release-notes/index.md 
new/elasticsearch-py-9.5.1/docs/release-notes/index.md
--- old/elasticsearch-py-9.5.0/docs/release-notes/index.md      2026-08-04 
03:45:57.000000000 +0200
+++ new/elasticsearch-py-9.5.1/docs/release-notes/index.md      2026-08-31 
21:30:18.000000000 +0200
@@ -18,6 +18,21 @@
 % *
 
 % ### Fixes [elasticsearch-python-client-next-fixes]
+## 9.5.1 (2026-08-31)
+
+API
+
+* Added `esql.delete_data_source`, `esql.get_data_source`, and 
`esql.put_data_source` APIs
+
+DSL
+
+* Updated `SemanticText.inference_id` default from `.elser-2-elasticsearch` to 
`.jina-embeddings-v5-text-small` when the Elastic Inference Service is available
+
+Fixes
+
+* Fixed `DenseVectorIndexOptions` to include missing `bbq_disk` properties: 
`cluster_size`, `default_visit_percentage`, `bits`, `precondition`, and 
`auto_calibrate`
+* `confidence_interval` on `DenseVectorIndexOptions` is now deprecated (Lucene 
10.4 computes it automatically)
+
 ## 9.5.0 (2026-08-04)
 
 API
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/elasticsearch-py-9.5.0/elasticsearch/_async/client/esql.py 
new/elasticsearch-py-9.5.1/elasticsearch/_async/client/esql.py
--- old/elasticsearch-py-9.5.0/elasticsearch/_async/client/esql.py      
2026-08-04 03:45:57.000000000 +0200
+++ new/elasticsearch-py-9.5.1/elasticsearch/_async/client/esql.py      
2026-08-31 21:30:18.000000000 +0200
@@ -447,6 +447,115 @@
 
     @_rewrite_parameters()
     @_availability_warning(Stability.EXPERIMENTAL)
+    async def delete_data_source(
+        self,
+        *,
+        name: t.Union[str, t.Sequence[str]],
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+        timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Delete ES|QL data sources.</p>
+          <p>Deletes one or more data sources used in ES|QL data federation.
+          Fails with <code>409</code> if any dataset references one of the 
named data sources;
+          delete the dependent datasets first.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-delete-data-source>`_
+
+        :param name: A comma-separated list of data source names to delete.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        :param timeout: The time to wait for the request to be completed.
+        """
+        if name in SKIP_IN_PATH:
+            raise ValueError("Empty value passed for parameter 'name'")
+        __path_parts: t.Dict[str, str] = {"name": _quote(name)}
+        __path = f'/_query/data_source/{__path_parts["name"]}'
+        __query: t.Dict[str, t.Any] = {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        if timeout is not None:
+            __query["timeout"] = timeout
+        __headers = {"accept": "application/json"}
+        return await self.perform_request(  # type: ignore[return-value]
+            "DELETE",
+            __path,
+            params=__query,
+            headers=__headers,
+            endpoint_id="esql.delete_data_source",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters()
+    @_availability_warning(Stability.EXPERIMENTAL)
+    async def delete_dataset(
+        self,
+        *,
+        name: t.Union[str, t.Sequence[str]],
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+        timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Delete ES|QL datasets.</p>
+          <p>Deletes one or more datasets used in ES|QL data federation.
+          If any specified dataset does not exist, the request fails and no 
datasets are deleted.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-delete-dataset>`_
+
+        :param name: A comma-separated list of dataset names to delete.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        :param timeout: The time to wait for the request to be completed.
+        """
+        if name in SKIP_IN_PATH:
+            raise ValueError("Empty value passed for parameter 'name'")
+        __path_parts: t.Dict[str, str] = {"name": _quote(name)}
+        __path = f'/_query/dataset/{__path_parts["name"]}'
+        __query: t.Dict[str, t.Any] = {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        if timeout is not None:
+            __query["timeout"] = timeout
+        __headers = {"accept": "application/json"}
+        return await self.perform_request(  # type: ignore[return-value]
+            "DELETE",
+            __path,
+            params=__query,
+            headers=__headers,
+            endpoint_id="esql.delete_dataset",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters()
+    @_availability_warning(Stability.EXPERIMENTAL)
     async def delete_view(
         self,
         *,
@@ -492,6 +601,116 @@
 
     @_rewrite_parameters()
     @_availability_warning(Stability.EXPERIMENTAL)
+    async def get_data_source(
+        self,
+        *,
+        name: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Get ES|QL data sources.</p>
+          <p>Returns one or more data sources used in ES|QL data federation.
+          A concrete-name miss returns <code>404</code>; a wildcard pattern or 
list-all request with no match
+          returns <code>200</code> with an empty array.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-get-data-source>`_
+
+        :param name: A comma-separated list of data source names or wildcard 
patterns.
+            Omit to return all data sources.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        """
+        __path_parts: t.Dict[str, str]
+        if name not in SKIP_IN_PATH:
+            __path_parts = {"name": _quote(name)}
+            __path = f'/_query/data_source/{__path_parts["name"]}'
+        else:
+            __path_parts = {}
+            __path = "/_query/data_source"
+        __query: t.Dict[str, t.Any] = {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        __headers = {"accept": "application/json"}
+        return await self.perform_request(  # type: ignore[return-value]
+            "GET",
+            __path,
+            params=__query,
+            headers=__headers,
+            endpoint_id="esql.get_data_source",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters()
+    @_availability_warning(Stability.EXPERIMENTAL)
+    async def get_dataset(
+        self,
+        *,
+        name: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Get ES|QL datasets.</p>
+          <p>Returns one or more datasets used in ES|QL data federation.
+          A concrete-name miss returns <code>404</code>; a wildcard pattern or 
list-all request with no match
+          returns <code>200</code> with an empty array.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-get-dataset>`_
+
+        :param name: A comma-separated list of dataset names or wildcard 
patterns. Omit
+            to return all datasets.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        """
+        __path_parts: t.Dict[str, str]
+        if name not in SKIP_IN_PATH:
+            __path_parts = {"name": _quote(name)}
+            __path = f'/_query/dataset/{__path_parts["name"]}'
+        else:
+            __path_parts = {}
+            __path = "/_query/dataset"
+        __query: t.Dict[str, t.Any] = {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        __headers = {"accept": "application/json"}
+        return await self.perform_request(  # type: ignore[return-value]
+            "GET",
+            __path,
+            params=__query,
+            headers=__headers,
+            endpoint_id="esql.get_dataset",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters()
+    @_availability_warning(Stability.EXPERIMENTAL)
     async def get_query(
         self,
         *,
@@ -623,6 +842,177 @@
             path_parts=__path_parts,
         )
 
+    @_rewrite_parameters(
+        body_fields=("type", "description", "settings"),
+    )
+    @_availability_warning(Stability.EXPERIMENTAL)
+    async def put_data_source(
+        self,
+        *,
+        name: str,
+        type: t.Optional[str] = None,
+        description: t.Optional[str] = None,
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+        settings: t.Optional[t.Mapping[str, t.Any]] = None,
+        timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] = None,
+        body: t.Optional[t.Dict[str, t.Any]] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Create or update an ES|QL data source.</p>
+          <p>Creates or replaces a named, type-specific data source 
configuration for ES|QL data federation.
+          Datasets reference data source configurations to access external 
data. Names must be lowercase
+          and follow index or alias naming rules.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-put-data-source>`_
+
+        :param name: The data source name to create or update.
+        :param type: The data source type. Currently, `s3` is supported. The 
value must
+            be lowercase and contain no whitespace.
+        :param description: A free-text description of the data source.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        :param settings: Type-specific connection and authentication settings. 
For `s3`,
+            connection settings include `region` and `endpoint`. 
Authentication settings
+            include `auth` and the credentials required by the selected 
authentication
+            method.
+        :param timeout: The time to wait for the request to be completed.
+        """
+        if name in SKIP_IN_PATH:
+            raise ValueError("Empty value passed for parameter 'name'")
+        if type is None and body is None:
+            raise ValueError("Empty value passed for parameter 'type'")
+        __path_parts: t.Dict[str, str] = {"name": _quote(name)}
+        __path = f'/_query/data_source/{__path_parts["name"]}'
+        __query: t.Dict[str, t.Any] = {}
+        __body: t.Dict[str, t.Any] = body if body is not None else {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        if timeout is not None:
+            __query["timeout"] = timeout
+        if not __body:
+            if type is not None:
+                __body["type"] = type
+            if description is not None:
+                __body["description"] = description
+            if settings is not None:
+                __body["settings"] = settings
+        __headers = {"accept": "application/json", "content-type": 
"application/json"}
+        return await self.perform_request(  # type: ignore[return-value]
+            "PUT",
+            __path,
+            params=__query,
+            headers=__headers,
+            body=__body,
+            endpoint_id="esql.put_data_source",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters(
+        body_fields=("data_source", "resource", "description", "mappings", 
"settings"),
+    )
+    @_availability_warning(Stability.EXPERIMENTAL)
+    async def put_dataset(
+        self,
+        *,
+        name: str,
+        data_source: t.Optional[str] = None,
+        resource: t.Optional[str] = None,
+        description: t.Optional[str] = None,
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        mappings: t.Optional[t.Mapping[str, t.Any]] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+        settings: t.Optional[t.Mapping[str, t.Any]] = None,
+        timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] = None,
+        body: t.Optional[t.Dict[str, t.Any]] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Create or update an ES|QL dataset.</p>
+          <p>Creates or replaces a dataset that references a data source in 
ES|QL data federation.
+          Dataset names participate in the index namespace and must follow 
index or alias naming rules.
+          Returns <code>404</code> if the referenced data source does not 
exist.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-put-dataset>`_
+
+        :param name: The dataset name to create or update.
+        :param data_source: The name of the referenced data source. The data 
source must
+            already exist.
+        :param resource: The URI that identifies the data to read, resolved 
against the
+            referenced data source. It can include glob patterns. For example, 
a recursive
+            pattern can match all Parquet files under the 
`s3://logs-bucket/access` prefix.
+        :param description: A free-text description of the dataset.
+        :param mappings: User-declared mapping on the dataset definition
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        :param settings: Format and parsing-specific settings that configure 
how the
+            resource is read. Common keys include `format`, which explicitly 
selects
+            a registered format, and `partition_detection`, which accepts 
`auto`, `hive`,
+            `template`, or `none`. Additional keys depend on the format 
reader. Compression
+            can be inferred from the resource URI.
+        :param timeout: The time to wait for the request to be completed.
+        """
+        if name in SKIP_IN_PATH:
+            raise ValueError("Empty value passed for parameter 'name'")
+        if data_source is None and body is None:
+            raise ValueError("Empty value passed for parameter 'data_source'")
+        if resource is None and body is None:
+            raise ValueError("Empty value passed for parameter 'resource'")
+        __path_parts: t.Dict[str, str] = {"name": _quote(name)}
+        __path = f'/_query/dataset/{__path_parts["name"]}'
+        __query: t.Dict[str, t.Any] = {}
+        __body: t.Dict[str, t.Any] = body if body is not None else {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        if timeout is not None:
+            __query["timeout"] = timeout
+        if not __body:
+            if data_source is not None:
+                __body["data_source"] = data_source
+            if resource is not None:
+                __body["resource"] = resource
+            if description is not None:
+                __body["description"] = description
+            if mappings is not None:
+                __body["mappings"] = mappings
+            if settings is not None:
+                __body["settings"] = settings
+        __headers = {"accept": "application/json", "content-type": 
"application/json"}
+        return await self.perform_request(  # type: ignore[return-value]
+            "PUT",
+            __path,
+            params=__query,
+            headers=__headers,
+            body=__body,
+            endpoint_id="esql.put_dataset",
+            path_parts=__path_parts,
+        )
+
     @_rewrite_parameters(
         body_fields=("query",),
     )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/elasticsearch-py-9.5.0/elasticsearch/_sync/client/esql.py 
new/elasticsearch-py-9.5.1/elasticsearch/_sync/client/esql.py
--- old/elasticsearch-py-9.5.0/elasticsearch/_sync/client/esql.py       
2026-08-04 03:45:57.000000000 +0200
+++ new/elasticsearch-py-9.5.1/elasticsearch/_sync/client/esql.py       
2026-08-31 21:30:18.000000000 +0200
@@ -447,6 +447,115 @@
 
     @_rewrite_parameters()
     @_availability_warning(Stability.EXPERIMENTAL)
+    def delete_data_source(
+        self,
+        *,
+        name: t.Union[str, t.Sequence[str]],
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+        timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Delete ES|QL data sources.</p>
+          <p>Deletes one or more data sources used in ES|QL data federation.
+          Fails with <code>409</code> if any dataset references one of the 
named data sources;
+          delete the dependent datasets first.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-delete-data-source>`_
+
+        :param name: A comma-separated list of data source names to delete.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        :param timeout: The time to wait for the request to be completed.
+        """
+        if name in SKIP_IN_PATH:
+            raise ValueError("Empty value passed for parameter 'name'")
+        __path_parts: t.Dict[str, str] = {"name": _quote(name)}
+        __path = f'/_query/data_source/{__path_parts["name"]}'
+        __query: t.Dict[str, t.Any] = {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        if timeout is not None:
+            __query["timeout"] = timeout
+        __headers = {"accept": "application/json"}
+        return self.perform_request(  # type: ignore[return-value]
+            "DELETE",
+            __path,
+            params=__query,
+            headers=__headers,
+            endpoint_id="esql.delete_data_source",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters()
+    @_availability_warning(Stability.EXPERIMENTAL)
+    def delete_dataset(
+        self,
+        *,
+        name: t.Union[str, t.Sequence[str]],
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+        timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Delete ES|QL datasets.</p>
+          <p>Deletes one or more datasets used in ES|QL data federation.
+          If any specified dataset does not exist, the request fails and no 
datasets are deleted.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-delete-dataset>`_
+
+        :param name: A comma-separated list of dataset names to delete.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        :param timeout: The time to wait for the request to be completed.
+        """
+        if name in SKIP_IN_PATH:
+            raise ValueError("Empty value passed for parameter 'name'")
+        __path_parts: t.Dict[str, str] = {"name": _quote(name)}
+        __path = f'/_query/dataset/{__path_parts["name"]}'
+        __query: t.Dict[str, t.Any] = {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        if timeout is not None:
+            __query["timeout"] = timeout
+        __headers = {"accept": "application/json"}
+        return self.perform_request(  # type: ignore[return-value]
+            "DELETE",
+            __path,
+            params=__query,
+            headers=__headers,
+            endpoint_id="esql.delete_dataset",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters()
+    @_availability_warning(Stability.EXPERIMENTAL)
     def delete_view(
         self,
         *,
@@ -492,6 +601,116 @@
 
     @_rewrite_parameters()
     @_availability_warning(Stability.EXPERIMENTAL)
+    def get_data_source(
+        self,
+        *,
+        name: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Get ES|QL data sources.</p>
+          <p>Returns one or more data sources used in ES|QL data federation.
+          A concrete-name miss returns <code>404</code>; a wildcard pattern or 
list-all request with no match
+          returns <code>200</code> with an empty array.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-get-data-source>`_
+
+        :param name: A comma-separated list of data source names or wildcard 
patterns.
+            Omit to return all data sources.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        """
+        __path_parts: t.Dict[str, str]
+        if name not in SKIP_IN_PATH:
+            __path_parts = {"name": _quote(name)}
+            __path = f'/_query/data_source/{__path_parts["name"]}'
+        else:
+            __path_parts = {}
+            __path = "/_query/data_source"
+        __query: t.Dict[str, t.Any] = {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        __headers = {"accept": "application/json"}
+        return self.perform_request(  # type: ignore[return-value]
+            "GET",
+            __path,
+            params=__query,
+            headers=__headers,
+            endpoint_id="esql.get_data_source",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters()
+    @_availability_warning(Stability.EXPERIMENTAL)
+    def get_dataset(
+        self,
+        *,
+        name: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Get ES|QL datasets.</p>
+          <p>Returns one or more datasets used in ES|QL data federation.
+          A concrete-name miss returns <code>404</code>; a wildcard pattern or 
list-all request with no match
+          returns <code>200</code> with an empty array.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-get-dataset>`_
+
+        :param name: A comma-separated list of dataset names or wildcard 
patterns. Omit
+            to return all datasets.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        """
+        __path_parts: t.Dict[str, str]
+        if name not in SKIP_IN_PATH:
+            __path_parts = {"name": _quote(name)}
+            __path = f'/_query/dataset/{__path_parts["name"]}'
+        else:
+            __path_parts = {}
+            __path = "/_query/dataset"
+        __query: t.Dict[str, t.Any] = {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        __headers = {"accept": "application/json"}
+        return self.perform_request(  # type: ignore[return-value]
+            "GET",
+            __path,
+            params=__query,
+            headers=__headers,
+            endpoint_id="esql.get_dataset",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters()
+    @_availability_warning(Stability.EXPERIMENTAL)
     def get_query(
         self,
         *,
@@ -623,6 +842,177 @@
             path_parts=__path_parts,
         )
 
+    @_rewrite_parameters(
+        body_fields=("type", "description", "settings"),
+    )
+    @_availability_warning(Stability.EXPERIMENTAL)
+    def put_data_source(
+        self,
+        *,
+        name: str,
+        type: t.Optional[str] = None,
+        description: t.Optional[str] = None,
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+        settings: t.Optional[t.Mapping[str, t.Any]] = None,
+        timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] = None,
+        body: t.Optional[t.Dict[str, t.Any]] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Create or update an ES|QL data source.</p>
+          <p>Creates or replaces a named, type-specific data source 
configuration for ES|QL data federation.
+          Datasets reference data source configurations to access external 
data. Names must be lowercase
+          and follow index or alias naming rules.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-put-data-source>`_
+
+        :param name: The data source name to create or update.
+        :param type: The data source type. Currently, `s3` is supported. The 
value must
+            be lowercase and contain no whitespace.
+        :param description: A free-text description of the data source.
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        :param settings: Type-specific connection and authentication settings. 
For `s3`,
+            connection settings include `region` and `endpoint`. 
Authentication settings
+            include `auth` and the credentials required by the selected 
authentication
+            method.
+        :param timeout: The time to wait for the request to be completed.
+        """
+        if name in SKIP_IN_PATH:
+            raise ValueError("Empty value passed for parameter 'name'")
+        if type is None and body is None:
+            raise ValueError("Empty value passed for parameter 'type'")
+        __path_parts: t.Dict[str, str] = {"name": _quote(name)}
+        __path = f'/_query/data_source/{__path_parts["name"]}'
+        __query: t.Dict[str, t.Any] = {}
+        __body: t.Dict[str, t.Any] = body if body is not None else {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        if timeout is not None:
+            __query["timeout"] = timeout
+        if not __body:
+            if type is not None:
+                __body["type"] = type
+            if description is not None:
+                __body["description"] = description
+            if settings is not None:
+                __body["settings"] = settings
+        __headers = {"accept": "application/json", "content-type": 
"application/json"}
+        return self.perform_request(  # type: ignore[return-value]
+            "PUT",
+            __path,
+            params=__query,
+            headers=__headers,
+            body=__body,
+            endpoint_id="esql.put_data_source",
+            path_parts=__path_parts,
+        )
+
+    @_rewrite_parameters(
+        body_fields=("data_source", "resource", "description", "mappings", 
"settings"),
+    )
+    @_availability_warning(Stability.EXPERIMENTAL)
+    def put_dataset(
+        self,
+        *,
+        name: str,
+        data_source: t.Optional[str] = None,
+        resource: t.Optional[str] = None,
+        description: t.Optional[str] = None,
+        error_trace: t.Optional[bool] = None,
+        filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None,
+        human: t.Optional[bool] = None,
+        mappings: t.Optional[t.Mapping[str, t.Any]] = None,
+        master_timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] 
= None,
+        pretty: t.Optional[bool] = None,
+        settings: t.Optional[t.Mapping[str, t.Any]] = None,
+        timeout: t.Optional[t.Union[str, t.Literal[-1], t.Literal[0]]] = None,
+        body: t.Optional[t.Dict[str, t.Any]] = None,
+    ) -> ObjectApiResponse[t.Any]:
+        """
+        .. raw:: html
+
+          <p>Create or update an ES|QL dataset.</p>
+          <p>Creates or replaces a dataset that references a data source in 
ES|QL data federation.
+          Dataset names participate in the index namespace and must follow 
index or alias naming rules.
+          Returns <code>404</code> if the referenced data source does not 
exist.</p>
+
+
+        
`<https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-esql-put-dataset>`_
+
+        :param name: The dataset name to create or update.
+        :param data_source: The name of the referenced data source. The data 
source must
+            already exist.
+        :param resource: The URI that identifies the data to read, resolved 
against the
+            referenced data source. It can include glob patterns. For example, 
a recursive
+            pattern can match all Parquet files under the 
`s3://logs-bucket/access` prefix.
+        :param description: A free-text description of the dataset.
+        :param mappings: User-declared mapping on the dataset definition
+        :param master_timeout: Period to wait for a connection to the master 
node.
+        :param settings: Format and parsing-specific settings that configure 
how the
+            resource is read. Common keys include `format`, which explicitly 
selects
+            a registered format, and `partition_detection`, which accepts 
`auto`, `hive`,
+            `template`, or `none`. Additional keys depend on the format 
reader. Compression
+            can be inferred from the resource URI.
+        :param timeout: The time to wait for the request to be completed.
+        """
+        if name in SKIP_IN_PATH:
+            raise ValueError("Empty value passed for parameter 'name'")
+        if data_source is None and body is None:
+            raise ValueError("Empty value passed for parameter 'data_source'")
+        if resource is None and body is None:
+            raise ValueError("Empty value passed for parameter 'resource'")
+        __path_parts: t.Dict[str, str] = {"name": _quote(name)}
+        __path = f'/_query/dataset/{__path_parts["name"]}'
+        __query: t.Dict[str, t.Any] = {}
+        __body: t.Dict[str, t.Any] = body if body is not None else {}
+        if error_trace is not None:
+            __query["error_trace"] = error_trace
+        if filter_path is not None:
+            __query["filter_path"] = filter_path
+        if human is not None:
+            __query["human"] = human
+        if master_timeout is not None:
+            __query["master_timeout"] = master_timeout
+        if pretty is not None:
+            __query["pretty"] = pretty
+        if timeout is not None:
+            __query["timeout"] = timeout
+        if not __body:
+            if data_source is not None:
+                __body["data_source"] = data_source
+            if resource is not None:
+                __body["resource"] = resource
+            if description is not None:
+                __body["description"] = description
+            if mappings is not None:
+                __body["mappings"] = mappings
+            if settings is not None:
+                __body["settings"] = settings
+        __headers = {"accept": "application/json", "content-type": 
"application/json"}
+        return self.perform_request(  # type: ignore[return-value]
+            "PUT",
+            __path,
+            params=__query,
+            headers=__headers,
+            body=__body,
+            endpoint_id="esql.put_dataset",
+            path_parts=__path_parts,
+        )
+
     @_rewrite_parameters(
         body_fields=("query",),
     )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elasticsearch-py-9.5.0/elasticsearch/_version.py 
new/elasticsearch-py-9.5.1/elasticsearch/_version.py
--- old/elasticsearch-py-9.5.0/elasticsearch/_version.py        2026-08-04 
03:45:57.000000000 +0200
+++ new/elasticsearch-py-9.5.1/elasticsearch/_version.py        2026-08-31 
21:30:18.000000000 +0200
@@ -15,6 +15,6 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-__versionstr__ = "9.5.0"
-__es_specification_commit__ = "7555fc9af2cc5f3cedab2f35548136eb4972f1fa"
+__versionstr__ = "9.5.1"
+__es_specification_commit__ = "d669cedaf2a20400a96d6c786ff6296d0630e7b2"
 _SERVERLESS_API_VERSION = "2023-10-31"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elasticsearch-py-9.5.0/elasticsearch/dsl/field.py 
new/elasticsearch-py-9.5.1/elasticsearch/dsl/field.py
--- old/elasticsearch-py-9.5.0/elasticsearch/dsl/field.py       2026-08-04 
03:45:57.000000000 +0200
+++ new/elasticsearch-py-9.5.1/elasticsearch/dsl/field.py       2026-08-31 
21:30:18.000000000 +0200
@@ -4009,8 +4009,13 @@
         embeddings for the field. This parameter cannot be updated. Use
         the Create inference API to create the endpoint. If
         `search_inference_id` is specified, the inference endpoint will
-        only be used at index time. Defaults to `.elser-2-elasticsearch`
-        if omitted.
+        only be used at index time. If the `inference_id` is not
+        specified, it will default to `.jina-embeddings-v5-text-small` if
+        the cluster is authorized to use the Elastic Inference Service,
+        otherwise it will default to `.elser-2-elasticsearch`. The
+        `.elser-2-elasticsearch` inference endpoint relies on a local ML
+        node to run the ELSER model. Defaults to `.jina-
+        embeddings-v5-text-small` if omitted.
     :arg search_inference_id: Inference endpoint that will be used to
         generate embeddings at query time. You can update this parameter
         by using the Update mapping API. Use the Create inference API to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elasticsearch-py-9.5.0/elasticsearch/dsl/types.py 
new/elasticsearch-py-9.5.1/elasticsearch/dsl/types.py
--- old/elasticsearch-py-9.5.0/elasticsearch/dsl/types.py       2026-08-04 
03:45:57.000000000 +0200
+++ new/elasticsearch-py-9.5.1/elasticsearch/dsl/types.py       2026-08-31 
21:30:18.000000000 +0200
@@ -408,8 +408,32 @@
         flat search. `-1` (default) defers to format defaults: `300` for
         `bbq_hnsw`, `150` for `hnsw`, `int8_hnsw`, and `int4_hnsw`. `0`
         always builds the graph. A positive value overrides the format
-        default.  Only applicable to `hnsw`, `int8_hnsw`, `int4_hnsw`, and
-        `bbq_hnsw` index types. Defaults to `-1` if omitted.
+        default.  Only applicable to `hnsw`, `int8_hnsw`, `int4_hnsw`,
+        `bbq_hnsw`, and `bbq_disk` index types. Defaults to `-1` if
+        omitted.
+    :arg cluster_size: Only applicable to `bbq_disk`. The number of
+        vectors per cluster. Must be between 64 and 65536. Defaults to
+        `384` if omitted.
+    :arg default_visit_percentage: Only applicable to `bbq_disk`. The
+        percentage of clusters to visit during search. Must be between 0
+        and 100. A value of 0 defaults to using `num_candidates` for
+        calculating the visit percentage.
+    :arg bits: Only applicable to `bbq_disk`. The number of bits per
+        dimension for quantization encoding. Valid values are `1`, `2`,
+        `4`, or `7`. When no `rescore_vector` is explicitly set, the
+        default oversampling is automatically adjusted based on the bits
+        value. This setting can be changed without reindexing. Defaults to
+        `1` if omitted.
+    :arg precondition: Only applicable to `bbq_disk`. When `true`,
+        transforms indexed vectors using a random orthogonal projection
+        before quantization, which can improve accuracy when vector
+        components are not normally distributed. Cannot be changed after
+        the field is created.
+    :arg auto_calibrate: Only applicable to `bbq_disk`. When `true`,
+        Elasticsearch automatically selects the optimal quantization
+        encoding, oversampling factor, and preconditioning for each merged
+        segment based on estimated recall characteristics. Cannot be
+        changed after the field is created.
     """
 
     type: Union[
@@ -434,6 +458,11 @@
     ]
     on_disk_rescore: Union[bool, DefaultType]
     flat_index_threshold: Union[int, DefaultType]
+    cluster_size: Union[int, DefaultType]
+    default_visit_percentage: Union[float, DefaultType]
+    bits: Union[int, DefaultType]
+    precondition: Union[bool, DefaultType]
+    auto_calibrate: Union[bool, DefaultType]
 
     def __init__(
         self,
@@ -460,6 +489,11 @@
         ] = DEFAULT,
         on_disk_rescore: Union[bool, DefaultType] = DEFAULT,
         flat_index_threshold: Union[int, DefaultType] = DEFAULT,
+        cluster_size: Union[int, DefaultType] = DEFAULT,
+        default_visit_percentage: Union[float, DefaultType] = DEFAULT,
+        bits: Union[int, DefaultType] = DEFAULT,
+        precondition: Union[bool, DefaultType] = DEFAULT,
+        auto_calibrate: Union[bool, DefaultType] = DEFAULT,
         **kwargs: Any,
     ):
         if type is not DEFAULT:
@@ -476,6 +510,16 @@
             kwargs["on_disk_rescore"] = on_disk_rescore
         if flat_index_threshold is not DEFAULT:
             kwargs["flat_index_threshold"] = flat_index_threshold
+        if cluster_size is not DEFAULT:
+            kwargs["cluster_size"] = cluster_size
+        if default_visit_percentage is not DEFAULT:
+            kwargs["default_visit_percentage"] = default_visit_percentage
+        if bits is not DEFAULT:
+            kwargs["bits"] = bits
+        if precondition is not DEFAULT:
+            kwargs["precondition"] = precondition
+        if auto_calibrate is not DEFAULT:
+            kwargs["auto_calibrate"] = auto_calibrate
         super().__init__(kwargs)
 
 

Reply via email to