from core.builtin_concepts import BuiltinConcepts from evaluators.BaseEvaluator import AllReturnValuesEvaluator from parsers.BaseParser import BaseParser class OneSuccessEvaluator(AllReturnValuesEvaluator): """ Used to filter the responses It has a low priority to let other evaluators try to resolve the errors Make sure that there is only one successful answer """ NAME = "OneSuccess" def __init__(self): super().__init__(self.NAME, [BuiltinConcepts.AFTER_EVALUATION], 60) # before MultipleSameSuccess self.successful_return_value = None def matches(self, context, return_values): nb_successful_evaluators = 0 to_process = False for ret in return_values: if ret.status and ret.who.startswith(BaseParser.PREFIX): return False elif ret.status and context.sheerka.isinstance(ret.body, BuiltinConcepts.REDUCE_REQUESTED): to_process = True self.eaten.append(ret) elif ret.status and ret.who.startswith(self.PREFIX): nb_successful_evaluators += 1 self.successful_return_value = ret self.eaten.append(ret) elif not ret.status: self.eaten.append(ret) return to_process and nb_successful_evaluators == 1 def eval(self, context, return_values): context.log(self.verbose_log, f"1 successful return value, {len(self.eaten)} item(s) eaten", who=self) context.log(self.verbose_log, f"{self.successful_return_value}", who=self) sheerka = context.sheerka return sheerka.ret(self.name, True, self.successful_return_value.value, parents=self.eaten)