Skip to content

What's New in Version 1.21.1

July 15, 202612:25 PM UTC

Version 1.21.1 of the relationalai Python package is now available!

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

Terminal window
pip install --upgrade relationalai
  • Reduced query startup time for deploy mode users running in manual mode (auto_deploy=False in deploy mode configuration). PyRel now skips a pre-run deployment check, so queries begin sooner. In manual mode, you will no longer see NO_DEPLOY_STATE or MATCHING_DEPLOY_FAILED 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.

  • Improved troubleshooting in rai doctor for Private Link accounts that use Direct Access. Before this release, many failures looked like generic token-exchange errors. Now doctor output includes a dedicated direct_access_privatelink section with specific categories such as jwt_claim_error, endpoint_routing_error, and grant_error so you can identify the next fix quickly.

    For example, run:

    Terminal window
    rai doctor --format json

    Then check this output fragment:

    {
    "direct_access_privatelink": {
    "checked": true,
    "ok": false,
    "error_type": "endpoint_routing_error"
    }
    }

    Use error_type to choose your next step: endpoint_routing_error: verify Private Link endpoint routing. jwt_claim_error: verify JWT claim formatting. grant_error: verify grants and scopes.

  • Fixed an issue in the deploy mode workflow (rai models deploy) 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.

  • Fixed issues in deploy mode’s shared-model synchronization workflow, where rai models pull and rai models deploy regenerate model source and string logic could change. This affected string expressions, including std.strings.contains() and std.strings.split(). Before this release, filters could be dropped and values derived from split() 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.

    # 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, ",")
    m.where(Person, std.strings.contains(Person.name, "x")).define(Person.part(part))
    # Quick check after export and reload:
    # Compare the number of Person rows matching contains("x") before vs. after export and reload.
    # Expected outcome: the counts are equal.