Production-grade Natural Language โ SQL runtime with deterministic orchestration.
NL2SQL treats text-to-SQL as a distributed systems problem. The engine compiles a user query into a validated plan, executes via adapters, and aggregates results through a graph-based pipeline.
LangGraph) with explicit state (GraphState)The runtime is organized around a LangGraph orchestration pipeline and supporting registries. It is designed for fault isolation and deterministic execution.
flowchart TD
User[User Query] --> Resolver[DatasourceResolverNode]
Resolver --> Decomposer[DecomposerNode]
Decomposer --> Planner[GlobalPlannerNode]
Planner --> Router[Layer Router]
subgraph SQLAgent["SQL Agent Subgraph"]
Schema[SchemaRetrieverNode] --> AST[ASTPlannerNode]
AST -->|ok| Logical[LogicalValidatorNode]
AST -->|retry| Retry[retry_node]
Logical -->|ok| Generator[GeneratorNode]
Logical -->|retry| Retry
Generator --> Executor[ExecutorNode]
Retry --> Refiner[RefinerNode]
Refiner --> AST
end
Router --> Schema
Executor --> Router
Router --> Aggregator[EngineAggregatorNode]
Aggregator --> Synthesizer[AnswerSynthesizerNode]
Responsibility: Reasoning, Planning, and Orchestration.
GraphState ensures auditability and reproducibility of every decision.Responsibility: Invariants Enforcement.
Responsibility: Semantic Search and Execution.
Responsibility: Fault Tolerance and Stability.
Responsibility: Visibility, Forensics, and Compliance.
| Invariant | Rationale | Mechanism |
|---|---|---|
| No Unvalidated SQL | Prevent hallucinations & data leaks | All plans pass through LogicalValidator (AST). PhysicalValidator exists but is not wired into the default SQL subgraph. |
| Zero Shared State | Crash Safety | Execution happens in isolated processes; no shared memory with the Control Plane. |
| Fail-Fast | Reliability | Circuit Breakers and Strict Timeouts prevent cascading failures (Retry Storms). |
| Determinism | Debuggability | Temperature-0 generation + Strict Typing (Pydantic) for all LLM outputs. |
configs/datasources.yaml)configs/llm.yaml)# Install core only
pip install nl2sql-core
# Install core with selected adapters
pip install nl2sql-core[mysql,mssql]
# Install core with all adapters
pip install nl2sql-core[all]
For local development:
git clone https://github.com/nadeem4/nl2sql.git
cd nl2sql
# Set up environment
python -m venv venv
source venv/bin/activate
# Install core engine and adapter SDK
pip install -e packages/core
pip install -e packages/adapter-sdk
from nl2sql.context import NL2SQLContext
from nl2sql.pipeline.runtime import run_with_graph
ctx = NL2SQLContext()
result = run_with_graph(ctx, "Top 5 customers by revenue last quarter?")
print(result.get("final_answer"))
Use the CLI to generate deterministic demo data and configs, then point the API at the generated files.
nl2sql setup --demo --lite
# Option A: load .env.demo via ENV
ENV=demo uvicorn nl2sql_api.main:app
# Option B: load a specific env file
ENV_FILE_PATH=.env.demo uvicorn nl2sql_api.main:app
The demo datasource file uses relative paths (e.g. data/demo_lite/*.db), so start the API from the repo root.
NL2SQL uses unified versioning across the monorepo. Core, adapters, API, and CLI share the same version number and are released together. Internal dependencies are pinned to the same version to avoid mismatches.
packages/
โโโ core/ # The Engine (Graph, State, Logic)
โโโ adapter-sdk/ # Interface Contract for new Databases
โโโ adapters/ # Official Dialects (Postgres, MSSQL, MySQL)
configs/ # Runtime Configuration (Policies, Prompts)
docs/ # Architecture & Operations Manual