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 /metrics exposes 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 Date ranges. where now accepts range comparisons on Date columns, so "orders in the last quarter" is expressible directly. See the query reference.
  • Filter on let fields. A field defined with let can now be used in where โ€” equality, $in, and same-field $or membership โ€” 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 select vocabulary, one similarity-score key, a consistent error kind, 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-state command 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.
  • _evaluate honours basedOn. _evaluate silently ignored basedOn, which voided any measurement run through it against a based-on database; fixed.
  • Filters no longer dropped under a tenant scope. recommend and relate over a v1-backed table could silently drop where filters 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 where whose 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''') (and predictions(โ€ฆ, k => 5)) runs a hypothetical prediction for a row you don't have yet โ€” the SQL spelling of what _predict does over JSON. See the SQL reference.
  • List/Set member edits in _modify. update's set accepts {"tags": {"$add": ["sale"], "$remove": ["draft"]}} to add or remove members of a list/Set column per matching row โ€” additive and safe under concurrent updates.
  • SQL table aliases. FROM customers AS c and FROM customers c now 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 ALL now fully resets connection state โ€” important for connection poolers.
  • Honest error codes. Capability gaps return 0A000 (feature not supported) instead of 42601 (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 generated pg_proc.
  • A prediction column is bounded by default. SELECT predictions(col) FROM t now defaults to LIMIT 10 instead of running one inference per row over the whole table โ€” matching recommend/relate/search and 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 > 50 no 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 with patterns(โ€ฆ), run a relevance search with aito.search(โ€ฆ) (carrying $why, $highlight and $matches), and find nearest vectors with ORDER BY col <-> '[โ€ฆ]' LIMIT k or the aito.knn / aito.nn conditions. See the SQL reference.
  • Vector predicates for prediction โ€” aito.cluster and aito.semantic as WHERE conditions, and vector(n) columns to hold embeddings.
  • TIMESTAMP columns over SQL. Declare and range-filter timestamps, do now() + interval arithmetic in a WHERE, read components (EXTRACT, date_part, day-of-week in both spellings), and bucket with date_trunc. See the SQL reference.
  • Define your schema in SQL โ€” CREATE TABLE declaring links and analysed text, and CREATE VIEW over the query functions.
  • Real SQL transactions โ€” BEGIN / COMMIT / ROLLBACK are buffered and merged on commit, with working savepoints for partial rollback.
  • Aito's functions live in an aito schema, 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 Text column added to an already-populated table now feeds a $text view; 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 VIEW validates its functions up front instead of degrading silently, COLLATE is honoured, and GET /version reports 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

  • $why explanations 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

  • $why lifts and highlights are reported at the level clients expect, so $highlight / $matches results render correctly again.

v2.5.1

New

  • Hybrid search: combine BM25 text relevance with vector similarity in one ranked query โ€” $vectorSimilarity and the self-calibrating $vectorIdf blend with $p. See vector search.
  • /api/v1 runs 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

  • select accepts $highlight / $matches as aliases for $why highlights.

Fixed

  • Cross-tenant isolation: $and / $not over a linked field no longer returns rows from another tenant's data.
  • _match on a text column now predicts per token, matching v1 behaviour.
  • _estimate restores v1 per-field attribution in why, 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.