SmartQL
Natural Language to SQL — Database First.
SmartQL is a Python library that converts natural language questions into SQL queries using a YAML-based semantic layer. It connects directly to databases, understands your schema, and generates safe, optimized queries.
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ Natural Language Query │
│ "Show me all users who spent over $1000" │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ SmartQL Core │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ LiteLLM │ │ sqlglot │ │ Semantic Layer │ │
│ │ (100+ LLMs)│ │ (SQL Parser)│ │ (YAML Config) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Generated SQL │
│ SELECT u.* FROM users u JOIN orders o ON o.user_id = u.id │
│ WHERE o.total >= 1000 GROUP BY u.id │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Database │
│ MySQL, PostgreSQL, SQLite, SQL Server │
└─────────────────────────────────────────────────────────────────┘
Features
- 100+ LLM Providers — OpenAI, Claude, Gemini, Groq, Ollama, and more via LiteLLM
- SQL Security — AST-based validation with sqlglot (not regex)
- Semantic Layer — YAML config with business context, aliases, and rules
- Auto-Introspection — Discover schema from existing databases
- Interactive CLI — Shell mode for testing queries
- REST API — Optional HTTP server for language-agnostic access
Installation
pip install smartql
Or with uv:
uv pip install smartql
Quick Start
1. Create a configuration file (smartql.yml)
version: "1.0"
database:
type: mysql
connection:
host: localhost
database: myapp
user: ${DB_USER}
password: ${DB_PASSWORD}
llm:
provider: groq
groq:
api_key: ${GROQ_API_KEY}
model: llama-3.1-8b-instant
security:
mode: read_only
max_rows: 1000
2. Use the CLI
# Interactive shell
smartql shell -c smartql.yml
# Single query
smartql ask "How many users signed up this month?" -c smartql.yml
# With execution
smartql ask "Show me the top 5 customers" -c smartql.yml --execute
3. Use in Python
from smartql import SmartQL
sql = SmartQL.from_yaml("smartql.yml")
# Generate SQL
result = sql.ask("Show me all active users with orders")
print(result.sql)
print(result.explanation)
# Generate and execute
result = sql.ask("Top 10 customers by revenue", execute=True)
for row in result.rows:
print(row)
Semantic Layer
The semantic layer adds business context to your database schema:
semantic_layer:
entities:
customers:
table: users
description: "Registered customers"
aliases: ["users", "members"]
columns:
id:
type: integer
primary: true
email:
type: string
description: "Customer email"
status:
type: enum
values: ["active", "inactive", "suspended"]
relationships:
- name: customer_orders
type: one_to_many
from: customers
to: orders
foreign_key: user_id
business_rules:
- name: active
applies_to: [customers]
definition: "status = 'active'"
description: "Active customers"
- name: high_value
applies_to: [orders]
definition: "total >= 1000"
description: "Orders over $1000"
Without a semantic layer, SmartQL auto-introspects your database schema.
Security
SmartQL uses sqlglot for AST-based SQL parsing and validation:
security:
mode: read_only # Only SELECT queries allowed
allowed_tables: # Whitelist tables
- users
- orders
- products
blocked_columns: # Hide sensitive data
- users.password
- users.api_token
max_rows: 1000 # Prevent large result sets
timeout_seconds: 30 # Query timeout
max_join_depth: 4 # Limit JOIN complexity
LLM Providers
SmartQL uses LiteLLM for unified access to 100+ models:
# OpenAI
llm:
provider: openai
openai:
api_key: ${OPENAI_API_KEY}
model: gpt-4o
# Anthropic Claude
llm:
provider: anthropic
anthropic:
api_key: ${ANTHROPIC_API_KEY}
model: claude-sonnet-4-20250514
# Google Gemini
llm:
provider: google
google:
api_key: ${GEMINI_API_KEY}
model: gemini-2.0-flash
# Groq (fast & free)
llm:
provider: groq
groq:
api_key: ${GROQ_API_KEY}
model: llama-3.1-8b-instant
# Local with Ollama
llm:
provider: ollama
ollama:
model: llama3:8b
api_base: http://localhost:11434
CLI Commands
# Interactive shell
smartql shell -c config.yml
# Ask a question
smartql ask "your question" -c config.yml
# Ask and execute
smartql ask "your question" -c config.yml --execute
# Validate SQL
smartql check "SELECT * FROM users" -c config.yml
# Validate config
smartql validate -c config.yml
# Introspect database
smartql introspect -c "mysql://user:pass@localhost/db" -o schema.yml
# Start HTTP API server
smartql serve -c config.yml --port 8000
Shell Commands
In interactive shell mode:
/help - Show help
/schema - Display database schema
/execute - Toggle auto-execute mode
/clear - Clear the screen
/quit - Exit shell
Examples
See the examples/ directory:
ecommerce/— E-commerce database with products, orders, customerstrakli/— Personal finance tracker with wallets and transactions
License
MIT License
Metadata
Release files for smartql 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| smartql-0.2.0.tar.gz | 58.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| smartql-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 111.9 kB
Release files / smartql-0.2.0.tar.gz
| Download URL | smartql-0.2.0.tar.gz |
|---|---|
| Size | 58.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0946c039a96942562a97efdfeaf8f25b101052e3be67f4d5612d654cde70db15
|
|
BLAKE2b-256 checksum How to use checksums |
8db2376ef47765d98e40e796b735d4e404ac4d2d50cff3d3247317103bea7a03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 29, 2026.
Transparency logRelease files / smartql-0.2.0-py3-none-any.whl
| Download URL | smartql-0.2.0-py3-none-any.whl |
|---|---|
| Size | 53.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e2eb9a56193d810c224bde8e45bc8688a160693acb8b2efa951bd7dc6932d428
|
|
BLAKE2b-256 checksum How to use checksums |
fb687b53feca3eb9e341bd49e3f238698372723c8e904ebaee8dcae8496a6430
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 29, 2026.
Transparency log