diff --git a/api/controllers/console/agent/roster.py b/api/controllers/console/agent/roster.py index 3334f1bb2d..daa0d97496 100644 --- a/api/controllers/console/agent/roster.py +++ b/api/controllers/console/agent/roster.py @@ -1,3 +1,5 @@ +from uuid import UUID + from flask import request from flask_restx import Resource from pydantic import BaseModel, Field @@ -80,7 +82,7 @@ class AgentRosterDetailApi(Resource): @setup_required @login_required @account_initialization_required - def get(self, agent_id): + def get(self, agent_id: UUID): _, tenant_id = current_account_with_tenant() return _agent_roster_service().get_roster_agent_detail(tenant_id=tenant_id, agent_id=str(agent_id)) @@ -89,7 +91,7 @@ class AgentRosterDetailApi(Resource): @login_required @account_initialization_required @edit_permission_required - def patch(self, agent_id): + def patch(self, agent_id: UUID): account, tenant_id = current_account_with_tenant() payload = RosterAgentUpdatePayload.model_validate(console_ns.payload or {}) return _agent_roster_service().update_roster_agent( @@ -100,7 +102,7 @@ class AgentRosterDetailApi(Resource): @login_required @account_initialization_required @edit_permission_required - def delete(self, agent_id): + def delete(self, agent_id: UUID): account, tenant_id = current_account_with_tenant() _agent_roster_service().archive_roster_agent(tenant_id=tenant_id, agent_id=str(agent_id), account_id=account.id) return "", 204 @@ -111,7 +113,7 @@ class AgentRosterVersionsApi(Resource): @setup_required @login_required @account_initialization_required - def get(self, agent_id): + def get(self, agent_id: UUID): _, tenant_id = current_account_with_tenant() return {"data": _agent_roster_service().list_agent_versions(tenant_id=tenant_id, agent_id=str(agent_id))} @@ -121,7 +123,7 @@ class AgentRosterVersionDetailApi(Resource): @setup_required @login_required @account_initialization_required - def get(self, agent_id, version_id): + def get(self, agent_id: UUID, version_id: UUID): _, tenant_id = current_account_with_tenant() return _agent_roster_service().get_agent_version_detail( tenant_id=tenant_id, diff --git a/api/controllers/console/apikey.py b/api/controllers/console/apikey.py index aca22d5c5a..133c57d34d 100644 --- a/api/controllers/console/apikey.py +++ b/api/controllers/console/apikey.py @@ -1,4 +1,5 @@ from datetime import datetime +from uuid import UUID import flask_restx from flask_restx import Resource @@ -155,7 +156,7 @@ class AppApiKeyListResource(BaseApiKeyListResource): @console_ns.doc(description="Get all API keys for an app") @console_ns.doc(params={"resource_id": "App ID"}) @console_ns.response(200, "API keys retrieved successfully", console_ns.models[ApiKeyList.__name__]) - def get(self, resource_id): # type: ignore + def get(self, resource_id: UUID): """Get all API keys for an app""" return super().get(resource_id) @@ -164,7 +165,7 @@ class AppApiKeyListResource(BaseApiKeyListResource): @console_ns.doc(params={"resource_id": "App ID"}) @console_ns.response(201, "API key created successfully", console_ns.models[ApiKeyItem.__name__]) @console_ns.response(400, "Maximum keys exceeded") - def post(self, resource_id): # type: ignore + def post(self, resource_id: UUID): """Create a new API key for an app""" return super().post(resource_id) @@ -180,9 +181,9 @@ class AppApiKeyResource(BaseApiKeyResource): @console_ns.doc(description="Delete an API key for an app") @console_ns.doc(params={"resource_id": "App ID", "api_key_id": "API key ID"}) @console_ns.response(204, "API key deleted successfully") - def delete(self, resource_id, api_key_id): + def delete(self, resource_id: UUID, api_key_id: UUID): """Delete an API key for an app""" - return super().delete(resource_id, api_key_id) + return super().delete(str(resource_id), str(api_key_id)) resource_type = ApiTokenType.APP resource_model = App @@ -195,7 +196,7 @@ class DatasetApiKeyListResource(BaseApiKeyListResource): @console_ns.doc(description="Get all API keys for a dataset") @console_ns.doc(params={"resource_id": "Dataset ID"}) @console_ns.response(200, "API keys retrieved successfully", console_ns.models[ApiKeyList.__name__]) - def get(self, resource_id): # type: ignore + def get(self, resource_id: UUID): """Get all API keys for a dataset""" return super().get(resource_id) @@ -204,7 +205,7 @@ class DatasetApiKeyListResource(BaseApiKeyListResource): @console_ns.doc(params={"resource_id": "Dataset ID"}) @console_ns.response(201, "API key created successfully", console_ns.models[ApiKeyItem.__name__]) @console_ns.response(400, "Maximum keys exceeded") - def post(self, resource_id): # type: ignore + def post(self, resource_id: UUID): """Create a new API key for a dataset""" return super().post(resource_id) @@ -220,9 +221,9 @@ class DatasetApiKeyResource(BaseApiKeyResource): @console_ns.doc(description="Delete an API key for a dataset") @console_ns.doc(params={"resource_id": "Dataset ID", "api_key_id": "API key ID"}) @console_ns.response(204, "API key deleted successfully") - def delete(self, resource_id, api_key_id): + def delete(self, resource_id: UUID, api_key_id: UUID): """Delete an API key for a dataset""" - return super().delete(resource_id, api_key_id) + return super().delete(str(resource_id), str(api_key_id)) resource_type = ApiTokenType.DATASET resource_model = Dataset diff --git a/api/controllers/console/auth/data_source_bearer_auth.py b/api/controllers/console/auth/data_source_bearer_auth.py index 3f0650389f..7544c4dbdc 100644 --- a/api/controllers/console/auth/data_source_bearer_auth.py +++ b/api/controllers/console/auth/data_source_bearer_auth.py @@ -1,3 +1,5 @@ +from uuid import UUID + from flask_restx import Resource from pydantic import BaseModel, Field @@ -87,10 +89,10 @@ class ApiKeyAuthDataSourceBindingDelete(Resource): @account_initialization_required @is_admin_or_owner_required @console_ns.response(204, "Binding deleted successfully") - def delete(self, binding_id): + def delete(self, binding_id: UUID): # The role of the current user in the table must be admin or owner _, current_tenant_id = current_account_with_tenant() - ApiKeyAuthService.delete_provider_auth(current_tenant_id, binding_id) + ApiKeyAuthService.delete_provider_auth(current_tenant_id, str(binding_id)) return "", 204 diff --git a/api/controllers/console/auth/data_source_oauth.py b/api/controllers/console/auth/data_source_oauth.py index 3a3278ec9d..997dac9210 100644 --- a/api/controllers/console/auth/data_source_oauth.py +++ b/api/controllers/console/auth/data_source_oauth.py @@ -1,4 +1,5 @@ import logging +from uuid import UUID import httpx from flask import current_app, redirect, request @@ -158,16 +159,15 @@ class OAuthDataSourceSync(Resource): @setup_required @login_required @account_initialization_required - def get(self, provider, binding_id): - provider = str(provider) - binding_id = str(binding_id) + def get(self, provider: str, binding_id: UUID): + binding_id_str = str(binding_id) OAUTH_DATASOURCE_PROVIDERS = get_oauth_providers() with current_app.app_context(): oauth_provider = OAUTH_DATASOURCE_PROVIDERS.get(provider) if not oauth_provider: return {"error": "Invalid provider"}, 400 try: - oauth_provider.sync_data_source(binding_id) + oauth_provider.sync_data_source(binding_id_str) except httpx.HTTPStatusError as e: logger.exception( "An error occurred during the OAuthCallback process with %s: %s", provider, e.response.text diff --git a/api/controllers/console/explore/completion.py b/api/controllers/console/explore/completion.py index 2a699efb1d..72e2d923da 100644 --- a/api/controllers/console/explore/completion.py +++ b/api/controllers/console/explore/completion.py @@ -133,7 +133,7 @@ class CompletionApi(InstalledAppResource): ) class CompletionStopApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[SimpleResultResponse.__name__]) - def post(self, installed_app, task_id): + def post(self, installed_app, task_id: str): app_model = installed_app.app if app_model.mode != AppMode.COMPLETION: raise NotCompletionAppError() @@ -209,7 +209,7 @@ class ChatApi(InstalledAppResource): ) class ChatStopApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[SimpleResultResponse.__name__]) - def post(self, installed_app, task_id): + def post(self, installed_app, task_id: str): app_model = installed_app.app app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: diff --git a/api/controllers/console/explore/conversation.py b/api/controllers/console/explore/conversation.py index ae32571219..a3ae59aaf7 100644 --- a/api/controllers/console/explore/conversation.py +++ b/api/controllers/console/explore/conversation.py @@ -1,4 +1,5 @@ from typing import Any +from uuid import UUID from flask import request from pydantic import BaseModel, Field, TypeAdapter @@ -91,7 +92,7 @@ class ConversationListApi(InstalledAppResource): ) class ConversationApi(InstalledAppResource): @console_ns.response(204, "Conversation deleted successfully") - def delete(self, installed_app, c_id): + def delete(self, installed_app, c_id: UUID): app_model = installed_app.app app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: @@ -114,7 +115,7 @@ class ConversationApi(InstalledAppResource): ) class ConversationRenameApi(InstalledAppResource): @console_ns.expect(console_ns.models[ConversationRenamePayload.__name__]) - def post(self, installed_app, c_id): + def post(self, installed_app, c_id: UUID): app_model = installed_app.app app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: @@ -145,7 +146,7 @@ class ConversationRenameApi(InstalledAppResource): ) class ConversationPinApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[ResultResponse.__name__]) - def patch(self, installed_app, c_id): + def patch(self, installed_app, c_id: UUID): app_model = installed_app.app app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: @@ -169,7 +170,7 @@ class ConversationPinApi(InstalledAppResource): ) class ConversationUnPinApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[ResultResponse.__name__]) - def patch(self, installed_app, c_id): + def patch(self, installed_app, c_id: UUID): app_model = installed_app.app app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: diff --git a/api/controllers/console/explore/message.py b/api/controllers/console/explore/message.py index 0d25fbb66d..c6930a76cb 100644 --- a/api/controllers/console/explore/message.py +++ b/api/controllers/console/explore/message.py @@ -1,5 +1,6 @@ import logging from typing import Literal +from uuid import UUID from flask import request from pydantic import BaseModel, TypeAdapter @@ -95,18 +96,18 @@ class MessageListApi(InstalledAppResource): class MessageFeedbackApi(InstalledAppResource): @console_ns.expect(console_ns.models[MessageFeedbackPayload.__name__]) @console_ns.response(200, "Feedback submitted successfully", console_ns.models[ResultResponse.__name__]) - def post(self, installed_app, message_id): + def post(self, installed_app, message_id: UUID): current_user, _ = current_account_with_tenant() app_model = installed_app.app - message_id = str(message_id) + message_id_str = str(message_id) payload = MessageFeedbackPayload.model_validate(console_ns.payload or {}) try: MessageService.create_feedback( app_model=app_model, - message_id=message_id, + message_id=message_id_str, user=current_user, rating=FeedbackRating(payload.rating) if payload.rating else None, content=payload.content, @@ -123,13 +124,13 @@ class MessageFeedbackApi(InstalledAppResource): ) class MessageMoreLikeThisApi(InstalledAppResource): @console_ns.expect(console_ns.models[MoreLikeThisQuery.__name__]) - def get(self, installed_app, message_id): + def get(self, installed_app, message_id: UUID): current_user, _ = current_account_with_tenant() app_model = installed_app.app if app_model.mode != "completion": raise NotCompletionAppError() - message_id = str(message_id) + message_id_str = str(message_id) args = MoreLikeThisQuery.model_validate(request.args.to_dict()) @@ -139,7 +140,7 @@ class MessageMoreLikeThisApi(InstalledAppResource): response = AppGenerateService.generate_more_like_this( app_model=app_model, user=current_user, - message_id=message_id, + message_id=message_id_str, invoke_from=InvokeFrom.EXPLORE, streaming=streaming, ) @@ -169,18 +170,18 @@ class MessageMoreLikeThisApi(InstalledAppResource): ) class MessageSuggestedQuestionApi(InstalledAppResource): @console_ns.response(200, "Success", console_ns.models[SuggestedQuestionsResponse.__name__]) - def get(self, installed_app, message_id): + def get(self, installed_app, message_id: UUID): current_user, _ = current_account_with_tenant() app_model = installed_app.app app_mode = AppMode.value_of(app_model.mode) if app_mode not in {AppMode.CHAT, AppMode.AGENT_CHAT, AppMode.ADVANCED_CHAT}: raise NotChatAppError() - message_id = str(message_id) + message_id_str = str(message_id) try: questions = MessageService.get_suggested_questions_after_answer( - app_model=app_model, user=current_user, message_id=message_id, invoke_from=InvokeFrom.EXPLORE + app_model=app_model, user=current_user, message_id=message_id_str, invoke_from=InvokeFrom.EXPLORE ) except MessageNotExistsError: raise NotFound("Message not found") diff --git a/api/controllers/console/explore/saved_message.py b/api/controllers/console/explore/saved_message.py index 09f214bd2b..224715d255 100644 --- a/api/controllers/console/explore/saved_message.py +++ b/api/controllers/console/explore/saved_message.py @@ -1,3 +1,5 @@ +from uuid import UUID + from flask import request from pydantic import TypeAdapter from werkzeug.exceptions import NotFound @@ -65,15 +67,15 @@ class SavedMessageListApi(InstalledAppResource): ) class SavedMessageApi(InstalledAppResource): @console_ns.response(204, "Saved message deleted successfully") - def delete(self, installed_app, message_id): + def delete(self, installed_app, message_id: UUID): current_user, _ = current_account_with_tenant() app_model = installed_app.app - message_id = str(message_id) + message_id_str = str(message_id) if app_model.mode != "completion": raise NotCompletionAppError() - SavedMessageService.delete(app_model, current_user, message_id) + SavedMessageService.delete(app_model, current_user, message_id_str) return "", 204 diff --git a/api/controllers/console/extension.py b/api/controllers/console/extension.py index 35e62e3c7e..029e2e7f0d 100644 --- a/api/controllers/console/extension.py +++ b/api/controllers/console/extension.py @@ -1,5 +1,6 @@ from datetime import datetime from typing import Any +from uuid import UUID from flask import request from flask_restx import Resource @@ -152,7 +153,7 @@ class APIBasedExtensionDetailAPI(Resource): @setup_required @login_required @account_initialization_required - def get(self, id): + def get(self, id: UUID): api_based_extension_id = str(id) _, tenant_id = current_account_with_tenant() @@ -168,7 +169,7 @@ class APIBasedExtensionDetailAPI(Resource): @setup_required @login_required @account_initialization_required - def post(self, id): + def post(self, id: UUID): api_based_extension_id = str(id) _, current_tenant_id = current_account_with_tenant() @@ -196,7 +197,7 @@ class APIBasedExtensionDetailAPI(Resource): @setup_required @login_required @account_initialization_required - def delete(self, id): + def delete(self, id: UUID): api_based_extension_id = str(id) _, current_tenant_id = current_account_with_tenant() diff --git a/api/controllers/console/files.py b/api/controllers/console/files.py index 6811c8ce77..499a623872 100644 --- a/api/controllers/console/files.py +++ b/api/controllers/console/files.py @@ -1,4 +1,5 @@ from typing import Literal +from uuid import UUID from flask import request from flask_restx import Resource @@ -106,10 +107,10 @@ class FilePreviewApi(Resource): @login_required @account_initialization_required @console_ns.response(200, "Success", console_ns.models[TextContentResponse.__name__]) - def get(self, file_id): - file_id = str(file_id) + def get(self, file_id: UUID): + file_id_str = str(file_id) _, tenant_id = current_account_with_tenant() - text = FileService(db.engine).get_file_preview(file_id, tenant_id) + text = FileService(db.engine).get_file_preview(file_id_str, tenant_id) return {"content": text} diff --git a/api/controllers/console/tag/tags.py b/api/controllers/console/tag/tags.py index 199a05d9c2..a37e56e2b8 100644 --- a/api/controllers/console/tag/tags.py +++ b/api/controllers/console/tag/tags.py @@ -1,4 +1,5 @@ from typing import Literal +from uuid import UUID from flask import request from flask_restx import Resource @@ -131,17 +132,17 @@ class TagUpdateDeleteApi(Resource): @setup_required @login_required @account_initialization_required - def patch(self, tag_id): + def patch(self, tag_id: UUID): current_user, _ = current_account_with_tenant() - tag_id = str(tag_id) + tag_id_str = str(tag_id) # The role of the current user in the ta table must be admin, owner, or editor if not (current_user.has_edit_permission or current_user.is_dataset_editor): raise Forbidden() payload = TagUpdateRequestPayload.model_validate(console_ns.payload or {}) - tag = TagService.update_tags(UpdateTagPayload(name=payload.name), tag_id) + tag = TagService.update_tags(UpdateTagPayload(name=payload.name), tag_id_str) - binding_count = TagService.get_tag_binding_count(tag_id) + binding_count = TagService.get_tag_binding_count(tag_id_str) response = TagResponse.model_validate( {"id": tag.id, "name": tag.name, "type": tag.type, "binding_count": binding_count} @@ -154,10 +155,10 @@ class TagUpdateDeleteApi(Resource): @account_initialization_required @edit_permission_required @console_ns.response(204, "Tag deleted successfully") - def delete(self, tag_id): - tag_id = str(tag_id) + def delete(self, tag_id: UUID): + tag_id_str = str(tag_id) - TagService.delete_tag(tag_id) + TagService.delete_tag(tag_id_str) return "", 204 diff --git a/api/controllers/console/workspace/members.py b/api/controllers/console/workspace/members.py index 2be91626e7..910e07e14d 100644 --- a/api/controllers/console/workspace/members.py +++ b/api/controllers/console/workspace/members.py @@ -1,4 +1,5 @@ from urllib import parse +from uuid import UUID from flask import abort, request from flask_restx import Resource @@ -175,7 +176,7 @@ class MemberCancelInviteApi(Resource): @setup_required @login_required @account_initialization_required - def delete(self, member_id): + def delete(self, member_id: UUID): current_user, _ = current_account_with_tenant() if not current_user.current_tenant: raise ValueError("No current tenant") @@ -208,7 +209,7 @@ class MemberUpdateRoleApi(Resource): @setup_required @login_required @account_initialization_required - def put(self, member_id): + def put(self, member_id: UUID): payload = console_ns.payload or {} args = MemberRoleUpdatePayload.model_validate(payload) new_role = args.role @@ -351,7 +352,7 @@ class OwnerTransfer(Resource): @login_required @account_initialization_required @is_allow_transfer_owner - def post(self, member_id): + def post(self, member_id: UUID): payload = console_ns.payload or {} args = OwnerTransferPayload.model_validate(payload) diff --git a/api/controllers/console/workspace/models.py b/api/controllers/console/workspace/models.py index c23207e402..21c6b1c7ce 100644 --- a/api/controllers/console/workspace/models.py +++ b/api/controllers/console/workspace/models.py @@ -532,7 +532,7 @@ class ModelProviderAvailableModelApi(Resource): @setup_required @login_required @account_initialization_required - def get(self, model_type): + def get(self, model_type: str): _, tenant_id = current_account_with_tenant() model_provider_service = ModelProviderService() models = model_provider_service.get_models_by_model_type(tenant_id=tenant_id, model_type=model_type)