| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 | import loggingfrom typing import Optionalimport requestsfrom configs import dify_configfrom services.recommend_app.buildin.buildin_retrieval import BuildInRecommendAppRetrievalfrom services.recommend_app.recommend_app_base import RecommendAppRetrievalBasefrom services.recommend_app.recommend_app_type import RecommendAppTypelogger = logging.getLogger(__name__)class RemoteRecommendAppRetrieval(RecommendAppRetrievalBase):    """    Retrieval recommended app from dify official    """    def get_recommend_app_detail(self, app_id: str):        try:            result = self.fetch_recommended_app_detail_from_dify_official(app_id)        except Exception as e:            logger.warning(f"fetch recommended app detail from dify official failed: {e}, switch to built-in.")            result = BuildInRecommendAppRetrieval.fetch_recommended_app_detail_from_builtin(app_id)        return result    def get_recommended_apps_and_categories(self, language: str) -> dict:        try:            result = self.fetch_recommended_apps_from_dify_official(language)        except Exception as e:            logger.warning(f"fetch recommended apps from dify official failed: {e}, switch to built-in.")            result = BuildInRecommendAppRetrieval.fetch_recommended_apps_from_builtin(language)        return result    def get_type(self) -> str:        return RecommendAppType.REMOTE    @classmethod    def fetch_recommended_app_detail_from_dify_official(cls, app_id: str) -> Optional[dict]:        """        Fetch recommended app detail from dify official.        :param app_id: App ID        :return:        """        domain = dify_config.HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN        url = f"{domain}/apps/{app_id}"        response = requests.get(url, timeout=(3, 10))        if response.status_code != 200:            return None        data: dict = response.json()        return data    @classmethod    def fetch_recommended_apps_from_dify_official(cls, language: str) -> dict:        """        Fetch recommended apps from dify official.        :param language: language        :return:        """        domain = dify_config.HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN        url = f"{domain}/apps?language={language}"        response = requests.get(url, timeout=(3, 10))        if response.status_code != 200:            raise ValueError(f"fetch recommended apps failed, status code: {response.status_code}")        result: dict = response.json()        if "categories" in result:            result["categories"] = sorted(result["categories"])        return result
 |