from typing import Any
from abc import ABC, abstractmethod

from instructor import OpenAISchema

__all__ = ["FnCallOAI"]


class OAISchema(OpenAISchema):
    @property
    def tool(self) -> dict:
        """ Retorna la tool en el formato que OpenAI espera."""
        return {"type": "function", "function": self.openai_schema}

# TODO: Quizás crear distintas categorías o tipos de tools, clasificadores, checkeadores,...
class FnCallOAI(OAISchema, ABC):
    @classmethod
    @abstractmethod
    def fn_name(cls) -> str:
        ...
    
    @abstractmethod
    def execute(self, *args, **kwargs) -> Any:
        ...
