Внешние блоки
Расширение для внешней генерации блоков (ST 1.14.0+ staging)
Ссылка - https://gitgud.io/Monblant/extblocks
Установка: Extensions → Install extension (сверху справа) → Вставить ссылку https://gitgud.io/Monblant/extblocks
Обновление: Extensions → Manage extensions (сверху справа) → скролл вниз → кнопка обновить рядом с ExtBlocks
Краткое описание
Обозначения
- Блок - любая структура, ограниченная XML-тегами
<block_name>...</block_name> - Основная сетка - API, которая используется для генерации основного ответа
- Дополнительная сетка - API и конкретная модель, которые используются для генерации блоков
Что делает
- Автоматическая генерация блоков: Автоматически создает блоки по триггерам (сообщения пользователя и/или ответы персонажа) и сохраняет их в конфигурации сообщения.
- Поддержка Secondary API: Позволяет использовать отдельное API для генерации блоков со своими собственными настройками.
- Пресеты и редактирование: Позволяет редактировать конфигурации блоков и создавать многоразовые пресеты.
- Интеграция с карточкой персонажа: Позволяет встраивать конфигурации блоков прямо в карточки персонажей.
- Гибкий инжект: Вставляет блоки на указанную глубину относительно сообщений пользователя/персонажа или до/после системного промпта.
Зачем это нужно?
- Динамический контент: Генерация динамических блоков, таких как инфоблоки, думалки или саммари.
- Чистые промпты: Позволяет освободить основной промпт от лишних инструкций, связанных с блоками.
- Совместимость со стоп-строками: Работает в средах, где используются стоп-строки (например, с расширением ноасса).
- Преимущества допсеток:
- Экономия лимитов основного API.
- Обход ограничений по частоте запросов (rate limits).
- Использование более быстрых или специализированных моделей для генерации блоков.
- Изолированная генерация: Использование отдельных настроек API и контекста для блоков.
- Гарантированная периодичность: Блоки будут появляться через заданные интервалы.
- Улучшенное следование инструкциям: Изолированный контекст и промпты позволяют нейронке лучше соблюдать инструкции.
- Эффективная работа с лорбуками: Раздельные процессы генерации лучше взаимодействуют с записями лорбука.
Типы блоков
- Генерируемый блок: Блок, содержимое которого генерируется через допсетку.
- Рерайт-блок: Генерируемый блок, который перезаписывает основной ответ персонажа.
- Накопительный блок: Блок, который обновляет свое содержимое на основе блока-обновителя, появившегося в основном ответе или в сгенерированных блоках.
- Скриптовый блок: Блок, который выполняет код на STScript или JavaScript. Внимание: Всегда проверяйте JS-скрипты перед запуском, чтобы убедиться в их безопасности.
Настройка
Расширение включается по кнопке Enable ExtBlocks.
Настройки API
Расширение использует собственные настройки API для генерации блоков, отдельно от настроек основного чата. Это позволяет использовать разные модели, аккаунты или сервисы.
Настройки используют SillyTavern Connection Profiles. Connection Profile объединяет источник API (например, OpenAI, Claude), модель и прокси в единый профиль. Управлять ими можно в основной панели API Settings.
ExtBlocks предоставляет три настраиваемых API-пресета: Big, Medium и Small. Каждый пресет можно настроить со своим Connection Profile и параметрами генерации (температура, стриминг и т.д.).
Шаги настройки:
- Настройте API-пресеты: В разделе
API Settingsвнутри панели ExtBlocks выберите пресет в выпадающем списке. Для каждого укажите нужный Connection Profile из ваших настроек SillyTavern и отрегулируйте другие параметры при необходимости. - Назначьте пресеты блокам: В конфигурации каждого блока есть иконка выбора пресета (иконка батареи). Кликайте по ней, чтобы выбрать один из трех API-пресетов для этого конкретного блока.
Эта система позволяет гибко управлять ресурсами. Например, можно использовать мощную модель (пресет Big) для сложных творческих блоков и более быструю и дешевую модель (пресет Small) для простых и частых блоков.
Взаимодействие
Пресеты блоков и встроенные блоки
- Пресеты блоков расположены сверху в
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- роль для инжекта (system, assistant или user).Injection Position:After Main PromptиBefore Main Prompt- работает корректно только с ролью системы. Мейнпромпт должен быть включен в пресете.In Chat- вставляет в чат на определенную глубину, корректно работает с ролями user и assistant.
Injection Depth- глубина инжекта в чат. При отрицательных значениях вставляет блок с начала чата, при положительных - с конца.
Пример накопительного блока
Накопительные блоки используют формат YAML для представления состояния. Поддерживаются строки, числа, булевы значения, массивы и вложенные объекты.
Пример блока-обновителя
Блок-обновитель использует операторы в стиле MongoDB в формате YAML для изменения состояния. Поддерживаемые операторы:
$set: Устанавливает значение поля.$inc: Увеличивает или уменьшает числовое поле.$push: Добавляет элемент в массив.$pull: Удаляет элемент из массива.$unset: Удаляет поле.
Генерируемые блоки
В окне редактирования блоку можно задать:
- Имя - точное название блока без < и >
- Тип - инжектовый или рерайт (о нем ниже)
- Шаблон блока
- Промпт блока
- Триггеры:
User Message- блок будет генерироваться после сообщения юзера (также после нажатия на свайп, если чат был изменен)Char Message- блок будет генерироваться после сообщения чараGeneration Pause- приостанавливает генерацию основного ответа при нахождении кейворда. Блоки с этим триггером сгенерируются после остановки, а затем основная генерация продолжится. Поддерживает только кейвордную периодичность.
- Периодичность - будет ли блок генерироваться с заданным периодом или по определенному кейворду.
- Период - расстояние между номерами сообщений. Например, если задан триггер
User message, то чтобы блок генерировался каждое сообщение юзера, нужно задать период 2; каждое второе сообщение - период 4 и т.д. Нечетные периоды имеет смысл задавать только если включены оба триггера. - Кейворд - строка, при встрече в сообщении которой будет активироваться генерация блока.
- Состояние:
Disabled- выключен ли блок (его генерация).Hide From Display- нужно ли прятать блок из видимости для юзера.Inject block- нужно ли вставлять блок в контекст основной генерации.Background Generation- должен ли блок генерироваться в фоне.
- Настройки инжекта:
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- предыдущий блок.
- Порядок контекста изображен снизу справа, элементы можно передвигать вверх/вниз и удалять. Контекст можно импортировать и экспортировать. Блоки с одинаковым контекстом и триггером будут генерироваться в одной генерации (с учетом периода).
Пример корректной связки имя-шаблон-промпт для генерируемого блока:
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>, остальное содержание ответа свободное. Имя блока может быть любым, в отличие от обычных генерируемых блоков.
Рерайт блоки поддерживают частичный рерайт. Вы можете выбрать определенную часть сообщения в редакторе и перезаписать только эту часть. Для этого:
- Нажмите кнопку "Partial Rewrite" в редакторе сообщения (карандаш в квадрате).
- Выделите в редакторе текст, который хотите переписать.
- Появится всплывающее окно, в котором вы можете выбрать блок перезаписи и ввести дополнительный промпт.
- Макрос
{{textToRewrite}}будет содержать выделенный текст (или полное сообщение, если выделение не было сделано).
Пример корректной связки имя-шаблон-промпт для рерайт блока:
Block Name:
basic rewrite
Block Template:
<rewritten text>
Rewritten text here
</rewritten text>
Block prompt:
Rewrite the given text:
{{textToRewrite}}
Скриптовые блоки
В окне редактирования блоку можно задать:
- Имя - точное название блока без < и >
- Тип скрипта - STScript или JS
- Текст скрипта
- Триггеры, периодичность, состояние - как у генерируемых блоков
- Порядок выполнения - будет ли скрипт выполняться до или после генерации блоков
API для JS скриптов
Работа с STScript:
(async) executeST(text): Выполняет STScript строку, переданную в функцию.
Контекстные переменные (доступны как прямые переменные):
messageId: Идентификатор сообщения, для которого выполняется скрипт.isUser: Булево значение, указывающее, отправлено ли сообщение пользователем.allBlocks: Массив всех включенных блоков.triggeredBlocks: Массив блоков, запущенных для текущего сообщения.additionalMacro: объект, содержащий дополнительные макросы (например,{{additionalPrompt}}).is_separate: булево значение, указывающее, является ли генерация отдельным сообщением.
Получение блоков:
BlockService.getAllBlocks(): Получает все блоки из текущего пресета и карточки персонажа в виде массива.BlockService.getBlocksByType(types, enabledOnly): Получает блоки по их типам (например,['generated']).BlockService.getAllEnabledBlocks(): Получает все включенные блоки.BlockService.getAllPreviousBlocks(): Получает все включенные блоки в виде комбинированной строки из предыдущих сообщений.ContextService.getPreviousBlockContextUnconditional(block, messageId, may_current, count): Получает предыдущие состояния блока.block: Объект блока.messageId: ID сообщения, с которого начинается поиск.may_current(опционально, по умолчаниюfalse): Искать ли блок в сообщении сmessageId.count(опционально, по умолчанию 1): Количество состояний для получения.
Работа с блоками:
(async) RewritePlugin.generateRewrite(rewriteBlock, messageId, allBlocks, additionalMacro): Генерирует рерайт блок, возвращая строку.rewriteBlock: Объект рерайт блока.messageId: ID сообщения, для которого генерируется блок.allBlocks: Массив всех релевантных блоков.additionalMacro(опционально): Объект для дополнительных макросов, например{ fruit: 'apple' }позволит использовать{{fruit}}.
(async) RewritePlugin.execute(rewriteBlocks, options): Генерирует рерайт блоки и перезаписывает указанное сообщение.rewriteBlocks: Массив рерайт блоков.options: Объект, содержащий:generation_order: Фильтрует блоки по тому, генерируются ли они'before'(до) или'after'(после) основных блоков.messageId,allBlocks,additionalMacro: Аналогично описанному выше.
(async) ScriptPlugin.execute(scriptBlocks, options): Выполняет скриптовые блоки.scriptBlocks: Массив скриптовых блоков.options: Объект, содержащий:execution_order: Фильтрует скрипты по тому, выполняются ли они'before'или'after'основных блоков.
(async) GeneratedPlugin.generateBlockContent(blocksInGroup, messageId, allBlocks, additionalMacro): Генерирует блоки, возвращая строку.blocksInGroup: Массив генерируемых блоков с одинаковым контекстом (обычно массив из одного блока).messageId,allBlocks,additionalMacro: Аналогично описанному выше.
(async) GeneratedPlugin.execute(generatedBlocks, options): Генерирует блоки и вставляет их в сообщение.generatedBlocks: Массив генерируемых блоков.options: Объект, содержащий:messageId,allBlocks,additionalMacro: Аналогично описанному выше.is_separate(опционально, по умолчаниюfalse): Еслиtrue, блоки помещаются в новое системное сообщение вместо сообщения сmessageId.
(async) GenerationService.handleBlocksGeneration(messageId, isUser, allBlocks, triggeredBlocks, additionalMacro, is_separate): Отвечает за обработку и генерацию всех блоков для заданного сообщения.isUser(boolean): Идет ли сообщение от пользователя.triggeredBlocks: Массив блоков для обработки.messageId,allBlocks,additionalMacro,is_separate: Аналогично описанному выше.
BlockService.injectBlock(block, blockConfig): Вставляет состояние блока в основной контекст.block(string): Состояние блока.blockConfig(object): Конфигурация блока.
(async) BlockService.addBlocksToExtra(messageId, blocksStr): Добавляет блоки в extra-хранилище сообщения.(async) BlockService.purgeBlocksExtra(messageId, noUpdate): Очищает хранилище блоков в сообщении.(async) BlockService.updateBlocksDisplay(messageId): Обновляет отображаемый текст сообщения на основе его блоков.(async) BlockService.selfReloadCurrentChat(): Перезагружает текущий чат.(async) AccumulationPlugin.execute(blocks, options): Выполняет накопительные блоки.ApiService.abortGeneration(): Прерывает текущую генерацию блоков.
Контекст расширения:
extStates: Константа-объект, хранящая состояния расширения.ExtBlocks_settings: Настройки расширения.current_set: Текущий пресет блоков.api_preset: Текущий API-пресет.spoilerRegex,self_reload_flag,is_chat_modified: Внутренние технические значения.
Контекст таверны:
context: Константа-объект, хранящая функции и состояния таверны, определена в/public/scripts/st-context.js.
Примеры скриптовых блоков:
- Сгенерировать и вставить блок
scene infoдля последнего сообщения в чате:
- Сгенерировать блок
profileв виде строки и вывести его в консоль браузера:
- Получить четыре предыдущих состояния блока
scene infoи вывести их в консоль:
- Переписать последнее сообщение с помощью блока
basic rewrite, если оно содержит триггер-слова:
- Инжектировать последнее состояние блока
scene info:
Инициализация блоков
Вы можете инициализировать блоки для новых чатов, добавив их в приветствие (самое первое сообщение). Если вы добавляете блоки через редактирование первого сообщения, нужно перезагрузить чат, чтобы блоки переместились в хранилище блоков. Проверить, что блоки добавились, можно повторным открытием редактора сообщения - они больше не должны отображаться в тексте сообщения.
Редактирование блоков в сообщении
Сгенерированные блоки сохраняются внутри сообщений, и их можно редактировать. Нажмите на три точки у сообщения, найдите иконку карандаша на листе (обычно это последняя кнопка) и нажмите на нее, чтобы открыть редактор. Отредактируйте блоки и сохраните изменения.
Слэш-команды
- Генерация блока/блоков -
/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- имя скриптового блока/блоков, разделенных запятой, обязательный аргумент.
- Прерывание текущей генерации блоков -
/extblocks-abort-generation.
Макросы
Глобальные макросы
Макросы, которые можно использовать в любом месте SillyTavern.
{{ExtBlocks::имя_блока}}: Доступ к последнему состоянию конкретного блока.{{ExtBlocks-GetBlockByName::имя_блока}}: Алиас для{{ExtBlocks::имя_блока}}.{{ExtBlocks-Call::имена_блоков::[доп_промпт]}}: Вызывает генерацию блоков по их именам (через запятую). Опционально можно передать дополнительный промпт.{{ExtBlocks-CallRewrite::имена_блоков::[доп_промпт]}}: Вызывает рерайт сообщения по именам блоков. Опционально можно передать дополнительный промпт.{{ExtBlocks-CallScript::имена_блоков}}: Запускает выполнение скриптовых блоков по их именам.
Локальные макросы
Макросы, которые можно использовать только в промпте, шаблоне и контексте генерируемого блока.
- Макросы лорбука (только для записей, которые всегда активны или активируются контекстом+шаблоном+промптом блока):
{{wiBefore}}: Записи лорбука с позицией↑Char.{{wiAfter}}: Записи лорбука с позицией↓Char.{{wiExamples}}: Записи лорбука с позицией↑EMи↓EM.{{wiDepth}}: Записи лорбука с позицией@D.{{wiAll}}: Все активированные записи лорбука.
{{mainPrompt}}: Основной промпт текущего пресета.{{additionalPrompt}}: Дополнительный промпт, переданный через слэш-команду.{{textToRewrite}}: (Только для рерайт блоков) Текст последнего сообщения или его часть (в случае частичного рерайта).