Skip to main content
For details about versioning, see our Versioning Policy.

6.1.25

2026-09-29

Added

  • PIVOT-14244 Chat: An application can now serve no chat, with atoti.ai.chat.enabled=false. No chat endpoint is registered, so every call to a chat endpoint answers 404 and the Atoti UI reports chat as absent. This differs from configuring no LLM, which keeps the endpoints registered and refuses each call until an LLM is configured. Auto-Explain and the MCP Server are unaffected, and keep the activeviam/ai namespace advertised on /versions. See Configure Visualize This.
  • PIVOT-14244 Atoti Python SDK: Added the AiConfig.chat_enabled attribute to serve no chat. See Configure Visualize This.
  • PIVOT-14244 Atoti Intelligence: Chat and Auto-Explain each have their own REST namespace, so the two features version independently: activeviam/ai/chat serving /activeviam/ai/chat/rest/v1, and activeviam/ai/autoexplain serving /activeviam/ai/autoexplain/rest/v1. Both namespaces are advertised on the /versions endpoint. The payloads are unchanged from the endpoints they replace. See the migration notes.
  • PIVOT-14244 MCP Server: An Atoti Server instance can now connect out to other MCP Servers, typically the other Atoti Server instances of the same deployment, and use their tools as its own, both in chat and on its own MCP endpoint. A connection is declared under spring.ai.mcp.client.streamable-http.connections.<name>, whose new Atoti authentication key selects how it authenticates as the calling user. This requires the Atoti Intelligence Extension tier. See the migration notes.
  • PIVOT-14244 Atoti Python SDK: Added the AiConfig.mcp attribute, using McpClientConfig, to take the tools of other MCP Servers, either HttpMcpServerConfig over HTTP or StdioMcpServerConfig as a local process. See Connect to other MCP Servers in Python.
  • PIVOT-14121 Chat: The assistant can now display the interactive Auto-Explain page of an analysis it ran, on top of the summary it already returned. This requires Atoti UI 5.2.28 or higher. See Configure Auto-Explain.
  • PIVOT-14121 Chat: An Auto-Explain analysis that has already run can now be listed, displayed again, or dropped from the chat, instead of being run a second time. How many analyses stay retrievable, and for how long, are set with atoti.ai.autoexplain.results.maximum-size and atoti.ai.autoexplain.results.time-to-live. See Configure Auto-Explain.
  • PIVOT-14121 Atoti Python SDK: Added the AiConfig.auto_explain_retained_run_count and AiConfig.auto_explain_run_lifetime attributes, setting how many Auto-Explain analyses stay retrievable from the chat, and for how long. See Configure Auto-Explain.
  • PIVOT-14839 Atoti Intelligence: Added a guard on how many times the LLM provider re-sends a request, atoti.ai.max-attempts: one property for every provider, counting attempts with the first one included, defaulting to 5. Declaring it overrides the count Spring AI exposes, spring.ai.retry.max-attempts, wherever that is declared; leaving it out lets it stand. See Retries and timeouts.
  • PIVOT-14839 Chat: Added a timeout guard on the whole prompt, atoti.ai.prompt-timeout, covering every tool call and every provider retry underneath it. It defaults to 5 minutes; when it expires the prompt is abandoned, the run reports a timeout, and the partial answer is dropped from the conversation history. The deadline is now checked wherever a cancellation is, including at every round of the tool-calling loop, so a model looping over a set of tools is stopped at the next round whichever tools it chose. See Retries and timeouts.
  • PIVOT-14839 Chat: Added a guard on repeated tool calls, atoti.ai.max-consecutive-identical-tool-calls. Past 3 rounds in a row asking for the same tool with the very same arguments, the call is no longer run: the model is told it was just made and returned the same result, and does something else instead. Round after round, an identical call makes no progress, and a prompt instructing the model to retry until it works previously repeated it for as long as the model kept asking, nothing in the tool-calling loop being able to stop it. Each call is counted on its own, so a round asking for several tools loses only the one the model is stuck on and still runs the others, though it is charged one tool error for the refusal; any round without that call starts a fresh run. See Retries and timeouts.
  • PIVOT-14839 Chat: Added a guard on failing tool calls, atoti.ai.max-tool-errors. Once 5 tool calls have failed in one prompt, retries included, no further tool call is run: the model is told to stop and answer the user with what it has. Every failure counts, whether the tool ran in Atoti Server or in Atoti UI, and so does a round in which a call was refused, once for the round however many of its calls were refused. See Retries and timeouts.
  • PIVOT-14839 Chat: Added a guard on rounds that run no tool at all, atoti.ai.max-consecutive-refused-rounds. Once 3 rounds in a row have run nothing, the run ends and the user is told the question could not be answered; any round that runs a tool starts the count over. Refusing a call answers the model, which may ask for it again, and Spring AI’s tool-calling loop has no iteration cap of its own, so nothing but the prompt deadline used to stop a model that would not take the refusal. See Retries and timeouts.
  • PIVOT-14839 Chat: The atoti.ai.prompt-timeout, atoti.ai.max-retry-attempts, atoti.ai.max-consecutive-identical-tool-calls, atoti.ai.max-tool-errors, atoti.ai.max-consecutive-refused-rounds and atoti.ai.max-attempts guard properties are validated at startup, so a value no prompt could work within stops the application from starting instead of surfacing on someone’s first question.
  • PIVOT-14839 Atoti Python SDK: Added the atoti_ai.AiConfig.prompt_timeout, atoti_ai.AiConfig.max_consecutive_identical_tool_calls, atoti_ai.AiConfig.max_tool_errors, atoti_ai.AiConfig.max_consecutive_refused_rounds, atoti_ai.AiConfig.max_retry_attempts and atoti_ai.AiConfig.max_attempts attributes.
  • PIVOT-14924 Atoti Intelligence: AI server tool calls are now gated by a read/write capability, configurable with atoti.ai.tools.default-mode and atoti.ai.tools.capabilities. See Tool capabilities.
  • PIVOT-14915 Chat: Added a createCalculatedMember tool, gated behind the write capability, the new atoti.ai.tools.experimental switch, and being named in the new atoti.ai.tools.extra-tools list, all off by default. See Tool capabilities for how to enable it.
  • PIVOT-14916 Chat: Added a deleteCalculatedMember tool, gated behind the write capability, the atoti.ai.tools.experimental switch, and being named in the atoti.ai.tools.extra-tools list, all off by default. See Tool capabilities for how to enable it.
  • PIVOT-14917 Chat: Added an updateCalculatedMember tool, gated behind the write capability, the atoti.ai.tools.experimental switch, and being named in the atoti.ai.tools.extra-tools list, all off by default. See Tool capabilities for how to enable it.
  • PIVOT-14918 Chat: Added a retrieveOneCalculatedMember tool, returning the full definition of one calculated member on a cube. See Tool capabilities for how to enable it.

Changed

  • PIVOT-14547 Chat: The tools of the assistant now return their result directly, instead of wrapping it in an internal envelope that also carried an unused message for the model. The tool results streamed to Atoti UI and sent to the model are unchanged.
  • PIVOT-14839 Chat: A client that stops listening now aborts the prompt running behind it, instead of the whole prompt being run again, tools included, with nobody left to read the answer.

Deprecated

  • PIVOT-14244 MCP Server: The server-sent events transport is deprecated, following Spring AI 2.0.0, which deprecates it for removal in favour of Streamable HTTP. Use POST /mcp everywhere: it is what the starter configures by default, and what an MCP client expects. Connecting out to another MCP Server, and reporting the tools of connected servers, both require Streamable HTTP. See MCP transport.
  • PIVOT-14244 Atoti Intelligence: The activeviam/ai namespace, which served both chat and Auto-Explain, is deprecated in favour of the one namespace per feature described above. /activeviam/ai/rest/v2/chat and /activeviam/ai/rest/v2/autoexplain keep answering exactly as before, and the namespace stays advertised on /versions, so existing applications and Atoti UI need no change. Both addresses are served by the same instances, so a conversation started on one is visible from the other. They will be removed in a future major release.

Fixed

  • PIVOT-14569 Chat: A question the assistant answers with tools no longer takes several entries in the conversation memory. The memory keeps the question and the assistant’s answer, where it used to also record every tool call and tool result of that question, so the assistant now remembers about three times more of the conversation, and remembers it the same way whether dynamic tool discovery is on or off.

Security

6.1.24

2026-08-13

Added

  • PIVOT-14344 Chat: The assistant can now run a query that takes context values into account. It discovers which context values the cube accepts, along with the type of value each one takes, its description and the default the cube applies, and sets the ones it needs on the query. Those values tune that query only and are discarded once it completes. Context values holding access control data or expecting an internal payload cannot be set, and a value that does not match its declared type is rejected.
  • PIVOT-14439 Chat: Dynamic tool discovery can now be turned off with spring.ai.chat.client.tool-search-advisor.enabled=false, which sends the whole tool set to the model on every request instead. It stays enabled by default. See Configure Visualize This.
  • PIVOT-14439 Atoti Python SDK: Added the AiConfig.dynamic_tool_discovery attribute to turn dynamic tool discovery off. See Configure Visualize This.

Fixed

  • PIVOT-14402 Atoti Intelligence: A license that does not enable the AI components is now reported at startup. When an Atoti AI module is on the classpath but the license misses the ai-essentials component, a warning explains that the /activeviam/ai REST service is not registered, which previously surfaced only in Atoti UI as “Unable to find the AI service on any of the servers”. The ai-extension component is reported the same way when the MCP Server starter is present.
  • PIVOT-14292 Atoti Intelligence: A license without the Ai Extension tier now keeps the MCP Server off even when the application sets spring.ai.mcp.server.enabled=true. The tier check is applied at the highest property precedence, so it can no longer be overridden from application.yml, an environment variable or a command-line argument. A license enabling ai-extension without ai-essentials no longer starts the MCP Server either, as the Extension tier builds on Essentials.
  • PIVOT-14310 Chat: AG-UI streaming responses now carry X-Accel-Buffering: no and Cache-Control: no-cache, no-transform so that reverse proxies do not buffer or compress the event stream. A buffering proxy delivered the tool-call events to the browser only at the end of the run, so client tools always hit the server-side timeout. Client tool timeouts, stale tool results and retried chat prompts are now logged. See Monitoring.

6.1.23

2026-07-09

Added

  • PIVOT-14139 Visualize This: The chat assistant now uses the Tool Search Tool pattern for dynamic tool discovery. Instead of sending every available tool to the model at the start of a conversation, the model is offered a single synthetic search tool and retrieves only the relevant tools on demand. This reduces token consumption and improves tool-selection accuracy.
  • PIVOT-14122 Visualize This: Added a Python API for the chat assistant. Session.chat exposes the chat configuration from the Atoti Python SDK, including Chat.system_prompt to read and customize the system prompt directly from Python. See Set up Visualize This in Python.
  • PYTHON-922 Auto-Explain: Added a Python API to configure Auto-Explain from the Atoti Python SDK. Cube.auto_explain exposes the tuning constants, including drill-down depth, absolute and relative contribution thresholds, the variation threshold, entropy and member limits, and included or excluded hierarchies overall and per measure. See Set up Auto-Explain in Python.

Changed

  • PYTHON-859 Auto-Explain: Root-cause analysis (root-cause members, contribution percentages, and contribution tables) no longer requires an LLM and is always available without an AI provider configured. An LLM is now only required for the optional AI summary. When no LLM is configured, the AI summary is unavailable. See Set up Auto-Explain in Java or in Python.

Fixed

  • PIVOT-14236 Chat: Fixed filters being added without their members. Member validation now resolves members by their full name path, so the assistant reliably finds them in the cube.
  • PIVOT-14139 Visualize This: Added a dependency on the Spring AI Community tool-search-tool library (org.springaicommunity:tool-search-tool). On the Spring AI 1.1.x line, the Tool Search Tool advisor is not part of the core Spring AI release (it ships in Spring AI core from 2.0 onwards), so this community artifact is required to enable the feature.

6.1.22

2026-06-18 No changes were made since the last release.

6.1.21

2026-06-17 No changes were made since the last release.

6.1.20

2026-05-29

Added

  • PIVOT-12824 Auto-Explain: Added observability instrumentation. Auto-Explain now emits OpenTelemetry spans and metrics that cover request handling, recursive analysis and summary generation. See Monitoring.
  • PIVOT-12824 Visualize This: Added observability instrumentation. The chat assistant now emits OpenTelemetry spans and metrics that cover conversation lifecycle, prompt execution and tool invocations. See Monitoring.
  • PIVOT-12996 Auto-Explain: Exposed Auto-Explain as a Spring AI tool so it can be invoked from Visualize This as part of a chat conversation.
  • PIVOT-13680 Visualize This: AI cube descriptions now expose XMLA properties, and dimension, hierarchy and level descriptions are nested under their parent to give the model a structured view of the cube. See How to configure Visualize This.
  • PIVOT-13832 Added a customizable AI disclaimer that is returned with every AI response and displayed in the UI. A default disclaimer is provided when none is configured. See Set up a custom disclaimer in Java or in Python.
  • PIVOT-13978 MCP Server: Added an MCP credentials page in starter-ai-mcp-server that lets users mint and download tokens to connect MCP clients to the Atoti MCP Server. See MCP credentials page.
  • PIVOT-13970 MCP Server: Added self-issued OAuth 2.1 mode, where the Atoti server acts as its own authorization server. MCP clients (Claude Code, Claude Desktop, Cursor, …) drive the browser-based PKCE flow against Atoti and users sign in with their existing Atoti credentials, with no external identity provider required. The browser PKCE flow includes a user consent page that requests approval before issuing an authorization code; the consent step can be disabled via atoti.server.endpoint.mcp.oauth2.authserver.consent.enabled. See Configure self-issued OAuth 2.1.

Changed

  • Upgraded Spring AI to 1.1.6.
  • PIVOT-13970 MCP Server: The starter-ai-mcp-server now defaults the MCP transport to Streamable HTTP (spring.ai.mcp.server.protocol=STREAMABLE, served at POST /mcp) instead of the previous Server-Sent Events transport. If you rely on the SSE transport, restore it explicitly with spring.ai.mcp.server.protocol: SSE.
  • PIVOT-12494 AI license: When the license does not include the AI feature, Atoti now logs an informational message instead of throwing, so applications can start without AI features enabled.
  • PYTHON-826 Atoti Python SDK: SessionConfig now handles AI properties, allowing AI connection and chat options to be configured directly from Python.

Removed

  • PIVOT-13932 Chat: Removed the legacy Chat v1 REST API and its associated payload types. Use the v2 streamable HTTP API instead.

6.1.19

2026-04-16

Added

  • Visualize This: The chat assistant now exposes the AI’s reasoning process in real time. When the model reasons through a request before responding, the reasoning steps appear in the chat interface, giving visibility into how the assistant arrived at its answer.

Changed