code: def tangent(obj, params, **kwargs):
      
      normalize = kwargs.get('normalize', True)
      if isinstance(obj, abstract.Curve):
          if isinstance(params, (list, tuple)):
              return ops.tangent_curve_single_list(obj, params, normalize)
          else:
              return ops.tangent_curve_single(obj, params, normalize)
      if isinstance(obj, abstract.Surface):
          if isinstance(params[0], float):
              return ops.tangent_surface_single(obj, params, normalize)
          else:
              return ops.tangent_surface_single_list(obj, params, normalize)
docs: Evaluates the tangent vector of the curves or surfaces at the input parameter values.
  
      This function is designed to evaluate tangent vectors of the B-Spline and NURBS shapes at single or
      multiple parameter positions.
  
      :param obj: input shape
      :type obj: abstract.Curve or abstract.Surface
      :param params: parameters
      :type params: float, list or tuple
      :return: a list containing "point" and "vector" pairs
      :rtype: tuple