From d3058ce379e2cbde455772bfd08aea53727f60fe Mon Sep 17 00:00:00 2001 From: Timebomb2018 <18868801967@163.com> Date: Tue, 28 Apr 2026 15:04:13 +0800 Subject: [PATCH 1/2] fix(workspace): make delete workspace member async and invalidate user tokens --- api/app/controllers/workspace_controller.py | 4 ++-- api/app/services/workspace_service.py | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/api/app/controllers/workspace_controller.py b/api/app/controllers/workspace_controller.py index 47068288..abe43593 100644 --- a/api/app/controllers/workspace_controller.py +++ b/api/app/controllers/workspace_controller.py @@ -221,7 +221,7 @@ def update_workspace_members( @router.delete("/members/{member_id}", response_model=ApiResponse) @cur_workspace_access_guard() -def delete_workspace_member( +async def delete_workspace_member( member_id: uuid.UUID, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), @@ -230,7 +230,7 @@ def delete_workspace_member( workspace_id = current_user.current_workspace_id api_logger.info(f"用户 {current_user.username} 请求删除工作空间 {workspace_id} 的成员 {member_id}") - workspace_service.delete_workspace_member( + await workspace_service.delete_workspace_member( db=db, workspace_id=workspace_id, member_id=member_id, diff --git a/api/app/services/workspace_service.py b/api/app/services/workspace_service.py index 4034eb6d..199d5953 100644 --- a/api/app/services/workspace_service.py +++ b/api/app/services/workspace_service.py @@ -20,6 +20,7 @@ from app.models.workspace_model import ( ) from app.repositories import workspace_repository from app.repositories.workspace_invite_repository import WorkspaceInviteRepository +from app.services.session_service import SessionService from app.schemas.workspace_schema import ( InviteAcceptRequest, InviteValidateResponse, @@ -58,7 +59,7 @@ def switch_workspace( raise BusinessException(f"切换工作空间失败: {str(e)}", BizCode.INTERNAL_ERROR) -def delete_workspace_member( +async def delete_workspace_member( db: Session, workspace_id: uuid.UUID, member_id: uuid.UUID, @@ -80,6 +81,9 @@ def delete_workspace_member( workspace_member.user.current_workspace_id = None db.commit() business_logger.info(f"用户 {user.username} 成功删除工作空间 {workspace_id} 的成员 {member_id}") + + # 使被删除成员的所有 token 立即失效 + await SessionService.invalidate_all_user_tokens(str(workspace_member.user_id)) except Exception as e: db.rollback() business_logger.error(f"删除工作空间成员失败 - 工作空间: {workspace_id}, 成员: {member_id}, 错误: {str(e)}") From 28694fefb0379d5171889f692d0902ec260a018d Mon Sep 17 00:00:00 2001 From: Timebomb2018 <18868801967@163.com> Date: Tue, 28 Apr 2026 16:10:44 +0800 Subject: [PATCH 2/2] fix(app): adjust thinking budget tokens default and validation range The default thinking budget tokens value was changed from 10000 to 1024 in base.py, and the minimum validation constraint was updated from 1024 to 1 in app_schema.py to allow smaller budgets while maintaining backward compatibility. --- api/app/core/models/base.py | 2 +- api/app/schemas/app_schema.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/app/core/models/base.py b/api/app/core/models/base.py index 86ac5fe0..6847a880 100644 --- a/api/app/core/models/base.py +++ b/api/app/core/models/base.py @@ -216,7 +216,7 @@ class RedBearModelFactory: # 深度思考模式:Claude 3.7 Sonnet 等支持思考的模型 # 通过 additional_model_request_fields 传递 thinking 块,关闭时不传(Bedrock 无 disabled 选项) if config.deep_thinking: - budget = config.thinking_budget_tokens or 10000 + budget = config.thinking_budget_tokens or 1024 params["additional_model_request_fields"] = { "thinking": {"type": "enabled", "budget_tokens": budget} } diff --git a/api/app/schemas/app_schema.py b/api/app/schemas/app_schema.py index 89603322..7facf381 100644 --- a/api/app/schemas/app_schema.py +++ b/api/app/schemas/app_schema.py @@ -250,7 +250,7 @@ class ModelParameters(BaseModel): n: int = Field(default=1, ge=1, le=10, description="生成的回复数量") stop: Optional[List[str]] = Field(default=None, description="停止序列") deep_thinking: bool = Field(default=False, description="是否启用深度思考模式(需模型支持,如 DeepSeek-R1、QwQ 等)") - thinking_budget_tokens: Optional[int] = Field(default=None, ge=1024, le=131072, description="深度思考 token 预算(仅部分模型支持)") + thinking_budget_tokens: Optional[int] = Field(default=None, ge=1, le=131072, description="深度思考 token 预算(仅部分模型支持)") json_output: bool = Field(default=False, description="是否强制 JSON 格式输出(需模型支持 json_output 能力)")