What's new
What changed in each Aito release, from your side: new capabilities, improvements and fixes. Written per release โ not a commit log.
Which build am I on? GET /version on your instance reports the build it
is running. Docs for a specific release live at /docs/api/<version>/; this
page and /docs/api/ describe the current release, and /docs/api/edge/
tracks development ahead of it โ so a feature listed here is available on the
current release unless an entry says otherwise.
v2.7.0
The v2 API is in beta. This release unifies the v2 response contract across
storage engines, extends where filtering (Date ranges and let fields), and
adds on-prem observability with a Prometheus metrics endpoint.
New
- Prometheus metrics endpoint.
GET /metricsexposes request counts, a request-latency histogram, and JVM/disk gauges in Prometheus text format โ per database โ so a self-hosted Aito scrapes straight into Prometheus and Grafana. See monitoring your instance. - Filter on
Dateranges.wherenow accepts range comparisons onDatecolumns, so "orders in the last quarter" is expressible directly. See the query reference. - Filter on
letfields. A field defined withletcan now be used inwhereโ equality,$in, and same-field$ormembership โ so a value you derive filters the same query that defines it. See the query reference.
Improved
- One response contract across engines. A v2 endpoint now returns the same
response shape regardless of which storage engine backs the table โ one
selectvocabulary, one similarity-score key, a consistent errorkind, and a response-time header โ so client code no longer special-cases the engine. - Honest HTTP error codes. Capability and input errors are classified into
proper 4xx codes with a machine-readable
kind, instead of returning prose in the error field. See common errors. - Faster v2 queries. Leaner bitset intersections, single-pass posting-list walks, and segment-aligned per-known tails cut work on large states; the AND-prior evidence gate is now on by default.
- On-prem operations. An operations runbook and a
restore-statecommand with a backup/restore drill for self-hosted deployments, and production no longer logs at DEBUG by default. See clusters & operations.
Fixed
- Namespaces and mounted sub-envs no longer 500. SQL DDL/DML and v2 schema/data/query addressed at a namespace or a mounted sub-env returned a 500 (an internal cast error); they are now handled correctly.
_evaluatehonoursbasedOn._evaluatesilently ignoredbasedOn, which voided any measurement run through it against a based-on database; fixed.- Filters no longer dropped under a tenant scope.
recommendandrelateover a v1-backed table could silently dropwherefilters when run under a tenant scope; fixed. - Nullable columns. A nullable column could leak one row's value onto rows that have none; fixed.
- Empty-tokenising text filters. A text
wherewhose value tokenised to nothing matched the whole table instead of nothing; fixed. - SQL over pgwire. Column names are now identical across both transports, and notices are delivered.
v2.6.1
The v2 API is in beta. This release is mostly stabilization โ SQL/pgwire correctness and lower memory at scale โ with a few additions to the SQL surface.
New
- Prediction as a SQL table function.
SELECT * FROM predict('invoices', 'category', given => 'vendor = ''Acme''')(andpredictions(โฆ, k => 5)) runs a hypothetical prediction for a row you don't have yet โ the SQL spelling of what_predictdoes over JSON. See the SQL reference. - List/Set member edits in
_modify.update'ssetaccepts{"tags": {"$add": ["sale"], "$remove": ["draft"]}}to add or remove members of a list/Setcolumn per matching row โ additive and safe under concurrent updates. - SQL table aliases.
FROM customers AS candFROM customers cnow parse, so BI tools, ORMs and query builders that alias tables (and both sides of a JOIN) work as written.
Improved
- Faithful transactions over pgwire. A multi-statement request is now one
implicit transaction on the extended protocol too (pgjdbc and most drivers), so a
failed statement no longer leaves earlier ones committed.
DISCARD ALLnow fully resets connection state โ important for connection poolers. - Honest error codes. Capability gaps return
0A000(feature not supported) instead of42601(syntax error), so federating clients (Metabase, DuckDB, postgres_fdw, SQLAlchemy) fall back gracefully instead of reporting your query as broken. Clients can also introspect available functions via a generatedpg_proc. - A prediction column is bounded by default.
SELECT predictions(col) FROM tnow defaults toLIMIT 10instead of running one inference per row over the whole table โ matchingrecommend/relate/searchand the JSON API. - Lower v2 memory at scale. Several unbounded rep2 caches are now bounded and a per-query mask is leaner, continuing v2.6.0's 10M-scale reductions.
Fixed
- Correct results in large multi-segment states. Fixed a case where a state with more than 64 segments could silently drop recommendation/prediction evidence.
- Three SQL engine bugs found by a new conformance suite, including
WHERE price < 5 OR price > 50no longer erroring.
v2.6.0
The v2 API is in beta. This release adds new query surface and continues hardening it.
New
- SQL is a full query surface now. Rank candidate values with
match(โฆ), mine frequent patterns withpatterns(โฆ), run a relevance search withaito.search(โฆ)(carrying$why,$highlightand$matches), and find nearest vectors withORDER BY col <-> '[โฆ]' LIMIT kor theaito.knn/aito.nnconditions. See the SQL reference. - Vector predicates for prediction โ
aito.clusterandaito.semanticasWHEREconditions, andvector(n)columns to hold embeddings. - TIMESTAMP columns over SQL. Declare and range-filter timestamps, do
now()+ interval arithmetic in aWHERE, read components (EXTRACT,date_part, day-of-week in both spellings), and bucket withdate_trunc. See the SQL reference. - Define your schema in SQL โ
CREATE TABLEdeclaring links and analysed text, andCREATE VIEWover the query functions. - Real SQL transactions โ
BEGIN/COMMIT/ROLLBACKare buffered and merged on commit, with working savepoints for partial rollback. - Aito's functions live in an
aitoschema, keeping the public namespace clean while the key concepts stay reachable unprefixed. select: [field.$predictions]returns a field's ranked predictions inline in a v2 query.
Beta stabilization
Hardening across the v2 engine and its SQL surface:
- More accurate predictions by default. Name-based identity boosting is now off by default โ on a 10M-row benchmark it was costing ~30 points of top-1 accuracy by letting a name match take over the score. Predictions that relied on the old default will change, and should improve; the boost is still available and is now bounded, so it can add signal without dominating. See improving inference.
- Much lower v2 memory at scale. Large v2 predictions allocate far less per call, and the internal firing cache now has a real size budget with eviction โ a 10M-row workload no longer balloons memory.
- No more 15-minute hangs on out-of-memory. A fatal out-of-memory error mid-request used to stall the connection until the request timeout and then return an unusable body; it now fails fast and cleanly.
- Assorted correctness fixes. A
Textcolumn added to an already-populated table now feeds a$textview; and over the SQL wire, a data query that mentions a catalog name is answered from your data (not the catalog), a partial rollback no longer discards the whole transaction,CREATE VIEWvalidates its functions up front instead of degrading silently,COLLATEis honoured, andGET /versionreports the real version.
v2.5.3
New
- SQL over the Postgres wire protocol is on by default, and the Docker image
now ships with API keys configured. Connect
psql, JDBC/ODBC or psycopg straight at Aito โ see the SQL guide. - TLS is required for the SQL listener on a shared port, and SQL sessions are bounded per connection.
Improved
- A read-only API key can no longer open a read-write SQL session โ the SQL surface now honours key scope the same way the REST API does.
- Each database is authorized by its own keys, not the server's.
Fixed
$whyexplanations keep their highlights when scoring composes several factors โ highlight output no longer nests one level too deep.- A refused SQL listener no longer takes the server down with it; a SQL session no longer outlives the database it was opened against.
v2.5.2
Fixed
$whylifts and highlights are reported at the level clients expect, so$highlight/$matchesresults render correctly again.
v2.5.1
New
- Hybrid search: combine BM25 text relevance with vector similarity in one
ranked query โ
$vectorSimilarityand the self-calibrating$vectorIdfblend with$p. See vector search. /api/v1runs on the v2 engine for the query family, so v1 clients get v2 performance without changing a line.- The vector dimension cap is lifted (previously ~1017 dimensions).
Improved
selectaccepts$highlight/$matchesas aliases for$whyhighlights.
Fixed
- Cross-tenant isolation:
$and/$notover a linked field no longer returns rows from another tenant's data. _matchon a text column now predicts per token, matching v1 behaviour._estimaterestores v1 per-field attribution inwhy, and defaults to AdjustedKNN as v1 does.- Several v1โv2 response-shape differences corrected (
_predict,_recommend,_relate,_match), so a v1 client sees the shape it expects.