6.2.1
2026-09-03Added
- PIVOT-14244 Chat: An application can now serve no chat, with
atoti.ai.chat.enabled=false. No chat endpoint is registered, so/versionsstops advertising theactiveviam/ai/chatnamespace and the Atoti UI reports chat as absent. This differs from configuring no LLM, which keeps the namespace advertised and answers 404 on each call. Auto-Explain and the MCP server are unaffected. See Configure Visualize This. - 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 under the Atoti Intelligence Essentials license, and stays off without that license. The advisor is now auto-configured by Spring AI’sspring-ai-starter-tool-search-advisor, so its other settings (the index backend, the result limit, and session eviction) are configurable under the samespring.ai.chat.client.tool-search-advisorprefix. 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/chatserving/activeviam/ai/chat/rest/v1, andactiveviam/ai/autoexplainserving/activeviam/ai/autoexplain/rest/v1. Both namespaces are advertised on the/versionsendpoint. 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 Atotiauthenticationkey 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.mcpattribute, usingMcpClientConfig, to take the tools of other MCP servers, eitherStreamableHttpMcpServerConfigover HTTP orStdioMcpServerConfigas 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-sizeandatoti.ai.autoexplain.results.time-to-live. See Configure Auto-Explain. - PIVOT-14121 Atoti Python SDK: Added the
AutoExplainConfigclass, passed toAiConfig.auto_explain, 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 per-provider counts Spring AI exposes,spring.ai.openai.max-retriesandspring.ai.retry.max-attempts, wherever those are declared; leaving it out lets them stand. See Retries and timeouts. - PIVOT-14839 Chat: Added a timeout guard on the whole prompt,
atoti.ai.context.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.context.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.context.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.context.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 five
atoti.ai.contextguard properties, andatoti.ai.max-attempts, 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
PromptConfigclass, passed toAiConfig.prompt, bounding what one chat prompt may spend, and theAiConfig.max_attemptsattribute, bounding the calls to the LLM provider.
Changed
- PIVOT-14439 Chat: An application that declares its own
ToolCallingAdvisor.Builderbean now takes precedence over Atoti’s tool-search advisor. Previously Atoti’s advisor won and the application’s bean was ignored. - 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 favor of Streamable HTTP. Use
POST /mcpeverywhere: 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/ainamespace, which served both chat and Auto-Explain, is deprecated in favor of theactiveviam/ai/chatandactiveviam/ai/autoexplainnamespaces./activeviam/ai/rest/v2/chatand/activeviam/ai/rest/v2/autoexplainkeep 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-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-essentialscomponent, a warning explains that the/activeviam/aiREST service is not registered, which previously surfaced only in Atoti UI as “Unable to find the AI service on any of the servers”. Theai-extensioncomponent is reported the same way when the MCP server starter is present. - PIVOT-14292 MCP server: A license without the Atoti Intelligence 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 fromapplication.yml, an environment variable or a command-line argument. A license enablingai-extensionwithoutai-essentialsno 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: noandCache-Control: no-cache, no-transformso 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.
Security
- PIVOT-14752 Security: Upgraded Spring AI to 2.0.1 to fix CVE-2026-59279 in
org.springframework.ai:mcp-spring-webmvc. - PIVOT-14752 Security: Pinned
io.modelcontextprotocol.sdk:mcp-bomto 2.0.1 to fix the unbounded request-body denial of service inmcp-corethat the MCP server starter reaches through Spring AI. Spring AI 2.0.1 still declaresmcp-core2.0.0, so the Spring AI upgrade alone does not fix it.
6.2.0
2026-07-27Added
- PIVOT-14139 The Atoti chat now uses dynamic tool discovery: instead of sending all available tools on every request, the model searches a Lucene keyword index for matching tools and receives only those results, reducing prompt token usage and improving tool selection.
- PIVOT-14220 Cube: Added a
DimensionAPI in the Atoti Java SDK to configure which cube attributes are exposed to the AI tools. - PIVOT-14122 Atoti Python SDK: Added
Session.chatto open a chat session against a cube. - PYTHON-922 Auto-Explain: Added a Python API. See How to set up Auto-Explain in Python.
- PIVOT-14426 Atoti Python SDK: Added the
AiConfig.disclaimerattribute to configure the disclaimer shown with AI responses. See How to set up a disclaimer in Python. - PIVOT-13970 MCP server: Added OAuth 2.1 support, with an authorization-server discovery mode and a self-issued authorization-server mode. See Configure OAuth 2.1 discovery and Configure self-issued OAuth 2.1.
Changed
- PIVOT-14286 Chat: Improved the system prompt to help the LLM navigate the UI.
- 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. SeeSet up Auto-Explain in Java or in Python.
-
PIVOT-13680 Moved the cube context configuration from the
atoti.aiprefix toatoti.ai.context. Update yourapplication.yamlaccordingly. See How to configure Visualize This for the updated configuration format. - PIVOT-14227 Chat: Improved error handling in the tool-calling flow.
- 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.
Fixed
- PIVOT-007 MCP server: Fixed the credentials page failing to load when the application runs under a custom context path.