import base64 class BaseSupervisor(object): _supervisor_registry = {} @classmethod def register_supervisor(cls, supervisor_name): def decorator(subclass): cls._supervisor_registry[supervisor_name] = subclass return subclass return decorator def __new__(cls, supervisor_name, *args, **kwargs): if supervisor_name not in cls._supervisor_registry: raise ValueError( f"No supervisor registered with name '{supervisor_name}'" ) return super(BaseSupervisor, cls).__new__( cls._supervisor_registry[supervisor_name] ) def set_model(self): raise NotImplementedError( "The 'set_model' method must be implemented in derived classes." ) @staticmethod def process_image(image_path): with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode("utf-8") @staticmethod def process_audio(audio_path): return None @staticmethod def process_video(video_path): return None def ask(self, query, image_path): gist = self.ask_info(query, image_path) score = self.ask_score(query, gist, verbose=True) return gist, score def ask_info(self, query: str, context: str = None) -> str: return None def ask_score(self, query: str, gist: str, verbose: bool = False) -> float: return None