| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | from typing import Optionalfrom core.tool.provider.base import BaseToolProviderfrom core.tool.provider.errors import ToolValidateFailedErrorfrom core.tool.serpapi_wrapper import OptimizedSerpAPIWrapperfrom models.tool import ToolProviderNameclass SerpAPIToolProvider(BaseToolProvider):    def get_provider_name(self) -> ToolProviderName:        """        Returns the name of the provider.        :return:        """        return ToolProviderName.SERPAPI    def get_credentials(self, obfuscated: bool = False) -> Optional[dict]:        """        Returns the credentials for SerpAPI as a dictionary.        :param obfuscated: obfuscate credentials if True        :return:        """        tool_provider = self.get_provider(must_enabled=True)        if not tool_provider:            return None        credentials = tool_provider.credentials        if not credentials:            return None        if credentials.get('api_key'):            credentials['api_key'] = self.decrypt_token(credentials.get('api_key'), obfuscated)        return credentials    def credentials_to_func_kwargs(self) -> Optional[dict]:        """        Returns the credentials function kwargs as a dictionary.        :return:        """        credentials = self.get_credentials()        if not credentials:            return None        return {            'serpapi_api_key': credentials.get('api_key')        }    def credentials_validate(self, credentials: dict):        """        Validates the given credentials.        :param credentials:        :return:        """        if 'api_key' not in credentials or not credentials.get('api_key'):            raise ToolValidateFailedError("SerpAPI api_key is required.")        api_key = credentials.get('api_key')        try:            OptimizedSerpAPIWrapper(serpapi_api_key=api_key).run(query='test')        except Exception as e:            raise ToolValidateFailedError("SerpAPI api_key is invalid. {}".format(e))    def encrypt_credentials(self, credentials: dict) -> Optional[dict]:        """        Encrypts the given credentials.        :param credentials:        :return:        """        credentials['api_key'] = self.encrypt_token(credentials.get('api_key'))        return credentials
 |