| from controllers.console.app.wraps import get_app_model | from controllers.console.app.wraps import get_app_model | ||||
| from controllers.console.setup import setup_required | from controllers.console.setup import setup_required | ||||
| from controllers.console.wraps import account_initialization_required | from controllers.console.wraps import account_initialization_required | ||||
| from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError | |||||
| from core.app.apps.base_app_queue_manager import AppQueueManager | from core.app.apps.base_app_queue_manager import AppQueueManager | ||||
| from core.app.entities.app_invoke_entities import InvokeFrom | from core.app.entities.app_invoke_entities import InvokeFrom | ||||
| from core.errors.error import ( | from core.errors.error import ( | ||||
| from libs.login import login_required | from libs.login import login_required | ||||
| 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 | |||||
| # define completion message api for user | # define completion message api for user | ||||
| 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, AppInvokeQuotaExceededError) as e: | except (ValueError, AppInvokeQuotaExceededError) as e: |
| error_code = "trace_config_check_error" | error_code = "trace_config_check_error" | ||||
| description = "Invalid Credentials." | description = "Invalid Credentials." | ||||
| code = 400 | code = 400 | ||||
| class InvokeRateLimitError(BaseHTTPException): | |||||
| """Raised when the Invoke returns rate limit error.""" | |||||
| error_code = "rate_limit_error" | |||||
| description = "Rate Limit Error" | |||||
| code = 429 |
| ProviderNotInitializeError, | ProviderNotInitializeError, | ||||
| ProviderQuotaExceededError, | ProviderQuotaExceededError, | ||||
| ) | ) | ||||
| from controllers.web.error import InvokeRateLimitError as InvokeRateLimitHttpError | |||||
| from controllers.web.wraps import WebApiResource | from controllers.web.wraps import WebApiResource | ||||
| from core.app.apps.base_app_queue_manager import AppQueueManager | from core.app.apps.base_app_queue_manager import AppQueueManager | ||||
| from core.app.entities.app_invoke_entities import InvokeFrom | from core.app.entities.app_invoke_entities import InvokeFrom | ||||
| 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 | |||||
| # define completion api for user | # define completion api for user | ||||
| 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: |
| error_code = "web_sso_auth_required" | error_code = "web_sso_auth_required" | ||||
| description = "Web SSO authentication required." | description = "Web SSO authentication required." | ||||
| code = 401 | code = 401 | ||||
| class InvokeRateLimitError(BaseHTTPException): | |||||
| """Raised when the Invoke returns rate limit error.""" | |||||
| error_code = "rate_limit_error" | |||||
| description = "Rate Limit Error" | |||||
| code = 429 |
| Custom exception raised when the model not support | Custom exception raised when the model not support | ||||
| """ | """ | ||||
| description = "Model Currently Not Support" | description = "Model Currently Not Support" | ||||
| class InvokeRateLimitError(Exception): | |||||
| """Raised when the Invoke returns rate limit error.""" | |||||
| description = "Rate Limit Error" |
| from collections.abc import Generator | from collections.abc import Generator | ||||
| from typing import Any, Union | from typing import Any, Union | ||||
| from openai._exceptions import RateLimitError | |||||
| from configs import dify_config | from configs import dify_config | ||||
| from core.app.apps.advanced_chat.app_generator import AdvancedChatAppGenerator | from core.app.apps.advanced_chat.app_generator import AdvancedChatAppGenerator | ||||
| from core.app.apps.agent_chat.app_generator import AgentChatAppGenerator | from core.app.apps.agent_chat.app_generator import AgentChatAppGenerator | ||||
| from core.app.entities.app_invoke_entities import InvokeFrom | from core.app.entities.app_invoke_entities import InvokeFrom | ||||
| from core.app.features.rate_limiting import RateLimit | from core.app.features.rate_limiting import RateLimit | ||||
| from models.model import Account, App, AppMode, EndUser | from models.model import Account, App, AppMode, EndUser | ||||
| from services.errors.llm import InvokeRateLimitError | |||||
| from services.workflow_service import WorkflowService | from services.workflow_service import WorkflowService | ||||
| ) | ) | ||||
| else: | else: | ||||
| raise ValueError(f"Invalid app mode {app_model.mode}") | raise ValueError(f"Invalid app mode {app_model.mode}") | ||||
| except RateLimitError as e: | |||||
| raise InvokeRateLimitError(str(e)) | |||||
| finally: | finally: | ||||
| if not streaming: | if not streaming: | ||||
| rate_limit.exit(request_id) | rate_limit.exit(request_id) |
| from typing import Optional | |||||
| class InvokeError(Exception): | |||||
| """Base class for all LLM exceptions.""" | |||||
| description: Optional[str] = None | |||||
| def __init__(self, description: Optional[str] = None) -> None: | |||||
| self.description = description | |||||
| def __str__(self): | |||||
| return self.description or self.__class__.__name__ | |||||
| class InvokeRateLimitError(InvokeError): | |||||
| """Raised when the Invoke returns rate limit error.""" | |||||
| description = "Rate Limit Error" |