fix: correctly handling exceptions

This commit is contained in:
Yeuoly 2025-03-19 16:58:24 +08:00
parent c418e6c95d
commit 4006f1ed3b
7 changed files with 51 additions and 21 deletions

View File

@ -6,11 +6,15 @@ from flask import abort, request
from flask_restful import Resource, inputs, marshal_with, reqparse # type: ignore from flask_restful import Resource, inputs, marshal_with, reqparse # type: ignore
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from werkzeug.exceptions import Forbidden, InternalServerError, NotFound from werkzeug.exceptions import Forbidden, InternalServerError, NotFound
from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError
import services import services
from configs import dify_config from configs import dify_config
from controllers.console import api 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.app.wraps import get_app_model
from controllers.console.wraps import account_initialization_required, setup_required from controllers.console.wraps import account_initialization_required, setup_required
from core.app.apps.base_app_queue_manager import AppQueueManager 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.app_generate_service import AppGenerateService
from services.errors.app import WorkflowHashNotEqualError from services.errors.app import WorkflowHashNotEqualError
from services.workflow_service import DraftWorkflowDeletionError, WorkflowInUseError, WorkflowService from services.workflow_service import DraftWorkflowDeletionError, WorkflowInUseError, WorkflowService
from services.errors.llm import InvokeRateLimitError
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -168,6 +173,8 @@ class AdvancedChatDraftWorkflowRunApi(Resource):
raise NotFound("Conversation Not Exists.") raise NotFound("Conversation Not Exists.")
except services.errors.conversation.ConversationCompletedError: except services.errors.conversation.ConversationCompletedError:
raise ConversationCompletedError() raise ConversationCompletedError()
except InvokeRateLimitError as ex:
raise InvokeRateLimitHttpError(ex.description)
except ValueError as e: except ValueError as e:
raise e raise e
except Exception: except Exception:
@ -344,6 +351,7 @@ class DraftWorkflowRunApi(Resource):
parser.add_argument("files", type=list, required=False, location="json") parser.add_argument("files", type=list, required=False, location="json")
args = parser.parse_args() args = parser.parse_args()
try:
response = AppGenerateService.generate( response = AppGenerateService.generate(
app_model=app_model, app_model=app_model,
user=current_user, user=current_user,
@ -353,6 +361,8 @@ class DraftWorkflowRunApi(Resource):
) )
return helper.compact_generate_response(response) return helper.compact_generate_response(response)
except InvokeRateLimitError as ex:
raise InvokeRateLimitHttpError(ex.description)
class WorkflowTaskStopApi(Resource): class WorkflowTaskStopApi(Resource):

View File

@ -29,6 +29,8 @@ from libs import helper
from libs.helper import uuid_value from libs.helper import uuid_value
from models.model import AppMode from models.model import AppMode
from services.app_generate_service import AppGenerateService 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 # define completion api for user
@ -75,7 +77,7 @@ class CompletionApi(InstalledAppResource):
raise CompletionRequestError(e.description) raise CompletionRequestError(e.description)
except ValueError as e: except ValueError as e:
raise e raise e
except Exception as e: except Exception:
logging.exception("internal server error.") logging.exception("internal server error.")
raise InternalServerError() raise InternalServerError()
@ -133,9 +135,11 @@ class ChatApi(InstalledAppResource):
raise ProviderModelCurrentlyNotSupportError() raise ProviderModelCurrentlyNotSupportError()
except InvokeError as e: except InvokeError as e:
raise CompletionRequestError(e.description) raise CompletionRequestError(e.description)
except InvokeRateLimitError as ex:
raise InvokeRateLimitHttpError(ex.description)
except ValueError as e: except ValueError as e:
raise e raise e
except Exception as e: except Exception:
logging.exception("internal server error.") logging.exception("internal server error.")
raise InternalServerError() raise InternalServerError()

View File

@ -9,6 +9,8 @@ from controllers.console.app.error import (
ProviderNotInitializeError, ProviderNotInitializeError,
ProviderQuotaExceededError, 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.error import NotWorkflowAppError
from controllers.console.explore.wraps import InstalledAppResource from controllers.console.explore.wraps import InstalledAppResource
from core.app.apps.base_app_queue_manager import AppQueueManager from core.app.apps.base_app_queue_manager import AppQueueManager
@ -56,9 +58,11 @@ class InstalledAppWorkflowRunApi(InstalledAppResource):
raise ProviderModelCurrentlyNotSupportError() raise ProviderModelCurrentlyNotSupportError()
except InvokeError as e: except InvokeError as e:
raise CompletionRequestError(e.description) raise CompletionRequestError(e.description)
except InvokeRateLimitError as ex:
raise InvokeRateLimitHttpError(ex.description)
except ValueError as e: except ValueError as e:
raise e raise e
except Exception as e: except Exception:
logging.exception("internal server error.") logging.exception("internal server error.")
raise InternalServerError() raise InternalServerError()

View File

@ -27,6 +27,8 @@ from libs import helper
from libs.helper import uuid_value from libs.helper import uuid_value
from models.model import App, AppMode, EndUser from models.model import App, AppMode, EndUser
from services.app_generate_service import AppGenerateService from services.app_generate_service import AppGenerateService
from services.errors.llm import InvokeRateLimitError
from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError
class CompletionApi(Resource): class CompletionApi(Resource):
@ -75,7 +77,7 @@ class CompletionApi(Resource):
raise CompletionRequestError(e.description) raise CompletionRequestError(e.description)
except ValueError as e: except ValueError as e:
raise e raise e
except Exception as e: except Exception:
logging.exception("internal server error.") logging.exception("internal server error.")
raise InternalServerError() raise InternalServerError()
@ -130,11 +132,13 @@ class ChatApi(Resource):
raise ProviderQuotaExceededError() raise ProviderQuotaExceededError()
except ModelCurrentlyNotSupportError: except ModelCurrentlyNotSupportError:
raise ProviderModelCurrentlyNotSupportError() raise ProviderModelCurrentlyNotSupportError()
except InvokeRateLimitError as ex:
raise InvokeRateLimitHttpError(ex.description)
except InvokeError as e: except InvokeError as e:
raise CompletionRequestError(e.description) raise CompletionRequestError(e.description)
except ValueError as e: except ValueError as e:
raise e raise e
except Exception as e: except Exception:
logging.exception("internal server error.") logging.exception("internal server error.")
raise InternalServerError() raise InternalServerError()

View File

@ -30,6 +30,8 @@ from models.model import App, AppMode, EndUser
from models.workflow import WorkflowRun, WorkflowRunStatus from models.workflow import WorkflowRun, WorkflowRunStatus
from services.app_generate_service import AppGenerateService from services.app_generate_service import AppGenerateService
from services.workflow_app_service import WorkflowAppService 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__) logger = logging.getLogger(__name__)
@ -93,11 +95,13 @@ class WorkflowRunApi(Resource):
raise ProviderQuotaExceededError() raise ProviderQuotaExceededError()
except ModelCurrentlyNotSupportError: except ModelCurrentlyNotSupportError:
raise ProviderModelCurrentlyNotSupportError() raise ProviderModelCurrentlyNotSupportError()
except InvokeRateLimitError as ex:
raise InvokeRateLimitHttpError(ex.description)
except InvokeError as e: except InvokeError as e:
raise CompletionRequestError(e.description) raise CompletionRequestError(e.description)
except ValueError as e: except ValueError as e:
raise e raise e
except Exception as e: except Exception:
logging.exception("internal server error.") logging.exception("internal server error.")
raise InternalServerError() raise InternalServerError()

View File

@ -23,6 +23,8 @@ from core.model_runtime.errors.invoke import InvokeError
from libs import helper from libs import helper
from models.model import App, AppMode, EndUser from models.model import App, AppMode, EndUser
from services.app_generate_service import AppGenerateService 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__) logger = logging.getLogger(__name__)
@ -55,9 +57,11 @@ class WorkflowRunApi(WebApiResource):
raise ProviderModelCurrentlyNotSupportError() raise ProviderModelCurrentlyNotSupportError()
except InvokeError as e: except InvokeError as e:
raise CompletionRequestError(e.description) raise CompletionRequestError(e.description)
except InvokeRateLimitError as ex:
raise InvokeRateLimitHttpError(ex.description)
except ValueError as e: except ValueError as e:
raise e raise e
except Exception as e: except Exception:
logging.exception("internal server error.") logging.exception("internal server error.")
raise InternalServerError() raise InternalServerError()

View File

@ -14,7 +14,6 @@ from core.app.features.rate_limiting import RateLimit
from libs.helper import RateLimiter from libs.helper import RateLimiter
from models.model import Account, App, AppMode, EndUser from models.model import Account, App, AppMode, EndUser
from models.workflow import Workflow from models.workflow import Workflow
from services.billing_service import BillingService
from services.errors.llm import InvokeRateLimitError from services.errors.llm import InvokeRateLimitError
from services.workflow_service import WorkflowService from services.workflow_service import WorkflowService
@ -41,13 +40,14 @@ class AppGenerateService:
:return: :return:
""" """
# system level rate limiter # system level rate limiter
if dify_config.BILLING_ENABLED: if not dify_config.BILLING_ENABLED:
# check if it's free plan # 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 limit_info["subscription"]["plan"] == "sandbox":
if cls.system_rate_limiter.is_rate_limited(app_model.tenant_id): if cls.system_rate_limiter.is_rate_limited(app_model.tenant_id):
raise InvokeRateLimitError( 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" f"or your RPD was {dify_config.APP_DAILY_RATE_LIMIT} requests/day"
) )
cls.system_rate_limiter.increment_rate_limit(app_model.tenant_id) cls.system_rate_limiter.increment_rate_limit(app_model.tenant_id)