{"record":{"id":"c02ac4f524611da7","repo":"HKUDS/DeepTutor","slug":"folder-folder-id-not-found","errorCode":null,"errorMessage":"Folder '{folder_id}' not found","messagePattern":"Folder '(.+?)' not found","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"warning","filePath":"deeptutor/api/routers/knowledge.py","lineNumber":3262,"sourceCode":"        manager = manager_for_resource(resource)\n        folders = manager.get_linked_folders(resource.name)\n        return [LinkedFolderInfo(**f) for f in folders]\n    except HTTPException:\n        raise\n    except ValueError:\n        raise HTTPException(status_code=404, detail=f\"Knowledge base '{kb_name}' not found\")\n    except Exception as e:\n        raise HTTPException(status_code=500, detail=str(e))\n\n\n@router.delete(\"/{kb_name}/linked-folders/{folder_id}\")\nasync def unlink_folder(kb_name: str, folder_id: str):\n    \"\"\"Unlink a folder from a knowledge base.\"\"\"\n    try:\n        manager, resolved_name, _ = _writable_kb(kb_name)\n        success = manager.unlink_folder(resolved_name, folder_id)\n        if not success:\n            raise HTTPException(status_code=404, detail=f\"Folder '{folder_id}' not found\")\n        logger.info(f\"Unlinked folder '{folder_id}' from KB '{kb_name}'\")\n        return {\"message\": \"Folder unlinked successfully\", \"folder_id\": folder_id}\n    except HTTPException:\n        raise\n    except ValueError:\n        raise HTTPException(status_code=404, detail=f\"Knowledge base '{kb_name}' not found\")\n    except Exception as e:\n        raise HTTPException(status_code=500, detail=str(e))\n\n\n@router.post(\"/{kb_name}/sync-folder/{folder_id}\")\nasync def sync_folder(kb_name: str, folder_id: str, background_tasks: BackgroundTasks):\n    \"\"\"\n    Sync files from a linked folder to the knowledge base.\n\n    This scans the linked folder for supported documents and processes\n    any new files that haven't been added yet.\n    \"\"\"","sourceCodeStart":3244,"sourceCodeEnd":3280,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/api/routers/knowledge.py#L3244-L3280","documentation":"HTTP 404 from DELETE /{kb_name}/linked-folders/{folder_id} when manager.unlink_folder returns falsy — the folder_id is not among the KB's linked folders (already unlinked or never linked).","triggerScenarios":"DELETE a linked folder with a folder_id that does not exist for that KB, e.g. after it was already unlinked from another tab/session or the id was mistyped.","commonSituations":"Double-click / duplicate UI action unlinks twice; stale folder list in the UI; folder unlinked by a sync job between listing and deleting.","solutions":["Re-fetch the linked folders list and confirm folder_id still appears","Treat 404 on unlink as success if the goal is 'folder not linked' (idempotent delete)","Fix UI to disable the unlink button for folders missing from the fresh list"],"exampleFix":"# before\nDELETE /kb/my-kb/linked-folders/folder-123  -> 404 Folder 'folder-123' not found\n# after (idempotent client)\nif resp.status_code == 404:\n    pass  # already unlinked","handlingStrategy":"try-catch","validationCode":"folder_ids = {f['id'] for f in client.get(f'/api/v1/knowledge/{kb}/linked-folders').json()}\nif folder_id not in folder_ids:\n    return  # already unlinked","typeGuard":null,"tryCatchPattern":"try:\n    client.delete(f'/api/v1/knowledge/{kb}/linked-folders/{folder_id}')\nexcept HTTPError as e:\n    if e.response.status_code == 404 and 'Folder' in e.response.json()['detail']:\n        pass  # idempotent success\n    else: raise","preventionTips":["Disable the Unlink button once clicked until the list refreshes","Treat 404 on DELETE as idempotent removal","Always drive folder ids from a freshly fetched list"],"tags":["linked-folders","http-404","idempotency","knowledge-base"],"backgroundTag":"resource-not-found","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}