Skip to content

Release Notes

1.0.17

Python SDK


Version 1.0.17 of the relationalai Python package is now available!

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

pip install --upgrade relationalai

New Features and Enhancements

  • PyRel now supports math.round(). You can round to the nearest integer or to a specified number of decimal places inside semantics expressions.

  • rai debugger 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.

  • You can no longer create a property or relationship on a concept named Relationship, Property, Concept, or Table. If you try to use one of these names, PyRel raises an error such as:

    'Relationship' is a reserved name and cannot be used as a relationship name on concept 'Person'.
    

    For example:

    from relationalai.semantics import Model, String
    
    m = Model()
    Person = m.Concept("Person")
    
    # Allowed
    Person.relationship = m.Property(f"{Person} has {String:relationship}")
    
    # Raises the reserved-name error
    Person.Relationship = m.Property(f"{Person} has {String:relationship}")
    

Bug Fixes

  • 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.

  • Fixed exports to Snowflake tables when you declare the destination schema with Model.Table(). 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 NULL, so later writes to the same table can still succeed.

    For example:

    from relationalai.semantics import Integer, Model, String
    
    m = Model("MyModel")
    Order = m.Concept("Order", identify_by={"id": Integer})
    Order.status = m.Property(f"{Order} has {String:status}")
    
    # This query exports only order_id and status.
    q = m.select(Order.id.alias("order_id"), Order.status)
    
    # The destination schema also declares shipped_at.
    out = m.Table(
        "ANALYTICS.PUBLIC.ORDER_EXPORT",
        schema={
            "order_id": Integer,
            "status": String,
            "shipped_at": String,
        },
    )
    
    q.into(out).exec()
    # In 1.0.17, shipped_at stays in the exported Snowflake table and is filled with NULL.
    
  • Fixed fully qualified Snowflake names that use quoted lowercase or mixed-case object names. Before, PyRel could strip the quotes from names such as ANALYTICS.PUBLIC."orders" or ANALYTICS.PUBLIC."SalesSummary". That could make Snowflake read them as ANALYTICS.PUBLIC.ORDERS or ANALYTICS.PUBLIC.SALESSUMMARY, which might be different objects or might not even exist. Now PyRel preserves those quotes.

1.0.16

Python SDK


Version 1.0.16 of the relationalai Python package is now available!

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

pip install --upgrade relationalai

Performance and Reliability

  • 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 reachable(), degree and neighbor methods, and several similarity, clustering, and centrality methods. See Run a graph algorithm and the Graph API reference for details.

  • Problem.solve() 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 print_format to a format such as lp, mps, or moi.

Bug Fixes

  • 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 Declare relationships and properties.

  • 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 Person.friend after declaring Person.friends, PyRel warns Did you mean: friends.

  • 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.

2026.4.19-001506c-3

Native App


Version 2026.4.19-001506c-3 of the RelationalAI Native App is now available!

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

New Features and Enhancements

  • Minor improvements to performance and stability.

1.0.15

Python SDK


Version 1.0.15 of the relationalai Python package is now available!

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

pip install --upgrade relationalai

New Features and Enhancements

  • Added support for a RAI_ACTIVE_PROFILE environment variable as a way to select the active profile. You can now set the active profile with RAI_ACTIVE_PROFILE=<profile_name> in addition to active_profile in raiconfig.yaml. See Use profiles to manage multiple configurations for details.

Performance and Reliability

  • Reduced Model.Table() 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 Declare data sources.

  • 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.

Bug Fixes

  • Fixed Snowflake authentication failures that could surface as a misleading No default Session error. PyRel now reports the underlying Snowflake auth failure when it cannot create a new session.

  • Fixed a startup crash in rai debugger. Before, some launches could fail with RuntimeError: You must call ui.run() to start the server. Now the debugger starts without that reload-related crash.

  • Fixed Model.data() 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 1.0 in query results.

1.0.14

Python SDK


Version 1.0.14 of the relationalai Python package is now available!

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

pip install --upgrade relationalai

New Features and Enhancements

  • 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.

  • Added reasoner-specific connection overrides in raiconfig.yaml. You can now set reasoners.<type>.connection so a specific reasoner uses a different connection than the global default_connection. For broader reasoner configuration, see Configure reasoners.

  • Added the rai debugger CLI command.

  • Added pagination to jobs:list and reasoners:list. Use --limit and --offset to control large result sets.

Bug Fixes

  • Fixed model.data() so DataFrame columns with PyRel Int128 extension dtypes are inferred as Integer instead of falling back to Any. Before, DataFrames with those columns could fail type inference after round-tripping results back into model.data(). Now those inputs compile without requiring a manual cast.

  • Fixed correctness issues in unary relationships. Before, queries against unary relationships could produce incorrect results, such as over-counting.

  • Fixed rank_asc() and rank_desc() when used with distinct(). 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 distinct() reliably rank unique values after deduplication.

  • 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 height(cm) or full name. Previously, these names could get transformed to height_cm or full_name in results columns, which could cause confusion when working with the results. Now, property names are preserved as-is in results.