Skip to content

Release Notes

1.27.1

Python SDK


Version 1.27.1 of the relationalai Python package is now available!

To upgrade, activate your virtual environment and run the following command:

pip install --upgrade relationalai

New Features and Enhancements

  • Running a query or deploying a model that uses an undirected graph is now faster. PyRel builds the graph as part of that work, and before this release that build slowed down sharply as the number of edges grew. In one case, an undirected Graph with 200,000 edges took about 41 seconds to build. That same graph now takes about 1 second.

Dependency Updates

  • PyRel now requires DuckDB 1.5.0 or newer. DuckDB is installed automatically with PyRel, so most users don't need to do anything. If you have pinned DuckDB to an older 1.4.x version, allow 1.5.0 or newer before you install or upgrade PyRel.

1.27.0

Python SDK


Version 1.27.0 of the relationalai Python package is now available!

To upgrade, activate your virtual environment and run the following command:

pip install --upgrade relationalai

New Features and Enhancements

  • When a concept or relationship is built directly from your source Snowflake tables — without any additional computation in PyRel — model deployment now creates it as a SQL view instead of a table, which avoids unnecessary storage and refresh work. If you need it stored as a table, set type: table for that output under deployment.outputs.overrides. See Choose how outputs are materialized for details.

  • Redeploying a model now keeps existing deployed tables' data and Snowflake grants where possible, instead of dropping and recreating the tables. Views and dynamic tables are still recreated, but their grants are now preserved too. Some changes, such as changing an output column's type, can still require recreating a table.

  • Model deployment now tags each schema it creates as RAI-managed, which supports safer cleanup later. If your deployment role can't apply that tag, deployment now stops with a clear error telling you to grant APPLY on the tag (or APPLY TAG on the account) instead of leaving an untagged schema behind.

  • Temporary tables created by PyRel when deploying a model now live in the deployment's _META schema instead of appearing next to your model outputs, keeping the target schema limited to your model's objects.

Bug Fixes

  • common.hash() now produces different values than in earlier releases. This matters mainly when a hash is saved rather than computed on the fly — for example, when a deployed model materializes a property or relationship whose value comes from a hash, or when you export query results that include a hash to a table. Before upgrading, search your model code for common.hash( and plan to recompute any stored hashes that must stay stable.

  • In a deployed model, common.parse_uuid() now works consistently. A UUID that you parse and then compare against an entity in your model now matches instead of silently returning no rows, and common.uuid_to_string() applied to a parsed UUID now returns a plain 32-character value instead of dashed UUID text. Pass UUIDs in the standard dashed form, and update anything that expected the dashed output.

  • A query that uses one select() inside another expression now returns the correct rows. Previously, a nested selection could drop rows or ignore its own filter.

  • Selecting a constant value in a query no longer fails with a GROUP BY term out of range error when combined with other properties and relationships, and now returns the expected rows.

  • Definitions that negate a union() with not_() or supply fallback values with | no longer fail to compile when deploying a model.

  • If you force two deployment outputs that depend on each other onto different reasoners, deployment now fails with a clear ConflictingForcedReasoners error that names the outputs and how to fix them, instead of a raw internal error. You set an output's reasoner with deployment.outputs.overrides.

  • When rai models list can't read the model-management schema because of your role's privileges, the error now recommends the correct GRANT USAGE statements instead of an APPLY ON TAG grant that didn't fix the problem.

  • After running the rai models teardown CLI command with the --force option, the follow-up message no longer points you to unnecessary or unavailable commands.

  • Calling a concept with keyword arguments, such as Movie(title="The Matrix") instead of Movie.lookup(title="The Matrix"), now raises a clear Invalid usage error right away instead of failing at query time with a confusing AssertionError.

  • Deploying a concept whose identity includes another concept that has a composite (multi-field) identity key no longer drops part of that key. Previously the deploy could fail with a NULL result in a non-nullable column error, or store incomplete identities.

  • When you create a decision variable with Problem.solve_for() for a concept that has no identify_by key, querying that variable's solved values now returns the matching rows instead of nothing.

2026.8.9-8d1935f-6

Native App


Version 2026.8.9-8d1935f-6 of the RelationalAI Native App is now available!

Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.

Bug Fixes

  • Fixed an issue where expired OAuth tokens could cause reasoner operations to fail permanently instead of retrying. Snowflake recently began reporting one class of expired token with a different error code that was previously unrecognized, leaving affected operations stuck. Both error codes are now handled, and operations retry and recover automatically.

1.26.2

Python SDK


Version 1.26.2 of the relationalai Python package is now available!

To upgrade, activate your virtual environment and run the following command:

pip install --upgrade relationalai

New Features and Enhancements

  • The new rai usage command reports your account's RAI consumption and estimated cost, broken down by compute pool, with date filters and table, JSON, CSV, or HTML output. Cost figures exclude storage and are estimates rather than invoices, and totals are lower bounds when PyRel can't identify a compute pool's machine family.

    For example, write a July 2026 usage report to a CSV file:

    rai usage --start 2026-07-01 --end 2026-07-31 --format csv --output-file usage.csv
    

    :::note The Snowflake role for your active profile needs access to SNOWFLAKE.ACCOUNT_USAGE in order to run the rai usage command. :::

  • Model deployment now builds large models faster by removing redundant work. In one model, the initial build was about 2.4× faster. Savings depend on your model and the size of your Snowflake warehouse.

Bug Fixes

  • A query that computes a value (such as a sum or a true/false flag) in one select() step and selects that same value again in a later select() now returns the correct rows. Previously, it could return too few rows or fail with an error.

  • In a deployed model, computing an aggregate value (such as a sum) and then filtering on it now returns the correct result. Previously, if the definition used a union to combine several alternatives, the value could be inflated due to over-counting.

  • If you compute an aggregate with .per() and use it only to filter rows without also selecting it, the query now returns the expected rows. Previously, it could return no rows at all.

  • Some not_() checks in a deployed model are now much faster. In one case, a query that ran for over 13 minutes now finishes in about 13 seconds.

  • PyRel now raises a clear UnsupportedOperation error when Louvain, Infomap, and label propagation algorithms are used in a deployed model. These algorithms are currently not supported.

  • Grouping an aggregate by a key that has no values now raises a clear GroupKeyHasNoDomain error instead of unexpectedly combining your per-group results into one overall total.

  • Deploying a model that uses quoted, case-sensitive Snowflake names no longer fails with an "Object does not exist or not authorized" error.

  • When more than one Snowpark session is active, PyRel now surfaces Snowflake's multiple-active-sessions error (1409) instead of quietly opening a new connection, so you can choose which session to use.

  • If you pass your own Snowpark session to create_config(), deployment now uses that session when it switches Snowflake roles, instead of creating a separate one.

  • Explicitly setting reasoners.logic.incremental_maintenance to "off" in Python now takes effect. Previously, PyRel could reset it to "auto", which turned incremental maintenance on.

  • Some match (|) expressions that used to fail with an is unground error (for example, 'pet' is unground) now work correctly.

  • Fixed a bug that could cause concept tables in a deployed model to be updated on the wrong schedule.

  • Fixed an edge case where a query could mix up similarly named properties on different kinds of entities.

  • Fixed an edge case where a deployed model could apply a definition even when its condition wasn't met.

  • Fixed an edge case where matching an entity by its identifying property could return a match even when no such entity existed.

  • Fixed an edge case where an equality between two values in a query condition could incorrectly return no rows.

2026.8.9-8d1935f

Native App


Version 2026.8.9-8d1935f of the RelationalAI Native App is now available!

Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.

New Features and Enhancements

  • Deploying and refreshing a model is now faster. Each deploy and refresh reloads the tables your model produces, and that step now runs as a few batched operations instead of repeating the same work once per table. The improvement grows with the number of tables a model produces, so larger models benefit most while small models see little change.

Bug Fixes

  • Fixed some errors that could occur with incremental maintenance turned on, a preview feature (off by default) that reuses earlier work when you rerun a query after your data changes. In particular, certain aggregations could cause queries to fail with an internal error. They now work as expected.