Автоменеджмент записей лорбука

Расширение для автоменеджмента записей чатового лорбука (ST 1.12.0+)

Ссылка - https://gitgud.io/Monblant/sillytavern-loremanager
О лорбуках - https://docs.sillytavern.app/usage/core-concepts/worldinfo/
Установка: Extensions → Install extension (сверху справа) → Вставить ссылку https://gitgud.io/Monblant/sillytavern-loremanager
Обновление: Extensions → Manage extensions (сверху справа) → скролл вниз → кнопка обновить рядом с LoreManager


Суть расширения

Ключевые понятия

  • Input Schema или шаблон поиска - шаблон, с помощью которого ведется поиск соответствий в сообщениях для дальнейшей обработки
  • Output Schema или шаблон записи - шаблон, с помощью которого создается содержимое записей лорбука
  • Плейсхолдер - выражение вида {{placeholder}}, которое можно применять в шаблонах и некоторых полях для захвата информации
  • Группа - набор шаблонов и правил, по которым информация извлекается из чата, преобразуется и отправляется в лорбук
  • Снапшот лорбука - моментальная копия лорбука, хранимая вместе с сообщениями

Ключевые функции

  • Автоматическое создание лорбука: Извлекает информацию из сообщений чата на основе настраиваемых шаблонов.
  • Динамическое обновление: Записи лорбука автоматически обновляются по мере развития чата.
  • Шаблонная система: Используйте простые плейсхолдеры ({{переменная}}) и регулярные выражения для точного контроля извлечения информации.
  • Управление снапшотами: Сохраняйте и загружайте снапшоты лорбука, хранящиеся в сообщениях.
  • Прямое управление записями: Выделенный редактор для просмотра, поиска, сортировки и редактирования всех записей лорбука текущего чата.
  • Множество входных схем: Определяйте несколько способов извлечения и форматирования информации для сложного управления лором.
  • Система групп: Организуйте и расставляйте приоритеты правил извлечения с помощью групп (глобальных и специфичных для персонажа).
  • Политики обновления Замена/Дополнение: Контролируйте, как извлечённая информация обновляет существующие записи лорбука.
  • Иерархия записей: Создавайте вложенные структуры для записей лорбука, позволяющие устанавливать сложные отношения и наследование ключевых слов и свойств.

Применение

  • Накопление информации о лоре и окружении в виде профилей/описаний/блоков и т.д.
  • Ведение динамических саммари блоков без надобности допвызовов
  • Гибкое управление присутствием записей в контексте по сравнению с постоянными инжектами
  • Создавать карты со встроенными правилами извлечения информации
  • При удалении сообщений откатывать состояние лорбука без надобности его редактировать

Настройки

Общие

Enable LoreManager - включает или выключает расширение.

LoreManager Preset - выбирает пресет, который хранит набор групп. Возможные операции с пресетами: создание нового, импорт, экспорт и удаление.

Preset Groups - отображает группы, определённые в выбранном пресете.

Embedded Groups - отображает группы, сохранённые в карточке текущего персонажа.

Группа - набор правил, по которым информация извлекается из чата, преобразуется и отправляется в чатовый лорбук. Возможные операции с группами: создание новой, импорт, редактирование, экспорт и удаление.

Редактор групп

Group Name - имя группы, должно быть уникальным.

Input Schema - шаблон поиска, согласно которому будет производиться поиск информации в сообщениях. В обычном режиме в шаблонах поиска могут (и должны) использоваться плейсхолдеры вида {{placeholder}}, которые захватывают информацию, необходимую для дальнейшей обработки. В большинстве случаев при поиске плейсхолдер будет соответствовать регексовой группе вида ([\s\S]*?), то есть вбирать в себя любые символы, в том числе и переносы строк.

Пример шаблона поиска:

1
2
3
4
<profile>
Name: {{name}}
Age: {{age}}
</profile>

Такой шаблон будет соответствовать подобным по форматированию блокам, например:

1
2
3
4
<profile>
Name: Baphometh
Age: NA
</profile>

Извлечение с помощью шаблона поиска можно воспринимать как запись переменных. В примере в переменную name запишется "Baphometh", а в переменную age - "NA".

Для шаблона поиска, помимо обычного режима, существует режим регекса, управляемый через Regex Mode. В этом режиме введенный в Input Schema текст будет восприниматься как регекс выражение, но плейсхолдеры продолжают использоваться как обычно. В таком режиме можно настроить более гибкие схемы, но нужно валидировать синтаксис и экранировать символы.

Шаблонов поиска для одной группы может быть несколько, все они будут использоваться одновременно. Таким образом можно настроить захват информации из разнородных записей в один вывод, например время захватывать из записи вида:

[CURRENT TIME CHANGED TO: {{time}}]

А локацию из записи вида:

[NEW LOCATION - {{location}}]

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

1
2
3
4
<info>
Time: {{time}}
Location: {{location}}
</info>

С учетом примера шаблонов поиска, приведенных выше, в записи будет захвачено время и название локации и отправлено в блок.

Конфиг записей

Entries Update Policy - управляет тем, как обновляются записи лорбука при извлечении новой информации. Есть четыре варианта:

  1. Replace - каждый раз, когда переменная (например, content) перезаписывается, она будет заменена в итоговой записи. Это режим для большинства случаев.
  2. Append - каждый раз, когда переменная перезаписывается, она будет добавлена в конец записи. Может использоваться для ведения списков.
  3. Simple Append - объединяет всю новую выходную схему как новую строку к существующему содержимому, без слияния каких-либо свойств. Идеально для создания простых журналов или списков построчно.
  4. JSON Patch - этот режим трактует запись лорбука как JSON-объект и применяет обновления с использованием стандарта JSON Patch (RFC 6902). Это продвинутый режим для детального контроля над JSON-структурами.
    • Input Schema: Должен содержать переменную {{JSON_PATCH}}. Содержимое этой переменной должно быть валидным массивом JSON Patch.
    • Output Schema: Должен быть валидной JSON Schema, определяющей структуру целевого JSON-объекта. Если запись лорбука ещё не существует, шаблонный объект будет создан на основе этой схемы перед применением первого патча.

Все остальные настройки эквивалентны стандартным настройкам World Info. Плейсхолдеры из Input Schema можно (и нужно) использовать в полях Title, Parent, Primary Keys, Secondary Keys, Automation ID и Inclusion Group. Но убедитесь, что плейсхолдер для Title присутствует в каждом Input Schema.

Некоторые из доступных настроек включают:

  • Parent: Заголовок другой записи для установления иерархии.
  • Strategy: Normal для активации по ключевым словам, Constant для постоянной активности.
  • Position, Depth, Order: Контролируют, где и когда запись инжектируется в контекст.
  • Trigger Probability: Вероятность активации записи.
  • Scan Depth: Сколько последних сообщений сканировать на ключевые слова. null для бесконечного.
  • Case Sensitive, Match Whole Words: Опции сопоставления ключевых слов.
  • Sticky, Cooldown, Delay: Контролируют частоту и время активации.

Замечание: Title подразумевается быть уникальным. Для избежания конфликта имен лучше указывать дополнительную и в некоторых случаях избыточную информацию, например Person {{name}} или Profile {{name}}.

Редактор записей

Редактор записей позволяет управлять всеми записями чатового лорбука. Доступ к нему можно получить через меню "волшебной палочки" (Edit LoreBook entries).

Редактор записей карточки

Аналогичен стандартному редактору записей, но используется для управления записями лорбука, встроенными в гритинг персонажа (начальные состояния). Доступ к нему так же можно получить через меню "волшебной палочки" (Edit Card's LoreBook entries).

Кнопки

В меню "волшебной палочки" есть пять вспомогательных кнопок:

  1. Edit Card's LoreBook entries - открывает редактор для управления лорбуками для каждого из гритингов персонажа.
  2. Edit LoreBook entries - открывает всплывающее окно для просмотра и управления всеми записями лорбука для текущего чата.
  3. Load LoreBook Snapshot - загружает сохраненный снапшот лорбука из чата. Снапшоты делаются при каждом изменении (внутри расширения) и сохраняются вместе с сообщениями.
  4. Save LoreBook Snapshot - сохраняет текущий лорбук чата в последнее сообщение. Полезно, если вам нужно сохранить ручные изменения в лорбуке.
  5. Reset Active LoreBook - сбрасывает текущий активный лорбук чата к состоянию, определенному в карточке персонажа для текущего гритинга.

Макросы

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

  • {{LoreManager name [representation_type]}} (Alias: {{LoreManager-GetEntryByName::name::[representation_type]}})
    • Описание: Возвращает содержимое записи по её имени.
    • Параметры:
      • name (строка): Заголовок/имя записи для получения.
      • representation_type (строка, опционально, по умолчанию: RAW): Определяет формат вывода для JSON-записей. Может быть RAW (по умолчанию), YAML или XML.
  • {{LoreManager-GetNames::[filter]}}
    • Описание: Возвращает список имён всех записей лорбука, разделённых запятыми, опционально отфильтрованный по подстроке.
    • Параметры:
      • filter (строка, опционально): Подстрока для фильтрации имён записей. Возвращаются только имена, содержащие эту подстроку (без учёта регистра).
  • {{LoreManager-CheckText::text}}
    • Описание: Вручную запускает процесс обновления лорбука, проверяя предоставленный текст по всем активным схемам групп. Полезно для обработки текста, который не является частью обычного сообщения чата.
    • Параметры:
      • text (строка): Текст для проверки по схемам групп.
    • Возвращает: Пустую строку. Этот макрос предназначен для побочного эффекта (обновление лорбука).
  • {{LoreManager-GetRandomEntries::[count]::[filter]}}
    • Описание: Возвращает указанное количество случайных записей лорбука, разделённых переносами строк. Записи могут быть отфильтрованы по имени.
    • Параметры:
      • count (целое число, опционально, по умолчанию: 1): Количество случайных записей для возврата.
      • filter (строка, опционально): Подстрока для фильтрации имён перед выбором случайных.
  • {{LoreManager-GetEntriesByGroup::group_name}}
    • Описание: Возвращает содержимое всех записей, принадлежащих указанной группе, отсортированных по свойству Order и разделённых переносами строк. Если группа или записи не существуют, возвращается пустая строка.
    • Параметры:
      • group_name (строка): Имя группы, содержимое записей которой нужно получить.
  • {{LoreManager-GetChildrenByName::name}}
    • Описание: Возвращает содержимое всех дочерних записей, принадлежащих указанной родительской записи, разделённых переносами строк.
    • Параметры:
      • name (строка): Имя родительской записи, чьи дочерние записи нужно получить.

Слэш-команды

Расширение регистрирует следующие слэш-команды:

  • /loremanager-rollback
    • Описание: Откатывает лорбук к состоянию до последнего сообщения.
  • /loremanager-rescan
    • Описание: Повторно сканирует последнее сообщение.

Иерархия записей

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

Наследование ключей

  • Восходящее распространение: Ключевые слова (Primary Keys) дочерней записи автоматически добавляются к её родителю, родителю родителя и так далее, до корня иерархии. Это гарантирует, что активация конкретной, детальной записи также активирует её более широкие, общие родительские записи.
  • Уникальность: Дублирующиеся ключи обрабатываются автоматически, так что каждый ключ остаётся уникальным.

Корректировка порядка

  • Родитель первый: Система гарантирует, что Order родительской записи всегда меньше, чем у её потомка.
  • Автоматическая коррекция: Если дочерняя запись имеет значение Order меньше или равное родительскому, Order дочерней записи будет автоматически скорректирован до Order родителя + 1. Это сохраняет логический порядок инжекции в контексте.

Ограничения

Текущая реализация некоторых функций имеет известные ограничения:

  • JSON Patch: Политика обновления JSON Patch поддерживает только операции add, remove и replace. Операции move, copy и test из RFC 6902 в настоящее время не реализованы.
  • JSON Schema for Object Generation: Функция, которая генерирует базовый объект из Output Schema, очень базовая.
    • Она распознаёт только ключевые слова type, properties и default.
    • Она не генерирует элементы для массивов (игнорирует ключевое слово items), возвращая пустой массив.
    • Она игнорирует большинство других валидационных и структурных ключевых слов, таких как required, oneOf, anyOf, enum и т.д.

Примеры

Простой блок сцены

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

Input Schema:

1
2
3
4
5
<scene>
Name: {{name}}
Objects: {{objects}}
Weather: {{weather}}
<scene>

Output Schema:

1
2
3
4
<scene name="{{name}}">
Weather: {{weather}}
Objects: {{objects}}
</scene>

Entries Update Policy: Replace

Title: Scene {{name}}

Primary Keys: {{name}}

Список событий

Список событий, где каждое новое событие будет записано в конец списка.

Input Schema:

[New Event] {{event summary}}

Output Schema:

1
2
3
<events list>
{{event summary}}
</events list>

Entries Update Policy: Append

Strategy: Constant

Title: Events List

Управление JSON-объектами (с JSON Patch)

Этот пример демонстрирует, как управлять инвентарём персонажа, который хранится как JSON-объект в записи лорбука. Мы можем добавлять, удалять и обновлять предметы, используя политику обновления JSON Patch.

Input Schema:
Эта схема захватывает команды для модификации инвентаря. Например, [patch] [{"op": "add", "path": "/items/-", "value": {"name": "Health Potion", "quantity": 1}}] [/patch].

[patch] {{JSON_PATCH}} [/patch]

Output Schema:
Эта JSON Schema определяет структуру нашего объекта инвентаря. Если запись "Character Inventory" не существует, она будет создана с этой структурой перед применением первого патча.

{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "quantity": { "type": "number", "default": 1 }
        },
        "required": ["name"]
      },
      "default": []
    },
    "gold": {
      "type": "number",
      "default": 100
    }
  }
}

Entries Update Policy: JSON Patch

Title: Character Inventory

Кратко о принципах работы

При смене чата

  1. Загружаются группы, встроенные в карточку персонажа (если такие имеются)
  2. Загружается лорбук, встроенный в текущий чат, или создается новый и встраивается в чат

При получении нового сообщения

  1. Подгружается лорбук, встроенный в текущий чат
  2. К содержимому сообщения применяются шаблоны поиска из активных групп, которые ищут соответствия
  3. Если были найдены соответствия - захватываются переменные в соответствии с плейсхолдерами шаблонов поиска
  4. Переменные соединяются с переменными соответствующих Title записей в лорбуке на основе выбранного правила (Replace или Append)
  5. Обновленная запись записывается в лорбук

Так же работает при получении новых сгенерированных блоков из ExtBlocks

При удалении сообщения

  1. Ищется последний снапшот лорбука в чате
  2. Загружается последний снапшот (если он есть)

При свайпе (до генерации)

  1. В свайпе (если он не новый) ищется встроенный снапшот лорбука. Если он найден - загружается он.
  2. Если снапшот не найден или свайп новый - ищется снапшот среди соседних свайпов
  3. Если снапшот найден среди соседних свайпов, то загружается последний снапшот до текущего сообщения (для избежания нелинейной модификации)
  4. Если не найден - текущий лорбук остается неизменным
Edit

Pub: 24 Feb 2025 19:37 UTC

Edit: 18 Dec 2025 12:05 UTC

Views: 1033