From 4006f1ed3b4a1d5d7ba63b66f415427798f6e36a Mon Sep 17 00:00:00 2001 From: Yeuoly Date: Wed, 19 Mar 2025 16:58:24 +0800 Subject: [PATCH] fix: correctly handling exceptions --- api/controllers/console/app/workflow.py | 30 ++++++++++++------- api/controllers/console/explore/completion.py | 8 +++-- api/controllers/console/explore/workflow.py | 6 +++- api/controllers/service_api/app/completion.py | 8 +++-- api/controllers/service_api/app/workflow.py | 6 +++- api/controllers/web/workflow.py | 6 +++- api/services/app_generate_service.py | 8 ++--- 7 files changed, 51 insertions(+), 21 deletions(-) diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index d8b7225aae..9f906f3c0c 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -6,11 +6,15 @@ from flask import abort, request from flask_restful import Resource, inputs, marshal_with, reqparse # type: ignore from sqlalchemy.orm import Session from werkzeug.exceptions import Forbidden, InternalServerError, NotFound - +from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError import services from configs import dify_config from controllers.console import api -from controllers.console.app.error import ConversationCompletedError, DraftWorkflowNotExist, DraftWorkflowNotSync +from controllers.console.app.error import ( + ConversationCompletedError, + DraftWorkflowNotExist, + DraftWorkflowNotSync, +) from controllers.console.app.wraps import get_app_model from controllers.console.wraps import account_initialization_required, setup_required from core.app.apps.base_app_queue_manager import AppQueueManager @@ -28,6 +32,7 @@ from models.model import AppMode from services.app_generate_service import AppGenerateService from services.errors.app import WorkflowHashNotEqualError from services.workflow_service import DraftWorkflowDeletionError, WorkflowInUseError, WorkflowService +from services.errors.llm import InvokeRateLimitError logger = logging.getLogger(__name__) @@ -168,6 +173,8 @@ class AdvancedChatDraftWorkflowRunApi(Resource): raise NotFound("Conversation Not Exists.") except services.errors.conversation.ConversationCompletedError: raise ConversationCompletedError() + except InvokeRateLimitError as ex: + raise InvokeRateLimitHttpError(ex.description) except ValueError as e: raise e except Exception: @@ -344,15 +351,18 @@ class DraftWorkflowRunApi(Resource): parser.add_argument("files", type=list, required=False, location="json") args = parser.parse_args() - response = AppGenerateService.generate( - app_model=app_model, - user=current_user, - args=args, - invoke_from=InvokeFrom.DEBUGGER, - streaming=True, - ) + try: + response = AppGenerateService.generate( + app_model=app_model, + user=current_user, + args=args, + invoke_from=InvokeFrom.DEBUGGER, + streaming=True, + ) - return helper.compact_generate_response(response) + return helper.compact_generate_response(response) + except InvokeRateLimitError as ex: + raise InvokeRateLimitHttpError(ex.description) class WorkflowTaskStopApi(Resource): diff --git a/api/controllers/console/explore/completion.py b/api/controllers/console/explore/completion.py index 1af3cf21f7..be76501863 100644 --- a/api/controllers/console/explore/completion.py +++ b/api/controllers/console/explore/completion.py @@ -29,6 +29,8 @@ from libs import helper from libs.helper import uuid_value from models.model import AppMode from services.app_generate_service import AppGenerateService +from services.errors.llm import InvokeRateLimitError +from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError # define completion api for user @@ -75,7 +77,7 @@ class CompletionApi(InstalledAppResource): raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logging.exception("internal server error.") raise InternalServerError() @@ -133,9 +135,11 @@ class ChatApi(InstalledAppResource): raise ProviderModelCurrentlyNotSupportError() except InvokeError as e: raise CompletionRequestError(e.description) + except InvokeRateLimitError as ex: + raise InvokeRateLimitHttpError(ex.description) except ValueError as e: raise e - except Exception as e: + except Exception: logging.exception("internal server error.") raise InternalServerError() diff --git a/api/controllers/console/explore/workflow.py b/api/controllers/console/explore/workflow.py index bca837d66e..fb2f5df20c 100644 --- a/api/controllers/console/explore/workflow.py +++ b/api/controllers/console/explore/workflow.py @@ -9,6 +9,8 @@ from controllers.console.app.error import ( ProviderNotInitializeError, ProviderQuotaExceededError, ) +from services.errors.llm import InvokeRateLimitError +from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError from controllers.console.explore.error import NotWorkflowAppError from controllers.console.explore.wraps import InstalledAppResource from core.app.apps.base_app_queue_manager import AppQueueManager @@ -56,9 +58,11 @@ class InstalledAppWorkflowRunApi(InstalledAppResource): raise ProviderModelCurrentlyNotSupportError() except InvokeError as e: raise CompletionRequestError(e.description) + except InvokeRateLimitError as ex: + raise InvokeRateLimitHttpError(ex.description) except ValueError as e: raise e - except Exception as e: + except Exception: logging.exception("internal server error.") raise InternalServerError() diff --git a/api/controllers/service_api/app/completion.py b/api/controllers/service_api/app/completion.py index 647efc8149..46b190c2c0 100644 --- a/api/controllers/service_api/app/completion.py +++ b/api/controllers/service_api/app/completion.py @@ -27,6 +27,8 @@ from libs import helper from libs.helper import uuid_value from models.model import App, AppMode, EndUser from services.app_generate_service import AppGenerateService +from services.errors.llm import InvokeRateLimitError +from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError class CompletionApi(Resource): @@ -75,7 +77,7 @@ class CompletionApi(Resource): raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logging.exception("internal server error.") raise InternalServerError() @@ -130,11 +132,13 @@ class ChatApi(Resource): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() + except InvokeRateLimitError as ex: + raise InvokeRateLimitHttpError(ex.description) except InvokeError as e: raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logging.exception("internal server error.") raise InternalServerError() diff --git a/api/controllers/service_api/app/workflow.py b/api/controllers/service_api/app/workflow.py index db8f031547..d36dee10a0 100644 --- a/api/controllers/service_api/app/workflow.py +++ b/api/controllers/service_api/app/workflow.py @@ -30,6 +30,8 @@ from models.model import App, AppMode, EndUser from models.workflow import WorkflowRun, WorkflowRunStatus from services.app_generate_service import AppGenerateService from services.workflow_app_service import WorkflowAppService +from services.errors.llm import InvokeRateLimitError +from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError logger = logging.getLogger(__name__) @@ -93,11 +95,13 @@ class WorkflowRunApi(Resource): raise ProviderQuotaExceededError() except ModelCurrentlyNotSupportError: raise ProviderModelCurrentlyNotSupportError() + except InvokeRateLimitError as ex: + raise InvokeRateLimitHttpError(ex.description) except InvokeError as e: raise CompletionRequestError(e.description) except ValueError as e: raise e - except Exception as e: + except Exception: logging.exception("internal server error.") raise InternalServerError() diff --git a/api/controllers/web/workflow.py b/api/controllers/web/workflow.py index 59c5193b58..1cdfa27fc0 100644 --- a/api/controllers/web/workflow.py +++ b/api/controllers/web/workflow.py @@ -23,6 +23,8 @@ from core.model_runtime.errors.invoke import InvokeError from libs import helper from models.model import App, AppMode, EndUser from services.app_generate_service import AppGenerateService +from services.errors.llm import InvokeRateLimitError +from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError logger = logging.getLogger(__name__) @@ -55,9 +57,11 @@ class WorkflowRunApi(WebApiResource): raise ProviderModelCurrentlyNotSupportError() except InvokeError as e: raise CompletionRequestError(e.description) + except InvokeRateLimitError as ex: + raise InvokeRateLimitHttpError(ex.description) except ValueError as e: raise e - except Exception as e: + except Exception: logging.exception("internal server error.") raise InternalServerError() diff --git a/api/services/app_generate_service.py b/api/services/app_generate_service.py index 80de862e6c..378d626440 100644 --- a/api/services/app_generate_service.py +++ b/api/services/app_generate_service.py @@ -14,7 +14,6 @@ from core.app.features.rate_limiting import RateLimit from libs.helper import RateLimiter from models.model import Account, App, AppMode, EndUser from models.workflow import Workflow -from services.billing_service import BillingService from services.errors.llm import InvokeRateLimitError from services.workflow_service import WorkflowService @@ -41,13 +40,14 @@ class AppGenerateService: :return: """ # system level rate limiter - if dify_config.BILLING_ENABLED: + if not dify_config.BILLING_ENABLED: # check if it's free plan - limit_info = BillingService.get_info(app_model.tenant_id) + # limit_info = BillingService.get_info(app_model.tenant_id) + limit_info = {"subscription": {"plan": "sandbox"}} if limit_info["subscription"]["plan"] == "sandbox": if cls.system_rate_limiter.is_rate_limited(app_model.tenant_id): raise InvokeRateLimitError( - "Rate limit exceeded, please upgrade your plan" + "Rate limit exceeded, please upgrade your plan " f"or your RPD was {dify_config.APP_DAILY_RATE_LIMIT} requests/day" ) cls.system_rate_limiter.increment_rate_limit(app_model.tenant_id)