diff --git a/.env.example b/.env.example index 0c8c870..29672d7 100644 --- a/.env.example +++ b/.env.example @@ -1,24 +1,60 @@ -# Single-server mode (used when OLLAMA_BACKENDS_FILE is not set) +# ── LLM: Ollama (primary) ──────────────────────────────────────────────────── OLLAMA_HOST=http://localhost:11434 OLLAMA_API_KEY= OLLAMA_DEFAULT_MODEL=gemma4:31b-cloud +OLLAMA_NUM_CTX=65536 +OLLAMA_THINK=true +OLLAMA_REQUEST_TIMEOUT=30 -# Multi-server fallback mode: path to [{host, api_key?}, ...] JSON file. +# Multi-server fallback: path to JSON file [{host, api_key?}, ...] # When set, overrides OLLAMA_HOST / OLLAMA_API_KEY. -# Model priority is defined per-profile in config.json ("model": ["...", "..."]). # OLLAMA_BACKENDS_FILE=ollama_backends.json +# ── LLM: OpenAI (optional) ─────────────────────────────────────────────────── OPENAI_API_KEY= +# OPENAI_MODEL=gpt-4 +# OPENAI_BASE_URL=https://api.openai.com/v1 + ANTHROPIC_API_KEY= -# Filesystem tool: comma-separated allowed root paths +# ── Database (PostgreSQL 15+ with pgvector) ────────────────────────────────── +DATABASE_URL=postgresql://user:pass@localhost:5432/navidb + +# ── Embedding (Ollama) ───────────────────────────────────────────────────────── +# When empty, falls back to OLLAMA_HOST. +EMBEDDING_OLLAMA_HOST= +EMBEDDING_OLLAMA_API_KEY= +EMBEDDING_MODEL=nomic-embed-text:latest + +# ── Filesystem / Terminal / SSH ────────────────────────────────────────────── FS_ALLOWED_PATHS=* - -# Terminal tool: "*" = allow all commands (default, suitable for local use) -# Restrict with a comma-separated list, e.g.: ls,cat,git,systemctl TERMINAL_ALLOWED_COMMANDS=* - -# SSH tool: path to JSON file with named connections (see ssh_hosts.json.example) SSH_HOSTS_FILE=ssh_hosts.json +# ── Session files ────────────────────────────────────────────────────────────── +SESSION_FILES_DIR=session_files +SESSION_FILES_MAX_SIZE_MB=200 + +# ── Context compression ──────────────────────────────────────────────────────── +CONTEXT_COMPRESSION_ENABLED=true +CONTEXT_COMPRESSION_THRESHOLD=0.70 +CONTEXT_KEEP_RECENT=8 +CONTEXT_SUMMARY_TEMPERATURE=0.3 +CONTEXT_SUMMARY_MAX_TOKENS=3000 + +# ── Logging ──────────────────────────────────────────────────────────────────── LOG_LEVEL=INFO + +# ── Public URL (used by share_file for download links) ─────────────────────── +PUBLIC_URL=http://localhost:8000 + +# ── Persona ───────────────────────────────────────────────────────────────────── +# Preferred: put persona in persona.txt and set NAVI_PERSONA_FILE. +NAVI_PERSONA_FILE=persona.txt +# NAVI_PERSONA="You are Navi, a loyal assistant..." + +# ── User tools ───────────────────────────────────────────────────────────────── +TOOLS_DIR=tools + +# ── Eval system (optional) ───────────────────────────────────────────────────── +# EVAL_DATA_DIR=debug/eval diff --git a/README.md b/README.md index 3116cc0..a5d6e77 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,21 @@ ## Запуск ```bash +# 1. Клонировать + git clone && cd navi-1 + +# 2. Зависимости python3 -m venv .venv source .venv/bin/activate pip install -e ".[dev]" -cp .env.example .env # настрой OLLAMA_HOST, DATABASE_URL и др. +# 3. База данных (PostgreSQL 15+ с pgvector) +# См. "База данных" ниже — создай БД, пользователя и включи расширения. +# 4. Конфигурация +cp .env.example .env # отредактируй DATABASE_URL, OLLAMA_HOST и др. + +# 5. Запуск uvicorn navi.main:app --reload --reload-dir navi --port 8000 ``` @@ -73,7 +82,7 @@ ├── tools/ # встроенные инструменты (~20 шт.) ├── profiles/ # профили агентов: secretary, server_admin, smart_home, developer ├── core/ # Agent, registry, session, compressor, events -├── memory/ # долгосрочная память (PostgreSQL или SQLite) +├── memory/ # долгосрочная память (PostgreSQL + pgvector) ├── workers/ # post-turn workers (CompressionWorker, MemoryWorker) └── api/ # роуты и WebSocket handler @@ -121,20 +130,46 @@ ## База данных -Нави поддерживает два варианта хранилища — выбор определяется наличием `DATABASE_URL` в `.env`. +Нави требует **PostgreSQL 15+** с расширениями `pgvector` и (опционально) `pg_trgm`. -**PostgreSQL** (рекомендуется для production): -```dotenv -DATABASE_URL=postgresql://user:password@host:5432/navidb -``` -Требует `asyncpg`. Использует пул соединений. Хранит сессии и долгосрочную память в одной базе. +### Установка PostgreSQL и расширений -**SQLite** (быстрый старт, без внешних зависимостей): -```dotenv -# DATABASE_URL не задан — автоматически используется SQLite -DB_PATH=navi.db # опционально, по умолчанию navi.db +**Ubuntu / Debian:** +```bash +sudo apt install postgresql-15 postgresql-15-pgvector +sudo -u postgres psql -c "CREATE DATABASE navidb;" +sudo -u postgres psql -c "CREATE USER navi WITH PASSWORD 'navipass';" +sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE navidb TO navi;" +sudo -u postgres psql navidb -c "CREATE EXTENSION IF NOT EXISTS vector;" +sudo -u postgres psql navidb -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" ``` +**Arch Linux:** +```bash +sudo pacman -S postgresql pgvector +# Аналогичные команды для создания БД и пользователя +``` + +**Docker:** +```bash +docker run -d \ + --name navi-postgres \ + -e POSTGRES_USER=navi \ + -e POSTGRES_PASSWORD=navipass \ + -e POSTGRES_DB=navidb \ + -p 5432:5432 \ + ankane/pgvector:latest +# pgvector и pg_trgm уже включены в образ ankane/pgvector +``` + +### Переменные окружения + +```dotenv +DATABASE_URL=postgresql://navi:navipass@localhost:5432/navidb +``` + +Если `pg_trgm` не установлен, приложение запустится, но GIN-индексы для текстового поиска не будут созданы (semantic search через pgvector продолжит работать). + ## Конфигурация (.env) Ключевые переменные (полный список: [`docs/config.md`](docs/config.md)): @@ -146,10 +181,15 @@ OLLAMA_DEFAULT_MODEL=gemma4:31b-cloud OLLAMA_NUM_CTX=65536 OLLAMA_THINK=true +OLLAMA_REQUEST_TIMEOUT=30 -# База данных (выбери одно) -DATABASE_URL=postgresql://user:pass@host:5432/db # PostgreSQL -# DB_PATH=navi.db # SQLite (если DATABASE_URL не задан) +# OpenAI (опционально, если используешь OpenAI backend) +OPENAI_API_KEY= +OPENAI_MODEL=gpt-4 +# OPENAI_BASE_URL=https://api.openai.com/v1 + +# База данных (обязательно — PostgreSQL) +DATABASE_URL=postgresql://user:pass@host:5432/db # Персона NAVI_PERSONA_FILE=persona.txt diff --git a/docs/config.md b/docs/config.md index d17c09d..3f0bc64 100644 --- a/docs/config.md +++ b/docs/config.md @@ -12,7 +12,10 @@ | `OLLAMA_NUM_CTX` | int | `65536` | Context window size in tokens | | `OLLAMA_THINK` | bool | `true` | Enable extended reasoning (thinking) | | `OLLAMA_BACKENDS_FILE` | str | `""` | Path to JSON file with multi-server config (see below). When set, overrides `OLLAMA_HOST`/`OLLAMA_API_KEY`. | +| `OLLAMA_REQUEST_TIMEOUT` | int | `30` | Seconds before Ollama request times out (affects fallback speed) | | `OPENAI_API_KEY` | str | `""` | OpenAI API key (if using OpenAI backend) | +| `OPENAI_MODEL` | str | `"gpt-4"` | Default model for OpenAI backend | +| `OPENAI_BASE_URL` | str | `None` | Custom base URL for OpenAI-compatible endpoints (e.g. vLLM, LM Studio) | | `ANTHROPIC_API_KEY` | str | `""` | Anthropic API key (if using Anthropic backend) | For direct Ollama Cloud access without fallback: set `OLLAMA_HOST=https://ollama.com` and `OLLAMA_API_KEY=`. @@ -67,8 +70,7 @@ | Variable | Type | Default | Description | |---|---|---|---| -| `DB_PATH` | str | `navi.db` | SQLite database file path | -| `DATABASE_URL` | str | `""` | PostgreSQL URL (`postgresql://user:pass@host:port/db`). Overrides `DB_PATH` when set. | +| `DATABASE_URL` | str | `""` | PostgreSQL URL (`postgresql://user:pass@host:port/db`). **Required** — Navi requires PostgreSQL 15+ with `pgvector` extension. | ## Logging @@ -126,27 +128,38 @@ ## Example `.env` ```dotenv -# Single-server mode: +# LLM — Ollama (primary) OLLAMA_HOST=http://localhost:11434 OLLAMA_API_KEY= OLLAMA_DEFAULT_MODEL=gemma4:31b-cloud +OLLAMA_NUM_CTX=65536 +OLLAMA_THINK=true +OLLAMA_REQUEST_TIMEOUT=30 # Multi-server fallback mode (overrides OLLAMA_HOST/API_KEY): # OLLAMA_BACKENDS_FILE=ollama_backends.json -OLLAMA_NUM_CTX=65536 -OLLAMA_THINK=true +# LLM — OpenAI (optional) +# OPENAI_API_KEY=sk-... +# OPENAI_MODEL=gpt-4 +# OPENAI_BASE_URL=https://api.openai.com/v1 +# Database (PostgreSQL 15+ with pgvector) +DATABASE_URL=postgresql://user:pass@localhost:5432/navidb + +# Security / sandboxing FS_ALLOWED_PATHS=* TERMINAL_ALLOWED_COMMANDS=* -DB_PATH=navi.db +# Misc LOG_LEVEL=INFO TOOLS_DIR=tools +# Context compression CONTEXT_COMPRESSION_ENABLED=true CONTEXT_COMPRESSION_THRESHOLD=0.70 CONTEXT_KEEP_RECENT=8 +# Persona NAVI_PERSONA_FILE=persona.txt ```