2026-09-30
Added
atoti-sql-bridgePIVOT-13234.atoti.BasicAuthenticationConfig.credentials_cachePIVOT-14494.atoti_jdbc.UserContentStorageConfig.database_locksPYTHON-779.atoti_directquery_databricks.ConnectionConfig.array_aggregation_precisionPYTHON-985.atoti_directquery_snowflake.ConnectionConfig.redacted_properties,atoti_directquery_databricks.ConnectionConfig.redacted_properties,atoti_directquery_jdbc.ConnectionConfig.redacted_properties,atoti_directquery_clickhouse.ConnectionConfig.redacted_properties,atoti_directquery_mssql.ConnectionConfig.redacted_properties,atoti_directquery_redshift.ConnectionConfig.redacted_properties, andatoti_directquery_synapse.ConnectionConfig.redacted_propertiesPYTHON-984.
Changed
- Upgraded Atoti UI to 5.2.28.
atoti.lookup()whose mapping targets a level is created on an already created cube without restarting it, unless the looked-up column itself feeds a level PYTHON-971.
Deprecated
atoti_directquery_snowflake.ConnectionConfig.password,atoti_directquery_databricks.ConnectionConfig.password,atoti_directquery_jdbc.ConnectionConfig.password,atoti_directquery_clickhouse.ConnectionConfig.password,atoti_directquery_mssql.ConnectionConfig.password,atoti_directquery_redshift.ConnectionConfig.password, andatoti_directquery_synapse.ConnectionConfig.passwordPYTHON-984. Useatoti_directquery_snowflake.ConnectionConfig.redacted_propertiesand its counterpart on each other connector instead.atoti_directquery_jdbc.ConnectionConfig.password_parameter_namePYTHON-984. Useatoti_directquery_jdbc.ConnectionConfig.redacted_propertiesinstead.
Fixed
atoti.agg.sum_product()rejected array columns of typefloat[],long[], andint[]withTypeError: Only array columns of type `double[]` are supportedPYTHON-985.atoti.Session.data_model_transaction()failed when a change it held could not be applied to the running cube, for instance withCannot change the dictionary of an existing levelPYTHON-990.atoti.Session.logs_pathnamed a file that was never written when theobservabilityplugin was installed PYTHON-993. The session logged to the standard output only, whether the file’s location came fromatoti.LoggingConfig.destinationor from the default one under$ATOTI_HOME.atoti.Table.load()hung forever when a data model change, such as assigning a measure withatoti.Cube.measuresfrom another thread, was requested while a load was running PYTHON-991. The data model change waited for the load to end while the load waited for the change to open, and every later load or request reading the data model then hung too, until the session was restarted.- A data model change, such as assigning a measure with
atoti.Cube.measures, failed withIllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING]when another client of the same session changed the data model at the same time PIVOT-15126. Every connected client is notified that the data model may have changed, and a single unreachable client failed the change as well, leaving the clients not yet notified unaware of it. - Changing several things at once, such as updating
atoti.security.OidcSecurity.role_mappingwith more than one entry, raisedTypeError: Invalid AST Nodewhengraphql-core3.3 was installed PIVOT-15203.
Security
- The
repr()of the configs and authentication classes holding a secret, such asatoti.OidcConfigoratoti_ai_openai.ConnectionConfig, shows<redacted>in place of the secret PYTHON-984. The attribute itself still holds the secret unchanged.
2026-09-03
Added
atoti.Level.descriptionPYTHON-951.atoti.Orderingandatoti.StringComparisonPYTHON-959.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 could 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 failed PIVOT-14805.
The page was also only reachable at
/mcp-credentials/index.html, not at/mcp-credentials. atoti.KerberosConfig.username_case_conversionandatoti.LdapConfig.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".- A data cube could be missing from the cluster it had joined, leaving the query cube without any of its measures PIVOT-14932. A query cube under load could drop its answer to a join request instead of sending it, and nothing sent that answer again. After ten unanswered attempts the data cube gave up and formed a cluster of its own, while the query cube had already counted it in as a member. Several cubes joining at once, typically when the cluster restarts, made it more likely.
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, leaveatoti.SessionConfig.aiasNone: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 than the wrapper UDF, so nothing replaces it.