| docs | 2 months ago | ||
| manuals | 2 months ago | ||
| navi | 2 months ago | ||
| old_webclient | 2 months ago | ||
| tools | 2 months ago | ||
| webclient | 2 months ago | ||
| workspace | 2 months ago | ||
| .env.example | 2 months ago | ||
| .gitignore | 2 months ago | ||
| CLAUDE.md | 2 months ago | ||
| README.md | 2 months ago | ||
| install_essentials.sh | 2 months ago | ||
| persona.txt | 2 months ago | ||
| pyproject.toml | 2 months ago | ||
| ssh_hosts.json.example | 2 months ago | ||
Модульная агентная система с REST API и WebSocket. FastAPI бэкенд, Ollama LLM, vanilla JS клиент.
python3 -m venv .venv source .venv/bin/activate pip install -e ".[dev]" cp .env.example .env # настрой OLLAMA_HOST, DATABASE_URL и др. 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 или SQLite) ├── 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.
Нави поддерживает два варианта хранилища — выбор определяется наличием DATABASE_URL в .env.
PostgreSQL (рекомендуется для production):
DATABASE_URL=postgresql://user:password@host:5432/navidb
Требует asyncpg. Использует пул соединений. Хранит сессии и долгосрочную память в одной базе.
SQLite (быстрый старт, без внешних зависимостей):
# DATABASE_URL не задан — автоматически используется SQLite DB_PATH=navi.db # опционально, по умолчанию navi.db
Ключевые переменные (полный список: docs/config.md):
# LLM OLLAMA_HOST=http://localhost:11434 OLLAMA_DEFAULT_MODEL=gemma4:e4b-it-q8_0 OLLAMA_NUM_CTX=65536 OLLAMA_THINK=true # База данных (выбери одно) DATABASE_URL=postgresql://user:pass@host:5432/db # PostgreSQL # DB_PATH=navi.db # SQLite (если DATABASE_URL не задан) # Персона NAVI_PERSONA_FILE=persona.txt