554 lines
16 KiB
Markdown
554 lines
16 KiB
Markdown
# Command Line Interface
|
||
|
||
The `haiku-rag` CLI provides complete document management functionality.
|
||
|
||
!!! note
|
||
Global options (must be specified before the command):
|
||
|
||
- `--config` - Specify custom configuration file
|
||
- `--read-only` - Open database in read-only mode (blocks writes, skips upgrades)
|
||
- `--before` - Query database as it existed before a datetime (implies `--read-only`)
|
||
- `--version` / `-v` - Show version and exit
|
||
|
||
Per-command options:
|
||
|
||
- `--db` - Specify custom database path
|
||
- `-h` - Show help for specific command
|
||
|
||
Example:
|
||
```bash
|
||
haiku-rag --config /path/to/config.yaml list
|
||
haiku-rag --config /path/to/config.yaml list --db /path/to/custom.db
|
||
haiku-rag --read-only search "query"
|
||
haiku-rag --before "2025-01-15" search "query"
|
||
haiku-rag add -h
|
||
```
|
||
|
||
## Document Management
|
||
|
||
### List Documents
|
||
|
||
```bash
|
||
haiku-rag list
|
||
```
|
||
|
||
Filter documents by properties:
|
||
```bash
|
||
# Filter by URI pattern (--filter or -f)
|
||
haiku-rag list --filter "uri LIKE '%arxiv%'"
|
||
|
||
# Filter by exact title
|
||
haiku-rag list --filter "title = 'My Document'"
|
||
|
||
# Combine multiple conditions
|
||
haiku-rag list --filter "uri LIKE '%.pdf' AND title LIKE '%paper%'"
|
||
```
|
||
|
||
### Add Documents
|
||
|
||
From text:
|
||
```bash
|
||
haiku-rag add "Your document content here"
|
||
|
||
# Set a title
|
||
haiku-rag add "Your document content here" --title "My Document"
|
||
|
||
# Attach metadata (repeat --meta for multiple entries)
|
||
haiku-rag add "Your document content here" --meta author=alice --meta topic=notes
|
||
```
|
||
|
||
From file or URL:
|
||
```bash
|
||
haiku-rag add-src /path/to/document.pdf
|
||
haiku-rag add-src https://example.com/article.html
|
||
|
||
# Optionally set a human‑readable title stored in the DB schema
|
||
haiku-rag add-src /mnt/data/doc1.pdf --title "Q3 Financial Report"
|
||
|
||
# Optionally attach metadata (repeat --meta). Values use JSON parsing if possible:
|
||
# numbers, booleans, null, arrays/objects; otherwise kept as strings.
|
||
haiku-rag add-src /mnt/data/doc1.pdf --meta source=manual --meta page_count=12 --meta published=true
|
||
```
|
||
|
||
From directory (recursively adds all supported files):
|
||
```bash
|
||
haiku-rag add-src /path/to/documents/
|
||
```
|
||
|
||
!!! note
|
||
When adding a directory, the same content filters configured for [file monitoring](configuration/processing.md#filtering-monitored-files) are applied. This means `ignore_patterns` and `include_patterns` from your configuration will be used to filter which files are added.
|
||
|
||
!!! note
|
||
As you add documents to `haiku.rag` the database keeps growing. By default, LanceDB supports versioning
|
||
of your data. Create/update operations are atomic‑feeling: if anything fails during chunking or embedding,
|
||
the database rolls back to the pre‑operation snapshot using LanceDB table versioning. You can optimize and
|
||
compact the database by running the [vacuum](#vacuum-optimize-and-cleanup) command.
|
||
|
||
### Get Document
|
||
|
||
```bash
|
||
haiku-rag get 3f4a... # document ID
|
||
```
|
||
|
||
### Delete Document
|
||
|
||
```bash
|
||
haiku-rag delete 3f4a... # document ID
|
||
haiku-rag rm 3f4a... # alias
|
||
```
|
||
|
||
## Visualize Chunk
|
||
|
||
Display visual grounding for a chunk - shows page images with highlighted bounding boxes:
|
||
|
||
```bash
|
||
haiku-rag visualize <chunk_id>
|
||
```
|
||
|
||
This renders the source document pages with the chunk's location highlighted. Useful for verifying chunk boundaries and understanding document structure.
|
||
|
||
!!! note
|
||
Requires a terminal with image support (iTerm2, Kitty, WezTerm, etc.) and documents processed with docling that have page images stored.
|
||
|
||
## Search
|
||
|
||
Basic search:
|
||
```bash
|
||
haiku-rag search "machine learning"
|
||
```
|
||
|
||
With options:
|
||
```bash
|
||
haiku-rag search "python programming" --limit 10 # or -l 10
|
||
```
|
||
|
||
With filters (filter by document properties, use `--filter` or `-f`):
|
||
```bash
|
||
# Filter by URI pattern
|
||
haiku-rag search "neural networks" --filter "uri LIKE '%arxiv%'"
|
||
|
||
# Filter by exact title
|
||
haiku-rag search "transformers" --filter "title = 'Deep Learning Guide'"
|
||
|
||
# Combine multiple conditions
|
||
haiku-rag search "AI" --filter "uri LIKE '%.pdf' AND title LIKE '%paper%'"
|
||
```
|
||
|
||
## Question Answering
|
||
|
||
Ask questions about your documents:
|
||
```bash
|
||
haiku-rag ask "Who is the author of haiku.rag?"
|
||
```
|
||
|
||
Ask questions with citations showing source documents:
|
||
```bash
|
||
haiku-rag ask "Who is the author of haiku.rag?" --cite
|
||
```
|
||
|
||
Filter to specific documents:
|
||
```bash
|
||
haiku-rag ask "What are the main findings?" --filter "uri LIKE '%paper%'"
|
||
```
|
||
|
||
The QA agent searches your documents for relevant information and provides a comprehensive answer. When available, citations use the document title; otherwise they fall back to the URI.
|
||
|
||
Flags:
|
||
|
||
- `--cite`: Include citations showing which documents were used
|
||
- `--filter` / `-f`: Restrict searches to documents matching the filter (see [Filtering Search Results](python.md#filtering-search-results))
|
||
|
||
## Chat
|
||
|
||
Launch an interactive chat session for multi-turn conversations:
|
||
|
||
```bash
|
||
haiku-rag chat
|
||
haiku-rag chat --db /path/to/database.lancedb
|
||
|
||
# Enable analysis skill (code execution)
|
||
haiku-rag chat -s rag -s analysis
|
||
```
|
||
|
||
!!! note
|
||
Requires the `tui` extra: `pip install haiku.rag-slim[tui]` (included in full `haiku.rag` package)
|
||
|
||
Flags:
|
||
|
||
- `--skill` / `-s`: Skills to enable — `rag` (default), `analysis`. Can be repeated for multiple skills.
|
||
|
||
The chat interface provides:
|
||
|
||
- Streaming responses with real-time tool execution
|
||
- Expandable citations with source metadata
|
||
- Session memory for context-aware follow-up questions
|
||
- Visual grounding to inspect chunk source locations
|
||
|
||
See [Applications](apps.md#chat-tui) for keyboard shortcuts and features.
|
||
|
||
## Inspect
|
||
|
||
Launch the interactive inspector TUI for browsing documents and chunks:
|
||
|
||
```bash
|
||
haiku-rag inspect
|
||
haiku-rag inspect --db /path/to/database.lancedb
|
||
```
|
||
|
||
!!! note
|
||
Requires the `tui` extra: `pip install haiku.rag-slim[tui]` (included in full `haiku.rag` package)
|
||
|
||
The inspector provides:
|
||
|
||
- Browse all documents in the database
|
||
- View document metadata and content
|
||
- Explore individual chunks
|
||
- Search and filter results
|
||
|
||
See [Applications](apps.md#inspector) for details.
|
||
|
||
## Research
|
||
|
||
Run the multi-step research graph:
|
||
|
||
```bash
|
||
haiku-rag research "How does haiku.rag organize and query documents?"
|
||
```
|
||
|
||
Filter to specific documents:
|
||
|
||
```bash
|
||
haiku-rag research "What are the key findings?" --filter "uri LIKE '%paper%'"
|
||
```
|
||
|
||
Flags:
|
||
|
||
- `--filter` / `-f`: SQL WHERE clause to filter documents (see [Filtering Search Results](python.md#filtering-search-results))
|
||
|
||
Research parameters like `max_iterations` and `max_concurrency` are configured in your [configuration file](configuration/index.md) under the `research` section.
|
||
|
||
## Analyze
|
||
|
||
Answer complex analytical questions via code execution:
|
||
|
||
```bash
|
||
haiku-rag analyze "How many documents mention security?"
|
||
```
|
||
|
||
Filter to specific documents:
|
||
|
||
```bash
|
||
haiku-rag analyze "What is the total revenue?" --filter "title LIKE '%Financial%'"
|
||
```
|
||
|
||
Pre-load specific documents for comparison:
|
||
|
||
```bash
|
||
haiku-rag analyze "Compare the conclusions" --document "Report A" --document "Report B"
|
||
```
|
||
|
||
Flags:
|
||
|
||
- `--filter` / `-f`: SQL WHERE clause to restrict document access
|
||
- `--document` / `-d`: Pre-load a document by title or ID (can repeat)
|
||
|
||
See [Analysis Agent](agents/analysis.md) for details on capabilities and configuration.
|
||
|
||
## Create Skill
|
||
|
||
Generate a standalone skill package with an embedded database:
|
||
|
||
```bash
|
||
haiku-rag create-skill --name myskill --db /path/to/database.lancedb
|
||
```
|
||
|
||
The generated package is a pip-installable Python package that registers as a `haiku.skills` entry point.
|
||
|
||
### Options
|
||
|
||
| Flag | Description | Default |
|
||
|------|-------------|---------|
|
||
| `--name` | Skill name (lowercase alphanumeric and hyphens, required) | — |
|
||
| `--db` | Path to LanceDB database to embed (required) | — |
|
||
| `--description` | Skill description | Standard RAG description |
|
||
| `--tools` | Comma-separated tool names, or `all` | `all` |
|
||
| `--preamble` | Custom preamble for skill instructions | Standard RAG preamble |
|
||
| `--config-file` | Path to `haiku.rag.yaml` to embed | None |
|
||
| `--output` / `-o` | Output directory | Current directory |
|
||
|
||
### Available Tools
|
||
|
||
`analyze`, `ask`, `get_document`, `list_documents`, `research`, `search`
|
||
|
||
### Example
|
||
|
||
```bash
|
||
# Generate a skill with specific tools and custom preamble
|
||
haiku-rag create-skill \
|
||
--name medic \
|
||
--db /path/to/medic.lancedb \
|
||
--tools search,ask \
|
||
--config-file /path/to/haiku.rag.yaml \
|
||
--description "Military medic knowledge base" \
|
||
--preamble "You are a military medic expert."
|
||
|
||
# Install the generated package
|
||
uv pip install -e ./medic-skill
|
||
|
||
# Use with haiku-skills
|
||
haiku-skills chat --use-entrypoints --skill medic
|
||
```
|
||
|
||
### Generated Package Structure
|
||
|
||
```
|
||
{name}-skill/
|
||
├── pyproject.toml
|
||
└── {name}_skill/
|
||
├── __init__.py # create_skill() entry point
|
||
├── SKILL.md # Skill metadata and instructions
|
||
└── assets/
|
||
├── {name}.lancedb/ # Embedded database
|
||
└── haiku.rag.yaml # Optional config
|
||
```
|
||
|
||
## Server
|
||
|
||
Start services (requires at least one flag):
|
||
```bash
|
||
# MCP server only (HTTP transport)
|
||
haiku-rag serve --mcp
|
||
|
||
# MCP server (stdio transport)
|
||
haiku-rag serve --mcp --stdio
|
||
|
||
# File monitoring only
|
||
haiku-rag serve --monitor
|
||
|
||
# Both services
|
||
haiku-rag serve --monitor --mcp
|
||
|
||
# Custom MCP port
|
||
haiku-rag serve --mcp --mcp-port 9000
|
||
|
||
# Read-only mode (excludes write MCP tools, disables monitor)
|
||
haiku-rag --read-only serve --mcp
|
||
```
|
||
|
||
See [Server Mode](server.md) for details on available services.
|
||
|
||
## Settings
|
||
|
||
View current configuration settings:
|
||
```bash
|
||
haiku-rag settings
|
||
```
|
||
|
||
### Generate Configuration File
|
||
|
||
Generate a YAML configuration file with defaults:
|
||
```bash
|
||
haiku-rag init-config [output_path]
|
||
```
|
||
|
||
If no path is specified, creates `haiku.rag.yaml` in the current directory.
|
||
|
||
## Database Management
|
||
|
||
### Initialize Database
|
||
|
||
Create a new database:
|
||
|
||
```bash
|
||
haiku-rag init [--db /path/to/your.lancedb]
|
||
```
|
||
|
||
This creates the database with the configured settings. **All other commands require an existing database** - they will fail with an informative error if the database doesn't exist.
|
||
|
||
### Migrate Database
|
||
|
||
Apply pending database migrations:
|
||
|
||
```bash
|
||
haiku-rag migrate [--db /path/to/your.lancedb]
|
||
```
|
||
|
||
When you upgrade haiku.rag to a new version that includes schema changes, the database requires migration. Opening a database with pending migrations will display an error:
|
||
|
||
```
|
||
Error: Database requires migration from 0.19.0 to 0.26.5. 3 migration(s) pending. Run 'haiku-rag migrate' to upgrade.
|
||
```
|
||
|
||
Run `haiku-rag migrate` to apply the pending migrations. The command shows which migrations were applied:
|
||
|
||
```
|
||
Applied 4 migration(s):
|
||
- 0.20.0: Add 'docling_document_json' and 'docling_version' columns
|
||
- 0.23.1: Add content_fts column for contextualized FTS search
|
||
- 0.25.0: Compress docling_document with gzip
|
||
- 0.38.0: Split docling_document pages into separate column and re-compress with zstd
|
||
Migration completed successfully.
|
||
```
|
||
|
||
!!! tip
|
||
Back up your database before running migrations. While migrations are designed to be safe, having a backup provides peace of mind for production databases.
|
||
|
||
### Info
|
||
|
||
Display database metadata:
|
||
|
||
```bash
|
||
haiku-rag info [--db /path/to/your.lancedb]
|
||
```
|
||
|
||
Shows:
|
||
- path to the database
|
||
- stored haiku.rag version (from settings)
|
||
- embeddings provider/model and vector dimension
|
||
- number of documents and chunks (with storage sizes)
|
||
- vector index status (exists/not created, indexed/unindexed chunks)
|
||
- table versions per table (documents, chunks)
|
||
|
||
At the end, a separate "Versions" section lists runtime package versions:
|
||
- haiku.rag
|
||
- lancedb
|
||
- docling
|
||
|
||
### Create Vector Index
|
||
|
||
Create a vector index on the chunks table for fast approximate nearest neighbor search:
|
||
|
||
```bash
|
||
haiku-rag create-index [--db /path/to/your.lancedb]
|
||
```
|
||
|
||
**Requirements:**
|
||
- Minimum 256 chunks required for index creation (LanceDB training data requirement)
|
||
- Creates an IVF_PQ index using the configured `search.vector_index_metric` (cosine/l2/dot)
|
||
|
||
**When to use:**
|
||
- After ingesting documents (indexes are not created automatically)
|
||
- After adding significant new data to rebuild the index
|
||
- Use `haiku-rag info` to check index status and see how many chunks are indexed/unindexed
|
||
|
||
**Search behavior:**
|
||
- Without index: Brute-force kNN search (exact nearest neighbors, slower for large datasets)
|
||
- With index: Fast ANN (approximate nearest neighbors) using IVF_PQ
|
||
- With stale index: LanceDB combines indexed results (fast ANN) + brute-force kNN on unindexed rows
|
||
- Performance degrades as more unindexed data accumulates
|
||
|
||
### Vacuum (Optimize and Cleanup)
|
||
|
||
Reduce disk usage by optimizing and pruning old table versions across all tables:
|
||
|
||
```bash
|
||
haiku-rag vacuum
|
||
```
|
||
|
||
**Automatic Cleanup:** Vacuum runs automatically in the background after document operations. By default, it removes versions older than 1 day (configurable via `storage.vacuum_retention_seconds`), preserving recent versions for concurrent connections. Manual vacuum can be useful for cleanup after bulk operations or to free disk space immediately.
|
||
|
||
### Rebuild Database
|
||
|
||
Rebuild the database by re-indexing documents. Useful when switching embeddings provider/model or changing chunking settings:
|
||
|
||
```bash
|
||
# Full rebuild (default) - re-converts from source files, re-chunks, re-embeds
|
||
haiku-rag rebuild
|
||
|
||
# Re-chunk from stored content (no source file access)
|
||
haiku-rag rebuild --rechunk
|
||
|
||
# Only regenerate embeddings (fastest, keeps existing chunks)
|
||
haiku-rag rebuild --embed-only
|
||
|
||
# Only generate titles for untitled documents
|
||
haiku-rag rebuild --title-only
|
||
```
|
||
|
||
**Rebuild modes:**
|
||
|
||
| Mode | Flag | Use case |
|
||
|------|------|----------|
|
||
| Full | (default) | Changed converter, source files updated |
|
||
| Rechunk | `--rechunk` | Changed chunking strategy or chunk size |
|
||
| Embed only | `--embed-only` | Changed embedding model or vector dimensions |
|
||
| Title only | `--title-only` | Generate titles for documents without one |
|
||
|
||
### Download Models
|
||
|
||
Download required runtime models:
|
||
|
||
```bash
|
||
haiku-rag download-models
|
||
```
|
||
|
||
This command downloads:
|
||
|
||
- Docling OCR/conversion models
|
||
- HuggingFace tokenizer (for chunking)
|
||
- Ollama models referenced in your configuration (embeddings, QA, research, rerank)
|
||
|
||
Progress is displayed in real-time with download status and progress bars for Ollama model pulls.
|
||
|
||
## Time Travel
|
||
|
||
LanceDB maintains version history for tables, enabling you to query the database as it existed at a previous point in time. This is useful for:
|
||
|
||
- **Debugging**: Investigate data before a problematic change
|
||
- **Auditing**: Verify what knowledge was available when a support ticket was filed
|
||
|
||
### Query Historical State
|
||
|
||
Use `--before` to query the database as it existed before a specific datetime:
|
||
|
||
```bash
|
||
# Query documents as of January 15, 2025
|
||
haiku-rag --before "2025-01-15" list
|
||
|
||
# Search historical state
|
||
haiku-rag --before "2025-01-15T14:30:00" search "machine learning"
|
||
|
||
# Ask questions against historical data
|
||
haiku-rag --before "2025-01-15" ask "What documents existed?"
|
||
```
|
||
|
||
Supported datetime formats:
|
||
|
||
- ISO 8601: `2025-01-15T14:30:00`, `2025-01-15T14:30:00Z`, `2025-01-15T14:30:00+00:00`
|
||
- Date only: `2025-01-15` (interpreted as start of day)
|
||
|
||
!!! note
|
||
Time travel mode automatically enables read-only mode. You cannot modify the database while viewing historical state.
|
||
|
||
### Version History
|
||
|
||
View version history for database tables:
|
||
|
||
```bash
|
||
# Show history for all tables
|
||
haiku-rag history
|
||
|
||
# Show history for a specific table
|
||
haiku-rag history --table documents
|
||
|
||
# Limit number of versions shown
|
||
haiku-rag history --limit 10
|
||
```
|
||
|
||
Output shows version numbers and timestamps, sorted newest first:
|
||
|
||
```
|
||
Version History
|
||
|
||
documents
|
||
v5: 2025-01-15 14:30:00
|
||
v4: 2025-01-14 10:00:00
|
||
v3: 2025-01-13 09:15:00
|
||
|
||
chunks
|
||
v8: 2025-01-15 14:30:00
|
||
v7: 2025-01-14 10:00:00
|
||
...
|
||
```
|
||
|
||
Use the timestamps from `history` to construct `--before` queries.
|