Внешние блоки

Расширение для внешней генерации блоков (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
  • Не засорять основной промпт инструкциями под блоки
  • Работать в условиях присутствия стопстрингов (например, в случае ноасса)
  • Использовать допсетки (не жечь ключ основной сетки, обходить рейтлимиты, использовать более быстрые и менее заточенные под писательство сетки)
  • Использовать отдельные настройки апи и системпромта/префила для генерации блоков
  • Гарантированная периодичность
  • Отдельный промпт, отдельный контекст - лучшее исполнение инструкций, меньше потерь
  • Раздельность генераций позволяет более эффективно работать с лорбуками

Виды блоков в расширении

  1. Генерируемый блок - блок, который генерируется сеткой
  2. Рерайтовый блок - генерируемый блок, который переписывает основной ответ
  3. Накопительный блок - блок, который обновляется исходя из появления блока-обновителя в основном ответе
  4. Скриптовый блок - блок, который выполняет код на STScript или JS. Если скрипт на JS, лучше почитать, что там написано, прежде чем его запускать.

Настройка

Расширение включается по кнопке Enable ExtBlocks.

API допсетки

Настраивается в API Settings:

  1. Выбирается Chat Completion Source и модель под него:
    • Для OpenAI: модели GPT, Gemini и LLaMA
    • Для MistralAI: модели Mistral
    • Для Claude: модели Claude
  2. Под выбранную модель выбирается пресет прокси.
  3. Опционально настраивается стриминг, температура, системпромпт и префил (актуально только для 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).

1
2
3
4
5
6
7
8
9
<example>
Name: Test
Gold: 100
Inventory: [
  Apple: 4
  Sword: 2
  Map
]
</example>

Пример как должен выглядеть блок-обновитель
В блоке-обновителе поддерживаются несколько операций: присваивание (в примере поле Name), сложение/вычитание для числовых значений (в примере поле Gold), добавление/убирание предмета из массива (в примере поле Inventory).
В сложении/вычитании нет пробела после +, в добавлении/убирании - есть.

1
2
3
4
5
6
<example updater>
Name: User
Gold: +5
Inventory: + Scroll
Inventory: - Apple
</example updater>

Генерируемые блоки

В окне редактирования блоку можно задать:

  • Имя - точное название блока без < и >
  • Тип - инжектовый или рерайт (о нем ниже)
  • Шаблон блока
  • Промпт блока
  • Триггеры:
    • 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-generate name="reflexion, thinking"
  • Перегенерация последних блоков - /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}}

Известные проблемы

  • Если выйти из режима редактирования сообщения через крестик, то блоки не будут показываться. Лечится выходом из режима редактирования через галку или входом-выходом чата.

Ссылки:

Edit
Pub: 27 Jul 2024 11:48 UTC
Edit: 18 Oct 2024 16:15 UTC
Views: 1584