diff --git a/README.md b/README.md index 4f29592..76cb3b4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ navi-1 =============== -Модульная агентная система с REST API и WebSocket. +Модульная агентная система с REST API и WebSocket. FastAPI бэкенд, Ollama LLM, vanilla JS клиент. ## Запуск @@ -10,13 +10,14 @@ source .venv/bin/activate pip install -e ".[dev]" -cp .env.example .env # при необходимости настрой +cp .env.example .env # настрой OLLAMA_HOST, NAVI_PERSONA_FILE и др. -uvicorn navi.main:app --reload +uvicorn navi.main:app --reload --reload-dir navi --port 8000 ``` -API доступно по адресу `http://localhost:8000`. -Swagger UI: `http://localhost:8000/docs` +Клиент: `http://localhost:8000` +Swagger UI: `http://localhost:8000/docs` +Debug panel: `http://localhost:8000/debug` ## Быстрый старт (REST) @@ -38,35 +39,99 @@ ws://localhost:8000/ws/sessions/ ``` -Клиент отправляет: `{"type": "message", "content": "..."}` -Сервер стримит: `stream_start` → `tool_call*` → `stream_delta*` → `stream_end` +Клиент отправляет: +```json +{"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//stop` + +Полная спецификация: [`docs/websocket.md`](docs/websocket.md) и [`docs/api.md`](docs/api.md) ## Структура ``` navi/ -├── main.py # FastAPI app -├── config.py # настройки через .env +├── main.py # FastAPI app, роутеры, startup hooks +├── config.py # настройки через .env (pydantic-settings) ├── exceptions.py # доменные исключения -├── llm/ # LLM бекенды (ollama, openai stub) -├── tools/ # инструменты (web_search, filesystem, http, code, terminal) -├── profiles/ # профили агентов (smart_home, server_admin, secretary) -├── core/ # агент, реестры, сессии -└── api/ # роуты и WebSocket +├── llm/ # LLM бэкенды: ollama.py, openai_backend.py +├── tools/ # встроенные инструменты (18 шт.) +├── profiles/ # профили агентов: secretary, server_admin, smart_home +├── core/ # Agent, registry, session, compressor, events +├── memory/ # долгосрочная память (SQLite, extractor) +├── workers/ # post-turn workers (CompressionWorker) +└── api/ # роуты и WebSocket handler + +tools/ # пользовательские инструменты (auto-discovered) +├── enabled.json # список инструментов, активных во всех профилях +├── _template.py # шаблон формата +├── get_current_datetime.py +└── user_notes.py + +manuals/ # markdown-мануалы для tool_manual +docs/ # архитектурная документация +persona.txt # глобальная личность и инструкции агента ``` ## Профили -| ID | Описание | Инструменты | -|----|----------|-------------| -| `smart_home` | Умный дом / Home Assistant | http, filesystem, code, terminal | -| `server_admin` | Администрирование серверов | terminal, filesystem, http, web_search | -| `secretary` | Личный секретарь | web_search, http, filesystem, code | +Все три профиля имеют одинаковый базовый набор инструментов: + +``` +todo, scratchpad, switch_profile, +web_search, web_view, http_request, +filesystem, code_exec, terminal, ssh_exec, image_view, +memory_search, memory_forget, +reload_tools, write_tool, list_tools, tool_manual, spawn_agent +``` + +| ID | Назначение | Температура | Планирование | +|----|-----------|-------------|--------------| +| `secretary` | Исследования, написание текстов, повседневные задачи | 0.7 | ✓ | +| `server_admin` | Администрирование серверов, мониторинг, инфраструктура | 0.2 | ✓ | +| `smart_home` | Home Assistant, IoT, автоматизации | 0.3 | ✓ | ## Расширение +**Пользовательский инструмент** — создай `tools/my_tool.py` в формате: +```python +name = "my_tool" +description = "Когда и зачем использовать." +parameters = {"type": "object", "properties": {...}, "required": [...]} + +async def execute(params: dict) -> str: + return "результат" +``` +Перезагрузка без рестарта сервера: инструмент `reload_tools` или `write_tool`. +Добавить во все профили: занести имя в `tools/enabled.json`. + **Новый профиль** — создай `navi/profiles/my_profile.py`, добавь в `ALL_PROFILES` в `__init__.py`. -**Новый инструмент** — реализуй `Tool` из `navi/tools/base.py`, зарегистрируй в `navi/core/registry.py`. +**Новый LLM бэкенд** — реализуй `LLMBackend` из `navi/llm/base.py`, зарегистрируй в `build_default_registries()` в `navi/core/registry.py`. -**Новый LLM бекенд** — реализуй `LLMBackend` из `navi/llm/base.py`, зарегистрируй в `navi/core/registry.py`. +## Конфигурация (.env) + +Ключевые переменные (полный список: [`docs/config.md`](docs/config.md)): + +```dotenv +OLLAMA_HOST=http://localhost:11434 +OLLAMA_DEFAULT_MODEL=gemma4:e2b-it-q8_0 +OLLAMA_NUM_CTX=65536 +OLLAMA_THINK=true +NAVI_PERSONA_FILE=persona.txt +```