In Letta
You want a full stateful agent runtime, not just a store the agent queries.
Comparison
Pick Letta if you want a stateful agent runtime that manages its own memory like an OS — self-editing core blocks plus a searchable archive. Pick nlqdb if your agent also needs to aggregate that memory: GROUP BY, JOIN, and HAVING over structured rows it provisions and migrates itself in plain English.
The same goal, two ways.
> average deal size per stage across everything the agent logged this quarter
In Letta
You want a full stateful agent runtime, not just a store the agent queries.
In your HTML
<nlq-data goal="average deal size per stage across everything the agent logged this quarter"></nlq-data> The relational aggregation Letta's memory tiers can't run — recall and archival search return relevant entries, not a GROUP BY / AVG result; nlqdb answers it as SQL over the agent's own memory.
What's different
| Dimension | nlqdb | Letta | Note |
|---|---|---|---|
| Owns the database (provisions + migrates) | |||
| Natural-language → SQL | Letta's agent reads and writes memory through tool calls (core-block edits, recall/archival search); it has no NL→SQL compiler over a relational store. | ||
| Aggregations + reporting queries (GROUP BY / JOIN / HAVING over memory) | Letta can recall 'Alice has a $50k deal' but can't answer 'average deal size per stage' — there is no relational query layer over the memory tiers. | ||
| OS-style self-editing memory tiers (core / recall / archival) | Editable core blocks always in context, plus searchable recall and archival, are Letta's core primitive; nlqdb stores typed rows in Postgres tables, not self-edited memory blocks. |
| Dimension | nlqdb | Letta | Note |
|---|---|---|---|
| Stateful agent runtime (the agent loop itself) | Letta runs the agent; nlqdb is the data layer that any runtime — Letta included — can provision and query. They compose: Letta the runtime, nlqdb the analytical store. | ||
| Auto-migration via NL ('add a `priority` field') | |||
| MCP server (agent-callable) | Letta supports MCP integration (it can consume MCP tools and exposes its agents over MCP); nlqdb's MCP exposes `nlqdb_query` / `nlqdb_list_databases` / `nlqdb_describe`, and `nlqdb_query` materialises Postgres on first reference. | ||
| Vector / semantic recall over archived memory | Letta's archival tier indexes memory with embeddings for semantic search; nlqdb answers with structured SQL and ships no embedding-based recall today. | ||
| Open source / self-hostable | Letta is Apache-2.0 (self-host or hosted). nlqdb is source-available on FSL 1.1-ALv2, auto-converting to Apache 2.0 after two years. |
shipped · partial · not shipped
No sign-in. The anonymous database lasts 72 hours; adopt it with one click if you keep it.
Start with a goal →The error has been recorded. Reload to recover; if it persists, sign out and back in.