В прошлой статье я описывал свой эксперимент по возможностям маленьких LLM. Эта статья идет как продолжение, в которой я расскажу о проделанной работе по изменению и улучшению функционала голосового агента. И поверьте, мне есть что рассказать.

Когда я задумывал своего агента, меня дико раздражали три вещи в существующих решениях:

  1. «Дай денег»: Либо плати подписку за ChatGPT Plus, либо привязывай свою карту к API OpenAI/Anthropic/Perplexity.

  2. «Дай данные»: Чтобы включить музыку или открыть папку, мой голос должен улететь на сервер, обработаться там и вернуться обратно. Зачем?

  3. «Установи Python и 100+ библиотек»: Большинство OpenSource‑проектов требуют танцев с бубном, установки зависимостей и настройки окружения, docker и т.д. и т.п.

Привет, Хабру!
Привет, Хабру!

Я пошел по другому пути. Vera Agent - является полностью бесплатным и локальным агентом. Никаких API, никаких подписок, никакой настройки окружения, вы просто скачиваете portable-версию с сайта агента или с Github репозитория (а можете установить исходники и работать с ними) и пользуетесь.

Главная цель была сделать инструмент, который принадлежит пользователю, а не сдает его в аренду.

В первой версии агента я использовал Gemma 3 1B. Это отличная модель, но в процессе разработки я столкнулся с ограничениями, которые мешали сделать продукт удобным для обычного пользователя. Поэтому в релизной версии я переехал на Qwen 3 1.7B.

Вот причины этого решения:

  1. Лицензия: У Gemma своя специфическая лицензия. Вроде бы открытая, но с нюансами. У Qwen — классическая Apache 2.0. Это развязывает руки мне, как разработчику, и пользователям. Никаких подводных камней.

  2. Tool Use «из коробки»: Это самое важное. Чтобы агент не просто болтал, а реально мог использовать команды по управлению компьютером (открывал файлы, менял настройки). Qwen справляется с этим на порядок лучше маленьких версий Gemma, понимая контекст команды без танцев с бубном и километровых системных промптов.

Несмотря на то, что под капотом по умолчанию стоит Qwen, я решил не ограничивать пользователей. Вера работает на базе llama-cpp-python и поддерживает формат GGUF. Это значит, что вы не привязаны к моему выбору, и можете поставить свою модель, а агент просто подхватит файл .gguf из папки и начнет работать с ним. Полная свобода.

Что умеет Вера прямо сейчас?

Основной задачей было создать не просто чат-бота, с которым можно поболтать, а реального ассистента, который берет на себя рутину. На данный момент агент закрывает большинство базовых сценариев управления ПК.

По функционалу я разделил возможности на несколько кластеров:

  • Управление системой: Громкость, яркость, создание скриншотов, замер скорости (через tele2), определение IP адреса. Реализовано через стандартные библиотеки, поэтому работает быстро.

  • Питание: Выключение или перезагрузка (можно сказать «Перезагрузи через час» — агент поставит системный таймер).

  • Веб-информеры (без платных API-ключей):

    • Погода: Парсинг публичных страниц. Никаких токенов OpenWeather.

    • Валюты: Данные ЦБ РФ.

    • Кто такой?: Парсинг страниц Википедии для запросов "кто такой/что такое".

    • Открытие сайтов: Пока реализована система открытия сайтов через готовые алиасы.

  • Файловая система и приложения: Запуск программ и поиск файлов, папок. Здесь используется нечеткий поиск (fuzzy matching), чтобы агент понимал «Открой телегу» так же хорошо, как «Открой Telegram».

«А как же интернет?»: Собственный движок веб-поиска

Обычно разработчики локальных ассистентов идут двумя путями: либо прикручивают платные API (Serpdev, Google Search API), либо заставляют пользователя получать свои ключи.

Я написал собственный модуль веб-поиска, который работает по принципу RAG.

Как это работает под капотом:

  1. Вы спрашиваете: "Вера, кто такой Эйнштейн?" или "Найди информацию про Python".

  2. LLM определяет нужно ли вызывать функцию веб-поиска.

  3. Если LLM определила, что нужен вызов функции веб-поиска, то пишет в чат <|tool_call|>
    {"name": "web_search", "arguments": {"query": "<запрос>"}}
    <|tool_call|>

  4. Далее скрипт сканирует ответ LLM на наличие вызова функции, если определяет вызов, то обращается к DuckDuckGo (через парсинг, без API).

  5. Собирает ссылки и открывает 3 наиболее релевантных источника.

  6. Парсит текст с этих страниц, очищает от мусора.

  7. Скармливает собранный контекст LLM, которая формирует краткий и понятный ответ.

    Пример веб-поиска
    Пример веб-поиска

Так как процесс включает в себя загрузку страниц и генерацию ответа на локальном железе, среднее время ответа составляет 10-15 секунд. Да, это не мгновенно, но зато бесплатно и приватно. Чтобы постараться избежать галлюцинаций модели, я добавил команду «Вера, открой источники». Если вы сомневаетесь в ответе, агент откроет в браузере те самые три страницы, на основе которых был сгенерирован ответ.

Ниже представлен фрагмент кода движка-парсера

def search_duckduckgo(query: str, max_results: int = 6) -> List[str]:
    links = []
    try:
        headers = get_default_headers()
        url = f"https://html.duckduckgo.com/html/?q={quote_plus(query)}"
        resp = requests.get(url, headers=headers, timeout=10)
        if resp.status_code == 200:
            pattern = r'uddg=([^&"]+)'
            matches = re.findall(pattern, resp.text)
            seen = set()
            for m in matches:
                try:
                    decoded = unquote(m)
                    if decoded.startswith("http") and decoded not in seen:
                        links.append(decoded)
                        seen.add(decoded)
                        if len(links) >= max_results:
                            break
                except Exception:
                    continue
    except Exception as e:
        print(f"[SEARCH] DuckDuckGo error: {e}")
    return links


def extract_visible_text(html: str) -> str:
    soup = BeautifulSoup(html, "html.parser")
    for tag in soup(["script", "style", "noscript", "header", "footer", "nav", "aside"]):
        tag.decompose()
    for infobox in soup.find_all("table", class_=lambda x: x and "infobox" in x):
        infobox.decompose()
    for infobox in soup.find_all("div", class_=lambda x: x and "infobox" in str(x)):
        infobox.decompose()
    root = soup.find("main") or soup.find("article") or soup.body or soup
    parts: list[str] = []
    for t in root.find_all(["h1", "h2", "h3", "p", "li"]):
        txt = t.get_text(" ", strip=True)
        if txt:
            parts.append(txt)
    for t in root.find_all(["td", "th"]):
        txt = t.get_text(" ", strip=True)
        if txt and (re.search(r"\d", txt) or len(txt) <= 40):
            parts.append(txt)
    for t in root.find_all(["span", "strong", "b", "time"]):
        txt = t.get_text(" ", strip=True)
        if txt and re.search(r"\d", txt):
            parts.append(txt)
    text = " ".join(parts)
    return re.sub(r"\s+", " ", text).strip()

Архитектура: Почему (пока) LLM не используется для всего?

Здесь кроется важный технический нюанс. Многие стремятся засунуть в LLM абсолютно всё, используя вызов функций для каждого чиха. Но я разрабатывал Веру с прицелом на работу даже на слабых устройствах (от 4 ГБ RAM).

Если прогонять команду "Сделай громкость 50%" через нейросеть весом в несколько гигабайт, вы будете ждать отклика 5-10 секунд. Это убивает UX.

Поэтому сейчас реализована гибридная маршрутизация:

  1. Быстрые команды: Открытие программ, управление громкостью, таймеры — обрабатываются мгновенно через жесткую логику и нечеткий поиск.

  2. Сложные запросы (LLM): Веб-поиск и суммаризация информации — идут через нейросеть.

Это компромисс ради скорости. В будущем, по мере оптимизации квантования и железа, я планирую перевести маршрутизацию большинства функций на LLM, чтобы агент лучше понимал контекст и сложные составные просьбы. Но сейчас приоритет — скорость.

Чтобы обеспечить работу агента на обычном домашнем ноутбуке без топовой видеокарты, я подбирал максимально легкие и эффективные инструменты:

  • STT (Распознавание речи): Vosk (модель vosk-model-small-ru-0.22). Выбрана за скорость и работу полностью оффлайн.

  • TTS (Синтез речи): pyttsx3. Использует системные голоса Windows, что дает нулевую задержку при ответе (в отличие от тяжелых нейросетевых голосов).

  • Инференс LLM: llama-cpp-python + Qwen3-1.7B-Q4_K_M. Позволяет запускать GGUF модели на CPU/GPU (В portable-версии используется CPU версия библиотеки, для того, чтобы добавить поддержку CUDA ядер, вы можете самостоятельно скомпилировать exe из исходников, предварительно установив библиотеку с поддержкой CUDA)

Минимальные требования для запуска: Так как я оптимизировал агента для слабых машин, порог входа очень низкий:

  • ОС: Windows 10/11 (x64)

  • RAM: от 4 ГБ (для Qwen 1.7B этого достаточно, но лучше 8 ГБ).

  • Место на диске: ~2 ГБ (основной вес занимает модель).

Что дальше?

Проект находится в активной стадии разработки, и текущая версия — это крепкий фундамент, но далеко не финал. Вот над чем я работаю прямо сейчас:

  • Кроссплатформенность (macOS и Linux): Сейчас Вера работает только на Windows, так как многие системные вызовы (управление звуком, окнами, питанием) завязаны на WinAPI и специфичные библиотеки. Я понимаю, что значительная часть аудитории (и разработчиков) сидит на nix-системах, поэтому адаптация под macOS и Linux — приоритетная задача на ближайшее время. Архитектура на Python позволяет это сделать достаточно «малой кровью».

  • Полноценный GUI: Сейчас агент живет в консоли. В разработке находится версия с полноценным графическим интерфейсом. Это сделает настройку удобнее (не придется лезть в JSON-файлы руками) и позволит визуализировать диалог с LLM.

  • Глубокая интеграция: Я планирую расширить взаимодействие с ОС. Цель — научить агента не просто запускать софт, но и выполнять более сложные цепочки действий внутри системы, приближаясь к концепции «второго пилота» для ПК.

  • Интеграция с Home Assistant: Это один из самых ожидаемых этапов. Я планирую научить Веру общаться с API Home Assistant. Идея в том, чтобы создать идеальную приватную экосистему: локальный голосовой ассистент управляет локальным умным домом. Никаких облаков, задержек и умных колонок.

  • Ну и определенные секретные функции, о которых я расскажу по мере их добавления.

Итог

Vera — это полностью Open Source проект, рожденный из желания вернуть приватность и контроль над собственным ПК. Я верю, что голосовой ассистент не должен быть «шпионом», работающим только при наличии интернета, или требовать подписку за базовые функции.

Проект сейчас в активной фазе, и мне очень нужна ваша поддержка. Самое лучшее, что вы можете сделать — это просто скачать агента, «погонять» его на своих задачах и поставить звездочку репозиторию на GitHub. Это реально мотивирует работать над проектом дальше и показывает, что тема локального ИИ жива и интересна сообществу.

Если у вас есть идеи по оптимизации, мысли по архитектуре или вы знаете, как заставить LLM работать еще быстрее — оставляйте комментарии в репозитории или под этой статьей (если проект оказался интересным, заведу телеграмм канал). Любая активность помогает посту продвигаться, а проекту — находить новых контрибьюторов.

Сайт проекта

Репозиторий

Телеграм канал

Комментарии (38)


  1. AndyBrg
    02.12.2025 04:44

    Не находит репозиторий командой клонирования, ".....agent-vera.git". -> "agent_vera.git"


    1. tripleguard Автор
      02.12.2025 04:44

      заметил, что в ридми файле и на сайте допустил ошибку, прошу прощения. Пробовали git clone https://github.com/tripleguard/agent_vera.git ? только что проверил - должно работать


  1. AndyBrg
    02.12.2025 04:44

    -> agent_vera)


  1. AleGen
    02.12.2025 04:44

    Очень круто, спасибо!

    К сожалению (или к счастью), не являюсь пользователем windows, поэтому воспользоваться сей крутой разработкой не могу, буду ждать Линукс-версию. ))

    По поводу умного дома подсказка: здесь неделю-две назад была статья энтузиаста, который создаёт подобную систему локального управления умным домом без привязки к интернету - его тоже напрягают все эти требования подключать API, ключи и так далее, и у него уже есть более-менее готовое решение. Попробуйте скооперироваться, думаю, процесс сильно ускорится. ;)


    1. tripleguard Автор
      02.12.2025 04:44

      Спасибо, за подсказку. А сможете скинуть статью или сразу аккаунт его? Если остался вдруг


      1. Okeu
        02.12.2025 04:44

        тоже присоединюсь к вопросу)


      1. RinKirsan
        02.12.2025 04:44

        Предполагаю, что оно - Как я Альфе новый навык делал и что из этого вышло / Хабр. Хотя могу и ошибаться


  1. Technik_13
    02.12.2025 04:44

    не понятно почему но постоянно отключается, задаю вопрос про погоду работает

    если что по сложней выключается и все


    1. tripleguard Автор
      02.12.2025 04:44

      а подскажите системные характеристики ваши, и лог ошибки выдает или просто молча выключается?


      1. Technik_13
        02.12.2025 04:44

        В общем методом многократного закрывания открывания стало понятно что если задать любой вопрос не по шаблону (типа кто нарисовал картину черный квадрат или напечатать открой маил ру он просто выключается ) если по шаблону вроде работает (

        Процессор         Intel(R) Xeon(R) CPU E3-1245 V2 @ 3.40GHz   3.40 GHz

        Оперативная память    16,0 ГБ (доступно: 15,7 ГБ)

        Память 233 GB SSD Samsung SSD 870 EVO 250GB, 466 GB HDD ST500DM002-1BD142

        Тип системы     64-разрядная операционная система, процессор x64

        Win10

        где исправить что бы она не включалась


        1. tripleguard Автор
          02.12.2025 04:44

          интересное замечание, проведу еще раз тесты, спасибо. А подскажите вы установили версию с exe или запускаете через исходники? И установлена ли модель gguf?


          1. Technik_13
            02.12.2025 04:44

            просто скачал Vera.zip, запустил Vera.exe

            нет не установлено gguf

            что то доставить надо ? (просто было написано типо с коробки без бубна :) )


            1. tripleguard Автор
              02.12.2025 04:44

              если скачали zip файл, то там сразу gguf версия модели уже предустановлена (Qwen3-1.7B). Возможно проблема будет в отсутствии C++ библиотек (требуются для llama-cpp-python). Попробуйте установить Microsoft Visual C++ Redistributable: https://aka.ms/vc14/vc_redist.x64.exe После установки перезагрузите компьютер. И отпишите, пожалуйста, если так же выключается


              1. Technik_13
                02.12.2025 04:44

                как не досадно не помогло (проверю еще на другом компе ) и отпишусь

                задумка та классная еще б не вырубалась постоянно или хотя бы после отключения сама врубалась, мож где код поменять ?


                1. tripleguard Автор
                  02.12.2025 04:44

                  Понял вас, проведу заново тестирования, постараюсь разобраться в чем проблема. Перед публикацией само собой проводил тесты на 5-и разных устройствах, проблем не возникало, так что это прям интересную задачу вы дали.


      1. AndyBrg
        02.12.2025 04:44

        не живем, существуем))


  1. AndyBrg
    02.12.2025 04:44

    Винды нет, ждем версию для linux/mac)


  1. anonymous
    02.12.2025 04:44


  1. bizya
    02.12.2025 04:44

    А ей можно сказать, Вера, поотвечай там за меня в телеге? И она поболтает?


    1. tripleguard Автор
      02.12.2025 04:44

      Честно, пытаюсь сделать, т.к вопрос для самого актуальный. Возникли определенные трудности (пытался сделать через selenium, но безрезультатно), сейчас пробую сделать через веб версию телеграмма и самописное расширение, полет пока нормальный, но думаю до ума доведу уже после нового года


      1. bizya
        02.12.2025 04:44

        Всю жизнь мечтал о личном Джарвисе)


      1. AndreyHenneberg
        02.12.2025 04:44

        А почему не сделать отдельный клиент Телеграма?


  1. SMXC
    02.12.2025 04:44

    Здравствуйте, очень классная штука. Сам я в программировании ничерта почти не понимаю. Но очень интересует тема локальных голосовых помощников и особенно интеграция с умным домом.

    Недавно все видели, к чему приводит вешать умный дом на онлайн сервисы, типо Алисы. По весне как раз буду в дом переезжать и хочу на свой сервер завязать весь умный дом и управлять голосом.

    Так, что удачи вам, классный проект !


    1. tripleguard Автор
      02.12.2025 04:44

      Спасибо за поддержку! Как раз и стараюсь сделать максимально просто и отзывчиво, чтобы в двух шагах: запустил и пользуешься


  1. bizya
    02.12.2025 04:44

    Все, подвисла.


  1. bizya
    02.12.2025 04:44

    Момент. перестала реагировать на голос -скрины выше. Но на печатный запрос - закрыла таки телегу.


    1. tripleguard Автор
      02.12.2025 04:44

      при общении голосом перед запросом(командой) говорите Вера: Вера, закрой телеграм. Можете и после запроса. Суть такова, что агент по идее должен работать постоянно в фоне, но если он на каждый ваш диалог будет отвечать - то будет черт пойми что, соответственно, пока базовая логика как у Алисы - говорите Вера и далее ваш запрос. В текстовом режиме можно писать без Вера. Если что вся информация по использованию есть и на сайте Vera Agent и в репозитории tripleguard/agent_vera


  1. vransen
    02.12.2025 04:44

    Так ностальгия в голову ударила и так Лукьяненко вспомнился... Глубина-глубина, я не твой и все такое

    А проект классный, автор, ты крут)


  1. xronelx
    02.12.2025 04:44

    А как агента для написания простого кода микросервисов пойдёт?


    1. tripleguard Автор
      02.12.2025 04:44

      честно говоря, как агента для программирования пока не задумывал, может в следуюющих выпусках уже. Можете поэксперементировать, вместо Qwen 3 1.7B попробовать Qwen 2.5 coder 3B. Но тогда думаю и системный промпт чуть переписать.


      1. xronelx
        02.12.2025 04:44

        Будем ждать


  1. rsivakov
    02.12.2025 04:44

    Клево

    Насчет интерфейса, подумай, может удобнее было бы подружить с goose

    fyi


  1. bloodsilver
    02.12.2025 04:44

    Проект однозначно классный! Но с распознаванием проблемы. Например так и не удалось запустить голосом CMD, не всегда верно распознает названия папок. Можно как то в настройках подкрутить точность пусть даже в ущерб скорости (в разумных пределах)?


    1. tripleguard Автор
      02.12.2025 04:44

      тут к сожалению проблема уже с самим датасетом vosk, он сам по себе маленький и WER у него составляет в районе 20-25%. Можете вместо маленькой версии vosk, попробовать поставить большую. Рассматриваю и другие варианты, whisper, + недавно вышли новые модели GigaAM, так что думаю буду отходить от vosk.
      А по поводу cmd - еще не добавил :) Очень много уже предложений поступило по улучшению функционала, так что на днях выложу чуть улучшенную версию


  1. yppro
    02.12.2025 04:44

    [ВЫ] вера открой папку бокс на диске и
    [FOLDER] Поиск папки: бокс на диске и
    [FILE_INDEX] Ошибка Windows Search: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147215328), None)
    [Вера] Папка 'бокс на диске и' не найдена.

    (E:\Books)

    Проще руками написать. Автор, за идею 5. Но чат нужен


    1. tripleguard Автор
      02.12.2025 04:44

      а текстовый вариант есть, просто напрямую в терминал пишите, можно без Вера. С файловыми операциями заметил уже много проблем(спасибо читателям), на тестировании не обратил на них внимания, так что в ближайшие день-два обновлю репозиторий


  1. cahbeua
    02.12.2025 04:44

    А что вообще происходит - с каких пор ИИ модели не нужна видеокарта?

    И не по теме - а есть какая ни будь обученная модель для расшифровки виндовских евентов? Потому как логи ошибок в винде это отдельный вид искусства и их изначально писали на языке ИИ, человеку в этом разобраться нереально.


    1. AndreyHenneberg
      02.12.2025 04:44

      С момента появления. Видеокарта нужна для ускорения работы. Точно так же как и для графики: Обе классические версии Doom и первые 2 или даже 3 версии Quake прекрасно работали на центральном процессоре. Математика-то никуда не девается.