v3.1.0#

Published on July 23, 2026.

Jupyter AI 3.1 brings the in-chat controls of a modern agentic editor to collaborative chats, and moves the persona system onto a live awareness channel.

Highlights#

  • JupyterLab 4.6+ support. Jupyter AI now works with JupyterLab 4.6+.

  • In-chat session controls. A new input toolbar lets you pick which persona replies, and switch the active agent’s model, permission mode, effort, and other settings without leaving the chat.

  • Live usage and cost. The chat input shows how full the active persona’s context window is, with a hover breakdown of token usage and estimated cost.

  • Reliable persona routing. The persona you select in the picker is always the one that responds. Personas no longer go quiet after a refresh or when a second person joins, and @-mentioning on every message is no longer needed.

  • Server-side notebook execution. Cells can now run on the server via a REST API with outputs streaming to every connected client.

  • New Kilo persona available over ACP.

Major bugs fixed#

  • Fixed data loss resulting from rare race conditions after opening a file while another user was connecting to it.

  • Fixed various notebook kernel and outputs issues. jupyter_server_documents>=0.3.0 no longer ships custom kernel and outputs logic by default.

  • Fixed compatibility with Voila dashboards.

API changes#

The APIs powering the new in-chat controls are all built into the Persona API in jupyter-ai-persona-manager, so any persona can advertise its models, settings, and session usage and reuse the built-in chat UI — no custom REST API required.

BasePersona gains new methods for this. A persona calls these report_* methods to publish its session state so the controls appear:

  • report_model_configuration(model) — advertise the current model, its options, and its model settings, populating the model picker.

  • report_settings_configuration(settings) — advertise general (non-model) settings such as mode or effort level.

  • report_usage(usage) — publish context-window, token, and cost usage for the live gauge and breakdown.

  • report_slash_commands(commands) — advertise the slash commands the persona supports.

And a configurable persona overrides these to react when a user changes something in that UI:

  • update_model(model_id) — switch the persona to the selected model.

  • update_model_settings(settings) — apply changed model settings (e.g. context size).

  • update_settings(settings) — apply changed general settings (e.g. mode, effort level).

The stop button is now part of the Persona API too: a persona overrides cancel_response() to interrupt its in-progress reply when the user stops it. This was previously ACP-specific and has been moved into the base API, so it works for any persona.

Note

The permission-requests API remains the only API specific to ACP agents in jupyter-ai-acp-client. This will be standardized in a future release and made available to other AI personas as well.

We have also added comprehensive Persona API documentation! See the persona-manager Python API reference.

Jupyternaut support#

Jupyternaut is supported on a best-effort basis. We have made a best effort to migrate it to Jupyter AI 3.1, but there may still be rough edges — hence the 0.1.0b0 version, which signals that more work is needed.

Jupyter AI 3.2 will generalize this: it will make it easy to build custom AI personas on the LangChain + LiteLLM stack, which should reduce the need for Jupyternaut as a distinct persona.

Warning

Jupyternaut’s documentation is currently out of date and may not reflect its behavior in 3.1. See jupyter-ai#1618 for details and progress.

Full changelog#

jupyter-server-documents#

Upgraded from v0.2.5 → v0.3.1. (See full changelog)

Enhancements made#

Bugs fixed#

Maintenance and upkeep improvements#

  • Add E2E test for “New Console for Notebook” output rendering #263 (@dlqqq)

jupyter-ai-persona-manager#

Upgraded from v0.0.11 → v0.1.2. (See full changelog)

Enhancements made#

Bugs fixed#

Maintenance and upkeep improvements#

Documentation improvements#

  • Convert awareness model field comments to attribute docstrings #89 (@dlqqq)

  • Add contributor docs + doc-marker API classification #67 (@dlqqq)

jupyter-ai-acp-client#

Upgraded from v0.1.5 → v0.2.0. (See full changelog)

Enhancements made#

Bugs fixed#

Maintenance and upkeep improvements#

jupyter-ai-tools#

Upgraded from v0.5.2 → v0.6.1. (See full changelog)

Merged PRs#

jupyter-ai-jupyternaut#

Upgraded from v0.0.11 → v0.1.0b0. (See full changelog)

Note

This is an optional package, installed only with the corresponding jupyter-ai extra.

Enhancements made#

Bugs fixed#

Maintenance and upkeep improvements#

  • Remove Dependabot lockfile workflow #92 (@dlqqq)

  • Gate lockfile workflow on PR author, not github.actor #88 (@dlqqq)

  • Fix Dependabot lockfile workflow: gate on env, not secrets context #86 (@dlqqq)

  • Auto-regenerate yarn.lock on Dependabot PRs #84 (@dlqqq)

  • Make some dependencies optional #56 (@jtpio, @dlqqq, @srdas)

Other merged PRs#

  • Bump the npm-security-updates group across 1 directory with 20 updates #87 (@dlqqq)

  • Bump fast-uri from 3.1.3 to 3.1.4 in /ui-tests #85 (@dlqqq)

  • Make Dependabot config security-only #83 (@dlqqq)

  • Group Dependabot npm updates into a single PR #81 (@dlqqq)

Unchanged subpackages#

The following subpackages did not advance their version floor in this release:

  • jupyter-ai-chat-commands (v0.0.4)

  • jupyter-ai-litellm (v0.0.2)

  • jupyter-ai-magic-commands (v0.0.3)

  • jupyter-ai-router (v0.0.5)

  • jupyter-server-mcp (v0.2.1)

  • jupyterlab-commands-toolkit (v0.1.6)

  • jupyterlab-notebook-awareness (v0.2.0)