<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>RelationalAI Release Notes</title>
    <link>https://docs.relational.ai/release-notes</link>
    <description>Latest updates for RelationalAI Release Notes.</description>
    <atom:link href="https://docs.relational.ai/release-notes/rss/all.xml" rel="self" type="application/rss+xml" />
    <lastBuildDate>Wed, 14 Oct 2026 22:00:00 GMT</lastBuildDate>
    <item>
      <title>2026.10.10-d139e47</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.10.10-d139e47</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.10.10-d139e47</guid>
      <pubDate>Wed, 14 Oct 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Fixes several predictive reasoner bugs.</description>
      <content:encoded><![CDATA[<p>Version 2026.10.10-d139e47 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li><p><a href="/build/guides/reasoning/predictive">Predictive reasoner</a> jobs now fail with a clear error before running if a key column isn&#39;t an integer, float, or text type. Previously, these jobs couldn&#39;t match rows across tables on that key and silently returned incorrect results. Re-check results from any jobs that used such a key column.</p>
</li>
<li><p><a href="/build/guides/reasoning/predictive">Predictive reasoner</a> tasks on a single table now check that the validation and test tables contain every feature column the task declares before training starts. A missing column now produces a clear error up front instead of a failure later in the job.</p>
</li>
<li><p>The <a href="/build/guides/reasoning/predictive">predictive reasoner</a> no longer crashes when an identifier value looks like a number with a very large exponent, such as a hexadecimal ID that starts with <code>3e626380</code>.</p>
</li>
<li><p>The <a href="/build/guides/reasoning/predictive">predictive reasoner</a> no longer warns about unsupported data types for text identifier and foreign-key columns. Non-key columns with unsupported data types still produce a warning.</p>
</li>
<li><p>Fixed an issue where automatic cleanup of internal model storage could stop working, causing new model storage creation to fail if the storage quota was reached.</p>
</li>
<li><p>Referencing a <a href="/manage/data/manage#what-a-data-stream-is">data stream</a> that doesn&#39;t exist now consistently returns a user error with the message <code>The provided data streams do not exist.</code> Previously, some operations didn&#39;t report this condition as a user error.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.35.2</title>
      <link>https://docs.relational.ai/release-notes/python/1.35.2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.35.2</guid>
      <pubDate>Fri, 09 Oct 2026 16:07:14 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Earlier deployment checks and predictive date and time checks.</description>
      <content:encoded><![CDATA[<p>Version 1.35.2 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed indefinite waits during <a href="/build/guides/modeling/deploy-a-model#troubleshoot">model deployment</a> failure cleanup. <a href="/api/cli/v1.35/models/deploy"><code>rai models deploy</code></a> now waits at most 180 seconds for background work. If you see <code>Background Work Abandoned</code>, Snowflake SQL statements may still be running, so wait for PyRel&#39;s temporary deployment lock to expire before retrying. Model deployment is in Public Preview.</p>
</li>
<li><p>Added permission checks for Logic Reasoner sources before <a href="/build/guides/modeling/deploy-a-model#troubleshoot">model deployment</a> changes its outputs, with related errors shown together. The <a href="/build/guides/configuration/model#set-the-deployment-target">deployment role</a> needs <code>SELECT</code> on each source and <code>USAGE</code> on its database and schema without relying on other active roles. Dry runs skip these checks, and changes made before the checks may remain after a failure.</p>
</li>
<li><p>Fixed a Snowflake refresh error when grouping aggregate results by a newly created entity with multiple <a href="/build/guides/modeling/declare-concepts#use-an-identity-scheme">identifying properties</a>, including a property with a default value. <a href="/build/guides/modeling/deploy-a-model#deploy-from-the-cli">Redeploy existing models</a> with PyRel 1.35.2 to apply the fix.</p>
</li>
<li><p>Fixed numeric conversion errors in supported <a href="/build/guides/modeling/deploy-a-model#what-deploying-a-model-does">deployed model</a> joins involving properties referencing multiple concepts. Properties holding one value and accepting multiple concept types, <a href="/api/python/v1.35/semantics/frontend/core/anyentity"><code>AnyEntity</code></a>, or <a href="/api/python/v1.35/semantics/frontend/core/any"><code>Any</code></a> now store encoded identifiers instead of identifying property values, so review SQL consumers before <a href="/build/guides/modeling/deploy-a-model#deploy-from-the-cli">redeploying with PyRel 1.35.2</a>. Some unsupported identity comparisons can now stop deployment with an explicit error.</p>
</li>
<li><p>Fixed incorrect reads and joins in <a href="/build/guides/modeling/deploy-a-model#what-deploying-a-model-does">deployed models</a> whose <a href="/build/guides/modeling/declare-concepts#use-an-identity-scheme">identifying properties</a> refer to other entities, with nested key values now stored in separate columns. Redeployment can replace model outputs and rename columns, so review SQL before <a href="/build/guides/modeling/deploy-a-model#deploy-from-the-cli">redeploying with PyRel 1.35.2</a> and update affected queries. Conflicting generated column names and some unsupported identity schemes now cause deployment errors, while distinct entities with composite identities can still look identical in query results.</p>
</li>
<li><p>Fixed refresh tasks choosing serverless compute instead of the <a href="/build/guides/configuration/files#use-profiles-to-manage-multiple-configurations">active Snowflake warehouse</a> for model deployments already using <code>compiler.optimization=&quot;aggressive&quot;</code>. <a href="/build/guides/modeling/deploy-a-model#deploy-from-the-cli">Redeploy with PyRel 1.35.2</a> to apply the fix. Without an active warehouse, serverless compute remains the fallback, and the deployment role still needs task permissions.</p>
</li>
<li><p>Shortened <a href="/build/guides/reasoning/graph">graph reasoning</a> result names in diagnostics and <a href="/build/guides/modeling/deploy-a-model#what-deploying-a-model-does">deployed model</a> outputs without changing calculated values. When <a href="/build/guides/modeling/deploy-a-model#deploy-from-the-cli">redeploying with PyRel 1.35.2</a>, check for renamed columns and update affected SQL queries. Graph reasoning is in Public Preview.</p>
</li>
<li><p><a href="/api/cli/v1.35/models/list"><code>rai models list</code></a> now warns and skips unrelated optional Snowflake shared databases that are no longer available, so listings may be incomplete. Unavailable databases still stop the listing when required or when a complete list of models is requested. <a href="/build/guides/modeling/deploy-a-model#select-the-model-you-want-to-manage">Listing shared models</a> is part of Public Preview model deployment.</p>
</li>
<li><p>In Graph Neural Network (GNN) <a href="/build/guides/reasoning/predictive">predictive reasoning</a>, <a href="/api/python/v1.35/semantics/reasoners/predictive/propertytransformer_class"><code>PropertyTransformer</code></a> now raises <code>ValueError</code> before export for properties explicitly named in <code>datetime=</code> or <code>time_col=</code> with known incompatible types. Cast date sources to <code>DATE</code> or <code>TIMESTAMP</code> and reload, or remove non-date properties from both settings and <a href="/build/guides/reasoning/predictive/encode-features#which-semantic-types-are-supported">reclassify or drop them</a>. This check does not validate date strings or unknown property types. Predictive reasoning is in Public Preview.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.35.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.35.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.35.1</guid>
      <pubDate>Thu, 08 Oct 2026 09:58:21 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Corrected rule results, clearer shared-model source.</description>
      <content:encoded><![CDATA[<p>Version 1.35.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a Snowflake query error in <a href="/build/guides/modeling/deploy-a-model">model deployment</a> when using <a href="/api/python/v1.35/semantics/frontend/base/model_class#method-not_"><code>Model.not_</code></a> to filter relationships while returning related data. For example, queries can now list people who have no dogs and return their pets, including people who have no pets. Model deployment remains in Public Preview.</p>
</li>
<li><p>In deployed models, rules involving concepts <a href="/build/guides/modeling/declare-concepts#use-an-identity-scheme">identified by multiple fields</a> now assign derived properties to the correct entities instead of other entities referenced by the rule. Conditions that read a property now exclude entities where that property is missing.</p>
</li>
<li><p><a href="/api/cli/v1.35/models/pull"><code>rai models pull</code></a> now generates more readable <a href="/build/guides/modeling/deploy-a-model#collaborate-through-a-shared-model"><code>shared_model.py</code></a> code.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.10.4-c79bac1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.10.4-c79bac1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.10.4-c79bac1</guid>
      <pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Fixes empty Snowflake table exports and makes predictive reasoner forecasts repeatable.</description>
      <content:encoded><![CDATA[<p>Version 2026.10.4-c79bac1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li><p><a href="/build/guides/modeling/query-a-model#export-results-to-snowflake-tables-with-into-and-exec">Exporting query results to a Snowflake table</a> no longer silently produces an empty table when your query uses an outer join with an empty input. Re-run any affected exports to get the correct rows.</p>
</li>
<li><p><a href="/build/guides/reasoning/predictive">Predictive reasoner</a> jobs now produce the same results each time you run them on the same data. Re-run any forecasts you made before this release.</p>
</li>
<li><p><a href="/build/guides/reasoning/predictive">Predictive reasoner</a> forecasting now warns you when your context and test tables mix timestamp types instead of silently shifting your dates. Give both tables the same <a href="https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-tz">timestamp type</a> and re-check any forecasts that mixed them.</p>
</li>
<li><p>Unused storage is now cleaned up on accounts with internal model storage. Previously, this storage wasn&#39;t removed, which caused storage usage to grow.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.35.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.35.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.35.0</guid>
      <pubDate>Tue, 06 Oct 2026 18:08:36 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Deploy multiple PyRel models in one Snowflake schema with custom object names.</description>
      <content:encoded><![CDATA[<p>Version 1.35.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p><a href="/build/guides/modeling/deploy-a-model">Model deployment</a> now lets you deploy multiple PyRel models to one Snowflake schema, using a distinct prefix or suffix to keep each model&#39;s objects separate. Values are uppercased and no separator is added. Choose unique names because conflicts may go undetected if deployments run at the same time or the deployment role cannot see every model. Model deployment remains in Public Preview.</p>
</li>
<li><p><a href="/build/guides/reasoning/predictive">Predictive Reasoning</a> now exports large inputs as one file, fixing a missing-file error when its service expected one file but received several. For other CSV exports, use <code>partition_csv_exports=False</code> only when the receiving workflow requires one file. Other exports remain split by default. Predictive Reasoning is in Public Preview.</p>
</li>
<li><p><a href="/build/guides/modeling/deploy-a-model">Model deployment</a> now supports rule-based outputs whose identity includes multiple properties across related entities. Learn about identity schemes in <a href="/build/guides/modeling/declare-concepts">how to declare concepts</a>.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>PyRel <a href="/build/guides/modeling/query-a-model">model queries</a> now handle more cases involving recursion, negation, and aggregates correctly.</p>
</li>
<li><p>For deployed outputs that use <code>datetime.now()</code>, PyRel now uses the refresh start time instead of changing the value on each query. Ad hoc queries still use the current time. On Snowflake, if an output uses <code>datetime.now()</code>, PyRel always deploys it as a regular table, even if you configured it as a dynamic table.</p>
</li>
<li><p>A <a href="/build/guides/modeling/query-a-model">PyRel query</a> that selects multiple fields from related entities and uses one field as a fallback when another is missing now runs successfully during model deployment.</p>
</li>
<li><p>When you redeploy a model to Snowflake after changing its output columns, model deployment can now recover from some schema changes Snowflake cannot apply directly. The output table is replaced and its grants are preserved. Rows are repopulated during the next refresh.</p>
</li>
<li><p>During <a href="/build/guides/modeling/deploy-a-model">model deployment</a>, PyRel no longer raises a <code>Shadowed variable</code> error.</p>
</li>
<li><p>In <a href="/build/guides/configuration/programmatic#override-file-based-configuration-with-programmatic-config">programmatic configuration</a>, values you pass to <a href="/api/python/v1.35/config/config/create_config"><code>create_config()</code></a> for <code>deployment.schema</code> or <code>deployment.meta_schema</code> now take precedence over values in <code>raiconfig.yaml</code>. Omit either setting from <code>create_config()</code> to use its value from <code>raiconfig.yaml</code>.</p>
</li>
<li><p><a href="/build/guides/modeling/deploy-a-model">Model deployment</a> now checks required privileges during deployment. Grant those privileges to the configured deployment role so a missing grant does not cause a later refresh to fail.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.34.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.34.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.34.0</guid>
      <pubDate>Thu, 01 Oct 2026 19:19:09 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Standalone properties now deploy as their own Snowflake tables, plus model deployment reliability fixes.</description>
      <content:encoded><![CDATA[<p>Version 1.34.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>When you <a href="/build/guides/modeling/deploy-a-model">deploy a model</a> to Snowflake, a standalone property now deploys as its own table instead of a column on the concept&#39;s table. A standalone property is one you write as <code>brand = model.Property(...)</code> rather than <a href="/build/guides/modeling/declare-relationships-and-properties">attaching it to a concept</a> with <code>Car.brand = model.Property(...)</code>. If your deployed model has downstream consumers, you will need to update any that expect properties as columns.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Deploying a model no longer overwrites or deletes another model&#39;s objects when both models deploy into the same Snowflake schema with the same <a href="/build/guides/modeling/deploy-a-model#deploy-without-create-tag"><code>deployment.managed_tag</code></a>.</p>
</li>
<li><p>Some models that previously failed to deploy to Snowflake with <code>SQL compilation error: Unsupported subquery type cannot be evaluated</code> now deploy successfully.</p>
</li>
<li><p>When you deploy a model to Snowflake, the <code>geometric_mean</code> <a href="/build/guides/reasoning/rules-based/aggregate-and-group-data">aggregate</a> over data that can include negative numbers no longer fails and now returns <code>NaN</code> for those cases.</p>
</li>
<li><p>An aggregate grouped per entity with <a href="/build/guides/reasoning/rules-based/aggregate-and-group-data#group-results-with-per"><code>.per()</code></a> in a model deployed to Snowflake now returns each entity&#39;s own value instead of a whole-table total or a count that is too high. A few cases that cannot be computed correctly now raise a clear <code>LookupBoundAfterAggregate</code> error instead of a silent wrong number.</p>
</li>
<li><p>Calling <a href="/build/guides/modeling/derive-facts-with-logic"><code>as_bool()</code></a> on a <code>where</code> clause with several conditions now returns one <code>True</code> or <code>False</code> per row instead of duplicated rows or missing <code>False</code> rows.</p>
</li>
<li><p>Improved performance for deploying a model to Snowflake when it contains a concept whose properties are built up across many definitions.</p>
</li>
<li><p>If you deploy a model from a Snowflake notebook using <code>get_active_session()</code>, it no longer fails with a false <code>Deploy lease ... was taken over by another deploy</code> error.</p>
</li>
<li><p>After a branch creation fails, you can now tear down the incomplete <a href="/build/guides/modeling/deploy-a-model#branch-collaborate-and-merge">branch</a> with the <a href="/build/guides/modeling/deploy-a-model#tear-down-a-model-or-branch"><code>rai models teardown --force</code></a> command and retry.</p>
</li>
<li><p>If a <a href="/build/guides/reasoning/prescriptive"><code>Problem</code></a> reads another <code>Problem</code>&#39;s results before that Problem has been solved, solving or deploying it now raises a clear error instead of returning a misleading <code>OPTIMAL</code> result. <a href="/build/guides/reasoning/prescriptive/decision-problems/solve">Solve or configure</a> the <code>Problem</code> it reads from first.</p>
</li>
<li><p>If you query a model inside a Snowflake stored procedure, it no longer fails at startup with <code>ImportError: cannot import name &#39;_ExtendedAttributes&#39;</code>.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.9.26-0821a55</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.9.26-0821a55</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.9.26-0821a55</guid>
      <pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Fixes a few bugs in incremental maintenance and predictive reasoners.</description>
      <content:encoded><![CDATA[<p>Version 2026.9.26-0821a55 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed an issue where <a href="/build/guides/configuration/reasoners#enable-or-disable-incremental-maintenance">incremental maintenance</a>, an opt-in <a href="/release-notes/preview-features">preview feature</a>, could return incorrect results or fail with <code>DeltaProcessingError</code> or <code>FDError</code>.</p>
</li>
<li><p>Fixed a bug where predictive reasoner tasks ignored the <code>ICLConfig.random_state</code> seed.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.33.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.33.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.33.0</guid>
      <pubDate>Tue, 29 Sep 2026 14:50:54 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Python 3.14 support, Snowflake masking and projection policies, and various bug fixes.</description>
      <content:encoded><![CDATA[<p>Version 1.33.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now <a href="/get-started/start-building-with-pyrel">install the <code>relationalai</code> package</a> on Python 3.14. It supports Python 3.10 through 3.14.</p>
</li>
<li><p>You can now apply your own Snowflake masking policies and projection policies to the columns of a model you <a href="/build/guides/modeling/deploy-a-model">deploy</a> to Snowflake, in addition to the row access policies added in the previous release. A deployment now validates every configured policy up front and reports any that are missing or inaccessible. See <a href="/build/guides/configuration/model#configure-access-policies">Configure access policies</a> for setup instructions.</p>
<p>Here is an example configuration for applying masking and projection policies to a deployed output:</p>
<pre><code class="language-yaml">deployment:
  outputs:
    overrides:
      - objects: [CUSTOMERS]         # the deployed output to protect
        policies:
          masking_policies:          # mask values for some roles
            - fqn: GOVERNANCE.POLICIES.PII_MASK
              columns: [EMAIL, PHONE]
          projection_policies:        # hide a column from some roles
            - fqn: GOVERNANCE.POLICIES.HIDE_SSN
              columns: [SSN]
</code></pre>
</li>
<li><p><strong>Optional tracing:</strong> Installing <code>relationalai</code> no longer includes OpenTelemetry by default. If you already use its optional handler with the older v0 PyRel API to send traces for troubleshooting, run <code>python -m pip install &#39;relationalai[otel]==1.33.0&#39;</code> when you install this release to keep tracing working. Otherwise, you don&#39;t need the extra.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p><strong>Concurrent queries:</strong> Running several queries on one model at the same time, such as calling <a href="/build/guides/modeling/query-a-model"><code>to_df()</code></a> from multiple threads, no longer fails with an &quot;Unground Variable&quot; error, returns empty results, or hangs. You still cannot change the model while these queries run, and running an export or an optimization solve at the same time is also unsupported.</p>
</li>
<li><p>If a concept inherits from more than one concept, or uses <a href="/build/guides/modeling/declare-concepts"><code>identify_by</code></a> with more than one property, its queries and exports no longer put values in the wrong columns or return empty results. These problems only showed up for models deployed to Snowflake, which is a Public Preview feature.</p>
</li>
<li><p>Fixed a bug that caused local copies of a shared model to diverge from the original when <a href="/build/guides/modeling/deploy-a-model#branch-collaborate-and-merge">collaborating</a> with <code>rai models pull</code> and <code>rai models merge</code>. These commands are in Public Preview.</p>
</li>
<li><p>When your Snowflake connection does not specify a database, deployment now uses the database in a fully qualified <a href="/build/guides/configuration/model#set-the-deployment-target"><code>deployment.schema</code></a> instead of failing with <code>Database &#39;&quot;default&quot;&#39; does not exist or not authorized</code>. Set the option to <code>&lt;DATABASE&gt;.&lt;SCHEMA&gt;</code>; if neither the connection nor this setting specifies a database, deployment reports a clear configuration error.</p>
</li>
<li><p><strong>Transient deployment targets:</strong> You can now <a href="/build/guides/modeling/deploy-a-model">deploy a model</a> into a Snowflake transient database or schema without an <code>Unknown domain: TRANSIENT</code> error. Set <a href="/build/guides/configuration/model#use-a-standard-op-log-table-for-a-transient-deployment-target"><code>oplog.table_type: standard</code></a> in your configuration first, because Snowflake cannot create the default Hybrid Tables in a transient location.</p>
</li>
<li><p>If the role set by the <a href="/build/guides/configuration/model#set-the-deployment-target"><code>deployment.role</code></a> configuration option cannot set Snowflake&#39;s trace level, the deploy warning now tells you to grant <code>MODIFY TRACE LEVEL</code>.</p>
</li>
<li><p>The <code>rai debugger</code> no longer freezes or crashes on large traces or refresh logs. Big traces render as plain, scrollable text, the Refresh Log handles bigger dependency graphs and shows an error instead of going blank when one is too large, and it opens on the timeline view instead of the graph.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.9.19-cde4001</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.9.19-cde4001</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.9.19-cde4001</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Fixes a crash under heavy concurrent query load and prevents full recomputation when a model definition changes without source data changing under incremental maintenance (Public Preview).</description>
      <content:encoded><![CDATA[<p>Version 2026.9.19-cde4001 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>With <a href="/build/guides/configuration/reasoners#enable-or-disable-incremental-maintenance">incremental maintenance</a> enabled, the logic reasoner no longer recomputes a query from scratch when you redefine a rule it depends on without changing the source data. Incremental maintenance is a <a href="/release-notes/preview-features">preview feature</a>.</p>
</li>
<li><p>If a <a href="/build/guides/modeling#what-a-semantic-model-is">model</a> is deleted while a transaction is running against it, that transaction now fails with a clear reason (such as &quot;database not found&quot;) instead of a generic internal error.</p>
</li>
<li><p>Running many queries at the same time no longer crashes the logic reasoner while it compiles them.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.32.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.32.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.32.0</guid>
      <pubDate>Tue, 22 Sep 2026 14:51:33 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>If you use prescriptive reasoning (Public Preview, by request), review optimization problems after upgrading because some formerly accepted constraints and objectives now error or change meaning.</description>
      <content:encoded><![CDATA[<p>Version 1.32.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Breaking Changes</h2>
<ul>
<li><strong>Prescriptive reasoning (Public Preview, by request):</strong> When you create an optimization problem in your Python code, some constraints and objectives that used to be accepted now raise a clear error or change meaning. Review your existing problems after you upgrade. For example, applying <a href="/api/python/v1.32/semantics/std/aggregates/count"><code>count</code></a> directly to a decision variable is now rejected because it counts rows rather than the values the solver chooses. A few others still build but now describe a different problem. To check them, print the problem with <a href="/api/python/v1.32/semantics/reasoners/prescriptive/problem/problem_class#method-display"><code>Problem.display()</code></a> and confirm the formalized constraints and objectives match what you intended.</li>
</ul>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now use the <a href="/api/python/v1.32/semantics/std/aggregates/percentile"><code>percentile</code></a> and <a href="/api/python/v1.32/semantics/std/aggregates/median"><code>median</code></a> aggregates to summarize your data. You can group either one with <a href="/build/guides/reasoning/rules-based/aggregate-and-group-data#group-results-with-per"><code>per()</code></a> like any other aggregate.</p>
</li>
<li><p><strong>Snowflake object tags:</strong> When you <a href="/build/guides/modeling/deploy-a-model">deploy a model</a> to Snowflake, you can now apply your own existing Snowflake object tags to every object the deploy creates by listing them under <code>deployment.tags</code>. On a redeploy, each object keeps only the tags you list.</p>
<pre><code class="language-yaml">deployment:
  tags:
    GOVERNANCE.TAGS.COST_CENTER: engineering
</code></pre>
</li>
<li><p><strong>Row-access policies:</strong> You can now attach an existing Snowflake row-access policy to the tables, views, and dynamic tables a <a href="/build/guides/modeling/deploy-a-model">deploy</a> creates by adding a per-output <code>policies</code> override under <code>deployment.outputs</code>. RelationalAI does not fully check the policy first, so an invalid one can still fail when the deploy runs.</p>
<pre><code class="language-yaml">deployment:
  outputs:
    overrides:
      - objects: [ORDERS]
        policies:
          row_access_policy:
            fqn: GOVERNANCE.POLICIES.TENANT_ACCESS
            columns: [TENANT_ID]
</code></pre>
</li>
<li><p><strong>Existing ownership tag:</strong> You can now point RelationalAI at a Snowflake tag you already created for object ownership with <code>deployment.managed_tag</code>. A governed account can then <a href="/build/guides/modeling/deploy-a-model#deploy-without-create-tag">deploy a model</a> without the Snowflake <code>CREATE TAG</code> privilege. The deploying role needs <code>APPLY</code> on the tag and <code>USAGE</code> on the database and schema that hold it.</p>
<pre><code class="language-yaml">deployment:
  managed_tag: GOVERNANCE.TAGS.RELATIONALAI_MANAGED
</code></pre>
</li>
<li><p>You can now open a <a href="/api/cli/v1.32/doctor"><code>rai doctor</code></a> report in the <a href="/api/cli/v1.32/debugger"><code>rai debugger</code></a> offline, without access to the Snowflake account it came from. The trace, Refresh Log, and deployment graphs all work from the unzipped report.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>A model with a wide concept, roughly 43 or more nullable properties, that failed to deploy with a <code>RecursionError</code> now deploys again. This fixes a regression introduced after version 1.29.1.</p>
</li>
<li><p>Fixed an issue that caused some models to fail to deploy with an &quot;object already exists&quot; error.</p>
</li>
<li><p><strong>Custom metadata schema:</strong> If you place a model&#39;s metadata and operation log in a custom schema with <code>deployment.meta_schema</code>, RelationalAI now uses that location consistently for deploys, teardown, and branch operations. Changing the setting later does not move existing metadata, so set it before your first deploy.</p>
</li>
<li><p><strong>Redeployed objects:</strong> Redeploying a model now recreates every changed Snowflake object consistently, and it preserves the grants you added to its procedures and functions. Because objects are recreated rather than altered, you may need to restore other object-level state yourself.</p>
</li>
<li><p>Deploying a model to Snowflake is faster, because RelationalAI now runs its two metadata setup phases in parallel.</p>
</li>
<li><p><strong>Conflicting deployment records:</strong> Two deployment records that claim the same model identity no longer break <a href="/api/cli/v1.32/models"><code>rai models</code></a> listing or teardown for the whole database. The conflicted model stays listed with a warning that explains how to repair it.</p>
</li>
<li><p>For models deployed to Snowflake, the <a href="/api/python/v1.32/semantics/std/aggregates/variance"><code>variance</code></a> and <a href="/api/python/v1.32/semantics/std/aggregates/variance_samp"><code>variance_samp</code></a> aggregates no longer lose precision on whole-number input. Expressions that raise a value to a power with <code>**</code>, such as <a href="/api/python/v1.32/semantics/std/math/haversine"><code>math.haversine</code></a>, no longer fail. This does not fix <code>geometric_mean</code> over negative input on Snowflake, which is still unsupported.</p>
</li>
<li><p>For models deployed to Snowflake, comparing two entity types with <code>==</code> no longer errors when their identities are stored differently, for example a generated hash versus an integer <code>identify_by</code> key. Because the two kinds of identity can never be equal, the comparison now returns <code>False</code>.</p>
</li>
<li><p>A <a href="/api/python/v1.32/semantics/where"><code>where()</code></a> filter whose condition is a Python builtin call with a literal argument, such as <code>abs(-1) == 2</code>, now filters when the condition is false, as expected.</p>
</li>
<li><p>For models deployed to Snowflake, queries that compute several aggregate measures over the same grouping now run in a single pass instead of re-scanning the data once per measure. The results are unchanged.</p>
</li>
<li><p>Calling <a href="/api/python/v1.32/semantics/inspect"><code>inspect()</code></a> or <code>to_df()</code> on a <a href="/api/python/v1.32/semantics/define"><code>define</code></a> or <a href="/api/python/v1.32/semantics/require"><code>require</code></a> fragment now raises a clear error, &quot;Cannot inspect a define&quot; instead of crashing. A <code>define</code> or <code>require</code> adds to your model rather than running as a query, so there is nothing to inspect.</p>
</li>
<li><p><strong>Configuration load errors:</strong> When a configuration file that RelationalAI discovers automatically, such as <code>~/.rai</code>, the Snowflake CLI config, or a dbt config, fails to load, RelationalAI now reports the real error and names the file that failed, instead of a generic &quot;no configuration found&quot; message. A commented-out <code>{{ env_var(...) }}</code> line is also no longer evaluated, so it can no longer fail on an unset variable.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.9.11-438c741-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.9.11-438c741-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.9.11-438c741-1</guid>
      <pubDate>Wed, 16 Sep 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Clear, actionable errors for write-write conflicts, plus improved prescriptive problem validation.</description>
      <content:encoded><![CDATA[<p>Version 2026.9.11-438c741-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Write-write conflicts between transactions on the same model now return a clear, actionable error instead of a confusing system error. The message reads <code>The model is currently locked by active write transaction(s)</code> and includes the RAI CLI command to <a href="/api/cli/latest/jobs/cancel">cancel the blocking transaction</a>.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p><a href="/build/guides/configuration/reasoners#enable-or-disable-incremental-maintenance">Incremental maintenance</a> no longer fails with a <code>DeltaProcessingError</code> or reads back the wrong string value for a relationship with a functional dependency whose values come from more than one rule and include long strings.</p>
</li>
<li><p><a href="/build/guides/reasoning/prescriptive">Prescriptive</a> problems that repeat a decision variable or coefficient are now rejected with an <code>InvalidModel</code> error instead of silently solving a different problem than the one you defined. Re-run any such problems solved before this version to confirm their results.</p>
</li>
<li><p>In a prescriptive problem, a <code>count</code> over something other than <a href="/build/guides/reasoning/prescriptive/decision-problems/constraints">conditions</a> the solver decides, such as decision variables directly, now fails with a clear <code>InvalidModel</code> error instead of an opaque <code>OTHER_ERROR</code>.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.31.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.31.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.31.1</guid>
      <pubDate>Wed, 16 Sep 2026 20:42:56 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Deploying a model to Snowflake now needs one less tag, plus a uniqueness-requirement deploy fix.</description>
      <content:encoded><![CDATA[<p>Version 1.31.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><a href="/build/guides/modeling/deploy-a-model">Deploying a model</a> to Snowflake now needs one less Snowflake tag. RelationalAI no longer creates or requires the <code>RELATIONALAI_MANAGED_SCHEMA</code> tag, which simplifies setup for administrators who pre-create tags for a restricted deploy role.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>A model with a <a href="/build/guides/modeling/define-requirements">uniqueness requirement</a> across two different concepts, such as <code>require(unique(Subscription.account, Subscription.phone))</code>, now deploys to Snowflake instead of failing with a table-creation error.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.31.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.31.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.31.0</guid>
      <pubDate>Tue, 15 Sep 2026 22:38:11 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>New variance and variance_samp aggregates measure how spread out your data is.</description>
      <content:encoded><![CDATA[<p>Version 1.31.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>You can now use the <a href="/api/python/v1.31/semantics/std/aggregates/variance"><code>variance</code></a> and <a href="/api/python/v1.31/semantics/std/aggregates/variance_samp"><code>variance_samp</code></a> aggregates to measure how spread out your data is. <code>variance</code> returns the population variance and <code>variance_samp</code> returns the sample variance, and you can group either one with <a href="/build/guides/reasoning/rules-based/aggregate-and-group-data#group-results-with-per"><code>per()</code></a> like any other aggregate.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.30.4</title>
      <link>https://docs.relational.ai/release-notes/python/1.30.4</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.30.4</guid>
      <pubDate>Tue, 15 Sep 2026 17:43:44 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.30.4 fixes math.haversine() distances, so recompute prior results, and a select() containing only a function call on a literal can now return a null row instead of no rows.</description>
      <content:encoded><![CDATA[<p>Version 1.30.4 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now use the <a href="/api/python/v1.30/semantics/std/aggregates/geometric_mean"><code>geometric_mean</code></a> aggregate to average rates and ratios, and group it with <a href="/build/guides/reasoning/rules-based/aggregate-and-group-data#group-results-with-per"><code>per()</code></a> like any other aggregate. It expects non-negative numbers.</p>
</li>
<li><p>Run the new <a href="/api/cli/v1.30/config/check"><code>rai config check</code></a> command to catch configuration mistakes before they cause errors later. It checks that your configured reasoners have valid names and sizes for your Snowflake account&#39;s cloud.</p>
</li>
<li><p>Queries in a <a href="/build/guides/modeling/deploy-a-model">deployed model</a> that read from a Snowflake source table now run faster automatically. RelationalAI no longer sorts the table when your query doesn&#39;t use its row order.</p>
</li>
<li><p>Aggregates over a <a href="/build/guides/modeling/derive-facts-with-logic#how-relationship-chains-work">relationship chain</a>, such as <code>min(Customer.transaction.pay_date).per(Customer)</code>, now run faster automatically. RelationalAI no longer adds an unnecessary join.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>You can now deploy a model into a Snowflake schema named after a SQL reserved word, such as <code>ORDER</code> or <code>SCHEMA</code>. Before this release, the deploy failed with an error saying the object did not exist.</p>
</li>
<li><p>You can now deploy a model with a Snowflake role that only has <code>USAGE</code> on a schema your administrator created for you, with its tags already in place. RelationalAI no longer creates an account-wide management schema.</p>
</li>
<li><p>If your deploy role can&#39;t create a schema it needs, the deploy now stops early with a clear error that gives you the exact grants and <code>CREATE SCHEMA</code> statements to run, instead of failing partway through.</p>
</li>
<li><p>Redeploying a model now keeps the Snowflake grants and compatible object and column tags you applied to its tables. Before this release, a redeploy could drop them.</p>
</li>
<li><p><strong>Haversine distances:</strong> <a href="/api/python/v1.30/semantics/std/math/haversine"><code>math.haversine</code></a> now returns the correct distance. Before this release, it returned a wrong value, so recompute any distances you calculated with it.</p>
</li>
<li><p><strong>Null rows from <code>select()</code>:</strong> A <a href="/api/python/v1.30/semantics/select"><code>select</code></a> whose only content is a single function call on a literal, such as <code>select(parse_number(&quot;abc&quot;, 19, 0))</code>, now returns one row with a null value when the call produces nothing, instead of no rows. If any of your logic treats an empty result as a signal, review it, since these queries now return a null row you can <a href="/build/guides/reasoning/rules-based/handle-missing-data">handle with null-safe logic</a>.</p>
</li>
<li><p>When you deploy a model, a <a href="/build/guides/modeling/derive-facts-with-logic">rule</a> whose condition matches no rows no longer adds any facts. Before this release, a rule that defined two or more fixed facts added them anyway, leaving facts in your model that shouldn&#39;t be there.</p>
</li>
<li><p>When you deploy a model, a grouped aggregate whose default value sits behind an unreachable branch no longer duplicates rows. Before this release, it could return two rows per group instead of one.</p>
</li>
<li><p><a href="/api/cli/v1.30/models/deploy">Deploying</a>, <a href="/api/cli/v1.30/models/branch">branching</a>, and <a href="/api/cli/v1.30/models/pull">pulling</a> a model through its op log is more reliable. A model that uses a standard-library function, such as <code>parse_float</code>, now loads consistently in any Python session, and a model that sets the <a href="/api/python/v1.30/config/config_deployment_fields/deploymentconfig_class"><code>preserve_column_case</code></a> deployment option no longer regenerates invalid Python.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.30.3</title>
      <link>https://docs.relational.ai/release-notes/python/1.30.3</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.30.3</guid>
      <pubDate>Thu, 10 Sep 2026 00:01:33 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Adds new Snowflake sign-in options, a floats module, and faster refresh, plus aggregate and deployment fixes.</description>
      <content:encoded><![CDATA[<p>Version 1.30.3 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p><strong>Snowflake sign-in:</strong> You can now <a href="/build/guides/configuration/snowflake-auth">sign in to Snowflake</a> two new ways. Pass your private key to <a href="/api/python/v1.30/config/connections/snowflake/jwtauth_class"><code>JWTAuth</code></a> in memory with a new <code>private_key</code> field instead of saving it to a file, or inject your own Snowpark session into <a href="/api/python/v1.30/config/config/create_config"><code>create_config</code></a> with <code>snowflake_session=</code>.</p>
</li>
<li><p>Refreshing a <a href="/build/guides/modeling/deploy-a-model">deployed model</a> is now faster when some of its outputs are independent of each other, because those outputs refresh in parallel instead of waiting for unrelated ones. This happens automatically.</p>
</li>
<li><p>The <a href="/api/cli/v1.30/debugger"><code>rai debugger</code></a> can now show how long each part of a refresh took, so you can find the slow ones. Open a finished refresh run and select View Timeline to see the whole refresh and its parts laid out on a timeline.</p>
</li>
<li><p>Added the floats module to the public <code>std</code> namespace, making its functions available like other standard-library modules. You can now use <a href="/api/python/v1.30/semantics/std/floats/float"><code>std.floats.float()</code></a> to convert a value to a float, or <a href="/api/python/v1.30/semantics/std/floats/parse_float"><code>std.floats.parse_float()</code></a> to turn a string into a float.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>An aggregate like a count or sum now respects a <a href="/api/python/v1.30/semantics/union"><code>union</code></a> filter, or a <a href="/build/guides/modeling/declare-relationships-and-properties#unary-relationships-1-field-boolean-flags">unary relationship</a>, applied to it in <a href="/api/python/v1.30/semantics/where"><code>where()</code></a>. Before this release, the aggregate ignored that filter and ran over every row, so it could return a wrong total or count with no error.</p>
</li>
<li><p><a href="/api/python/v1.30/semantics/std/aggregates/limit"><code>aggregates.limit</code></a> now returns only the number of rows you asked for when you order it by the <a href="/build/guides/reasoning/rules-based/aggregate-and-group-data#group-results-with-per">grouping keys</a> of another aggregate in the same query. Before this release, it ignored the limit in that case and returned every row.</p>
</li>
<li><p>A query that aggregates over a cycle of relationships, such as A knows B, B knows C, and C knows A, now returns a result. Before this release, a query like this could fail to complete, because the reasoner could not settle on a way to order it and gave up instead of returning a result.</p>
</li>
<li><p>Deploying a model that reads a relationship on a concept with a <a href="/build/guides/modeling/declare-concepts#identity-and-entity-keys">composite key</a> now works. Before this release, the deploy could fail or the relationship could come back empty.</p>
</li>
<li><p>Deploying a model no longer fails when one of its output column names contains a hyphen, a space, or a reserved word. Before this release, the refresh stopped with an <code>invalid identifier</code> error.</p>
</li>
<li><p>Filtering by calling a relationship with a value, such as <code>order.status(&quot;open&quot;)</code>, now raises a clear <code>AmbiguousRelationshipRead</code> error when the name matches more than one relationship, and tells you to <a href="/build/guides/modeling/query-a-model#filter-by-comparison">compare with <code>==</code></a> instead, as in <code>order.status == &quot;open&quot;</code>. Before this release, it failed with a confusing internal error.</p>
</li>
<li><p><strong>Unsupported output types:</strong> Deploying a model no longer prints warnings that did not mean anything was wrong. A warning still appears when you force an output to a <a href="/build/guides/configuration/model#choose-how-outputs-are-materialized">Snowflake object type</a> it cannot use, and tells you how to fix it: set the output to <code>table</code> or remove the override.</p>
</li>
<li><p>Redeploying a healthy model that sets <a href="/api/python/v1.30/config/config_deployment_fields/deploymentconfig_class"><code>deployment.suspend_after_mins</code></a> no longer suspends the refresh tasks it just created, so the model keeps refreshing after a deploy. The tasks still <a href="/build/guides/configuration/model#auto-suspend-test-schedules">auto-suspend</a> once the configured number of minutes has passed since the deploy.</p>
</li>
<li><p>Deploying a model while someone is querying it no longer fails at the final step with an error asking you to <a href="/api/cli/v1.30/models/pull">pull</a> and retry. Those queries write harmless background metadata that used to block the deploy, which now finishes on its own.</p>
</li>
<li><p>A deploy that is rejected before it applies its changes no longer leaves the model&#39;s schema behind in Snowflake for you to clean up, because RelationalAI now creates Snowflake objects only when the deploy goes ahead.</p>
</li>
<li><p>Deploying into a schema or with ownership tags that already exist now reuses them instead of failing to re-create them, and errors only if creating something genuinely fails.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.9.6-b010153</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.9.6-b010153</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.9.6-b010153</guid>
      <pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Adds clearer error messages for Snowflake-managed Iceberg table exports and functional dependency violations.</description>
      <content:encoded><![CDATA[<p>Version 2026.9.6-b010153 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>When an export to a Snowflake-managed Iceberg table fails because a column&#39;s type doesn&#39;t match the destination column, the error now names the destination column&#39;s type instead of showing a generic message. This tells you which type to match so you can fix the export.</p>
</li>
<li><p>Functional dependency violation errors now name the relationship involved, even when the violation is found during parallel execution on the <a href="/manage/reasoners/logic">Logic Reasoner</a>. Previously, these errors could appear with no relationship named, leaving no way to trace the violation to its source.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a href="/build/guides/modeling/query-a-model#export-results-to-snowflake-tables-with-into-and-exec">Exporting query results</a> to a Snowflake-managed Iceberg table no longer fails when a result column has an integer type.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.8.31-3a37425</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.8.31-3a37425</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.8.31-3a37425</guid>
      <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Loads data faster and gives a clearer error when a solver parameter has the wrong type.</description>
      <content:encoded><![CDATA[<p>Version 2026.8.31-3a37425 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Loading data into the <a href="/manage/reasoners/logic">Logic Reasoner</a> is now faster. Internal benchmarks show first-time load times cut roughly in half, with the largest loads improving the most.</p>
</li>
<li><p>Solvers now give a clearer error when one of their <a href="/build/guides/reasoning/prescriptive/decision-problems/solve#tune-solver-backend-behavior">backend-specific parameters</a> has the wrong type, naming the parameter and the type they expect.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Queries over data that contains empty strings now return results instead of stopping the whole transaction with an internal error.</p>
</li>
<li><p>Upgrading the app no longer fails on Snowflake accounts whose default table type is set to Iceberg.</p>
</li>
<li><p>Updated the app&#39;s bundled third-party components to versions that resolve known security vulnerabilities.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.30.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.30.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.30.1</guid>
      <pubDate>Tue, 01 Sep 2026 14:35:04 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Model deployment now validates generated SQL by default and supports scheduled prescriptive solves in Snowflake for users of the by-request prescriptive reasoning Public Preview who configure a Snowflake identity.</description>
      <content:encoded><![CDATA[<p>Version 1.30.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>When you <a href="/build/guides/modeling/deploy-a-model">deploy a model</a>, RelationalAI now checks the generated SQL first and stops with a clear error instead of letting the deploy succeed and then potentially fail later on its first refresh. The check is on by default. Set <a href="/api/python/v1.30/config/config_deployment_fields/deploymentconfig_class"><code>deployment.validate_sql</code></a> to <code>false</code> to skip it.</p>
</li>
<li><p>You can now deploy a model that contains a prescriptive <a href="/api/python/v1.30/semantics/reasoners/prescriptive/problem/problem_class"><code>Problem</code></a>, and have Snowflake solve it on each scheduled refresh without keeping a Python session open. It runs under a Snowflake identity you configure with the new <code>deployment.pat_user</code> and <code>deployment.pat_warehouse</code> settings.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Deployed model outputs that filter rows with a <a href="/api/python/v1.30/semantics/frontend/base/match_class"><code>match</code></a> or <a href="/api/python/v1.30/semantics/union"><code>union</code></a> inside <a href="/api/python/v1.30/semantics/where"><code>where()</code></a> now evaluate that filter for each current row. This fixes a bug that could cause affected outputs to include extra rows or return no rows.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.30.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.30.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.30.0</guid>
      <pubDate>Tue, 01 Sep 2026 03:01:12 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Fixes grouped aggregates that collapsed to one row in a union, and a deploy blocked after Rel App activity.</description>
      <content:encoded><![CDATA[<p>Version 1.30.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li>When querying a deployed model in Snowflake, aggregates inside a <code>union()</code> could fail with <code>Unsupported subquery type cannot be evaluated</code>. Aggregates now compute over their whole group instead of a single row. This applies to <code>count()</code>, <code>sum</code>, <code>max</code>, and <code>avg</code>, including when grouped with <code>.per()</code>.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.29.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.29.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.29.1</guid>
      <pubDate>Mon, 31 Aug 2026 16:40:39 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Speeds up model deployment and fixes bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.29.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><a href="/build/guides/modeling/deploy-a-model">Deploying a model</a> with <a href="/api/cli/v1.29/models/deploy"><code>rai models deploy</code></a> is now faster. PyRel creates your tables, views, and dynamic tables at the same time instead of one by one, while still respecting how they depend on one another. It&#39;s on by default and produces the same result, so you don&#39;t need to change anything.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p><a href="/build/guides/modeling/query-a-model#filter-results-with-where">Filters</a> that compare a value to Python <code>None</code> now keep the correct rows instead of silently dropping the ones where the value is missing, in both <a href="/api/python/v1.29/semantics/frontend/base/model_class#method-where"><code>Model.where</code></a> with <code>== None</code> or <code>!= None</code>, and <a href="/api/python/v1.29/semantics/frontend/base/concept_class#method-filter_by"><code>Concept.filter_by(prop=None)</code></a>.</p>
</li>
<li><p>Models with rules that divide <a href="/build/guides/reasoning/rules-based/work-with-numbers">numbers with decimal places</a> now deploy instead of failing with a numeric-precision error.</p>
</li>
<li><p>Sharing a model through <a href="/api/cli/v1.29/models/pull"><code>rai models pull</code></a> or <a href="/api/cli/v1.29/models/merge"><code>rai models merge</code></a> now regenerates a more accurate <code>shared_model.py</code>. It keeps parts of your model that earlier versions could drop or silently break, such as joins between different number types, counts of a column or property, and concepts that extend <code>Any</code> or <code>AnyEntity</code>.</p>
</li>
<li><p>The PyRel debugger&#39;s Trace tab again shows the steps PyRel runs to build your model. A recent change had collapsed them into a single &quot;no changes&quot; row.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.29.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.29.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.29.0</guid>
      <pubDate>Fri, 28 Aug 2026 15:56:40 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Prescriptive reasoning users must stop passing part= or where= to Problem.display() and pass only one argument to all_different() after upgrading.</description>
      <content:encoded><![CDATA[<p>Version 1.29.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Queries that use <a href="/api/python/v1.29/semantics/std/path/path"><code>path()</code></a> to find paths in a <a href="/build/guides/reasoning/graph/create-a-graph">graph</a> now compile and run faster, especially patterns that repeat a step a bounded number of times with <code>.repeat(min, max)</code>. In one benchmark, compiling a large repeated pattern dropped from over a minute to under a second, with no change to results.</p>
</li>
<li><p><strong>Display strings in deployed models:</strong> Constraints and objectives can now show their display strings when the model runs in Snowflake: the <a href="/build/guides/reasoning/prescriptive/decision-problems/">prescriptive reasoner</a> renders them inside the model instead of in the Python client. The rendered text is available as a <code>display_string</code> property. Call <a href="/api/python/v1.29/semantics/reasoners/prescriptive/problem/problem_class#method-install_display_strings"><code>install_display_strings()</code></a> on a <a href="/api/python/v1.29/semantics/reasoners/prescriptive/problem/problem_class"><code>Problem</code></a> before you deploy it (interactive use installs it automatically on the first <code>display()</code>).</p>
</li>
<li><p><strong>Scheduled refresh privileges:</strong> Deploying a model that schedules automatic refreshes with <a href="/api/cli/v1.29/models/deploy"><code>rai models deploy</code></a> now warns you when the Snowflake role that owns the refresh tasks lacks the account-level <code>EXECUTE TASK</code> privilege. Before, the deploy reported success but the refresh never ran, so the tables stayed empty with no explanation. The warning names the role and the exact grant needed to fix it.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>In a deployed model, several aggregate queries that used to fail with the message <code>Unsupported subquery type cannot be evaluated</code> or return wrong results now work correctly. This includes grouped aggregates (<a href="/api/python/v1.29/semantics/std/aggregates/per"><code>.per()</code></a>), aggregates capped with <a href="/api/python/v1.29/semantics/std/aggregates/limit"><code>aggregates.limit</code></a>, and aggregates used inside a <code>not_()</code> check.</p>
</li>
<li><p>In a deployed model, <a href="/api/python/v1.29/semantics/std/aggregates/rank"><code>rank()</code></a> now groups rows correctly when the same definition also contains an unrelated aggregate that uses a <a href="/build/guides/reasoning/rules-based/handle-missing-data">fallback value</a>. Before, every row could land in its own group, so the rank was <code>1</code> for every row. This produced silently wrong results with no error.</p>
</li>
<li><p>After you deploy with <a href="/build/guides/configuration/model/#configure-op-log-recording">op log recording</a> turned off, <a href="/api/cli/v1.29/models/list"><code>rai models list</code></a> and the related <code>branch</code>, <code>switch</code>, and <code>teardown</code> commands now work as expected.</p>
</li>
<li><p><code>rai models deploy --wait</code> now makes a new model version visible to other users of the model as soon as its Snowflake objects are installed, rather than after the first data refresh finishes.</p>
</li>
<li><p>Deploying a model no longer fails when a concept has multiple identifying properties and one of them has no values. That property now deploys as an empty table.</p>
</li>
<li><p>When you set <code>deployment.outputs.reasoner</code> on a model that also defines a prescriptive <code>Problem</code>, the deploy no longer skips outputting the problem. It keeps the solver&#39;s outputs in place, routes only the outputs it can, and warns about the ones it left alone.</p>
</li>
<li><p>Querying a model in a Snowflake notebook no longer shows stray error cards (such as <code>[Invalid iteration] Cannot iterate over Chain objects.</code>) underneath a query that actually succeeded. These came from the notebook inspecting PyRel objects left in the namespace. Real errors from your own code still appear.</p>
</li>
<li><p>Calling <code>AnyEntity.ref()</code> no longer raises an <code>UnresolvedType</code> error and now works as expected.</p>
</li>
<li><p>Deploying a model whose objects are Snowflake dynamic tables and that also uses the logic reasoner no longer shows warnings about dynamic tables or rebuilds them as regular tables.</p>
</li>
</ul>
<h2>Deprecations and Removals</h2>
<ul>
<li><p><code>Problem.display()</code> no longer accepts <code>part=</code> or <code>where=</code>. Passing either now raises a <code>TypeError</code>. To filter what you see, first render the display text with <code>install_display_strings()</code>, then read the new <code>display_string</code> property from the constraint (or other expression) you want, just like any other field:</p>
<pre><code class="language-python">problem.install_display_strings()
# capacity_constraint is a constraint you defined when building the problem
model.select(capacity_constraint.name, capacity_constraint.display_string).where(capacity_constraint.name == &quot;cap_3&quot;)
</code></pre>
<p>Output is now sorted as plain text instead of natural number order, so <code>x_1, x_2, x_10</code> now appears as <code>x_1, x_10, x_2</code>.</p>
</li>
<li><p><a href="/api/python/v1.29/semantics/reasoners/prescriptive/all_different"><code>all_different</code></a> now takes a single argument.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.8.23-6e405e5</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.8.23-6e405e5</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.8.23-6e405e5</guid>
      <pubDate>Wed, 26 Aug 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Fixes correctness issues when using Snowflake-managed Iceberg tables.</description>
      <content:encoded><![CDATA[<p>Version 2026.8.23-6e405e5 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Loading a <a href="/build/guides/modeling/declare-data-sources">Snowflake-managed Iceberg table</a> now stops with a clear error when a column&#39;s data type doesn&#39;t match the table&#39;s declared data type, instead of silently returning incomplete results. Update the column&#39;s <a href="/build/guides/modeling/declare-data-sources#what-column-data-types-are-supported">declared data type</a> to match the source.</p>
</li>
<li><p>Fixed an issue that could prevent changes to a <a href="/build/guides/modeling/declare-data-sources">Snowflake-managed Iceberg table</a> from being picked up, so your queries could keep returning data from an earlier version of the table.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.28.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.28.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.28.0</guid>
      <pubDate>Tue, 25 Aug 2026 17:48:31 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>In the model deployment Public Preview, op log recording now turns on by default when you deploy, so rai models branch, pull, and merge work without extra setup.</description>
      <content:encoded><![CDATA[<p>Version 1.28.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p><strong>Op log recording on deployment:</strong> PyRel now records your model&#39;s change history automatically every time you deploy to Snowflake with <a href="/api/cli/v1.28/models/deploy"><code>rai models deploy</code></a>. This history is called the <a href="/build/guides/configuration/model/#configure-op-log-recording">op log</a>, and it&#39;s what makes <a href="/api/cli/v1.28/models/branch"><code>rai models branch</code></a>, <a href="/api/cli/v1.28/models/pull"><code>pull</code></a>, and <a href="/api/cli/v1.28/models/merge"><code>merge</code></a> work, so those commands now work right away with no setup. To turn recording off, set <a href="/api/python/v1.28/config/config_fields/oplogconfig_class"><code>oplog.enabled: false</code></a> in <code>raiconfig.yaml</code>.</p>
</li>
<li><p>When you deploy a model, a <a href="/build/guides/modeling/declare-concepts">concept</a> and its subconcepts (declared with <code>extends=</code>) can now be built by different reasoners at the same time. For example, one subconcept can load straight from a Snowflake table while another is derived by rules. Querying the parent concept returns rows from all of its subconcepts together. Previously, every subconcept had to use the same reasoner.</p>
</li>
<li><p>Instead of writing separate SQL queries to explore a Snowflake database table by table, you can now run <a href="/api/cli/v1.28/explore/schema"><code>rai explore schema</code></a> to capture its full structure (column types, primary and foreign key candidates, and value distributions) as a single JSON file. This helps when you&#39;re <a href="/build/guides/modeling">building a semantic model</a> from an existing database and want to understand it first. It supports Snowflake sources only for now.</p>
<p>For example:</p>
<pre><code class="language-bash">rai explore schema --database DEMO_TELCO --schema RAW --out schema.json
</code></pre>
</li>
<li><p>You can now define more than one <a href="/build/guides/reasoning/prescriptive/decision-problems/">decision problem</a> on the same model, each as its own <a href="/api/python/v1.28/semantics/reasoners/prescriptive/problem/problem_class"><code>Problem</code></a>. Once a model has more than one, give each <code>Problem</code> a unique name using the <code>name</code> parameter so PyRel can tell them apart, and match each one to the same problem every time you redeploy.</p>
</li>
<li><p>You can now use <a href="/api/python/v1.28/semantics/std/aggregates/string_join"><code>aggregates.string_join</code></a> in models deployed to Snowflake. Use <a href="/api/python/v1.28/semantics/std/aggregates/string_join#param-index"><code>index=</code></a> to control the order the values are joined in, or leave it out to join them in ascending order by value.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p><strong>Teardown in shared schemas:</strong> If your deployed model&#39;s target schema also holds tables or views you didn&#39;t create with PyRel, tearing down the model no longer removes them. <a href="/api/cli/v1.28/models/teardown"><code>rai models teardown</code></a> now deletes only the objects RelationalAI created, and never drops the schema itself, even with <code>--force</code>. If RelationalAI created the schema, teardown reports it separately, along with the SQL needed to remove it.</p>
</li>
<li><p><strong>Deployment workaround:</strong> Deploying a model no longer crashes with <code>ExtractionError: Property owner must be user schema object</code> when it adds a property to a built-in concept. This came up in many common models, such as any model that uses the <a href="/build/guides/reasoning/graph/create-a-graph">graph</a> or <a href="/build/guides/reasoning/prescriptive/decision-problems/">prescriptive</a> reasoner, or that simply calls <a href="/api/python/v1.28/semantics/frontend/core/error"><code>Error.new(message=...)</code></a>. If you set <code>oplog.enabled: false</code> only to work around this crash, you can now remove that setting.</p>
</li>
<li><p>In a deployed model, <a href="/build/guides/reasoning/rules-based/aggregate-and-group-data">grouped aggregate</a> queries now return correct results when a grouped aggregate (using <a href="/api/python/v1.28/semantics/std/aggregates/per"><code>.per()</code></a>) shares a variable with another aggregate or lookup in the same rule. Some of these queries previously returned wrong rows, too few rows, or were rejected. Only deployed models were affected.</p>
</li>
<li><p>In a deployed model, an aggregate combined with a <a href="/build/guides/reasoning/rules-based/handle-missing-data">fallback value</a> using <code>|</code> (for example, <code>count(C).per(C.grp) | 0</code>) now returns one correct row per group. Before, it could return wrong rows, or the deploy could fail on Snowflake with <code>Unsupported subquery type cannot be evaluated</code>. Only deployed models were affected.</p>
</li>
<li><p>A query that uses <a href="/api/python/v1.28/semantics/union"><code>union()</code></a> to express an OR condition across differently filtered joins no longer fails to deploy to Snowflake with <code>Unsupported subquery type cannot be evaluated</code>.</p>
</li>
<li><p>In a deployed model, a concept with <a href="/build/guides/modeling/derive-facts-with-logic#combine-values-with-arithmetic-operators">a property derived from another of its own properties</a> no longer fails to deploy when nothing else in the model creates that concept. It now deploys with zero rows, which matches the fact that nothing populates it.</p>
</li>
<li><p>A model no longer fails to deploy to Snowflake with an error like <code>invalid identifier &#39;__VAR_N&#39;</code> when a filtered, grouped aggregate is used to <a href="/build/guides/modeling/derive-facts-with-logic#classify-entities-with-concept-membership">classify an existing entity</a>, such as <code>model.where(R(x), c := per(x).count(y), c &gt; 1).define(Flag(x))</code>.</p>
</li>
<li><p>A model with a concept that uses <a href="/build/guides/modeling/declare-concepts#use-implicit-identity">implicit identity</a> no longer silently drops rows when the same data is read more than once during deploy. No model changes are needed. Redeploying applies the fix.</p>
</li>
<li><p>Compiling a model with a large <code>union()</code>, such as hundreds of filter <a href="/build/guides/modeling/query-a-model#understand-fragments-and-materialization">fragments</a> feeding one rule, is now much faster. A compile that used to take over a minute now finishes in a few seconds.</p>
</li>
<li><p><strong>Log and trace privileges:</strong> If your <a href="/build/guides/configuration/model#set-the-deployment-target">deployment role</a> can&#39;t change Snowflake log or trace levels, deploying no longer shows a false <code>Deploy Step Skipped</code> warning when your role already inherits a sufficient level from the account, database, or schema. The warning still appears when the level really is too low, which you can fix by granting your role the <code>MODIFY LOG LEVEL</code> and <code>MODIFY TRACE LEVEL</code> privileges.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.27.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.27.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.27.1</guid>
      <pubDate>Tue, 18 Aug 2026 20:57:11 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Speeds up undirected-graph queries and deployments; now requires DuckDB 1.5.0 or newer.</description>
      <content:encoded><![CDATA[<p>Version 1.27.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Running a query or deploying a model that uses an <a href="/build/guides/reasoning/graph/create-a-graph">undirected graph</a> 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 <a href="/api/python/v1.27/semantics/reasoners/graph/core/graph_class"><code>Graph</code></a> with 200,000 edges took about 41 seconds to build. That same graph now takes about 1 second.</li>
</ul>
<h2>Dependency Updates</h2>
<ul>
<li>PyRel now requires DuckDB 1.5.0 or newer. DuckDB is installed automatically with PyRel, so most users don&#39;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.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.27.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.27.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.27.0</guid>
      <pubDate>Tue, 18 Aug 2026 18:31:52 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Deployments now create SQL views for eligible direct sources, and common.hash() values have changed: check stored hashes before upgrading and plan to recompute those that must stay stable.</description>
      <content:encoded><![CDATA[<p>Version 1.27.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>When a concept or relationship is built directly from your source Snowflake tables — without any additional computation in PyRel — <a href="/build/guides/modeling/deploy-a-model">model deployment</a> 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 <code>type: table</code> for that output under <code>deployment.outputs.overrides</code>. See <a href="/build/guides/configuration/model#choose-how-outputs-are-materialized">Choose how outputs are materialized</a> for details.</p>
</li>
<li><p>Redeploying a model now keeps existing deployed tables&#39; 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&#39;s type, can still require recreating a table.</p>
</li>
<li><p>Model deployment now tags each schema it creates as RAI-managed, which supports safer cleanup later. If your deployment role can&#39;t apply that tag, deployment now stops with a clear error telling you to grant <code>APPLY</code> on the tag (or <code>APPLY TAG</code> on the account) instead of leaving an untagged schema behind.</p>
</li>
<li><p>Temporary tables created by PyRel when deploying a model now live in the deployment&#39;s <code>_META</code> schema instead of appearing next to your model outputs, keeping the target schema limited to your model&#39;s objects.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p><strong>Stored hashes:</strong> <a href="/api/python/v1.27/semantics/std/common/hash"><code>common.hash()</code></a> 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 <code>common.hash(</code> and plan to recompute any stored hashes that must stay stable.</p>
</li>
<li><p><strong>Parsed UUIDs:</strong> In a deployed model, <a href="/api/python/v1.27/semantics/std/common/parse_uuid"><code>common.parse_uuid()</code></a> 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 <a href="/api/python/v1.27/semantics/std/common/uuid_to_string"><code>common.uuid_to_string()</code></a> 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.</p>
</li>
<li><p>A <a href="/build/guides/modeling/query-a-model">query</a> that uses one <code>select()</code> inside another expression now returns the correct rows. Previously, a nested selection could drop rows or ignore its own filter.</p>
</li>
<li><p>Selecting a constant value in a query no longer fails with a <code>GROUP BY term out of range</code> error when combined with other properties and relationships, and now returns the expected rows.</p>
</li>
<li><p>Definitions that negate a <a href="/api/python/v1.27/semantics/union"><code>union()</code></a> with <a href="/api/python/v1.27/semantics/not_"><code>not_()</code></a> or supply <a href="/build/guides/reasoning/rules-based/handle-missing-data">fallback values</a> with <code>|</code> no longer fail to compile when deploying a model.</p>
</li>
<li><p>If you force two deployment outputs that depend on each other onto different reasoners, deployment now fails with a clear <code>ConflictingForcedReasoners</code> error that names the outputs and how to fix them, instead of a raw internal error. You set an output&#39;s reasoner with <a href="/api/python/v1.27/config/config_deployment_fields/outputsconfig_class"><code>deployment.outputs.overrides</code></a>.</p>
</li>
<li><p>When <a href="/api/cli/v1.27/models/list"><code>rai models list</code></a> can&#39;t read the model-management schema because of your role&#39;s privileges, the error now recommends the correct <code>GRANT USAGE</code> statements instead of an <code>APPLY ON TAG</code> grant that didn&#39;t fix the problem.</p>
</li>
<li><p>After running the <a href="/api/cli/v1.27/models/teardown"><code>rai models teardown</code></a> CLI command with the <code>--force</code> option, the follow-up message no longer points you to unnecessary or unavailable commands.</p>
</li>
<li><p>Calling a concept with keyword arguments, such as <code>Movie(title=&quot;The Matrix&quot;)</code> instead of <a href="/api/python/v1.27/semantics/frontend/base/concept_class#method-lookup"><code>Movie.lookup(title=&quot;The Matrix&quot;)</code></a>, now raises a clear <code>Invalid usage</code> error right away instead of failing at query time with a confusing <code>AssertionError</code>.</p>
</li>
<li><p>Deploying a <a href="/build/guides/modeling/declare-concepts">concept</a> 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 <code>NULL result in a non-nullable column</code> error, or store incomplete identities.</p>
</li>
<li><p>When you create a <a href="/build/guides/reasoning/prescriptive/decision-problems/variables">decision variable</a> with <a href="/api/python/v1.27/semantics/reasoners/prescriptive/problem/problem_class#method-solve_for"><code>Problem.solve_for()</code></a> for a concept that has no <code>identify_by</code> key, querying that variable&#39;s solved values now returns the matching rows instead of nothing.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.8.17-c5208f8</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.8.17-c5208f8</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.8.17-c5208f8</guid>
      <pubDate>Mon, 17 Aug 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Creating a data stream on a Snowflake-managed Iceberg table now fails immediately because CDC streams cannot process those sources, so use a supported source instead.</description>
      <content:encoded><![CDATA[<p>Version 2026.8.17-c5208f8 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Breaking Changes</h2>
<ul>
<li>Creating a <a href="/manage/data/manage">data stream</a> on a Snowflake-managed Iceberg table now fails immediately with the error <code>Iceberg tables are not supported for CDC data streams.</code>
Previously, the stream was created but Snowflake quarantined it, so changes were never processed.
See <a href="/manage/data/prepare">Prepare your data sources</a> for the source objects that data streams support.</li>
</ul>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>The new <a href="/api/sql/api/cleanup_stale_data_streams"><code>api.cleanup_stale_data_streams()</code></a> procedure lets you delete data streams that haven&#39;t been accessed for longer than a time-to-live (TTL) you specify.
It takes a TTL in minutes and runs in dry-run mode by default, reporting the data streams it would delete without removing anything.
Pass <code>DRY_RUN =&gt; FALSE</code> to delete them.</p>
</li>
<li><p>The <a href="/api/sql/api/data_streams"><code>api.data_streams</code></a> view now includes a <code>last_accessed</code> column that shows when each data stream was last accessed by a transaction.
The value is <code>NULL</code> for a data stream that has never been accessed.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a rare issue where two internal computations could overwrite each other and affect a query&#39;s results.</p>
</li>
<li><p>Writing to a Snowflake-managed Iceberg table no longer fails with an <code>Invalid parquet file: non-nullable column ... has null values according to file statistics</code> error.</p>
</li>
<li><p>The app now reconnects to Snowflake on its own when its internal access token expires, so operations like reasoner creation no longer get stuck and fail.</p>
</li>
<li><p>Fixed an issue that prevented custom aggregations over decimal values, such as <code>FixedDecimal</code>, from returning results.</p>
</li>
<li><p>Prediction jobs submitted by PyRel to a predictive reasoner no longer fail with an <code>index out of range in self</code> error when your data contains a category that wasn&#39;t seen during training.</p>
</li>
<li><p>A query that runs while a model&#39;s internal data store is being deleted now reports the accurate error <code>The database does not exist.</code> instead of the misleading <code>Database was closed and this transaction was discarded.</code> Note that &quot;database&quot; here refers to an internal database used by the native app and not a Snowflake database visible in your Snowflake account.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.8.9-8d1935f-6</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.8.9-8d1935f-6</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.8.9-8d1935f-6</guid>
      <pubDate>Fri, 14 Aug 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Fixes an issue where expired OAuth tokens could cause reasoner operations to fail without retrying.</description>
      <content:encoded><![CDATA[<p>Version 2026.8.9-8d1935f-6 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li>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.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.26.2</title>
      <link>https://docs.relational.ai/release-notes/python/1.26.2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.26.2</guid>
      <pubDate>Thu, 13 Aug 2026 01:47:55 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Adds account usage reports, faster model builds for deployment, and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.26.2 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>The new <a href="/api/cli/v1.26/usage"><code>rai usage</code></a> command reports your account&#39;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&#39;t identify a compute pool&#39;s machine family.</p>
<p>For example, write a July 2026 usage report to a CSV file:</p>
<pre><code class="language-sh">rai usage --start 2026-07-01 --end 2026-07-31 --format csv --output-file usage.csv
</code></pre>
<p>:::note
The Snowflake role for your active profile needs access to <code>SNOWFLAKE.ACCOUNT_USAGE</code> in order to run the <code>rai usage</code> command.
:::</p>
</li>
<li><p><a href="/build/guides/modeling/deploy-a-model">Model deployment</a> 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.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>A <a href="/build/guides/modeling/query-a-model">query</a> that computes a value (such as a sum or a true/false flag) in one <a href="/api/python/v1.26/semantics/frontend/base/fragment_class#select"><code>select()</code></a> step and selects that same value again in a later <code>select()</code> now returns the correct rows. Previously, it could return too few rows or fail with an error.</p>
</li>
<li><p>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.</p>
</li>
<li><p>If you compute an aggregate with <a href="/api/python/v1.26/semantics/std/aggregates/per"><code>.per()</code></a> 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.</p>
</li>
<li><p>Some <a href="/api/python/v1.26/semantics/not_"><code>not_()</code></a> 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.</p>
</li>
<li><p>PyRel now raises a clear <code>UnsupportedOperation</code> error when Louvain, Infomap, and label propagation algorithms are used in a deployed model. These algorithms are currently not supported.</p>
</li>
<li><p>Grouping an aggregate by a key that has no values now raises a clear <code>GroupKeyHasNoDomain</code> error instead of unexpectedly combining your per-group results into one overall total.</p>
</li>
<li><p>Deploying a model that uses quoted, case-sensitive Snowflake names no longer fails with an &quot;Object does not exist or not authorized&quot; error.</p>
</li>
<li><p>When more than one Snowpark session is active, PyRel now surfaces Snowflake&#39;s multiple-active-sessions error (<code>1409</code>) instead of quietly opening a new connection, so you can choose which session to use.</p>
</li>
<li><p>If you pass your own Snowpark session to <a href="/api/python/v1.26/config/config/create_config"><code>create_config()</code></a>, deployment now uses that session when it switches Snowflake roles, instead of creating a separate one.</p>
</li>
<li><p>Explicitly setting <a href="/api/python/v1.26/config/config_reasoners_fields/logicreasonerconfig_class#incremental_maintenance"><code>reasoners.logic.incremental_maintenance</code></a> to <code>&quot;off&quot;</code> in Python now takes effect. Previously, PyRel could reset it to <code>&quot;auto&quot;</code>, which turned incremental maintenance on.</p>
</li>
<li><p>Some <a href="/api/python/v1.26/semantics/frontend/base/match_class">match (<code>|</code>) expressions</a> that used to fail with an <code>is unground</code> error (for example, <code>&#39;pet&#39; is unground</code>) now work correctly.</p>
</li>
<li><p>Fixed a bug that could cause concept tables in a deployed model to be updated on the wrong schedule.</p>
</li>
<li><p>Fixed an edge case where a query could mix up similarly named properties on different kinds of entities.</p>
</li>
<li><p>Fixed an edge case where a deployed model could apply a definition even when its condition wasn&#39;t met.</p>
</li>
<li><p>Fixed an edge case where matching an entity by its identifying property could return a match even when no such entity existed.</p>
</li>
<li><p>Fixed an edge case where an equality between two values in a query condition could incorrectly return no rows.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.8.9-8d1935f</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.8.9-8d1935f</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.8.9-8d1935f</guid>
      <pubDate>Wed, 12 Aug 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Speeds deployed-model refreshes and fixes query errors when you enable incremental maintenance (Public Preview, off by default).</description>
      <content:encoded><![CDATA[<p>Version 2026.8.9-8d1935f of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><a href="/build/guides/modeling/deploy-a-model">Deploying and refreshing a model</a> 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.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed some errors that could occur with <a href="/build/guides/configuration/reasoners#enable-or-disable-incremental-maintenance">incremental maintenance</a> 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.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.26.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.26.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.26.1</guid>
      <pubDate>Wed, 05 Aug 2026 12:24:29 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Improves rai models CLI commands and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.26.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Your first <a href="/api/cli/v1.26/models/deploy"><code>rai models deploy</code></a> on a new branch now works without a manual <a href="/api/cli/v1.26/models/pull"><code>rai models pull</code></a> first. <a href="/api/cli/v1.26/models/switch"><code>rai models switch</code></a> pulls the branch for you. A bare <code>rai models pull</code> also now defaults <code>--path</code> to the <code>model.path</code> in your <code>raiconfig.yaml</code>.</p>
</li>
<li><p>Tearing down a parent branch now removes its child branches too, instead of leaving them orphaned and unable to pull or merge. As a safeguard, <a href="/api/cli/v1.26/models/teardown"><code>rai models teardown</code></a> <code>--allow-children</code> stops when a child has unmerged changes until you also pass <code>--allow-unmerged</code>. <a href="/api/cli/v1.26/models/list"><code>rai models list</code></a> and <a href="/api/cli/v1.26/doctor/report"><code>rai doctor report</code></a> now flag any branches orphaned by an earlier teardown.</p>
</li>
<li><p>The <code>rai models</code> commands now recognize when the schema you name is already your active model branch, instead of acting as if it changed. <a href="/api/cli/v1.26/models/switch"><code>rai models switch</code></a> no longer prints a false &quot;Switched&quot; message, <a href="/api/cli/v1.26/models/branch"><code>rai models branch</code></a> tells you to pick a different name instead of erroring, and <a href="/api/cli/v1.26/models/list"><code>rai models list</code></a> marks your active schema with a <code>*</code>.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a bug that caused <a href="/build/guides/modeling/query-a-model">queries</a> using <a href="/api/python/v1.26/semantics/union"><code>union()</code></a> to run slowly and, in some cases, hang indefinitely.</p>
</li>
<li><p>Fixed a bug that could cause aggregates grouped with <a href="/api/python/v1.26/semantics/std/aggregates/per"><code>per()</code></a> to evaluate incorrectly when used solely as a filter and not selected in the query results.</p>
</li>
</ul>
<p>Fixed a bug that caused aggregates grouped by an entity with a composite key to evaluate incorrectly.</p>
<ul>
<li><p>Fixed an issue that could cause an &quot;invalid identifier&quot; error when <a href="/build/guides/modeling/deploy-a-model">deploying a model</a>.</p>
</li>
<li><p>Fixed a bug that could case an &quot;Object does not exist&quot; error when deploying a model to a case-sensitive schema name.</p>
</li>
<li><p>Fixed a bug where a deploy could fail when a Snowflake view or dynamic table (an auto-refreshing Snowflake table) was created before another object it reads from.</p>
</li>
<li><p>Fixed a bug where deploying an unedited <a href="/api/cli/v1.26/models/init"><code>rai models init</code></a> project could fail immediately with a &quot;Symbol ... is already registered&quot; error.</p>
</li>
<li><p>Fixed a bug that could cause redeploying a model without any changes could fail.</p>
</li>
<li><p>Fixed an issue that prevented model re-deploys from picking up changes to a data sources Snowflake object.</p>
</li>
<li><p>Fixed a model deployment bug that ignored a user-supplied Snowpark session passed to <a href="/api/python/v1.26/config/config/create_config"><code>create_config()</code></a>, which is supposed to override any auto-detected Snowpark session.</p>
</li>
<li><p>Fixed a bug that could cause <code>rai models pull</code> or <a href="/api/cli/v1.26/models/merge"><code>rai models merge</code></a> to generate a runnable <code>shared_model.py</code> file. If you encountered this bug, pull or merge again to regenerate a corrected <code>shared_model.py</code>.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.26.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.26.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.26.0</guid>
      <pubDate>Mon, 03 Aug 2026 18:38:58 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.26.0 makes model.deploy() run a full, tracked deployment from Python and notebooks, plus many Snowflake deploy and query fixes.</description>
      <content:encoded><![CDATA[<p>Version 1.26.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now <a href="/build/guides/modeling/deploy-a-model">deploy a model</a> from Python with <a href="/api/python/v1.26/semantics/frontend/base/model_class#method-deploy"><code>model.deploy()</code></a> as a programmatic alternative to the CLI. It relies on the operation log, which is off by default, so <a href="/build/guides/configuration/model/#configure-op-log-recording">set <code>oplog.enabled</code> to <code>true</code></a> to turn it on.</p>
</li>
<li><p>If you run PyRel inside Snowpark Container Services (SPCS) and connect via OAuth, use the new <a href="/api/python/v1.26/config/connections/snowflake/snowflakeconnectionbase_class"><code>host</code></a> option in your <a href="/build/guides/configuration/snowflake-auth">Snowflake connection</a> configuration to the container&#39;s <code>SNOWFLAKE_HOST</code> endpoint. OAuth tokens in your configuration are validated against this host.</p>
</li>
<li><p>You can now cap how long PyRel waits for a reasoner to become ready or a query to finish by setting <a href="/api/python/v1.26/config/config_fields/dataconfig_class"><code>data.poll_timeout_mins</code></a> in your raiconfig to a number of minutes so it raises a clear timeout error instead of hanging forever. It is off by default and only stops your Python client, not any work already running in Snowflake.</p>
</li>
<li><p><strong>Standard-table operation log:</strong> If your Snowflake account cannot use hybrid tables, such as a Tri-Secret Secure account, you can now set <code>oplog.table_type: standard</code> in your raiconfig to provision the operation log as a standard table instead of the <code>hybrid</code> default. Note that changing this setting after your first deployment does not update the existing oplog table. You&#39;ll need to delete the table and re-deploy in order for it to take effect.</p>
</li>
<li><p>The <a href="/api/python/v1.26/semantics/std/aggregates/product"><code>product()</code></a> aggregation function, which multiplies values together, is now supported in deployed models.</p>
</li>
<li><p>The <a href="/api/cli/v1.26/debugger"><code>rai debugger</code></a> has a new Refresh Log view that shows a deployed model&#39;s install plan and refresh history as a diagram, so you can watch a refresh as it runs. You can also start it with <code>--no-show</code> to skip opening a browser window when you restart it.</p>
</li>
<li><p>PyRel now catches a conflicting <code>implicit_properties</code> setting when you deploy, branch, merge, or <a href="/api/cli/v1.26/models/pull">pull</a> with the operation log enabled, raising <code>ModelConfigMismatchError</code> when your current setting differs from the one recorded at the model&#39;s deploy, instead of letting the conflict break the model later. This setting (part of <a href="/api/python/v1.26/config/config_fields/modelconfig_class"><code>ModelConfig</code></a>) controls whether using an undeclared property creates it or raises an error. To resolve the error, match the recorded setting or pass <code>--force</code> to override and record the new one.</p>
</li>
<li><p>Improved performance for refreshing a deployed model.</p>
</li>
<li><p><strong>Generated output table names:</strong> Improved generated output table name in deployed models. For example, tables with generated names like <code>Number_38_0_datapoints</code> will now be saved as simply <code>datapoints</code>. If downstream queries or dashboards referenced the old name, update them after you redeploy.</p>
</li>
<li><p>Improved the error message you get when a deploy can&#39;t start because another is already in progress.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a model deployment bug where a model that used <a href="/build/guides/modeling/declare-data-sources/#create-model-constants-with-modelenum"><code>Model.Enum()</code></a> failed to deploy with the error<code>ValueError: No SQL type for column &#39;x&#39;</code>.</p>
</li>
<li><p>Fixed a bug where ranking or limiting rows over a concept with a composite key in a query or definition would fail with an invalid identifier error.</p>
</li>
<li><p>PyRel now internally sorts entities with composite keys differently than it used to. You may see results for queries that involve <a href="/api/python/v1.26/semantics/std/aggregates/rank"><code>rank()</code></a> or <a href="/api/python/v1.26/semantics/std/aggregates/top"><code>top()</code></a> return rows where the rank is tied in a slightly different order.</p>
</li>
<li><p>Fixed a model deployment bug where calling <a href="/api/python/v1.26/semantics/std/re/findall"><code>re.findall()</code></a> or <a href="/api/python/v1.26/semantics/std/strings/split"><code>strings.split()</code></a> on a <code>Table</code> column produced extra rows in the output table.</p>
</li>
<li><p>Fixed a bug where a query computed two <a href="/api/python/v1.26/semantics/std/aggregates/count"><code>count(...)</code></a>.<a href="/api/python/v1.26/semantics/std/aggregates/per"><code>per(key)</code></a> values over the same text key, one for values in a list and one for values not in it. The in-list count silently returned <code>NULL</code> on every row. Both counts now return the correct number.</p>
</li>
<li><p>Fixed a bug that caused some aggregations over properties that are set for some entities but not others to include values from entities that should have been excluded.</p>
</li>
<li><p>Fixed a model deployment issue that caused some models to fail with a<code>SQL object_name collision</code> error when deployed.</p>
</li>
<li><p>Fixed a bug where an unresolved chained reference in a query (a multi-step property or relationship lookup that was never given a value) could silently produce incorrect query results. PyRel now raises an error.</p>
</li>
<li><p>Fixed a bug in the <a href="/build/guides/reasoning/prescriptive">prescriptive reasoner</a> where a count or a summed objective (a total or a tally aggregated over rows) could silently drop rows that shared a value, so the solver optimized the wrong total. For example, with costs of 5, 5, and 7, the two 5s collapsed into one, giving <code>12*x</code> instead of <code>17*x</code>. Each row now contributes its own term.</p>
</li>
<li><p>The prescriptive reasoner now rejects a non-numeric value, such as a text or date property, used where a number is expected, with a clear error when you build the problem. Before, the problem built successfully and failed only during the solve, with a confusing internal error.</p>
</li>
<li><p>Fixed several problems with tearing down a deployed model using <a href="/api/cli/v1.26/models/teardown"><code>rai models teardown</code></a>. Leftover local state could be wrongly reused on a later redeploy, and a partial teardown could not be completed by re-running it. Teardown now cleans up reliably and can be safely re-run after a partial failure.</p>
</li>
<li><p>Fixed a bug where <code>rai models teardown</code> and <a href="/api/cli/v1.26/models/merge"><code>rai models merge</code></a> could act on a malformed schema. Both commands now always reject a malformed or ambiguous schema name with a clear error.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.8.3-49c7820</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.8.3-49c7820</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.8.3-49c7820</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Adds PAT authentication support for prescriptive reasoners and fixes several data stream issues.</description>
      <content:encoded><![CDATA[<p>Version 2026.8.3-49c7820 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><a href="/manage/reasoners/prescriptive">Prescriptive reasoners</a> now support Snowflake connections that authenticate with a <a href="/build/guides/configuration/snowflake-auth#configure-programmatic-access-token-authentication">programmatic access token (PAT)</a>.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed an issue that caused <a href="/manage/data/manage">data streams</a> to be <a href="/manage/data/fix#fix-quarantined-streams">quarantined</a> during brief pauses in the <a href="/manage/data/enable-and-disable#what-the-cdc-service-does">CDC service</a>.</p>
</li>
<li><p>Fixed an issue that could stop a <a href="/manage/data/manage">data stream</a> from syncing when the app&#39;s routine cleanup removed part of the internal data store that the <a href="/manage/data/enable-and-disable">CDC service</a> uses to load your data.</p>
</li>
<li><p>Prevented the app from leaving Snowflake compute resources running indefinitely when an internal engine fails to start.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.25.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.25.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.25.0</guid>
      <pubDate>Wed, 29 Jul 2026 10:55:03 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Adds model.teardown() and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.25.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now tear down a <a href="/build/guides/modeling/deploy-a-model">deployed model</a> from Python with <a href="/api/python/v1.25/semantics/frontend/base/model_class#method-teardown"><code>model.teardown()</code></a>, which is the cleanup counterpart to <a href="/api/python/v1.25/semantics/frontend/base/model_class#method-deploy"><code>model.deploy()</code></a>, so you can remove a model you no longer need without leaving your script or notebook.</p>
<p>Called with no arguments, <code>model.teardown()</code> only shows what it would remove and deletes nothing.
When you pass <code>force=True</code>, the call actually performs the teardown.
This drops the model&#39;s deployed schema in Snowflake, along with its meta schema and operation log, which is the same thing the <a href="/api/cli/v1.25/models/teardown"><code>rai models teardown</code></a> CLI command does:</p>
<pre><code class="language-python">model.teardown()            # preview: lists what would be dropped, drops nothing
model.teardown(force=True)  # drop the deployed model for real
</code></pre>
<p>Teardown cannot be undone, so check the preview before you use <code>force=True</code>.
Your local model files, including the generated <code>shared_model.py</code>, are left in place.</p>
</li>
<li><p>Running <a href="/api/cli/v1.25/doctor/report"><code>rai doctor report</code></a> now shows which <code>shared_model.py</code> file it used, as a new &quot;Shared model file&quot; entry in the report summary. This lets you confirm PyRel picked up the file you expected, which matters when a stray copy in a parent directory could otherwise be used without you noticing.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a bug where a <a href="/build/guides/modeling/query-a-model">query</a> that placed a <a href="/api/python/v1.25/semantics/union"><code>union(...)</code></a> next to another filter in the same <a href="/api/python/v1.25/semantics/where"><code>where(...)</code></a> could return incorrect results.</p>
<p>For example, the <code>status == &quot;open&quot;</code> filter below was ignored for one region, so results could include orders that were not open.
The filter now applies to both branches of the <code>union</code>:</p>
<pre><code class="language-python">where(
    Order.status == &quot;open&quot;,
    union(Order.region == &quot;US&quot;, Order.region == &quot;EU&quot;),
).select(Order.id).to_df()
</code></pre>
</li>
<li><p>Fixed a bug that could cause an &quot;invalid identifier&quot; error when you <a href="/build/guides/modeling/deploy-a-model">deployed a model to Snowflake</a>.</p>
</li>
<li><p>Fixed a bug that could crash Snowflake&#39;s SQL compiler with an out-of-memory error when deploying a model.</p>
</li>
<li><p>Fixed a bug that caused a Snowflake &quot;invalid regular expression&quot; or &quot;named groups not supported&quot; error when calling <code>re.sub</code>, <code>re.search</code>, or <code>re.match</code> on certain patterns, such as <code>re.sub(r&quot;\D&quot;, &quot;&quot;, text)</code>.</p>
</li>
<li><p><a href="/build/guides/modeling/create-model-instance">Reading table rows into a concept</a> no longer exposes the internal <code>__row_id_*</code> fields it uses to tell identical rows apart. They previously appeared as public properties when you inspected your model, and are now kept internal.</p>
</li>
<li><p>When <a href="/api/cli/v1.25/models/deploy"><code>rai models deploy</code></a> fails, you now see a short, readable error message instead of a long Python traceback. It also exits with a nonzero exit code, so scripts and CI pipelines can detect the failure and stop instead of continuing as if the deploy worked. This also applies to <code>--wait</code>, which is the option that keeps the command running until the deploy finishes.</p>
</li>
<li><p>The first deploy of a large model no longer fails with an <code>OplogAppendTooLargeError</code>, which used to stop the deploy with no way around it when it needed to write more than about 900 KB at once to the model&#39;s operation log. The operation log is the running record of changes PyRel keeps for a deployed model. The deploy now completes with no change to your model.</p>
</li>
<li><p>A model no longer fails to deploy with an <code>[Unground Variable]</code> error when a concept is identified by both a reference to another concept and a plain-value field from the same source table, for example a <code>LineItem</code> identified by its <code>Order</code> and a line number.</p>
</li>
<li><p>Running <a href="/api/cli/v1.25/models/pull"><code>rai models pull</code></a> more than once on a shared live branch, one that several people deploy to and pull from, now gives consistent results. Before, a second pull could quietly change the model definition you ended up with, so collaborators could drift out of sync. To get the fix, upgrade every collaborator to 1.25.0 before anyone runs the first pull, because afterward an older version of PyRel can no longer write to that branch.</p>
</li>
<li><p>In the <a href="/api/cli/v1.25/debugger"><code>rai debugger</code></a>, you can now expand a compiler pass for one block of a deployed model without the same pass opening in every other block, so the view stays focused on the block you are inspecting.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.7.27-74739c9</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.7.27-74739c9</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.7.27-74739c9</guid>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Fixes query export and data stream bugs.</description>
      <content:encoded><![CDATA[<p>Version 2026.7.27-74739c9 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li><p><a href="/build/guides/modeling/query-a-model#export-results-to-snowflake-tables-with-into-and-exec">Exporting query results</a> no longer fails when one of the exported columns has the same value in every row. Previously, these exports failed the entire transaction with an internal error.</p>
</li>
<li><p>A query that reads from a Snowflake source through a <a href="/manage/data/manage">data stream</a> no longer fails if that stream is being deleted and rebuilt while the query runs. Data streams keep your PyRel models in sync with their Snowflake sources, and PyRel sometimes rebuilds one to refresh it. Previously, a query caught in that window failed with a <code>The provided data streams do not exist (RAIERR:1000)</code> error, even though the stream was being replaced, not removed. Now the query finishes once PyRel rebuilds the stream.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.24.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.24.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.24.0</guid>
      <pubDate>Fri, 24 Jul 2026 16:03:35 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.24.0 fixes several Snowflake deploy and query correctness bugs and warns about unrecognized raiconfig.yaml keys.</description>
      <content:encoded><![CDATA[<p>Version 1.24.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>PyRel now warns you when your <a href="/build/guides/configuration/files"><code>raiconfig.yaml</code></a> file contains a key it doesn&#39;t recognize, so a typo no longer passes unnoticed.
For example, misspelling <code>account</code> as <code>accont</code> raises a warning that names the unknown key and suggests the closest valid one.
Valid configuration produces no warnings, and existing files keep working because this is a warning, not an error.</p>
</li>
<li><p>The <a href="/api/python/v1.24/semantics/inspect"><code>inspect</code></a> module for examining a model&#39;s concepts, relationships, tables, enums, and definitions without an engine connection is now included in the API reference.
The module shipped in an earlier release. This change makes its documentation discoverable on the docs site and in your IDE.</p>
</li>
<li><p>The <code>spcs_privatelink_zone</code> connection option is now documented and included as a commented setting in the <a href="/api/cli/v1.24/init"><code>rai init</code></a> config template.
Set it when you <a href="/manage/app/direct-access">enable Direct Access</a> on a Snowflake PrivateLink account. Omit the leading wildcard from that value.</p>
</li>
<li><p>The <a href="/api/cli/v1.24/debugger"><code>rai debugger</code></a> now groups a deployed model&#39;s compiler passes by block, instead of showing one flat list, so you can tell blocks apart and compare the same pass across them.
A new <em>Group by pass</em> toggle flips the view to show every block nested under each pass.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p><a href="/build/guides/modeling/query-a-model">Queries</a> now run in Snowflake Workspace notebooks instead of crashing.
Before this release, any query in that environment failed with <code>OSError: [Errno 95] Operation not supported</code> because PyRel tried to write its trace and log files to the notebook&#39;s locked-down filesystem.
Queries now run and return results there with no configuration needed.</p>
</li>
<li><p>Models that use <a href="/build/guides/modeling/declare-concepts"><code>model.Enum(...)</code></a> to map a messy raw column onto a fixed set of allowed values now <a href="/build/guides/modeling/deploy-a-model">deploy to Snowflake</a> and refresh correctly.
This is a common data-cleaning pattern, but on versions 1.22.0 and 1.23.0 it failed to deploy. The only workaround was to drop the enum and store the value in a plain string property instead, which gave up both the fixed set of allowed values and the type safety it provides. That workaround is no longer needed.</p>
<p>For example, the model below defines a <code>Region</code> enum, then tags every site whose raw region text matches a known spelling with the canonical <code>Region.Americas</code> value:</p>
<pre><code class="language-python">Region = model.Enum(&quot;Region&quot;, [&quot;Americas&quot;, &quot;EMEA&quot;, &quot;APAC&quot;])
Site.region = model.Property(f&quot;{Site} has region {Region}&quot;)

# Sites whose raw region text is one of these spellings become Region.Americas.
model.where(Site.region_raw.in_([&quot;amer&quot;, &quot;americas&quot;, &quot;north america&quot;])).define(
    Site.region(Region.Americas)
)
</code></pre>
<p>You would add a similar definition for <code>EMEA</code> and <code>APAC</code>. On 1.22.0 and 1.23.0 this model failed to deploy to Snowflake, but it now deploys and refreshes cleanly.</p>
</li>
<li><p>A <em>composite-key</em> entity is one identified by more than one key. When your model is deployed to Snowflake, PyRel now builds faster, simpler SQL for reading several properties of such an entity.
This is SQL that PyRel generates itself, both when it deploys or refreshes your model. It used to re-read the entity&#39;s table once for every property, which was slower. Single-key entities are unaffected.</p>
</li>
<li><p>When a <a href="/build/guides/modeling/derive-facts-with-logic">definition</a> sets a property whose value is a composite-key entity, that property&#39;s values are now saved correctly when the model is deployed to Snowflake and refreshed.
For example, a property might link each product to its supplier, where a supplier is identified by a company name and a country.
Before this release, the refresh reported success but silently dropped rows, so a definition that later read the property saw incomplete data.</p>
</li>
<li><p>Setting a property on an entity that is identified partly by another composite-key entity now works as expected when the model is deployed to Snowflake, instead of failing with a <code>NotImplementedError</code>.
For example, a shipment might be identified by a date and a route, where the route is itself identified by two cities.</p>
</li>
<li><p>Reading a property that points from one entity to another no longer adds an all-<code>NULL</code> row for entities that have no value when the model is deployed to Snowflake.
For example, if a property links each employee to their manager, an employee with no manager is now left out instead of appearing as a blank row.</p>
</li>
<li><p>Defining a <a href="/build/guides/modeling/declare-data-sources">table source</a> from a schema that lists two keys that name the same physical Snowflake column now behaves predictably. Snowflake treats names like <code>a</code> and <code>A</code> as one column, so PyRel collapses the two keys into one column when they share a type, or raises a clear error when their types differ, instead of silently adding a phantom column to the <code>Table</code> object.</p>
</li>
<li><p>Refreshing a deployed model that reads from a Snowflake source table whose name requires quoting now succeeds instead of failing during refresh. This includes names with a space, like <code>DB.SCHEMA.&quot;SOURCE B&quot;</code>.</p>
</li>
<li><p><a href="/api/cli/v1.24/models/pull"><code>rai models pull</code></a> on a live branch now rejects a merge that would create a cycle in column types with a clear <code>ConflictError</code> that names the cycle, instead of quietly producing a broken model that fails later. Such a cycle happens when, for example, table <code>T1</code> is typed by <code>T2</code> while <code>T2</code> is typed by <code>T1</code>.</p>
</li>
<li><p>Redeploying a model with <a href="/api/cli/v1.24/models/deploy"><code>rai models deploy</code></a> is more reliable: a model containing two identical definitions no longer fails to deploy, and annotations on a newly added concept or relation now apply on the first deploy.
Reordering definitions, and concepts that extend a built-in type, also no longer produce spurious changes on redeploy.</p>
</li>
<li><p>Recovering an interrupted model <a href="/build/guides/modeling/deploy-a-model#merge-a-branch-back">merge</a> is now reliable: re-running a merge after a conflict no longer duplicates concepts already promoted to the parent, the resume information survives an intervening pull or deploy, and model status now shows when a merge is mid-recovery.</p>
</li>
<li><p>The error message shown when your <code>shared_model.py</code> file has been edited since the last pull or deploy now accurately describes what <code>--force</code> does: it pushes your local edits to the <a href="/build/guides/modeling/deploy-a-model#collaborate-through-a-shared-model">shared model</a> and regenerates the file while keeping a backup, rather than discarding your edits.</p>
</li>
<li><p>Branch safeguard messages during a pull now distinguish a missing sync baseline from a branch that is genuinely behind, report the actual synchronized position, and make clear that a pull with no model changes still updates your local state.</p>
</li>
<li><p><a href="/api/cli/v1.24/doctor/report"><code>rai doctor report</code></a> now includes your model&#39;s local-state directory in the diagnostic bundle when your connection sets <code>rai_app_name</code> but no explicit <code>database</code>, instead of leaving it out.</p>
</li>
<li><p>Direct Access connections that use JWT-based key-pair authentication now automatically retry when the app&#39;s service endpoint becomes stale during token exchange, so the connection can recover on its own.</p>
</li>
<li><p>Regenerating a shared model through a pull, merge, or deploy now preserves <code>DECIMAL</code> and other number column types, instead of demoting them to a plain concept.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.23.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.23.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.23.1</guid>
      <pubDate>Wed, 22 Jul 2026 19:36:18 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.23.1 adds a default refresh schedule to deployed models and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.23.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>A new project you create with <a href="/api/cli/v1.23/models/init"><code>rai models init</code></a> now <a href="/build/guides/modeling/deploy-a-model">deploys to Snowflake</a> without you having to add a refresh schedule by hand.
Before this release, <a href="/api/cli/v1.23/models/deploy"><code>rai models deploy</code></a> failed on a brand-new project with an <code>Unscheduled Outputs</code> error, because the generated <code>raiconfig.yaml</code> didn&#39;t say how often to refresh the deployed tables and views.
The config now includes a default <a href="/build/guides/configuration/model#schedule-output-refreshes">refresh schedule</a> with <code>interval_s: 0</code>, which refreshes the outputs each time you deploy but not on a fixed interval, so the deploy succeeds.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>If you haven&#39;t filled in your <a href="/build/guides/configuration/snowflake-auth">Snowflake connection details</a> yet, PyRel now stops with a clear error message naming the values you need to fill in, instead of a confusing raw Snowflake error.
For example, a new project&#39;s <code>raiconfig.yaml</code> might still have the placeholder <code>account: myorg-myaccount</code>.
PyRel runs this check the first time it opens a Snowflake connection, so you see the message early, whether you run a script, run a query, or deploy your model.</p>
</li>
<li><p>The <a href="/api/cli/v1.23/debugger"><code>rai debugger</code></a> can now open the logs from large programs without freezing.
The debugger also has a new <em>Collapse all</em> button that closes every open section at once, and opening one section no longer expands the other sections with the same name.</p>
</li>
<li><p>Pulling or merging a <a href="/build/guides/modeling/deploy-a-model#collaborate-through-a-shared-model">shared model</a> now correctly rebuilds models that earlier releases could rebuild incorrectly.
When you run <a href="/api/cli/v1.23/models/pull"><code>rai models pull</code></a> or <a href="/api/cli/v1.23/models/merge"><code>rai models merge</code></a>, PyRel regenerates the shared model&#39;s code from your team&#39;s changes.
Before this release, pull and merging a shared a model could sometimes result in models that failed to build.</p>
</li>
<li><p>You can now call <a href="/api/python/v1.23/semantics/reasoners/prescriptive/problem/problem_class#method-solve"><code>solve()</code></a> again on the same prescriptive <a href="/api/python/v1.23/semantics/reasoners/prescriptive/problem/problem_class"><code>Problem</code></a> while asking for fewer of its optional <a href="/build/guides/reasoning/prescriptive/decision-problems/solutions"><code>sensitivity</code></a> and <a href="/build/guides/reasoning/prescriptive/decision-problems/solve#diagnose-infeasible-problems"><code>conflict</code></a> results.
Before this release, re-solving without a <code>sensitivity</code> or <code>conflict</code> result you had requested earlier raised an error.
Now the re-solve succeeds. On current RelationalAI platform versions, it also clears the results you no longer request, so you don&#39;t see stale numbers from an earlier solve.
You still can&#39;t switch between a plain solve and a <code>sensitivity</code> or <code>conflict</code> solve on the same <code>Problem</code>. Create a new <code>Problem</code> for that.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.23.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.23.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.23.0</guid>
      <pubDate>Wed, 22 Jul 2026 13:39:08 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.23.0 corrects Snowflake deployments of models with entity identity keys, and adds an option to preserve column-name case.</description>
      <content:encoded><![CDATA[<p>Version 1.23.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now keep the capitalization of your column names when you <a href="/build/guides/modeling/deploy-a-model">deploy a model</a> to Snowflake.
By default, PyRel converts unquoted column names to all upper case, so a property named <code>EntityId</code> deploys as the column <code>ENTITYID</code>.
To keep the case you declared instead, set <code>preserve_column_case: true</code> in the <code>deployment</code> section of your <code>raiconfig.yaml</code> (<a href="/api/python/v1.23/config/config_deployment_fields/deploymentconfig_class"><code>DeploymentConfig</code></a>):</p>
<pre><code class="language-yaml">deployment:
  preserve_column_case: true   # default: false
</code></pre>
<p>This applies to column names only, not table names.
With the option on, PyRel quotes the columns, so the names become case-sensitive in Snowflake.
Query them with the exact case and quotes, such as <code>&quot;EntityId&quot;</code>.</p>
</li>
<li><p>You can now name a relationship field that holds more than one kind of entity using the pipe operator <code>|</code> or the <a href="/api/python/v1.23/semantics/union"><code>union()</code></a> function.
This is useful when a field can point to instances of different concepts, such as an account owned by either an <code>Individual</code> or an <code>Organization</code>:</p>
<pre><code class="language-python">Account.owner = m.Relationship(f&quot;{Account} owned by {(Individual | Organization):owner}&quot;)
# equivalently:
Account.owner = m.Relationship(f&quot;{Account} owned by {union(Individual, Organization):owner}&quot;)
</code></pre>
<p>Each option must be a concrete entity type, such as <code>Individual</code> or <code>Organization</code>, rather than a value type like a number or string. A union must list at least two.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a bug that caused some model deployments to fail with a <code>NotImplementedError</code> and produce incomplete output tables.</p>
</li>
<li><p>Fixed a bug that caused the refresh task for some deployed models to fail with a Snowflake error or to produce empty tables.</p>
</li>
<li><p>Fixed queries that read two fields from the same multi-field <a href="/api/python/v1.23/semantics/frontend/base/property_class"><code>Property</code></a> in one <code>select()</code>, such as <code>select(invoice.total[&quot;currency&quot;], invoice.total[&quot;amount&quot;])</code>, when <code>invoice</code> comes from a nested <code>select()</code> that returns more than one invoice.</p>
<p>Before 1.23.0, PyRel could mix rows across invoices, returning every invoice&#39;s field values for each invoice instead of only its own. Now each invoice returns only its own values. This bug only affected <code>Property</code> instances, not <a href="/api/python/v1.23/semantics/frontend/base/relationship_class"><code>Relationship</code></a> instances, which always return the stored pairs correctly.</p>
<pre><code class="language-python"># `invoice` comes from an inner select(), then an outer select() reads
# two fields of the same multi-field property:
invoice = model.where(Invoice.overdue).select(Invoice)[0]
model.select(invoice.total[&quot;currency&quot;], invoice.total[&quot;amount&quot;])
</code></pre>
</li>
<li><p><a href="/api/cli/v1.23/models/pull"><code>rai models pull</code></a> no longer blocks a pull just because your branch has its own local changes.
Before this release, PyRel could mistake those local changes for a conflict and block the pull.
Now a pull is blocked only when your changes actually conflict with the shared history.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.7.21-f60cc22-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.7.21-f60cc22-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.7.21-f60cc22-1</guid>
      <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Upgrading the Native App fixes a remote code execution vulnerability in predictive reasoners and restores a required query permission on older installations.</description>
      <content:encoded><![CDATA[<p>Version 2026.7.21-f60cc22-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Queries that process large amounts of text now run faster on the <a href="/manage/reasoners/logic">Logic Reasoner</a>.</p>
</li>
<li><p>You can now clear all the data loaded from a <a href="/manage/data">Snowflake source table</a> by emptying that table. The data is removed on the next sync. Previously, empty tables were skipped during syncing, so the original data stayed in the app.</p>
</li>
<li><p><strong>Timed-out data stream exports:</strong> You can now recover a <a href="/manage/data/manage">data stream</a> export task that keeps timing out by increasing its warehouse size or timeout. Each data stream uses a Snowflake serverless task to export its processed changes, and a large or costly export can exceed the default limits. Adjust them with two new SQL procedures, intended for exceptional cases and usually done with RelationalAI support:</p>
<ul>
<li><a href="/api/sql/api/alter_export_task_wh_size"><code>api.alter_export_task_wh_size()</code></a></li>
<li><a href="/api/sql/api/alter_export_task_timeout"><code>api.alter_export_task_timeout()</code></a></li>
</ul>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Certain queries no longer fail while returning their results, most notably some <a href="/build/guides/reasoning/prescriptive">prescriptive reasoning</a> workloads. Previously, a recent change to the query engine could cause these queries to crash with an internal error.</p>
</li>
<li><p>You can now generate predictions immediately after training a <a href="/build/guides/reasoning/predictive">Predictive Reasoning</a> model. Previously, this could crash when an earlier training run had left data behind.</p>
</li>
<li><p>Deleting a <a href="/build/guides/modeling#what-a-semantic-model-is">model</a> no longer interrupts queries that are still running against it. Previously, deleting a model while it was still in use could fail those in-progress queries with a <code>Database was closed and this transaction was discarded</code> error.</p>
</li>
<li><p>A logic reasoner assigned from <a href="/manage/reasoners/warm">warm capacity</a> now works reliably as soon as it starts. Previously, such a reasoner could reject its first transactions with connection errors, or briefly appear under a different name than the one you requested.</p>
</li>
<li><p>App <a href="/manage/app/upgrade">upgrades</a> are now more reliable on accounts where services are slow to restart: the app now waits up to 20 minutes for them to come back online, up from 10.</p>
</li>
<li><p><strong>Upgrade permissions on older installations:</strong> Every upgrade now automatically restores a permission that older apps need to run queries, so upgrading no longer risks leaving an app unable to respond. Previously, an app installed before that permission existed could lose it during an upgrade and stay unavailable until it was restored manually.</p>
</li>
</ul>
<h2>Security</h2>
<ul>
<li>Resolved a remote code execution vulnerability (<a href="https://github.com/advisories/GHSA-29pf-2h5f-8g72">CVE-2026-4372</a>) in <a href="/build/guides/reasoning/predictive">predictive reasoners</a>. We patched it by upgrading the bundled Hugging Face <code>transformers</code> library to version 5.12.1. Upgrading the app applies the fix, so there is no action required on your part.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.22.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.22.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.22.0</guid>
      <pubDate>Mon, 20 Jul 2026 17:30:11 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.22.0 adds a home-level ~/.rai/raiconfig.yaml file so you can share connections across projects, and improves deploy diagnostics and query performance.</description>
      <content:encoded><![CDATA[<p>Version 1.22.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now share your Snowflake <code>connections</code>, and other settings, across projects instead of copying them into every project&#39;s <code>raiconfig.yaml</code>.
PyRel now discovers a home-level <code>~/.rai/raiconfig.yaml</code> <a href="/build/guides/configuration/files">configuration file</a> and merges it with each project&#39;s <code>raiconfig.yaml</code>, so you define shared settings once.
Previously, a project file that only named a shared connection (<code>default_connection: my_conn</code>) failed, because PyRel couldn&#39;t find where that connection was defined.</p>
<p>For example, define a connection once in the home file, then reference it by name from any project:</p>
<pre><code class="language-yaml"># ~/.rai/raiconfig.yaml — define the connection once
connections:
  my_conn:
    account: MY_ACCOUNT
    user: MY_USER
    role: MY_ROLE
    warehouse: MY_WH
default_connection: my_conn
</code></pre>
<pre><code class="language-yaml"># raiconfig.yaml — in a project; no connection details needed here
default_connection: my_conn
</code></pre>
<p>Anything you set in a project file still wins, so per-project overrides keep working.
Not sure where a setting is coming from? Run <a href="/api/cli/v1.22/config/explain"><code>rai config:explain</code></a> to trace each value to its file.</p>
</li>
<li><p>You can now <a href="/build/guides/modeling/deploy-a-model">deploy a model</a> from Python code by passing a <code>config</code> to <a href="/api/python/v1.22/semantics/frontend/base/model_class"><code>Model</code></a>, instead of deploying from a <code>raiconfig.yaml</code> file.
For those deploys, the <a href="/api/cli/v1.22/doctor/report"><code>rai doctor report</code></a> troubleshooting report is now accurate.
Before this release, it could show parts of your deployment as missing.
Now it reflects the configuration your deploy actually used.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Improved performance for <a href="/build/guides/modeling/query-a-model">queries</a> against deployed models that compute several aggregates grouped by the same key with <a href="/api/python/v1.22/semantics/std/aggregates/per"><code>per</code></a>.
Before this release, PyRel compiled these queries to SQL that repeated the same grouping join far more times than needed, so they ran slower while still returning correct results.
Now the generated SQL is much smaller and runs faster.</p>
</li>
<li><p>Fixed how PyRel references a Snowflake database, schema, or <a href="/build/guides/modeling/declare-data-sources">table used as a data source</a> whose quoted name contains a period, such as a table named <code>&quot;CoNNec.tioNs&quot;</code>.
Before this release, PyRel split the name on every period and produced an incorrect table reference.
Now it keeps the quoted name intact.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.21.4</title>
      <link>https://docs.relational.ai/release-notes/python/1.21.4</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.21.4</guid>
      <pubDate>Sat, 18 Jul 2026 00:37:08 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.21.4 fixes duplicated rows in some deployed models and speeds up refreshes for models with declared primary keys.</description>
      <content:encoded><![CDATA[<p>Version 1.21.4 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><a href="/build/guides/modeling/deploy-a-model">Deployed models</a> now refresh more efficiently when a concept declares primary keys with <code>identify_by</code>.
Before this release, PyRel always added a hashed <code>_ID</code> key column to deployed concept tables and joined on it. Now it uses the declared key columns directly, so each refresh does less work and returns the same results.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a correctness problem in <a href="/build/guides/modeling/deploy-a-model">deployed models</a> where you identify a concept by a source column whose values can repeat, such as an <code>Order</code> identified by an order id that appears on many line-item rows.
Before this release, that concept&#39;s deployed table could contain duplicate rows for the same <code>Order</code>, so some queries over it could return wrong results.
The table now keeps one row per entity, so those queries return correct results.</p>
</li>
<li><p>Fixed <a href="/api/python/v1.21/semantics/frontend/base/model_class#method-table"><code>Model.Table</code></a>] so that you can access Snowflake source columns whose names contain spaces.
Before this release, accessing such a column by the name you declared (for example, <code>orders[&quot;customer id&quot;]</code>) raised a <code>KeyError</code> even though the column existed. Now it resolves to that column.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.21.3</title>
      <link>https://docs.relational.ai/release-notes/python/1.21.3</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.21.3</guid>
      <pubDate>Thu, 16 Jul 2026 20:36:36 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.21.3 improves refresh performance for deployed models.</description>
      <content:encoded><![CDATA[<p>Version 1.21.3 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Improved <a href="/build/guides/modeling/deploy-a-model">deployed model</a> refresh performance for models with a concept whose identity comes from columns in more than one table.
Before this release, if that concept had several properties, PyRel re-read and re-joined those tables once for every property on each refresh, which was slow over large tables.
Now PyRel reads and joins them once and fills in all the concept&#39;s properties from a single pass, so each refresh does less repeated work and returns the same results.</p>
</li>
<li><p>Improved status reporting for the <a href="/build/guides/modeling/deploy-a-model"><code>REFRESH_STATUS</code></a> procedure.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.21.2</title>
      <link>https://docs.relational.ai/release-notes/python/1.21.2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.21.2</guid>
      <pubDate>Thu, 16 Jul 2026 18:50:12 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.21.2 improves error messages and fixes several bugs with model deployment.</description>
      <content:encoded><![CDATA[<p>Version 1.21.2 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Improved the errors you get when deploying a model that uses reasoning not yet supported in <a href="/build/guides/modeling/deploy-a-model">deploy mode</a>.
Before this release, deploying a model that used prescriptive optimization (<a href="/api/python/v1.21/semantics/reasoners/prescriptive/problem/problem_class"><code>Problem</code></a>) or predictive (<a href="/api/python/v1.21/semantics/reasoners/predictive/estimator/gnn_class"><code>GNN</code></a>) reasoning could fail in a confusing way.
Now PyRel raises a clear <code>NotImplementedError</code> explaining that these reasoners are not yet supported in deploy mode and telling you to remove the deployment configuration if you need them.</p>
</li>
<li><p>The starter project created by <a href="/api/cli/v1.21/models/init"><code>rai models init</code></a> now runs its deploy step with <a href="/api/cli/v1.21/models/deploy"><code>rai models deploy --wait</code></a>, so the first deployment finishes before you query.
Before this release, the generated project could return empty results if you queried before that first deployment completed.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a crash when re-deploying a model with <a href="/api/cli/v1.21/models/deploy"><code>rai models deploy</code></a> where a rule reads a column from a table loaded without an explicit schema.
Before this release, re-deploying such a model failed with a <code>ValueError: Cannot translate removal of &lt;column&gt;</code>, even though no column had actually been removed.
Now PyRel recognizes that the model is unchanged and the re-deploy completes successfully.</p>
</li>
<li><p>PyRel now reports an error when a concept inherits conflicting identities from more than one <a href="/build/guides/modeling/declare-concepts">parent concept</a>.
Before this release, PyRel accepted this and could build a model that behaves incorrectly.
Now PyRel raises an <code>Incompatible identify_by relations</code> error that names the two conflicting parents.</p>
<p>To fix it, define the identity once on a shared parent that both concepts extend:</p>
<pre><code class="language-python">from relationalai.semantics import Model, String

m = Model(&quot;Demo&quot;)

# Rejected: X and Y each define their own identity, so Z cannot inherit both.
X = m.Concept(&quot;X&quot;, identify_by={&quot;x_id&quot;: String})
Y = m.Concept(&quot;Y&quot;, identify_by={&quot;y_id&quot;: String})
# PyRel raises:
#   Concept Z has supertypes with incompatible identify_by relations: X vs Y
Z = m.Concept(&quot;Z&quot;, extends=[X, Y])

# Fixed: define the identity once on a shared parent, Base.
# A and B inherit their identity from Base, so C gets one consistent identity.
Base = m.Concept(&quot;Base&quot;, identify_by={&quot;id&quot;: String})
A = m.Concept(&quot;A&quot;, extends=[Base])
B = m.Concept(&quot;B&quot;, extends=[Base])
C = m.Concept(&quot;C&quot;, extends=[A, B])
</code></pre>
</li>
<li><p>Fixed <a href="/api/cli/v1.21/models/pull"><code>rai models pull</code></a> so it reports a conflict instead of building an invalid model.
Before this release, pulling branch changes into a <a href="/build/guides/modeling/deploy-a-model#collaborate-through-a-shared-model">shared model</a> could introduce duplicate property names and cause an error at query time.
Now <code>pull</code> raises a conflict error when a branch would introduce a property-name collision, so you can resolve the conflict before continuing.</p>
</li>
<li><p>Fixed <a href="/api/python/v1.21/semantics/std/re/findall"><code>std.re.findall()</code></a> when you call it on a table column.
For each row&#39;s value, <code>findall()</code> returns every match together with its position (1, 2, 3, and so on) in the value.
Before this release, the position counted up across the whole column instead of restarting for each row, and rows with no match were dropped.
Now the position restarts at 1 for each row, and rows with no match are kept.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.21.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.21.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.21.1</guid>
      <pubDate>Wed, 15 Jul 2026 12:25:25 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>In the model deployment Public Preview, manual mode (auto_deploy=False) starts queries faster but can return stale results, so use it only in development.</description>
      <content:encoded><![CDATA[<p>Version 1.21.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Reduced query startup time for <a href="/build/guides/modeling/deploy-a-model">deploy mode</a> users running in manual mode (<code>auto_deploy=False</code> in deploy mode configuration).
PyRel now skips a pre-run deployment check, so queries begin sooner.
In manual mode, you will no longer see <code>NO_DEPLOY_STATE</code> or <code>MATCHING_DEPLOY_FAILED</code> during query preparation.
This change reduces query latency, but should only be used in development since queries may return stale results because of the skipped check.</p>
</li>
<li><p>Improved troubleshooting in <a href="/api/cli/v1.21/doctor"><code>rai doctor</code></a> for Private Link accounts that use Direct Access.
Before this release, many failures looked like generic token-exchange errors.
Now <code>doctor</code> output includes a dedicated <code>direct_access_privatelink</code> section with specific categories such as <code>jwt_claim_error</code>, <code>endpoint_routing_error</code>, and <code>grant_error</code> so you can identify the next fix quickly.</p>
<p>For example, run:</p>
<pre><code class="language-bash">rai doctor --format json
</code></pre>
<p>Then check this output fragment:</p>
<pre><code class="language-json">{
  &quot;direct_access_privatelink&quot;: {
    &quot;checked&quot;: true,
    &quot;ok&quot;: false,
    &quot;error_type&quot;: &quot;endpoint_routing_error&quot;
  }
}
</code></pre>
<p>Use <code>error_type</code> to choose your next step:
<code>endpoint_routing_error</code>: verify Private Link endpoint routing.
<code>jwt_claim_error</code>: verify JWT claim formatting.
<code>grant_error</code>: verify grants and scopes.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed an issue in the <a href="/build/guides/modeling/deploy-a-model">deploy mode</a> workflow (<a href="/api/cli/v1.21/models/deploy"><code>rai models deploy</code></a>) where deployment could produce an incomplete model in some cases.
Before this release, deploy could finish successfully but still miss expected deployed tables or views, causing results to differ from the model you defined.
Now deployed outputs fully reflect the model definition.</p>
</li>
<li><p>Fixed issues in deploy mode&#39;s <a href="/build/guides/modeling/deploy-a-model#collaborate-through-a-shared-model">shared-model synchronization workflow</a>, where <a href="/api/cli/v1.21/models/pull"><code>rai models pull</code></a> and <a href="/api/cli/v1.21/models/deploy"><code>rai models deploy</code></a> regenerate model source and string logic could change.
This affected <a href="/api/python/v1.21/semantics/std/strings">string expressions</a>, including <a href="/api/python/v1.21/semantics/std/strings/contains"><code>std.strings.contains()</code></a> and <a href="/api/python/v1.21/semantics/std/strings/split"><code>std.strings.split()</code></a>.
Before this release, filters could be dropped and values derived from <code>split()</code> could fail after export and reload, so results could differ between the original and reloaded model.
Now those expressions are preserved after export and reload, so the reloaded model behaves like the original.</p>
<pre><code class="language-python"># In an existing model with Person.name and Person.part,
# these expressions should still behave the same after export and reload.
idx, part = std.strings.split(Person.name, &quot;,&quot;)
m.where(Person, std.strings.contains(Person.name, &quot;x&quot;)).define(Person.part(part))

# Quick check after export and reload:
# Compare the number of Person rows matching contains(&quot;x&quot;) before vs. after export and reload.
# Expected outcome: the counts are equal.
</code></pre>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.21.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.21.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.21.0</guid>
      <pubDate>Mon, 13 Jul 2026 13:26:32 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.21.0 introduces a new public preview feature called deploy mode that lets you deploy a PyRel model to a Snowflake schema as SQL tables and views.</description>
      <content:encoded><![CDATA[<p>Version 1.21.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>PyRel <code>1.21.0</code> introduces a new public preview feature called deploy mode that lets you deploy a PyRel model to a Snowflake schema as SQL tables and views. For more information, see <a href="/build/guides/modeling/deploy-a-model">Deploy a model</a>.</p>
</li>
<li><p>Improved the clarity of error messages when you define membership between concept types that do not match in <a href="/api/python/v1.21/semantics/frontend/base/model_class#method-define"><code>Model.define()</code></a>.
Before this release, <code>m.define(Target(Source))</code> could fail with a generic type-mismatch message that did not tell you how to fix the model.
Now the error explains compatible fixes, such as making <code>Target</code> a subtype of <code>Source</code> or using <code>AnyEntity</code> when you intentionally allow heterogeneous membership.
This example shows one invalid definition and two valid fixes:</p>
<pre><code class="language-python">from relationalai.semantics import AnyEntity, Model

m = Model(&quot;Demo&quot;)
SourceConcept = m.Concept(&quot;Order&quot;)

# Invalid: TargetConcept does not extend SourceConcept.
TargetConcept = m.Concept(&quot;NeedsReview&quot;)
m.define(TargetConcept(SourceConcept))

# Valid fix 1: make the target concept a subtype of SourceConcept.
TargetSubtype = m.Concept(&quot;OrderThatNeedsReview&quot;, extends=[SourceConcept])
m.define(TargetSubtype(SourceConcept))

# Valid fix 2: use AnyEntity when membership should accept mixed concept types.
TargetAnyEntity = m.Concept(&quot;NeedsReviewAny&quot;, extends=[AnyEntity])
m.define(TargetAnyEntity(SourceConcept))
</code></pre>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.7.13-470c23f</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.7.13-470c23f</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.7.13-470c23f</guid>
      <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.7.13-470c23f improves write-conflict errors and engine startup timeout handling.</description>
      <content:encoded><![CDATA[<p>Version 2026.7.13-470c23f of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a bug that occurred when two PyRel programs interacted with the same model at the same time. Previously, data synchronization could stall for an extended period of time before failing with a cryptic error. Now when this happens, data synchronization fails fast with a clear &quot;model is busy&quot; error.</p>
</li>
<li><p>Fixed a bug where engines recreated after a service restart could remain in the <code>PENDING</code> state indefinitely. Provisioning now stops when it reaches the timeout limit. When that happens, the attempt fails with a timeout error instead of hanging forever.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.20.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.20.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.20.1</guid>
      <pubDate>Thu, 09 Jul 2026 21:29:12 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.20.1 makes deployed Cortex tools start returning results faster and fixes queries that returned NULL for Snowflake columns with mixed-case or special-character names.</description>
      <content:encoded><![CDATA[<p>Version 1.20.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Deployed Cortex tools now start returning results faster.
Before this release, a deployed tool could spend noticeable time re-checking Snowflake schema information on every call before it ran the actual query.
Now PyRel reuses that information across calls, which reduces startup delay for repeated requests.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a bug where <a href="/api/python/v1.20/services/reasoners/client/reasonersclient_class#method-ensure"><code>ReasonersClient.ensure()</code></a> and <a href="/api/python/v1.20/services/reasoners/client_sync/reasonersclientsync_class#method-ensure"><code>ReasonersClientSync.ensure()</code></a> could silently reuse an existing prescriptive reasoner even after your configured settings had changed.
Before this release, calling <code>ensure(&quot;PRESCRIPTIVE&quot;)</code> after changing your reasoner size or settings could return the old, mismatched reasoner without any warning.
Now PyRel compares your configured settings against the existing reasoner before reusing it, and raises <a href="/api/python/v1.20/services/reasoners/errors/reasonerconflicterror_class"><code>ReasonerConflictError</code></a> when they do not match so you can resolve the conflict explicitly.</p>
</li>
<li><p>Fixed a bug where querying certain Snowflake columns returned <code>NULL</code> or a SQL error instead of your data.
This affected columns whose names use capital letters, special characters such as <code>.</code>, or a word that SQL reserves for its own use, such as <code>ORDER</code>.
Before this release, PyRel changed a name like <code>PrimaryAssetId</code> to all uppercase (<code>PRIMARYASSETID</code>) under the hood. Snowflake treats those as two different columns, so it looked for a column that didn&#39;t exist and returned <code>NULL</code>.
Now PyRel uses the column name exactly as it is stored, so these queries return the correct values.</p>
</li>
<li><p>Fixed a bug where a negated comparison could silently apply a different condition than the one you wrote.
Before this release, an expression such as <code>not_(Person.age &gt; 18)</code> could be stored and re-evaluated as <code>not_(Person.age)</code> instead. That selects entities with no recorded age, not entities under 18, and PyRel gave no indication that the condition had changed.
Now the comparison is always preserved exactly as written.</p>
</li>
<li><p>Fixed a <code>NameError</code> that could occur when using <a href="/api/python/v1.20/semantics/frontend/base/model_class#method-union"><code>Model.union()</code></a> to collect values from multiple properties.
Before this release, a union such as <code>m.union(Employee.email, Employee.phone)</code> could fail with <code>NameError: name &#39;Any&#39; is not defined</code>.
Now this expression executes correctly and returns the combined values.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.7.3-57280fc</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.7.3-57280fc</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.7.3-57280fc</guid>
      <pubDate>Wed, 08 Jul 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Custom automation must stop calling the removed app.finalize_upgrade() procedure because upgrades finalize automatically, and app activation now checks for incompatible Snowflake account settings.</description>
      <content:encoded><![CDATA[<p>Version 2026.7.3-57280fc of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>App activation now checks for Snowflake account-level settings that prevent the application from functioning correctly. If an incompatible setting is detected — for example, <code>PREVENT_UNLOAD_TO_INTERNAL_STAGES = TRUE</code>, which blocks the app from writing to its own internal stage — <code>relationalai.app.activate()</code> blocks activation and explains how to resolve the conflict. For recovery steps, see <a href="/manage/app/start-the-app#fix-app-activation-errors-caused-by-snowflake-account-settings">Fix app activation errors caused by Snowflake account settings</a>. You can run the following to skip these checks and proceed anyway:</p>
<pre><code class="language-sql">CALL relationalai.app.activate(ERROR_ON_UNSUPPORTED_ACCOUNT_FLAG =&gt; FALSE);
</code></pre>
</li>
<li><p>The application now cleans up unused references in the application&#39;s internal records of which Snowflake tables and views are configured as data stream sources. When a data stream is removed or reconfigured, its records can be left behind as orphans, causing them to accumulate over time and eventually prevent new data streams from being configured. New procedures are also available to inspect and remove these unused references manually:</p>
<ul>
<li><a href="/api/sql/app/reference_audit"><code>app.reference_audit()</code></a></li>
<li><a href="/api/sql/app/cleanup_unused_data_stream_references"><code>app.cleanup_unused_data_stream_references()</code></a></li>
</ul>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed an issue where reasoner setup could report a failure even though the reasoner was successfully provisioned due to errors in cleanup steps that occur after provisioning completes. These cleanup errors are now logged and ignored, so setup completes as expected.</li>
</ul>
<h2>Deprecations and Removals</h2>
<ul>
<li>Removed the previously deprecated <code>app.finalize_upgrade()</code> procedure. Upgrade finalization is now handled automatically, so there is no replacement. If you call <code>app.finalize_upgrade()</code> in custom automation, remove those calls to avoid errors.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.20.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.20.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.20.0</guid>
      <pubDate>Wed, 08 Jul 2026 10:35:07 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.20.0 adds a prefix field to DeploymentConfig so multiple Cortex agents can share one Snowflake schema, and improves the error message for unsupported operators in prescriptive problem expressions.</description>
      <content:encoded><![CDATA[<p>Version 1.20.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Multiple Cortex agents can now share the same Snowflake schema by assigning each a unique <code>prefix</code>. Previously, each agent required its own schema, leading to schema sprawl and management overhead. Now you can keep related agents together:</p>
<pre><code class="language-python">from relationalai.agent.cortex import DeploymentConfig

# Customer service agent
service_config = DeploymentConfig(
    database=&quot;APPS&quot;,
    schema=&quot;AGENTS&quot;,
    agent_name=&quot;customer_service&quot;,
    prefix=&quot;service&quot;,  # stored procedures: service_RAI_*
)

# Sales agent in the same schema
sales_config = DeploymentConfig(
    database=&quot;APPS&quot;,
    schema=&quot;AGENTS&quot;,
    agent_name=&quot;sales&quot;,
    prefix=&quot;sales&quot;,  # stored procedures: sales_RAI_*
)
</code></pre>
<p>Existing deployments without a <code>prefix</code> continue to work unchanged.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Unsupported operators in prescriptive problems now raise clearer error messages. When you use an operator like <code>%</code> or <code>//</code> in a <a href="/api/python/v1.20/semantics/reasoners/prescriptive/problem/problem_class"><code>Problem</code></a> expression, you get a helpful message that points you to fix the operator:</p>
<pre><code class="language-python"># Now raises a NotImplementedError because % is not supported
problem.add_constraint(quantity % 2 == 0)
</code></pre>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.19.4</title>
      <link>https://docs.relational.ai/release-notes/python/1.19.4</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.19.4</guid>
      <pubDate>Mon, 06 Jul 2026 21:52:44 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.19.4 makes predictive dataset diagrams easier to render and save and removes a dependency incompatible with Python 3.13.</description>
      <content:encoded><![CDATA[<p>Version 1.19.4 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Predictive dataset diagrams are now easier to render and save.
Before this release, you had to call <code>visualize_dataset()</code> and manually render the returned object.
Now you can call <a href="/api/python/v1.19/semantics/reasoners/predictive/estimator/gnn_class/#display_dataset_diagram"><code>display_dataset_diagram()</code></a> to show the diagram in a notebook, or <a href="/api/python/v1.19/semantics/reasoners/predictive/estimator/gnn_class/#save_dataset_diagram"><code>save_dataset_diagram(path)</code></a> to save it directly to a file such as <code>schema.svg</code>.</p>
</li>
<li><p>Removed the <code>snowflake-ml-python</code> dependency from the <code>relationalai</code> package because one of its transitive dependencies is not compatible with Python 3.13.
The <code>snowflake-ml-python</code> dependency was only included if you installed <code>relationalai</code> with the <code>[gnn]</code> extra, such as with <code>pip install relationalai[gnn]</code>.</p>
</li>
<li><p><a href="/api/cli/v1.19/config/explain/"><code>rai config:explain</code></a> output is now easier to scan.
Before this release, fields were listed in declaration order.
Now fields are sorted alphabetically across top-level, nested, dictionary, and profile sections.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.19.3</title>
      <link>https://docs.relational.ai/release-notes/python/1.19.3</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.19.3</guid>
      <pubDate>Thu, 02 Jul 2026 17:34:25 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.19.3 restores Snowflake table export via .into(Table(...)) and fixes an Unused variable declared error in expressions using the | operator.</description>
      <content:encoded><![CDATA[<p>Version 1.19.3 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a regression in 1.19.2 that broke exports into Snowflake destination tables with <a href="/api/python/v1.19/semantics/frontend/base/table_class"><code>Table</code></a> targets when you call <code>.into(Table(...))</code> on a query result.
This now works as expected.</p>
</li>
<li><p>Fixed an issue that caused expressions like <code>where(x | y).define(...)</code> to raise an <code>Unused variable declared</code> error when both sides of the <code>|</code> operator contained calculated values.
These expressions now evaluate to the expected value.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.6.29-a85c9fc</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.6.29-a85c9fc</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.6.29-a85c9fc</guid>
      <pubDate>Wed, 01 Jul 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Fixes data stream interruptions from transient CDC service suspensions and a jupyter-server XSS vulnerability in predictive reasoners&apos; notebook server conversion handlers.</description>
      <content:encoded><![CDATA[<p>Version 2026.6.29-a85c9fc of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Reduced latency for progress events during query execution, so PyRel users see more responsive progress indicators in interactive environments.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed an issue that caused CDC service suspensions during transient failures, helping prevent unexpected interruptions to stream syncing.</p>
</li>
<li><p>Fixed an unhandled error that occurred when attempting to delete a non-existent engine.</p>
</li>
<li><p>Fixed error propagation in reasoner management APIs so that meaningful diagnostic details are returned when an operation fails, rather than an empty error response.</p>
</li>
</ul>
<h2>Security</h2>
<ul>
<li>Upgraded <code>jupyter-server</code> to version 2.20.0 to address a cross-site scripting (XSS) vulnerability in predictive reasoners&#39; notebook server conversion handlers.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.19.2</title>
      <link>https://docs.relational.ai/release-notes/python/1.19.2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.19.2</guid>
      <pubDate>Wed, 01 Jul 2026 21:47:07 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.19.2 improves reasoner name validation.</description>
      <content:encoded><![CDATA[<p>Version 1.19.2 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Improved reasoner-name validation in <a href="/api/cli/v1.19/reasoners/create/"><code>rai reasoners create</code></a>.
Invalid names are now rejected earlier with a clearer message, instead of failing later during provisioning.
This makes naming mistakes easier to spot before reasoner setup starts.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed a name-resolution regression in <a href="/api/cli/v1.19/reasoners/create/"><code>rai reasoners create --name</code></a>.
Before 1.19.2, an invalid default reasoner name from configuration (for example, a username-derived fallback) could still block a valid explicit <code>--name</code> value.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.19.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.19.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.19.1</guid>
      <pubDate>Wed, 01 Jul 2026 16:49:07 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.19.1 fixes queries against quoted and case-sensitive Snowflake table names.</description>
      <content:encoded><![CDATA[<p>Version 1.19.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed queries against Snowflake tables declared with <a href="/api/python/v1.19/semantics/frontend/base/table_class"><code>Table</code></a> when the table name or stored column spelling requires quoting, including case-sensitive names and names that contain spaces, punctuation, and Unicode characters.
For example, the following query now resolves both the quoted table name and the quoted column name correctly:</p>
<pre><code class="language-python">from relationalai.semantics import Model

m = Model(&quot;demo&quot;)
orders = m.Table(&#39;&quot;table with spaces&quot;&#39;)

m.select(orders[&quot;id&quot;], orders[&quot;column one&quot;]).to_df()
</code></pre>
<p>Previously, this could raise a <code>RAIException</code> such as <code>[Unknown Table] Failed to fetch schema for table &#39;&quot;table with spaces&quot;&#39;.</code></p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.19.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.19.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.19.0</guid>
      <pubDate>Wed, 01 Jul 2026 13:28:00 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.19.0 fixes queries that read multiple fields from the same Property.</description>
      <content:encoded><![CDATA[<p>Version 1.19.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed queries that read two fields from the same multi-field <a href="/api/python/v1.19/semantics/frontend/base/property_class"><code>Property</code></a> in one <code>select()</code>, such as <code>select(invoice.total[&quot;currency&quot;], invoice.total[&quot;amount&quot;])</code>.
Before 1.19.0, PyRel could incorrectly return every combination of the fields&#39; values instead of keeping the original pairs together.
This bug only impacted <code>Property</code> instances and not <a href="/api/python/v1.19/semantics/frontend/base/relationship_class"><code>Relationship</code></a> instances, which always return the stored pairs correctly.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.18.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.18.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.18.0</guid>
      <pubDate>Tue, 30 Jun 2026 21:12:30 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.18.0 adds diagnosis reports to the rai doctor CLI command and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.18.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p><a href="/api/cli/v1.18/doctor/report"><code>rai doctor report</code></a> now generates a deterministic <code>diagnosis.md</code> summary and shows the same diagnosis in the debugger report browser.
Before 1.18.0, you had to inspect the collected artifacts yourself to identify likely configuration, Snowflake, deploy, schema-cache, trace, or collection problems.</p>
</li>
<li><p>PyRel now fails fast on undefined config references instead of ignoring them or failing later at runtime.
For example, a typo in <a href="/api/python/v1.18/config/config/config_class#param-active_profile"><code>active_profile</code></a> such as <code>active_profile: localm</code> now raises a clear validation error during config loading.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed <a href="/api/python/v1.18/semantics/std/math/clip"><code>math.clip()</code></a> so it returns the clipped value instead of <code>NULL</code> when the input falls below, within, or above the requested bounds.</p>
</li>
<li><p>Fixed how reasoner names are generated.
If you don&#39;t set custom reasoner names in your configuration, provisioning could previously fail when your username starts with a digit because the generated reasoner name was invalid.
PyRel now sanitizes the generated name automatically, for example by turning <code>12345</code> into <code>user_12345</code>.</p>
</li>
<li><p>Fixed nested <code>select()</code> values inside <code>union</code> and match branches, and fixed aggregates over scalar subquery values, so those query shapes return the expected rows instead of raising internal compiler or validation errors.</p>
</li>
<li><p>Fixed <a href="/api/python/v1.18/semantics/std/aggregates/rank"><code>rank()</code></a> queries that also return a related value in the same result.
Those queries now return the expected table and use <code>NULL</code> when the related value is missing instead of failing validation.</p>
</li>
<li><p>PyRel now raises an <code>Ambiguous concept usage</code> error when one rule reuses the same concept name as both a variable and a concept type in the same line.
For example, the following code now raises an error instead of silently misinterpreting the second line:</p>
<pre><code class="language-python">from relationalai.semantics import Model, String

m = Model(&quot;ambiguous&quot;)
A = m.Concept(&quot;A&quot;)
B = m.Concept(&quot;B&quot;, extends=[A])
C = m.Concept(&quot;C&quot;, extends=[A])
D = m.Concept(&quot;D&quot;, extends=[B, C])

A.id = m.Property(f&quot;{A} is identified by {String}&quot;)
A.identify_by(A.id)

m.define(A.new(m.data([
    {&quot;id&quot;: &quot;w&quot;},
    {&quot;id&quot;: &quot;x&quot;},
    {&quot;id&quot;: &quot;y&quot;},
    {&quot;id&quot;: &quot;z&quot;},
]).to_schema()))
m.define(B(A)).where(A.id.in_([&quot;w&quot;, &quot;x&quot;, &quot;z&quot;]))
m.define(C(A)).where(A.id.in_([&quot;w&quot;, &quot;y&quot;, &quot;z&quot;]))

# Unambiguous: B is a variable in both places.
m.define(D(B)).where(C(B))

# Ambiguous: B is variable in D(B) but a concept type in B(C).
m.define(D(B)).where(B(C))  # now raises &quot;Ambiguous concept usage&quot;
</code></pre>
<p>Previously, PyRel would silently define every entity of type <code>B</code> as a <code>D</code> in this case because the type expression <code>B(C)</code> doesn&#39;t constrain the variable <code>B</code> in <code>.define()</code> in any way.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.17.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.17.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.17.0</guid>
      <pubDate>Thu, 25 Jun 2026 20:27:36 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.17.0 adds relationship keyword arguments, supports per(...).product(...), and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.17.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added keyword field binding for <a href="/api/python/v1.17/semantics/frontend/base/relationship_class"><code>Relationship</code></a> calls.
For example, if a relationship has <code>src</code>, <code>transfer</code>, and <code>dst</code> fields, you can write:</p>
<pre><code class="language-python">Account.transferred_to(src=source, transfer=transfer, dst=destination)
</code></pre>
<p>In addition to not having to pass fields in order, you also get clearer errors for missing fields and unknown fields.</p>
</li>
<li><p>Added support for <a href="/api/python/v1.17/semantics/std/aggregates/product"><code>per(...).product(...)</code></a> to create a grouped product.
Before 1.17.0, only <code>product(...).per(...)</code> was supported.</p>
</li>
<li><p>Combined more <a href="/api/cli/v1.17/doctor/report"><code>rai doctor report</code></a> troubleshooting information into one zip file.
Before 1.17.0, support cases could require both <code>doctor_report_*.zip</code> from <code>rai doctor report</code> and a separate <code>oplog_report_*.zip</code> from <code>rai doctor report-oplog</code>.
Now <code>rai doctor report</code> includes that extra information in <code>doctor_report_*.zip</code>.</p>
</li>
</ul>
<h2>Bug Fixes and Diagnostics</h2>
<ul>
<li><p>Fixed cases where duplicated values in prescriptive <a href="/api/python/v1.17/semantics/std/aggregates/sum"><code>sum()</code></a> and <a href="/api/python/v1.17/semantics/std/aggregates/count"><code>count()</code></a> expressions inside a <a href="/api/python/v1.17/semantics/reasoners/prescriptive/problem/problem_class"><code>Problem</code></a> were counted once in the aggregate instead of multiple times as expected.</p>
</li>
<li><p>Fixed <a href="/manage/app/direct-access">Direct Access</a> for Snowflake Private Link accounts.</p>
</li>
<li><p>Fixed handling for cross-model mix-ups when code uses objects from one <a href="/api/python/v1.17/semantics/frontend/base/model_class"><code>Model</code></a> inside another <code>Model</code>.
Some of these cases previously resulted in empty results or confusing errors.
PyRel now raises a clear, direct error instead.</p>
</li>
<li><p>Improved the error shown when <a href="/api/python/v1.17/semantics/std/aggregates/top"><code>top()</code></a>, <a href="/api/python/v1.17/semantics/std/aggregates/bottom"><code>bottom()</code></a>, or <a href="/api/python/v1.17/semantics/std/aggregates/limit"><code>limit()</code></a> is used in places that require a single value, such as comparisons or property values.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.6.22-cd93f88</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.6.22-cd93f88</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.6.22-cd93f88</guid>
      <pubDate>Wed, 24 Jun 2026 13:53:31 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.6.22-cd93f88 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.6.22-cd93f88 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Performance and Stability Improvements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.16.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.16.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.16.0</guid>
      <pubDate>Tue, 23 Jun 2026 12:00:00 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.16.0 adds OplogConfig so you can opt in to recording model oplogs during deploys.</description>
      <content:encoded><![CDATA[<p>Version 1.16.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>You can now use <a href="/api/python/v1.16/config/config_fields/oplogconfig_class"><code>OplogConfig</code></a> to opt in to model oplog recording during deploys.
Set <code>oplog.enabled: true</code> so a successful <a href="/api/cli/v1.16/models/deploy"><code>rai models deploy</code></a> records the change in the model oplog.
That record then lets you use <a href="/api/cli/v1.16/models/pull"><code>rai models pull</code></a>, <a href="/api/cli/v1.16/models/branch"><code>rai models branch</code></a>, and <a href="/api/cli/v1.16/models/merge"><code>rai models merge</code></a> for that model.
Before 1.16.0, the public Python API docs did not expose this config section or this opt-in deploy behavior.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.15.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.15.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.15.0</guid>
      <pubDate>Wed, 17 Jun 2026 21:07:10 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.15.0 adds relationalai.semantics.alias() so you can give any value an output alias, including Python literals.</description>
      <content:encoded><![CDATA[<p>Version 1.15.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>You can now use <a href="/api/python/v1.15/semantics/alias"><code>alias()</code></a> to give any value an output alias, including Python literals such as <code>1</code>, which can&#39;t call <code>.alias()</code> directly.
Before 1.15.0, there was no top-level helper in <a href="/api/python/v1.15/semantics"><code>relationalai.semantics</code></a> to alias literal values.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.6.14-4f4ec3d</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.6.14-4f4ec3d</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.6.14-4f4ec3d</guid>
      <pubDate>Wed, 17 Jun 2026 14:11:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.6.14-4f4ec3d of the RAI Native App adds a transaction_attributes column to api.transactions for filtering transactions by query attributes.</description>
      <content:encoded><![CDATA[<p>Version 2026.6.14-4f4ec3d of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Added a <code>transaction_attributes</code> column to <a href="/api/sql/api/transactions"><code>api.transactions</code></a> so you can filter transactions by query attributes such as environment tags.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.14.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.14.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.14.0</guid>
      <pubDate>Tue, 16 Jun 2026 12:00:00 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.14.0 sends background job guidance to stderr instead of stdout, keeping script output cleaner.</description>
      <content:encoded><![CDATA[<p>Version 1.14.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fix</h2>
<ul>
<li>Job commands such as <a href="/api/cli/v1.14/jobs/create"><code>rai jobs create</code></a> now send background job guidance to stderr instead of stdout.
This keeps stdout cleaner for scripts. If your automation relied on those guidance lines, you may need to capture or redirect stderr.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.13.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.13.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.13.0</guid>
      <pubDate>Mon, 15 Jun 2026 18:10:06 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.13.0 adds SQL backend regex support, clearer rai doctor:report summaries, earlier Direct Access authenticator warnings, and correct DeploymentConfig.role handling.</description>
      <content:encoded><![CDATA[<p>Version 1.13.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now use <a href="/api/python/v1.13/semantics/std/re"><code>std.re</code></a> regex queries with the SQL backend, including <code>match()</code>, <code>search()</code>, <code>fullmatch()</code>, <code>findall()</code>, and <code>sub()</code>.
Before 1.13.0, the SQL backend did not support these regex operations.</p>
</li>
<li><p>The ZIP archive from <a href="/api/cli/v1.13/doctor/report"><code>rai doctor:report</code></a> now includes a readable <code>summary.md</code> file so you can quickly review status and key diagnostics.
Before 1.13.0, you had to inspect raw JSON, YAML, and CSV artifacts for that overview.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p><a href="/api/cli/v1.13/doctor"><code>rai doctor</code></a> now warns earlier when you use <code>direct_access: true</code> with an unsupported Snowflake authenticator and tells you how to fix it.
Before this fix, you might instead hit a later raw token-exchange error.</p>
</li>
<li><p>Deployments and refresh tasks now use the Snowflake role you set in <a href="/api/python/v1.13/config/config_deployment_fields/deploymentconfig_class#role"><code>DeploymentConfig.role</code></a>.
Before this fix, PyRel could ignore that setting and use a different role.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.12.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.12.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.12.0</guid>
      <pubDate>Wed, 10 Jun 2026 20:30:57 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.12.0 adds query support for aggregates.product() and expands diagnostics in rai doctor:report.</description>
      <content:encoded><![CDATA[<p>Version 1.12.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now use <a href="/api/python/v1.12/semantics/std/aggregates/product"><code>aggregates.product()</code></a> to compute the product of numeric values in PyRel queries.
Before 1.12.0, the standard aggregates module did not include a built-in product aggregate.</p>
</li>
<li><p><a href="/api/cli/v1.12/doctor/report"><code>rai doctor:report</code></a> now includes expanded diagnostics.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.11.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.11.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.11.0</guid>
      <pubDate>Tue, 09 Jun 2026 14:28:41 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.11.0 now stops at the first model compilation error.</description>
      <content:encoded><![CDATA[<p>Version 1.11.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fix</h2>
<ul>
<li>PyRel now stops at the first model compilation error.
Before this fix, PyRel could continue and fail later with a less clear error.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.10.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.10.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.10.0</guid>
      <pubDate>Tue, 09 Jun 2026 11:49:03 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.10.0 adds support for stddev_samp() in queries, improves rai doctor:report diagnostics, and fixes query, import, and Snowflake deployment issues.</description>
      <content:encoded><![CDATA[<p>Version 1.10.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now use <a href="/api/python/v1.10/semantics/std/aggregates/stddev_samp"><code>stddev_samp()</code></a> in PyRel queries to compute sample standard deviation.
Before 1.10.0, you had to compute it outside PyRel or build it from lower-level operations.</p>
</li>
<li><p><a href="/api/cli/v1.10/doctor/report"><code>rai doctor:report</code></a> now provides more detail when you troubleshoot deployment-role issues or share environment details with support.
It adds Snowflake task execute privilege diagnostics and richer version metadata.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Imports for the prescriptive and predictive reasoner packages now work on Python 3.11 or later.
Before this fix, imports could fail because of an invalid dataclass default.</p>
</li>
<li><p>SQL-backed <a href="/api/python/v1.10/semantics/select"><code>select()</code></a> queries no longer return unexpected duplicate rows when you use <code>distinct()</code>.</p>
</li>
<li><p>Some Snowflake deployments no longer fail when models read Snowflake-backed data sources through CDC.
Before this fix, deployments could materialize those inputs as unsupported dynamic tables instead of CDC-compatible tables with change tracking.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.6.7-1a518f4-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.6.7-1a518f4-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.6.7-1a518f4-1</guid>
      <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Adds experimental observability_preview metrics views for predictive and prescriptive reasoners.</description>
      <content:encoded><![CDATA[<p>Version 2026.6.7-1a518f4-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New features and enhancements</h2>
<ul>
<li><p>Added new views in the <code>observability_preview</code> schema that expose metrics for monitoring predictive and prescriptive reasoners.</p>
<p>New predictive reasoner views:</p>
<ul>
<li><code>PREDICTIVE_REASONER__CPU_UTILIZATION</code></li>
<li><code>PREDICTIVE_REASONER__MEMORY_UTILIZATION</code></li>
<li><code>PREDICTIVE_REASONER__GPU_UTILIZATION</code></li>
<li><code>PREDICTIVE_REASONER__GPU_MEMORY_UTILIZATION</code></li>
<li><code>PREDICTIVE_REASONER__ACTIVE_JOBS</code></li>
</ul>
<p>New prescriptive reasoner views:</p>
<ul>
<li><code>PRESCRIPTIVE_REASONER__CPU_UTILIZATION</code></li>
<li><code>PRESCRIPTIVE_REASONER__MEMORY_UTILIZATION</code></li>
<li><code>PRESCRIPTIVE_REASONER__ACTIVE_JOBS</code></li>
</ul>
<p>See the <a href="/api/sql/observability_preview/">observability_preview SQL API reference</a> for columns, example queries, and related views.</p>
</li>
<li><p>Improved error messages for failures when using Iceberg tables as data sources.</p>
</li>
</ul>
<h2>Bug fixes</h2>
<ul>
<li><p>Concurrent exports to Iceberg tables now produce a conflict error instead of silently writing duplicate data.</p>
</li>
<li><p>Fixed an issue that caused missing predictive reasoner logs.</p>
</li>
<li><p>Fixed a bug where predictive reasoners would not be automatically suspended after a service restart.</p>
</li>
<li><p>Fixed an issue where predictive reasoner startup could fail if a warehouse grant step failed.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.9.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.9.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.9.0</guid>
      <pubDate>Thu, 04 Jun 2026 23:12:11 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Concept.filter_by() and Ref.filter_by() still work in PyRel 1.9.0 but now emit deprecation warnings, so switch to .lookup() when updating your code.</description>
      <content:encoded><![CDATA[<p>Version 1.9.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Upgrade Notes</h2>
<ul>
<li>If your code uses <code>filter_by()</code> on <code>Concept</code> or <code>Ref</code>, it now emits a Python <code>DeprecationWarning</code> in 1.9.0.
Your existing code still works in 1.9.0.
Use <code>.lookup()</code> instead of <code>filter_by()</code> going forward.</li>
</ul>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Prescriptive <code>solve()</code> now helps you inspect solved models and diagnose infeasible ones.
Use <code>solve(sensitivity=True)</code> after solving to inspect solve diagnostics such as reduced costs and constraint sensitivity.
Use <code>solve(conflict=True)</code> to identify infeasibility conflicts, then check <code>solve_info().conflict_status</code>.</p>
</li>
<li><p>PyRel 1.9.0 improves CLI diagnostics.
<code>rai doctor</code> now prints live health checks, and <code>doctor:report</code> collects diagnostic artifacts for support.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a bug where queries using <code>top()</code>, <code>bottom()</code>, or <code>limit()</code> could fail with a SQL parser error.</p>
</li>
<li><p>When <code>raiconfig.yaml</code> contains placeholders, <code>rai doctor</code> now identifies the missing configuration instead of failing with a raw connection error.</p>
</li>
<li><p>If you use grouped optional aggregates over stored relationships, those Snowflake-backed queries now run correctly.
Before this fix, they could fail with <code>Unsupported subquery type cannot be evaluated</code>.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.6.1-38f8bad-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.6.1-38f8bad-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.6.1-38f8bad-1</guid>
      <pubDate>Wed, 03 Jun 2026 15:57:21 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.6.1-38f8bad-1 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.6.1-38f8bad-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Performance and Stability Improvements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.8.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.8.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.8.1</guid>
      <pubDate>Thu, 28 May 2026 10:46:54 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>The off-by-default LogicReasonerConfig.readonly_queries option can improve performance when you run multiple queries against the same model.</description>
      <content:encoded><![CDATA[<p>Version 1.8.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Added a new <a href="/api/python/v1.8/config/config_reasoners_fields/logicreasonerconfig_class/#readonly_queries"><code>LogicReasonerConfig.readonly_queries</code></a> config option that can help improve performance when you run multiple queries against the same model.
  It is disabled by default.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.5.24-a67d5bb</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.5.24-a67d5bb</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.5.24-a67d5bb</guid>
      <pubDate>Wed, 27 May 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.5.24-a67d5bb of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.5.24-a67d5bb of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.8.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.8.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.8.0</guid>
      <pubDate>Wed, 27 May 2026 20:52:49 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.8.0 now includes the packages needed for GNN workflows, runs independent Snowflake exports concurrently, and uses a stable load order for predictive GNN edge tables.</description>
      <content:encoded><![CDATA[<p>Version 1.8.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>A standard <code>relationalai</code> install now includes the packages needed for predictive reasoning workflows.
You no longer need to install using <code>pip install relationalai[gnn]</code>.</p>
</li>
<li><p>If a model contains multiple exports to Snowflake tables, independent exports are now run concurrently.</p>
</li>
</ul>
<h2>Bug Fix</h2>
<ul>
<li>Predictive GNN edge tables now load in a stable order.
<code>gnn.dataset.tables</code> indices are now deterministic across runs.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.7.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.7.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.7.1</guid>
      <pubDate>Fri, 22 May 2026 20:11:01 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.7.1 is available with bug fixes.</description>
      <content:encoded><![CDATA[<p>Version 1.7.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a bug that prevented the creation of concepts with spaces and other special characters in their names.</p>
</li>
<li><p>Fixed a bug that caused some users to see the following error:</p>
<pre><code>Uncaught exception of type &#39;STATEMENT_ERROR&#39; on line 88 at position 6 : Uncaught exception of type &#39;STATEMENT_ERROR&#39; on line 46 at position 0 : SQL compilation error:
Window function type [ROW_NUMBER] requires ORDER BY in window specification.
</code></pre>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.7.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.7.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.7.0</guid>
      <pubDate>Fri, 22 May 2026 09:28:08 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.7.0 adds Snowflake oauth_client_credentials authentication and a new rai reasoners sizes CLI command.</description>
      <content:encoded><![CDATA[<p>Version 1.7.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Snowflake connections now support <code>authenticator=&quot;oauth_client_credentials&quot;</code> for app-to-app OAuth flows. See <a href="/api/python/v1.7/config/connections/snowflake/oauthclientcredentialsauth_class/"><code>OAuthClientCredentialsAuth</code></a> for configuration details.</li>
<li>Added <a href="/api/cli/v1.7/reasoners/sizes/"><code>rai reasoners sizes</code></a> to inspect available reasoner sizes.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>PyRel now normalizes Snowflake object identifiers the same way that Snowflake does. This prevents errors that claim that existing objects can&#39;t be found.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.5.17-26db430-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.5.17-26db430-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.5.17-26db430-1</guid>
      <pubDate>Wed, 20 May 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.5.17-26db430-1 of the RAI Native App includes minor improvements to performance and stability.</description>
      <content:encoded><![CDATA[<p>Version 2026.5.17-26db430-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.6.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.6.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.6.0</guid>
      <pubDate>Wed, 20 May 2026 10:47:48 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.6.0 adds new rai clean CLI commands for cache and debugger cleanup.</description>
      <content:encoded><![CDATA[<p>Version 1.6.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Added cleanup commands under <code>rai clean</code>:<ul>
<li><a href="/api/cli/v1.6/clean/cache"><code>rai clean cache</code></a> removes the local schema cache file.</li>
<li><a href="/api/cli/v1.6/clean/debugger"><code>rai clean debugger</code></a> removes debugger run directories and trace logs.</li>
</ul>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.5.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.5.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.5.0</guid>
      <pubDate>Tue, 19 May 2026 12:41:30 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.5.0 adds a new rai doctor CLI command group for diagnostics, supports additional Snowflake connection settings in config, and includes several bug fixes.</description>
      <content:encoded><![CDATA[<p>Version 1.5.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added diagnostics CLI commands under <code>rai doctor</code>, including <a href="/api/cli/v1.5/doctor/report"><code>doctor:report</code></a> and <a href="/api/cli/v1.5/doctor/cache/check"><code>doctor:cache:check</code></a> for cache checks.</p>
</li>
<li><p>PyRel now accepts optional Snowflake connector and session settings in its Snowflake connection config, including <code>client_session_keep_alive</code>, <code>login_timeout</code>, <code>network_timeout</code>, <code>socket_timeout</code>, and <code>session_parameters</code>.
Before this change, you could not set these options through PyRel config and had to rely on Snowflake connector defaults.
Now you can tune long-running or idle-sensitive Snowflake connections from PyRel config.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p><a href="/api/python/v1.5/semantics/std/aggregates/cumsum_asc"><code>cumsum_asc()</code></a> now handles multiple sort keys correctly.
Before this change, cumulative sums could be wrong when you ordered by more than one sort key.</p>
</li>
<li><p>Graph validation now catches a few edge cases earlier.
Before this change, some invalid node types were not caught until later in the execution path.
Now you&#39;ll see those errors earlier.</p>
</li>
<li><p>Fixed a bug that caused weighted Jaccard or cosine similarity to behave inconsistently for zero-weight edges.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.4.2</title>
      <link>https://docs.relational.ai/release-notes/python/1.4.2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.4.2</guid>
      <pubDate>Fri, 15 May 2026 18:50:45 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.4.2 improves rai config use profile selection and fixes cleanup when model.keep is set to False.</description>
      <content:encoded><![CDATA[<p>Version 1.4.2 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><a href="/api/cli/v1.4/config/use"><code>rai config use</code></a> now supports interactive profile selection.
In non-interactive runs, the command still requires an explicit profile.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Setting <code>config.model.keep = False</code> on a <a href="/api/python/v1.4/semantics/frontend/base/model_class"><code>Model</code></a> now deletes the RAI resources on exit as intended.
Before this fix, the v1 execution path could silently keep the resources even when cleanup was requested.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.4.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.4.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.4.1</guid>
      <pubDate>Fri, 15 May 2026 11:27:13 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.4.1 adds predictive reasoning APIs and includes several bug fixes.</description>
      <content:encoded><![CDATA[<p>Version 1.4.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added a new predictive reasoning API under <a href="/api/python/v1.4/semantics/reasoners/predictive"><code>relationalai.semantics.reasoners.predictive</code></a>.
It includes <a href="/api/python/v1.4/semantics/reasoners/predictive/estimator/gnn_class"><code>GNN</code></a> for training, loading, registering, and predicting with Graph Neural Networks.</p>
</li>
<li><p><a href="/api/cli/v1.4/init"><code>rai init</code></a> now gives clearer step-by-step terminal guidance.
New config templates also default to browser-based Snowflake authentication instead of password placeholders.
For interactive Snowflake sign-in, see <a href="/build/guides/configuration/snowflake-auth#configure-external-browser-authentication">Configure external browser authentication</a>.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed prescriptive aggregate correctness bugs when defining a <a href="/api/python/v1.4/semantics/reasoners/prescriptive/problem/problem_class"><code>Problem</code></a>.</p>
</li>
<li><p>Fixed a recursion error caused by some expressions like <code>model.where(count(B) &gt;= 0).define(C.new(val=B))</code>.</p>
</li>
<li><p><a href="/api/cli/v1.4/reasoners/list"><code>rai reasoners:list</code></a> and the interactive reasoner picker no longer fail if the backend returns unknown reasoner types.</p>
</li>
<li><p><a href="/api/python/v1.4/semantics/reasoners/prescriptive/problem/problem_class#method-solve"><code>Problem.solve()</code></a> now sends numeric type metadata to the solver service.
This prevents float-valued MiniZinc solves from falling back to an integer-only path and failing with inexact conversion errors.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.5.11-57723fa</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.5.11-57723fa</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.5.11-57723fa</guid>
      <pubDate>Wed, 13 May 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.5.11-57723fa of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.5.11-57723fa of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor performance and stability improvements.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.3.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.3.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.3.1</guid>
      <pubDate>Wed, 13 May 2026 15:50:19 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.3.1 includes a bug fix for identity field handling in Concept.new().</description>
      <content:encoded><![CDATA[<p>Version 1.3.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed a bug where <a href="/api/python/v1.3/semantics/frontend/base/concept_class#method-new"><code>Concept.new()</code></a> could treat entities with different identity field names as the same entity if the values matched.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.3.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.3.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.3.0</guid>
      <pubDate>Wed, 13 May 2026 11:26:07 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.3.0 adds new rai diagnose, rai whoami, and rai version CLI commands for troubleshooting and environment checks, plus enhanced prescriptive problem display options.</description>
      <content:encoded><![CDATA[<p>Version 1.3.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added three CLI commands for troubleshooting and environment checks:</p>
<ul>
<li><a href="/api/cli/v1.3/version"><code>rai version</code></a> for a quick version check or <code>--verbose</code> output with runtime and install details.</li>
<li><a href="/api/cli/v1.3/whoami"><code>rai whoami</code></a> to confirm which identity and profile the CLI is using, or <code>--resolve</code> to compare that with the server-resolved user.</li>
<li><a href="/api/cli/v1.3/diagnose"><code>rai diagnose</code></a> to capture version, config, and connectivity diagnostics in one command, with optional JSON or YAML output for automation and support workflows.</li>
</ul>
</li>
<li><p><a href="/api/python/v1.3/semantics/reasoners/prescriptive/problem/problem_class#method-display"><code>Problem.display()</code></a> now supports <code>where=</code> and <code>limit=</code> arguments so you can inspect a filtered subset of rows or cap the output instead of printing the full problem summary.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.2.2</title>
      <link>https://docs.relational.ai/release-notes/python/1.2.2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.2.2</guid>
      <pubDate>Thu, 07 May 2026 20:59:36 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.2.2 adds more consistent CLI JSON and YAML output, new wait controls for long-running workflows, and Cortex agent deployment diagnostics.</description>
      <content:encoded><![CDATA[<p>Version 1.2.2 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>More <a href="/api/cli/v1.2">RAI CLI</a> commands now support JSON and YAML output options, and these output formats has been standardizes across commands for easier integration with automation scripts.</p>
<p>The following commands now all support <code>--output json</code> and <code>--output yaml</code>:</p>
<ul>
<li><a href="/api/cli/v1.2/commands"><code>rai commands</code></a></li>
<li><a href="/api/cli/v1.2/jobs/events"><code>rai jobs events</code></a></li>
<li><a href="/api/cli/v1.2/reasoners/list"><code>rai reasoners list</code></a></li>
</ul>
</li>
<li><p>Added a new <a href="/api/cli/v1.2/reasoners/wait"><code>rai reasoners wait</code></a> command that blocks until a reasoner is <code>READY</code>.
In addition, the <a href="/api/cli/v1.2/reasoners/create"><code>rai reasoners create</code></a> and <a href="/api/cli/v1.2/reasoners/resume"><code>rai reasoners resume</code></a> commands now support <code>--wait</code> and <code>--no-wait</code> options.</p>
</li>
<li><p><a href="/api/python/v1.2/agent/cortex#diagnostics">Cortex agent deployment diagnostics</a> now help you validate your Snowflake setup before deployment:</p>
<ul>
<li>Use <a href="/api/python/v1.2/agent/cortex/cortex_agent_manager/cortexagentmanager_class#method-preflight"><code>CortexAgentManager.preflight()</code></a> to surface missing permission grants and source objects in one pass.</li>
<li>Use <a href="/api/python/v1.2/agent/cortex/cortex_agent_manager/cortexagentmanager_class#method-print_setup_sql"><code>CortexAgentManager.print_setup_sql()</code></a> to generate the matching <code>GRANT</code> block.</li>
<li>Run <code>python -m relationalai.agent.cortex.diagnostics</code> to perform the same checks from the command line.</li>
</ul>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed a bug in <a href="/api/python/v1.2/agent/cortex">relationalai.agent.cortex</a> that could cause 404 errors during deployment.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.2.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.2.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.2.1</guid>
      <pubDate>Wed, 06 May 2026 16:59:23 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.2.1 adds several new CLI commands and features for managing configuration profiles.</description>
      <content:encoded><![CDATA[<p>Version 1.2.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>PyRel now makes <a href="/build/guides/configuration/files#use-profiles-to-manage-multiple-configurations">configuration profiles</a> easier to use from the CLI:</p>
<ul>
<li>You can override the active profile for a single CLI command using the <code>--profile</code> option or the <code>RAI_PROFILE</code> environment variable.</li>
<li>Use new CLI commands to manage profiles:<ul>
<li><a href="/api/cli/v1.2/config/profiles"><code>rai config profiles</code></a> to list available profiles</li>
<li><a href="/api/cli/v1.2/config/current"><code>rai config current</code></a> to check which profile is active</li>
<li><a href="/api/cli/v1.2/config/use"><code>rai config use</code></a> to change the <code>active_profile</code> in your config file</li>
</ul>
</li>
</ul>
</li>
<li><p>The CLI also gives clearer feedback when:</p>
<ul>
<li>No profile is selected</li>
<li>A requested profile does not exist</li>
<li>An environment override takes precedence over the <code>active_profile</code> in your config</li>
</ul>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.5.4-535f669-3</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.5.4-535f669-2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.5.4-535f669-2</guid>
      <pubDate>Tue, 05 May 2026 21:00:27 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.5.4-535f669-3 of the RAI Native App includes minor improvements to performance and stability.</description>
      <content:encoded><![CDATA[<p>Version 2026.5.4-535f669-3 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.2.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.2.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.2.0</guid>
      <pubDate>Tue, 05 May 2026 15:31:24 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.2.0 adds easier CLI navigation, directed graph support in Graph.cosine_similarity(), and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.2.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>The <a href="/api/cli/v1.2"><code>rai</code></a> CLI now supports space-separated subcommands such as <a href="/api/cli/v1.2/jobs/list"><code>rai jobs list</code></a> and <a href="/api/cli/v1.2/reasoners/list"><code>rai reasoners list</code></a>.
Existing <code>rai jobs:list</code>-style commands still work, but interactive shells now show a one-time deprecation hint so you can migrate at your own pace.</p>
</li>
<li><p><a href="/api/cli/v1.2/completion/install"><code>rai completion install</code></a> adds shell completion setup for bash, zsh, and fish, and <a href="/api/cli/v1.2/commands"><code>rai commands</code></a> gives you a browsable view of the available CLI command tree.</p>
</li>
<li><p><a href="/api/python/v1.2/semantics/reasoners/graph/core/graph_class#method-cosine_similarity"><code>Graph.cosine_similarity()</code></a> now supports directed graphs.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>In scripts, CI, and other non-interactive runs, PyRel now shows the full error details before the final <code>RAIException</code> when type inference or similar compiler checks fail.
Before, these failed checks could stop with only a generic <code>see above for details</code> message with the real diagnostic missing.</p>
</li>
<li><p><a href="/api/python/v1.2/semantics/reasoners/prescriptive/problem/problem_class#method-solve_for"><code>Problem.solve_for()</code></a> now works when you solve for an inherited property or relationship.
Prior to this fix, if a <code>Parent</code> concept defines a <code>Parent.foo</code> property and the <code>Sub</code> concept inherits it by extending <code>Parent</code>, <code>solve_for(Sub.foo)</code> could raise a <code>TypeError</code>.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.1.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.1.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.1.1</guid>
      <pubDate>Thu, 30 Apr 2026 23:22:20 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel version 1.1.1 makes pagination clearer in the rai jobs:list and rai reasoners:list CLI commands, and adds upgrade notices to all CLI commands when your installed relationalai version is out of date.</description>
      <content:encoded><![CDATA[<p>Version 1.1.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p><a href="/api/cli/v1.1/jobs/list"><code>rai jobs:list</code></a> and <a href="/api/cli/v1.1/reasoners/list"><code>rai reasoners:list</code></a> now make pagination explicit when you use <code>--limit</code> and <code>--offset</code>.
Before, paginated table output could look like a complete result set even when it only showed one slice.
Now the CLI adds a footer when needed, including a copyable next-page command when more results may be available and a clearer message when an offset is past the end of the result set.</p>
</li>
<li><p><a href="/api/cli/v1.1"><code>rai</code></a> now checks whether a newer PyRel release is available and shows an upgrade prompt when your installed version is behind.
Standard CLI invocations refresh a cached check in the background, and <code>rai --version</code> checks synchronously so the notice can appear immediately.
The notice is suppressed for JSON output, CI, non-interactive runs, and by setting <code>RAI_NO_UPDATE_CHECK=1</code> in your environment variables.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.4.27-2ba1778</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.4.27-2ba1778</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.4.27-2ba1778</guid>
      <pubDate>Wed, 29 Apr 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.4.27-2ba1778 of the RAI Native App includes minor improvements to performance and stability.</description>
      <content:encoded><![CDATA[<p>Version 2026.4.27-2ba1778 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.1.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.1.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.1.0</guid>
      <pubDate>Wed, 29 Apr 2026 17:05:41 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel version 1.1.0 adds directed graph support for Graph.jaccard_similarity() and fixes a bug in the CLI.</description>
      <content:encoded><![CDATA[<p>Version 1.1.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><a href="/api/python/v1.1/semantics/reasoners/graph/core/graph_class#method-jaccard_similarity"><code>Graph.jaccard_similarity()</code></a> now supports directed graphs, including weighted directed graphs.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed jobs filtering in methods such as <a href="/api/python/v1.1/services/jobs/client/jobsclient_class#method-list"><code>JobsClient.list()</code></a> and commands such as <a href="/api/cli/v1.1/jobs/list"><code>rai jobs:list</code></a>.
Before, if you ran them with the reasoner type set to <code>Predictive</code> or <code>Prescriptive</code>, the output could leave out matching jobs when PyRel was configured for <a href="/build/guides/configuration/snowflake-auth#enable-direct-access">Direct Access</a>.
Now those jobs are included, as expected.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.19</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.19</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.19</guid>
      <pubDate>Tue, 28 Apr 2026 08:46:31 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.19 removes the currently unsupported std.re APIs and speeds up Graph.is_acyclic() on many large graphs.</description>
      <content:encoded><![CDATA[<p>Version 1.0.19 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><a href="/api/python/v1.0/semantics/reasoners/graph/core/graph_class#method-is_acyclic"><code>Graph.is_acyclic()</code></a> is now much faster on many large graphs, especially large trees and grids.
In benchmarks for the change, the runtime for the largest tested grid graph dropped from about 751 seconds to 47 seconds.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Removed unsupported <code>std.re</code> APIs.
These APIs would raise errors if you tried to use them.
All documentation pertaining to <code>std.re</code> has also been removed.</p>
</li>
<li><p>Fixed active profile selection so that the <code>RAI_ACTIVE_PROFILE</code> environment variable takes precedence over <code>active_profile</code> in <code>raiconfig.yaml</code>.</p>
</li>
<li><p>Fixed prescriptive models that combined filtered aggregates in one expression.
Before, PyRel could leak one aggregate&#39;s filter into another, so objectives and constraints could silently drop instead of being sent to the solver.
For example:</p>
<pre><code class="language-python">from relationalai.semantics import Float, Integer, Model
from relationalai.semantics.reasoners.prescriptive import Problem

model = Model(&quot;ScopedAggregates&quot;)
X = model.Concept(&quot;X&quot;, identify_by={&quot;i&quot;: Integer})
X.v = model.Property(f&quot;{X} has {Float:v}&quot;)

model.define(X.new(i=1), X.new(i=2))

problem = Problem(model, Float)
problem.solve_for(X.v, name=[&quot;v&quot;, X.i], lower=0, upper=10)

v = Float.ref()
problem.satisfy(model.require(sum(v).where(X.v(v), X.i == 1) == 1.0))
problem.satisfy(model.require(sum(v).where(X.v(v), X.i == 2) == 4.0))

# The bug was triggered by combining two filtered aggregates in one expression.
problem.minimize(sum(X.v).where(X.i == 1) + sum(X.v).where(X.i == 2))
problem.satisfy(model.require(sum(X.v).where(X.i == 1) &lt;= sum(X.v).where(X.i == 2)))

problem.solve(&quot;highs&quot;)

print(model.select(problem.num_min_objectives().alias(&quot;objective_count&quot;)).to_df())
print(model.select(problem.num_constraints().alias(&quot;constraint_count&quot;)).to_df())
print(&quot;objective_value:&quot;, problem.solve_info().objective_value)
</code></pre>
<p>Output before the fix:</p>
<pre><code class="language-text">  objective_count
0                0
  constraint_count
0                 2
objective_value: 0.0
</code></pre>
<p>Output after the fix:</p>
<pre><code class="language-text">  objective_count
0                1
  constraint_count
0                 3
objective_value: 5.0
</code></pre>
</li>
<li><p>Fixed <code>model.data()</code> calls created on the same source line, such as inside a loop.
<code>model.data()</code> creates a temporary data source each time you call it.
Before, if two calls happened on the same line, PyRel could mistake them for the same source.
That could make later queries fail even when the input data was valid.</p>
<p>For example:</p>
<pre><code class="language-python">from relationalai.semantics import Integer, Model, String

m = Model(&quot;DataLoop&quot;)
Item = m.Concept(&quot;Item&quot;, identify_by={&quot;id&quot;: Integer, &quot;name&quot;: String})

batches = [
    pd.DataFrame([(1, &quot;a&quot;), (2, &quot;b&quot;)], columns=[&quot;id&quot;, &quot;name&quot;]),
    pd.DataFrame([(3, &quot;c&quot;), (4, &quot;d&quot;)], columns=[&quot;id&quot;, &quot;name&quot;]),
]

for batch in batches:
    m.define(Item.new(m.data(batch).to_schema()))

print(m.select(Item.id, Item.name).to_df())
</code></pre>
<p>Output before the fix:</p>
<pre><code class="language-text">RelQueryError: Query error
</code></pre>
<p>Output after the fix:</p>
<pre><code class="language-text">  id name
0  1   a
1  2   b
2  3   c
3  4   d
</code></pre>
<p>Now PyRel gives each same-line data source its own deterministic sequence number, so queries compile and run correctly.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.18</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.18</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.18</guid>
      <pubDate>Mon, 27 Apr 2026 16:42:02 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.18 adds support for passing an existing Snowpark session to create_config() and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.0.18 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>You can now pass an existing Snowpark session to <code>create_config()</code> with <a href="/api/python/v1.0/config/config/create_config#param-snowflake_session"><code>snowflake_session=</code></a>.</p>
<p>For example:</p>
<pre><code class="language-python">from snowflake.snowpark import Session
from relationalai.config import create_config

snowflake_connection_parameters = {...}
snowpark_session = Session.builder.configs(snowflake_connection_parameters).create()

config = create_config(snowflake_session=snowpark_session)
assert config.get_session() is snowpark_session
</code></pre>
<p>:::note
If you already load config from <code>raiconfig.yaml</code> or another supported config source, queries use the injected session instead of the Snowflake connection from that config.
:::</p>
<p>This change makes it easier to use PyRel in environments where you already have a Snowpark session.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed nested lookups that could drop rows when the inner lookup had no match.
Before, PyRel could skip rows instead of keeping the row and showing <code>NULL</code> for the missing value.
For example:</p>
<pre><code class="language-python">from relationalai.semantics import Integer, Model, String

m = Model(&quot;CustomerModel&quot;)

Customer = m.Concept(&quot;Customer&quot;, identify_by={&quot;id&quot;: Integer})
Customer.name = m.Property(f&quot;{Customer} has name {String:name}&quot;)
ReferralCode = m.Relationship(f&quot;{Integer:customer_id} maps to {String:referral_code}&quot;)

m.define(
    Customer.new(id=1, name=&quot;Alice&quot;),
    Customer.new(id=2, name=&quot;Bob&quot;),
    ReferralCode(1, &quot;ABC123&quot;)
)

customer_id = Integer.ref()
code = String.ref()

q = (
  m.where(
    Customer.id == customer_id,
    referral_code := m.where(ReferralCode(customer_id, code)).select(code),
  )
  .select(Customer.name, referral_code.alias(&quot;referral_code&quot;))
)

print(q.to_df())
</code></pre>
<p>Output before the fix:</p>
<pre><code class="language-text">  name referral_code
0 Alice ABC123
</code></pre>
<p>Output after the fix:</p>
<pre><code class="language-text">  name referral_code
0 Alice ABC123
1 Bob   NULL
</code></pre>
</li>
<li><p>Fixed <code>datetime.date.range()</code> and <code>datetime.datetime.range()</code> when the <code>end</code> value comes from a DSL value like a <code>Concept</code>, <code>Property</code> or <code>Relationship</code> instead of a regular Python date or datetime.
Before, the query could return one combined date range instead of a separate date range for each entity.
For example:</p>
<pre><code class="language-python">from relationalai.semantics import Date, Integer, Model, define, select, std

m = Model(&quot;dates&quot;)

Foo = m.Concept(&quot;Foo&quot;, identify_by={&quot;id&quot;: Integer})
Foo.end_date = m.Property(f&quot;{Foo} has {Date:end_date}&quot;)

define(
    Foo.new(id=1, end_date=dt.date(2020, 1, 2)),
    Foo.new(id=2, end_date=dt.date(2020, 1, 4)),
)

select(
    std.datetime.date.range(dt.date(2020, 1, 1), Foo.end_date, freq=&quot;D&quot;)
).to_df()
</code></pre>
<p>  Before, that query could return one combined date range instead of a separate date range for each <code>Foo</code> row:</p>
<pre><code class="language-text"># Before the fix:
  result
0 2020-01-01
1 2020-01-02
2 2020-01-03
3 2020-01-04
</code></pre>
<p>  Now there are duplicate dates because both <code>Foo</code> rows contribute to the result:</p>
<pre><code class="language-text"># After the fix:
  result
0 2020-01-01
2 2020-01-02
3 2020-01-02
4 2020-01-03
5 2020-01-04
</code></pre>
</li>
<li><p>Fixed inferred field naming for numeric aliases such as <code>Integer</code>.
Before, if you let PyRel infer a field name from one of those types, it would generate a name like <code>number_38_0</code> instead of <code>integer</code>, so string lookups such as <code>Scores[&quot;integer&quot;]</code> would fail with a <code>KeyError</code> exception.
For example:</p>
<pre><code class="language-python">from relationalai.semantics import Integer, Model, String

m = Model(&quot;scores&quot;)
# The Integer field is unnamed here, so PyRel infers its field name.
Scores = m.Relationship(f&quot;{String:name} has {Integer}&quot;)

# Prior to the fix, this lookup would raise a KeyError.
m.select(Scores[&quot;integer&quot;]).to_df()
</code></pre>
<p>Now PyRel infers the correct field name, so <code>Scores[&quot;integer&quot;]</code> resolves to the <code>Integer</code> field.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.17</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.17</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.17</guid>
      <pubDate>Fri, 24 Apr 2026 20:34:07 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.17 rejects Relationship, Property, Concept, and Table as property or relationship names on concepts, so rename those attributes before upgrading.</description>
      <content:encoded><![CDATA[<p>Version 1.0.17 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>PyRel now supports <a href="/api/python/v1.0/semantics/std/math/round"><code>math.round()</code></a>.
You can round to the nearest integer or to a specified number of decimal places inside semantics expressions.</p>
</li>
<li><p><a href="/api/cli/v1.0/debugger"><code>rai debugger</code></a> now makes compiler output easier to inspect.
You can choose which compiler steps to show in one dialog, see clearer color coding, and view job IDs directly in the UI.
Before, you had to toggle those steps one by one and query cards did not show the job ID.</p>
</li>
<li><p>You can no longer create a property or relationship on a concept named <code>Relationship</code>, <code>Property</code>, <code>Concept</code>, or <code>Table</code>.
If you try to use one of these names, PyRel raises an error such as:</p>
<pre><code class="language-text">&#39;Relationship&#39; is a reserved name and cannot be used as a relationship name on concept &#39;Person&#39;.
</code></pre>
<p>For example:</p>
<pre><code class="language-python">from relationalai.semantics import Model, String

m = Model()
Person = m.Concept(&quot;Person&quot;)

# Allowed
Person.relationship = m.Property(f&quot;{Person} has {String:relationship}&quot;)

# Raises the reserved-name error
Person.Relationship = m.Property(f&quot;{Person} has {String:relationship}&quot;)
</code></pre>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed a slowdown when you ran the first query on a second model in the same Python process.
Before, PyRel could check data sources from all models instead of only the model you were querying.
Now each model keeps its own data sources, so queries check only the relevant ones.</p>
</li>
<li><p>Fixed exports to Snowflake tables when you declare the destination schema with <a href="/api/python/v1.0/semantics/frontend/base/model_class#method-table"><code>Model.Table()</code></a>.
Before, if the destination schema had more columns than the current export produced, PyRel could leave out the extra declared columns.
Now it keeps those columns and fills missing values with <code>NULL</code>, so later writes to the same table can still succeed.</p>
<p>For example:</p>
<pre><code class="language-python">from relationalai.semantics import Integer, Model, String

m = Model(&quot;MyModel&quot;)
Order = m.Concept(&quot;Order&quot;, identify_by={&quot;id&quot;: Integer})
Order.status = m.Property(f&quot;{Order} has {String:status}&quot;)

# This query exports only order_id and status.
q = m.select(Order.id.alias(&quot;order_id&quot;), Order.status)

# The destination schema also declares shipped_at.
out = m.Table(
    &quot;ANALYTICS.PUBLIC.ORDER_EXPORT&quot;,
    schema={
        &quot;order_id&quot;: Integer,
        &quot;status&quot;: String,
        &quot;shipped_at&quot;: String,
    },
)

q.into(out).exec()
# In 1.0.17, shipped_at stays in the exported Snowflake table and is filled with NULL.
</code></pre>
</li>
<li><p>Fixed fully qualified Snowflake names that use quoted lowercase or mixed-case object names.
Before, PyRel could strip the quotes from names such as <code>ANALYTICS.PUBLIC.&quot;orders&quot;</code> or <code>ANALYTICS.PUBLIC.&quot;SalesSummary&quot;</code>.
That could make Snowflake read them as <code>ANALYTICS.PUBLIC.ORDERS</code> or <code>ANALYTICS.PUBLIC.SALESSUMMARY</code>, which might be different objects or might not even exist.
Now PyRel preserves those quotes.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.16</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.16</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.16</guid>
      <pubDate>Thu, 23 Apr 2026 13:32:47 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.16 speeds up repeated Graph API calls, improves data security, and fixes several property and concept inheritance issues.</description>
      <content:encoded><![CDATA[<p>Version 1.0.16 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Performance and Reliability</h2>
<ul>
<li><p>Repeated Graph API calls are now faster.
When you call the same graph method with the same arguments, PyRel reuses the earlier graph relationship instead of rebuilding it.
This applies to methods such as <code>reachable()</code>, degree and neighbor methods, and several similarity, clustering, and centrality methods.
See <a href="/build/guides/reasoning/graph/run-an-algorithm">Run a graph algorithm</a> and the <a href="/api/python/v1.0/semantics/reasoners/graph/core/graph_class"><code>Graph</code></a> API reference for details.</p>
</li>
<li><p><a href="/api/python/v1.0/semantics/reasoners/prescriptive/problem/problem_class#method-solve"><code>Problem.solve()</code></a> now omits variable and expression when sending jobs to the prescriptive reasoner.
This helps avoid exposing business data through generated names.
If you need those names in printed solver output, set <code>print_format</code> to a format such as <code>lp</code>, <code>mps</code>, or <code>moi</code>.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed property lookups in concept hierarchies with multiple parents.
Before, when implicit properties were enabled, PyRel could create the property on the wrong parent and return missing or incorrect data.
Now it uses the declared property instead.
See <a href="/build/guides/modeling/declare-relationships-and-properties">Declare relationships and properties</a>.</p>
</li>
<li><p>PyRel now warns about possible typos in implicitly created properties.
Before, a near-match property name could silently create a new property.
Now PyRel points out the likely mistake sooner. For example, if you access <code>Person.friend</code> after declaring <code>Person.friends</code>, PyRel warns <code>Did you mean: friends</code>.</p>
</li>
<li><p>Fixed supertype membership for derived subtypes.
Before, some subtype facts did not propagate all the way up the inheritance chain, so counts and membership queries on parent concepts could be incomplete.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.4.19-001506c-3</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.4.19-001506c-3</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.4.19-001506c-3</guid>
      <pubDate>Wed, 22 Apr 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.4.19-001506c-3 of the RAI Native App includes minor improvements to performance and stability.</description>
      <content:encoded><![CDATA[<p>Version 2026.4.19-001506c-3 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.15</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.15</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.15</guid>
      <pubDate>Tue, 21 Apr 2026 17:02:41 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.15 adds the RAI_ACTIVE_PROFILE env var, reduces Model.Table() schema fetch overhead, and fixes several configuration, debugger, and Model.data() issues.</description>
      <content:encoded><![CDATA[<p>Version 1.0.15 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Added support for a <code>RAI_ACTIVE_PROFILE</code> environment variable as a way to select the active profile.
You can now set the active profile with <code>RAI_ACTIVE_PROFILE=&lt;profile_name&gt;</code> in addition to <code>active_profile</code> in <code>raiconfig.yaml</code>.
See <a href="/build/guides/configuration/files/#use-profiles-to-manage-multiple-configurations">Use profiles to manage multiple configurations</a> for details.</li>
</ul>
<h2>Performance and Reliability</h2>
<ul>
<li><p>Reduced <a href="/api/python/v1.0/semantics/frontend/base/model_class#method-table"><code>Model.Table()</code></a> overhead on large Snowflake schemas.
Before, PyRel could scan the whole schema on each lookup.
Now PyRel fetches metadata one table at a time, which reduces cold-start overhead when a model touches many tables in a large schema.
For background on declaring Snowflake sources, see <a href="/build/guides/modeling/declare-data-sources#use-a-snowflake-table-with-modeltable">Declare data sources</a>.</p>
</li>
<li><p>Improved behavior on read-only notebook and container file systems.
Before, PyRel could fail while writing caches or trace files with misleading errors.
Now it falls back to a writable temporary directory in those environments.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed Snowflake authentication failures that could surface as a misleading <code>No default Session</code> error.
PyRel now reports the underlying Snowflake auth failure when it cannot create a new session.</p>
</li>
<li><p>Fixed a startup crash in <a href="/api/cli/v1.0/debugger"><code>rai debugger</code></a>.
Before, some launches could fail with <code>RuntimeError: You must call ui.run() to start the server</code>.
Now the debugger starts without that reload-related crash.</p>
</li>
<li><p>Fixed <a href="/api/python/v1.0/semantics/frontend/base/model_class#method-data"><code>Model.data()</code></a> so rows with mixed integer and floating-point columns preserve integer values.
Before, some integer fields could be upcast and show up as values like <code>1.0</code> in query results.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.14</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.14</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.14</guid>
      <pubDate>Thu, 16 Apr 2026 17:22:19 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.14 improves the experience using PyRel in notebooks, expands CLI and reasoner configuration options, and fixes several query and data-handling bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.0.14 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Improved notebook support.
Before, rerunning notebook cells could leave behind earlier model state, and diagnostics were less notebook-aware.
Now PyRel cleans up prior model declarations more reliably across reruns and renders diagnostics inline in notebooks when possible.</p>
</li>
<li><p>Added reasoner-specific connection overrides in <code>raiconfig.yaml</code>.
You can now set <code>reasoners.&lt;type&gt;.connection</code> so a specific reasoner uses a different connection than the global <code>default_connection</code>.
For broader reasoner configuration, see <a href="/build/guides/configuration/reasoners">Configure reasoners</a>.</p>
</li>
<li><p>Added the <a href="/api/cli/v1.0/debugger"><code>rai debugger</code></a> CLI command.</p>
</li>
<li><p>Added pagination to <a href="/api/cli/v1.0/jobs/list"><code>jobs:list</code></a> and <a href="/api/cli/v1.0/reasoners/list"><code>reasoners:list</code></a>.
Use <code>--limit</code> and <code>--offset</code> to control large result sets.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed <a href="/api/python/v1.0/semantics/frontend/base/model_class#method-data"><code>model.data()</code></a> so DataFrame columns with PyRel <a href="/api/python/v1.0/semantics/frontend/core/int128"><code>Int128</code></a> extension dtypes are inferred as <code>Integer</code> instead of falling back to <code>Any</code>.
Before, DataFrames with those columns could fail type inference after round-tripping results back into <code>model.data()</code>.
Now those inputs compile without requiring a manual cast.</p>
</li>
<li><p>Fixed correctness issues in unary relationships.
Before, queries against unary relationships could produce incorrect results, such as over-counting.</p>
</li>
<li><p>Fixed <a href="/api/python/v1.0/semantics/std/aggregates/rank_asc"><code>rank_asc()</code></a> and <a href="/api/python/v1.0/semantics/std/aggregates/rank_desc"><code>rank_desc()</code></a> when used with <a href="/api/python/v1.0/semantics/distinct"><code>distinct()</code></a>.
Before, duplicate values were not always deduplicated before ranking, so repeated values could still be ranked separately instead of once as unique values.
Now queries that use these ranking functions with <code>distinct()</code> reliably rank unique values after deduplication.</p>
</li>
<li><p>Fixed an issue where property names could get renamed in query results if the property name contains spaces or special characters like parentheses.
This happened when a property was auto-created from a table column name with spaces or parentheses, like <code>height(cm)</code> or <code>full name</code>.
Previously, these names could get transformed to <code>height_cm</code> or <code>full_name</code> in results columns, which could cause confusion when working with the results.
Now, property names are preserved as-is in results.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.4.13-d558733</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.4.13-d558733</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.4.13-d558733</guid>
      <pubDate>Wed, 15 Apr 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.4.13-d558733 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.4.13-d558733 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.4.6-dde787d</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.4.6-dde787d</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.4.6-dde787d</guid>
      <pubDate>Wed, 08 Apr 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.4.6-dde787d of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.4.6-dde787d of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.13</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.13</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.13</guid>
      <pubDate>Wed, 08 Apr 2026 21:17:58 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>With multiple prescriptive solutions, query the returned ProblemVariable instead of deprecated Problem.variable_values(), and stop calling Problem.load_point() with nonzero indices.</description>
      <content:encoded><![CDATA[<p>Version 1.0.13 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Expanded graph APIs:</p>
<ul>
<li><a href="/api/python/v1.0/semantics/reasoners/graph/core/graph_class#method-adamic_adar"><code>Graph.adamic_adar()</code></a> now supports weighted and directed graphs.</li>
<li><a href="/api/python/v1.0/semantics/reasoners/graph/core/graph_class#method-is_acyclic"><code>Graph.is_acyclic()</code></a> adds a built-in DAG check for directed graphs.</li>
</ul>
</li>
<li><p>Added <a href="/api/python/v1.0/semantics/std/aggregates/cumsum_asc"><code>cumsum_asc()</code></a> for cumulative sums over ascending keys.</p>
</li>
<li><p>Added global <code>--json</code> and <code>--no-color</code> options to the <code>rai</code> CLI to make output easier to handle in automation.
<code>--json</code> returns structured output for <code>reasoners:list</code>, <code>reasoners:get</code>, <code>jobs:list</code>, and <code>jobs:get</code>.
For example:</p>
<pre><code class="language-console">rai --json jobs:list
rai --no-color reasoners:list
</code></pre>
</li>
<li><p>Updated <code>rai</code> CLI wait flows so they make fewer unnecessary backend status and result checks before returning.
These flows occur when you use <code>--wait</code> with commands like <code>rai reasoners:create</code> and <code>rai reasoners:resume</code>:</p>
<pre><code class="language-console">rai reasoners:create --type Logic --name my_reasoner --wait
rai reasoners:resume --type Logic --name my_reasoner --wait
</code></pre>
<p>The same improvements also apply when PyRel waits on jobs and reasoners.</p>
</li>
</ul>
<h2>Upgrade Notes</h2>
<ul>
<li><p>If you work with multiple prescriptive solutions, keep the <code>ProblemVariable</code> returned by <code>problem.solve_for(...)</code> and query it directly instead of calling <code>Problem.variable_values()</code>. For example:</p>
<pre><code class="language-python">var = problem.solve_for(...)
sol_idx = Integer.ref()
value = Float.ref()

model.select(sol_idx, value).where(var.values(sol_idx, value))
</code></pre>
<p>This returns <code>(sol_idx, value)</code> pairs, so you can inspect every solution or filter to one specific solution index. <a href="/api/python/v1.0/semantics/reasoners/prescriptive/problem/problem_class#method-variable_values"><code>Problem.variable_values()</code></a> still works, but it is deprecated and no longer preferred.</p>
</li>
<li><p><a href="/api/python/v1.0/semantics/reasoners/prescriptive/problem/problem_class#method-load_point"><code>Problem.load_point()</code></a> still works as a deprecated no-op for <code>load_point(0)</code>, but <code>load_point(k)</code> for <code>k &gt; 0</code> is no longer supported.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.3.29-58b69bc-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.3.29-58b69bc-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.3.29-58b69bc-1</guid>
      <pubDate>Fri, 03 Apr 2026 17:55:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.3.29-58b69bc-1 is a hotfix release that fixes an issue with SPCS deployment.</description>
      <content:encoded><![CDATA[<p>Version 2026.3.29-58b69bc-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed an issue impacting SPCS deployment.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.3.29-58b69bc</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.3.29-58b69bc</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.3.29-58b69bc</guid>
      <pubDate>Wed, 01 Apr 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.3.29-58b69bc of the RAI Native App includes minor improvements to performance and stability.</description>
      <content:encoded><![CDATA[<p>Version 2026.3.29-58b69bc of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.12</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.12</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.12</guid>
      <pubDate>Wed, 01 Apr 2026 13:10:13 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.12 adds support for configuring source tables and export targets in raiconfig.yaml and a new type parameter for Model.Table() to specify Snowflake table types.</description>
      <content:encoded><![CDATA[<p>Version 1.0.12 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Added a <code>tables</code> section in <code>raiconfig.yaml</code> so you can set defaults and named sources and export targets.
See <a href="/build/guides/modeling/declare-data-sources#use-a-snowflake-table-with-modeltable">Use a Snowflake table with <code>Model.Table()</code></a>. and <a href="/build/guides/modeling/query-a-model#export-results-to-snowflake-tables-with-into-and-exec">Export results to Snowflake tables</a> for details and examples.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.11</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.11</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.11</guid>
      <pubDate>Tue, 31 Mar 2026 17:06:31 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.11 clarifies the warning shown for unsupported direct_access: true configurations in v1.</description>
      <content:encoded><![CDATA[<p>Version 1.0.11 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed the warning shown when <code>direct_access: true</code> is used with an unsupported authenticator.
Before, the warning could use older terminology that did not match the v1 config fields.
Now the warning uses v1 naming, explains the fallback to <code>direct_access: false</code>, and lists the supported authenticator names.
For direct access configuration details, see <a href="/build/guides/configuration/snowflake-auth/#enable-direct-access">Enable Direct Access</a>.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.10</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.10</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.10</guid>
      <pubDate>Mon, 30 Mar 2026 16:59:58 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.10 makes DSL objects easier to inspect and fixes .in_() filters in select() so they no longer mutate model state.</description>
      <content:encoded><![CDATA[<p>Version 1.0.10 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>PyRel DSL objects now show readable structure in <code>repr()</code>, <code>str()</code>, and <code>.pprint()</code>.
Before, inspecting concepts, expressions, fragments, aggregates, refs, fields, and models showed generic values like <code>&lt;ClassName object at 0x...&gt;</code>.
Now those representations show the object structure directly, which makes debugging and interactive inspection easier.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed primitive-value lists passed to <code>.in_()</code> inside <code>select()</code> queries so they no longer create temporary data tables or mutate model state.
Before, filters like <code>Person.name.in_([&quot;Alice&quot;, &quot;Bob&quot;])</code> could register extra model state as a side effect.
Now those <code>select()</code> filters compile as literal unions, leave the model unchanged, and still return the expected results.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.9</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.9</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.9</guid>
      <pubDate>Sat, 28 Mar 2026 12:45:03 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.9 adds explicit config-file loading, restores Snowflake OAuth authorization-code sign-in for Direct Access, and includes graph support and behavior updates.</description>
      <content:encoded><![CDATA[<p>Version 1.0.9 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added <code>RAI_CONFIG_FILE_PATH</code> support so PyRel can load a specific config file instead of auto-discovering one.
PyRel now checks that path first, raises a clearer error when the override is invalid, and shows the active config file when you run <a href="/api/cli/v1.0/config/explain"><code>rai config:explain</code></a>.</p>
</li>
<li><p>Restored Snowflake OAuth authorization-code sign-in for <a href="/manage/app/direct-access">Direct Access</a>.
This restores the interactive browser callback and token-exchange sign-in flow that Direct Access workflows use.
For setup, see <a href="/manage/app/direct-access#da-auth-create-oauth-security-integration">Create an OAuth Security Integration for Direct Access</a>.</p>
</li>
<li><p>Added weighted-graph support to <code>Graph.preferential_attachment()</code>.
The graph docs now also clarify how self-loops contribute to <code>degree()</code> and <code>weighted_degree()</code>.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed <code>Graph.diameter_range()</code> to raise explicit unsupported-graph errors for directed and weighted graphs.
Before, those graph types were documented as supported.
Now PyRel fails early with an explicit error instead of implying that those modes are available.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.8</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.8</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.8</guid>
      <pubDate>Wed, 25 Mar 2026 22:41:06 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel version 1.0.8 fixes exports to destination tables that do not exist yet and improves error messages for cross-model usage and relationship field access.</description>
      <content:encoded><![CDATA[<p>Version 1.0.8 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed <code>.into(table).exec()</code> when exporting to a destination table that does not yet exist.
Before, exporting to a new table could fail during setup because PyRel treated the destination as an existing table.
Now PyRel treats the destination as a new export target during setup.</p>
</li>
<li><p>Improved the error PyRel raises when you use a concept, relationship, or chain from one non-library model in another model.
Before, these references could fail later with an unclear error.
Now PyRel raises <code>Cross-model concept usage</code> at the call site.
Concepts from library models are still allowed.</p>
</li>
<li><p>Improved the error PyRel raises when you access a relationship field with dot syntax instead of bracket indexing.
Before, an expression such as <code>relationship.foo</code> could produce an unhelpful error when <code>foo</code> was a field name rather than a relationship.
Now PyRel raises <code>Invalid field access</code> and tells you to use indexing such as <code>relationship[&quot;foo&quot;]</code> instead.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.3.23-7c6ad4c-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.3.23-7c6ad4c-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.3.23-7c6ad4c-1</guid>
      <pubDate>Tue, 24 Mar 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.3.23-7c6ad4c-1 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.3.23-7c6ad4c-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.7</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.7</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.7</guid>
      <pubDate>Sat, 21 Mar 2026 14:43:50 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.7 moves auto_suspend_mins to rai reasoners:alter and await_storage_vacuum to rai reasoners:create instead of raiconfig.yaml.</description>
      <content:encoded><![CDATA[<p>Version 1.0.7 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added <code>Relationship.ref()</code> for relationships declared directly, not attached to a concept attribute.
Before, if you used the same standalone relationship twice in one query, PyRel treated both uses as the same query occurrence, so they could not match independently.
Now, <code>Relationship.ref()</code> gives you a second occurrence of the same relationship definition, similar to <a href="/api/python/v1.0/semantics/frontend/base/chain_class#method-ref"><code>Chain.ref()</code></a>.</p>
</li>
<li><p>Debugger UI packages are now optional.
Before, a standard PyRel install included <code>nicegui</code> even if you did not use the debugger.
Now a standard install stays smaller, and if you do use the debugger without its extra packages, PyRel tells you to install <code>relationalai[debugger]</code>.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed <a href="/api/python/v1.0/semantics/select"><code>select()</code></a> with <a href="/api/python/v1.0/semantics/not_"><code>not_()</code></a> so <code>select(not_(expr))</code> evaluates to a boolean result.
Before, selecting a negated expression did not behave the same way as selecting other boolean expressions such as <code>x == 2</code>.
Now <code>select(not_(expr))</code> works like a normal boolean selection.</li>
</ul>
<h2>Upgrade Notes</h2>
<ul>
<li><code>auto_suspend_mins</code> and <code>await_storage_vacuum</code> are no longer managed in <code>raiconfig.yaml</code>.
Before, these reasoner lifecycle settings could appear in <code>raiconfig.yaml</code>, and <code>rai init --migrate</code> could carry them over when converting <code>raiconfig.toml</code> to <code>raiconfig.yaml</code>.
Now PyRel warns if they appear in config and leaves them out of the generated <code>raiconfig.yaml</code> during migration.
Manage <code>auto_suspend_mins</code> with <a href="/api/cli/v1.0/reasoners/alter"><code>rai reasoners:alter</code></a>.
Set <code>await_storage_vacuum</code> when you create a reasoner with <a href="/api/cli/v1.0/reasoners/create"><code>rai reasoners:create</code></a>.
For broader reasoner configuration, see <a href="/build/guides/configuration/reasoners/">Configure reasoners</a>.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.6</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.6</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.6</guid>
      <pubDate>Thu, 19 Mar 2026 16:10:09 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Version 1.0.6 fixes require() and isclose(), improves reserved-name errors, and deprecates use_direct_access in favor of direct_access.</description>
      <content:encoded><![CDATA[<p>Version 1.0.6 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed <a href="/api/python/v1.0/semantics/require"><code>require()</code></a> checks that reference columns from <a href="/api/python/v1.0/semantics/data"><code>data()</code></a>.
Before, a <code>.require()</code> condition that used <code>model.data()</code> columns could emit a warning even when the input rows satisfied the requirement.
Now PyRel warns only when the condition is actually violated.</p>
</li>
<li><p>Fixed <a href="/api/python/v1.0/semantics/std/math/isclose"><code>std.math.isclose()</code></a> so that it correctly evaluates an absolute-tolerance comparison.
Before, <code>std.math.isclose()</code> could silently produce the wrong result in filters and selections.</p>
</li>
<li><p>Fixed lookups on subtypes such as <code>Manager</code>, a subtype of <code>Employee</code>.
Before, a lookup such as <code>Manager.approves_budget</code> could use the wrong relationship or raise a type mismatch.
Now PyRel resolves the subtype before resolving the relationship.</p>
</li>
<li><p>Improved reserved-name diagnostics for concepts and tables.
Before, if you used a reserved name such as <code>alias</code>, <code>new</code>, or <code>require</code>, the error could be unclear or point to the wrong place.
Now PyRel points the error at the call site.
For reserved table column names, the message also tells you to use table indexing, such as <code>table[&quot;alias&quot;]</code>.</p>
</li>
</ul>
<h2>Deprecations</h2>
<ul>
<li><p>The <code>use_direct_access</code> config option is now deprecated. Use the top-level <code>direct_access</code> setting instead.</p>
<p>Preferred configuration:</p>
<pre><code class="language-yaml">connections:
  snowflake:
    account: my-account
    user: my-user
    password: ${SNOWFLAKE_PASSWORD}
    database: MY_DB
    schema: PUBLIC
    warehouse: COMPUTE_WH

direct_access: true
</code></pre>
<p>Deprecated configuration:</p>
<pre><code class="language-yaml">connections:
  snowflake:
    account: my-account
    user: my-user
    password: ${SNOWFLAKE_PASSWORD}
    database: MY_DB
    schema: PUBLIC
    warehouse: COMPUTE_WH

use_direct_access: true
</code></pre>
<p>Existing <code>use_direct_access</code> entries still work.
PyRel warns that they are deprecated and maps them to the top-level <code>direct_access</code> setting.
For details, see <a href="/build/guides/configuration/reasoners/">Configure reasoners</a>.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.3.16-75ea12b-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.3.16-75ea12b-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.3.16-75ea12b-1</guid>
      <pubDate>Wed, 18 Mar 2026 00:24:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.3.16-75ea12b-1 of the RAI Native App no longer supports creating data streams outside the standard app-managed workflow.</description>
      <content:encoded><![CDATA[<p>Version 2026.3.16-75ea12b-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>Deprecations and Removals</h2>
<ul>
<li>Creating data streams outside the standard app-managed workflow is no longer supported.
The APIs removed by this change were not publicly documented or intended for customer use, so this change should not impact any existing user workflows.
See <a href="/manage/data/">Manage data sources</a> for more information on data streams and app-managed data workflows.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.5</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.5</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.5</guid>
      <pubDate>Tue, 17 Mar 2026 18:06:09 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Version 1.0.5 adds explicit schema support for in-memory data and fixes several configuration and execution issues.</description>
      <content:encoded><![CDATA[<p>Version 1.0.5 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added explicit <code>schema=</code> support to <a href="/api/python/v1.0/semantics/data"><code>data()</code></a> and <a href="/api/python/v1.0/semantics/frontend/base/model_class#method-data"><code>Model.data()</code></a>.
Before, PyRel always inferred column types from the in-memory rows or DataFrame you provided, which made empty inputs and ambiguous columns harder to control.
Now you can declare some or all column types explicitly, and the returned <a href="/api/python/v1.0/semantics/frontend/base/data_class"><code>Data</code></a> object preserves those types even when the input is empty.</p>
<p>For example:</p>
<pre><code class="language-python">from relationalai.semantics import Date, Integer, Model, String

m = Model(&quot;OpsModel&quot;)

# A daily exceptions feed can legitimately be empty, but downstream logic
# still needs stable column types.
shipment_exceptions = m.data(
    [],
    schema={
        &quot;order_id&quot;: Integer,
        &quot;warehouse&quot;: String,
        &quot;reason&quot;: String,
        &quot;requested_ship_date&quot;: Date,
    },
)

# You can still use the schema in model logic, even with no rows.
ShipmentException = m.Concept(&quot;ShipmentException&quot;)
m.define(ShipmentException.new(shipment_exceptions.to_schema()))
</code></pre>
</li>
<li><p>PyRel now supports batching multiple pending table exports into a single model execution.
Before, export-heavy workflows had to execute table exports separately.
Now you can queue multiple <code>.into()</code> exports and submit them together with <code>m.exec()</code>:</p>
<pre><code class="language-python"># Create two export fragments.
m.select(Customer.id, Customer.name).into(customer_table)
m.select(Product.id, Product.name).into(product_table)

# Execute both exports together in a single model execution.
m.exec()
</code></pre>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Improved dtype inference for pandas float columns.
Before, dataframe float columns could be inferred as a more generic numeric type.
Now PyRel maps pandas float columns to <code>Float</code>, which keeps inferred schemas closer to the original dataframe types.</p>
</li>
<li><p>Fixed table-based schema and column mapping when <a href="/api/python/v1.0/config/config_fields/modelconfig_class/#implicit_properties"><code>model.implicit_properties</code></a> is disabled.
<code>model.implicit_properties</code> controls whether PyRel creates undeclared properties automatically.
Before, when you turned this option off, <code>Table</code> objects could still implicitly create properties.
Now <code>Table</code> objects respect the <code>model.implicit_properties</code> setting, so you can disable implicit properties for tables as well as concepts.</p>
</li>
<li><p>Fixed use of <code>std.datetime.datetime.now()</code> in queries and filters.
Before, using the current date and time in a query or filter could fail with an argument error.
Now you can use <code>std.datetime.datetime.now()</code> directly in PyRel logic, including in time-based derived definitions.</p>
<p>For example:</p>
<pre><code class="language-python">from relationalai.semantics import DateTime, Integer, Model, std
from relationalai.semantics.std.datetime import datetime

m = Model(&quot;OpsModel&quot;)

# Declare the base shipment concept.
Shipment = m.Concept(&quot;Shipment&quot;, identify_by={&quot;id&quot;: Integer})
# Add the promised ship timestamp.
Shipment.promised_ship_at = m.Property(f&quot;{Shipment} promised ship at {DateTime}&quot;)
OverdueShipments = m.Concept(&quot;OverdueShipments&quot;, extends=[Shipment])

# Define some shipment entities.
m.define(
    Shipment.new(id=1, promised_ship_at=datetime(2026, 3, 17, 9, 0)),
    Shipment.new(id=2, promised_ship_at=datetime(2026, 3, 28, 9, 0)),
)

# Define overdue shipments using the current time.
m.define(OverdueShipments(Shipment)).where(
    Shipment.promised_ship_at &lt; std.datetime.datetime.now(),
)
</code></pre>
</li>
<li><p>Fixed <a href="/api/python/v1.0/config/connections/snowflake/programmaticaccesstokenauth_class"><code>ProgrammaticAccessTokenAuth</code></a> so PAT-based Snowflake authentication includes the required <code>user</code> field and expands <code>~</code> in <code>token_file_path</code>.
Before, Snowflake could reject the PAT as invalid, and token files referenced with <code>~</code> could fail with <code>FileNotFoundError</code>.
Now PAT authentication works in both cases.</p>
</li>
<li><p>Fixed <code>Problem.solve()</code> so it uses the app name from the model config.
Before, <code>Problem.solve()</code> could ignore a custom <code>rai_app_name</code> in the model config.
Now it reuses the configured app name.</p>
</li>
<li><p>Fixed <a href="/api/python/v1.0/config/config/create_config"><code>create_config()</code></a> for PyRel running inside an existing Snowflake session, including notebooks, stored procedures, and SPCS containers.
Before, the returned config could fail when PyRel later needed a Snowflake SQL connection.
Now configs created from active sessions work correctly in those environments.</p>
</li>
<li><p>Fixed notebook diagnostics so notebook users see all collected PyRel diagnostics in a single exception.
Before, earlier diagnostics could be easy to miss, so you often saw only the final failure.
Now notebook exceptions include the diagnostic context that led to the error.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.4</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.4</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.4</guid>
      <pubDate>Thu, 12 Mar 2026 17:06:18 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Version 1.0.4 adds a new CLI config inspection command and fixes several bugs.</description>
      <content:encoded><![CDATA[<p>Version 1.0.4 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added a new <a href="/api/cli/v1.0/config/explain"><code>rai config:explain</code></a> command to inspect the active configuration and where each value came from.
Now you can inspect the active config directly from the CLI and optionally show full provenance details with <code>--verbose</code>:</p>
<pre><code class="language-sh">rai config:explain
rai config:explain --verbose
</code></pre>
</li>
<li><p>Improved dtype inference for pandas columns with <code>object</code> dtype when PyRel derives concept types from data.
PyRel now does a better job recognizing numbers in pandas <code>object</code> columns.
For example, if a column contains decimal values, PyRel now treats it as numeric instead of treating it as text.</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Fixed an issue with <a href="/api/cli/v1.0/connect"><code>rai connect</code></a> where invalid Snowflake warehouse names could pass basic connectivity checks.
The command now validates the configured warehouse.</p>
</li>
<li><p>Fixed a bug that caused <code>select()</code> to raise a <code>ValueError</code> when selecting a <a href="/api/python/v1.0/semantics/frontend/base/match_class"><code>Match</code></a> object.</p>
</li>
<li><p>Fixed a bug where PyRel would warn about graph validation whenever you selected a <code>Graph.Edge</code> entity.
You can now select or inspect <code>Graph.Edge</code> without triggering validation warnings.
PyRel waits to validate until you run a graph operation that actually needs it.</p>
</li>
<li><p>Fixed a bug that could cause the client to get disconnected during long-running graph algorithms or other work if a jobs polling attempt was delayed or missed.
The maximum polling delay is now short enough to prevent accidental disconnects from transient polling issues.</p>
</li>
<li><p>Fixed a bug that could affect results in some queries involving values that could match multiple types.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.3.9-4685f01-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.3.9-4685f01-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.3.9-4685f01-1</guid>
      <pubDate>Wed, 11 Mar 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.3.9-4685f01-1 of the RAI Native App adds support for configuring multiple warm reasoners and introduces new SQL APIs for managing jobs.</description>
      <content:encoded><![CDATA[<p>Version 2026.3.9-4685f01-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added <a href="/api/sql/app/set_warm_reasoners"><code>app.set_warm_reasoners()</code></a> so app admins can configure multiple warm reasoners for the same reasoner type and size.</p>
</li>
<li><p>Added new SQL APIs for managing jobs, including:</p>
<ul>
<li><a href="/api/sql/api/get_job"><code>api.get_job()</code></a></li>
<li><a href="/api/sql/api/cancel_job"><code>api.cancel_job()</code></a></li>
<li><a href="/api/sql/api/jobs"><code>api.jobs</code></a></li>
<li><a href="/api/sql/api/get_job_metadata"><code>api.get_job_metadata()</code></a></li>
<li><a href="/api/sql/api/get_job_events"><code>api.get_job_events()</code></a></li>
</ul>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.3</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.3</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.3</guid>
      <pubDate>Wed, 11 Mar 2026 15:52:39 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.3 adds prescriptive reasoning (Public Preview, by request) and caps DataConfig.data_freshness_mins at three weeks, warning when it clamps larger values.</description>
      <content:encoded><![CDATA[<p>Version 1.0.3 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Added a new reasoner library for prescriptive reasoning.
See the <a href="/build/guides/reasoning/prescriptive">prescriptive reasoning guides</a>.
For API reference docs, see <a href="/api/python/v1.0/semantics/reasoners/prescriptive">std.reasoners.prescriptive</a>.</p>
</li>
<li><p>Improved typing support for <a href="/api/python/v1.0/semantics/reasoners/graph/core/graph_class"><code>Graph</code></a>.
<code>Graph.__init__()</code> now has overloads so IDEs and static type checkers can catch incorrect combinations of graph constructor parameters.</p>
</li>
<li><p>Made <a href="/api/python/v1.0/semantics/reasoners/graph/core/graph_class"><code>Graph</code></a> attributes <code>directed</code> and <code>weighted</code> read-only.
Mutations to these attributes had no effect on graph behavior.
They are now immutable to avoid confusion.</p>
</li>
<li><p>Improved configuration and authentication diagnostics.
<a href="/api/python/v1.0/config/config/create_config"><code>create_config()</code></a> now includes the active profile name in YAML validation errors when available.</p>
</li>
<li><p>Improved CLI diagnostics for Snowflake authentication failures.
The CLI now surfaces clearer guidance for login and SSO failures.</p>
</li>
<li><p>Added support for the <code>await_storage_vacuum</code> reasoner setting in configuration.
You can now set this in <code>raiconfig.yaml</code> under <code>reasoners.*</code>.
Use it when you want a reasoner to wait for storage vacuum work to finish before suspending.</p>
<p>:::caution
This guidance applies only through PyRel 1.0.6.
As of PyRel 1.0.7, you no longer manage reasoner lifecycle settings in <code>raiconfig.yaml</code>.
Instead, set <code>await_storage_vacuum</code> when you create a reasoner with <a href="/api/cli/v1.0/reasoners/create"><code>rai reasoners:create</code></a>.
For current guidance, see <a href="/build/guides/configuration/reasoners/">Configure reasoners</a> or <a href="/release-notes/python/1.0.7/">What&#39;s New in Version 1.0.7</a>.
:::</p>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><p>Made field access by name in relationships case-insensitive.
For example, <code>Thermometer.readings[&quot;time&quot;]</code> and <code>Thermometer.readings[&quot;Time&quot;]</code> now refer to the same field.</p>
</li>
<li><p><code>rai init --migrate</code> now produces cleaner <code>raiconfig.yaml</code> output when migrating from <code>raiconfig.toml</code>.
Generated YAML no longer includes spurious default fields, places <code>reuse_model</code> under <code>model</code>, and formats profiles and connections more readably.</p>
</li>
<li><p>Fixed <a href="/api/python/v1.0/config/connections/snowflake/programmaticaccesstokenauth_class"><code>ProgrammaticAccessTokenAuth</code></a> so <code>token_file_path</code> works correctly in v1 configuration.
You can now provide either a literal token string or a file path to a Programmatic Access Token in <code>raiconfig.yaml</code>.</p>
</li>
<li><p>Improved type checking for relationships and properties.
If a field&#39;s target type can&#39;t be inferred, PyRel now raises a type mismatch error.</p>
</li>
</ul>
<h2>Upgrade Notes</h2>
<ul>
<li><a href="/api/python/v1.0/config/config_fields/dataconfig_class#param-data_freshness_mins"><code>DataConfig.data_freshness_mins</code></a> is now capped at 30240 minutes (3 weeks).
If you set a larger value, PyRel clamps it to 3 weeks and emits a warning during config creation.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.3.2-62ce088</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.3.2-62ce088</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.3.2-62ce088</guid>
      <pubDate>Wed, 04 Mar 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.3.2-62ce088 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.3.2-62ce088 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.2</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.2</guid>
      <pubDate>Wed, 04 Mar 2026 15:37:37 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.2 deprecates raiconfig.toml in favor of raiconfig.yaml, and Snowflake stored procedures that relied on implicit config loading must now pass an explicit Config.</description>
      <content:encoded><![CDATA[<p>Version 1.0.2 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Bug Fixes</h2>
<ul>
<li><p><code>raiconfig.toml</code> is deprecated, and PyRel now reliably emits a visible warning when it loads a <code>raiconfig.toml</code> config.
The warning points you to <code>rai init</code> to migrate or create a <code>raiconfig.yaml</code>.</p>
</li>
<li><p>Fixed an issue in Snowflake stored procedures where importing your package could fail or behave unexpectedly if it triggered config auto-discovery at import time.
This could attempt to read config files in a restricted runtime, and raise errors such as <code>ConfigFileNotFoundError</code>.</p>
<p>If your code relied on implicit config loading, update it to construct a <code>Config</code> explicitly and pass it into the SDK objects you create.
For example: <code>cfg = create_config(...)</code>.
In stored procedures, prefer creating the config inside the stored procedure handler rather than at module import time.</p>
<p>See <a href="/api/python/v1.0/config/config/create_config"><code>create_config()</code></a> for the supported config sources and defaults.</p>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.1</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.1</guid>
      <pubDate>Wed, 04 Mar 2026 02:28:00 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>Version 1.0.1 of the Python SDK is a patch release with bug fixes and reliability improvements.</description>
      <content:encoded><![CDATA[<p>Version 1.0.1 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>New Features and Enhancements</h2>
<ul>
<li><p>Improved concurrent call handling for <a href="/api/python/v1.0/services/reasoners/client/reasonersclient_class#method-ensure"><code>ReasonersClient.ensure()</code></a> and <a href="/api/python/v1.0/services/reasoners/client_sync/reasonersclientsync_class#method-ensure"><code>ReasonersClientSync.ensure()</code></a>.
When multiple processes try to create or resume the same reasoner at the same time, <code>ensure()</code> will wait for the in-progress operation to complete instead of failing with a conflict error.</p>
</li>
<li><p>Improved the error raised when a logic reasoner job is aborted because the client disconnected.
If that happens, <a href="/api/python/v1.0/services/jobs/client/jobsclient_class#method-wait"><code>JobsClient.wait()</code></a> / <a href="/api/python/v1.0/services/jobs/client_sync/jobsclientsync_class#method-wait"><code>JobsClientSync.wait()</code></a> raises <code>JobClientDisconnectedError</code>:</p>
<pre><code class="language-python">from relationalai.services.jobs.errors import JobClientDisconnectedError

try:
    job = await client.jobs.wait(&quot;LOGIC&quot;, job_id)
except JobClientDisconnectedError:
    # The client disconnected before the job completed.
    # Retry after restoring connectivity.
    ...
</code></pre>
</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed an issue where running reasoner CLI commands, such as <a href="/api/cli/v1.0/reasoners/create"><code>rai reasoners:create</code></a>, could fail with an <code>ImportError</code>.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>1.0.0</title>
      <link>https://docs.relational.ai/release-notes/python/1.0.0</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/python/1.0.0</guid>
      <pubDate>Mon, 02 Mar 2026 17:25:00 GMT</pubDate>
      <category>Python package and CLI</category>
      <description>PyRel 1.0.0 changes model syntax and CLI commands, so treat upgrading as a migration and test existing workflows before switching.</description>
      <content:encoded><![CDATA[<p>Version 1.0.0 of the relationalai Python package is now available!</p>
<p>To upgrade, activate your virtual environment and run the following command:</p>
<p>pip install --upgrade relationalai</p>
<h2>Breaking Changes</h2>
<ul>
<li><p>Version <code>1.0.0</code> is a major update of the Python SDK that introduces:</p>
<ul>
<li><p>PyRel, a new modeling and query DSL organized around <a href="/api/python/v1/semantics/frontend/base/concept_class"><code>Concept</code></a>, <a href="/api/python/v1/semantics/frontend/base/property_class"><code>Property</code></a>, and <a href="/api/python/v1/semantics/frontend/base/relationship_class"><code>Relationship</code></a> classes, and new chainable query methods like <a href="/api/python/v1/semantics/define"><code>define</code></a>, <a href="/api/python/v1/semantics/where"><code>where</code></a>, and <a href="/api/python/v1/semantics/select"><code>select</code></a>.
See <a href="/build/guides/modeling">Build a semantic model</a> for an introduction to the new modeling and query patterns.</p>
</li>
<li><p>Improved configuration management with a new <code>raiconfig.yaml</code> format.
The v1 SDK treats <code>raiconfig.toml</code> as deprecated, so if you have an existing <code>raiconfig.toml</code>, you should migrate to YAML using <code>rai init --migrate</code>.
See <a href="/build/guides/configuration">Configuring PyRel</a> for details on new configuration patterns.</p>
</li>
<li><p>A new CLI with updated commands for managing reasoners, which were previously called <em>engines</em>, and <em>job</em>, which were previously called <em>transactions</em>.
Check out the <a href="/api/cli/v1">CLI reference</a> for details on the new CLI commands and syntax.</p>
</li>
</ul>
<p>:::note
For docs on the <code>v0.x</code> versions of the Python SDK and CLI, check out <a href="https://v0.docs.relational.ai">https://v0.docs.relational.ai</a>.
:::</p>
</li>
</ul>
<h2>Upgrade Notes</h2>
<ul>
<li><p><strong>Treat this upgrade as a migration.</strong>
You should expect to make non-trivial changes to your codebase when upgrading from v0.x to v1.0.0.
If you need help, contact <a href="https://support.relational.ai">RelationalAI support</a> for assistance.</p>
</li>
<li><p><strong>Protect existing workflows.</strong>
Make sure existing production and staging environments install <code>relationalai</code> in a way that doesn&#39;t break existing code until you&#39;re ready to migrate.
For example, if you use <code>pip</code>, you can specify the version in your <code>requirements.txt</code> or <code>setup.py</code> to avoid accidentally upgrading to v1.0.0 before you&#39;re ready.</p>
<p>You can pin your project to the latest v0.x version with:</p>
<pre><code class="language-console">relationalai==0.14.3
</code></pre>
<p>Or, you can use a version specifier to allow the latest v0.x but prevent upgrading to v1.0.0 until you&#39;re ready:</p>
<pre><code class="language-console">relationalai&gt;=0.14.0,&lt;1.0.0
</code></pre>
</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.2.23-91bdaf5-1</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.2.23-91bdaf5-1</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.2.23-91bdaf5-1</guid>
      <pubDate>Wed, 25 Feb 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.2.23-91bdaf5-1 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.2.23-91bdaf5-1 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.2.17-f9af1b6</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.2.17-f9af1b6</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.2.17-f9af1b6</guid>
      <pubDate>Wed, 18 Feb 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.2.17-f9af1b6 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.2.17-f9af1b6 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.2.8-e6a1f8a</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.2.8-e6a1f8a</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.2.8-e6a1f8a</guid>
      <pubDate>Wed, 11 Feb 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>The WARM_PROVISION column in api.engines and api.get_engine() now shows whether a logic reasoner used warm capacity.</description>
      <content:encoded><![CDATA[<p>Version 2026.2.8-e6a1f8a of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Added a <code>WARM_PROVISION</code> column to the <a href="/api/sql/api/engines"><code>api.engines</code></a> view and to the table returned by <a href="/api/sql/api/get_engine"><code>api.get_engine()</code></a> procedure, which indicates whether or not an engine was provisioned off a <a href="/manage/reasoners/warm">warm engine</a>.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.2.2-51ae489</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.2.2-51ae489</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.2.2-51ae489</guid>
      <pubDate>Wed, 04 Feb 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.2.2-51ae489 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.2.2-51ae489 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.1.26-ba18c9d-2</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.1.26-ba18c9d-2</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.1.26-ba18c9d-2</guid>
      <pubDate>Wed, 28 Jan 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.1.26-ba18c9d-2 of the RAI Native App introduces a new stored procedure to show information about warm engines.</description>
      <content:encoded><![CDATA[<p>Version 2026.1.26-ba18c9d-2 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Introduced a new stored procedure <a href="/api/sql/api/show_warm_engines/"><code>api.show_warm_engines()</code></a> which shows information about all currently existing <a href="/manage/reasoners/warm">warm engines</a>.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.1.17-e94e8cc-6</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.1.17-e94e8cc-6</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.1.17-e94e8cc-6</guid>
      <pubDate>Wed, 21 Jan 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.1.17-e94e8cc-6 of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.1.17-e94e8cc-6 of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.1.11-d4d9cef</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.1.11-d4d9cef</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.1.11-d4d9cef</guid>
      <pubDate>Wed, 14 Jan 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>Version 2026.1.11-d4d9cef of the RelationalAI Native App is now available!</description>
      <content:encoded><![CDATA[<p>Version 2026.1.11-d4d9cef of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Minor improvements to performance and stability.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>2026.1.4-301050f</title>
      <link>https://docs.relational.ai/release-notes/native-app/2026.1.4-301050f</link>
      <guid isPermaLink="true">https://docs.relational.ai/release-notes/native-app/2026.1.4-301050f</guid>
      <pubDate>Wed, 07 Jan 2026 22:00:00 GMT</pubDate>
      <category>Native App</category>
      <description>This release replaced set_warm_engines with enable_warm_engine and disable_warm_engine to manage warm logic capacity, which incurs ongoing compute costs.</description>
      <content:encoded><![CDATA[<p>Version 2026.1.4-301050f of the RelationalAI Native App is now available!</p>
<p>Note that RelationalAI Native App upgrades are applied automatically and require no action on your part, unless you have opted-in to manual upgrades.</p>
<h2>New Features and Enhancements</h2>
<ul>
<li>Added new endpoints, <code>enable_warm_engine</code> and <code>disable_warm_engine</code>, which replace <code>set_warm_engines</code>. These endpoints let you pre-provision a logic engine, so a &quot;warm&quot; engine is ready to use immediately when you create or resume an engine. This reduces provisioning time to just a few seconds. Keeping a warm engine running increases costs, as one engine of the chosen size stays active in the background.</li>
</ul>]]></content:encoded>
    </item>
  </channel>
</rss>