Fork of Priler/jarvis (CC BY-NC-SA 4.0) https://github.com/Priler/jarvis
Find a file
Bossiara13 a6a098de15 feat(ipc): SwitchLlm + ReloadLlm + QueryHealth — daemon hot-swap + state snapshot
Closes the "GUI shows GUI process state, not daemon's" gap. Now GUI can:
  1. Tell the daemon to swap LLM backend via IPC (so the running listener
     uses the new backend immediately, not just the GUI process).
  2. Tell the daemon to re-read llm_backend from settings DB after GUI persists
     a choice independently.
  3. Query the daemon's true runtime state (TTS/LLM/profile/memory/scheduler
     counts/language/version) for an honest footer + diagnostics view.

IpcAction (new variants)
  - SwitchLlm { backend: String }    — daemon calls llm::swap_to(parse(backend))
  - ReloadLlm                         — daemon calls llm::init_global() to re-read DB
  - QueryHealth                       — daemon responds with HealthSnapshot

IpcEvent (new variant)
  - HealthSnapshot { tts_backend, llm_backend, llm_model, active_profile,
                     memory_facts, scheduled_tasks, language, version }

jarvis-app main.rs
  - Imports IpcEvent (was only IpcAction before).
  - Three new match arms in ipc action handler — all use existing globals,
    no new state needed.

Next step (TODO): wire GUI's set_llm_backend Tauri command to ALSO fire
IpcAction::SwitchLlm so daemon stays in sync. And replace Footer.svelte's
get_active_backends call with QueryHealth over IPC.

Build: cargo build --release -p jarvis-app -p jarvis-gui green.
Tests: 62/62 pass (unchanged — IPC variants don't add testable logic).
2026-05-15 17:37:32 +03:00
crates feat(ipc): SwitchLlm + ReloadLlm + QueryHealth — daemon hot-swap + state snapshot 2026-05-15 17:37:32 +03:00
frontend feat(gui): /macros + /scheduler pages + README rewrite 2026-05-15 17:28:22 +03:00
lib library files required for the build added 2026-01-17 06:08:09 +05:00
resources feat(macros): IMBA-7 voice-recorded command sequences (VoiceAttack-style) 2026-05-15 17:12:32 +03:00
tools feat: TTS backend abstraction + 4 'imba' features + Lua packs 2026-05-15 15:32:44 +03:00
.gitignore feat(gui): footer backend chips + Settings 'AI Backends' tab + i18n 2026-05-15 17:06:46 +03:00
ARCHITECTURE.md refactor: maintainability pass — dedup, central env config, cmd helpers, tests, ARCHITECTURE.md 2026-05-15 16:06:18 +03:00
Cargo.lock feat: TTS backend abstraction + 4 'imba' features + Lua packs 2026-05-15 15:32:44 +03:00
Cargo.toml feat: 5 new packs + dotenvy + regen icon.ico + shortcuts redo 2026-05-15 12:28:44 +03:00
LICENSE.txt Readme and License 2023-04-28 19:39:48 +05:00
make_ico.py feat: 5 new packs + dotenvy + regen icon.ico + shortcuts redo 2026-05-15 12:28:44 +03:00
post_build.py some fixes + gliner first implementation 2026-02-11 07:21:50 +05:00
poster.jpg Some funky stuff, bruh 2023-05-01 01:52:47 +05:00
README.md feat(gui): /macros + /scheduler pages + README rewrite 2026-05-15 17:28:22 +03:00
run.bat feat(gui): footer badge "Rust" + one-click run.bat launcher 2026-05-15 12:12:11 +03:00

J.A.R.V.I.S. (Rust) — форк Bossiara13

Локальный голосовой ассистент для Windows. Форк Rust-переписки Priler/jarvis. Сильно расширен в этом форке (см. ниже). Может работать полностью офлайн через Ollama, или с облачным LLM через Groq — выбор переключается голосом на лету.

Зеркала:

Для контрибьюторов: см. 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 (с поиском и фильтрами).

Быстрый старт

# 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/ (уже в репо).

Команды:

# Один раз: загрузить 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.

Тесты

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. Параллельный Python-форк живёт в отдельном репо (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 сохранена.