{"record":{"id":"86cf65563dae3a7b","repo":"HKUDS/DeepTutor","slug":"knowledge-base-name-not-found","errorCode":null,"errorMessage":"Knowledge base '{name}' not found","messagePattern":"Knowledge base '(.+?)' not found","errorType":"http","errorClass":"HTTPException","httpStatus":404,"severity":"error","filePath":"deeptutor/multi_user/knowledge_access.py","lineNumber":151,"sourceCode":"            assigned=False,\n            read_only=False,\n        )\n\n    if name in assigned_names:\n        if require_write:\n            raise HTTPException(\n                status_code=403, detail=\"Assigned admin knowledge bases are read-only\"\n            )\n        return KnowledgeResource(\n            id=f\"admin:kb:{name}\",\n            name=name,\n            base_dir=admin_kb_base_dir(),\n            source=\"admin\",\n            assigned=True,\n            read_only=True,\n        )\n\n    raise HTTPException(status_code=404, detail=f\"Knowledge base '{name}' not found\")\n\n\ndef _resolve_default_or_name(manager: KnowledgeBaseManager, name: str) -> str:\n    requested = str(name or \"\").strip()\n    names = manager.list_knowledge_bases()\n    if requested and requested in names:\n        return requested\n    if requested.lower() in DEFAULT_KB_ALIASES:\n        default_kb = manager.get_default()\n        if default_kb and default_kb in names:\n            return default_kb\n        raise HTTPException(status_code=404, detail=\"No default knowledge base is configured\")\n    raise HTTPException(status_code=404, detail=f\"Knowledge base '{requested}' not found\")\n\n\ndef manager_for_resource(resource: KnowledgeResource) -> KnowledgeBaseManager:\n    return _manager_for(str(resource.base_dir.resolve()))\n","sourceCodeStart":133,"sourceCodeEnd":169,"githubUrl":"https://github.com/HKUDS/DeepTutor/blob/3e82f130422a813cdd73c10b21a44e9325f5821a/deeptutor/multi_user/knowledge_access.py#L133-L169","documentation":"HTTP 404 from resolve_kb: the requested KB name matches neither the user's own knowledge bases nor any admin-assigned KB names. It is the terminal fall-through after both lookup branches fail.","triggerScenarios":"resolve_kb('my-kb') where 'my-kb' is not in the user's KB list and not in assigned_names; typo in kb name; KB deleted by another admin; API call without the right grants.","commonSituations":"Typos or stale references after a KB was renamed/deleted; users hitting a KB they were never granted; frontend caching an old KB list.","solutions":["List the user's available KBs (list_knowledge_bases) and use an exact name from the result","Check spelling/whitespace/case of the KB name","Verify the KB still exists and is granted to the user by an admin"],"exampleFix":"// before\nkb = resolve_kb(\"mykb\")  # 404: actual name is 'my-kb'\n\n// after\navailable = list_knowledge_bases()\nnames = [k.name for k in available.knowledge_bases]\nkb = resolve_kb(next(n for n in names if n.lower() == \"mykb\"))","handlingStrategy":"validation","validationCode":"from deeptutor.multi_user.knowledge_access import list_knowledge_bases\nnames = [kb.name for kb in list_knowledge_bases().knowledge_bases]\nif name not in names:\n    raise UnknownKB(name)","typeGuard":"def kb_exists(name: str) -> bool:\n    return name in [kb.name for kb in list_knowledge_bases().knowledge_bases]","tryCatchPattern":"try:\n    resolve_kb(name)\nexcept HTTPException as e:\n    if e.status_code == 404:\n        refresh_kb_list()  # resync UI and prompt re-selection","preventionTips":["Populate KB pickers from list_knowledge_bases, never free-text","Re-fetch the KB list on 404 in case of renames/deletions"],"tags":["knowledge-base","not-found","http-404","multi-user"],"backgroundTag":"resource-not-found","analyzedSha":"3e82f130422a813cdd73c10b21a44e9325f5821a","analyzedAt":"2026-08-27T06:57:25.364Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}