HKUDS/DeepTutor · error · HTTPException

No default knowledge base is configured

Error message

No default knowledge base is configured

What it means

Raised by _resolve_registered_kb_name when the request asks for the default KB (by alias such as 'default') but the manager has no default knowledge base configured, or the configured default no longer exists in kb_names. HTTP 404.

Source

Thrown at deeptutor/api/routers/knowledge.py:769

            detail=(
                f"PageIndex knowledge bases accept: {supported}. "
                f"Unsupported: {', '.join(unsupported[:5])}."
            ),
        )


def _resolve_registered_kb_name(manager: KnowledgeBaseManager, kb_name: str | None) -> str:
    """Resolve route-level default aliases to the configured default KB."""
    requested = str(kb_name or "").strip()
    kb_names = manager.list_knowledge_bases()
    if requested and requested in kb_names:
        return requested

    if requested.lower() in DEFAULT_KB_ALIASES:
        default_kb = manager.get_default()
        if default_kb and default_kb in kb_names:
            return default_kb
        raise HTTPException(status_code=404, detail="No default knowledge base is configured")

    raise HTTPException(status_code=404, detail=f"Knowledge base '{requested}' not found")


def _load_kb_entry_or_404(manager: KnowledgeBaseManager, kb_name: str) -> dict:
    manager.config = manager._load_config()
    kb_entry = manager.config.get("knowledge_bases", {}).get(kb_name)
    if kb_entry is None:
        raise HTTPException(status_code=404, detail=f"Knowledge base '{kb_name}' not found")
    return kb_entry


def _assert_not_connected_kb(kb_name: str, kb_entry: dict) -> None:
    """Block writes to connected KBs (Obsidian vaults, linked indexes).

    They are read-only pointers to the user's external files — we never write
    into or re-index them.
    """

View on GitHub (pinned to 3e82f13042)

Solutions

  1. Create a knowledge base first, then mark one as the default in settings
  2. If a KB already exists, explicitly pass its real name instead of the alias
  3. Repair the manager config so get_default() returns a registered KB name

Example fix

# before
kb = 'default'
# after
kb = 'my-kb'  # or configure a default KB in settings
Defensive patterns

Strategy: validation

Validate before calling

kbs = client.get('/api/v1/knowledge').json()['knowledge_bases']
default = manager_default(kbs)
if default is None: create_and_set_default_kb()

Type guard

def has_default_kb(kbs) -> bool:
    return any(kb.get('is_default') for kb in kbs)

Prevention

When it happens

Trigger: Any endpoint accepting a KB name where the client passes a default alias (e.g. 'default') while manager.get_default() returns None or an unregistered name.

Common situations: Fresh install before any KB was created or marked default; default KB deleted and default pointer not cleared; config file edited by hand leaving a stale default entry.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27). Data as JSON: /api/errors/689d53bfde24d1f2. Report an issue: GitHub.