Как сохранить запрос в Open WebUI и подставлять новые данные

Создайте шаблон в Workspace Prompts, заполните переменные и проверьте сообщение до отправки. Две встречи книжного клуба показывают повторное использование.

После урока вы сможете

  • Создать заготовку повторяемого запроса в Workspace Prompts
  • Различать обязательное поле, значение по умолчанию и проверку фактов
  • Подставить два набора сведений и проверить подготовленные сообщения
  • Отличать текущий черновик от библиотечного оригинала и отдельной отправки модели

Проверяемый результат: Один сохранённый шаблон и два проверенных подготовленных сообщения с разными фактами; генерация ответа для упражнения не обязательна.

Допустим, вымышленная Анна готовит анонсы встреч книжного клуба. Каждую неделю ей нужно отправлять в чат одну и ту же просьбу о коротком черновике объявления, меняя лишь название книги, дату со временем и место сбора. Чтобы не переписывать инструкцию вручную и не копировать старые сообщения с риском оставить в них прошлое расписание, в Open WebUI используют библиотеку Workspace Prompts. Библиотека хранит текстовую заготовку с полями для ввода: человек выбирает её по короткой slash-команде и вводит сведения о событии, а интерфейс подставляет их в сообщение для проверки до отправки модели.

В этом уроке мы составим такую заготовку, разберём шаги её сохранения и дважды подставим сведения о вымышленных встречах, чтобы отделить работу с текущим черновиком от редактирования самого шаблона. Оба примера после подстановки показывают ожидаемые входные сообщения по официальной документации Prompts и коду Open WebUI, а не проведённый тест в живом интерфейсе и не ответ модели.

Отделите постоянную просьбу от фактов встречи

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

Вот полная текстовая заготовка, которую мы будем сохранять в библиотеку:

Подготовь короткий черновик объявления о встрече книжного клуба. Сохрани переданные факты; не добавляй адрес, стоимость или контакты, которых здесь нет.
Книга: {{book | text:required}}
Когда: {{when | text:required}}
Место: {{place | text:default="читальный зал":required}}

Первая строка задаёт саму просьбу (сама по себе текстовая инструкция не гарантирует, что модель выполнит все ограничения без ошибок), а выражения в двойных фигурных скобках объявляют пользовательские переменные. В коде разбора переменных парсер извлекает эти три декларации, а интерфейс при вызове шаблона строит по ним поля всплывающей формы:

ПолеЧто означает в задаче АнныЗапись в шаблонеНачальное состояние в форме
bookНазвание книги для текущей встречи{{book | text:required}}Пустое обязательное текстовое поле без значения по умолчанию
whenДата и время встречи одной обычной строкой{{when | text:required}}Пустое обязательное текстовое поле без значения по умолчанию
placeПомещение, где собирается клуб{{place | text:default="читальный зал":required}}Обязательное текстовое поле с предложенным значением читальный зал, которое нужно проверить или заменить

Судя по компоненту окна ввода, обозначение text задаёт однострочное текстовое поле. По умолчанию пользовательские переменные в шаблонах необязательны, поэтому для ключевых сведений мы явно добавляем флаг :required. Свойство default="читальный зал" заранее предлагает привычное место встречи, чтобы Анне не приходилось печатать его каждый раз.

Флаг :required проверяет лишь то, что строка в форме не осталась пустой, а default подставляет удобную заготовку для проверки человеком — ни то ни другое не доказывает, что указанные сведения соответствуют реальному расписанию клуба. Отдельная локальная проверка чистого парсера подтверждает только разбор этих трёх деклараций, а не отображение формы в браузере.

Эту заготовку не нужно смешивать с настройками из урока про модель и пресет ассистента. В карточке модели (Workspace → Models) поле System Prompt задаёт постоянную инструкцию пресета, а одноимённый блок Prompts внутри настроек модели хранит стартовые подсказки на экране нового чата (код редактора моделей). Наша заготовка сохраняется в отдельной библиотеке Workspace Prompts. Согласно документации по переменным в шаблонах, запись вида {{book | text:required}} относится именно к содержимому сохранённого шаблона в этой библиотеке: если вставить такую декларацию напрямую в System Prompt модели, она не создаст описанную форму ввода. Другие механизмы шаблонизации, вложенные выражения и форматы провайдеров мы здесь не рассматриваем, поэтому не переносите этот синтаксис в произвольные контексты.

Сохраните заготовку в Workspace Prompts

Теперь сохраним текст инструкции и три поля как отдельную библиотечную запись, чтобы вызывать заготовку в чате короткой командой. Последовательность ниже опирается на исходный код стабильного релиза v0.12.3 (релиз v0.12.3) и отдельно закреплённую ветку документации по созданию шаблонов. Документация закреплена отдельно от кода релиза (это не гарантирует полного совпадения документации с каждой установленной копией или версией), а в вашей установке могут использоваться другая версия, русская локализация или иные настройки ролей, поэтому видимые подписи в интерфейсе могут отличаться от базовых английских названий.

Для выполнения этих шагов у вашей учётной записи уже должен быть доступ к разделу Workspace → Prompts и право создавать шаблоны (проверка доступа в маршрутах рабочей области, проверка прав при создании на сервере). Возможность открыть этот раздел, право создать запись, а также права на чтение, редактирование и распространение шаблонов для других пользователей проверяются системой раздельно. Если нужного раздела нет в меню или кнопка создания недоступна, остановитесь и уточните права у администратора — не пытайтесь обходить ограничения и не меняйте серверные настройки.

Чтобы сохранить шаблон Анны, выполните пять шагов в интерфейсе (редактор шаблона):

  1. Перейдите в раздел Workspace → Prompts и нажмите кнопку Create в заголовке рабочей области, чтобы открыть окно создания.
  2. В поле Prompt Name (в тексте документации оно сокращённо названо Name) введите название: Анонс книжного клуба.
  3. В поле Command вручную впишите klub-anons без начального символа /. Сам слэш уже нарисован в интерфейсе перед полем ввода.
  4. В поле Prompt Content вставьте без изменений четыре строки шаблона из предыдущего раздела. Поля имени, команды и текста не должны оставаться пустыми.
  5. Нажмите кнопку Save & Create (кнопка сохранения в редакторе), не меняя настройки Access и не добавляя разрешений (grants).

Обратите внимание на поле Command. Пока вы не отредактировали команду вручную, интерфейс пытается сформировать её из названия через функцию slugify. Эта функция не делает транслитерацию русских букв, а просто удаляет кириллицу, поэтому для русского названия «Анонс книжного клуба» автоматическая команда окажется пустой или непригодной. Мы вписываем klub-anons вручную, выбирая для упражнения строчные латинские буквы и дефис (исходный валидатор допускает и другие символы, поэтому наш выбор не ограничивает весь разрешённый алфавит). Если команда klub-anons в вашем экземпляре уже занята другой записью (проверка уникальности команды на сервере), выберите любое свободное сочетание латинских букв с дефисом и используйте далее именно его.

Нажатие Save & Create создаёт запись в библиотеке, но ещё не формирует сообщение в чате и не обращается к языковой модели. В рамках упражнения мы оставляем запись личной и не трогаем меню Access, однако отказ от выдачи дополнительных прав сам по себе не исключает доступа администратора или хранения данных на сервере.

Вызовите шаблон и проверьте первое сообщение

Заготовка сохранена в библиотеке, но текста для конкретной встречи пока нет. Перейдём в чат и превратим шаблон в первое подготовленное сообщение.

Откройте чат с пустым полем ввода сообщения. Наберите /klub-anons (или выбранную вами при сохранении свободную команду) и в появившемся списке подсказок явно выберите мышью сохранённую запись «Анонс книжного клуба» (список подсказок команд). Просто напечатать текст /klub-anons в строке ввода недостаточно: нужно именно выбрать элемент из меню подсказок. Клавиши Enter или Tab сработают для выбора только в том случае, если меню подсказок открыто и нужная строка в нём уже выделена, поэтому клик мышью надёжнее.

Согласно обработчику вставки шаблона в поле сообщения и логике вызова окна переменных, выбор записи из списка вставляет текст заготовки в редактор чата, находит в нём наши пользовательские поля и открывает модальное окно Input Variables. Заполним форму для первой вымышленной встречи Анны:

  • в поле book введите: Капитанская дочка;
  • в поле when введите: 12 ноября, 19:00;
  • в поле place проверьте уже предложенное по умолчанию значение читальный зал и оставьте его;
  • нажмите кнопку Save в нижней части окна Input Variables.

Кнопка Save внутри формы переменных закрывает окно и подставляет введённые строки на место фигурных скобок в поле ввода чата (замена переменных в текстовом редакторе). Вот ожидаемое подготовленное сообщение в поле чата после буквальной подстановки (это входной черновик, а не ответ модели и не результат выполненного теста):

Подготовь короткий черновик объявления о встрече книжного клуба. Сохрани переданные факты; не добавляй адрес, стоимость или контакты, которых здесь нет.
Книга: Капитанская дочка
Когда: 12 ноября, 19:00
Место: читальный зал

Прежде чем делать что-то дальше, проверьте подготовленный текст прямо в поле ввода:

  1. Первая строка с инструкцией осталась без изменений.
  2. Все три факта (Капитанская дочка, 12 ноября, 19:00, читальный зал) стоят на своих местах, а значение по умолчанию действительно подходит для этой встречи.
  3. В тексте не осталось необработанных выражений {{book | text:required}}, {{when | text:required}} и {{place | text:default="читальный зал":required}}.

Разделим три разных действия. Кнопка Save & Create в рабочей области сохранила саму заготовку в библиотеку. Кнопка Save в окне Input Variables лишь подставила значения в черновик вашего сообщения. В проверенном коде выбор сохранённого шаблона через / и подтверждение формы не запускают генерацию ответа сами по себе — обращение к модели происходит только при отдельной отправке сообщения из чата (обработка отправки в компоненте чата; базовую механику мы разбирали в уроке про первый чат и отправку сообщения). Этот вывод об отсутствии автоотправки относится именно к рассмотренному пути выбора сохранённой slash-заготовки, а не к голосовому вводу, стартовым подсказкам или встроенным служебным командам.

Отсутствие автоматического вызова модели до отправки не означает работы полностью без сети: интерфейс обращается к серверу Open WebUI при загрузке списка шаблонов и данных сессии, черновик в поле ввода сохраняется в sessionStorage браузера, а маршрутизация и хранение данных на стороне провайдеров здесь не исследовались. Для результата нашего упражнения отправлять сообщение модели не обязательно — достаточно получить и сверить подготовленный входной текст. Если же вы решите отдельно отправить его, понадобится доступная разрешённая модель, а полученный черновик объявления всё равно придётся вычитать и сверить с фактами.

Подставьте другие факты и проверьте исходную заготовку

Очистите поле ввода от первого черновика (или откройте другое пустое поле сообщения), снова наберите /klub-anons (или выбранную вами свободную команду) и выберите мышью ту же сохранённую запись из списка подсказок. Согласно логике инициализации окна переменных, при каждом новом вызове форма заново считывает определения из сохранённого шаблона: поля book и when без default снова окажутся пустыми, а поле place опять предложит исходное значение читальный зал. Предыдущий ввод не перезаписывает настройки шаблона.

Заполним форму для следующей вымышленной встречи клуба, которая пройдёт в другом помещении:

  • в поле book введите: Маленький принц;
  • в поле when введите: 19 ноября, 18:00;
  • в поле place замените предложенное значение читальный зал на библиотека, зал 2;
  • нажмите Save.

Ожидаемый подготовленный вход во втором сообщении будет таким:

Подготовь короткий черновик объявления о встрече книжного клуба. Сохрани переданные факты; не добавляй адрес, стоимость или контакты, которых здесь нет.
Книга: Маленький принц
Когда: 19 ноября, 18:00
Место: библиотека, зал 2

Сравните оба подготовленных текста: первая строка с инструкцией совпала дословно, а изменились только три факта конкретной встречи. Этот же шаг объясняет, почему дату и время события Анна вводит вручную через переменную {{when | text:required}}, а не использует встроенную переменную {{CURRENT_DATE}}. В коде обработки контекстных переменных токен {{CURRENT_DATE}} подставляет текущую календарную дату в момент вставки шаблона в чат — он не знает дату будущей встречи книжного клуба, поэтому добавлять {{CURRENT_DATE}} в наш шаблон не нужно. И здесь же видна роль проверки default: если бы во второй раз Анна нажала Save, не глядя на предложенное поле place, в сообщение попал бы прежний «читальный зал» вместо нужного зала библиотеки.

Чтобы убедиться, что вторая подстановка и замена места не затронули библиотечный оригинал, вернитесь в раздел Workspace → Prompts и откройте сохранённую запись «Анонс книжного клуба». В поле Prompt Content по-прежнему останутся исходные декларации {{book | text:required}}, {{when | text:required}} и {{place | text:default="читальный зал":required}}. При следующем вызове /klub-anons (или вашей свободной команды) в чате форма снова предложит читальный зал, а не библиотека, зал 2. При этом введённые в форму значения не исчезают бесследно из самой системы: черновик сохраняется в браузере, а отправленные сообщения попадают в историю диалогов.

Разовая правка значений в окне Input Variables или редактирование текста прямо в строке чата меняют только текущее сообщение. Если же у клуба постоянно изменились правила или основное место встреч, нужно открыть саму запись в Workspace → Prompts, отредактировать поле Prompt Content и нажать кнопку Save в редакторе шаблона (страница редактирования записи). Настройки доступа Access у существующей записи при этом также трогать не нужно.

По итогам практики вы должны уверенно различать постоянную инструкцию, три вводимых при вызове факта, место хранения библиотечного оригинала, а также разницу между созданием шаблона (Save & Create), подтверждением формы (Save), сохранением правок в редакторе записи и отдельной отправкой сообщения модели. Если в вашей установке поведение отличается от описанного, сверьте версию Open WebUI, права своей учётной записи и точность скопированного текста без форматирования, не меняя серверные разрешения. При наличии доступа попробуйте составить такой же простой шаблон с двумя-тремя текстовыми полями для одной собственной повторяемой задачи с несекретными данными и перед отправкой проверьте подготовленное сообщение в поле ввода.

Если нужно сохранить не заготовку сообщения, а порядок проверки и отдельную памятку, переходите к уроку про Skills с инструкциями и файлами.

Отметить прохождение

Отметьте урок после того, как получили проверяемый результат из практической части.