DeepTutor v1.5.15 Release Notes
Release Date: 2026.08.20
v1.5.14 put the document next to the conversation. This one is mostly about what sits behind it: PageIndex becomes something you can host yourself and retrieves by reasoning over a document tree, the question bank stops being a list you cannot file into, and third-party packages can now register their own tools and capabilities. Nearly all of it arrived as community pull requests. Drop-in — no migrations, nothing to re-index.
What's New
PageIndex you can host yourself, and retrieval that reasons
PageIndex OSS joins the engine list as its own knowledge-base type: the same interface as the hosted service, bound to the base's local library, driven by the LLM you already configured instead of a PageIndex API key.
Retrieval changed underneath both variants. A PageIndex base used to be read through a built-in MCP server; that path is gone, replaced by a small reading loop that walks the document tree — structure first, then only the pages it needs. Fewer moving parts, and the same page-level citations come back.
The question bank stops being write-only
addEntryToCategory shipped in v1.3.6 and was never called from the frontend, so for eleven releases a learner could create categories and never put anything in them. The quiz card's bespoke dropdown now uses the shared category menu that does call it.
The page is rebuilt around the three things a flat list could not do — search, batch selection, and an inbox for questions nobody has filed yet. Graded Mastery Path questions carry their explanation and difficulty in with them.
And the tutor can finally file for you. Asking it to group your wrong answers had no writable handle on the bank, so it reached for write_note and your request quietly became a notebook record — the Chinese write_note hint even listed 错题分析 as a reason to append. The new question_bank tool is name-addressed: organize takes a category name and creates it if missing, so filing is one call after one listing. It mounts only when the bank has entries.
Third-party tools and capabilities
Two entry-point groups let an installed package extend DeepTutor without touching the tree. deeptutor.plugins was already imported by the capability registry and /plugins/list behind a try/except — but the module never existed, so plugin discovery was a dead path; it is now real. deeptutor.loop_capabilities registers chat-loop capabilities alongside the built-ins, which win on name collisions. Broken entry points are skipped rather than fatal, and discovery is cached per process so plugin capabilities stay singletons.
Apache Tika parsing
A seventh document-parsing engine, selectable in Settings → Knowledge Base. Tika is remote-only: no Python package, no model download — it points at an Apache Tika server (TIKA_SERVER_URL) and converts a broad set of formats to Markdown.
LightRAG's indexing knobs, in the UI
max_concurrent_files, llm_model_max_async, and entity_extract_max_gleaning reached runtime settings and the API in #877 but had no inputs, so they were reachable only by hand-editing config. They now sit under their own Indexing divider — a different axis from the query knobs above, because they shape how a base is built, so a change applies to the next build rather than the next question. The wiring asks the installed RAG-Anything what it accepts and drops the rest with a warning, so an older install keeps running on library defaults instead of raising.
Rebuilding a document tree in a knowledge base
Three fixes finally close #866. A linked folder's subdirectories stopped collapsing into raw/'s top level; same-named documents from different subtrees stopped silently dropping one another (a clash between different bytes stages under a free sibling name, identical bytes still dedup); and uploads now take an optional destination folder.
That last one was the actual blocker. A browser folder pick reports each file's path relative to the directory you chose, so adding 应用开发/钉钉CLI/ one subtree at a time arrived as 钉钉CLI/... with no way to say where it belonged — every batch piled up at the root, and the missing ancestor was never in the payload to begin with. The picker now offers the base's existing folders once files are staged.
Book: a learning-capture inbox
Reading segments you select are kept per book with an explicit status lifecycle, so captures can be reviewed before they go anywhere. Separately, drift warnings got honest: stale-page detection is scoped to the KB documents that actually changed, and a warning will not clear while flagged pages are still awaiting recompilation.
Whisper — a community contribution
/whisper is a two-seat counselling-practice room contributed by @alanguan73: the tutor plays the visitor, you take the trainee seat, and a supervisor whispers coaching only the trainee sees, with an end-of-session debrief. It lives under Learning Space → More Projects and needs its own capability package installed — the surface ships, the counselling capability is not part of DeepTutor.
The generally useful half of that work is in the runtime: a capability can now publish a body and its own declared extras on CAPABILITY_COMPLETE, while capability, session_id, and turn_id stay unspoofable. Only the explicitly declared sub-dict goes on the event bus — turn metadata is a scratchpad holding live callables and your ask_user answers, and it was never a wire format.
Assorted
- The model knows what day it is. Without the real date it resolved "today" from its training cutoff when composing web searches. The injected block is day-granular, so the system prompt stays byte-stable within a day and keeps prompt-cache hits.
- Deleting a turn no longer blanks the session. Descendants pointed at deleted rows, the session lost its root, and the page rendered empty (#912). Deleted rows are spliced out of the parent-pointer tree, and already-corrupted sessions are recovered from their oldest orphan.
- A stale CA bundle no longer breaks every LLM call. A leftover
SSL_CERT_FILE/SSL_CERT_DIR— common after cloning a conda env withoutca-certificates— made httpx raise mid-construction; broken paths are dropped so TLS falls back to the default bundle. - Thinking tags are filtered on non-SSE local streams too. That branch passed reasoning blocks straight through; both branches now share one incremental parser, so a tag split across chunks or left unclosed behaves the same either way.
- Unhandled server errors return JSON instead of Starlette's plain-text 500, and the handler stays inside the middleware stack so the response still carries CORS headers.
- Obsidian vaults survive real-world files — undecodable bytes and date-typed frontmatter are tolerated, and a vault that fails to open says why instead of failing opaquely.
- A stuck session load ends in a retryable state rather than spinning, and token usage emitted as plain dicts by native adapters is recorded instead of lost.
- Mastery reads stop inventing paths,
end_loopis honored after anask_userresume, and thecodebuddyextra resolves again. - The frontend is linted in CI. ESLint now runs on
web/on every build.
The docs at deeptutor.info were refreshed alongside this release.
Upgrade Notes
pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest. No schema changes, no re-index, no migration.
- PageIndex OSS needs an API-key or local LLM profile. An OAuth-only provider (OpenAI Codex, GitHub Copilot, CodeBuddy) cannot drive indexing and is rejected with an explanation. OSS bases are PDF-only, and at most one may be selected per request.
- PageIndex's built-in MCP server is gone. Nothing to configure — hosted bases keep working through the new reading loop. If you had pinned that MCP server anywhere yourself, drop it.
- Tika installs nothing. Run an Apache Tika server and point
TIKA_SERVER_URLat it (defaulthttp://localhost:9998); there is noparse-tikaextra because there is no Python package. - The LightRAG extra's floor moved to
raganything>=1.2.5, the first release carrying the keyword passthrough. Older installs are not broken — unsupported knobs are dropped with a warning — but the three new ones need that floor to take effect. The knobs apply to the next build, not the next question. - Book drift warnings re-baseline once. Fingerprints now carry a scheme tag, so changing the formula re-baselines existing books instead of marking every one of them stale.
- Whisper is not a primary nav entry. It sits under Learning Space → More Projects, and the room needs its own capability package — a stock install has the page but not the counselling capability behind it.
Full Changelog: v1.5.14...v1.5.15