:py:mod:`airflow.providers.google.cloud.operators.vision`
=========================================================

.. py:module:: airflow.providers.google.cloud.operators.vision

.. autoapi-nested-parse::

   This module contains a Google Cloud Vision operator.



Module Contents
---------------

Classes
~~~~~~~

.. autoapisummary::

   airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductSetOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionGetProductSetOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductSetOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductSetOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionGetProductOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionImageAnnotateOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionCreateReferenceImageOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionDeleteReferenceImageOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionAddProductToProductSetOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionRemoveProductFromProductSetOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionDetectTextOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionTextDetectOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageLabelsOperator
   airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageSafeSearchOperator



Functions
~~~~~~~~~

.. autoapisummary::

   airflow.providers.google.cloud.operators.vision.prepare_additional_parameters



Attributes
~~~~~~~~~~

.. autoapisummary::

   airflow.providers.google.cloud.operators.vision.MetaData


.. py:data:: MetaData
   

   

.. py:class:: CloudVisionCreateProductSetOperator(*, product_set, location, project_id = None, product_set_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Creates a new ProductSet resource.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionCreateProductSetOperator`

   :param product_set: (Required) The ProductSet to create. If a dict is provided, it must be of the same
       form as the protobuf message `ProductSet`.
   :param location: (Required) The region where the ProductSet should be created. Valid regions
       (as of 2019-02-05) are: us-east1, us-west1, europe-west1, asia-east1
   :param project_id: (Optional) The project in which the ProductSet should be created. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param product_set_id: (Optional) A user-supplied resource id for this ProductSet.
       If set, the server will attempt to use this value as the resource id. If it is
       already in use, an error is returned with code ALREADY_EXISTS. Must be at most
       128 characters long. It cannot contain the character /.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'product_set_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionGetProductSetOperator(*, location, product_set_id, project_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Gets information associated with a ProductSet.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionGetProductSetOperator`

   :param location: (Required) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
       are: us-east1, us-west1, europe-west1, asia-east1
   :param product_set_id: (Required) The resource id of this ProductSet.
   :param project_id: (Optional) The project in which the ProductSet is located. If set
       to None or missing, the default `project_id` from the Google Cloud connection is used.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'product_set_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionUpdateProductSetOperator(*, product_set, location = None, product_set_id = None, project_id = None, update_mask = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Makes changes to a `ProductSet` resource. Only display_name can be updated currently.

   .. note:: To locate the `ProductSet` resource, its `name` in the form
       `projects/PROJECT_ID/locations/LOC_ID/productSets/PRODUCT_SET_ID` is necessary.

   You can provide the `name` directly as an attribute of the `product_set` object.
   However, you can leave it blank and provide `location` and `product_set_id` instead
   (and optionally `project_id` - if not present, the connection default will be used)
   and the `name` will be created by the operator itself.

   This mechanism exists for your convenience, to allow leaving the `project_id` empty
   and having Airflow use the connection default `project_id`.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionUpdateProductSetOperator`

   :param product_set: (Required) The ProductSet resource which replaces the one on the
       server. If a dict is provided, it must be of the same form as the protobuf
       message `ProductSet`.
   :param location: (Optional) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
       are: us-east1, us-west1, europe-west1, asia-east1
   :param product_set_id: (Optional) The resource id of this ProductSet.
   :param project_id: (Optional) The project in which the ProductSet should be created. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param update_mask: (Optional) The `FieldMask` that specifies which fields to update. If update_mask
       isn't specified, all mutable fields are to be updated. Valid mask path is display_name. If a dict is
       provided, it must be of the same form as the protobuf message `FieldMask`.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'product_set_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionDeleteProductSetOperator(*, location, product_set_id, project_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Permanently deletes a `ProductSet`. `Products` and `ReferenceImages` in the
   `ProductSet` are not deleted. The actual image files are not deleted from Google
   Cloud Storage.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionDeleteProductSetOperator`

   :param location: (Required) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
       are: us-east1, us-west1, europe-west1, asia-east1
   :param product_set_id: (Required) The resource id of this ProductSet.
   :param project_id: (Optional) The project in which the ProductSet should be created.
       If set to None or missing, the default project_id from the Google Cloud connection is used.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'product_set_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionCreateProductOperator(*, location, product, project_id = None, product_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Creates and returns a new product resource.

   Possible errors regarding the `Product` object provided:

   - Returns `INVALID_ARGUMENT` if `display_name` is missing or longer than 4096 characters.
   - Returns `INVALID_ARGUMENT` if `description` is longer than 4096 characters.
   - Returns `INVALID_ARGUMENT` if `product_category` is missing or invalid.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionCreateProductOperator`

   :param location: (Required) The region where the Product should be created. Valid regions
       (as of 2019-02-05) are: us-east1, us-west1, europe-west1, asia-east1
   :param product: (Required) The product to create. If a dict is provided, it must be of the same form as
       the protobuf message `Product`.
   :param project_id: (Optional) The project in which the Product should be created. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param product_id: (Optional) A user-supplied resource id for this Product.
       If set, the server will attempt to use this value as the resource id. If it is
       already in use, an error is returned with code ALREADY_EXISTS. Must be at most
       128 characters long. It cannot contain the character /.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'product_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionGetProductOperator(*, location, product_id, project_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Gets information associated with a `Product`.

   Possible errors:

   - Returns `NOT_FOUND` if the `Product` does not exist.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionGetProductOperator`

   :param location: (Required) The region where the Product is located. Valid regions (as of 2019-02-05) are:
       us-east1, us-west1, europe-west1, asia-east1
   :param product_id: (Required) The resource id of this Product.
   :param project_id: (Optional) The project in which the Product is located. If set to
       None or missing, the default project_id from the Google Cloud connection is used.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'product_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionUpdateProductOperator(*, product, location = None, product_id = None, project_id = None, update_mask = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Makes changes to a Product resource. Only the display_name, description, and labels fields can be
   updated right now.

   If labels are updated, the change will not be reflected in queries until the next index time.

   .. note:: To locate the `Product` resource, its `name` in the form
       `projects/PROJECT_ID/locations/LOC_ID/products/PRODUCT_ID` is necessary.

   You can provide the `name` directly as an attribute of the `product` object. However, you can leave it
   blank and provide `location` and `product_id` instead (and optionally `project_id` - if not present,
   the connection default will be used) and the `name` will be created by the operator itself.

   This mechanism exists for your convenience, to allow leaving the `project_id` empty and having Airflow
   use the connection default `project_id`.

   Possible errors related to the provided `Product`:

   - Returns `NOT_FOUND` if the Product does not exist.
   - Returns `INVALID_ARGUMENT` if `display_name` is present in update_mask but is missing from the request
       or longer than 4096 characters.
   - Returns `INVALID_ARGUMENT` if `description` is present in update_mask but is longer than 4096
       characters.
   - Returns `INVALID_ARGUMENT` if `product_category` is present in update_mask.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionUpdateProductOperator`

   :param product: (Required) The Product resource which replaces the one on the server. product.name is
       immutable. If a dict is provided, it must be of the same form as the protobuf message `Product`.
   :param location: (Optional) The region where the Product is located. Valid regions (as of 2019-02-05) are:
       us-east1, us-west1, europe-west1, asia-east1
   :param product_id: (Optional) The resource id of this Product.
   :param project_id: (Optional) The project in which the Product is located. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param update_mask: (Optional) The `FieldMask` that specifies which fields to update. If update_mask
       isn't specified, all mutable fields are to be updated. Valid mask paths include product_labels,
       display_name, and description. If a dict is provided, it must be of the same form as the protobuf
       message `FieldMask`.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'product_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionDeleteProductOperator(*, location, product_id, project_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Permanently deletes a product and its reference images.

   Metadata of the product and all its images will be deleted right away, but search queries against
   ProductSets containing the product may still work until all related caches are refreshed.

   Possible errors:

   - Returns `NOT_FOUND` if the product does not exist.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionDeleteProductOperator`

   :param location: (Required) The region where the Product is located. Valid regions (as of 2019-02-05) are:
       us-east1, us-west1, europe-west1, asia-east1
   :param product_id: (Required) The resource id of this Product.
   :param project_id: (Optional) The project in which the Product is located. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'project_id', 'product_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionImageAnnotateOperator(*, request, retry = DEFAULT, timeout = None, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Run image detection and annotation for an image or a batch of images.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionImageAnnotateOperator`

   :param request: (Required) Annotation request for image or a batch.
       If a dict is provided, it must be of the same form as the protobuf
       message class:`google.cloud.vision_v1.types.AnnotateImageRequest`
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['request', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionCreateReferenceImageOperator(*, location, reference_image, product_id, reference_image_id = None, project_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Creates and returns a new ReferenceImage ID resource.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionCreateReferenceImageOperator`

   :param location: (Required) The region where the Product is located. Valid regions (as of 2019-02-05) are:
       us-east1, us-west1, europe-west1, asia-east1
   :param reference_image: (Required) The reference image to create. If an image ID is specified, it is
       ignored.
       If a dict is provided, it must be of the same form as the protobuf message
       :class:`google.cloud.vision_v1.types.ReferenceImage`
   :param reference_image_id: (Optional) A user-supplied resource id for the ReferenceImage to be added.
       If set, the server will attempt to use this value as the resource id. If it is already in use, an
       error is returned with code ALREADY_EXISTS. Must be at most 128 characters long. It cannot contain
       the character `/`.
   :param product_id: (Optional) The resource id of this Product.
   :param project_id: (Optional) The project in which the Product is located. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'reference_image', 'product_id', 'reference_image_id', 'project_id', 'gcp_conn_id',...

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionDeleteReferenceImageOperator(*, location, product_id, reference_image_id, project_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Deletes a ReferenceImage ID resource.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionDeleteReferenceImageOperator`

   :param location: (Required) The region where the Product is located. Valid regions (as of 2019-02-05) are:
       us-east1, us-west1, europe-west1, asia-east1
   :param reference_image_id: (Optional) A user-supplied resource id for the ReferenceImage to be added.
       If set, the server will attempt to use this value as the resource id. If it is already in use, an
       error is returned with code ALREADY_EXISTS. Must be at most 128 characters long. It cannot contain
       the character `/`.
   :param product_id: (Optional) The resource id of this Product.
   :param project_id: (Optional) The project in which the Product is located. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'product_id', 'reference_image_id', 'project_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionAddProductToProductSetOperator(*, product_set_id, product_id, location, project_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Adds a Product to the specified ProductSet. If the Product is already present, no change is made.

   One Product can be added to at most 100 ProductSets.

   Possible errors:

   - Returns `NOT_FOUND` if the Product or the ProductSet doesn't exist.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionAddProductToProductSetOperator`

   :param product_set_id: (Required) The resource id for the ProductSet to modify.
   :param product_id: (Required) The resource id of this Product.
   :param location: (Required) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
       are: us-east1, us-west1, europe-west1, asia-east1
   :param project_id: (Optional) The project in which the Product is located. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'product_set_id', 'product_id', 'project_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionRemoveProductFromProductSetOperator(*, product_set_id, product_id, location, project_id = None, retry = DEFAULT, timeout = None, metadata = (), gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Removes a Product from the specified ProductSet.

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionRemoveProductFromProductSetOperator`

   :param product_set_id: (Required) The resource id for the ProductSet to modify.
   :param product_id: (Required) The resource id of this Product.
   :param location: (Required) The region where the ProductSet is located. Valid regions (as of 2019-02-05)
       are: us-east1, us-west1, europe-west1, asia-east1
   :param project_id: (Optional) The project in which the Product is located. If set to None or
       missing, the default project_id from the Google Cloud connection is used.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: (Optional) The amount of time, in seconds, to wait for the request to
       complete. Note that if retry is specified, the timeout applies to each individual
       attempt.
   :param metadata: (Optional) Additional metadata that is provided to the method.
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['location', 'product_set_id', 'product_id', 'project_id', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionDetectTextOperator(image, max_results = None, retry = DEFAULT, timeout = None, language_hints = None, web_detection_params = None, additional_properties = None, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Detects Text in the image

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionDetectTextOperator`

   :param image: (Required) The image to analyze. See more:
       https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.Image
   :param max_results: (Optional) Number of results to return.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: Number of seconds before timing out.
   :param language_hints: List of languages to use for TEXT_DETECTION.
       In most cases, an empty value yields the best results since it enables automatic language detection.
       For languages based on the Latin alphabet, setting language_hints is not needed.
   :param web_detection_params: Parameters for web detection.
   :param additional_properties: Additional properties to be set on the AnnotateImageRequest. See more:
       :class:`google.cloud.vision_v1.types.AnnotateImageRequest`
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['image', 'max_results', 'timeout', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionTextDetectOperator(image, max_results = None, retry = DEFAULT, timeout = None, language_hints = None, web_detection_params = None, additional_properties = None, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Detects Document Text in the image

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionTextDetectOperator`

   :param image: (Required) The image to analyze. See more:
       https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.Image
   :param max_results: Number of results to return.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: Number of seconds before timing out.
   :param language_hints: List of languages to use for TEXT_DETECTION.
       In most cases, an empty value yields the best results since it enables automatic language detection.
       For languages based on the Latin alphabet, setting language_hints is not needed.
   :param web_detection_params: Parameters for web detection.
   :param additional_properties: Additional properties to be set on the AnnotateImageRequest. See more:
       https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.AnnotateImageRequest
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['image', 'max_results', 'timeout', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionDetectImageLabelsOperator(image, max_results = None, retry = DEFAULT, timeout = None, additional_properties = None, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Detects Document Text in the image

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionDetectImageLabelsOperator`

   :param image: (Required) The image to analyze. See more:
       https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.Image
   :param max_results: Number of results to return.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: Number of seconds before timing out.
   :param additional_properties: Additional properties to be set on the AnnotateImageRequest. See more:
       https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.AnnotateImageRequest
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['image', 'max_results', 'timeout', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: CloudVisionDetectImageSafeSearchOperator(image, max_results = None, retry = DEFAULT, timeout = None, additional_properties = None, gcp_conn_id = 'google_cloud_default', impersonation_chain = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   Detects Document Text in the image

   .. seealso::
       For more information on how to use this operator, take a look at the guide:
       :ref:`howto/operator:CloudVisionDetectImageSafeSearchOperator`

   :param image: (Required) The image to analyze. See more:
       https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.Image
   :param max_results: Number of results to return.
   :param retry: (Optional) A retry object used to retry requests. If `None` is
       specified, requests will not be retried.
   :param timeout: Number of seconds before timing out.
   :param additional_properties: Additional properties to be set on the AnnotateImageRequest. See more:
       https://googleapis.github.io/google-cloud-python/latest/vision/gapic/v1/types.html#google.cloud.vision_v1.types.AnnotateImageRequest
   :param gcp_conn_id: (Optional) The connection ID used to connect to Google Cloud.
   :param impersonation_chain: Optional service account to impersonate using short-term
       credentials, or chained list of accounts required to get the access_token
       of the last account in the list, which will be impersonated in the request.
       If set as a string, the account must grant the originating account
       the Service Account Token Creator IAM role.
       If set as a sequence, the identities from the list must grant
       Service Account Token Creator IAM role to the directly preceding identity, with first
       account from the list granting this role to the originating account (templated).

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['image', 'max_results', 'timeout', 'gcp_conn_id', 'impersonation_chain']

      

   .. py:method:: execute(context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:function:: prepare_additional_parameters(additional_properties, language_hints, web_detection_params)

   Creates additional_properties parameter based on language_hints, web_detection_params and
   additional_properties parameters specified by the user


