This is an automated email from the ASF dual-hosted git repository.
pankaj pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new cca4aa4e9a Add OpenAI Provider (#35023)
cca4aa4e9a is described below
commit cca4aa4e9ab545c8aab01b05941a372044668a67
Author: Utkarsh Sharma <[email protected]>
AuthorDate: Tue Nov 7 20:28:14 2023 +0530
Add OpenAI Provider (#35023)
* Add OpenAI Provider
* Apply suggestions from code review
Co-authored-by: Phani Kumar <[email protected]>
* Remove create_completions method from hook
* Change type of input_text param
Since the upstream API accepts str ot list of tokens, we accept the similar
inputs from user.
* Updated min-airflow version to 2.5.0
* Updated the interface and fix docs and static files
* Fix tests
* Fix tests
* Change the version
Because of OpenAI SDK not being production ready
* Add embedding_kwargs as a param to operator
* Update tests/providers/openai/hooks/test_openai.py
Co-authored-by: Pankaj Singh <[email protected]>
* Remove unwanted params in docstring
* Update Changelog
* Add security.rst file
* Update docs/apache-airflow-providers-openai/index.rst
Co-authored-by: Pankaj Singh <[email protected]>
* Add host field for connections
* Update docs/apache-airflow-providers-openai/index.rst
Co-authored-by: Pankaj Singh <[email protected]>
* Add changelog.rst file to docs
* Change version to 1.0.0
* Resolve conflicts
* Fix tests
* Fixed tests
* Fix test
* Resolve Conflict
---------
Co-authored-by: Pankaj Koti <[email protected]>
Co-authored-by: Phani Kumar <[email protected]>
Co-authored-by: Pankaj Singh <[email protected]>
---
.../airflow_providers_bug_report.yml | 1 +
CONTRIBUTING.rst | 10 +-
INSTALL | 10 +-
airflow/providers/openai/CHANGELOG.rst | 26 +++++
airflow/providers/openai/__init__.py | 16 +++
airflow/providers/openai/hooks/__init__.py | 16 +++
airflow/providers/openai/hooks/openai.py | 86 ++++++++++++++++
airflow/providers/openai/operators/__init__.py | 16 +++
airflow/providers/openai/operators/openai.py | 71 +++++++++++++
airflow/providers/openai/provider.yaml | 54 ++++++++++
docs/apache-airflow-providers-openai/changelog.rst | 18 ++++
docs/apache-airflow-providers-openai/commits.rst | 19 ++++
.../connections.rst | 37 +++++++
docs/apache-airflow-providers-openai/index.rst | 97 ++++++++++++++++++
.../installing-providers-from-sources.rst | 18 ++++
.../operators/openai.rst | 38 +++++++
docs/apache-airflow-providers-openai/security.rst | 38 +++++++
docs/apache-airflow/extra-packages-ref.rst | 2 +
docs/spelling_wordlist.txt | 1 +
generated/provider_dependencies.json | 8 ++
images/breeze/output-commands-hash.txt | 18 ++--
images/breeze/output_build-docs.svg | 8 +-
...tput_release-management_add-back-references.svg | 8 +-
...management_generate-issue-content-providers.svg | 6 +-
...e-management_prepare-provider-documentation.svg | 6 +-
...elease-management_prepare-provider-packages.svg | 6 +-
.../output_release-management_publish-docs.svg | 8 +-
...output_sbom_generate-providers-requirements.svg | 6 +-
tests/providers/openai/__init__.py | 16 +++
tests/providers/openai/hooks/__init__.py | 16 +++
tests/providers/openai/hooks/test_openai.py | 63 ++++++++++++
tests/providers/openai/operators/__init__.py | 16 +++
tests/providers/openai/operators/test_openai.py | 36 +++++++
tests/system/providers/openai/__init__.py | 16 +++
tests/system/providers/openai/example_openai.py | 110 +++++++++++++++++++++
35 files changed, 878 insertions(+), 43 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
index 94aa9d4960..f117380e72 100644
--- a/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/airflow_providers_bug_report.yml
@@ -82,6 +82,7 @@ body:
- odbc
- openfaas
- openlineage
+ - openai
- opensearch
- opsgenie
- oracle
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index a93d5308db..1ccc19e874 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -676,11 +676,11 @@ datadog, dbt.cloud, deprecated_api, devel, devel_all,
devel_ci, devel_hadoop, di
doc, doc_gen, docker, druid, elasticsearch, exasol, facebook, ftp, gcp,
gcp_api, github,
github_enterprise, google, google_auth, grpc, hashicorp, hdfs, hive, http,
imap, influxdb, jdbc,
jenkins, kerberos, kubernetes, ldap, leveldb, microsoft.azure,
microsoft.mssql, microsoft.psrp,
-microsoft.winrm, mongo, mssql, mysql, neo4j, odbc, openfaas, openlineage,
opensearch, opsgenie,
-oracle, otel, pagerduty, pandas, papermill, password, pgvector, pinecone,
pinot, plexus, postgres,
-presto, rabbitmq, redis, s3, s3fs, salesforce, samba, segment, sendgrid,
sentry, sftp, singularity,
-slack, smtp, snowflake, spark, sqlite, ssh, statsd, tableau, tabular,
telegram, trino, vertica,
-virtualenv, weaviate, webhdfs, winrm, yandex, zendesk
+microsoft.winrm, mongo, mssql, mysql, neo4j, odbc, openai, openfaas,
openlineage, opensearch,
+opsgenie, oracle, otel, pagerduty, pandas, papermill, password, pgvector,
pinecone, pinot, plexus,
+postgres, presto, rabbitmq, redis, s3, s3fs, salesforce, samba, segment,
sendgrid, sentry, sftp,
+singularity, slack, smtp, snowflake, spark, sqlite, ssh, statsd, tableau,
tabular, telegram, trino,
+vertica, virtualenv, weaviate, webhdfs, winrm, yandex, zendesk
.. END EXTRAS HERE
Provider packages
diff --git a/INSTALL b/INSTALL
index 9def10e09f..7742c006bc 100644
--- a/INSTALL
+++ b/INSTALL
@@ -103,11 +103,11 @@ datadog, dbt.cloud, deprecated_api, devel, devel_all,
devel_ci, devel_hadoop, di
doc, doc_gen, docker, druid, elasticsearch, exasol, facebook, ftp, gcp,
gcp_api, github,
github_enterprise, google, google_auth, grpc, hashicorp, hdfs, hive, http,
imap, influxdb, jdbc,
jenkins, kerberos, kubernetes, ldap, leveldb, microsoft.azure,
microsoft.mssql, microsoft.psrp,
-microsoft.winrm, mongo, mssql, mysql, neo4j, odbc, openfaas, openlineage,
opensearch, opsgenie,
-oracle, otel, pagerduty, pandas, papermill, password, pgvector, pinecone,
pinot, plexus, postgres,
-presto, rabbitmq, redis, s3, s3fs, salesforce, samba, segment, sendgrid,
sentry, sftp, singularity,
-slack, smtp, snowflake, spark, sqlite, ssh, statsd, tableau, tabular,
telegram, trino, vertica,
-virtualenv, weaviate, webhdfs, winrm, yandex, zendesk
+microsoft.winrm, mongo, mssql, mysql, neo4j, odbc, openai, openfaas,
openlineage, opensearch,
+opsgenie, oracle, otel, pagerduty, pandas, papermill, password, pgvector,
pinecone, pinot, plexus,
+postgres, presto, rabbitmq, redis, s3, s3fs, salesforce, samba, segment,
sendgrid, sentry, sftp,
+singularity, slack, smtp, snowflake, spark, sqlite, ssh, statsd, tableau,
tabular, telegram, trino,
+vertica, virtualenv, weaviate, webhdfs, winrm, yandex, zendesk
# END EXTRAS HERE
# For installing Airflow in development environments - see CONTRIBUTING.rst
diff --git a/airflow/providers/openai/CHANGELOG.rst
b/airflow/providers/openai/CHANGELOG.rst
new file mode 100644
index 0000000000..3a10e06641
--- /dev/null
+++ b/airflow/providers/openai/CHANGELOG.rst
@@ -0,0 +1,26 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF 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.
+
+``apache-airflow-providers-openai``
+
+Changelog
+---------
+
+1.0.0
+.....
+
+Initial version of the provider.
diff --git a/airflow/providers/openai/__init__.py
b/airflow/providers/openai/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/airflow/providers/openai/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
diff --git a/airflow/providers/openai/hooks/__init__.py
b/airflow/providers/openai/hooks/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/airflow/providers/openai/hooks/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
diff --git a/airflow/providers/openai/hooks/openai.py
b/airflow/providers/openai/hooks/openai.py
new file mode 100644
index 0000000000..ee21b5a3c3
--- /dev/null
+++ b/airflow/providers/openai/hooks/openai.py
@@ -0,0 +1,86 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
+
+from __future__ import annotations
+
+from typing import Any
+
+import openai
+
+from airflow.hooks.base import BaseHook
+
+
+class OpenAIHook(BaseHook):
+ """
+ Use OpenAI SDK to interact with OpenAI APIs.
+
+ .. seealso:: https://platform.openai.com/docs/introduction/overview
+
+ :param conn_id: :ref:`OpenAI connection id <howto/connection:openai>`
+ """
+
+ conn_name_attr = "conn_id"
+ default_conn_name = "openai_default"
+ conn_type = "openai"
+ hook_name = "OpenAI"
+
+ def __init__(self, conn_id: str = default_conn_name, *args: Any, **kwargs:
Any) -> None:
+ super().__init__(*args, **kwargs)
+ self.conn_id = conn_id
+ openai.api_key = self._get_api_key()
+ api_base = self._get_api_base()
+ if api_base:
+ openai.api_base = api_base
+
+ @staticmethod
+ def get_ui_field_behaviour() -> dict[str, Any]:
+ """Return custom field behaviour."""
+ return {
+ "hidden_fields": ["schema", "port", "login", "extra"],
+ "relabeling": {"password": "API Key"},
+ "placeholders": {},
+ }
+
+ def test_connection(self) -> tuple[bool, str]:
+ try:
+ openai.Model.list()
+ return True, "Connection established!"
+ except Exception as e:
+ return False, str(e)
+
+ def _get_api_key(self) -> str:
+ """Get the OpenAI API key from the connection."""
+ conn = self.get_connection(self.conn_id)
+ if not conn.password:
+ raise ValueError("OpenAI API key not found in connection")
+ return str(conn.password)
+
+ def _get_api_base(self) -> None | str:
+ conn = self.get_connection(self.conn_id)
+ return conn.host
+
+ def create_embeddings(
+ self, text: str | list[Any], model: str = "text-embedding-ada-002",
**kwargs: Any
+ ) -> list[float]:
+ """Generate embeddings for the given text using the given model.
+
+ :param text: The text to generate embeddings for.
+ :param model: The model to use for generating embeddings.
+ """
+ response = openai.Embedding.create(model=model, input=text, **kwargs)
+ embeddings: list[float] = response["data"][0]["embedding"]
+ return embeddings
diff --git a/airflow/providers/openai/operators/__init__.py
b/airflow/providers/openai/operators/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/airflow/providers/openai/operators/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
diff --git a/airflow/providers/openai/operators/openai.py
b/airflow/providers/openai/operators/openai.py
new file mode 100644
index 0000000000..1e585b5d0a
--- /dev/null
+++ b/airflow/providers/openai/operators/openai.py
@@ -0,0 +1,71 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
+
+from __future__ import annotations
+
+from functools import cached_property
+from typing import TYPE_CHECKING, Any, Sequence
+
+from airflow.models import BaseOperator
+from airflow.providers.openai.hooks.openai import OpenAIHook
+
+if TYPE_CHECKING:
+ from airflow.utils.context import Context
+
+
+class OpenAIEmbeddingOperator(BaseOperator):
+ """
+ Operator that accepts input text to generate OpenAI embeddings using the
specified model.
+
+ .. seealso::
+ For more information on how to use this operator, take a look at the
guide:
+ :ref:`howto/operator:OpenAIEmbeddingOperator`
+
+ :param conn_id: The OpenAI connection.
+ :param input_text: The text to generate OpenAI embeddings on. Either
input_text or input_callable
+ should be provided.
+ :param model: The OpenAI model to be used for generating the embeddings.
+ :param embedding_kwargs: For possible option check
+ .. seealso::
https://platform.openai.com/docs/api-reference/embeddings/create
+ """
+
+ template_fields: Sequence[str] = ("input_text",)
+
+ def __init__(
+ self,
+ conn_id: str,
+ input_text: str | list[Any],
+ model: str = "text-embedding-ada-002",
+ embedding_kwargs: dict | None = None,
+ **kwargs: Any,
+ ):
+ self.embedding_kwargs = embedding_kwargs or {}
+ super().__init__(**kwargs)
+ self.conn_id = conn_id
+ self.input_text = input_text
+ self.model = model
+
+ @cached_property
+ def hook(self) -> OpenAIHook:
+ """Return an instance of the OpenAIHook."""
+ return OpenAIHook(conn_id=self.conn_id)
+
+ def execute(self, context: Context) -> list[float]:
+ self.log.info("Input text: %s", self.input_text)
+ embeddings = self.hook.create_embeddings(self.input_text,
model=self.model, **self.embedding_kwargs)
+ self.log.info("Embeddings: %s", embeddings)
+ return embeddings
diff --git a/airflow/providers/openai/provider.yaml
b/airflow/providers/openai/provider.yaml
new file mode 100644
index 0000000000..ffb07de7bb
--- /dev/null
+++ b/airflow/providers/openai/provider.yaml
@@ -0,0 +1,54 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
+
+---
+package-name: apache-airflow-providers-openai
+
+name: OpenAI
+
+description: |
+ `OpenAI <https://platform.openai.com/docs/introduction>`__
+
+suspended: false
+
+versions:
+ - 1.0.0
+
+integrations:
+ - integration-name: OpenAI
+ external-doc-url: https://platform.openai.com/docs/introduction
+ how-to-guide:
+ - /docs/apache-airflow-providers-openai/operators/openai.rst
+ tags: [software]
+
+dependencies:
+ - apache-airflow>=2.5.0
+ - openai[datalib]>=0.28.1,<1.0
+
+hooks:
+ - integration-name: OpenAI
+ python-modules:
+ - airflow.providers.openai.hooks.openai
+
+operators:
+ - integration-name: OpenAI
+ python-modules:
+ - airflow.providers.openai.operators.openai
+
+connection-types:
+ - hook-class-name: airflow.providers.openai.hooks.openai.OpenAIHook
+ connection-type: openai
diff --git a/docs/apache-airflow-providers-openai/changelog.rst
b/docs/apache-airflow-providers-openai/changelog.rst
new file mode 100644
index 0000000000..6dac5e89f6
--- /dev/null
+++ b/docs/apache-airflow-providers-openai/changelog.rst
@@ -0,0 +1,18 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF 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.
+
+.. include:: ../../airflow/providers/odbc/CHANGELOG.rst
diff --git a/docs/apache-airflow-providers-openai/commits.rst
b/docs/apache-airflow-providers-openai/commits.rst
new file mode 100644
index 0000000000..65a96ff284
--- /dev/null
+++ b/docs/apache-airflow-providers-openai/commits.rst
@@ -0,0 +1,19 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF 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.
+
+Package apache-airflow-providers-openai
+----------------------------------------
diff --git a/docs/apache-airflow-providers-openai/connections.rst
b/docs/apache-airflow-providers-openai/connections.rst
new file mode 100644
index 0000000000..88e79df59d
--- /dev/null
+++ b/docs/apache-airflow-providers-openai/connections.rst
@@ -0,0 +1,37 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF 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.
+
+.. _howto/connection:openai:
+
+OpenAI Connection
+=================
+
+The `OpenAI <https://openai.com/>`__ connection type enables access to OpenAI
APIs.
+
+Default Connection IDs
+----------------------
+
+OpenAI hook points to ``openai_default`` connection by default.
+
+Configuring the Connection
+--------------------------
+
+API Key (required)
+ Specify your OpenAI API Key to connect.
+
+Host (optional)
+ The host address of the OpenAI instance.
diff --git a/docs/apache-airflow-providers-openai/index.rst
b/docs/apache-airflow-providers-openai/index.rst
new file mode 100644
index 0000000000..deb07c0626
--- /dev/null
+++ b/docs/apache-airflow-providers-openai/index.rst
@@ -0,0 +1,97 @@
+
+.. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF 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.
+
+``apache-airflow-providers-openai``
+======================================
+
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Basics
+
+ Home <self>
+ Changelog <changelog>
+ Security <security>
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Guides
+
+ Connection types <connections>
+ Operators <operators/openai>
+
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Resources
+
+ Python API <_api/airflow/providers/openai/index>
+ PyPI Repository <https://pypi.org/project/apache-airflow-providers-openai/>
+ Installing from sources <installing-providers-from-sources>
+
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: System tests
+
+ System Tests <_api/tests/system/providers/openai/index>
+
+Package apache-airflow-providers-openai
+-----------------------------------------
+
+`Open AI <https://platform.openai.com/docs/api-reference/>`__
+
+
+Release: 1.0.0
+
+Provider package
+----------------
+
+This is a provider package for ``Open AI`` APIs. All classes for this provider
package
+are in ``airflow.providers.openai`` python module.
+
+Installation
+------------
+
+You can install this package on top of an existing Airflow 2 installation (see
``Requirements`` below)
+for the minimum Airflow version supported) via
+``pip install apache-airflow-providers-openai``
+
+
+Requirements
+------------
+
+The minimum Apache Airflow version supported by this provider package is
``2.5.0``.
+
+=================== ==================
+PIP package Version required
+=================== ==================
+``apache-airflow`` ``>=2.5.0``
+``openai[datalib]`` ``>=0.28.1,<1.0``
+=================== ==================
+
+.. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE
OVERWRITTEN AT RELEASE TIME!
+.. toctree::
+ :hidden:
+ :maxdepth: 1
+ :caption: Commits
+
+ Detailed list of commits <commits>
diff --git
a/docs/apache-airflow-providers-openai/installing-providers-from-sources.rst
b/docs/apache-airflow-providers-openai/installing-providers-from-sources.rst
new file mode 100644
index 0000000000..b4e730f4ff
--- /dev/null
+++ b/docs/apache-airflow-providers-openai/installing-providers-from-sources.rst
@@ -0,0 +1,18 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF 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.
+
+.. include:: ../exts/includes/installing-providers-from-sources.rst
diff --git a/docs/apache-airflow-providers-openai/operators/openai.rst
b/docs/apache-airflow-providers-openai/operators/openai.rst
new file mode 100644
index 0000000000..e3f4f4d403
--- /dev/null
+++ b/docs/apache-airflow-providers-openai/operators/openai.rst
@@ -0,0 +1,38 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF 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.
+
+.. _howto/operator:OpenAIEmbeddingOperator:
+
+OpenAIEmbeddingOperator
+========================
+
+Use the
:class:`~airflow.providers.open_ai.operators.open_ai.OpenAIEmbeddingOperator` to
+interact with Open APIs to create embeddings for given text.
+
+
+Using the Operator
+^^^^^^^^^^^^^^^^^^
+
+The OpenAIEmbeddingOperator requires the ``input_text`` as an input to
embedding API. Use the ``conn_id`` parameter to specify the OpenAI connection
to use to
+connect to your account.
+
+An example using the operator is in way:
+
+.. exampleinclude:: /../../tests/system/providers/openai/example_openai.py
+ :language: python
+ :start-after: [START howto_operator_openai_embedding]
+ :end-before: [END howto_operator_openai_embedding]
diff --git a/docs/apache-airflow-providers-openai/security.rst
b/docs/apache-airflow-providers-openai/security.rst
new file mode 100644
index 0000000000..66c6f79a4e
--- /dev/null
+++ b/docs/apache-airflow-providers-openai/security.rst
@@ -0,0 +1,38 @@
+
+ .. Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF 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.
+
+Releasing security patches
+--------------------------
+
+Airflow providers are released independently from Airflow itself and the
information about vulnerabilities
+is published separately. You can upgrade providers independently from Airflow
itself, following the
+instructions found in :doc:`apache-airflow:installation/installing-from-pypi`.
+
+When we release Provider version, the development is always done from the
``main`` branch where we prepare
+the next version. The provider uses strict `SemVer <https://semver.org>`_
versioning policy. Depending on
+the scope of the change, Provider will get ''MAJOR'' version upgrade when
there are
+breaking changes, ``MINOR`` version upgrade when there are new features or
``PATCHLEVEL`` version upgrade
+when there are only bug fixes (including security bugfixes) - and this is the
only version that receives
+security fixes by default, so you should upgrade to latest version of the
provider if you want to receive
+all released security fixes.
+
+The only exception to that rule is when we have a critical security fix and
good reason to provide an
+out-of-band release for the provider, in which case stakeholders in the
provider might decide to cherry-pick
+and prepare a branch for an older version of the provider following the
+`mixed governance model
<https://github.com/apache/airflow/blob/main/PROVIDERS.rst#mixed-governance-model>`_
+and requires interested parties to cherry-pick and test the fixes.
diff --git a/docs/apache-airflow/extra-packages-ref.rst
b/docs/apache-airflow/extra-packages-ref.rst
index 39e72df00d..050781dc92 100644
--- a/docs/apache-airflow/extra-packages-ref.rst
+++ b/docs/apache-airflow/extra-packages-ref.rst
@@ -192,6 +192,8 @@ These are extras that add dependencies needed for
integration with external serv
+---------------------+-----------------------------------------------------+-----------------------------------------------------+
| hashicorp | ``pip install 'apache-airflow[hashicorp]'`` |
Hashicorp Services (Vault) |
+---------------------+-----------------------------------------------------+-----------------------------------------------------+
+| openai | ``pip install 'apache-airflow[openai]'`` |
Open AI hooks and operators |
++---------------------+-----------------------------------------------------+-----------------------------------------------------+
| opsgenie | ``pip install 'apache-airflow[opsgenie]'`` |
OpsGenie hooks and operators |
+---------------------+-----------------------------------------------------+-----------------------------------------------------+
| pagerduty | ``pip install 'apache-airflow[pagerduty]'`` |
Pagerduty hook |
diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt
index 85af5b4d32..04efc4813b 100644
--- a/docs/spelling_wordlist.txt
+++ b/docs/spelling_wordlist.txt
@@ -1073,6 +1073,7 @@ onboarded
OnFailure
onkill
Oozie
+openai
openapi
openfaas
openlineage
diff --git a/generated/provider_dependencies.json
b/generated/provider_dependencies.json
index c26ad94147..67eb9f95a2 100644
--- a/generated/provider_dependencies.json
+++ b/generated/provider_dependencies.json
@@ -666,6 +666,14 @@
],
"excluded-python-versions": []
},
+ "openai": {
+ "deps": [
+ "apache-airflow>=2.5.0",
+ "openai[datalib]>=0.28.1,<1.0"
+ ],
+ "cross-providers-deps": [],
+ "excluded-python-versions": []
+ },
"openfaas": {
"deps": [
"apache-airflow>=2.5.0"
diff --git a/images/breeze/output-commands-hash.txt
b/images/breeze/output-commands-hash.txt
index 72774a5f59..c287c24c4b 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -2,7 +2,7 @@
# Please do not solve it but run `breeze setup regenerate-command-images`.
# This command should fix the conflict and regenerate help images that you
have conflict with.
main:96b4884054753db922cb8ca2cc555368
-build-docs:a041793f07803437dd897c45b1efdbbd
+build-docs:2ff0e1725d71f0b16244507483a43d52
ci:find-backtracking-candidates:17fe56b867a745e5032a08dfcd3f73ee
ci:fix-ownership:3e5a73533cc96045e72cb258783cfc96
ci:free-space:49af17b032039c05c41a7a8283f365cc
@@ -36,26 +36,26 @@ prod-image:build:1628f7bff3e7e369f0358a646682e674
prod-image:pull:3817ef211b023b76df84ee1110ef64dd
prod-image:verify:bd2b78738a7c388dbad6076c41a9f906
prod-image:6011405076eb0e1049d87e971e3adce1
-release-management:add-back-references:b5c5b691d919decea4f14525e7b7c13b
+release-management:add-back-references:824cb5a426c88b262c357d8b20b06bb9
release-management:create-minor-branch:a3834afc4aa5d1e98002c9e9e7a9931d
release-management:generate-constraints:01aef235b11e59ed7f10c970a5cdaba7
-release-management:generate-issue-content-providers:9f2fe4418c50253d4280408168a393ee
+release-management:generate-issue-content-providers:54d7c46992d256b87227cea87ef73ab0
release-management:generate-providers-metadata:d4e8e5cfaa024e3963af02d7a873048d
release-management:install-provider-packages:34c38aca17d23dbb454fe7a6bfd8e630
release-management:prepare-airflow-package:85d01c57e5b5ee0fb9e5f9d9706ed3b5
-release-management:prepare-provider-documentation:b829c39027e2868dba2381c5eabee3aa
-release-management:prepare-provider-packages:8293366ce313008003b44887551156aa
-release-management:publish-docs:21ac1b87f871312a432b63b8fd847d94
+release-management:prepare-provider-documentation:519f830d76013ca5313e72eecea24421
+release-management:prepare-provider-packages:d3fb4f06f7b67f9824abdebc52ef561b
+release-management:publish-docs:be9b9b57777c23a8bb5fe59860c8d18c
release-management:release-prod-images:cfbfe8b19fee91fd90718f98ef2fd078
release-management:start-rc-process:b27bd524dd3c89f50a747b60a7e892c1
release-management:start-release:419f48f6a4ff4457cb9de7ff496aebbe
release-management:update-constraints:02ec4b119150e3fdbac52026e94820ef
release-management:verify-provider-packages:96dce5644aad6b37080acf77b3d8de3a
-release-management:dcc55e19d3cf3065be31a45a8400849e
+release-management:1b0ee6fcf999ed59408e1a294889eb86
sbom:build-all-airflow-images:32f8acade299c2b112e986bae99846db
-sbom:generate-providers-requirements:bfafb5707aec6abc3b5528dd1a04d35b
+sbom:generate-providers-requirements:344968a060e00ace19738cca47d70641
sbom:update-sbom-information:653be48be70b4b7ff5172d491aadc694
-sbom:79bb821663107dd83dcab6b672dd896f
+sbom:5592e8be9f804dc136f1930ec4ee67c2
setup:autocomplete:fffcd49e102e09ccd69b3841a9e3ea8e
setup:check-all-params-in-groups:5c5e3c382fc8ce84899d224448b3f48a
setup:config:3435f1f1535a82c30591dbf577294d2e
diff --git a/images/breeze/output_build-docs.svg
b/images/breeze/output_build-docs.svg
index 7b7ca19fc9..5c0842af27 100644
--- a/images/breeze/output_build-docs.svg
+++ b/images/breeze/output_build-docs.svg
@@ -166,10 +166,10 @@
</text><text class="breeze-build-docs-r4" x="12.2" y="166.4" textLength="85.4"
clip-path="url(#breeze-build-docs-line-6)">apprise</text><text
class="breeze-build-docs-r1" x="97.6" y="166.4" textLength="36.6"
clip-path="url(#breeze-build-docs-line-6)"> | </text><text
class="breeze-build-docs-r4" x="134.2" y="166.4" textLength="97.6"
clip-path="url(#breeze-build-docs-line-6)">arangodb</text><text
class="breeze-build-docs-r1" x="231.8" y="166.4" textLength="36.6"
clip-path="url(#b [...]
</text><text class="breeze-build-docs-r4" x="12.2" y="190.8"
textLength="146.4"
clip-path="url(#breeze-build-docs-line-7)">daskexecutor</text><text
class="breeze-build-docs-r1" x="158.6" y="190.8" textLength="36.6"
clip-path="url(#breeze-build-docs-line-7)"> | </text><text
class="breeze-build-docs-r4" x="195.2" y="190.8" textLength="122"
clip-path="url(#breeze-build-docs-line-7)">databricks</text><text
class="breeze-build-docs-r1" x="317.2" y="190.8" textLength="36.6" clip-path
[...]
</text><text class="breeze-build-docs-r4" x="12.2" y="215.2" textLength="36.6"
clip-path="url(#breeze-build-docs-line-8)">ftp</text><text
class="breeze-build-docs-r1" x="48.8" y="215.2" textLength="36.6"
clip-path="url(#breeze-build-docs-line-8)"> | </text><text
class="breeze-build-docs-r4" x="85.4" y="215.2" textLength="73.2"
clip-path="url(#breeze-build-docs-line-8)">github</text><text
class="breeze-build-docs-r1" x="158.6" y="215.2" textLength="36.6"
clip-path="url(#breeze-b [...]
-</text><text class="breeze-build-docs-r1" x="12.2" y="239.6" textLength="24.4"
clip-path="url(#breeze-build-docs-line-9)">| </text><text
class="breeze-build-docs-r4" x="36.6" y="239.6" textLength="109.8"
clip-path="url(#breeze-build-docs-line-9)">microsoft</text><text
class="breeze-build-docs-r1" x="146.4" y="239.6" textLength="12.2"
clip-path="url(#breeze-build-docs-line-9)">.</text><text
class="breeze-build-docs-r4" x="158.6" y="239.6" textLength="48.8"
clip-path="url(#breeze-buil [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="264" textLength="73.2"
clip-path="url(#breeze-build-docs-line-10)">oracle</text><text
class="breeze-build-docs-r1" x="85.4" y="264" textLength="36.6"
clip-path="url(#breeze-build-docs-line-10)"> | </text><text
class="breeze-build-docs-r4" x="122" y="264" textLength="109.8"
clip-path="url(#breeze-build-docs-line-10)">pagerduty</text><text
class="breeze-build-docs-r1" x="231.8" y="264" textLength="36.6"
clip-path="url(#breeze- [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="288.4" textLength="85.4"
clip-path="url(#breeze-build-docs-line-11)">segment</text><text
class="breeze-build-docs-r1" x="97.6" y="288.4" textLength="36.6"
clip-path="url(#breeze-build-docs-line-11)"> | </text><text
class="breeze-build-docs-r4" x="134.2" y="288.4" textLength="97.6"
clip-path="url(#breeze-build-docs-line-11)">sendgrid</text><text
class="breeze-build-docs-r1" x="231.8" y="288.4" textLength="36.6"
clip-path="url [...]
-</text><text class="breeze-build-docs-r4" x="12.2" y="312.8" textLength="61"
clip-path="url(#breeze-build-docs-line-12)">trino</text><text
class="breeze-build-docs-r1" x="73.2" y="312.8" textLength="36.6"
clip-path="url(#breeze-build-docs-line-12)"> | </text><text
class="breeze-build-docs-r4" x="109.8" y="312.8" textLength="85.4"
clip-path="url(#breeze-build-docs-line-12)">vertica</text><text
class="breeze-build-docs-r1" x="195.2" y="312.8" textLength="36.6"
clip-path="url(#bre [...]
+</text><text class="breeze-build-docs-r1" x="12.2" y="239.6" textLength="24.4"
clip-path="url(#breeze-build-docs-line-9)">| </text><text
class="breeze-build-docs-r4" x="36.6" y="239.6" textLength="109.8"
clip-path="url(#breeze-build-docs-line-9)">microsoft</text><text
class="breeze-build-docs-r1" x="146.4" y="239.6" textLength="12.2"
clip-path="url(#breeze-build-docs-line-9)">.</text><text
class="breeze-build-docs-r4" x="158.6" y="239.6" textLength="48.8"
clip-path="url(#breeze-buil [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="264" textLength="97.6"
clip-path="url(#breeze-build-docs-line-10)">opsgenie</text><text
class="breeze-build-docs-r1" x="109.8" y="264" textLength="36.6"
clip-path="url(#breeze-build-docs-line-10)"> | </text><text
class="breeze-build-docs-r4" x="146.4" y="264" textLength="73.2"
clip-path="url(#breeze-build-docs-line-10)">oracle</text><text
class="breeze-build-docs-r1" x="219.6" y="264" textLength="36.6"
clip-path="url(#breeze [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="288.4" textLength="61"
clip-path="url(#breeze-build-docs-line-11)">samba</text><text
class="breeze-build-docs-r1" x="73.2" y="288.4" textLength="36.6"
clip-path="url(#breeze-build-docs-line-11)"> | </text><text
class="breeze-build-docs-r4" x="109.8" y="288.4" textLength="85.4"
clip-path="url(#breeze-build-docs-line-11)">segment</text><text
class="breeze-build-docs-r1" x="195.2" y="288.4" textLength="36.6"
clip-path="url(#bre [...]
+</text><text class="breeze-build-docs-r4" x="12.2" y="312.8" textLength="97.6"
clip-path="url(#breeze-build-docs-line-12)">telegram</text><text
class="breeze-build-docs-r1" x="109.8" y="312.8" textLength="36.6"
clip-path="url(#breeze-build-docs-line-12)"> | </text><text
class="breeze-build-docs-r4" x="146.4" y="312.8" textLength="61"
clip-path="url(#breeze-build-docs-line-12)">trino</text><text
class="breeze-build-docs-r1" x="207.4" y="312.8" textLength="36.6"
clip-path="url(#b [...]
</text><text class="breeze-build-docs-r1" x="1464" y="337.2" textLength="12.2"
clip-path="url(#breeze-build-docs-line-13)">
</text><text class="breeze-build-docs-r1" x="12.2" y="361.6"
textLength="195.2"
clip-path="url(#breeze-build-docs-line-14)">Build documents.</text><text
class="breeze-build-docs-r1" x="1464" y="361.6" textLength="12.2"
clip-path="url(#breeze-build-docs-line-14)">
</text><text class="breeze-build-docs-r1" x="1464" y="386" textLength="12.2"
clip-path="url(#breeze-build-docs-line-15)">
diff --git a/images/breeze/output_release-management_add-back-references.svg
b/images/breeze/output_release-management_add-back-references.svg
index b7ad090ef3..fd81dfd784 100644
--- a/images/breeze/output_release-management_add-back-references.svg
+++ b/images/breeze/output_release-management_add-back-references.svg
@@ -137,10 +137,10 @@
</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="166.4" textLength="97.6"
clip-path="url(#breeze-release-management-add-back-references-line-6)">arangodb</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="166.4"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-6)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="146.4" y="166.4"
textLength="61" clip-pat [...]
</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="190.8" textLength="146.4"
clip-path="url(#breeze-release-management-add-back-references-line-7)">daskexecutor</text><text
class="breeze-release-management-add-back-references-r1" x="158.6" y="190.8"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-7)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="195.2" y="190.8"
textLength="122" cl [...]
</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="215.2" textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-8)">ftp</text><text
class="breeze-release-management-add-back-references-r1" x="48.8" y="215.2"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-8)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="85.4" y="215.2"
textLength="73.2" clip-path="ur [...]
-</text><text class="breeze-release-management-add-back-references-r1" x="12.2"
y="239.6" textLength="24.4"
clip-path="url(#breeze-release-management-add-back-references-line-9)">| </text><text
class="breeze-release-management-add-back-references-r4" x="36.6" y="239.6"
textLength="109.8"
clip-path="url(#breeze-release-management-add-back-references-line-9)">microsoft</text><text
class="breeze-release-management-add-back-references-r1" x="146.4" y="239.6"
textLength="12.2" clip-path=" [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="264" textLength="73.2"
clip-path="url(#breeze-release-management-add-back-references-line-10)">oracle</text><text
class="breeze-release-management-add-back-references-r1" x="85.4" y="264"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-10)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="122" y="264"
textLength="109.8" clip-path="url [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="288.4" textLength="85.4"
clip-path="url(#breeze-release-management-add-back-references-line-11)">segment</text><text
class="breeze-release-management-add-back-references-r1" x="97.6" y="288.4"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-11)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="134.2" y="288.4"
textLength="97.6" clip-p [...]
-</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="312.8" textLength="61"
clip-path="url(#breeze-release-management-add-back-references-line-12)">trino</text><text
class="breeze-release-management-add-back-references-r1" x="73.2" y="312.8"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-12)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="109.8" y="312.8"
textLength="85.4" clip-path= [...]
+</text><text class="breeze-release-management-add-back-references-r1" x="12.2"
y="239.6" textLength="24.4"
clip-path="url(#breeze-release-management-add-back-references-line-9)">| </text><text
class="breeze-release-management-add-back-references-r4" x="36.6" y="239.6"
textLength="109.8"
clip-path="url(#breeze-release-management-add-back-references-line-9)">microsoft</text><text
class="breeze-release-management-add-back-references-r1" x="146.4" y="239.6"
textLength="12.2" clip-path=" [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="264" textLength="97.6"
clip-path="url(#breeze-release-management-add-back-references-line-10)">opsgenie</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="264"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-10)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="146.4" y="264"
textLength="73.2" clip-path= [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="288.4" textLength="61"
clip-path="url(#breeze-release-management-add-back-references-line-11)">samba</text><text
class="breeze-release-management-add-back-references-r1" x="73.2" y="288.4"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-11)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="109.8" y="288.4"
textLength="85.4" clip-path= [...]
+</text><text class="breeze-release-management-add-back-references-r4" x="12.2"
y="312.8" textLength="97.6"
clip-path="url(#breeze-release-management-add-back-references-line-12)">telegram</text><text
class="breeze-release-management-add-back-references-r1" x="109.8" y="312.8"
textLength="36.6"
clip-path="url(#breeze-release-management-add-back-references-line-12)"> | </text><text
class="breeze-release-management-add-back-references-r4" x="146.4" y="312.8"
textLength="61" clip-p [...]
</text><text class="breeze-release-management-add-back-references-r1" x="1464"
y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-13)">
</text><text class="breeze-release-management-add-back-references-r1" x="12.2"
y="361.6" textLength="976"
clip-path="url(#breeze-release-management-add-back-references-line-14)">Command to add back references for documentation to make it backward compatible.</text><text
class="breeze-release-management-add-back-references-r1" x="1464" y="361.6"
textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-14)">
</text><text class="breeze-release-management-add-back-references-r1" x="1464"
y="386" textLength="12.2"
clip-path="url(#breeze-release-management-add-back-references-line-15)">
diff --git
a/images/breeze/output_release-management_generate-issue-content-providers.svg
b/images/breeze/output_release-management_generate-issue-content-providers.svg
index 5236c2c877..00bae5b47b 100644
---
a/images/breeze/output_release-management_generate-issue-content-providers.svg
+++
b/images/breeze/output_release-management_generate-issue-content-providers.svg
@@ -150,9 +150,9 @@
</text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="12.2"
y="166.4" textLength="73.2"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-6)">celery</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="85.4"
y="166.4" textLength="36.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-6)"> | </text><text
class="breeze-release-management-generate-issue-cont [...]
</text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="12.2"
y="190.8" textLength="36.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-7)">dbt</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="48.8"
y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-7)">.</text><text
class="breeze-release-management-generate-issue-content-providers-r [...]
</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="12.2"
y="215.2" textLength="24.4"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-8)">| </text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="36.6"
y="215.2" textLength="48.8"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-8)">http</text><text
class="breeze-release-management-generate-issue-content-prov [...]
-</text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="12.2"
y="239.6" textLength="61"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)">mongo</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="73.2"
y="239.6" textLength="36.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)"> | </text><text
class="breeze-release-management-generate-issue-content [...]
-</text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="12.2"
y="264" textLength="97.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)">pgvector</text><text
class="breeze-release-management-generate-issue-content-providers-r1"
x="109.8" y="264" textLength="36.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)"> | </text><text
class="breeze-release-management-generate-issue-con [...]
-</text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="12.2"
y="288.4" textLength="134.2"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">singularity</text><text
class="breeze-release-management-generate-issue-content-providers-r1"
x="146.4" y="288.4" textLength="36.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)"> | </text><text
class="breeze-release-management-generate-i [...]
+</text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="12.2"
y="239.6" textLength="61"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)">mongo</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="73.2"
y="239.6" textLength="36.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-9)"> | </text><text
class="breeze-release-management-generate-issue-content [...]
+</text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="12.2"
y="264" textLength="109.8"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)">papermill</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="122"
y="264" textLength="36.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-10)"> | </text><text
class="breeze-release-management-generate-issue-con [...]
+</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="12.2"
y="288.4" textLength="24.4"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">| </text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="36.6"
y="288.4" textLength="134.2"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-11)">singularity</text><text
class="breeze-release-management-generate-issue-co [...]
</text><text
class="breeze-release-management-generate-issue-content-providers-r4" x="12.2"
y="312.8" textLength="73.2"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-12)">yandex</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="85.4"
y="312.8" textLength="36.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-12)"> | </text><text
class="breeze-release-management-generate-issue-co [...]
</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="1464"
y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-13)">
</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="12.2"
y="361.6" textLength="585.6"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-14)">Generates content for issue to test the release.</text><text
class="breeze-release-management-generate-issue-content-providers-r1" x="1464"
y="361.6" textLength="12.2"
clip-path="url(#breeze-release-management-generate-issue-content-providers-line-14)">
diff --git
a/images/breeze/output_release-management_prepare-provider-documentation.svg
b/images/breeze/output_release-management_prepare-provider-documentation.svg
index f53d968460..15dbe6fcb5 100644
--- a/images/breeze/output_release-management_prepare-provider-documentation.svg
+++ b/images/breeze/output_release-management_prepare-provider-documentation.svg
@@ -162,9 +162,9 @@
</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="12.2"
y="166.4" textLength="73.2"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-6)">celery</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="85.4"
y="166.4" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-6)"> | </text><text
class="breeze-release-management-prepare-provider-documentat [...]
</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="12.2"
y="190.8" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-7)">dbt</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="48.8"
y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-7)">.</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="61"
[...]
</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="12.2"
y="215.2" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-8)">| </text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="36.6"
y="215.2" textLength="48.8"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-8)">http</text><text
class="breeze-release-management-prepare-provider-documentation-r1" [...]
-</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="12.2"
y="239.6" textLength="61"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)">mongo</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="73.2"
y="239.6" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)"> | </text><text
class="breeze-release-management-prepare-provider-documentation [...]
-</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="12.2"
y="264" textLength="97.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)">pgvector</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="109.8"
y="264" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)"> | </text><text
class="breeze-release-management-prepare-provider-documenta [...]
-</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="12.2"
y="288.4" textLength="134.2"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">singularity</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="146.4"
y="288.4" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)"> | </text><text
class="breeze-release-management-prepare-provider-d [...]
+</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="12.2"
y="239.6" textLength="61"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)">mongo</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="73.2"
y="239.6" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-9)"> | </text><text
class="breeze-release-management-prepare-provider-documentation [...]
+</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="12.2"
y="264" textLength="109.8"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)">papermill</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="122"
y="264" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-10)"> | </text><text
class="breeze-release-management-prepare-provider-documenta [...]
+</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="12.2"
y="288.4" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">| </text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="36.6"
y="288.4" textLength="134.2"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-11)">singularity</text><text
class="breeze-release-management-prepare-provider-document [...]
</text><text
class="breeze-release-management-prepare-provider-documentation-r4" x="12.2"
y="312.8" textLength="73.2"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-12)">yandex</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="85.4"
y="312.8" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-12)"> | </text><text
class="breeze-release-management-prepare-provider-document [...]
</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="1464"
y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-13)">
</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="12.2"
y="361.6" textLength="780.8"
clip-path="url(#breeze-release-management-prepare-provider-documentation-line-14)">Prepare CHANGELOG, README and COMMITS information for providers.</text><text
class="breeze-release-management-prepare-provider-documentation-r1" x="1464"
y="361.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-provider-documentation- [...]
diff --git
a/images/breeze/output_release-management_prepare-provider-packages.svg
b/images/breeze/output_release-management_prepare-provider-packages.svg
index bf8ec7be39..31c6aa0c81 100644
--- a/images/breeze/output_release-management_prepare-provider-packages.svg
+++ b/images/breeze/output_release-management_prepare-provider-packages.svg
@@ -147,9 +147,9 @@
</text><text class="breeze-release-management-prepare-provider-packages-r4"
x="12.2" y="166.4" textLength="73.2"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-6)">celery</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="85.4"
y="166.4" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-6)"> | </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="122"
y="166.4" [...]
</text><text class="breeze-release-management-prepare-provider-packages-r4"
x="12.2" y="190.8" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-7)">dbt</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="48.8"
y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-7)">.</text><text
class="breeze-release-management-prepare-provider-packages-r4" x="61"
y="190.8" textLength="61" [...]
</text><text class="breeze-release-management-prepare-provider-packages-r1"
x="12.2" y="215.2" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-8)">| </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="36.6"
y="215.2" textLength="48.8"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-8)">http</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="85.4"
y="215.2" textLe [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r4"
x="12.2" y="239.6" textLength="61"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)">mongo</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="73.2"
y="239.6" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)"> | </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="109.8"
y="239.6" [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r4"
x="12.2" y="264" textLength="97.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)">pgvector</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="109.8"
y="264" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)"> | </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="146.4"
y="264 [...]
-</text><text class="breeze-release-management-prepare-provider-packages-r4"
x="12.2" y="288.4" textLength="134.2"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">singularity</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="146.4"
y="288.4" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)"> | </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="183" [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r4"
x="12.2" y="239.6" textLength="61"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)">mongo</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="73.2"
y="239.6" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-9)"> | </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="109.8"
y="239.6" [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r4"
x="12.2" y="264" textLength="109.8"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)">papermill</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="122" y="264"
textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-10)"> | </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="158.6"
y="264 [...]
+</text><text class="breeze-release-management-prepare-provider-packages-r1"
x="12.2" y="288.4" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">| </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="36.6"
y="288.4" textLength="134.2"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-11)">singularity</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="170.8" y="28
[...]
</text><text class="breeze-release-management-prepare-provider-packages-r4"
x="12.2" y="312.8" textLength="73.2"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-12)">yandex</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="85.4"
y="312.8" textLength="36.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-12)"> | </text><text
class="breeze-release-management-prepare-provider-packages-r4" x="122" y="312.
[...]
</text><text class="breeze-release-management-prepare-provider-packages-r1"
x="1464" y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-13)">
</text><text class="breeze-release-management-prepare-provider-packages-r1"
x="12.2" y="361.6" textLength="585.6"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-14)">Prepare sdist/whl packages of Airflow Providers.</text><text
class="breeze-release-management-prepare-provider-packages-r1" x="1464"
y="361.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-provider-packages-line-14)">
diff --git a/images/breeze/output_release-management_publish-docs.svg
b/images/breeze/output_release-management_publish-docs.svg
index 99d25657d4..6c95a24c97 100644
--- a/images/breeze/output_release-management_publish-docs.svg
+++ b/images/breeze/output_release-management_publish-docs.svg
@@ -183,10 +183,10 @@
</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="166.4" textLength="85.4"
clip-path="url(#breeze-release-management-publish-docs-line-6)">apprise</text><text
class="breeze-release-management-publish-docs-r1" x="97.6" y="166.4"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-6)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="134.2" y="166.4"
textLength="97.6" clip-path="url(#breeze-release-management-p [...]
</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="190.8" textLength="146.4"
clip-path="url(#breeze-release-management-publish-docs-line-7)">daskexecutor</text><text
class="breeze-release-management-publish-docs-r1" x="158.6" y="190.8"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-7)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="195.2" y="190.8"
textLength="122" clip-path="url(#breeze-release-manage [...]
</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="215.2" textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-8)">ftp</text><text
class="breeze-release-management-publish-docs-r1" x="48.8" y="215.2"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-8)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="85.4" y="215.2"
textLength="73.2" clip-path="url(#breeze-release-management-publis [...]
-</text><text class="breeze-release-management-publish-docs-r1" x="12.2"
y="239.6" textLength="24.4"
clip-path="url(#breeze-release-management-publish-docs-line-9)">| </text><text
class="breeze-release-management-publish-docs-r4" x="36.6" y="239.6"
textLength="109.8"
clip-path="url(#breeze-release-management-publish-docs-line-9)">microsoft</text><text
class="breeze-release-management-publish-docs-r1" x="146.4" y="239.6"
textLength="12.2" clip-path="url(#breeze-release-management-publ [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="264" textLength="73.2"
clip-path="url(#breeze-release-management-publish-docs-line-10)">oracle</text><text
class="breeze-release-management-publish-docs-r1" x="85.4" y="264"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-10)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="122" y="264"
textLength="109.8" clip-path="url(#breeze-release-management-publish [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="288.4" textLength="85.4"
clip-path="url(#breeze-release-management-publish-docs-line-11)">segment</text><text
class="breeze-release-management-publish-docs-r1" x="97.6" y="288.4"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-11)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="134.2" y="288.4"
textLength="97.6" clip-path="url(#breeze-release-management [...]
-</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="312.8" textLength="61"
clip-path="url(#breeze-release-management-publish-docs-line-12)">trino</text><text
class="breeze-release-management-publish-docs-r1" x="73.2" y="312.8"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-12)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="109.8" y="312.8"
textLength="85.4" clip-path="url(#breeze-release-management-pub [...]
+</text><text class="breeze-release-management-publish-docs-r1" x="12.2"
y="239.6" textLength="24.4"
clip-path="url(#breeze-release-management-publish-docs-line-9)">| </text><text
class="breeze-release-management-publish-docs-r4" x="36.6" y="239.6"
textLength="109.8"
clip-path="url(#breeze-release-management-publish-docs-line-9)">microsoft</text><text
class="breeze-release-management-publish-docs-r1" x="146.4" y="239.6"
textLength="12.2" clip-path="url(#breeze-release-management-publ [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="264" textLength="97.6"
clip-path="url(#breeze-release-management-publish-docs-line-10)">opsgenie</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="264"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-10)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="146.4" y="264"
textLength="73.2" clip-path="url(#breeze-release-management-pub [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="288.4" textLength="61"
clip-path="url(#breeze-release-management-publish-docs-line-11)">samba</text><text
class="breeze-release-management-publish-docs-r1" x="73.2" y="288.4"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-11)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="109.8" y="288.4"
textLength="85.4" clip-path="url(#breeze-release-management-pub [...]
+</text><text class="breeze-release-management-publish-docs-r4" x="12.2"
y="312.8" textLength="97.6"
clip-path="url(#breeze-release-management-publish-docs-line-12)">telegram</text><text
class="breeze-release-management-publish-docs-r1" x="109.8" y="312.8"
textLength="36.6"
clip-path="url(#breeze-release-management-publish-docs-line-12)"> | </text><text
class="breeze-release-management-publish-docs-r4" x="146.4" y="312.8"
textLength="61" clip-path="url(#breeze-release-management [...]
</text><text class="breeze-release-management-publish-docs-r1" x="1464"
y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-13)">
</text><text class="breeze-release-management-publish-docs-r1" x="12.2"
y="361.6" textLength="707.6"
clip-path="url(#breeze-release-management-publish-docs-line-14)">Command to publish generated documentation to airflow-site</text><text
class="breeze-release-management-publish-docs-r1" x="1464" y="361.6"
textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-14)">
</text><text class="breeze-release-management-publish-docs-r1" x="1464"
y="386" textLength="12.2"
clip-path="url(#breeze-release-management-publish-docs-line-15)">
diff --git a/images/breeze/output_sbom_generate-providers-requirements.svg
b/images/breeze/output_sbom_generate-providers-requirements.svg
index 1ac6396a3d..cb90b20960 100644
--- a/images/breeze/output_sbom_generate-providers-requirements.svg
+++ b/images/breeze/output_sbom_generate-providers-requirements.svg
@@ -193,9 +193,9 @@
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="337.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="337.2"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-13)">| daskexecutor | databricks | datadog | dbt.cloud | dingding | discord | doc
[...]
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="361.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="361.6"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-14)">elasticsearch | exasol | facebook | ftp | github | google | grpc | hash
[...]
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="386" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="386"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-15)">influxdb | jdbc | jenkins | microsoft.azure | microsoft.mssql | microsoft.psrp | 
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="410.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="410.4"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">microsoft.winrm | mongo | mysql | neo4j | odbc | openfaas | openlineage |
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="434.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="434.8"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">opsgenie | oracle | pagerduty | papermill | pgvector | pinecone | plexus |&#
[...]
-</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="459.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="459.2"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">redis | salesforce | samba | segment | sendgrid | sftp | singularity | 
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="410.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="410.4"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-16)">microsoft.winrm | mongo | mysql | neo4j | odbc | openai | openfaas | op
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="434.8" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="434.8"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-17)">| opsgenie | oracle | pagerduty | papermill | pgvector | pinecone | plexus&#
[...]
+</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="459.2" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="459.2"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-18)">| redis | salesforce | samba | segment | sendgrid | sftp | singularity 
[...]
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="483.6" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="483.6"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-19)">snowflake | sqlite | ssh | tableau | tabular | telegram | trino | verti
[...]
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="508" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">│</text><text
class="breeze-sbom-generate-providers-requirements-r6" x="292.8" y="508"
textLength="1146.8"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-20)">| zendesk)                     
[...]
</text><text class="breeze-sbom-generate-providers-requirements-r5" x="0"
y="532.4" textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">│</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="24.4" y="532.4"
textLength="12.2"
clip-path="url(#breeze-sbom-generate-providers-requirements-line-21)">-</text><text
class="breeze-sbom-generate-providers-requirements-r4" x="36.6" y="532.4"
textLength="109.8" clip-path="url(#breeze-sbom-generate- [...]
diff --git a/tests/providers/openai/__init__.py
b/tests/providers/openai/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/providers/openai/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
diff --git a/tests/providers/openai/hooks/__init__.py
b/tests/providers/openai/hooks/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/providers/openai/hooks/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
diff --git a/tests/providers/openai/hooks/test_openai.py
b/tests/providers/openai/hooks/test_openai.py
new file mode 100644
index 0000000000..cd811107f7
--- /dev/null
+++ b/tests/providers/openai/hooks/test_openai.py
@@ -0,0 +1,63 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
+from __future__ import annotations
+
+from unittest.mock import Mock, patch
+
+import pytest
+
+from airflow.providers.openai.hooks.openai import OpenAIHook
+
+
[email protected]
+def openai_hook():
+ with
patch("airflow.providers.openai.hooks.openai.OpenAIHook._get_api_key"), patch(
+ "airflow.providers.openai.hooks.openai.OpenAIHook._get_api_base"
+ ) as _:
+ yield OpenAIHook(conn_id="test_conn_id")
+
+
[email protected]
+def mock_embeddings_response():
+ return {"data": [{"embedding": [0.1, 0.2, 0.3]}]}
+
+
[email protected]
+def mock_completions_response():
+ return Mock(
+ id="completion-id",
+ object="completion",
+ created=1234567890,
+ model="text-davinci-002",
+ usage={"prompt_tokens": 15, "completion_tokens": 32, "total_tokens":
47},
+ choices=[Mock(text="the quick brown fox", finish_reason="stop",
index=0)],
+ )
+
+
+def test_create_embeddings(openai_hook, mock_embeddings_response):
+ text = "Sample text"
+ with patch("openai.Embedding.create",
return_value=mock_embeddings_response):
+ embeddings = openai_hook.create_embeddings(text)
+ assert embeddings == [0.1, 0.2, 0.3]
+
+
+def test_get_api_key():
+ mock_connection = Mock()
+ mock_connection.password = "your_api_key"
+ OpenAIHook.get_connection = Mock(return_value=mock_connection)
+ api_key = OpenAIHook()._get_api_key()
+ assert api_key == "your_api_key"
diff --git a/tests/providers/openai/operators/__init__.py
b/tests/providers/openai/operators/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/providers/openai/operators/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
diff --git a/tests/providers/openai/operators/test_openai.py
b/tests/providers/openai/operators/test_openai.py
new file mode 100644
index 0000000000..11a6483802
--- /dev/null
+++ b/tests/providers/openai/operators/test_openai.py
@@ -0,0 +1,36 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
+from __future__ import annotations
+
+from unittest.mock import Mock
+
+from airflow.providers.openai.operators.openai import OpenAIEmbeddingOperator
+from airflow.utils.context import Context
+
+
+def test_execute_with_input_text():
+ operator = OpenAIEmbeddingOperator(
+ task_id="TaskId", conn_id="test_conn_id", model="test_model",
input_text="Test input text"
+ )
+ mock_hook_instance = Mock()
+ mock_hook_instance.create_embeddings.return_value = [1.0, 2.0, 3.0]
+ operator.hook = mock_hook_instance
+
+ context = Context()
+ embeddings = operator.execute(context)
+
+ assert embeddings == [1.0, 2.0, 3.0]
diff --git a/tests/system/providers/openai/__init__.py
b/tests/system/providers/openai/__init__.py
new file mode 100644
index 0000000000..13a83393a9
--- /dev/null
+++ b/tests/system/providers/openai/__init__.py
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
diff --git a/tests/system/providers/openai/example_openai.py
b/tests/system/providers/openai/example_openai.py
new file mode 100644
index 0000000000..ec8dd316b3
--- /dev/null
+++ b/tests/system/providers/openai/example_openai.py
@@ -0,0 +1,110 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF 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.
+from __future__ import annotations
+
+import pendulum
+
+from airflow.decorators import dag, task
+from airflow.providers.openai.hooks.openai import OpenAIHook
+from airflow.providers.openai.operators.openai import OpenAIEmbeddingOperator
+
+
+def input_text_callable(
+ input_arg1: str,
+ input_arg2: str,
+ input_kwarg1: str = "default_kwarg1_value",
+ input_kwarg2: str = "default_kwarg1_value",
+):
+ text = " ".join([input_arg1, input_arg2, input_kwarg1, input_kwarg2])
+ return text
+
+
+@dag(
+ schedule=None,
+ start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
+ catchup=False,
+ tags=["example", "openai"],
+)
+def example_openai_dag():
+ """
+ ### TaskFlow API Tutorial Documentation
+ This is a simple data pipeline example which demonstrates the use of
+ the TaskFlow API using three simple tasks for Extract, Transform, and Load.
+ Documentation that goes along with the Airflow TaskFlow API tutorial is
+ located
+
[here](https://airflow.apache.org/docs/apache-airflow/stable/tutorial_taskflow_api.html)
+ """
+
+ texts = [
+ "On Kernel-Target Alignment. We describe a family of global
optimization procedures",
+ " that automatically decompose optimization problems into smaller
loosely coupled",
+ " problems, then combine the solutions of these with message passing
algorithms.",
+ ]
+
+ @task()
+ def create_embeddings_using_hook():
+ """
+ #### Extract task
+ A simple Extract task to get data ready for the rest of the data
+ pipeline. In this case, getting data is simulated by reading from a
+ hardcoded JSON string.
+ """
+ openai_hook = OpenAIHook()
+ embeddings = openai_hook.create_embeddings(texts[0])
+ return embeddings
+
+ @task()
+ def task_to_store_input_text_in_xcom():
+ return texts[0]
+
+ # [START howto_operator_openai_embedding]
+ OpenAIEmbeddingOperator(
+ task_id="embedding_using_xcom_data",
+ conn_id="openai_default",
+ input_text=task_to_store_input_text_in_xcom(),
+ model="text-embedding-ada-002",
+ )
+
+ OpenAIEmbeddingOperator(
+ task_id="embedding_using_callable",
+ conn_id="openai_default",
+ input_text=input_text_callable(
+ "input_arg1_value",
+ "input2_value",
+ input_kwarg1="input_kwarg1_value",
+ input_kwarg2="input_kwarg2_value",
+ ),
+ model="text-embedding-ada-002",
+ )
+ OpenAIEmbeddingOperator(
+ task_id="embedding_using_text",
+ conn_id="openai_default",
+ input_text=texts,
+ model="text-embedding-ada-002",
+ )
+ # [END howto_operator_openai_embedding]
+
+ create_embeddings_using_hook()
+
+
+example_openai_dag()
+
+
+from tests.system.utils import get_test_run # noqa: E402
+
+# Needed to run the example DAG with pytest (see:
tests/system/README.md#run_via_pytest)
+test_run = get_test_run(dag)