Repository navigation
Releases: HKUDS/DeepTutor
Release list
v1.6.15
DeepTutor v1.6.15 Release Notes
Release Date: 2026.10.19
Building on v1.6.14, v1.6.15 improves Guided Learning with reviewed outline changes, independently graded question groups, and bounded tutoring memory. It also strengthens chat recovery and document parsing, adds retrieval comparisons, and brings native Gemini speech.
What's New
Learning paths you can revise and practice
Preview module reordering before committing it, and apply coordinated changes across modules together. Tutors can present two to four questions as a group, retain partial submissions, and assess each answer independently. Source-grounded semantic assessment accepts equivalent explanations while distinguishing incomplete, incorrect, and uncertain answers. Concept and design cards remain practice; mastery still requires the learner's own explanation.
Teaching continuity in longer sessions
Guided Learning retains teaching preferences, unresolved misunderstandings, and relevant source anchors in bounded memory, with access to original exchanges when needed. Source preparation follows the current learning request, preserves visible teaching, and reports progress and repair failures in the session language. Usage totals now include preparation and memory-compression calls; compression has its own cost.
More reliable conversations and settings
Streamed content is saved periodically for recovery, completed streams release their in-memory events, and reconnecting clients wait for the actual terminal event. Unsent messages retain recoverable copies until the server acknowledges their dismissal or replacement. Settings keep drafts after failed catalog writes and show actionable permission or HTTP errors. Learning navigation respects account grants, and named timezones work on Windows.
Parsing that isolates failures
MinerU CLI workers have explicit process ownership and consistent deadlines, retain terminal error details, and are not stopped merely because their logs go quiet. Unreadable PDFs and native parser failures are isolated during indexing so other documents can continue. Cancellation stays attached to the correct indexing run, and recovery messages distinguish reusable parsing from embedding work that must restart.
Retrieval experiments and workspace instructions
An optional query-rewrite layer produces one standalone search query and falls back to the original on failure. deeptutor kb eval --rewrite off|standalone records rewrite provenance; deeptutor kb eval-diff baseline.json candidate.json compares saved metrics and cases. Workspace instructions guide subsequent turns in supported capabilities. Reading also accepts browser-zipped .epub.zip folders and improves playback, citations, and annotation recovery.
Providers and optional request screening
Gemini TTS uses native generateContent speech with Google voices, and onomeo joins the OpenAI-compatible provider catalog. An optional guard extra adds HTTP rate limits, address rules, and request-pattern screening; it is disabled by default and does not inspect request bodies or WebSocket traffic.
English and Chinese documentation is updated alongside the release at deeptutor.info.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest. Restart running services after upgrading.
- Gemini speech: select a Google voice and WAV or PCM output. This adapter does not accept a speed parameter; use voice instructions for delivery style.
- Query rewrite: disabled by default. Enable it in
data/user/settings/query_rewrite.json, through the documented process overrides, or explicitly for an evaluation. Rewriting makes an additional model call. - Workspace instructions: configure them in Settings → Workspace. Changes apply from the next turn; Deep Research, Quiz, and Manim do not use them.
- Request screening: install
deeptutor[guard]and enablesecurity_guard.enabledinsystem.jsononly when wanted. Review proxy and rate-limit settings in the guard guide; counters are local to each server process. - Index recovery: retries reuse compatible completed parses and validated cloud slices. They do not resume interrupted local inference or embedding midway through its work.
Full Changelog: v1.6.14...v1.6.15
v1.6.14
DeepTutor v1.6.14 Release Notes
Release Date: 2026.10.08
Building on v1.6.13, v1.6.14 brings original-source visual practice, recoverable knowledge-base indexing, scientific research tools, and managed plugins. Video learning now lives in Reading; existing Watching conversations migrate when reopened.
What's New
Original figures, pages, and visual practice
Ask about an exact figure, table, or PDF page in an attached knowledge base. DeepTutor retrieves the original image or renders the selected page or region, preserving document identity and source links. The Files view exposes source visual coverage, including missing or unverified extraction. Guided Learning uses this evidence for visual questions and distinguishes explanations, assisted practice, and independent mastery; inaccessible or uncertain evidence stays ungraded.
Indexing that can recover
Knowledge-base details show durable indexing progress, individual source outcomes, and recovery information. Retries reuse compatible completed parses and validated MinerU cloud slices; cancellation takes effect at a safe boundary. LlamaIndex publishes a new version only after reload, vector validation, and a retrieval probe succeed, preserving an earlier queryable version when a rebuild fails. Retrieval also reports hybrid-to-vector fallback and incomplete IMA evidence.
Reading includes video learning
YouTube and Bilibili media share the Reading workspace, with timestamp-grounded discussion and native playback. Previous Watching conversations, positions, and notes can be imported without modifying their legacy media or notebook records. Reading panels resize independently, offer a focus preset, and retain usable pagination and selection controls on narrow screens.
Research with traceable evidence
Scientific requests and Deep Research gain tools for reading versioned arXiv papers and original pages, checking paper claims against a pinned GitHub revision, and building literature evidence matrices. The MCP catalog adds alphaXiv. Administrators can approve an exact private-network MCP origin for account-owned research connections, with approval checked again when tools run.
Reviewed plugin lifecycle
The plugin CLI supports inspection, installation, permission approval, enable/disable, rollback, and uninstall. Managed wheels run in separate environments, with artifact checks and revocable runtime gates. The official catalog format supports reviewed packages; this release ships an empty catalog, so it does not install new third-party code automatically.
Learning continuity and everyday fixes
Space gains a workspace learning journal showing the current mission, last-session handoff, and confirmed learning records. Chat retries reuse the original conversation after a lost acknowledgement, parked questions survive reloads, and unsent drafts remain recoverable. Branch navigation, memory account isolation, launcher recovery, and error reporting improve; Visualize also gains Mermaid mindmaps.
Providers and setup
GitHub Copilot uses device login and per-owner credentials, with inference checked during setup. Opper joins LLM and embedding providers, and Y-API joins LLM providers. Provider settings offer a clearer add flow, protocol-aware default endpoints, and provider voice discovery. Local embedding services can work without API keys, while embedding concurrency and Qwen3-Instruct thinking handling are corrected.
Updated English and Chinese documentation accompanies the release at deeptutor.info.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest.
- Video learning: use Reading for new video sessions. The standalone
immersive_watchingcapability andwatching/watchCLI aliases are retired. Existing Watching links enter the compatibility migration; keep the existing application data available. A missing legacy video leaves its conversation accessible as ordinary chat. - GitHub Copilot: run
deeptutor provider login github-copilotagain if you previously relied on external Copilot/nanobot token files. Each account signs in separately; Copilot profiles cannot be shared through model grants. - Speech: explicitly select a voice in the model settings; new profiles no longer receive a hard-coded default voice.
- OrcaRouter: its built-in provider presets are removed. Configure a Custom connection with an explicit compatible endpoint and model if you still use that service.
- Knowledge bases: older indexes need re-parsing and reindexing to gain newly extracted figure records. Exact PDF-page inspection can use the original document directly. Retry reuses only valid compatible checkpoints; it does not resume an interrupted local MinerU inference midway through a document.
- Plugins: review requested permissions before approving a managed package. Restart DeepTutor when a plugin generation changes so the reviewed code is loaded; disabling or revoking approval blocks subsequent calls.
- systemd installs: stop the service, upgrade DeepTutor in its Python environment, and restart the service.
Full Changelog: v1.6.13...v1.6.14
v1.6.13
DeepTutor v1.6.13 Release Notes
Release Date: 2026.10.04
Building on v1.6.12, v1.6.13 expands reading, listening, and question-bank practice, improves document parsing and speech configuration, and brings Polish plus more model providers. Chat attachments now follow the selected workspace, with existing uploads and URLs preserved during the transition.
What's New
Read, listen, and revisit
Immersive Reading gains natural read-aloud audio and quiz star rewards. Immersive Watching gains timestamped marks, notes, and suggested review points. PDF resizing and EPUB chapter navigation preserve reading position more reliably; learners can open explicitly assigned books and reading materials within their granted access.
Practice from your question bank
Start practice directly from the Question Bank and select multiple saved questions for a chat. Guided Learning shuffles multiple-choice options and avoids exposing correct answers through option letters or retrieval prompts. Co-Writer lets you choose the model for an edit.
More reliable document retrieval
Choose an independent vision model for document image descriptions; successful descriptions are cached per workspace, with optional bounded batching. MinerU cloud parsing slices oversized PDFs and resumes completed parts, while local failures report actionable causes. Optional tiny-scan normalization, numbered-exercise lookup, and better figure retention improve textbook retrieval. deeptutor kb eval measures retrieval quality against a local evaluation dataset.
Speech settings that explain failures
Speech models have a configurable synthesis timeout used by previews and playback. DashScope Qwen-Audio and Qwen3 TTS use their respective endpoints, voices, formats, and regional requirements. Preview errors distinguish authentication, permissions, parameters, quota, network failures, and timeouts. Reply playback preserves math, cancels stale requests, and prevents overlapping audio.
Workspaces and connections
New chat uploads live in the selected workspace's chat/attachments directory so workspace tools can find them. Earlier uploads move there when their conversation is used or its data is migrated; existing attachment URLs remain readable. SearXNG connection tests explain Docker addressing, disabled JSON output, and empty search results. Web sources can pair bilingual content, and knowledge-base checks reuse probes without blocking the API.
Partners, languages, and providers
Export Partner group conversations as Markdown and configure Telegram response policies per chat. Feishu delivery and Telegram code blocks are more reliable. Polish joins the interface languages; Requesty, API Route, and FutureInfra join LLM providers, with native MiniMax speech and Xiaomi MiMo v2.5 preset speech support.
Chat recovery and everyday fixes
History search checks full conversation transcripts and excludes recycled sessions. Long conversation branches, reconnecting submissions, LaTeX selections, and learner routes recover more reliably. Image payloads no longer inflate token estimates, GLM reasoning options match supported settings, and deeptutor doctor honors the configured provider and token budget.
Updated setup and feature documentation accompanies the release at deeptutor.info.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest.
- Attachments: no manual move is required. Earlier uploads are relocated into the selected workspace when needed; keep existing application data mounted during the upgrade.
- Speech: set Request timeout (seconds) in the speech model when synthesis needs more time; the default is 60 seconds, with a supported range of 5–600 seconds. Use Preview voice to test synthesis; fetching a model list alone does not validate a voice.
- DashScope Qwen-Audio TTS: use a Beijing API key and a voice supported by the selected model. A provider API base URL selects the matching speech endpoint automatically; Qwen3 TTS uses its own voices and WAV output.
- Document images: select an image-description model in Document Parsing settings if the main model cannot inspect images. Batching and tiny-scan normalization are optional; older indexed content needs re-parsing and reindexing to gain newly generated descriptions or figure records.
- Learner books: administrators must grant the Books surface and explicitly assign a book; learner access stays scoped to those assignments.
- systemd installs: stop the service, upgrade DeepTutor in its Python environment, and restart the service.
Full Changelog: v1.6.12...v1.6.13
v1.6.12
DeepTutor v1.6.12 Release Notes
Release Date: 2026.09.27
Building on v1.6.11, v1.6.12 lets each workspace place and move its knowledge bases, connects searchable Kiwix archives, and carries source figures into grounded answers. A Task Board, German interface, and recovery fixes round out the release. Existing data needs no migration; systemd installs now update outside the app.
What's New
Knowledge bases follow the workspace
Choose the storage workspace when creating a knowledge base. Move one existing base from its Settings panel after reviewing destination blockers and affected assignments; DeepTutor verifies the copied data and index before switching references. Saved knowledge-base IDs and workspace assignments continue to resolve. Moves are blocked while processing or when shared grants, destination collisions, or unsupported MarginNote data make them unsafe.
Connect Kiwix archives
Connect one searchable ZIM archive served by kiwix-serve as a knowledge base from the Knowledge Center or deeptutor kb connect-kiwix. Search reads the archive on demand without uploading or indexing a copy. You can also bring an article into Immersive Reading. Removing the connection leaves the archive untouched.
Source figures in grounded answers
The LlamaIndex knowledge pipeline can retain parser-extracted PDF and EPUB images alongside their captions and source locations. When retrieval finds one, a vision-capable answer model sees the verified pixels; text-only models receive the caption and context with an explicit limit. Immersive Reading can inspect a stored figure on demand. This depends on a parser that emits images and reindexing older content; see Upgrade Notes.
Task Board and learning controls
A workspace-local Task Board tracks To do, In progress, and Done cards with notes, accessible move controls, and a restorable archive. Guided Learning now respects an explicit teach-first preference and gives a localized next step. Teacher and student join the accepted non-admin role values without gaining admin privileges.
Languages and providers
German joins the interface languages, and Malay becomes a reply-language option. Cheaper Inference joins LLM providers; local Lemonade embeddings work without an API key. DashScope image, video, and speech requests use supported endpoints, sizes, and model IDs; saved DashScope paraformer-v2 speech profiles migrate to paraformer-realtime-v2 automatically.
Reliability and accessibility
Failed chat submissions remain recoverable across retries and storage races, and unanswered turns can recover from a lost worker. LightRAG reuses only compatible indexing caches, retrieved figures stay within bounded model context, and partial Deep Research and Manim failures report their cause. Shared tooltips replace inaccessible native title hints across learning and workspace controls, including touch interactions.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest. Existing data needs no manual migration.
- Kiwix: run a reachable
kiwix-serveinstance with full-text search for the chosen ZIM, then connect its server URL and archive name. Disconnecting only removes the DeepTutor pointer. - Older knowledge-base figures: reindex existing LlamaIndex source files to create visual records. MinerU and PyMuPDF4LLM can emit supported images; the default text-only parser and current Docling adapter do not. Other RAG engines do not index the visual records yet.
- systemd installs: in-app update handoff is disabled for a running service. Stop the service, upgrade DeepTutor in that service's Python environment, and start it again with
systemctl. - Windows microphone transcription: native DashScope and Volcengine speech adapters need
ffmpegon the servicePATHto convert browser WebM/Opus audio; restart DeepTutor after installing it. OpenAI-compatible STT does not need local conversion.
Full Changelog: v1.6.11...v1.6.12
v1.6.11
DeepTutor v1.6.11 Release Notes
Release Date: 2026.09.24
Building on v1.6.10, v1.6.11 is a wide release: French and Ukrainian join the interface, immersive reading gets folders, figures and in-chat selection actions, Office files preview as real pages, and knowledge bases learn to keep themselves in sync. Migrations are additive and run on first start. The Docker image is larger (LibreOffice), and the container now refuses to start if /app/data is not writable.
What's New
Four interface languages, fourteen reply languages
The interface now ships in English, Chinese, French and Ukrainian, chosen from a select in Settings → General. Ukrainian is complete; French strings not yet translated fall back to English. Model replies can be set to 14 languages, and the new /language command in the composer pins a reply language for one conversation without touching your account default.
Immersive reading, reorganized
Reading collections become colored folders with their own page for files and conversations, and a Fullscreen learning mode hides the rest of the app. Selecting a passage and choosing Explain, Translate or Guide me now posts an ordinary message in the reading chat with the quote attached, so the exchange stays in the conversation history. Quiz me on this page runs a three-question quiz on the open page without switching the conversation's mode. EPUBs gain display controls (font, line width, theme, two-page spread), built-in actions adapt to a learner's age, and annotations are re-anchored when a material is revised.
Pictures and figures reach the model
Images embedded in DOCX, PPTX and PDF are extracted, shown at their original position, and forwarded to vision models from chat attachments (up to 12 per document). Pages drawn as vectors are rasterized so the model can see the figure, and figure captions are available as an opt-in parsing setting. Existing materials are not re-extracted automatically — see Upgrade Notes.
Office files preview as pages
The chat viewer and knowledge-base file preview render Word, PowerPoint and Excel files, legacy formats included, as paged PDFs through LibreOffice. Without LibreOffice, DOCX and XLSX fall back to the in-browser renderers and other formats to extracted text. The viewer also gains a New tab launcher and a smoother open/close animation.
Knowledge bases that stay current
Documentation-site sources re-sync on a durable schedule (every 24 h by default, 1–168 h per source), with job history, cancel and retry. Linked local folders show tracked files and a Sync now action that picks up new and changed files. .bib files can be indexed, a new zotero_search tool queries your Zotero library, image-only scanned PDFs fall back to local OCR, and LightRAG exposes its LLM timeout. An empty knowledge base now bootstraps on its first upload for every local engine.
Learning progress
A new Settings → Learning progress page shows how far you have read in each material and your recent learning actions, scoped to your account. Mastery review plans take a per-path recall target.
Providers, agents and imports
Unifically joins the provider list, Grok CLI joins the live subagents in My Agents, and the import wizard accepts conversations.json from an official ChatGPT data export. Rate-limited requests now try every configured API key, Claude models that reject temperature no longer receive it on any route, and the Codex model catalog tracks the current Codex client version.
Accounts and deployment
Administrators can import users from CSV and delete them in batches. Split private/public deployments can restrict password sign-in to private hosts and pair a public device through a short-lived handoff link. Settings offers four reviewable, credential-free presets. Docker honors PUID / PGID for bind mounts (Unraid), standalone builds package their static assets, and Partner QR onboarding works on a plain install.
Chat, voice and Partners
A failed turn can be resent from its saved request, and a regenerate that is rejected keeps the previous answer. Speech reads LaTeX aloud as words (Math speak, on by default). Optional Google Web Risk filtering drops flagged search citations. Feishu partners reply in threads and switch models with /model in a direct message, Telegram replies land in the originating topic, settled group discussions export as Markdown, and Sync browsers carries a Partner conversation across your browsers.
Fixes
A notebook path-traversal bug that could overwrite arbitrary JSON files is closed. Grant files are written atomically and fail closed when corrupt, learners are limited to an explicit set of knowledge-base reads, reindex progress no longer leaks between workers, IMA no longer reports citations for empty searches, and usage pricing prefers exact model matches.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest.
- Docker: the image now includes LibreOffice and CJK fonts, so it is noticeably larger. The entrypoint remaps the container user to
PUID/PGID(default 1000) and stops at startup if/app/datais not writable, instead of failing later — fix the bind-mount ownership or setPUID/PGID. - Source installs: put
sofficeonPATHto get paged Office previews; without it previews fall back as described above. - Web sources start auto-syncing. Existing documentation-site sources default to a 24-hour schedule after upgrade. Turn it off or change the interval per source on the knowledge base page.
- Old reading materials keep their extraction. To add figures (and optional captions) to already-ingested materials, run
python scripts/reading_refresh_figures.py --all --yes(add--captionfor captions); annotations are preserved. - Removed: the reading "openers" endpoint (
/reading/workspaces/{id}/openers) and its Reading openers task model. A saved pin for it is dropped automatically. - New optional keys:
UNIFICALLY_API_KEY;auth.private_login_hosts/AUTH_PRIVATE_LOGIN_HOSTSandAUTH_TRUSTED_FRONTEND_PROXY_IPSfor split deployments;tools.web_search.source_filtering.use_web_riskwithGOOGLE_WEB_RISK_API_KEY.
Full Changelog: v1.6.10...v1.6.11
v1.6.10
DeepTutor v1.6.10 Release Notes
Release Date: 2026.09.22
Building on v1.6.9, v1.6.10 gives the native LightRAG engine its own role models and makes a published index state what it was built with. Around it: PDF attachments now honor your parsing engine, a generation cut off at its token budget says so instead of failing as a parse error, and model providers are no longer filtered out of services DeepTutor could not pre-verify. Drop-in — no migrations.
What's New
Native LightRAG role models
The native LightRAG engine takes a base model of its own, independent of the chat model, with optional per-role overrides for extraction, keyword, query and vision. Vision is off by default on a new configuration. Knowledge-base creation and full rebuilds use the shared engine defaults rather than per-index overrides, and a changed configuration is shown for review before it is submitted.
An index that records how it was built
Publication pins the extraction and vision identities an index was built with, so later changes to the engine defaults leave an existing index alone. Index versions display their embedding, extraction and vision provenance; an index whose historical identity is unknown stays queryable but refuses incremental writes until a full rebuild. Enabling, disabling or replacing vision or extraction requires a full rebuild, and a rebuild that fails withdraws its publication instead of leaving a half-published index. Credentials are excluded from persisted policy and provenance.
Embedding compatibility is enforced, not advised
Native LightRAG queries and incremental indexing require the embedding configuration recorded by the published index — model, dimension and endpoint identity. If it changes, restore the original configuration or rebuild with the current embedding. The knowledge-base detail and index-version views carry the recovery guidance, and files stay available for viewing and download throughout.
PDF attachments follow your parsing engine
A PDF attached to a turn goes through the parser configured in Settings → Knowledge Base, with its processing stages visible while it runs. When the global default engine cannot accept a file, DeepTutor falls back to a text-capable engine rather than failing the turn, and a parser failure still falls back to native PDF extraction. Non-PDF turns skip parser setup entirely, and regenerating a turn that carries attachments no longer breaks request validation.
A truncated answer says it was truncated
Responses now distinguish a complete generation from one cut off at max_tokens, so a budget exhausted by a reasoning model no longer surfaces as an undiagnosable parse error. Math animator raises its own budget across retries (capped at twice the base) and tells the retry that the budget, not the format, ran out. Visualize explains a truncated render on screen instead of ending silently, and its temperature and token budget are now configurable in Settings → Capabilities.
Model providers you can configure and test
Provider options are no longer hidden from services DeepTutor could not pre-verify: pick any provider for embedding, search, voice or multimodal, and let the connection test say whether that model actually serves that role. Unrecognized vendors resolve through the generic OpenAI-compatible binding, except for search, which has no generic adapter and is rejected by name. Staging a provider connection also works over plain HTTP, where crypto.randomUUID does not exist and the Continue button previously did nothing.
Learning and mastery evidence
Mastery evidence binds to objective and question identity, so a repair applies to the question it came from and a replayed qualitative assessment does not double-count. A mastery card that was never posted can no longer be claimed as delivered, and selected quizzes must complete before delivery. Notebook evidence is decoupled from chat sessions, and the Personalized Learning dashboard no longer crashes on its first card.
Reliability fixes
Sandboxed execution tolerates a bwrap loopback denial on modern Linux and keeps network isolation during fallback. The launcher no longer opens a stray console window that read as "the backend exited", and settings-derived environment keys stop shadowing the live settings API across processes. Research reports recover their labels on a finished reply, GitHub source sync records a confirmed-current source correctly, mastery composer resources match the chat page, persona presets are admin-gated, retry state survives request validation, and tooltips are accessible across the UI.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest.
- Existing LightRAG indexes keep working. They query as before; only incremental writes are gated. An index with no recorded embedding identity, or one whose embedding configuration has changed, asks for a restore or a full rebuild before accepting new documents.
- Vision indexing is opt-in on new role configurations. Turning it on (or off, or swapping the model) applies to the next full rebuild, not to an index already published.
- Provider lists are wider on purpose. A provider that cannot serve the selected role now fails its connection test instead of being absent from the list. Test before applying.
Full Changelog: v1.6.9...v1.6.10
v1.6.9
DeepTutor v1.6.9 Release Notes
Release Date: 2026.09.21
Building on v1.6.8, v1.6.9 brings folder-based learning workspaces, a daily practice loop, redesigned Settings, and clearer streaming conversations. Learning surfaces move under /learning/ with redirects for old links; conversation deletion now means permanent deletion, with archiving available for conversations you want to keep.
What's New
Workspaces for your learning data
Choose a workspace when starting a conversation, book, mastery path, reading or watching session. Custom workspaces keep learning data in .deeptutor/data/ and generated files in outputs/; settings, credentials and Memory remain shared across your account. Manage workspaces and their Skills, MCP services and knowledge bases in Settings → Workspaces. Partners can keep private resources or stay linked to a workspace. See workspaces.
Data migration with previews and recovery
Settings → Data Migration previews the files, sessions and dependencies involved before moving data between workspaces. Transfers verify copied data before clearing the source, refuse conflicting destination data, and retain recovery snapshots after completion. An interrupted operation can be resumed or rolled back from Recent operations.
Practice over your existing question bank
Personalized Learning → Practice adds daily review, mistake tracking and statistics to the questions already available at /space/questions. Choice and true/false questions are graded server-side; fill-in and short answers use self-assessment. Import .xlsx, .csv, .tsv or .json files, up to 500 questions per import. Mastered questions pause review scheduling; a later incorrect answer resumes it.
Settings with dedicated pages
Settings now has grouped navigation and separate pages for Providers, Language models, Task models, Voice, Multimodal generation, Usage, Data migration and Archived chats. Reusable provider credentials sit above their models, with discovery and connection probes. Model edits remain staged until applied. OpenAI Codex sign-in is under Providers; runtime diagnostics are under Runtime status.
Conversations that show the order of work
Streaming text stays alongside the tool calls it introduces. Once an answer arrives, the working-out folds into a reopenable activity header. Question cards remain part of the exchange, and skipped questions show their skipped state. The composer exposes mode, agent, model and resources, with one-click reuse of a previous turn's resources.
Mastery and review improvements
Mastery grading now distinguishes quiz accuracy from concept and design assessment gates, avoiding repeated quizzes that could never advance an objective. The study map refreshes when a turn ends, and drafts bind before their opening turn. Focus-Check attempts from Mastery, Book and Reading share persistent review records; retries use the current attempt's result. Incorrect answers recorded by Partners also reach the question bank.
More reliable maths rendering
Math normalization handles alternative delimiters and formulas embedded in code spans while preserving actual code and ordinary currency amounts. Ambiguous dollar signs stay visible instead of swallowing prose.
Usage, speech and model choices
Answer footers show turn or session tokens, cache usage and duration. A durable per-account usage ledger remains available after a conversation is deleted, without retaining prompts, responses or credentials. Voice adds Doubao Speech through Volcengine for synthesis and transcription. Knowledge bases can bind their own embedding model, and connected agents support a remote Hermes gateway.
Reliability fixes
Reading extensions use their own event loop and support retry after a cancellable timeout. Empty LlamaIndex knowledge bases accept their first upload. Telegram thread routing survives restarts, embedding requests honor date-form Retry-After headers, and documentation crawls respect robots rules and per-host pacing. Chat duration covers submission through completion, and stored session modes survive reloads. Initial JavaScript is smaller through deduplicated English translations and deferred animation features.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest.
- Review deletion behavior. Delete permanently removes a conversation, its tutor threads and associated attachments. Use Archive to hide a conversation while keeping it recoverable. Legacy recycle-bin conversations are converted to archived conversations during the session metadata upgrade; restore them through Settings → Archived chats.
- Custom workspaces are opt-in. Existing learning data keeps its historical storage locations until you explicitly move it. Workspace metadata and legacy archived-state records are upgraded automatically. Settings, credentials and Memory remain shared at the account level.
- Learning URLs moved.
/books/…,/mastery/…,/reading/…and/watching/…redirect to their/learning/…equivalents./settingsremains available. - Migration snapshots use disk space. Read the preview before moving data, allow space for copies and recovery snapshots, and pause external writes to affected directories. Existing target data or conflicting IDs block a transfer.
- Archived or unavailable workspaces refuse new writes. Restore or reconnect the workspace before continuing. A Partner with an unavailable bound workspace reports the error instead of silently switching elsewhere.
Full Changelog: v1.6.8...v1.6.9
v1.6.8
DeepTutor v1.6.8 Release Notes
Release Date: 2026.09.14
v1.6.8 lands twenty-two community pull requests and a sweep of the reports behind them. Where v1.6.7 chased a token budget spent on hidden thinking, this one mostly answers a different complaint: I did a thing and the app quietly did nothing. A deleted chat with no way back, a book link that opened the library instead of the book, an attachment the model never mentioned, a backend killed while it was still starting. Three new surfaces arrive alongside — a recycle bin, history search, and a tool that looks past your own knowledge base. Drop-in — no migrations.
What's New
Deleted chats are recoverable
Deleting a conversation used to be final. It now moves the chat to a recycle bin — a collapsible section in the sidebar — where you can restore it or delete it for good. Attachments, mastery state and the rest of a chat's artifacts survive the trip and come back with it, and only an explicit purge removes anything from disk.
Search your whole conversation history
The history picker now searches message text, not just titles. Matches come back with a short excerpt around the hit so you can tell two similar conversations apart before opening either. Literal, case-insensitive, and bounded on both the query and the excerpt.
A tool that looks past your knowledge base
knowledge_frontier reads a knowledge base and goes looking for what is not in it — recent work on the same subject, surfaced as a starting point rather than an answer. It mounts automatically when a turn has a KB, next to rag and kb_files:
deeptutor run chat "Find recent work beyond this material" --kb textbook --tool knowledge_frontierReasoning models that stop mid-thought now say so
A round that spent its whole budget on hidden reasoning and returned nothing used to end the turn with an opaque failure. Two readings of that scene now run in series: a round that demonstrably hit its cap fails with the counters that prove it — rounds, reasoning characters, completion tokens — because that is a configuration you can act on. Anything else that reasoned without answering ends the turn saying which kind of empty it was. Replayed rounds keep their reasoning for providers that send it, and a leading <think> block no longer swallows the JSON after it.
Reading and Books open where you pointed them
A deep book URL opened the library and left you to find the book yourself; the outline stopped tracking the page you were actually on once the material was a document rather than media; a reading material rendered "cannot open" during the beat before loading had begun. All three are fixed. So is an EPUB that macOS re-zipped — Finder's archive wraps the book in a directory, which used to leave DeepTutor treating __MACOSX/._* entries as chapters.
Attachments the model can actually see
Images from earlier turns are re-sent so a follow-up question about a picture still has the picture, with the cap now a setting rather than a constant. And a file whose text extraction produced nothing — a scanned PDF, typically — is listed with the reason instead of being skipped in silence, so the model can name the file and say why it cannot quote it rather than asking you to upload it again.
Settings, startup and the things that were failing quietly
Applying settings that changed nothing used to reset every runtime client anyway; one place now decides that, instead of five call sites each deciding it their own way. The launcher no longer kills a backend that is merely still starting. Retrieval progress logged off the event loop reaches you instead of vanishing. A capability is cancelled when the turn consuming it stops, GraphRAG workers repair stale Arrow registrations before they start, and behind a reverse proxy the access log records the real client rather than the proxy.
Smaller fixes worth naming
An ask_user card drops an option whose visible text duplicates another. A quiz plan that comes back with no templates fails instead of silently producing nothing. An explicit retryable: false is honored rather than overridden by the status code. read_skill recovers a missing file properly. A session held by a dead turn clears itself. The reasoning probe budget is no longer the outlier it was, and every LLM budget now lives in agents.yaml, one entry per stage.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest. Nothing needs migrating.
- Deleting a chat is now reversible, and that changes what "delete" means. A delete soft-deletes; the row stays until you purge it from the recycle bin. Deleting a reading material still removes its sessions the same way it did before.
agents.yamlowns every LLM budget. Stage-levelmax_tokensentries moved there, one per stage. Values you already set are still read; stages that had no entry now have one.- The prior-image re-injection cap is configurable. It was a hard-coded 4. It lives in system settings now, and
0turns the feature off.
Full Changelog: v1.6.7...v1.6.8
v1.6.7
DeepTutor v1.6.7 Release Notes
Release Date: 2026.09.11
v1.6.7 is a fix release assembled almost entirely from community reports and the pull requests behind them — nineteen merged here. One thread runs through most of it: reasoning models. A book that came back as a single empty chapter, a quiz that produced no questions at all, and a chapter body containing the model's own scratchpad turn out to be the same failure wearing three faces — a token budget spent on hidden thinking, with nothing left for the answer and no error to say so. Drop-in — no migrations.
What's New
Books stop arriving as one empty chapter
Book generation asked for its token settings under a name the config layer did not know, so it returned a hard-coded 4096 before ever opening agents.yaml — a budget no user could raise, and one a reasoning model can spend entirely on hidden tokens. An empty response then parsed as an empty object and degraded to a single placeholder chapter; a budget exhausted midway produced the other reported shape, every chapter present with its objectives blank.
Book is now wired into the config map and seeded at 12000, and a round that comes back without the key it asked for is retried once at lower reasoning effort. That retry existed only for block writers before; all four pipeline stages share it now.
The model's scratchpad stops reaching the reader
The non-streaming path returned the model's reasoning as the answer whenever the answer was empty — the streaming path had explicitly forbidden the same thing, so one decision contradicted itself across two code paths. Separately, an explicit "no thinking" request is now narrowed to what each model actually accepts: gemini-3 and gemini-2.5-pro answer HTTP 400 to none, and the reader-facing book blocks ask for exactly that.
Thinking models keep their reasoning across turns
Replaying a round's reasoning_content back to the provider was gated on the model name containing deepseek. A model name is not how a provider announces its dialect — Volcengine Ark takes an endpoint id, and Doubao, GLM, Qwen and Kimi thinking models each go by their own. They all failed the moment a new turn replayed history, while the same round inside one turn worked. The gate is now whether the provider sent the field at all.
Quizzes stop silently producing nothing
The plan step had the tightest token budget in its pipeline, and a plan whose thinking was truncated returned the same empty string as a model with nothing to say. Zero templates meant zero questions — and no error. The two cases are now distinguishable, a starved plan is retried at lower effort, and the budget is no longer the outlier.
A failed tool says what went wrong
"An unknown error occurred while executing rag." replaced the real cause on its way to the model, across chat, research and question. The cause now travels with the message. That covers the reported case where a stopped local embedding service was invisible: the adapter had always named the endpoint and the remedy, and the text was being discarded a layer above it. A self-hosted endpoint that refuses a connection also now says which of the two things went wrong — nothing listening, or a container whose localhost is not the machine serving the model.
Formulas render where a learner reads them
Mastery question cards, ask_user cards and reasoning traces printed $G_t = R_{t+1} + \gamma G_{t+1}$ as raw text. Traces had it worst: a guard excluded them from the rich renderer, which left that renderer's own trace branch unreachable since March. Whether a surface renders math is now decided by the content, not by which surface it is, so a bubble with no math still takes the cheap path.
Cards you can actually submit
A Mastery question with no multiple-choice options read your answer from a field it never rendered, so Submit stayed disabled forever. And a turn parked on an ask_user card could be left owning the session with nothing alive to answer it — every later message refused. Both halves are fixed: an abandoned turn is reclaimed when a reply arrives, and the terminal-state check that manufactured those rows (it accepted only running, never a turn waiting on a person) no longer does.
Reading, visualizing, importing
Immersive reading now ships the PDF.js decoder assets, so JPEG 2000 and JBIG2 page images stop coming up blank. GeoGebra rejects known-fatal command patterns before evaluation and surfaces the failures it used to swallow, and image analysis no longer crashes before reaching a model at all. Codex history import reads the current rollout format, and the turns Codex injects for itself — plugin manifests and similar — no longer become your first message or the conversation's title.
Smaller fixes worth naming
A streamed provider error is raised rather than delivered as the assistant's answer. API key pools survive the config resolver. read_skill tells a missing file apart from a missing skill instead of reporting both as "skill not found". Command ids work on plain-HTTP deployments, where crypto.randomUUID is undefined. Image generation retries image-only when a router supports neither modality pair. Research tool timeout and retry settings are honored at all now — and default to a ceiling for a stalled provider rather than one a slow tool trips. Settings readiness renders for read-only users, chat recovers tool calls invented for attached PDFs, and the Watching transcript follows the active cue instead of pushing it off-screen.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest. Nothing needs migrating.
- Book's token budget is now reachable. It lives under
capabilities.bookinagents.yamland is seeded at 12000. It was 4096 and unreachable before, so books get materially longer inputs by default. - Research tool policy defaults changed — timeout 60s → 240s, retries 3 → 0. A research tool is slow by nature, and a retry paid the full timeout again. If you saved research settings under an earlier version, your stored values still win; clear them to pick up the new defaults.
- Known issue: an
ask_userturn stranded before this upgrade can still hold its session. The path that creates them is closed, but existing rows are not swept at startup yet — that sweep lands in a following release.
Full Changelog: v1.6.6...v1.6.7
v1.6.6
DeepTutor v1.6.6 Release Notes
Release Date: 2026.09.08
v1.6.6 is a fix release, and an unusually clarifying one. Working through the v1.6.5 feedback showed that most of what people reported was not a regression: v1.6.5 mostly removed things that had been masking older breakage, so answers that silently failed to submit, a copy button that reported success it never had, and reading actions unusable since v1.6.0 all became visible at once. Those are fixed here, along with the batch of community pull requests behind them. Drop-in — no migrations.
What's New
Answers you submit actually arrive
An ask_user card whose turn had already ended could no longer reach the backend, so submitting did nothing. Worse, the three composers discarded what you had typed when a submission was refused, while the error told you to send a new message — which was the very thing being blocked. Both are fixed: a finished turn that still owns an unanswered card keeps its address, and a refused answer is re-sent as an ordinary message instead of being thrown away.
Notebook entries with answer images could not be saved at all since v1.6.3 — the insert listed 23 columns against 22 values and raised OperationalError every time.
A noticeably lighter first load
The generated brand-icon table — every store logo, about 95 KB — was riding in the app-shell chunk that every route shares, for the sake of one footer link. It is out, the sidebar's session-organization UI and the Co-Writer notebook picker now load on demand, and the home route dropped from 305 KB to 203 KB against a 300 KB budget. No route is over budget any more.
Copy actually copies
The copy button reported success whether or not anything reached the clipboard, and announced that false success through aria-live — so a screen-reader user was told the copy worked when it had not. Clipboard access is now probed before the first await (spending the user-gesture allowance too early was the underlying cause) and a real failure is shown as one.
Knowledge bases: names, uploads, empty bases
A knowledge base named with a slash could be created and then never deleted. Validation now lives on the manager, so all eight registration entry points share it, and a bad name that already exists can be removed. Large uploads that failed mid-transfer with a bare "Failed to fetch" also work: the proxy was replaying the client's Expect: 100-continue header, which undici rejects outright. Creating an empty knowledge base no longer raises progress errors.
Partners can use your connected knowledge bases
Assigning an Obsidian vault, a linked index, WeKnora or IMA to a partner used to fail outright: provisioning only knew how to copy a folder, and a pointer knowledge base has none by design. Connected bases are now registered as pointers, stay visible in the partner's library, and can be removed again. Obsidian, MarginNote and subagent bases are deliberately declined — each drives an exclusive capability that would take over every one of that partner's turns.
Files a partner presents in chat download for the person who asked, and a partner conversation now shows which chat it came from, so a Feishu group thread is no longer indistinguishable from a direct message.
Chat stops reaching for tools it does not have
read_source belongs to the context investigator that runs before the answer loop, not to the loop itself. The prompt and the attached-sources manifest said otherwise, so the model kept trying to reopen PDFs through a file tool it was never given.
Reasoning arrives where it was missing
The shared agentic loop never captured a round's reasoning — the field did not exist on its result type — so surfaces built on it, including book quizzes, surfaced provider reasoning errors instead of content. It is carried through now.
Codex sign-in finishes inside Docker
When the browser cannot reach the container's loopback callback, you can paste the address the browser landed on and complete the sign-in. The pasted address must match the redirect URI registered for that attempt exactly, and duplicated OAuth parameters are refused as ambiguous; it is parsed and discarded, never fetched, stored, or echoed back. The catalog compatibility version was also raised, so eligible models that older versions omitted now appear.
Smaller fixes worth naming
Four reading actions that need a text selection have been unusable by mouse since v1.6.0 — the annotation popover disarmed the toolbar before the click landed. Asking a tutor for another language works, and the browser and server copies of that preference stop drifting apart. Mastery Path recognises mastery_mode as a tool that rebinds the path. Learner accounts can open courses again. Malformed ###heading text is normalized without touching #include inside a code fence.
Fixes
The Moonshot Kimi k3 family is named once instead of per released id, so k3-256k and later variants keep their temperature override; Responses requests rejected for an unsupported input[N].status retry once without it and remember the model; the LightRAG SDK moves off the release candidate to 1.5.7; and the README overview screenshot is current.
Upgrade Notes
Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest. Nothing needs migrating.
- Rolling back to v1.6.4 fixes almost none of this. Most of these defects predate v1.6.5; only the knowledge-base naming and Mastery Path issues have genuinely new v1.6.5 surface area.
- If a custom prompt or plugin told the answer loop to call
read_source, move that work to the context investigator — the loop does not mount it. - The English and Chinese guides have been updated together at deeptutor.info.
Full Changelog: v1.6.5...v1.6.6