# Companion AI - User Manual A practical guide to running and using your personal AI companion. --- ## Quick Start (5 minutes) ### Option 1: Docker (Recommended) ```bash # 1. Clone and enter directory git clone https://github.com/santhoshjan/companion.git cd companion # 2. Edit config.json - set your vault path nano config.json # Change: "path": "/home/yourname/KnowledgeVault/Default" # 3. Start everything docker-compose up -d # 4. Open the UI open http://localhost:5173 ``` ### Option 2: Manual Install ```bash # Install dependencies pip install -e ".[dev]" # Run the API python -m uvicorn companion.api:app --host 0.0.0.0 --port 7373 ``` --- ## Configuration Before first use, edit `config.json`: ```json { "vault": { "path": "/path/to/your/obsidian/vault" } } ``` **Required paths to set:** - `vault.path` - Your Obsidian vault directory - `rag.vector_store.path` - Where to store embeddings (default: `~/.companion/vectors`) - `companion.memory.persistent_store` - Conversation history (default: `~/.companion/memory.db`) --- ## Indexing Your Vault The system needs to index your vault before it can answer questions. ### One-time Full Index ```bash # Using Python module python -m companion.indexer_daemon.cli index # Or with Docker docker-compose exec companion-api python -m companion.indexer_daemon.cli index ``` **Output:** ``` Running full index... Done. Total chunks: 12,847 ``` ### Continuous File Watching ```bash # Auto-sync when files change python -m companion.indexer_daemon.watcher ``` **What it does:** - Monitors your vault for changes - Automatically re-indexes modified files - Debounced (5-second delay to batch rapid changes) ### Check Index Status ```bash python -m companion.indexer_daemon.cli status ``` **Output:** ``` Total chunks: 12,847 Indexed files: 847 Unindexed files: 3 ``` ### Incremental Sync ```bash # Sync only changed files python -m companion.indexer_daemon.cli sync ``` **When to use:** - After editing a few notes - Faster than full re-index - Keeps vector store updated --- ## Using the Chat Interface ### Web UI 1. Start the backend: `python -m uvicorn companion.api:app --port 7373` 2. In another terminal: `cd ui && npm run dev` 3. Open http://localhost:5173 **Interface:** - Type messages in the bottom textarea - Press Enter to send - Citations appear in a side panel when RAG retrieves context - Conversation history persists per session ### API Directly ```bash # Start a conversation curl -X POST http://localhost:7373/chat \ -H "Content-Type: application/json" \ -d '{ "message": "What did I write about my trip to Japan?", "stream": true }' ``` **Parameters:** - `message` (required): Your question - `session_id` (optional): Continue existing conversation - `stream` (optional): Stream response (default: true) - `use_rag` (optional): Enable vault search (default: true) ### Get Session History ```bash curl http://localhost:7373/sessions/{session_id}/history ``` --- ## Fine-Tuning (Optional) ### Extract Training Data ```bash # Extract reflection examples from your vault python -m companion.forge.extract \ --output training_data.jsonl \ --min-length 100 ``` ### Train Model ```bash # Start training (takes hours, needs GPU) python -m companion.forge.train \ --data training_data.jsonl \ --output-dir ./models ``` ### Export to GGUF ```bash # Convert for llama.cpp inference python -m companion.forge.export \ --model ./models/checkpoint \ --output companion-7b.gguf ``` ### Reload Model (Hot Swap) ```bash # Admin endpoint - reload without restarting API curl -X POST http://localhost:7373/admin/reload-model \ -H "Content-Type: application/json" \ -d '{"model_path": "/path/to/companion-7b.gguf"}' ``` --- ## Command Reference ### Indexer Commands | Command | Description | Example | |---------|-------------|---------| | `index` | Full re-index of vault | `cli index` | | `sync` | Incremental sync | `cli sync` | | `reindex` | Force full reindex | `cli reindex` | | `status` | Show index statistics | `cli status` | ### Common Options All indexer commands support: - `--config PATH` : Use alternative config file - `--verbose` : Detailed logging ### Environment Variables | Variable | Purpose | Example | |----------|---------|---------| | `COMPANION_CONFIG` | Config file path | `/etc/companion/config.json` | | `COMPANION_DATA_DIR` | Data storage root | `/var/lib/companion` | | `VAULT_PATH` | Override vault location | `/home/user/vault` | --- ## Troubleshooting ### "No module named 'companion'" ```bash # Install in editable mode pip install -e "." # Or set PYTHONPATH export PYTHONPATH=/path/to/companion:$PYTHONPATH ``` ### "Failed to generate embedding" - Check Ollama is running: `curl http://localhost:11434/api/tags` - Verify embedding model is pulled: `ollama pull mxbai-embed-large` - Check `config.json` has correct `rag.embedding.base_url` ### "No results from search" 1. Check index status: `cli status` 2. Verify vault path is correct in config 3. Run full index: `cli index` 4. Check file patterns match your notes (default: `*.md`) ### "Port 7373 already in use" ```bash # Find and kill process lsof -i :7373 kill # Or use different port python -m uvicorn companion.api:app --port 7374 ``` ### Windows: Scripts won't run ```powershell # Set execution policy Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser # Or run with explicit bypass powershell -ExecutionPolicy Bypass -File scripts/install.ps1 ``` --- ## Systemd Commands (Linux) If installed as a service: ```bash # Start/stop/restart sudo systemctl start companion-api sudo systemctl stop companion-api sudo systemctl restart companion-api # Check status sudo systemctl status companion-api # View logs sudo journalctl -u companion-api -f # Enable auto-start sudo systemctl enable companion-api ``` --- ## Docker Commands ```bash # Start all services docker-compose up -d # View logs docker-compose logs -f companion-api # Run indexer command docker-compose exec companion-api python -m companion.indexer_daemon.cli index # Rebuild after code changes docker-compose up -d --build # Stop everything docker-compose down ``` --- ## Performance Tips ### Indexing Large Vaults - First index takes time (1-5 hours for 1000+ notes) - Subsequent syncs are fast (seconds to minutes) - Use `sync` instead of `reindex` for updates ### Memory Usage - API server: ~500MB-1GB RAM - Indexer: ~200MB while watching - LanceDB is disk-based, scales to 100K+ chunks ### GPU Acceleration For fine-tuning (not required for RAG): - Requires CUDA-capable GPU - Install `unsloth` and `torch` with CUDA support - Training uses ~10GB VRAM for 7B models --- ## Best Practices 1. **Index regularly**: Run `sync` daily or use the file watcher 2. **Back up vectors**: Copy `~/.companion/vectors.lance` periodically 3. **Use session IDs**: Pass `session_id` to maintain conversation context 4. **Monitor citations**: Check the sources panel to verify RAG is working 5. **Keep Ollama running**: The embedding service must be available --- ## Getting Help - Check logs: `journalctl -u companion-api` or `docker-compose logs` - Verify config: `python -c "from companion.config import load_config; print(load_config())"` - Test search directly: `python -m companion.indexer_daemon.cli search "test query"` --- ## Next Steps 1. Index your vault 2. Start the API server 3. Open the web UI 4. Ask your first question 5. Explore the citations Enjoy your personal AI companion!