def on(self, *args, **kwargs) -> Feedback:
        """
        Create a variant of `self` with the same implementation but the given
        selectors. Those provided positionally get their implementation argument
        name guessed and those provided as kwargs get their name from the kwargs
        key.
        """
        if is_otel_tracing_enabled():
            if len(args) != 1 or len(kwargs) > 0:
                raise ValueError(
                    "OTEL mode only supports a single positional argument to `on`."
                )
            selectors = args[0]
            if not isinstance(selectors, dict):
                raise ValueError(
                    f"OTEL mode only supports dictionary selectors, not {type(selectors)}!"
                )
            sig = signature(self.imp)
            feedback_function_parameters = set(sig.parameters.keys())
            new_selectors = self.selectors.copy()
            for k, v in selectors.items():
                if not isinstance(k, str):
                    raise ValueError(
                        f"OTEL mode only supports string keys, not {type(k)}!"
                    )
                if k not in feedback_function_parameters:
                    raise ValueError(
                        f"Selector key {k} not found in feedback function parameters {feedback_function_parameters}!"
                    )
                if not isinstance(v, Selector):
                    raise ValueError(
                        f"OTEL mode only supports Selector values, not {type(v)}!"
                    )
                new_selectors[k] = v
            ret = self.model_copy()
            ret.selectors = new_selectors
            return ret

        new_selectors = self.selectors.copy()

        for k, v in kwargs.items():
            if not isinstance(v, serial_utils.Lens):
                raise ValueError(
                    f"Expected a Lens but got `{v}` of type `{python_utils.class_name(type(v))}`."
                )
            new_selectors[k] = v

        new_selectors.update(kwargs)

        for path in args:
            if not isinstance(path, serial_utils.Lens):
                raise ValueError(
                    f"Expected a Lens but got `{path}` of type `{python_utils.class_name(type(path))}`."
                )

            argname = self._next_unselected_arg_name()
            new_selectors[argname] = path
            self._print_guessed_selector(argname, path)

        ret = self.model_copy()

        ret.selectors = new_selectors

        return ret

        Create a variant of `self` with the same implementation but the given
        selectors. Those provided positionally get their implementation argument
        name guessed and those provided as kwargs get their name from the kwargs
        key.
        
src/core/trulens/core/feedback/feedback.py