Fork of Priler/jarvis (CC BY-NC-SA 4.0) https://github.com/Priler/jarvis
Find a file
Bossiara13 919d565879
Some checks are pending
Rust CI / cargo test (jarvis-core) (push) Waiting to run
Rust CI / cargo clippy (push) Waiting to run
Rust CI / cargo check (workspace) (push) Waiting to run
feat: real-Jarvis Wave 4 — personality, idle banter, persistent history, offline math, DDG search
Personality pack (`resources/commands/personality/`):
- 5 voice commands × ~7-29 phrases each across RU and EN.
- personality.greet: 4 time-of-day buckets (morning/midday/evening/night),
  pulls one of ~7 lines per bucket per language.
- personality.thanks / .compliment / .how_are_you / .tony_quote.
- how_are_you embeds live memory size + active profile via jarvis.health()
  and jarvis.memory.all() for a "feels alive" effect.
- All use jarvis.cmd.ok helpers, no inline PowerShell SAPI.
- Built by sub-agent. Verified: 6 rust command tests + 60 python tests.

Idle banter (`crates/jarvis-core/src/idle_banter.rs`):
- Background thread chimes in periodically without being asked. Gated by
  JARVIS_IDLE_BANTER env (default OFF — intrusion is opt-in).
- Quiet hours 23:00–07:00, skipped under "sleep" profile, paused during
  active interactions via `pause()`.
- 30+ static offline lines split into RU/EN × morning/evening/generic
  buckets — no network required.
- Lua API jarvis.banter.{fire, pause, resume, enabled}.
- New voice pack `banter/` exposes "скажи что-нибудь интересное",
  "помолчи", "можешь говорить".
- 6 unit tests covering pool selection, quiet hours, interval clamp,
  pause/resume, opt-in default.

Conversation continuity (`crates/jarvis-core/src/llm/history.rs`):
- New `ConversationHistory::with_persistence(path)` builder. Every
  push/clear/pop atomically writes to `<APP_CONFIG_DIR>/llm_history.json`
  so daemon restart picks up the thread.
- System prompt is intentionally NOT persisted — comes from current init
  call so prompt edits take effect immediately on restart.
- `llm::init_history` wires the path in automatically.
- 4 new tests: round-trip, clear wipes file, corrupt file tolerated,
  len/is_empty helpers.

Offline-first math (`resources/commands/math/math.lua`):
- Was: always-LLM, hard fail without GROQ_TOKEN, inline PowerShell SAPI.
- Now: shunting-yard parser handles 95% of voice queries in <50ms — no
  network, no token. Russian operator words ("плюс", "умножить на",
  "в степени", "квадрат", ...) normalised to symbols first. Patterns
  for "корень из X" and "X процентов от Y". Falls back to LLM only on
  parse failure (word problems / equations / unit conversions).
- Drops inline PowerShell — speaks via jarvis.cmd.ok.
- 10-case shunting-yard kernel test added (basic ops, precedence,
  parens, unary minus, div-by-zero, garbage rejected).

DuckDuckGo Instant Answer (`resources/commands/ddg_answer/`):
- New pack — short factual Q&A without API key. Trigger phrases
  "что такое", "кто такой", "расскажи про", "what is", etc.
- Reads AbstractText → Answer → Definition → RelatedTopics[0] in order
  from DDG's free JSON API. Opens the search page only if nothing
  useful comes back.
- Sandbox full (needs http + system.open).

Tests: 128 → 139 (+11). Release build green.
2026-05-16 13:52:49 +03:00
.github/workflows chore: CI workflows + drop Ukrainian (UA → just RU/EN) 2026-05-16 13:38:12 +03:00
crates feat: real-Jarvis Wave 4 — personality, idle banter, persistent history, offline math, DDG search 2026-05-16 13:52:49 +03:00
frontend chore: CI workflows + drop Ukrainian (UA → just RU/EN) 2026-05-16 13:38:12 +03:00
lib library files required for the build added 2026-01-17 06:08:09 +05:00
resources feat: real-Jarvis Wave 4 — personality, idle banter, persistent history, offline math, DDG search 2026-05-16 13:52:49 +03:00
tools feat: TTS backend abstraction + 4 'imba' features + Lua packs 2026-05-15 15:32:44 +03:00
.gitignore chore: CI workflows + drop Ukrainian (UA → just RU/EN) 2026-05-16 13:38:12 +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: Wave 3 — plugin system + custom wake-word trainer 2026-05-16 13:26:42 +03:00
run.bat feat(gui): footer badge "Rust" + one-click run.bat launcher 2026-05-15 12:12:11 +03:00
USAGE.md docs+feat: USAGE.md + interesting_fact + mailto packs 2026-05-15 23:38:03 +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)
"Диагностика" / "доложи о себе" Состояние всех бэкендов одной строкой

Всего паков: 85 (resources/commands/*/command.toml) + плагины пользователя из %APPDATA%\com.priler.jarvis\plugins\. Полный список: GUI → /commands (с поиском и фильтрами).

Плагины

Голосовые команды, которые лежат вне проекта. Каждый плагин — папка с тем же command.toml + Lua-скриптами:

%APPDATA%\com.priler.jarvis\plugins\<имя>\
    command.toml         (тот же формат, что и встроенные паки)
    *.lua                (скрипты, на которые ссылается toml)
    disabled             (опционально — пустой файл, отключает плагин)

Подгружается при следующем старте jarvis-app.exe. Sandbox принудительно понижается до standard — плагин не может попросить full (доступ к os). GUI → /plugins показывает список, флажки enable/disable, кнопку «Открыть папку».

Своё кодовое слово

GUI → /wake-trainer — мастер: запишите 530 примеров своего голоса, обучите персональную .rpw-модель, выберите её в Настройках, перезапустите ассистент. Файл — %APPDATA%\com.priler.jarvis\wake_words\<имя>.rpw.

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

# 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 сохранена.