Создание плагина провайдера памяти
Плагины провайдеров памяти предоставляют Hermes Agent постоянное, межсессионное знание, выходящее за рамки встроенных MEMORY.md и USER.md. Это руководство описывает, как создать такой плагин.
Структура каталога
Каждый провайдер памяти располагается в plugins/memory/<name>/:
plugins/memory/my-provider/
├── __init__.py # Реализация MemoryProvider + точка входа register()
├── plugin.yaml # Метаданные (имя, описание, хуки)
└── README.md # Инструкции по установке, справочник конфигурации, инструменты
Абстрактный базовый класс MemoryProvider
Ваш плагин реализует абстрактный базовый класс MemoryProvider из agent/memory_provider.py:
from agent.memory_provider import MemoryProvider
class MyMemoryProvider(MemoryProvider):
@property
def name(self) -> str:
return "my-provider"
def is_available(self) -> bool:
"""Проверяет, может ли этот провайдер активироваться. Без сетевых вызовов."""
return bool(os.environ.get("MY_API_KEY"))
def initialize(self, session_id: str, **kwargs) -> None:
"""Вызывается один раз при запуске агента.
kwargs всегда содержит:
hermes_home (str): Путь к активному HERMES_HOME. Используйте для хранения.
"""
self._api_key = os.environ.get("MY_API_KEY", "")
self._session_id = session_id
# ... реализация остальных методов
Обязательные методы
Базовый жизненный цикл
| Метод | Когда вызывается | Обязателен? |
|---|---|---|
name (свойство) |
Всегда | Да |
is_available() |
Инициализация агента, перед активацией | Да — без сетевых вызовов |
initialize(session_id, **kwargs) |
Запуск агента | Да |
get_tool_schemas() |
После инициализации, для внедрения инструментов | Да |
handle_tool_call(name, args) |
Когда агент использует ваши инструменты | Да (если есть инструменты) |
Конфигурация
| Метод | Назначение | Обязателен? |
|---|---|---|
get_config_schema() |
Объявляет поля конфигурации для hermes memory setup |
Да |
save_config(values, hermes_home) |
Записывает несекретную конфигурацию в нативное расположение | Да (если не только env-var) |
Опциональные хуки
| Метод | Когда вызывается | Назначение |
|---|---|---|
system_prompt_block() |
Сборка системного промпта | Статическая информация о провайдере |
prefetch(query) |
Перед каждым API-вызовом | Возврат восстановленного контекста |
queue_prefetch(query) |
После каждого хода | Предварительная загрузка для следующего хода |
sync_turn(user, assistant) |
После каждого завершённого хода | Сохранение диалога |
on_session_end(messages) |
Окончание диалога | Финальное извлечение/сброс |
on_pre_compress(messages) |
Перед сжатием контекста | Сохранение инсайтов до удаления |
on_memory_write(action, target, content) |
Встроенные записи памяти | Зеркалирование в ваш бэкенд |
shutdown() |
Завершение процесса | Очистка соединений |
Схема конфигурации
get_config_schema() возвращает список описателей полей, используемых hermes memory setup:
def get_config_schema(self):
return [
{
"key": "api_key",
"description": "API-ключ My Provider",
"secret": True, # → записывается в .env
"required": True,
"env_var": "MY_API_KEY", # явное имя переменной окружения
"url": "https://my-provider.com/keys", # где получить ключ
},
{
"key": "region",
"description": "Регион сервера",
"default": "us-east",
"choices": ["us-east", "eu-west", "ap-south"],
},
{
"key": "project",
"description": "Идентификатор проекта",
"default": "hermes",
},
]
Поля с secret: True и env_var попадают в .env. Несекретные поля передаются в save_config().