Surfaces voice macros and scheduled tasks in the GUI, so the user doesn't
have to remember voice commands or grep schedule.json by hand.
Tauri commands (crates/jarvis-gui/src/tauri_commands/)
- macros.rs: macros_list, macros_replay, macros_delete, macros_is_recording,
macros_recording_name, macros_start_recording, macros_save_recording,
macros_cancel_recording (8 commands).
- scheduler.rs: scheduler_list, scheduler_remove, scheduler_clear (3 commands).
- Both exposed in main.rs invoke_handler.
GUI pages (frontend/src/routes/)
- macros/index.svelte:
* Lists all macros with name, steps_count, first 5 step previews,
created/last_run timestamps.
* Top: TextInput + "Начать запись" button. While recording shows orange
banner with "Сохранить"/"Отменить" buttons + polls is_recording every 2s.
* Per-card: "Запустить" (with busy state for replay duration), "Удалить".
* confirm() before delete.
- scheduler/index.svelte:
* Lists tasks with name, schedule_human (e.g. "каждые 2 ч"), action body,
ID, timestamps, action_kind badge.
* "Отменить" per task + "Очистить всё (N)" bottom button.
* Auto-polls every 5s (so the list updates as scheduler ticks fire tasks).
Header (frontend/src/components/Header.svelte)
- Two new buttons: "Макросы" → /macros, "Расписание" → /scheduler.
- Beside existing /commands and /settings buttons.
i18n
- ru/en/ua FTL: settings-ai-backends, settings-llm-*, settings-tts-*,
settings-profile, header-macros, header-scheduler.
- Re-applied AI Backends keys for ua.ftl (earlier edit hadn't taken).
README.md (full rewrite)
- Old README was 178 lines mostly explaining LLM-trigger flow and VAD config.
- New README is ~190 lines covering: features (LLM hot-swap, memory, profiles,
vision, scheduler, macros, utilities table), quick start, env vars table,
build steps with vcvars setup, test command, structure tree, voice workflow
diagram, license, roadmap.
- Up to date for 59 packs and all new infra.
Build: cargo build --release -p jarvis-gui green (2m). 55/55 tests pass.
288 lines
15 KiB
Markdown
288 lines
15 KiB
Markdown
# J.A.R.V.I.S. (Rust) — форк Bossiara13
|
||
|
||
Локальный голосовой ассистент для Windows. Форк Rust-переписки
|
||
[Priler/jarvis](https://github.com/Priler/jarvis). Сильно расширен в этом форке
|
||
(см. ниже). Может работать **полностью офлайн** через Ollama, или с облачным
|
||
LLM через Groq — выбор переключается **голосом** на лету.
|
||
|
||
Зеркала:
|
||
- GitHub: <https://github.com/DmitryBykov-ISPO/J.A.R.V.I.S-rust>
|
||
- Forgejo (self-hosted): `http://192.168.0.10:3000/bossiara13/J.A.R.V.I.S-rust`
|
||
(только в LAN; используй `NO_PROXY=192.168.0.10` если у тебя локальный прокси)
|
||
|
||
Для контрибьюторов: см. [ARCHITECTURE.md](ARCHITECTURE.md) — карта кода, data flow,
|
||
рецепты "как добавить пак / фичу / TTS backend".
|
||
|
||
## Что внутри
|
||
|
||
- **STT**: Vosk + webrtc-vad для умного завершения по тишине.
|
||
- **Wake-word**: Vosk / Rustpotter / Picovoice Porcupine (выбор в Settings).
|
||
- **TTS**: трёхбэкендовая абстракция — SAPI (стоковый), **Piper** (нейронный,
|
||
рекомендуется, ~90 МБ), Silero (PyTorch). Выбор через `JARVIS_TTS` или GUI.
|
||
- **LLM**: двухбэкендовая — **Groq** (облако, бесплатно) или **Ollama** (локально,
|
||
офлайн). Hot-swap через голос / GUI / `JARVIS_LLM`. Выбор сохраняется в БД.
|
||
- **Lua sandbox**: каждая команда — Lua-скрипт с тремя уровнями песочницы.
|
||
Полный API: `jarvis.speak/llm/http/fs/state/system/memory/profile/scheduler/
|
||
vision/macros/cmd/text/...` — см. ARCHITECTURE.md.
|
||
- **Tauri 2 GUI**: 4 страницы (главная, /commands список 59 паков, /settings,
|
||
футер с активными движками).
|
||
|
||
## Возможности (то, чего нет в апстриме)
|
||
|
||
### Управление LLM
|
||
|
||
- **Agentic LLM router (IMBA-1)**: если fuzzy/intent не нашёл команду, LLM
|
||
выбирает ближайшую из реестра по JSON-схеме. Алисе/Сири такое не снилось.
|
||
- **Hot-swap локального и облачного LLM**: "переключись на локальный" /
|
||
"переключись на облако". Выбор персистентен (Settings → AI Backends).
|
||
- **Reset/repeat контекст**: "сбрось контекст" / "повтори последнее".
|
||
- **Memory injection**: LLM автоматически получает релевантные факты из
|
||
долгосрочной памяти в system prompt.
|
||
|
||
### Долгосрочная память
|
||
|
||
- "Запомни что я люблю чай улун" → JSON-стор в `<APP_CONFIG_DIR>/long_term_memory.json`.
|
||
- "Что ты помнишь про чай" / "забудь про X" / "что ты знаешь обо мне".
|
||
- LLM-чат получает релевантные факты через substring search.
|
||
|
||
### Профили
|
||
|
||
- 5 предзаполненных: default ★, work 💼, game 🎮, sleep 🌙, driving 🚗.
|
||
- "Режим работа" / "режим игра" / "режим сон" / "режим за рулём" / "обычный режим".
|
||
- Каждый профиль может иметь allow/deny списки команд + personality для LLM.
|
||
|
||
### Vision (multimodal)
|
||
|
||
- "Что на экране" / "опиши экран" / "прочитай ошибку" → скриншот через
|
||
PowerShell → base64 → Groq vision (`llama-3.2-11b-vision-preview`) → голос.
|
||
- Требует `GROQ_TOKEN` (Ollama пока без vision в этой интеграции).
|
||
|
||
### Проактивный планировщик
|
||
|
||
- "Напомни через 5 минут выключить кофеварку" → one-shot.
|
||
- "Каждые 2 часа напоминай попить воды" → interval.
|
||
- "Каждый день в 9:00 делай брифинг" → daily.
|
||
- "Отмени напоминание про воду" / "очисти расписание" / "что у меня запланировано".
|
||
- Фоновый поток (тик каждые 30 сек). Сохраняется в `<APP_CONFIG_DIR>/schedule.json`.
|
||
|
||
### Voice macros (VoiceAttack-style)
|
||
|
||
- "Запиши макрос работа" → начинает запись.
|
||
- Любые следующие команды (открой браузер, режим работа, ...) копятся.
|
||
- "Сохрани макрос" → персистится.
|
||
- "Запусти макрос работа" → проигрывает каждый шаг с интервалом 800мс.
|
||
- Список / удаление / отмена.
|
||
|
||
### Утилиты
|
||
|
||
| Команда | Что делает |
|
||
|---|---|
|
||
| "Найди в гугле X" | DuckDuckGo Instant Answer + LLM-перессказ |
|
||
| "Википедия X" / "что такое X" | Wikipedia REST API (ru→en fallback) + LLM-перевод |
|
||
| "Сколько 1000 долларов в рублях" | CBR-XML курс + конвертация |
|
||
| "Сколько Сбер" | MOEX биржа, 22 тикера в карте |
|
||
| "Переведи буфер" | Clipboard → LLM → обратно в clipboard |
|
||
| "Напоминай мне пить воду" | Habit nudge: каждые 2 часа |
|
||
| "Напоминай размяться" | Каждые 50 минут |
|
||
| "Напоминай отдыхать глазам" | 20-20-20 rule, каждые 20 минут |
|
||
| "Запусти помодоро" | 25/5 циклы с голосовыми напоминаниями |
|
||
| "Запиши настроение 7" / "как прошла неделя" | Mood log + LLM-сводка |
|
||
| "Утренний брифинг" / "настрой утренний брифинг на 9:00" | Время+профиль+задачи+память+LLM-мотивашка |
|
||
| "Укажи проект C:\..." / "что делает функция X" | Codebase Q&A — LLM по локальной кодобазе |
|
||
| "Открытые пиары" / "разбери последний PR" | gh CLI + LLM-ревью |
|
||
| "Пауза" / "следующий трек" | Windows media keys (Spotify / YouTube / Foobar) |
|
||
| "Диагностика" / "доложи о себе" | Состояние всех бэкендов одной строкой |
|
||
|
||
Всего паков: **59** (`resources/commands/*/command.toml`).
|
||
Полный список: GUI → /commands (с поиском и фильтрами).
|
||
|
||
## Быстрый старт
|
||
|
||
```powershell
|
||
# 1. Клонировать
|
||
git clone https://github.com/DmitryBykov-ISPO/J.A.R.V.I.S-rust.git C:\Jarvis\rust
|
||
cd C:\Jarvis\rust
|
||
|
||
# 2. Поставить нейронный TTS (один раз, ~90 МБ)
|
||
pwsh tools/piper/install.ps1
|
||
|
||
# 3a. Облачный LLM — получи токен на https://console.groq.com/keys
|
||
echo "GROQ_TOKEN=gsk_..." > dev.env
|
||
|
||
# 3b. ИЛИ локальный LLM
|
||
# Скачай https://ollama.com/download, выполни:
|
||
# ollama pull qwen2.5:3b
|
||
# (Jarvis сам подхватит, если GROQ_TOKEN отсутствует)
|
||
|
||
# 4. Сборка
|
||
cd frontend && npm install && npm run build && cd ..
|
||
cargo build --release -p jarvis-app -p jarvis-gui
|
||
|
||
# 5. Запуск
|
||
target\release\jarvis-app.exe # фоновый демон с микрофоном
|
||
target\release\jarvis-gui.exe # GUI для управления
|
||
```
|
||
|
||
Подробнее: см. секцию "Сборка" ниже.
|
||
|
||
## Конфигурация (env vars)
|
||
|
||
Все JARVIS_* / GROQ_* / OLLAMA_* переменные документированы в
|
||
`crates/jarvis-core/src/runtime_config.rs`. Ключевые:
|
||
|
||
| Переменная | По умолчанию | Назначение |
|
||
|---|---|---|
|
||
| `GROQ_TOKEN` | — | Токен для облачного LLM (без него — Ollama / выкл) |
|
||
| `GROQ_MODEL` | `llama-3.3-70b-versatile` | Groq-модель |
|
||
| `GROQ_VISION_MODEL` | `llama-3.2-11b-vision-preview` | Vision-модель для "что на экране" |
|
||
| `OLLAMA_BASE_URL` | `http://localhost:11434/v1` | Адрес Ollama |
|
||
| `OLLAMA_MODEL` | `qwen2.5:3b` | Локальная модель (любая через `ollama pull`) |
|
||
| `JARVIS_LLM` | auto | `groq` / `ollama` / пусто (auto-detect) |
|
||
| `JARVIS_TTS` | auto | `sapi` / `piper` / `silero` / пусто (auto) |
|
||
| `JARVIS_TTS_PIPER_BIN` | автопоиск | Путь к piper.exe |
|
||
| `JARVIS_TTS_PIPER_VOICE` | автопоиск | Путь к голосу .onnx |
|
||
| `JARVIS_LLM_ROUTER` | `1` | Включить agentic router |
|
||
| `JARVIS_LLM_ROUTER_THRESHOLD` | `0.55` | Confidence threshold |
|
||
| `JARVIS_LLM_TTS` | `true` | Озвучивать LLM-ответ |
|
||
|
||
Файл `dev.env` подхватывается автоматически (jarvis-app ищет от exe вверх по 5
|
||
уровням), так что переменные можно держать в одном месте.
|
||
|
||
Персистентные настройки (`voice`, `microphone`, `vosk_model`, `llm_backend`,
|
||
`tts_backend`, ...) хранятся в `<APP_CONFIG_DIR>/settings.json` и правятся
|
||
через GUI Settings или Lua `jarvis.settings.set(key, val)`.
|
||
|
||
## Сборка
|
||
|
||
Требования:
|
||
|
||
- Rust 1.93+ (stable MSVC).
|
||
- Node 20+ и npm для фронтенда.
|
||
- MSVC build tools (`vcvars64.bat`). VS 2022 / 2026 / 2026 — любая.
|
||
- Python 3 (только для `post_build.py`, опционально).
|
||
- Vosk/Porcupine/PvRecorder DLL'и в `lib/windows/amd64/` (уже в репо).
|
||
|
||
Команды:
|
||
|
||
```powershell
|
||
# Один раз: загрузить MSVC окружение
|
||
$vc = "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
|
||
cmd /c "`"$vc`" >NUL && set" | % {
|
||
if ($_ -match '^([^=]+)=(.*)$') {
|
||
[Environment]::SetEnvironmentVariable($matches[1], $matches[2], 'Process')
|
||
}
|
||
}
|
||
|
||
# Собрать фронтенд
|
||
cd frontend
|
||
npm install
|
||
npm run build
|
||
cd ..
|
||
|
||
# Workspace
|
||
cargo build --release -p jarvis-app -p jarvis-gui
|
||
```
|
||
|
||
Холодная сборка ~10 мин (ONNX runtime, aws-lc-rs, tauri). Инкремент ~30 сек.
|
||
|
||
`jarvis-gui/build.rs` сам зовёт `npm run build` если фронтенд устарел, так что
|
||
для итераций по UI достаточно `cargo build -p jarvis-gui`.
|
||
|
||
## Тесты
|
||
|
||
```powershell
|
||
cargo test -p jarvis-core --lib # все unit-тесты
|
||
cargo test -p jarvis-core --lib scheduler:: # фильтр по модулю
|
||
```
|
||
|
||
Текущее покрытие: **55 unit-тестов**, см. таблицу в ARCHITECTURE.md.
|
||
|
||
## Структура
|
||
|
||
```
|
||
crates/
|
||
jarvis-core library — STT, wake-word, TTS, LLM, intent, commands, IPC,
|
||
Lua sandbox, scheduler, memory, profiles, macros, vision
|
||
jarvis-app daemon бинарь — микрофон, listening loop, dispatcher, tray, IPC
|
||
jarvis-gui Tauri + Svelte GUI — settings, commands list, footer chips
|
||
jarvis-cli debug CLI (classify/execute/list)
|
||
|
||
frontend/ Vite + Svelte UI для jarvis-gui
|
||
resources/
|
||
commands/ 59 voice-command packs (Lua скрипты + TOML)
|
||
models/ ONNX (intent classifier, GLiNER) — Git LFS
|
||
vosk/ Vosk модели (small-ru, small-en, ...)
|
||
voices/ пресеты звуков реакций (greet/ok/error/...)
|
||
|
||
tools/
|
||
piper/ Piper TTS бинарник + голоса (.onnx) — устанавливаются install.ps1
|
||
silero/ Python helper для Silero TTS (опционально)
|
||
|
||
ARCHITECTURE.md — для контрибьюторов: data flow, рецепты, тесты.
|
||
```
|
||
|
||
## Голосовой workflow
|
||
|
||
Поднимаешь `jarvis-app.exe`, говоришь:
|
||
|
||
```
|
||
"Джарвис" ─ wake-word
|
||
↓ играет "reply" звук
|
||
"Какая сегодня погода?"
|
||
↓ STT (Vosk) распознаёт
|
||
↓ Intent classifier (MiniLM ONNX) пробует найти команду
|
||
↓ Levenshtein fallback
|
||
↓ Agentic LLM router (если включён)
|
||
↓ LLM fallback (chat)
|
||
↓ Озвучивает ответ
|
||
"Какая температура завтра?"
|
||
↓ 30-сек grace window — без повторного wake-word
|
||
↓ LLM помнит контекст разговора
|
||
```
|
||
|
||
После каждой команды есть 30-секундное окно для follow-up без повторного
|
||
"Джарвис" (`CONVERSATION_GRACE_MS`).
|
||
|
||
## Это форк
|
||
|
||
Оригинальный автор — Abraham Tugalov (Priler).
|
||
Апстрим: <https://github.com/Priler/jarvis>.
|
||
Лицензия сохранена: **CC BY-NC-SA 4.0** (см. `LICENSE.txt`).
|
||
|
||
В `Cargo.toml` декларирован `license = "GPL-3.0-only"` — это несоответствие
|
||
унаследовано от апстрима и не правилось, чтобы не расходиться с upstream-конфигом.
|
||
Приоритет имеет `LICENSE.txt`.
|
||
|
||
## Python-версия
|
||
|
||
Старая версия ассистента была на Python. Последний коммит с Python-кодом в
|
||
апстриме — [943efbf](https://github.com/Priler/jarvis/tree/943efbfbdb8aeb5889fa5e2dc7348ca4ea0b81df).
|
||
Параллельный Python-форк живёт в отдельном репо
|
||
([J.A.R.V.I.S-py](https://github.com/DmitryBykov-ISPO/J.A.R.V.I.S-py)) — там же,
|
||
но **17 новых паков из Rust-форка пока туда не зеркалированы** (TODO).
|
||
|
||
## Поддерживаемость
|
||
|
||
- `runtime_config.rs` — все env vars в одном файле с doc-комментами.
|
||
- `tts/` — trait-based, добавить новый бэкенд = реализовать `TtsBackend`.
|
||
- `llm/mod.rs` — shared global client, hot-swap через `swap_to(LlmBackend)`.
|
||
- `jarvis.cmd.{ok/error/not_found}` — boilerplate-killer для Lua-паков.
|
||
- 55 unit-тестов прикрывают всё, что не требует мика/динамика/сети.
|
||
- ARCHITECTURE.md содержит рецепты "как добавить X".
|
||
|
||
## Что в roadmap (что ещё хочется)
|
||
|
||
- **faster-whisper STT** рядом с Vosk для длинных LLM-фраз.
|
||
- **Реальные Win32 макросы** (keyboard + mouse hooks), не только voice replay.
|
||
- **Spotify Web API** через OAuth — "что играет", "сохрани в плейлист".
|
||
- **Outlook COM** — голосовая почта / календарь.
|
||
- **GUI /macros + /scheduler страницы** — управление без голоса.
|
||
- **Python parity** для 17 новых паков.
|
||
|
||
См. `~/.claude/projects/C--Jarvis/memory/project_jarvis_roadmap.md` (если ты
|
||
— Claude помогаешь автору) или открой issue.
|
||
|
||
## Лицензия
|
||
|
||
CC BY-NC-SA 4.0 — Creative Commons **Attribution-NonCommercial-ShareAlike**.
|
||
Полный текст: `LICENSE.txt`. Атрибуция Abraham Tugalov сохранена.
|