nao CLI
Command-line interface for nao chat.
Installation
Install the core package (lightweight, no database or LLM dependencies):
pip install nao-core
Then add only the providers you need:
# Database backends
pip install 'nao-core[postgres]'
pip install 'nao-core[bigquery]'
pip install 'nao-core[snowflake]'
pip install 'nao-core[duckdb]'
pip install 'nao-core[clickhouse]'
pip install 'nao-core[databricks]'
pip install 'nao-core[mysql]'
pip install 'nao-core[mssql]'
pip install 'nao-core[athena]'
pip install 'nao-core[trino]'
pip install 'nao-core[redshift]'
pip install 'nao-core[fabric]'
pip install 'nao-core[starrocks]'
# LLM providers
pip install 'nao-core[openai]'
pip install 'nao-core[anthropic]'
pip install 'nao-core[mistral]'
pip install 'nao-core[gemini]'
pip install 'nao-core[ollama]'
# Integrations
pip install 'nao-core[notion]'
Combine multiple extras in a single install:
pip install 'nao-core[postgres,openai]'
pip install 'nao-core[snowflake,bigquery,anthropic]'
Or install everything at once (equivalent to the previous default):
pip install 'nao-core[all]'
Convenience groups are also available:
pip install 'nao-core[all-databases]' # all database backends
pip install 'nao-core[all-llms]' # all LLM providers
Usage
nao --help
Usage: nao COMMAND
╭─ Commands ────────────────────────────────────────────────────────────────╮
│ chat Start the nao chat UI. │
│ debug Test connectivity to configured resources. │
│ init Initialize a new nao project. │
│ sync Sync resources to local files. │
│ test Run and explore nao tests. │
│ --help (-h) Display this message and exit. │
│ --version Display application version. │
╰───────────────────────────────────────────────────────────────────────────╯
Initialize a new nao project
nao init
This will create a new nao project in the current directory. It will prompt you for a project name and ask you to configure:
- Database connections (BigQuery, DuckDB, Databricks, Snowflake, PostgreSQL, Redshift, MSSQL, Trino, StarRocks)
- Git repositories to sync
- LLM provider (OpenAI, Anthropic, Mistral, Gemini, OpenRouter, Ollama)
ai_summarytemplate + model (prompted only when you enableai_summaryfor databases)- Slack integration
- Notion integration
The resulting project structure looks like:
<project>/
├── nao_config.yaml
├── .naoignore
├── RULES.md
├── databases/
├── queries/
├── docs/
├── semantics/
├── repos/
├── agent/
│ ├── tools/
│ └── mcps/
└── tests/
Options:
--force/-f: Force re-initialization even if the project already exists--yes/-y/--no-tty: Run non-interactively. Skips all prompts and uses sensible defaults — useful for AI agents and automation scripts. When combined with a pre-writtennao_config.yaml(e.g. written by an agent skill), only scaffolds the folder structure.--name/-n: Project name. When set without an existingnao_config.yaml, this is used as the project name (and folder). In--yesmode without--name, the current directory name is used and the project is initialized in place.
Non-interactive (agent-friendly) mode
For LLM agents and automation, run nao init without any prompts:
# Initialize the current directory as a nao project (uses the directory name)
nao init --yes
# Or create a new sub-folder named "my-project"
nao init --yes --name my-project
# Pre-write nao_config.yaml then scaffold folders without prompting
cat > nao_config.yaml <<'YAML'
project_name: my-project
databases:
- type: duckdb
name: local
path: ":memory:"
YAML
nao init --yes
In non-interactive mode, nao init never asks for input. Configure databases, LLM provider, and integrations by editing nao_config.yaml directly (or by pre-writing it before nao init).
Start the nao chat UI
nao chat
This will start the nao chat UI. It will open the chat interface in your browser at http://localhost:5005.
Test connectivity
nao debug
Tests connectivity to all configured databases and LLM providers. Displays a summary table showing connection status and details for each resource.
Sync resources
nao sync
Syncs configured resources to local files:
- Databases - generates markdown docs (
columns.mdwith table schema, description, row count, and partition/clustering/index metadata,query_history.md, andpreview.md) for each table intodatabases/ - Git repositories — clones or pulls repos into
repos/ - Notion pages — exports pages as markdown into
docs/notion/
After syncing, any Jinja templates (*.j2 files) in the project directory are rendered with the nao context.
Optional ai_summary generation:
- Add
ai_summaryto a database connectiontemplateslist to renderai_summary.md. - AI summaries use profiling statistics for data-quality and distribution observations. The row preview is a tiny, non-representative shape sample.
- Use
prompt("...")inside Jinja templates to generateai_summarycontent. prompt(...)requiresllm.provider,llm.annotation_model, andllm.api_key(except for ollama).- Configure
profilingandai_summaryrefreshes independently withrefresh_policy: always,once, orinterval. Interval policies also acceptinterval_days(default:7):
databases:
- type: duckdb
name: analytics
path: analytics.duckdb
templates: [columns, preview, profiling, ai_summary]
profiling:
refresh_policy: once
ai_summary:
refresh_policy: interval
interval_days: 7
Run tests
nao test
Runs test cases defined as YAML files in tests/. Each test has a name, prompt, and expected sql. Results are saved to tests/outputs/.
Options:
--model/-m: Models to test against (default:openai:gpt-4.1). Can be specified multiple times.--threads/-t: Number of parallel threads (default:1)
Examples:
nao test -m openai:gpt-4.1
nao test -m openai:gpt-4.1 -m anthropic:claude-sonnet-4-20250514
nao test --threads 4
Explore test results
nao test server
Starts a local web server to explore test results in a browser UI showing pass/fail status, token usage, cost, and detailed data comparisons.
Options:
--port/-p: Port to run the server on (default:8765)--no-open: Don't automatically open the browser
BigQuery service account permissions
When you connect BigQuery during nao init, the service account used by credentials_path/ADC must be able to list datasets and run read-only queries to generate docs. Grant the account:
- Project:
roles/bigquery.jobUser(orroles/bigquery.user) so the CLI can submit queries - Each dataset you sync:
roles/bigquery.dataViewer(or higher) to read tables
The combination above mirrors the typical "BigQuery User" setup and is sufficient for nao's metadata and preview pulls.
Snowflake authentication
Snowflake supports three authentication methods during nao init:
- SSO: Browser-based authentication (recommended for organizations with SSO policies)
- Password: Traditional username/password
- Key-pair: Private key file with optional passphrase
Development
Building the package
cd cli
python build.py --help
Usage: build.py [OPTIONS]
Build and package nao-core CLI.
╭─ Parameters ──────────────────────────────────────────────────────────────────╮
│ --force -f --no-force Force rebuild the server binary │
│ --skip-server -s --no-skip-server Skip server build, only build Python pkg │
│ --bump Bump version (patch, minor, major) │
╰───────────────────────────────────────────────────────────────────────────────╯
This will:
- Build the frontend with Vite
- Compile the backend with Bun into a standalone binary
- Bundle everything into a Python wheel in
dist/
Installing for development
cd cli
pip install -e '.[all]'
Publishing to PyPI
# Build first
python build.py
# Publish
uv publish dist/*
Architecture
nao chat (CLI command)
↓ spawns
nao-chat-server (Bun-compiled binary, port 5005)
+ FastAPI server (port 8005)
↓ serves
Backend API + Frontend Static Files
↓
Browser at http://localhost:5005
Release files for nao-core 0.2.12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| nao_core-0.2.12-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| nao_core-0.2.12-py3-none-manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| nao_core-0.2.12-py3-none-manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| nao_core-0.2.12-py3-none-macosx_15_0_x86_64.whl | Python 3 | none | macOS 15.0+ x86-64 | Details |
| nao_core-0.2.12-py3-none-macosx_15_0_arm64.whl | Python 3 | none | macOS 15.0+ ARM64 | Details |
Total release size: 362.6 MB
Release files / nao_core-0.2.12-py3-none-win_amd64.whl
| Download URL | nao_core-0.2.12-py3-none-win_amd64.whl |
|---|---|
| Size | 67.4 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
568d3e2588f253ce32d36daffb118973e2ef1cf0a42a99fcc4d4da78960f3699
|
|
BLAKE2b-256 checksum How to use checksums |
55f8a823aaef83fdf9733a6548164bdb2cc6e80ccde0b33e08851828061c7264
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / nao_core-0.2.12-py3-none-manylinux2014_x86_64.whl
| Download URL | nao_core-0.2.12-py3-none-manylinux2014_x86_64.whl |
|---|---|
| Size | 100.7 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
55e29a1579084729b23533f99df08ec7d86859711d86f9babe7ce17dbc95b7ef
|
|
BLAKE2b-256 checksum How to use checksums |
2b0085d5146144fa2a8fac775ab7a2d8878dab55234f5f39723f3325bdf47c28
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / nao_core-0.2.12-py3-none-manylinux2014_aarch64.whl
| Download URL | nao_core-0.2.12-py3-none-manylinux2014_aarch64.whl |
|---|---|
| Size | 65.2 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
cdd9e4b8d7eb1b1bcd5ed184fcab64af5fab3cb468f3ebd0f03e226707df5725
|
|
BLAKE2b-256 checksum How to use checksums |
f3604e1731abef086993590c873dc70f96069589c6b66cb8cc8ea437c6576a11
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / nao_core-0.2.12-py3-none-macosx_15_0_x86_64.whl
| Download URL | nao_core-0.2.12-py3-none-macosx_15_0_x86_64.whl |
|---|---|
| Size | 50.2 MB |
| Tags | Python 3 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
51b28a2eafe5583bfba7504e8ee01a21da45fe9f2649d0a7094ddbb37a03912b
|
|
BLAKE2b-256 checksum How to use checksums |
50b1dc725737c2137a039c6ec518ce9d7931e0756fe5af412af75023307caf46
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / nao_core-0.2.12-py3-none-macosx_15_0_arm64.whl
| Download URL | nao_core-0.2.12-py3-none-macosx_15_0_arm64.whl |
|---|---|
| Size | 79.1 MB |
| Tags | Python 3 macOS 15.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
fbd39b34d737601dc8882e3ca8c7957aafe57d8e5b3ec501f76dcf8e858d8a33
|
|
BLAKE2b-256 checksum How to use checksums |
4f8938f010e90a8409d2d5efdc1e55a4632df767df937f84d406f6561ae20a58
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|