Внешние блоки
Расширение для внешней генерации блоков (ST 1.12.0+)
Ссылка - https://gitgud.io/Monblant/extblocks
Установка: Extensions → Install extension (сверху справа) → Вставить ссылку https://gitgud.io/Monblant/extblocks
Обновление: Extensions → Manage extensions (сверху справа) → скролл вниз → кнопка обновить рядом с ExtBlocks
Changelog: скриптовые блоки
Краткое описание
Обозначения
- Блок - любая структура, ограниченная XML-тегами
<block_name>...</block_name>
- Основная сетка - API, которая используется для генерации основного ответа
- Дополнительная сетка - API и конкретная модель, которые используются для генерации блоков
Что делает
- Автоматически генерирует блоки по триггерам (отправленное сообщение юзера и/или пришедшее сообщение чара), сохраняет блоки в конфиге сообщений
- Позволяет использовать дополнительную сетку для генерации блоков (GPT, Gemini или Claude) с отдельными настройками
- Позволяет редактировать конфиг блоков и создавать пресеты блоков
- Позволяет встраивать конфиги блоков в карточку персонажа
- Автоматически создает регексы для блоков, которые скрывают их из основного промпта и из видимости (опционально)
- Позволяет инжектить блоки на глубину от роли юзера/чара или до/после системпромпта от роли системы
Зачем нужно
- Собственно генерировать блоки: например, инфоблоки или thinking
- Не засорять основной промпт инструкциями под блоки
- Работать в условиях присутствия стопстрингов (например, в случае ноасса)
- Использовать допсетки (не жечь ключ основной сетки, обходить рейтлимиты, использовать более быстрые и менее заточенные под писательство сетки)
- Использовать отдельные настройки апи и системпромта/префила для генерации блоков
- Гарантированная периодичность
- Отдельный промпт, отдельный контекст - лучшее исполнение инструкций, меньше потерь
- Раздельность генераций позволяет более эффективно работать с лорбуками
Виды блоков в расширении
- Генерируемый блок - блок, который генерируется сеткой
- Рерайтовый блок - генерируемый блок, который переписывает основной ответ
- Накопительный блок - блок, который обновляется исходя из появления блока-обновителя в основном ответе
- Скриптовый блок - блок, который выполняет код на STScript или JS. Если скрипт на JS, лучше почитать, что там написано, прежде чем его запускать.
Настройка
Расширение включается по кнопке Enable ExtBlocks
.
API допсетки
Настраивается в API Settings
:
- Выбирается
Chat Completion Source
и модель под него:- Для OpenAI: модели GPT, Gemini и LLaMA
- Для MistralAI: модели Mistral
- Для Claude: модели Claude
- Под выбранную модель выбирается пресет прокси.
- Опционально настраивается стриминг, температура, системпромпт и префил (актуально только для Claude)
Взаимодействие
Пресеты блоков и встроенные блоки
- Пресеты блоков расположены сверху в
ExtBlocks Preset
. Возможные операции с ними: создание нового, импорт из JSON, экспорт в JSON, удаление - Ниже в
Preset blocks
можно добавлять и импортировать из JSON конфиги блоков в пресет - Еще ниже в
Embedded blocks
можно добавлять и импортировать из JSON конфиги блоков в карточку персонажа. Конфиги блоков будут храниться в ней.
Редактирование блоков
Во вкладках Preset blocks
и Embedded blocks
можно выполнять операции с блоками: включать/выключать, редактировать, экспортировать в JSON, экспортировать промпт в JSON и удалять.
Накопительные блоки
В окне редактирования блоку можно задать:
- Имя - точное название блока без < и >
- Имя блока-обновителя - точное название блока без < и > (отличное от вышеупомянутого)
- Триггеры:
User Message
- блок будет обновляться исходя из сообщения юзераChar Message
- блок будет обновляться исходя из сообщения чара
- Состояние:
Disabled
- выключен ли блок (его генерация)Hide From Display
- нужно ли прятать блок из видимости для юзераInject block
- нужно ли вставлять блок в контекст основной генерации
- Настройки инжекта:
Injection Role
- роль инжекта (система, ассистент или юзер)Injection Position
:After Main Prompt
иBefore Main Prompt
- после/до мейнпромпта, корректно работает только с ролью системы. Мейнпромпт должен быть включен в пресете.In Chat
- на глубину в чат, корректно работает с ролями юзера и ассистента
Injection Depth
- глубина инжекта в чат. При отрицательных значениях вставляет блок на глубину с начала чата, при положительных - на глубину с конца.
Пример как должен выглядеть накопительный блок
У строк накопительного блока должна быть постоянная структура Свойство: Значение
Допустимы следующие типы значений: строка (в примере поле Name
), число (в примере поле Gold
) и массив (в примере поле Inventory
).
В массиве строки выглядят как Предмет: Количество предмета
(в примере строки Apple
и Sword
)
Note: Если предмет один, то можно писать просто Предмет
без двоеточия и количества (в примере - Map
).
Пример как должен выглядеть блок-обновитель
В блоке-обновителе поддерживаются несколько операций: присваивание (в примере поле Name
), сложение/вычитание для числовых значений (в примере поле Gold
), добавление/убирание предмета из массива (в примере поле Inventory
).
В сложении/вычитании нет пробела после +
, в добавлении/убирании - есть.
Генерируемые блоки
В окне редактирования блоку можно задать:
- Имя - точное название блока без < и >
- Тип - инжектовый или рерайт (о нем ниже)
- Шаблон блока
- Промпт блока
- Триггеры:
User Message
- блок будет генерироваться после сообщения юзера (также после нажатия на свайп, если чат был изменен)Char Message
- блок будет генерироваться после сообщения чара
- Периодичность - будет ли блок генерироваться с заданным периодом или по определенному кейворду.
- Период - расстояние между номерами сообщений. Например, если задан триггер
User message
, то чтобы блок генерировался каждое сообщение юзера, нужно задать период 2; каждое второе сообщение - период 4 и т.д. Нечетные периоды имеет смысл задавать только если включены оба триггера. - Кейворд - строка, при встрече в сообщении которой будет активироваться генерация блока.
- Состояние:
Disabled
- выключен ли блок (его генерация)Hide From Display
- нужно ли прятать блок из видимости для юзераInject block
- нужно ли вставлять блок в контекст основной генерации
- Настройки инжекта:
Injection Role
- роль инжекта (система, ассистент или юзер)Injection Position
:After Main Prompt
иBefore Main Prompt
- после/до мейнпромпта, корректно работает только с ролью системы. Мейнпромпт должен быть включен в пресете.In Chat
- на глубину в чат, корректно работает с ролями юзера и ассистента
Injection Depth
- глубина инжекта в чат. При отрицательных значениях вставляет блок на глубину с начала чата, при положительных - на глубину с конца.
- Контекст (правая часть редактора) - дополнительная информация для генерации. Доступны несколько видов контекста:
Text
- свободный текст, работают макросы таверныLast messages
- последние сообщения с возможностью прикрепления префиксов/суффиксов. При отрицательномMessages Count
выводятся первые сообщения.Last messages by keyword
- последние сообщения до встречи определенного кейворда. Полезно для кейворд-триггерных блоков.Previous block
- предыдущий блок.
- Порядок контекста изображен снизу справа, элементы можно передвигать вверх/вниз и удалять. Контекст можно импортировать и экспортировать. Блоки с одинаковым контекстом и триггером будут генерироваться в одной генерации (с учетом периода).
Итоговый промпт генерируемых блока/блоков, который отправляется на допсетку, будет выглядеть так:
- Склеенный контекст (через
\n
) \n
x 3- Склеенные шаблоны блоков (через
\n
) \n
x 2- Склеенные промпты блоков (через
\n
) - Отдельно системпромпт и префил (если Claude).
Пример корректной связки имя-шаблон-промпт для генерируемого блока:
Block Name:
current time
Block Template:
<current time>
Time of the day: HH:MM:SS
</current time>
Block prompt:
Write the current time of day in the <current time> block.
Рерайт блоки
Подвид генерируемых блоков, но они никуда не инжектятся - заместо этого они переписывают основной ответ. В редакторе для них есть дополнительный параметр Generation Order - контролирует когда блок будет перезаписывать сообщение, до или после генерации остальных блоков.
В шаблоне рерайт блоки должны содержать блок <rewritten text>
, остальное содержание ответа свободное. Имя блока может быть любым, в отличие от обычных генерируемых блоков.
Пример корректной связки имя-шаблон-промпт для рерайт блока:
Block Name:
basic rewrite
Block Template:
<rewritten text>
Rewritten text here
</rewritten text>
Block prompt:
Rewrite the given text.
Скриптовые блоки
В окне редактирования блоку можно задать:
- Имя - точное название блока без < и >
- Тип скрипта - STScript или JS
- Текст скрипта
- Триггеры, периодичность, состояние - как у генерируемых блоков
- Порядок выполнения - будет ли скрипт выполняться до или после генерации блоков
Дополнительные возможности скриптов на JS
- Через константу
context
можно получать доступ к API Таверны (которая получается черезSillyTavern.getContext()
) - Через async функцию
executeST(text)
можно выполнять STScript внутри JS.
Инициализация блоков
Блоки можно инициализировать для новых чатов, добавив их в гритинг. Если блоки добавляются через редактирование нулевого сообщения, то чат нужно перезагрузить, чтобы блоки перешли в блоковое хранилище. Добавились ли блоки можно проверить, зайдя в редактирование сообщения после - их там не должно остаться.
Редактирование блоков в сообщении
Сгенерированные блоки хранятся в сообщениях, их можно редактировать. Нажимаете на три точки в сообщениях, ищите иконку карандаша на листе (скорее всего последняя кнопка), нажимаете на нее, открывается редактор. Редактируете блоки, сохраняете.
Слэш-команды
- Генерация блока/блоков -
/extblocks-generate
. Для команды неважно, включен ли блок. Аргументы:name
- имя блока/блоков, разделенных запятой, обязательный аргументis_separate
- при значении true блок создаст новое сообщение от роли системы, необязательный аргумент- неименнованный аргумент (ака текст после именованных аргументов) - дополнительный промпт. В промпте, шаблоне и контексте блока доступ к дополнительному промпту осуществляется через локальный макрос
{{additionalPrompt}}
- Перегенерация последних блоков -
/extblocks-regenerate
- Очистка инжектов -
/extblocks-flushinjects
- Добавление блока в хранилище блоков последнего сообщения -
/extblocks-storage-append
. Аргументы:- неименнованный аргумент - строка блока (переносы строк нужно заменить на
{{newline}}
, а|
на\|
).
- неименнованный аргумент - строка блока (переносы строк нужно заменить на
- Очищение хранилища блоков последнего сообщения -
/extblocks-storage-purge
. - Экспорт всех предыдущих блоков в системное сообщение (полезно при переносе чата) -
/extblocks-storage-export
- Вызов рерайт блоков -
/extblocks-rewrite
. Для команды неважно, включен ли блок. Аргументы:name
- имя рерайт блока/блоков, разделенных запятой, обязательный аргумент- неименнованный аргумент (ака текст после именованных аргументов) - дополнительный промпт. В промпте, шаблоне и контексте блока доступ к дополнительному промпту осуществляется через локальный макрос
{{additionalPrompt}}
- Выполнение скриптовых блоков -
/extblocks-execute-script
. Для команды неважно, включен ли блок. Аргументы:name
- имя рерайт блока/блоков, разделенных запятой, обязательный аргумент
Глобальные макросы
Макросы, которые можно применять везде.
- Доступ к прошлому блоку можно получить через макрос
{{extblock:имя_блока}}
Локальные макросы
Макросы, которые можно применять только в промпте, шаблоне и контексте генерируемого блока.
- Макросы лорбука (только постоянные и те, которые активируются на контекст+шаблон+промпт блока):
{{wiBefore}}
- записи лорбука с позицией ↑Char{{wiAfter}}
- записи лорбука с позицией ↓Char{{wiExamples}}
- записи лорбука с позицией ↑EM и ↓EM{{wiDepth}}
- записи лорбука с позицией @D{{wiAll}}
- все активированные записи лорбука
- Мейнпромпт текущего пресета -
{{mainPrompt}}
- Дополнительный промпт переданный через слэш-команду -
{{additionalPrompt}}
Известные проблемы
- Если выйти из режима редактирования сообщения через крестик, то блоки не будут показываться. Лечится выходом из режима редактирования через галку или входом-выходом чата.