diff --git a/backend/open_webui/models/tools.py b/backend/open_webui/models/tools.py index cbd17cf5a..ab62c658c 100644 --- a/backend/open_webui/models/tools.py +++ b/backend/open_webui/models/tools.py @@ -97,6 +97,10 @@ class ToolUserResponse(ToolResponse): model_config = ConfigDict(extra="allow") +class ToolAccessResponse(ToolUserResponse): + write_access: Optional[bool] = False + + class ToolForm(BaseModel): id: str name: str diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index fd99b1581..d919debc3 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -17,6 +17,7 @@ from open_webui.models.tools import ( ToolModel, ToolResponse, ToolUserResponse, + ToolAccessResponse, Tools, ) from open_webui.utils.plugin import ( @@ -157,13 +158,24 @@ async def get_tools(request: Request, user=Depends(get_verified_user), db: Sessi ############################ -@router.get("/list", response_model=list[ToolUserResponse]) +@router.get("/list", response_model=list[ToolAccessResponse]) async def get_tool_list(user=Depends(get_verified_user), db: Session = Depends(get_session)): if user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL: tools = Tools.get_tools(db=db) else: - tools = Tools.get_tools_by_user_id(user.id, "write", db=db) - return tools + tools = Tools.get_tools_by_user_id(user.id, "read", db=db) + + return [ + ToolAccessResponse( + **tool.model_dump(), + write_access=( + (user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL) + or user.id == tool.user_id + or has_access(user.id, "write", tool.access_control, db=db) + ), + ) + for tool in tools + ] ############################ @@ -338,7 +350,7 @@ async def create_new_tools( ############################ -@router.get("/id/{id}", response_model=Optional[ToolModel]) +@router.get("/id/{id}", response_model=Optional[ToolAccessResponse]) async def get_tools_by_id(id: str, user=Depends(get_verified_user), db: Session = Depends(get_session)): tools = Tools.get_tool_by_id(id, db=db) @@ -348,7 +360,14 @@ async def get_tools_by_id(id: str, user=Depends(get_verified_user), db: Session or tools.user_id == user.id or has_access(user.id, "read", tools.access_control, db=db) ): - return tools + return ToolAccessResponse( + **tools.model_dump(), + write_access=( + (user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL) + or user.id == tools.user_id + or has_access(user.id, "write", tools.access_control, db=db) + ), + ) else: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, diff --git a/src/lib/components/workspace/Tools.svelte b/src/lib/components/workspace/Tools.svelte index 865c1f56c..d17989693 100644 --- a/src/lib/components/workspace/Tools.svelte +++ b/src/lib/components/workspace/Tools.svelte @@ -37,6 +37,7 @@ import AddToolMenu from './Tools/AddToolMenu.svelte'; import ImportModal from '../ImportModal.svelte'; import ViewSelector from './common/ViewSelector.svelte'; + import Badge from '$lib/components/common/Badge.svelte'; let shiftKey = false; let loaded = false; @@ -357,45 +358,86 @@ {#each filteredItems as tool}
- -