Skip to main content

lib/aws/generated/s3_vectors.ex

# WARNING: DO NOT EDIT, AUTO-GENERATED CODE!
# See https://github.com/aws-beam/aws-codegen for more details.

defmodule AWS.S3Vectors do
  @moduledoc """
  Amazon S3 vector buckets are a bucket type to store and search vectors with
  sub-second search times.

  They are designed to provide dedicated API operations for you to interact with
  vectors to do similarity search. Within a vector bucket, you use a vector index
  to organize and logically group your vector data. When you make a write or read
  request, you direct it to a single vector index. You store your vector data as
  vectors. A vector contains a key (a name that you assign), a multi-dimensional
  vector, and, optionally, metadata that describes a vector. The key uniquely
  identifies the vector in a vector index.
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:

      delete_index_input() :: %{
        optional("indexArn") => String.t() | atom(),
        optional("indexName") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom()
      }

  """
  @type delete_index_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_output_vector() :: %{
        "data" => list(),
        "key" => String.t() | atom(),
        "metadata" => any()
      }

  """
  @type list_output_vector() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_vector_bucket_output() :: %{
        "vectorBucket" => vector_bucket()
      }

  """
  @type get_vector_bucket_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_vectors_input() :: %{
        optional("indexArn") => String.t() | atom(),
        optional("indexName") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom(),
        required("keys") => list(String.t() | atom())
      }

  """
  @type delete_vectors_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_index_output() :: %{
        "index" => index()
      }

  """
  @type get_index_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      vector_bucket() :: %{
        "creationTime" => [non_neg_integer()],
        "encryptionConfiguration" => encryption_configuration(),
        "vectorBucketArn" => String.t() | atom(),
        "vectorBucketName" => String.t() | atom()
      }

  """
  @type vector_bucket() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_vector_bucket_output() :: %{}

  """
  @type delete_vector_bucket_output() :: %{}

  @typedoc """

  ## Example:

      service_unavailable_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type service_unavailable_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_tags_for_resource_output() :: %{
        "tags" => map()
      }

  """
  @type list_tags_for_resource_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      kms_disabled_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type kms_disabled_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_vectors_input() :: %{
        optional("indexArn") => String.t() | atom(),
        optional("indexName") => String.t() | atom(),
        optional("returnData") => [boolean()],
        optional("returnMetadata") => [boolean()],
        optional("vectorBucketName") => String.t() | atom(),
        required("keys") => list(String.t() | atom())
      }

  """
  @type get_vectors_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      too_many_requests_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type too_many_requests_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      access_denied_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type access_denied_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      tag_resource_output() :: %{}

  """
  @type tag_resource_output() :: %{}

  @typedoc """

  ## Example:

      put_vector_bucket_policy_input() :: %{
        optional("vectorBucketArn") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom(),
        required("policy") => String.t() | atom()
      }

  """
  @type put_vector_bucket_policy_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_indexes_input() :: %{
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom(),
        optional("prefix") => String.t() | atom(),
        optional("vectorBucketArn") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom()
      }

  """
  @type list_indexes_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      put_vector_bucket_policy_output() :: %{}

  """
  @type put_vector_bucket_policy_output() :: %{}

  @typedoc """

  ## Example:

      index_summary() :: %{
        "creationTime" => [non_neg_integer()],
        "indexArn" => String.t() | atom(),
        "indexName" => String.t() | atom(),
        "vectorBucketName" => String.t() | atom()
      }

  """
  @type index_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_vectors_output() :: %{
        "vectors" => list(get_output_vector())
      }

  """
  @type get_vectors_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      put_vectors_input() :: %{
        optional("indexArn") => String.t() | atom(),
        optional("indexName") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom(),
        required("vectors") => list(put_input_vector())
      }

  """
  @type put_vectors_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_vector_buckets_input() :: %{
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom(),
        optional("prefix") => String.t() | atom()
      }

  """
  @type list_vector_buckets_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_indexes_output() :: %{
        "indexes" => list(index_summary()),
        "nextToken" => String.t() | atom()
      }

  """
  @type list_indexes_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      metadata_configuration() :: %{
        "nonFilterableMetadataKeys" => list(String.t() | atom())
      }

  """
  @type metadata_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      validation_exception() :: %{
        "fieldList" => list(validation_exception_field()),
        "message" => [String.t() | atom()]
      }

  """
  @type validation_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      query_vectors_output() :: %{
        "distanceMetric" => list(any()),
        "vectors" => list(query_output_vector())
      }

  """
  @type query_vectors_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_vector_bucket_policy_input() :: %{
        optional("vectorBucketArn") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom()
      }

  """
  @type get_vector_bucket_policy_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_output_vector() :: %{
        "data" => list(),
        "key" => String.t() | atom(),
        "metadata" => any()
      }

  """
  @type get_output_vector() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_vector_bucket_output() :: %{
        "vectorBucketArn" => String.t() | atom()
      }

  """
  @type create_vector_bucket_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_vectors_output() :: %{
        "nextToken" => String.t() | atom(),
        "vectors" => list(list_output_vector())
      }

  """
  @type list_vectors_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_index_output() :: %{
        "indexArn" => String.t() | atom()
      }

  """
  @type create_index_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      tag_resource_input() :: %{
        required("tags") => map()
      }

  """
  @type tag_resource_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_vector_bucket_policy_output() :: %{}

  """
  @type delete_vector_bucket_policy_output() :: %{}

  @typedoc """

  ## Example:

      internal_server_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type internal_server_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      query_vectors_input() :: %{
        optional("filter") => [any()],
        optional("indexArn") => String.t() | atom(),
        optional("indexName") => String.t() | atom(),
        optional("returnDistance") => [boolean()],
        optional("returnMetadata") => [boolean()],
        optional("vectorBucketName") => String.t() | atom(),
        required("queryVector") => list(),
        required("topK") => integer()
      }

  """
  @type query_vectors_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      untag_resource_input() :: %{
        required("tagKeys") => list(String.t() | atom())
      }

  """
  @type untag_resource_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_vector_bucket_policy_input() :: %{
        optional("vectorBucketArn") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom()
      }

  """
  @type delete_vector_bucket_policy_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      put_input_vector() :: %{
        "data" => list(),
        "key" => String.t() | atom(),
        "metadata" => any()
      }

  """
  @type put_input_vector() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_vectors_output() :: %{}

  """
  @type delete_vectors_output() :: %{}

  @typedoc """

  ## Example:

      vector_bucket_summary() :: %{
        "creationTime" => [non_neg_integer()],
        "vectorBucketArn" => String.t() | atom(),
        "vectorBucketName" => String.t() | atom()
      }

  """
  @type vector_bucket_summary() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      kms_not_found_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type kms_not_found_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_vectors_input() :: %{
        optional("indexArn") => String.t() | atom(),
        optional("indexName") => String.t() | atom(),
        optional("maxResults") => integer(),
        optional("nextToken") => String.t() | atom(),
        optional("returnData") => [boolean()],
        optional("returnMetadata") => [boolean()],
        optional("segmentCount") => integer(),
        optional("segmentIndex") => integer(),
        optional("vectorBucketName") => String.t() | atom()
      }

  """
  @type list_vectors_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      conflict_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type conflict_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      not_found_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type not_found_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_vector_buckets_output() :: %{
        "nextToken" => String.t() | atom(),
        "vectorBuckets" => list(vector_bucket_summary())
      }

  """
  @type list_vector_buckets_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      validation_exception_field() :: %{
        "message" => [String.t() | atom()],
        "path" => [String.t() | atom()]
      }

  """
  @type validation_exception_field() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_index_input() :: %{
        optional("encryptionConfiguration") => encryption_configuration(),
        optional("metadataConfiguration") => metadata_configuration(),
        optional("tags") => map(),
        optional("vectorBucketArn") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom(),
        required("dataType") => list(any()),
        required("dimension") => integer(),
        required("distanceMetric") => list(any()),
        required("indexName") => String.t() | atom()
      }

  """
  @type create_index_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_index_input() :: %{
        optional("indexArn") => String.t() | atom(),
        optional("indexName") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom()
      }

  """
  @type get_index_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      kms_invalid_key_usage_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type kms_invalid_key_usage_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_tags_for_resource_input() :: %{}

  """
  @type list_tags_for_resource_input() :: %{}

  @typedoc """

  ## Example:

      put_vectors_output() :: %{}

  """
  @type put_vectors_output() :: %{}

  @typedoc """

  ## Example:

      get_vector_bucket_policy_output() :: %{
        "policy" => String.t() | atom()
      }

  """
  @type get_vector_bucket_policy_output() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_vector_bucket_input() :: %{
        optional("encryptionConfiguration") => encryption_configuration(),
        optional("tags") => map(),
        required("vectorBucketName") => String.t() | atom()
      }

  """
  @type create_vector_bucket_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      encryption_configuration() :: %{
        "kmsKeyArn" => String.t() | atom(),
        "sseType" => list(any())
      }

  """
  @type encryption_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      index() :: %{
        "creationTime" => [non_neg_integer()],
        "dataType" => list(any()),
        "dimension" => integer(),
        "distanceMetric" => list(any()),
        "encryptionConfiguration" => encryption_configuration(),
        "indexArn" => String.t() | atom(),
        "indexName" => String.t() | atom(),
        "metadataConfiguration" => metadata_configuration(),
        "vectorBucketName" => String.t() | atom()
      }

  """
  @type index() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_vector_bucket_input() :: %{
        optional("vectorBucketArn") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom()
      }

  """
  @type get_vector_bucket_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_index_output() :: %{}

  """
  @type delete_index_output() :: %{}

  @typedoc """

  ## Example:

      query_output_vector() :: %{
        "distance" => [float()],
        "key" => String.t() | atom(),
        "metadata" => any()
      }

  """
  @type query_output_vector() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      untag_resource_output() :: %{}

  """
  @type untag_resource_output() :: %{}

  @typedoc """

  ## Example:

      kms_invalid_state_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type kms_invalid_state_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_vector_bucket_input() :: %{
        optional("vectorBucketArn") => String.t() | atom(),
        optional("vectorBucketName") => String.t() | atom()
      }

  """
  @type delete_vector_bucket_input() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      request_timeout_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type request_timeout_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      service_quota_exceeded_exception() :: %{
        "message" => String.t() | atom()
      }

  """
  @type service_quota_exceeded_exception() :: %{(String.t() | atom()) => any()}

  @type create_index_errors() ::
          service_quota_exceeded_exception()
          | not_found_exception()
          | conflict_exception()
          | service_unavailable_exception()

  @type create_vector_bucket_errors() ::
          service_quota_exceeded_exception()
          | conflict_exception()
          | service_unavailable_exception()

  @type delete_index_errors() :: not_found_exception() | service_unavailable_exception()

  @type delete_vector_bucket_errors() ::
          not_found_exception() | conflict_exception() | service_unavailable_exception()

  @type delete_vector_bucket_policy_errors() ::
          not_found_exception() | service_unavailable_exception()

  @type delete_vectors_errors() ::
          kms_invalid_state_exception()
          | kms_invalid_key_usage_exception()
          | not_found_exception()
          | kms_not_found_exception()
          | access_denied_exception()
          | kms_disabled_exception()
          | service_unavailable_exception()

  @type get_index_errors() :: not_found_exception() | service_unavailable_exception()

  @type get_vector_bucket_errors() :: not_found_exception() | service_unavailable_exception()

  @type get_vector_bucket_policy_errors() ::
          not_found_exception() | service_unavailable_exception()

  @type get_vectors_errors() ::
          kms_invalid_state_exception()
          | kms_invalid_key_usage_exception()
          | not_found_exception()
          | kms_not_found_exception()
          | kms_disabled_exception()
          | service_unavailable_exception()

  @type list_indexes_errors() :: not_found_exception() | service_unavailable_exception()

  @type list_tags_for_resource_errors() :: not_found_exception() | service_unavailable_exception()

  @type list_vector_buckets_errors() :: service_unavailable_exception()

  @type list_vectors_errors() ::
          not_found_exception() | access_denied_exception() | service_unavailable_exception()

  @type put_vector_bucket_policy_errors() ::
          not_found_exception() | service_unavailable_exception()

  @type put_vectors_errors() ::
          service_quota_exceeded_exception()
          | kms_invalid_state_exception()
          | kms_invalid_key_usage_exception()
          | not_found_exception()
          | kms_not_found_exception()
          | access_denied_exception()
          | kms_disabled_exception()
          | service_unavailable_exception()

  @type query_vectors_errors() ::
          kms_invalid_state_exception()
          | kms_invalid_key_usage_exception()
          | not_found_exception()
          | kms_not_found_exception()
          | kms_disabled_exception()
          | service_unavailable_exception()

  @type tag_resource_errors() ::
          not_found_exception() | conflict_exception() | service_unavailable_exception()

  @type untag_resource_errors() ::
          not_found_exception() | conflict_exception() | service_unavailable_exception()

  def metadata do
    %{
      api_version: "2025-07-15",
      content_type: "application/x-amz-json-1.1",
      credential_scope: nil,
      endpoint_prefix: "s3vectors",
      global?: false,
      hostname: nil,
      protocol: "rest-json",
      service_id: "S3Vectors",
      signature_version: "v4",
      signing_name: "s3vectors",
      target_prefix: nil
    }
  end

  @doc """
  Creates a vector index within a vector bucket.

  To specify the vector bucket, you must use either the vector bucket name or the
  vector bucket Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:CreateIndex` permission to use this operation.

  You must have the `s3vectors:TagResource` permission in addition to
  `s3vectors:CreateIndex` permission to create a vector index with tags.
  """
  @spec create_index(map(), create_index_input(), list()) ::
          {:ok, create_index_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_index_errors()}
  def create_index(%Client{} = client, input, options \\ []) do
    url_path = "/CreateIndex"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a vector bucket in the Amazon Web Services Region that you want your
  bucket to be in.

  ## Definitions

  ### Permissions

  You must have the `s3vectors:CreateVectorBucket` permission to use this
  operation.

  You must have the `s3vectors:TagResource` permission in addition to
  `s3vectors:CreateVectorBucket` permission to create a vector bucket with tags.
  """
  @spec create_vector_bucket(map(), create_vector_bucket_input(), list()) ::
          {:ok, create_vector_bucket_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_vector_bucket_errors()}
  def create_vector_bucket(%Client{} = client, input, options \\ []) do
    url_path = "/CreateVectorBucket"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes a vector index.

  To specify the vector index, you can either use both the vector bucket name and
  vector index name, or use the vector index Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:DeleteIndex` permission to use this operation.
  """
  @spec delete_index(map(), delete_index_input(), list()) ::
          {:ok, delete_index_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_index_errors()}
  def delete_index(%Client{} = client, input, options \\ []) do
    url_path = "/DeleteIndex"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes a vector bucket.

  All vector indexes in the vector bucket must be deleted before the vector bucket
  can be deleted. To perform this operation, you must use either the vector bucket
  name or the vector bucket Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:DeleteVectorBucket` permission to use this
  operation.
  """
  @spec delete_vector_bucket(map(), delete_vector_bucket_input(), list()) ::
          {:ok, delete_vector_bucket_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_vector_bucket_errors()}
  def delete_vector_bucket(%Client{} = client, input, options \\ []) do
    url_path = "/DeleteVectorBucket"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes a vector bucket policy.

  To specify the bucket, you must use either the vector bucket name or the vector
  bucket Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:DeleteVectorBucketPolicy` permission to use this
  operation.
  """
  @spec delete_vector_bucket_policy(map(), delete_vector_bucket_policy_input(), list()) ::
          {:ok, delete_vector_bucket_policy_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_vector_bucket_policy_errors()}
  def delete_vector_bucket_policy(%Client{} = client, input, options \\ []) do
    url_path = "/DeleteVectorBucketPolicy"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes one or more vectors in a vector index.

  To specify the vector index, you can either use both the vector bucket name and
  vector index name, or use the vector index Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:DeleteVectors` permission to use this operation.
  """
  @spec delete_vectors(map(), delete_vectors_input(), list()) ::
          {:ok, delete_vectors_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_vectors_errors()}
  def delete_vectors(%Client{} = client, input, options \\ []) do
    url_path = "/DeleteVectors"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Returns vector index attributes.

  To specify the vector index, you can either use both the vector bucket name and
  the vector index name, or use the vector index Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:GetIndex` permission to use this operation.
  """
  @spec get_index(map(), get_index_input(), list()) ::
          {:ok, get_index_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_index_errors()}
  def get_index(%Client{} = client, input, options \\ []) do
    url_path = "/GetIndex"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Returns vector bucket attributes.

  To specify the bucket, you must use either the vector bucket name or the vector
  bucket Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:GetVectorBucket` permission to use this operation.
  """
  @spec get_vector_bucket(map(), get_vector_bucket_input(), list()) ::
          {:ok, get_vector_bucket_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_vector_bucket_errors()}
  def get_vector_bucket(%Client{} = client, input, options \\ []) do
    url_path = "/GetVectorBucket"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Gets details about a vector bucket policy.

  To specify the bucket, you must use either the vector bucket name or the vector
  bucket Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:GetVectorBucketPolicy` permission to use this
  operation.
  """
  @spec get_vector_bucket_policy(map(), get_vector_bucket_policy_input(), list()) ::
          {:ok, get_vector_bucket_policy_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_vector_bucket_policy_errors()}
  def get_vector_bucket_policy(%Client{} = client, input, options \\ []) do
    url_path = "/GetVectorBucketPolicy"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Returns vector attributes.

  To specify the vector index, you can either use both the vector bucket name and
  the vector index name, or use the vector index Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:GetVectors` permission to use this operation.
  """
  @spec get_vectors(map(), get_vectors_input(), list()) ::
          {:ok, get_vectors_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_vectors_errors()}
  def get_vectors(%Client{} = client, input, options \\ []) do
    url_path = "/GetVectors"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Returns a list of all the vector indexes within the specified vector bucket.

  To specify the bucket, you must use either the vector bucket name or the vector
  bucket Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:ListIndexes` permission to use this operation.
  """
  @spec list_indexes(map(), list_indexes_input(), list()) ::
          {:ok, list_indexes_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_indexes_errors()}
  def list_indexes(%Client{} = client, input, options \\ []) do
    url_path = "/ListIndexes"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Lists all of the tags applied to a specified Amazon S3 Vectors resource.

  Each tag is a label consisting of a key and value pair. Tags can help you
  organize, track costs for, and control access to resources.

  For a list of S3 resources that support tagging, see [Managing tags for Amazon S3
  resources](https://docs.aws.amazon.com/AmazonS3/latest/userguide/tagging.html#manage-tags).

  ## Definitions

  ### Permissions

  For vector buckets and vector indexes, you must have the
  `s3vectors:ListTagsForResource` permission to use this operation.
  """
  @spec list_tags_for_resource(map(), String.t() | atom(), list()) ::
          {:ok, list_tags_for_resource_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_tags_for_resource_errors()}
  def list_tags_for_resource(%Client{} = client, resource_arn, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a list of all the vector buckets that are owned by the authenticated
  sender of the request.

  ## Definitions

  ### Permissions

  You must have the `s3vectors:ListVectorBuckets` permission to use this
  operation.
  """
  @spec list_vector_buckets(map(), list_vector_buckets_input(), list()) ::
          {:ok, list_vector_buckets_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_vector_buckets_errors()}
  def list_vector_buckets(%Client{} = client, input, options \\ []) do
    url_path = "/ListVectorBuckets"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  List vectors in the specified vector index.

  To specify the vector index, you can either use both the vector bucket name and
  the vector index name, or use the vector index Amazon Resource Name (ARN).

  `ListVectors` operations proceed sequentially; however, for faster performance
  on a large number of vectors in a vector index, applications can request a
  parallel `ListVectors` operation by providing the `segmentCount` and
  `segmentIndex` parameters.

  ## Definitions

  ### Permissions

  You must have the `s3vectors:ListVectors` permission to use this operation.
  Additional permissions are required based on the request parameters you specify:

     With only `s3vectors:ListVectors` permission, you can list vector
  keys when `returnData` and `returnMetadata` are both set to false or not
  specified..

     If you set `returnData` or `returnMetadata` to true, you must have
  both `s3vectors:ListVectors` and `s3vectors:GetVectors` permissions. The request
  fails with a `403 Forbidden` error if you request vector data or metadata
  without the `s3vectors:GetVectors` permission.
  """
  @spec list_vectors(map(), list_vectors_input(), list()) ::
          {:ok, list_vectors_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_vectors_errors()}
  def list_vectors(%Client{} = client, input, options \\ []) do
    url_path = "/ListVectors"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a bucket policy for a vector bucket.

  To specify the bucket, you must use either the vector bucket name or the vector
  bucket Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:PutVectorBucketPolicy` permission to use this
  operation.
  """
  @spec put_vector_bucket_policy(map(), put_vector_bucket_policy_input(), list()) ::
          {:ok, put_vector_bucket_policy_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_vector_bucket_policy_errors()}
  def put_vector_bucket_policy(%Client{} = client, input, options \\ []) do
    url_path = "/PutVectorBucketPolicy"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Adds one or more vectors to a vector index.

  To specify the vector index, you can either use both the vector bucket name and
  the vector index name, or use the vector index Amazon Resource Name (ARN).

  For more information about limits, see [Limitations and restrictions](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-vectors-limitations.html)
  in the *Amazon S3 User Guide*.

  When inserting vector data into your vector index, you must provide the vector
  data as `float32` (32-bit floating point) values. If you pass higher-precision
  values to an Amazon Web Services SDK, S3 Vectors converts the values to 32-bit
  floating point before storing them, and `GetVectors`, `ListVectors`, and
  `QueryVectors` operations return the float32 values. Different Amazon Web
  Services SDKs may have different default numeric types, so ensure your vectors
  are properly formatted as `float32` values regardless of which SDK you're using.
  For example, in Python, use `numpy.float32` or explicitly cast your values.

  ## Definitions

  ### Permissions

  You must have the `s3vectors:PutVectors` permission to use this operation.
  """
  @spec put_vectors(map(), put_vectors_input(), list()) ::
          {:ok, put_vectors_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, put_vectors_errors()}
  def put_vectors(%Client{} = client, input, options \\ []) do
    url_path = "/PutVectors"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Performs an approximate nearest neighbor search query in a vector index using a
  query vector.

  By default, it returns the keys of approximate nearest neighbors. You can
  optionally include the computed distance (between the query vector and each
  vector in the response), the vector data, and metadata of each vector in the
  response.

  To specify the vector index, you can either use both the vector bucket name and
  the vector index name, or use the vector index Amazon Resource Name (ARN).

  ## Definitions

  ### Permissions

  You must have the `s3vectors:QueryVectors` permission to use this operation.
  Additional permissions are required based on the request parameters you specify:

     With only `s3vectors:QueryVectors` permission, you can retrieve
  vector keys of approximate nearest neighbors and computed distances between
  these vectors. This permission is sufficient only when you don't set any
  metadata filters and don't request vector data or metadata (by keeping the
  `returnMetadata` parameter set to `false` or not specified).

     If you specify a metadata filter or set `returnMetadata` to true,
  you must have both `s3vectors:QueryVectors` and `s3vectors:GetVectors`
  permissions. The request fails with a `403 Forbidden error` if you request
  metadata filtering, vector data, or metadata without the `s3vectors:GetVectors`
  permission.
  """
  @spec query_vectors(map(), query_vectors_input(), list()) ::
          {:ok, query_vectors_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, query_vectors_errors()}
  def query_vectors(%Client{} = client, input, options \\ []) do
    url_path = "/QueryVectors"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Applies one or more user-defined tags to an Amazon S3 Vectors resource or
  updates existing tags.

  Each tag is a label consisting of a key and value pair. Tags can help you
  organize, track costs for, and control access to your resources. You can add up
  to 50 tags for each resource.

  For a list of S3 resources that support tagging, see [Managing tags for Amazon S3
  resources](https://docs.aws.amazon.com/AmazonS3/latest/userguide/tagging.html#manage-tags).

  ## Definitions

  ### Permissions

  For vector buckets and vector indexes, you must have the `s3vectors:TagResource`
  permission to use this operation.
  """
  @spec tag_resource(map(), String.t() | atom(), tag_resource_input(), list()) ::
          {:ok, tag_resource_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, tag_resource_errors()}
  def tag_resource(%Client{} = client, resource_arn, input, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Removes the specified user-defined tags from an Amazon S3 Vectors resource.

  You can pass one or more tag keys.

  For a list of S3 resources that support tagging, see [Managing tags for Amazon S3
  resources](https://docs.aws.amazon.com/AmazonS3/latest/userguide/tagging.html#manage-tags).

  ## Definitions

  ### Permissions

  For vector buckets and vector indexes, you must have the
  `s3vectors:UntagResource` permission to use this operation.
  """
  @spec untag_resource(map(), String.t() | atom(), untag_resource_input(), list()) ::
          {:ok, untag_resource_output(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, untag_resource_errors()}
  def untag_resource(%Client{} = client, resource_arn, input, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    custom_headers = []

    {query_params, input} =
      [
        {"tagKeys", "tagKeys"}
      ]
      |> Request.build_params(input)

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end
end