Skip to content

v0.8.2

Latest

Choose a tag to compare

@teng-lin teng-lin released this 02 Sep 22:06
· 15 commits to main since this release
c1008a4

[0.8.2] - 2026-09-02

The headline of this release is the new Android backend. The Python SDK, CLI,
MCP server, and REST server can now use NotebookLM's native mobile API as an
alternative to the Web backend. Install the android extra and select it with
backend="android", --backend android, or NOTEBOOKLM_BACKEND=android.
The Web backend remains the default. All eleven public API namespaces are
available, and Android operations no longer fall back to the Web transport. See
the installation and
configuration guides
(#2269, #2281).

Why choose it? The Android transport talks directly to NotebookLM's native gRPC
service, using short-lived OAuth bearer tokens minted on demand from a stored
master token. This avoids the Web backend's expiring browser-cookie sessions,
frontend build labels, obfuscated RPC IDs, and positional batchexecute
responses. It can therefore be a better fit for unattended CI, containers, and
long-running services, while also providing an independent route when a Web UI
change disrupts automation. The tradeoff is that a durable master token is a
more powerful credential than a cookie snapshot; use a dedicated account and
protect it carefully. Both backends rely on undocumented Google APIs and may
change without notice.

Added

  • Added chat generation status and cancellation on both backends.
    client.chat.session_status() reports the active session state, while
    client.chat.cancel() idempotently stops the selected or latest session.
    MCP users can cancel a detached chat task with chat_cancel and inspect live
    session state through chat_status (#2306).
  • Added notebooklm copy <title> as a CLI entry point for copying a notebook
    with its sources and Studio artifacts on either backend. It accepts a partial
    or active notebook ID, --use selects the new copy, and --json returns
    structured output (#2308).
  • Added ranked passage search on both backends through
    sources.search(notebook_id, query, source_ids=..., limit=...) and
    notebooklm source search. Results include the source, text, rank, and
    source-relative span, and can be filtered to selected sources
    (#2305, #2307).
  • Added Google Play Books sources on both backends. Use
    sources.list_play_books() and sources.add_play_book(),
    notebooklm source books / source add-book, or the corresponding MCP
    tools to add eligible books from your library. Availability follows
    NotebookLM's account and region restrictions (#2300, #2304).
  • Added research.discover() and notebooklm research discover on both
    backends for a single-call "Discover sources" workflow. It returns ranked
    sources and an overview immediately, while preserving a task ID for later
    import (#2299).
  • Added source and artifact workflow helpers on both backends: non-blocking URL
    batches, appending text to a source, copying sources or artifacts, fetching
    Studio customization choices, and requesting grounded next-step suggestions.
    These are also available through the corresponding CLI commands (#2291).
  • Added chat_start and chat_status MCP tools for chat generations that
    may outlast a remote connector's request timeout. Requests queue when the
    configurable concurrency limit is reached, and chat_status can poll
    multiple task IDs at once (#2286).
  • Added source-type recognition for Gemini chats, Excel, Gmail, AI Mode chats,
    Google Play Books, and general Google Drive files (#2282, #2300).

Changed

  • Release and nightly compatibility testing now runs the complete 15-cell
    matrix: Ubuntu, macOS, and Windows across Python 3.10 through 3.14. Browser,
    coverage, repository-lint, and live-E2E work remains in dedicated lanes.
  • Compatibility note: backend source type code 14 now reports
    SourceType.GOOGLE_DRIVE instead of GOOGLE_SPREADSHEET. Native Google
    Sheets continue to report SourceType.GOOGLE_SPREADSHEET through code 7
    (#2281).
  • The cookies extra now uses the maintained rookie-cookies package instead
    of rookiepy. This supports Python 3.13+ as well as extracting cookies on
    Windows for Chrome, Edge, Brave, and other Chromium-based browsers (#2162).

Fixed

  • Android gRPC PERMISSION_DENIED responses now surface as client request
    failures rather than authentication failures, matching the Web backend and
    avoiding misleading re-authentication guidance for operation-level refusals.
  • Web chat now identifies payload-free terminal streams as quota exhaustion,
    matching the Android backend's explicit RESOURCE_EXHAUSTED result for the
    same account state. CLI, MCP, and REST callers now receive a retriable
    rate-limit error instead of a non-retriable generic chat failure.
  • The public API compatibility audit now treats a previously uninspectable
    baseline signature as unknown rather than a breaking change. This prevents
    false release failures on Python 3.14 while still rejecting regressions that
    make a previously inspectable signature unavailable.
  • Credential redaction now recognizes current AQ.-prefixed Google
    authorization keys in runtime logs, exception previews, and cassette
    fixtures, alongside legacy AIza keys (#2254).
  • The RPC health canary no longer treats an account-dependent omission of the
    dedicated Cinematic row from Studio customization choices as removal of
    VideoFormat.CINEMATIC. Wire format 3 remains supported, while unknown codes
    and missing ordinary format choices still report drift (#2313).
  • Write operations no longer report success when NotebookLM actually rejected
    the request. This covers source refresh and rename, notebook and chat
    updates, sharing changes, note, label, and collection mutations, and artifact
    rename, export, and mind-map generation (#2296).
  • Android sources.get_guide() now accepts the server's valid unlabelled
    response on repeated reads. Missing or not-yet-summarized sources also match
    Web behavior for get_guide() and check_freshness() instead of raising a
    false not-found error (#2277, #2280).
  • Android file uploads now always perform one status check before timing out
    when given a positive wait timeout, so a ready or failed source is not
    misreported as an indeterminate timeout (#2294).
  • Interactive login now tolerates interrupted navigation during Google's
    sign-in flow and gives actionable fallback guidance after repeated failures.
    Browser-cookie import also handles millisecond or microsecond expiry values
    and Firefox session cookies correctly (#2260, #2252).
  • Fixed evaluation of public method annotations on Python 3.14 when a class
    method shadows a builtin type name (#2268).