| android-client | 2 months ago | ||
| context_providers | 2 months ago | ||
| debug | 1 month ago | ||
| docs | 1 month ago | ||
| manuals | 2 months ago | ||
| navi | 1 month ago | ||
| static/ css | 2 months ago | ||
| templates | 2 months ago | ||
| tests | 1 month ago | ||
| tools | 2 months ago | ||
| webclient | 1 month ago | ||
| workspace | 2 months ago | ||
| .env.example | 1 month ago | ||
| .gitignore | 1 month ago | ||
| CLAUDE.md | 2 months ago | ||
| NAVI.md | 2 months ago | ||
| README.md | 1 month ago | ||
| app.py | 2 months ago | ||
| persona.txt | 1 month ago | ||
| pyproject.toml | 1 month ago | ||
| requirements.txt | 1 month ago | ||
Модульная агентная система с REST API и WebSocket. FastAPI бэкенд, Ollama LLM, vanilla JS клиент.
# 1. Клонировать git clone <repo> && cd navi-1 # 2. Зависимости python3 -m venv .venv source .venv/bin/activate pip install -e ".[dev]" # 3. База данных (PostgreSQL 15+ с pgvector) # См. "База данных" ниже — создай БД, пользователя и включи расширения. # 4. Конфигурация cp .env.example .env # отредактируй DATABASE_URL, OLLAMA_HOST и др. # 5. Запуск uvicorn navi.main:app --reload --reload-dir navi --port 8000
Клиент: http://localhost:8000
Swagger UI: http://localhost:8000/docs
Debug panel: http://localhost:8000/debug
# 1. Создать сессию с профилем "secretary"
curl -X POST http://localhost:8000/sessions \
-H "Content-Type: application/json" \
-d '{"profile_id": "secretary"}'
# 2. Отправить сообщение (замени <session_id>)
curl -X POST http://localhost:8000/sessions/<session_id>/messages \
-H "Content-Type: application/json" \
-d '{"content": "Найди последние новости про Python 3.13"}'
ws://localhost:8000/ws/sessions/<session_id>
Клиент отправляет:
{"type": "message", "content": "...", "images": [...], "files": [...]}
Сервер стримит события в порядке:
stream_start plan_ready (если profile.planning_enabled — план до начала выполнения) thinking_delta* (reasoning chunks) thinking_end turn_thinking (reasoning из tool-calling турна, целиком) tool_started (начало вызова инструмента — pending card в UI) tool_call (инструмент завершён — результат) stream_delta* (финальный текстовый ответ) stream_end context_compressed (опционально — после сжатия контекста)
Остановить генерацию: POST /sessions/<session_id>/stop
Полная спецификация: docs/websocket.md и docs/api.md
navi/ ├── main.py # FastAPI app, роутеры, startup hooks ├── config.py # настройки через .env (pydantic-settings) ├── exceptions.py # доменные исключения ├── llm/ # LLM бэкенды: ollama.py, openai_backend.py ├── tools/ # встроенные инструменты (~20 шт.) ├── profiles/ # профили агентов: secretary, server_admin, smart_home, developer ├── core/ # Agent, registry, session, compressor, events ├── memory/ # долгосрочная память (PostgreSQL + pgvector) ├── workers/ # post-turn workers (CompressionWorker, MemoryWorker) └── api/ # роуты и WebSocket handler tools/ # пользовательские инструменты (auto-discovered) ├── enabled.json # список инструментов, активных во всех профилях ├── _template.py # шаблон формата ├── get_current_datetime.py ├── user_notes.py └── weather.py manuals/ # markdown-мануалы для tool_manual docs/ # архитектурная документация persona.txt # глобальная личность и инструкции агента
| ID | Назначение | Температура | Планирование |
|---|---|---|---|
secretary |
Исследования, написание текстов, повседневные задачи | 0.7 | ✓ |
server_admin |
Администрирование серверов, мониторинг, инфраструктура | 0.2 | ✓ |
smart_home |
Home Assistant, IoT, автоматизации | 0.3 | ✓ |
developer |
Написание, тестирование и отладка пользовательских инструментов | 0.2 | ✓ |
Каждый профиль определяет свой набор enabled_tools. developer — единственный профиль с reload_tools, delete_tool и test_tool; остальные профили не имеют доступа к инструментам разработки.
Пользовательский инструмент — переключись в профиль developer и попроси Нави создать инструмент. Она напишет файл в tools/, протестирует через test_tool и перезагрузит через reload_tools. Либо вручную создай tools/my_tool.py:
name = "my_tool"
description = "Когда и зачем использовать."
parameters = {"type": "object", "properties": {...}, "required": [...]}
async def execute(params: dict) -> str:
return "результат"
Добавить во все профили: занести имя в tools/enabled.json.
Новый профиль — создай navi/profiles/my_profile.py, добавь в ALL_PROFILES в __init__.py.
Новый LLM бэкенд — реализуй LLMBackend из navi/llm/base.py, зарегистрируй в build_default_registries() в navi/core/registry.py.
Нави требует PostgreSQL 15+ с расширениями pgvector и (опционально) pg_trgm.
Ubuntu / Debian:
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:
sudo pacman -S postgresql pgvector # Аналогичные команды для создания БД и пользователя
Docker:
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
DATABASE_URL=postgresql://navi:navipass@localhost:5432/navidb
Если pg_trgm не установлен, приложение запустится, но GIN-индексы для текстового поиска не будут созданы (semantic search через pgvector продолжит работать).
Ключевые переменные (полный список: docs/config.md):
# LLM 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 # 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
Для прямого доступа к Ollama Cloud:
OLLAMA_HOST=https://ollama.com OLLAMA_API_KEY=your_api_key
Также укажи cloud-модель в navi/profiles/*/config.json, потому что профили могут переопределять OLLAMA_DEFAULT_MODEL.