Перейти к основному содержимому

Плагины

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

Если вы хотите создать собственный инструмент для себя, своей команды или одного проекта, это обычно правильный путь. Страница руководства разработчика Добавление инструментов предназначена для встроенных инструментов ядра VibeOS, которые находятся в tools/ и toolsets.py.

→ Создайте плагин VibeOS — пошаговое руководство с полным рабочим примером.

Краткий обзор​

Поместите каталог в ~/.vibeos/plugins/ с файлом plugin.yaml и кодом Python:

~/.vibeos/plugins/my-plugin/
├── plugin.yaml # манифест
├── __init__.py # register() — связывает схемы с обработчиками
├── schemas.py # схемы инструментов (что видит LLM)
└── tools.py # обработчики инструментов (что выполняется при вызове)

Запустите VibeOS — ваши инструменты появятся рядом со встроенными. Модель может вызывать их немедленно.

Минимальный рабочий пример​

Вот полный плагин, который добавляет инструмент hello_world и регистрирует каждый вызов инструмента через хук.

~/.vibeos/plugins/hello-world/plugin.yaml

name: hello-world
version: "1.0"
description: Пример минимального плагина

~/.vibeos/plugins/hello-world/__init__.py

"""Минимальный плагин VibeOS — регистрирует инструмент и хук."""

import json


def register(ctx):
# --- Инструмент: hello_world ---
schema = {
"name": "hello_world",
"description": "Возвращает дружеское приветствие для указанного имени.",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Имя для приветствия",
}
},
"required": ["name"],
},
}

def handle_hello(params, **kwargs):
del kwargs
name = params.get("name", "World")
return json.dumps({"success": True, "greeting": f"Hello, {name}!"})

ctx.register_tool(
name="hello_world",
toolset="hello_world",
schema=schema,
handler=handle_hello,
description="Возвращает дружеское приветствие для указанного имени.",
)

# --- Хук: регистрировать каждый вызов инструмента ---
def on_tool_call(tool_name, params, result):
print(f"[hello-world] вызван инструмент: {tool_name}")

ctx.register_hook("post_tool_call", on_tool_call)

Поместите оба файла в ~/.vibeos/plugins/hello-world/, перезапустите VibeOS, и модель сможет немедленно вызывать hello_world. Хук выводит строку лога после каждого вызова инструмента.

Локальные плагины проекта в ./.vibeos/plugins/ по умолчанию отключены. Включайте их только для доверенных репозиториев, установив VIBEOS_ENABLE_PROJECT_PLUGINS=true перед запуском VibeOS.

Что могут делать плагины​

Каждый API ctx.* ниже доступен внутри функции register(ctx) плагина.

ВозможностьКак
Добавлять инструментыctx.register_tool(name=..., toolset=..., schema=..., handler=...)
Добавлять хукиctx.register_hook("post_tool_call", callback)
Добавлять слеш-командыctx.register_command(name, handler, description) — добавляет /name в CLI и шлюзовых сессиях
Отправлять инструменты из командctx.dispatch_tool(name, args) — вызывает зарегистрированный инструмент с автоматической привязкой контекста родительского агента
Добавлять CLI-командыctx.register_cli_command(name, help, setup_fn, handler_fn) — добавляет vibeos &lt;plugin&gt; <subcommand>`
Внедрять сообщенияctx.inject_message(content, role="user") — см. Внедрение сообщений
Поставлять файлы данныхPath(__file__).parent / "data" / "file.yaml"
Включать навыкиctx.register_skill(name, path) — пространство имён plugin:skill, загружается через skill_view("plugin:skill")
Ограничивать переменными окруженияrequires_env: [API_KEY] в plugin.yaml — запрашивается во время vibeos plugins install
Распространять через pip[project.entry-points."vibeos_agent.plugins"]
Регистрировать платформу шлюза (Discord, Telegram, IRC, …)ctx.register_platform(name, label, adapter_factory, check_fn, ...) — см. Добавление адаптеров платформ
Регистрировать бэкенд генерации изображенийctx.register_image_gen_provider(provider) — см. Плагины провайдеров генерации изображений
Регистрировать бэкенд генерации видеоctx.register_video_gen_provider(provider) — см. Плагины провайдеров генерации видео
Регистрировать движок сжатия контекстаctx.register_context_engine(engine) — см. Плагины движков контекста
Регистрировать бэкенд памятиСоздайте подкласс MemoryProvider в plugins/memory/&lt;name&gt;/__init__.py — см. Плагины провайдеров памяти (использует отдельную систему обнаружения)
Выполнять LLM-вызов от хостаctx.llm.complete(...) / ctx.llm.complete_structured(...) — использует активную модель пользователя + аутентификацию для одноразового завершения с опциональной валидацией JSON-схемы. См. Доступ плагинов к LLM
Регистрировать бэкенд вывода (LLM-провайдер)register_provider(ProviderProfile(...)) в plugins/model-providers/&lt;name&gt;/__init__.py — см. Плагины провайдеров моделей (использует отдельную систему обнаружения)

Обнаружение плагинов​

ИсточникПутьСценарий использования
Встроенные&lt;repo&gt;/plugins/Поставляются с VibeOS — см. Встроенные плагины
Пользовательские~/.vibeos/plugins/Личные плагины
Проектные.vibeos/plugins/Плагины для конкретного проекта (требуется VIBEOS_ENABLE_PROJECT_PLUGINS=true)
pipvibeos_agent.plugins entry_pointsРаспространяемые пакеты
Nixservices.vibeos-agent.extraPlugins / extraPythonPackagesДекларативные установки NixOS — см. Установка через Nix

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

Подкатегории плагинов​

Внутри каждого источника VibeOS также распознаёт каталоги подкатегорий, которые направляют плагины в специализированные системы обнаружения:

ПодкаталогЧто содержитСистема обнаружения
plugins/ (корень)Общие плагины — инструменты, хуки, слеш-команды, CLI-команды, встроенные навыкиPluginManager (kind: standalone или backend)
plugins/platforms/&lt;name&gt;/Адаптеры каналов шлюза (ctx.register_platform())PluginManager (kind: platform, на один уровень глубже)
plugins/image_gen/&lt;name&gt;/Бэкенды генерации изображений (ctx.register_image_gen_provider())PluginManager (kind: backend, на один уровень глубже)
plugins/memory/&lt;name&gt;/Провайдеры памяти (подкласс MemoryProvider)Собственный загрузчик в plugins/memory/__init__.py (kind: exclusive — один активен за раз)
plugins/context_engine/&lt;name&gt;/Движки сжатия контекста (ctx.register_context_engine())Собственный загрузчик в plugins/context_engine/__init__.py (один активен за раз)
plugins/model-providers/&lt;name&gt;/Профили LLM-провайдеров (register_provider(ProviderProfile(...)))Собственный загрузчик в providers/__init__.py (лениво сканируется при первом вызове get_provider_profile())

Пользовательские плагины в ~/.vibeos/plugins/model-providers/&lt;name&gt;/ и ~/.vibeos/plugins/memory/&lt;name&gt;/ переопределяют встроенные плагины с тем же именем — последний записавший побеждает в register_provider() / register_memory_provider(). Поместите каталог, и он заменит встроенный без каких-либо изменений в репозитории.

Плагины — это opt-in (с несколькими исключениями)​

Общие плагины и установленные пользователем бэкенды по умолчанию отключены — обнаружение находит их (поэтому они отображаются в vibeos plugins и /plugins), но ничего с хуками или инструментами не загружается, пока вы не добавите имя плагина в plugins.enabled в ~/.vibeos/config.yaml. Это предотвращает выполнение стороннего кода без вашего явного согласия.

plugins:
enabled:
- my-tool-plugin
- disk-cleanup
disabled: # опциональный список запрета — всегда побеждает, если имя есть в обоих
- noisy-plugin

Три способа изменить состояние:

vibeos plugins                    # интерактивное переключение (пробел для отметки/снятия)
vibeos plugins enable <name> # добавить в белый список
vibeos plugins disable <name> # удалить из белого списка + добавить в запрещённые

После vibeos plugins install owner/repo появляется запрос Включить 'name' сейчас? [y/N] — по умолчанию нет. Пропустите запрос для скриптовых установок с помощью --enable или --no-enable.

Что белый список НЕ блокирует​

Несколько категорий плагинов обходят plugins.enabled — они являются частью встроенной поверхности VibeOS и нарушили бы базовую функциональность, если бы были заблокированы по умолчанию:

Тип плагинаКак активируется вместо этого
Встроенные плагины платформ (IRC, Teams и т.д. в plugins/platforms/)Автоматически загружаются, чтобы каждый поставляемый канал шлюза был доступен. Фактический канал включается через gateway.platforms.&lt;name&gt;.enabled в config.yaml.
Встроенные бэкенды (провайдеры генерации изображений в plugins/image_gen/ и т.д.)Автоматически загружаются, чтобы бэкенд по умолчанию «просто работал». Выбор происходит через &lt;category&gt;.provider в config.yaml (например, image_gen.provider: openai).
Провайдеры памяти (plugins/memory/)Все обнаруженные; ровно один активен, выбирается через memory.provider в config.yaml.
Движки контекста (plugins/context_engine/)Все обнаруженные; один активен, выбирается через context.engine в config.yaml.
Провайдеры моделей (plugins/model-providers/)Все встроенные провайдеры в plugins/model-providers/ обнаруживаются и регистрируются при первом вызове get_provider_profile(). Пользователь выбирает один за раз через --provider или config.yaml.
Плагины бэкендов, установленные через pipOpt-in через plugins.enabled (как и общие плагины).
Установленные пользователем платформы (в ~/.vibeos/plugins/platforms/)Opt-in через plugins.enabled — сторонние адаптеры шлюзов требуют явного согласия.

Коротко: встроенная инфраструктура «всегда работает» загружается автоматически; сторонние общие плагины — opt-in. Белый список plugins.enabled — это шлюз специально для произвольного кода, который пользователь помещает в ~/.vibeos/plugins/.

Миграция для существующих пользователей​

При обновлении до версии VibeOS с opt-in плагинами (схема конфига v21+) любые пользовательские плагины, уже установленные в ~/.vibeos/plugins/, которые не были в plugins.disabled, автоматически переносятся в plugins.enabled. Ваша существующая настройка продолжает работать. Встроенные автономные плагины НЕ переносятся — даже существующие пользователи должны явно включить их. (Встроенные плагины платформ/бэкендов никогда не нуждались в переносе, потому что они никогда не были заблокированы.)

Доступные хуки​

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

ХукСрабатывает когда
pre_tool_callПеред выполнением любого инструмента
post_tool_callПосле возврата любого инструмента
pre_llm_callОдин раз за ход, перед циклом LLM — может вернуть {"context": "..."} для внедрения контекста в сообщение пользователя
post_llm_callОдин раз за ход, после цикла LLM (только успешные ходы)
on_session_startСоздана новая сессия (только первый ход)
on_session_endКонец каждого вызова run_conversation + обработчик выхода из CLI
on_session_finalizeCLI/шлюз завершает активную сессию (/new, GC, выход из CLI)
on_session_resetШлюз заменяет ключ сессии (/new, /reset, /clear, ротация бездействия)
subagent_stopОдин раз для каждого дочернего агента после завершения delegate_task
pre_gateway_dispatchШлюз получил сообщение пользователя, до аутентификации и отправки. Верните {"action": "skip" | "rewrite" | "allow", ...} для управления потоком.

Типы плагинов​

VibeOS имеет четыре вида плагинов:

ТипЧто делаетВыборРасположение
Общие плагиныДобавляют инструменты, хуки, слеш-команды, CLI-командыМножественный выбор (включить/отключить)~/.vibeos/plugins/
Провайдеры памятиЗаменяют или дополняют встроенную памятьОдиночный выбор (один активен)plugins/memory/
Движки контекстаЗаменяют встроенный компрессор контекстаОдиночный выбор (один активен)plugins/context_engine/
Провайдеры моделейОбъявляют бэкенд вывода (OpenRouter, Anthropic, …)Множественная регистрация, выбирается через --provider / config.yamlplugins/model-providers/

Провайдеры памяти и движки контекста являются провайдерскими плагинами — только один каждого типа может быть активен одновременно. Провайдеры моделей также являются плагинами, но многие загружаются одновременно; пользователь выбирает один за раз через --provider или config.yaml. Общие плагины могут быть включены в любой комбинации.

Подключаемые интерфейсы — куда обратиться для каждого​

Таблица выше показывает четыре категории плагинов, но внутри «Общих плагинов» PluginContext предоставляет несколько различных точек расширения — и VibeOS также принимает расширения вне системы Python-плагинов (бэкенды на основе конфигурации, команды с привязкой к оболочке, внешние серверы и т.д.). Используйте эту таблицу, чтобы найти правильную документацию для того, что вы хотите создать:

Хотите добавить…КакРуководство по созданию
Инструмент, который может вызывать LLMPython-плагин — ctx.register_tool()Создайте плагин VibeOS · Добавление инструментов
Хук жизненного цикла (до/после LLM, начало/конец сессии, фильтр инструментов)Python-плагин — ctx.register_hook()Справочник по хукам · Создайте плагин VibeOS
Слеш-команду для CLI / шлюзаPython-плагин — ctx.register_command()Создайте плагин VibeOS · Расширение CLI
Подкоманду для `vibeos <thing>Python-плагин — ctx.register_cli_command()Расширение CLI
Встроенный навык, который поставляет ваш плагинPython-плагин — ctx.register_skill()Создание навыков
Бэкенд вывода (LLM-провайдер: OpenAI-совместимый, Codex, Anthropic-Messages, Bedrock)Плагин провайдера — register_provider(ProviderProfile(...)) в plugins/model-providers/&lt;name&gt;/Плагины провайдеров моделей · Добавление провайдеров
Канал шлюза (Discord / Telegram / IRC / Teams / и т.д.)Плагин платформы — ctx.register_platform() в plugins/platforms/&lt;name&gt;/Добавление адаптеров платформ
Бэкенд памяти (Honcho, Mem0, Supermemory, …)Плагин памяти — подкласс MemoryProvider в plugins/memory/&lt;name&gt;/Плагины провайдеров памяти
Стратегию сжатия контекстаПлагин движка контекста — ctx.register_context_engine()Плагины движков контекста
Бэкенд генерации изображений (DALL·E, SDXL, …)Плагин бэкенда — ctx.register_image_gen_provider()Плагины провайдеров генерации изображений
Бэкенд генерации видео (Veo, Kling, Pixverse, Grok-Imagine, Runway, …)Плагин бэкенда — ctx.register_video_gen_provider()Плагины провайдеров генерации видео
Бэкенд TTS (любой CLI — Piper, VoxCPM, Kokoro, xtts, скрипты клонирования голоса, …)На основе конфигурации (рекомендуется) — объявите в tts.providers.&lt;name&gt; с type: commandвconfig.yaml. ИЛИ Python-плагин бэкенда — ctx.register_tts_provider()` для движков с Python-SDK / потоковой передачей, которым нужно больше, чем шаблон оболочки.Настройка TTS · Руководство по Python-плагину
Бэкенд STT (любой CLI — whisper.cpp, пользовательский бинарник whisper, локальный ASR CLI)На основе конфигурации (рекомендуется) — объявите в stt.providers.&lt;name&gt; с type: commandвconfig.yaml, или установите VIBEOS_LOCAL_STT_COMMANDдля устаревшего запасного варианта с одной командой. ИЛИ Python-плагин бэкенда —ctx.register_transcription_provider()` для движков с Python-SDK (OpenRouter, SenseAudio, Gemini-STT и т.д.).Настройка STT · Руководство по Python-плагину
Внешние инструменты через MCP (файловая система, GitHub, Linear, Notion, любой MCP-сервер)На основе конфигурации — объявите mcp_servers.&lt;name&gt; с command:/url:вconfig.yaml`. VibeOS автоматически обнаруживает инструменты сервера и регистрирует их вместе со встроенными.MCP
Дополнительные источники навыков (пользовательские репозитории GitHub, частные индексы навыков)CLI — vibeos skills tap add <repo>`Хаб навыков · Публикация пользовательского tap
Хуки событий шлюза (срабатывают на gateway:startup, session:start, agent:end, command:*)Поместите HOOK.yaml + handler.py в ~/.vibeos/hooks/&lt;name&gt;/Хуки событий
Хуки оболочки (выполняют команду оболочки при событиях — уведомления, журналы аудита, оповещения на рабочем столе)На основе конфигурации — объявите в hooks: в config.yamlХуки оболочки
примечание

Не всё является Python-плагином. Некоторые поверхности расширения намеренно используют команды оболочки на основе конфигурации (TTS, STT, хуки оболочки), чтобы любой существующий CLI стал плагином без написания Python. Другие — это внешние серверы (MCP), к которым агент подключается и автоматически регистрирует инструменты. А некоторые — это каталоги для размещения (хуки шлюза) со своим собственным форматом манифеста. Выберите правильную поверхность для стиля интеграции, который подходит вашему случаю использования; руководства по созданию в таблице выше охватывают заполнители, обнаружение и примеры.

Декларативные плагины NixOS​

На NixOS плагины могут быть установлены декларативно через опции модуля — без необходимости vibeos plugins install. Полные сведения см. в руководстве по установке Nix.

services.vibeos-agent = {
# Плагин из каталога (дерево исходников с plugin.yaml)
extraPlugins = [ (pkgs.fetchFromGitHub { ... }) ];
# Плагин через entry-point (pip-пакет)
extraPythonPackages = [ (pkgs.python312Packages.buildPythonPackage { ... }) ];
# Включить в конфиге
settings.plugins.enabled = [ "my-plugin" ];
};

Декларативные плагины связываются символическими ссылками с префиксом nix-managed- — они сосуществуют с плагинами, установленными вручную, и автоматически удаляются при удалении из конфигурации Nix.

Управление плагинами​

vibeos plugins                               # единый интерактивный интерфейс
vibeos plugins list # таблица: включено / отключено / не включено
vibeos plugins install user/repo # установить из Git, затем запрос Включить? [y/N]
vibeos plugins install user/repo --enable # установить И включить (без запроса)
vibeos plugins install user/repo --no-enable # установить, но оставить отключённым (без запроса)
vibeos plugins update my-plugin # получить последнюю версию
vibeos plugins remove my-plugin # удалить
vibeos plugins enable my-plugin # добавить в белый список
vibeos plugins disable my-plugin # удалить из белого списка + добавить в запрещённые

Интерактивный интерфейс​

Запуск vibeos plugins без аргументов открывает составной интерактивный экран:

Плагины
↑↓ навигация ПРОБЕЛ переключить ВВОД настроить/подтвердить ESC готово

Общие плагины
→ [✓] my-tool-plugin — Пользовательский инструмент поиска
[ ] webhook-notifier — Хуки событий
[ ] disk-cleanup — Автоматическая очистка временных файлов [встроенный]

Провайдерские плагины
Провайдер памяти ▸ honcho
Движок контекста ▸ compressor
  • Раздел «Общие плагины» — флажки, переключение ПРОБЕЛОМ. Отмечено = в plugins.enabled, не отмечено = в plugins.disabled (явное выключение).
  • Раздел «Провайдерские плагины» — показывает текущий выбор. Нажмите ВВОД, чтобы войти в переключатель радио-кнопок, где вы выбираете одного активного провайдера.
  • Встроенные плагины отображаются в том же списке с тегом [встроенный].

Выбор провайдерских плагинов сохраняется в config.yaml:

memory:
provider: "honcho" # пустая строка = только встроенный

context:
engine: "compressor" # встроенный компрессор по умолчанию

Включено, отключено или ни то, ни другое​

Плагины находятся в одном из трёх состояний:

СостояниеЗначениеВ plugins.enabled?В plugins.disabled?
enabledЗагружен при следующей сессииДаНет
disabledЯвно выключен — не загрузится, даже если также в enabled(неважно)Да
not enabledОбнаружен, но никогда не включёнНетНет

По умолчанию для нового установленного или встроенного плагина — not enabled. vibeos plugins list показывает все три различных состояния, чтобы вы могли видеть, что было явно выключено, а что просто ожидает включения.

В работающей сессии /plugins показывает, какие плагины загружены в данный момент.

Внедрение сообщений​

Плагины могут внедрять сообщения в активный разговор с помощью ctx.inject_message():

ctx.inject_message("Новые данные получены от вебхука", role="user")

Сигнатура: ctx.inject_message(content: str, role: str = "user") -> bool

Как это работает:

  • Если агент бездействует (ожидает ввода пользователя), сообщение помещается в очередь как следующий ввод и начинает новый ход.
  • Если агент в середине хода (активно работает), сообщение прерывает текущую операцию — так же, как если бы пользователь ввёл новое сообщение и нажал Enter.
  • Для ролей, отличных от "user", содержимое предваряется префиксом [role] (например, [system] ...).
  • Возвращает True, если сообщение было успешно поставлено в очередь, False, если нет ссылки на CLI (например, в режиме шлюза).

Это позволяет таким плагинам, как пульты удалённого управления, мосты обмена сообщениями или приёмники вебхуков, передавать сообщения в разговор из внешних источников.

примечание

inject_message доступен только в режиме CLI. В режиме шлюза нет ссылки на CLI, и метод возвращает False.

Полные сведения о контрактах обработчиков, формате схем, поведении хуков, обработке ошибок и распространённых ошибках см. в полном руководстве.