From 34697281173809c0ea2ea3818d12de1835eea2d2 Mon Sep 17 00:00:00 2001 From: Nian <11332799+Lillian68@users.noreply.github.com> Date: Tue, 26 May 2026 16:32:38 +0800 Subject: [PATCH] chore: add InstalledApp type annotations to api endpoints (#36678) --- api/controllers/console/explore/audio.py | 9 ++++++-- api/controllers/console/explore/completion.py | 18 +++++++++++---- .../console/explore/conversation.py | 23 ++++++++++++++----- .../console/explore/installed_app.py | 4 ++-- api/controllers/console/explore/message.py | 19 +++++++++++---- .../console/explore/saved_message.py | 14 ++++++++--- 6 files changed, 64 insertions(+), 23 deletions(-) diff --git a/api/controllers/console/explore/audio.py b/api/controllers/console/explore/audio.py index ab660d9dc3..42b611cafd 100644 --- a/api/controllers/console/explore/audio.py +++ b/api/controllers/console/explore/audio.py @@ -20,6 +20,7 @@ from controllers.console.app.error import ( from controllers.console.explore.wraps import InstalledAppResource from core.errors.error import ModelCurrentlyNotSupportError, ProviderTokenNotInitError, QuotaExceededError from graphon.model_runtime.errors.invoke import InvokeError +from models.model import InstalledApp from services.audio_service import AudioService from services.errors.audio import ( AudioTooLargeServiceError, @@ -40,8 +41,10 @@ register_schema_model(console_ns, TextToAudioPayload) endpoint="installed_app_audio", ) class ChatAudioApi(InstalledAppResource): - def post(self, installed_app): + def post(self, installed_app: InstalledApp): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() file = request.files["file"] @@ -81,8 +84,10 @@ class ChatAudioApi(InstalledAppResource): ) class ChatTextApi(InstalledAppResource): @console_ns.expect(console_ns.models[TextToAudioPayload.__name__]) - def post(self, installed_app): + def post(self, installed_app: InstalledApp): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() try: payload = TextToAudioPayload.model_validate(console_ns.payload or {}) diff --git a/api/controllers/console/explore/completion.py b/api/controllers/console/explore/completion.py index 72e2d923da..c08e8690a8 100644 --- a/api/controllers/console/explore/completion.py +++ b/api/controllers/console/explore/completion.py @@ -31,7 +31,7 @@ from libs import helper from libs.datetime_utils import naive_utc_now from libs.login import current_user from models import Account -from models.model import AppMode +from models.model import AppMode, InstalledApp from services.app_generate_service import AppGenerateService from services.app_task_service import AppTaskService from services.errors.llm import InvokeRateLimitError @@ -83,8 +83,10 @@ register_response_schema_models(console_ns, SimpleResultResponse) ) class CompletionApi(InstalledAppResource): @console_ns.expect(console_ns.models[CompletionMessageExplorePayload.__name__]) - def post(self, installed_app): + def post(self, installed_app: InstalledApp): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() if app_model.mode != AppMode.COMPLETION: raise NotCompletionAppError() @@ -133,8 +135,10 @@ class CompletionApi(InstalledAppResource): ) class CompletionStopApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[SimpleResultResponse.__name__]) - def post(self, installed_app, task_id: str): + def post(self, installed_app: InstalledApp, task_id: str): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() if app_model.mode != AppMode.COMPLETION: raise NotCompletionAppError() @@ -157,8 +161,10 @@ class CompletionStopApi(InstalledAppResource): ) class ChatApi(InstalledAppResource): @console_ns.expect(console_ns.models[ChatMessagePayload.__name__]) - def post(self, installed_app): + def post(self, installed_app: InstalledApp): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() @@ -209,8 +215,10 @@ class ChatApi(InstalledAppResource): ) class ChatStopApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[SimpleResultResponse.__name__]) - def post(self, installed_app, task_id: str): + def post(self, installed_app: InstalledApp, task_id: str): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() diff --git a/api/controllers/console/explore/conversation.py b/api/controllers/console/explore/conversation.py index a3ae59aaf7..68e18a0207 100644 --- a/api/controllers/console/explore/conversation.py +++ b/api/controllers/console/explore/conversation.py @@ -8,6 +8,7 @@ from werkzeug.exceptions import NotFound from controllers.common.controller_schemas import ConversationRenamePayload from controllers.common.schema import register_response_schema_models, register_schema_models +from controllers.console.app.error import AppUnavailableError from controllers.console.explore.error import NotChatAppError from controllers.console.explore.wraps import InstalledAppResource from core.app.entities.app_invoke_entities import InvokeFrom @@ -20,7 +21,7 @@ from fields.conversation_fields import ( from libs.helper import UUIDStrOrEmpty from libs.login import current_user from models import Account -from models.model import AppMode +from models.model import AppMode, InstalledApp from services.conversation_service import ConversationService from services.errors.conversation import ConversationNotExistsError, LastConversationNotExistsError from services.web_conversation_service import WebConversationService @@ -44,8 +45,10 @@ register_response_schema_models(console_ns, ResultResponse) ) class ConversationListApi(InstalledAppResource): @console_ns.expect(console_ns.models[ConversationListQuery.__name__]) - def get(self, installed_app): + def get(self, installed_app: InstalledApp): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() @@ -92,8 +95,10 @@ class ConversationListApi(InstalledAppResource): ) class ConversationApi(InstalledAppResource): @console_ns.response(204, "Conversation deleted successfully") - def delete(self, installed_app, c_id: UUID): + def delete(self, installed_app: InstalledApp, c_id: UUID): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() @@ -115,8 +120,10 @@ class ConversationApi(InstalledAppResource): ) class ConversationRenameApi(InstalledAppResource): @console_ns.expect(console_ns.models[ConversationRenamePayload.__name__]) - def post(self, installed_app, c_id: UUID): + def post(self, installed_app: InstalledApp, c_id: UUID): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() @@ -146,8 +153,10 @@ class ConversationRenameApi(InstalledAppResource): ) class ConversationPinApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[ResultResponse.__name__]) - def patch(self, installed_app, c_id: UUID): + def patch(self, installed_app: InstalledApp, c_id: UUID): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() @@ -170,8 +179,10 @@ class ConversationPinApi(InstalledAppResource): ) class ConversationUnPinApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[ResultResponse.__name__]) - def patch(self, installed_app, c_id: UUID): + def patch(self, installed_app: InstalledApp, c_id: UUID): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() diff --git a/api/controllers/console/explore/installed_app.py b/api/controllers/console/explore/installed_app.py index 4ad3dbc85f..bd4d1ef49f 100644 --- a/api/controllers/console/explore/installed_app.py +++ b/api/controllers/console/explore/installed_app.py @@ -262,7 +262,7 @@ class InstalledAppApi(InstalledAppResource): """ @console_ns.response(204, "App uninstalled successfully") - def delete(self, installed_app): + def delete(self, installed_app: InstalledApp): _, current_tenant_id = current_account_with_tenant() if installed_app.app_owner_tenant_id == current_tenant_id: raise BadRequest("You can't uninstall an app owned by the current tenant") @@ -273,7 +273,7 @@ class InstalledAppApi(InstalledAppResource): return "", 204 @console_ns.response(200, "Success", console_ns.models[SimpleResultMessageResponse.__name__]) - def patch(self, installed_app): + def patch(self, installed_app: InstalledApp): payload = InstalledAppUpdatePayload.model_validate(console_ns.payload or {}) commit_args = False diff --git a/api/controllers/console/explore/message.py b/api/controllers/console/explore/message.py index ffb07916ec..a19355f90b 100644 --- a/api/controllers/console/explore/message.py +++ b/api/controllers/console/explore/message.py @@ -10,6 +10,7 @@ from controllers.common.controller_schemas import MessageFeedbackPayload, Messag from controllers.common.schema import register_response_schema_models, register_schema_models from controllers.console.app.error import ( AppMoreLikeThisDisabledError, + AppUnavailableError, CompletionRequestError, ProviderModelCurrentlyNotSupportError, ProviderNotInitializeError, @@ -30,7 +31,7 @@ from graphon.model_runtime.errors.invoke import InvokeError from libs import helper from models import Account from models.enums import FeedbackRating -from models.model import AppMode +from models.model import AppMode, InstalledApp from services.app_generate_service import AppGenerateService from services.errors.app import MoreLikeThisDisabledError from services.errors.conversation import ConversationNotExistsError @@ -61,8 +62,10 @@ register_response_schema_models(console_ns, ResultResponse, SuggestedQuestionsRe class MessageListApi(InstalledAppResource): @console_ns.expect(console_ns.models[MessageListQuery.__name__]) @with_current_user - def get(self, current_user: Account, installed_app): + def get(self, current_user: Account, installed_app: InstalledApp): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: @@ -98,8 +101,10 @@ class MessageFeedbackApi(InstalledAppResource): @console_ns.expect(console_ns.models[MessageFeedbackPayload.__name__]) @console_ns.response(200, "Feedback submitted successfully", console_ns.models[ResultResponse.__name__]) @with_current_user - def post(self, current_user: Account, installed_app, message_id: UUID): + def post(self, current_user: Account, installed_app: InstalledApp, message_id: UUID): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() message_id_str = str(message_id) @@ -126,8 +131,10 @@ class MessageFeedbackApi(InstalledAppResource): class MessageMoreLikeThisApi(InstalledAppResource): @console_ns.expect(console_ns.models[MoreLikeThisQuery.__name__]) @with_current_user - def get(self, current_user: Account, installed_app, message_id: UUID): + def get(self, current_user: Account, installed_app: InstalledApp, message_id: UUID): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() if app_model.mode != "completion": raise NotCompletionAppError() @@ -172,8 +179,10 @@ class MessageMoreLikeThisApi(InstalledAppResource): class MessageSuggestedQuestionApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[SuggestedQuestionsResponse.__name__]) @with_current_user - def get(self, current_user: Account, installed_app, message_id: UUID): + def get(self, current_user: Account, installed_app: InstalledApp, message_id: UUID): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() diff --git a/api/controllers/console/explore/saved_message.py b/api/controllers/console/explore/saved_message.py index fc863b78d7..cf48eeea72 100644 --- a/api/controllers/console/explore/saved_message.py +++ b/api/controllers/console/explore/saved_message.py @@ -7,12 +7,14 @@ from werkzeug.exceptions import NotFound from controllers.common.controller_schemas import SavedMessageCreatePayload, SavedMessageListQuery from controllers.common.schema import register_response_schema_models, register_schema_models from controllers.console import console_ns +from controllers.console.app.error import AppUnavailableError from controllers.console.explore.error import NotCompletionAppError from controllers.console.explore.wraps import InstalledAppResource from controllers.console.wraps import with_current_user from fields.conversation_fields import ResultResponse from fields.message_fields import SavedMessageInfiniteScrollPagination, SavedMessageItem from models import Account +from models.model import InstalledApp from services.errors.message import MessageNotExistsError from services.saved_message_service import SavedMessageService @@ -24,8 +26,10 @@ register_response_schema_models(console_ns, ResultResponse) class SavedMessageListApi(InstalledAppResource): @console_ns.expect(console_ns.models[SavedMessageListQuery.__name__]) @with_current_user - def get(self, current_user: Account, installed_app): + def get(self, current_user: Account, installed_app: InstalledApp): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() if app_model.mode != "completion": raise NotCompletionAppError() @@ -48,8 +52,10 @@ class SavedMessageListApi(InstalledAppResource): @console_ns.expect(console_ns.models[SavedMessageCreatePayload.__name__]) @console_ns.response(200, "Success", console_ns.models[ResultResponse.__name__]) @with_current_user - def post(self, current_user: Account, installed_app): + def post(self, current_user: Account, installed_app: InstalledApp): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() if app_model.mode != "completion": raise NotCompletionAppError() @@ -69,8 +75,10 @@ class SavedMessageListApi(InstalledAppResource): class SavedMessageApi(InstalledAppResource): @console_ns.response(204, "Saved message deleted successfully") @with_current_user - def delete(self, current_user: Account, installed_app, message_id: UUID): + def delete(self, current_user: Account, installed_app: InstalledApp, message_id: UUID): app_model = installed_app.app + if app_model is None: + raise AppUnavailableError() message_id_str = str(message_id)