Skip to content

v1.6.7

Latest

Choose a tag to compare

@pancacake pancacake released this 10 Sep 16:24

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.book in agents.yaml and 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_user turn 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