2026-09-04
Added
atoti.Level.descriptionPYTHON-951.atoti.Orderingandatoti.StringComparisonPYTHON-959. Setatoti.StringComparison.caseto"insensitive"to compare letters regardless of their case.atoti.Cube.restrictionsaccepts conditions returned byatoti.Hierarchy.isin()PYTHON-895.atoti.agg.max(provider_compatibility)andatoti.agg.min(provider_compatibility)PYTHON-778.atoti_ai.AiConfig.mcpPIVOT-14244.atoti_ai.AiConfig.chat_enabledPIVOT-14244.atoti_ai.AiConfig.dynamic_tool_discoveryPIVOT-14439.atoti_ai.AiConfig.auto_explainPIVOT-14121.atoti_ai.AiConfig.promptandatoti_ai.AiConfig.max_attemptsPIVOT-14839.
Changed
- Upgraded Atoti UI to 5.2.27.
atoti.KerberosConfig.username_case_conversionandatoti.LdapConfig.username_case_conversionare applied once, at authentication time, and the resulting username is used everywhere:individual_roleslookup,atoti.Session.user, etc. PYTHON-974. With Kerberos, the domain is also dropped:alex@EXAMPLE.COMandalexare the same user, namedalex, so individual roles must be assigned to the short name.
Deprecated
atoti.Level.order,CustomOrder,LexicographicalOrder, andNaturalOrderPYTHON-959. Useatoti.Level.orderinginstead.
Fixed
- A data load whose transaction failed at commit time raised a
NullPointerExceptioninstead of a descriptive error PYTHON-778. - Joining a distributed cluster rebuilt the cube, re-feeding all aggregated data and re-issuing every aggregation query against the database, which can be very expensive in a DirectQuery setup PIVOT-14807.
- Every request to a session secured with Kerberos failed with
java.lang.ClassNotFoundException: org.springframework.security.crypto.codec.Base64PIVOT-14797. - A role restricted on a slicing hierarchy holding a single level saw an empty cube instead of the restricted members PIVOT-14665.
This applies to both
atoti.Cube.restrictionsandatoti.tables.Tables.restrictions. - Generating a token on the MCP credentials page no longer fails PIVOT-14805.
The page is also reachable again directly at
/mcp-credentials, without needing/mcp-credentials/index.html. username_case_conversionapplied to users of other authentication providers PYTHON-974. Abasic_authenticationuser registered in lowercase was denied itsindividual_roles(HTTP403) when the SSO config used"upper".
2026-07-27
The changes below are relative to Atoti Python SDK
0.9.16.
Added
atoti-limitsLIM-2228.atoti.Session.chatPIVOT-14122.atoti.Cube.auto_explainPYTHON-824.atoti_ai.AiConfig.disclaimerPIVOT-14426.atoti.SessionConfig.base_pathPYTHON-917.atoti.Cube.dimensionsandDimensionPIVOT-14220. Useatoti.Dimension.descriptionto provide more context to theChat.atoti.aggregate_provider.AggregateProviders.recommenderPYTHON-668.- The history of executed queries is recorded when the
observability pluginplugin is enabled andatoti.SessionConfig.user_content_storageis notNonePYTHON-876. It is accessible in Admin UI (f"{session.url}/admin")‘s Query history tab.
Changed
-
AiConfig,atoti_ai_amazon_bedrock.ConnectionConfig,atoti_ai_amazon_bedrock.ChatConfig,atoti_ai_openai.ConnectionConfig, andatoti_ai_openai.ChatConfighave been stabilized: -
atoti.Table.load(error_handling)defaults to"fail"instead of"log"PIVOT-9937. To restore the previous behavior: -
atoti.NaturalOrdercompares digit sequences in strings by their numeric value instead of character by character PYTHON-908.StringorObjectlevels default to the newatoti.LexicographicalOrder, which preserves the previous ordering. -
atoti-storage-aws’s commitment policy changed to REQUIRE_ENCRYPT_REQUIRE_DECRYPT PIVOT-13185. Existing data on S3 encrypted with older AWS encryption clients (v1 and v2) must be re-encrypted beforeloadingit. -
atoti.Session.startraises aRuntimeErrorwhenatoti.SessionConfig.aiis passed but the started server exposes no AI service PIVOT-14402. This is most often a license missing theai-essentialscomponent, which the error message calls out. Such a session previously started successfully withatoti.Session.chatandatoti.Cube.auto_explainsilently set toNone. To start a session without AI, do not passai:When theaiplugin is enabled butaiis not passed, aRuntimeWarningis emitted instead and the session starts: enabling the plugin alone is not a request for AI.
Dependencies
- Upgraded Atoti Server to 6.2.0.
- Upgraded Atoti UI to 5.2.26.
- Bumped minimum required Python version to 3.12 as per NEP 29 PYTHON-810.
-
Bumped
atoti’s minimum required Pandas version to 3.0.3 PYTHON-740.DataFrames returned byatoti.Table.query(),atoti.Table.head(),atoti.Session.query_mdx(), andatoti.Cube.query()usedatetime64[us](microsecond precision) instead ofdatetime64[ns](nanosecond precision).pyarrow.large_string()columns are supported byatoti.Table.load().
-
Bumped
atoti-jupyter’s minimum required JupyterLab version to 4.6.0. -
Migrated
atoti.Client.http_clientfrom httpx to httpx2 PYTHON-903. -
The
atoti-parquetplugin is not installed by default anymore. Add its extra to importParquetLoad:
Deprecated
atoti.Hierarchy.dimension_defaultPIVOT-14220. Useatoti.Dimension.default_hierarchyinstead:
Removed
- Support for connecting to Atoti servers older than 6.0.0-M1.
-
"Object[]"data type. Use"Object"or the other strongly typed array data types instead. -
atoti.QueryCube.unload_members_from_data_cube()PIVOT-14028. -
atoti_ai_openai.ChatConfig.completions_path: -
atoti_ai_openai.ChatConfig.http_headers. Useatoti_ai_openai.ConnectionConfig.custom_headersinstead: -
atoti_ai_openai.ChatConfig.retry_max_attemptsand the otherretry_*attributes. Useatoti_ai_openai.ConnectionConfig.max_retriesandatoti_ai_openai.ConnectionConfig.timeoutinstead: -
atoti_ai_openai.ConnectionConfig.project_id. -
atoti_directquery_snowflake.ConnectionConfig.array_agg_wrapper_function_namePIVOT-10231. Snowflake’s built-inARRAY_AGGfunction is faster, so the wrapper UDF is no longer needed.