diff --git a/simplemind/providers/_base.py b/simplemind/providers/_base.py index 05b4b74..235e030 100644 --- a/simplemind/providers/_base.py +++ b/simplemind/providers/_base.py @@ -34,12 +34,18 @@ class BaseProvider(ABC): raise NotImplementedError @abstractmethod - def send_conversation(self, conversation: "Conversation") -> "Message": + def send_conversation( + self, + conversation: "Conversation", + tools: list[Callable] | None = None, + ) -> "Message": """Send a conversation to the provider.""" raise NotImplementedError @abstractmethod - def structured_response(self, prompt: str, response_model: Type[T], **kwargs) -> T: + def structured_response( + self, prompt: str, response_model: Type[T], **kwargs + ) -> T: """Get a structured response.""" raise NotImplementedError @@ -64,3 +70,5 @@ class BaseProvider(ABC): def make_tools(self, tools: list[Callable] | None): if tools is not None: return [self.tool.from_function(func) for func in tools] + else: + return [] diff --git a/simplemind/providers/_base_tools.py b/simplemind/providers/_base_tools.py index 6922754..7a2f37f 100644 --- a/simplemind/providers/_base_tools.py +++ b/simplemind/providers/_base_tools.py @@ -42,6 +42,12 @@ class BaseTool(BaseModel, ABC): properties: dict[str, BaseToolProperty] required: list[str] | None = None config: ClassVar[BaseToolConfig] = BaseToolConfig() + raw_func: Callable + tool_id: str | None = None + function_result: str | None = None + + def is_executed(self) -> bool: + return self.function_result is not None @classmethod def convert_type(cls, field_type) -> str: @@ -104,7 +110,14 @@ class BaseTool(BaseModel, ABC): description=(func.__doc__ or "").strip(), properties=properties, required=required, + raw_func=func, ) @abstractmethod - def get_schema(self) -> Any: ... + def get_input_schema(self) -> Any: ... + + @abstractmethod + def handle(self, message) -> None: ... + + @abstractmethod + def get_response_schema(self) -> Any: ...