Skip to content

v1.5.12

Latest

Choose a tag to compare

@pancacake pancacake released this 13 Aug 11:32

DeepTutor v1.5.12 Release Notes

Release Date: 2026.08.13

v1.5.11 was about what happens while an answer is being written. This one is about where its material comes from. The web-search layer was rebuilt onto a single table — which is how three defects that had been quietly costing you results got found — and six providers were added on top of it, most of them reachable from mainland China. A sixth document-parsing engine lands, and an MCP server whose credential you rotated now reconnects instead of answering with the one explanation that rules out the real cause. Drop-in — no migrations, nothing to re-index.

What's New

Web search rebuilt, with six new providers

The provider list had been copied into seven places — the backend registry, runtime config, the settings router, the CLI wizard, the frontend catalog, i18n, and the tests — and they had drifted apart; the frontend marked Serper deprecated while the backend still offered it. All seven now derive from one SEARCH_PROVIDERS spec table. Consolidating it surfaced three silent defects: Serper's num never reached the API, so max_results did nothing; Serper dropped its proxy configuration; and Jina had no result-count limit at all.

Six providers join on that table — Doubao, Bocha, Zhipu, Firecrawl, Baidu Qianfan, and Aliyun IQS. They appear in Settings → Catalog → Search with their credential fields derived from the spec, and deeptutor init offers them too. Doubao returns an answer rather than only links; Firecrawl adds full-page extraction. Baidu returns as qianfan on the official Qianfan API — the old baidu key stays deprecated rather than revived.

A search failure no longer fails the turn

A rate limit, timeout, or unreachable host used to end the whole turn. The request now walks your other credentialed search profiles and finally DuckDuckGo, recording what it tried under a top-level search_fallback key so the trace shows the downgrade instead of hiding it. The proxy travels with the request, so a fallback still works from behind one.

A missing API key is treated as the opposite kind of problem and still fails immediately for the six new providers. Five of them are China-hosted, and DuckDuckGo is unreachable on those networks — silently downgrading would turn "you did not configure a key" into an unexplained timeout somewhere else.

LiteParse joins the parsing engines

A sixth document-parsing engine, selectable in Settings → Knowledge Base alongside Text-only, MinerU, Docling, markitdown, and PyMuPDF4LLM. Lightweight, with no local model downloads. Install with pip install deeptutor[parse-liteparse].

MCP servers reconnect when a credential changes

Rotating a stored credential left the live connection untouched: the stored config still held a ${secret:...} reference, so its fingerprint was byte-identical and the reload diff concluded nothing had changed. Connections are now fingerprinted against the resolved config, so the account reconnects with the key it just set. Separately, a transport failure during a tool call — most often auth — was raised inside the SDK's own task group and left the caller waiting for the full tool timeout, reporting the one cause that had been ruled out. The connection is now watched during the call, so the real error is what the model and the user are told, in the second it took. URLs are redacted from those messages, since a server can carry its credential in a query parameter.

CodeBuddy and OrcaRouter

Two more model providers: CodeBuddy/WorkBuddy, which validates CodeBuddy SDK auth and starts a browser sign-in when needed, and OrcaRouter, a named OpenAI-compatible gateway available for both chat and embeddings.

Codex keeps its reasoning effort, and can see

A managed reasoning-effort override now persists instead of resetting between sessions, and OpenAI Codex is marked vision-capable, so images reach it rather than being dropped. Gemini 3 and 2.5 Pro, which reject reasoning_effort="none", now default to minimal — the lowest level those families accept.

Assorted

  • RAG citations read the structured payload. Citation extraction prefers ToolResult.metadata["sources"] over parsing the textual answer, which usually yielded no sources at all; parsing remains the fallback for older traces.
  • Responses tool calls no longer cross-dispatch. A missing output-item id was filled with a literal fc_0 and registered as an identity, so the next call that omitted its id resolved to the previous call's buffer and ran under its name and arguments. The placeholder is no longer an alias.
  • Mastery paths are independent of chat sessions, so opening a path no longer disturbs the session you were in.
  • Chat history settles at the bottom after loading, instead of landing mid-scroll.
  • Assistant output renders **bold** correctly when the model emits stray spacing inside the markers.
  • The obsolete Typer extra is gone from both packaging manifests.

Upgrade Notes

pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest. No schema changes, no re-index, no migration.

  • GET /api/v1/settings/provider-choices changed shape. Each entry in the search array gained requires_api_key, requires_base_url, soft_fallback, and status, and the array now also returns exa, baidu, and openrouter with status: "deprecated" — deliberately, so a client can tell a stale configuration from a misspelled name. DeepTutor's own UI filters on status; any other consumer that renders the array directly will show three deprecated options until it does the same.
  • get_providers_info() entries gained requires_base_url, which reaches deeptutor config show and the /api/v1/system diagnostics.
  • An unrecognized search provider name now falls back to DuckDuckGo rather than raising. Previously only exa, baidu, and openrouter were downgraded and any other unknown name raised. An explicit none still raises, because that means search is switched off.
  • get_available_providers() returns more than it used to. It previously instantiated each provider and swallowed the credential error, so it effectively reported only the active provider plus the two that need no key; it now reports every profile whose credentials are complete.
  • Brave is labelled Brave, not Brave Search, in CLI diagnostics — the UI already showed the shorter name.

Full Changelog: v1.5.11...v1.5.12