What's New in Version 1.21.1
Version 1.21.1 of the relationalai Python package is now available!
To upgrade, activate your virtual environment and run the following command:
pip install --upgrade relationalaiNew Features and Enhancements
Section titled “New Features and Enhancements”-
Reduced query startup time for deploy mode users running in manual mode (
auto_deploy=Falsein deploy mode configuration). PyRel now skips a pre-run deployment check, so queries begin sooner. In manual mode, you will no longer seeNO_DEPLOY_STATEorMATCHING_DEPLOY_FAILEDduring 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 doctorfor Private Link accounts that use Direct Access. Before this release, many failures looked like generic token-exchange errors. Nowdoctoroutput includes a dedicateddirect_access_privatelinksection with specific categories such asjwt_claim_error,endpoint_routing_error, andgrant_errorso you can identify the next fix quickly.For example, run:
Terminal window rai doctor --format jsonThen check this output fragment:
{"direct_access_privatelink": {"checked": true,"ok": false,"error_type": "endpoint_routing_error"}}Use
error_typeto 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.
Bug Fixes
Section titled “Bug Fixes”-
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 pullandrai models deployregenerate model source and string logic could change. This affected string expressions, includingstd.strings.contains()andstd.strings.split(). Before this release, filters could be dropped and values derived fromsplit()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.