code: def tensordot(
      x1: Union[ivy.Array, ivy.NativeArray],
      x2: Union[ivy.Array, ivy.NativeArray],
      /,
      *,
      axes: Union[int, Tuple[List[int], List[int]]] = 2,
      out: Optional[ivy.Array] = None,
  ) -> ivy.Array:
      """Return a tensor contraction of x1 and x2 over specific axes.
  
      .. note::
          If either ``x1`` or ``x2`` has a complex floating-point data type, neither
          argument must be complex-conjugated or transposed. If conjugation and/or
          transposition is desired, these operations should explicitly performed
          prior to computing the generalized matrix product.
  
      Parameters
      ----------
      x1
          First input array. Should have a numeric data type.
      x2
          second input array. Must be compatible with x1 for all non-contracted axes.
          Should have a numeric data type.
      axes
          The axes to contract over.
          Default is 2.
      out
          optional output array, for writing the result to. It must have a shape that the
          inputs broadcast to.
  
      Returns
      -------
      ret
          The tensor contraction of x1 and x2 over the specified axes.
  
  
      This function conforms to the `Array API Standard
      <https://data-apis.org/array-api/latest/>`_. This docstring is an extension of the
      `docstring <https://data-apis.org/array-api/latest/
      extensions/generated/array_api.linalg.tensordot.html>`_
      in the standard.
  
      Both the description and the type hints above assumes an array input for simplicity,
      but this function is *nestable*, and therefore also accepts :class:`ivy.Container`
      instances in place of any of the arguments.
  
      Examples
      --------
      With :class:`ivy.Array` input:
  
      >>> x = ivy.array([[1., 2.], [2., 3.]])
      >>> y = ivy.array([[3., 4.], [4., 5.]])
      >>> res = ivy.tensordot(x, y, axes =0)
      >>> print(res)
      ivy.array([[[[3.,4.],[4.,5.]],[[6.,8.],[8.,10.]]],[[[6.,8.],[8.,10.]],[[9.,12.],[12.,15.]]]])
  
      With :class:'ivy.NativeArray' input:
  
      >>> x = ivy.native_array([[1., 2.], [2., 3.]])
      >>> y = ivy.native_array([[3., 4.], [4., 5.]])
      >>> res = ivy.tensordot(x, y, axes = (1,1))
      >>> print(res)
      ivy.array([[11., 14.],
              [18., 23.]])
  
      With a mix of :class:`ivy.Array` and :class:`ivy.NativeArray` inputs:
  
      >>> x = ivy.array([[1., 0., 1.], [2., 3., 6.], [0., 7., 2.]])
      >>> y = ivy.native_array([[1.], [2.], [3.]])
      >>> res = ivy.tensordot(x, y, axes = 1)
      >>> print(res)
      ivy.array([[ 4.],
                  [26.],
                  [20.]])
  
      With :class:`ivy.Container` input:
  
      >>> x = ivy.Container(a=ivy.array([[1., 0., 3.], [2., 3., 4.]]),
      ...                   b=ivy.array([[5., 6., 7.], [3., 4., 8.]]))
      >>> y = ivy.Container(a=ivy.array([[2., 4., 5.], [9., 10., 6.]]),
      ...                   b=ivy.array([[1., 0., 3.], [2., 3., 4.]]))
      >>> res = ivy.tensordot(x, y)
      >>> print(res)
      {
          a: ivy.array(89.),
          b: ivy.array(76.)
      }
      """
      return current_backend(x1, x2).tensordot(
          x1, x2, axes=axes, out=out
      )
  
imports: from typing import Union, Optional, Tuple, Literal, List, Sequence
  import ivy
  from ivy.utils.backend import current_backend
  from ivy.func_wrapper import handle_array_function, to_native_arrays_and_back, handle_out_argument, handle_nestable, handle_array_like_without_promotion, handle_device, handle_backend_invalid
  from ivy.utils.exceptions import handle_exceptions
label_desc: Use image node_id 22 for calling a global function with example usage: tensordot() and returns: current_backend