from core.builtin_concepts import BuiltinConcepts from core.concept import Concept from evaluators.BaseEvaluator import AllReturnValuesEvaluator, BaseEvaluator import logging from parsers.BaseParser import BaseParser log = logging.getLogger(__name__) class MultipleSameSuccessEvaluator(AllReturnValuesEvaluator): """ Used to filter the responses It has a low priority to let other evaluators try to resolve the errors """ def __init__(self): super().__init__("Parsers Evaluator", 10) self.success = [] def matches(self, context, return_values): sheerka = context.sheerka after_evaluation = False nb_successful_evaluators = 0 only_parsers_in_error = True unlisted = False for ret in return_values: if sheerka.isinstance(ret.value, BuiltinConcepts.AFTER_EVALUATION): if ret.status: after_evaluation = True elif ret.who.startswith(BaseEvaluator.PREFIX): if ret.status: nb_successful_evaluators += 1 self.success.append(ret.value) elif ret.who.startswith(BaseParser.PREFIX): if ret.status: only_parsers_in_error = False else: unlisted = True return after_evaluation and nb_successful_evaluators > 1 and only_parsers_in_error and not unlisted def eval(self, context, return_values): reference = self.get_value(self.success[0]) for return_value in self.success[1:]: actual = self.get_value(return_value) if actual != reference: return None sheerka = context.sheerka return sheerka.ret(self.name, True, reference, parents=return_values) @staticmethod def get_value(obj): if not isinstance(obj, Concept): return obj return obj if obj.body is None else obj.body