Оригинал: https://timofei-ermolaev.ru/courses/open-webui/sobstvennyy-assistent/shablony-zaprosov-i-peremennye/

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

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

[![Тимофей Ермолаев](https://timofei-ermolaev.ru/_astro/timofei-ermolaev-portrait.s0mCFw-J_Z1x8STQ.webp)](<https://timofei-ermolaev.ru/ob-avtore/>)

[Тимофей Ермолаев](<https://timofei-ermolaev.ru/ob-avtore/>) Директор по информационным технологиям (CIO)

**Опубликовано**

23 октября 2026 г.

**Обновлено**

23 октября 2026 г.

**На урок**

11 мин

**Тема**

[Собственный ассистент в Workspace](<https://timofei-ermolaev.ru/courses/open-webui/sobstvennyy-assistent/>)

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

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

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

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

В этом уроке мы составим такую заготовку, разберём шаги её сохранения и дважды подставим сведения о вымышленных встречах, чтобы отделить работу с текущим черновиком от редактирования самого шаблона. Оба примера после подстановки показывают ожидаемые входные сообщения по [официальной документации Prompts](<https://github.com/open-webui/docs/blob/535caeacd5e72fac142e042dcf4928906fd80312/docs/features/workspace/prompts.md>) и коду Open WebUI, а не проведённый тест в живом интерфейсе и не ответ модели.

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

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

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

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

Первая строка задаёт саму просьбу (сама по себе текстовая инструкция не гарантирует, что модель выполнит все ограничения без ошибок), а выражения в двойных фигурных скобках объявляют пользовательские переменные. В [коде разбора переменных](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/utils/index.ts#L1748-L1767>) парсер извлекает эти три декларации, а интерфейс при вызове шаблона строит по ним поля всплывающей формы:

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

Судя по [компоненту окна ввода](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/chat/MessageInput/InputVariablesModal.svelte#L288-L298>) , обозначение `text` задаёт однострочное текстовое поле. По умолчанию пользовательские переменные в шаблонах необязательны, поэтому для ключевых сведений мы явно добавляем флаг `:required`. Свойство `default="читальный зал"` заранее предлагает привычное место встречи, чтобы Анне не приходилось печатать его каждый раз.

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

Эту заготовку не нужно смешивать с настройками из урока про [модель и пресет ассистента](<https://timofei-ermolaev.ru/courses/open-webui/sobstvennyy-assistent/iz-chego-sobiraetsya-assistent/>) . В карточке модели (`Workspace` → `Models`) поле `System Prompt` задаёт постоянную инструкцию пресета, а одноимённый блок `Prompts` внутри настроек модели хранит стартовые подсказки на экране нового чата ([код редактора моделей](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/workspace/Models/ModelEditor.svelte#L1533-L1548>) ). Наша заготовка сохраняется в отдельной библиотеке **Workspace Prompts**. Согласно [документации по переменным в шаблонах](<https://github.com/open-webui/docs/blob/535caeacd5e72fac142e042dcf4928906fd80312/docs/features/workspace/prompts.md#L109-L115>) , запись вида `{{book | text:required}}` относится именно к содержимому сохранённого шаблона в этой библиотеке: если вставить такую декларацию напрямую в `System Prompt` модели, она не создаст описанную форму ввода. Другие механизмы шаблонизации, вложенные выражения и форматы провайдеров мы здесь не рассматриваем, поэтому не переносите этот синтаксис в произвольные контексты.

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

Теперь сохраним текст инструкции и три поля как отдельную библиотечную запись, чтобы вызывать заготовку в чате короткой командой. Последовательность ниже опирается на исходный код стабильного релиза `v0.12.3` ([релиз v0.12.3](<https://github.com/open-webui/open-webui/releases/tag/v0.12.3>) ) и отдельно закреплённую ветку [документации по созданию шаблонов](<https://github.com/open-webui/docs/blob/535caeacd5e72fac142e042dcf4928906fd80312/docs/features/workspace/prompts.md#L64-L75>) . Документация закреплена отдельно от кода релиза (это не гарантирует полного совпадения документации с каждой установленной копией или версией), а в вашей установке могут использоваться другая версия, русская локализация или иные настройки ролей, поэтому видимые подписи в интерфейсе могут отличаться от базовых английских названий.

Для выполнения этих шагов у вашей учётной записи уже должен быть доступ к разделу **Workspace** → **Prompts** и право создавать шаблоны ([проверка доступа в маршрутах рабочей области](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/routes/(app)/workspace/+layout.svelte#L49-L52>) , [проверка прав при создании на сервере](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/backend/open_webui/routers/prompts.py#L143-L166>) ). Возможность открыть этот раздел, право создать запись, а также права на чтение, редактирование и распространение шаблонов для других пользователей проверяются системой раздельно. Если нужного раздела нет в меню или кнопка создания недоступна, остановитесь и уточните права у администратора — не пытайтесь обходить ограничения и не меняйте серверные настройки.

Чтобы сохранить шаблон Анны, выполните пять шагов в интерфейсе ([редактор шаблона](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/workspace/Prompts/PromptEditor.svelte#L471-L505>) ):

1. Перейдите в раздел **Workspace** → **Prompts** и нажмите кнопку **Create** в заголовке рабочей области, чтобы открыть окно создания.
2. В поле **Prompt Name** (в тексте документации оно сокращённо названо *Name*) введите название: `Анонс книжного клуба`.
3. В поле **Command** вручную впишите `klub-anons` без начального символа `/`. Сам слэш уже нарисован в интерфейсе перед полем ввода.
4. В поле **Prompt Content** вставьте без изменений четыре строки шаблона из предыдущего раздела. Поля имени, команды и текста не должны оставаться пустыми.
5. Нажмите кнопку **Save & Create** ([кнопка сохранения в редакторе](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/workspace/Prompts/PromptEditor.svelte#L714-L722>) ), не меняя настройки **Access** и не добавляя разрешений (*grants*).

Обратите внимание на поле **Command**. Пока вы не отредактировали команду вручную, интерфейс пытается сформировать её из названия через [функцию `slugify`](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/utils/index.ts#L1717-L1732>) . Эта функция не делает транслитерацию русских букв, а просто удаляет кириллицу, поэтому для русского названия «Анонс книжного клуба» автоматическая команда окажется пустой или непригодной. Мы вписываем `klub-anons` вручную, выбирая для упражнения строчные латинские буквы и дефис (исходный валидатор допускает и другие символы, поэтому наш выбор не ограничивает весь разрешённый алфавит). Если команда `klub-anons` в вашем экземпляре уже занята другой записью ([проверка уникальности команды на сервере](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/backend/open_webui/routers/prompts.py#L177-L198>) ), выберите любое свободное сочетание латинских букв с дефисом и используйте далее именно его.

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

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

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

Откройте чат с пустым полем ввода сообщения. Наберите `/klub-anons` (или выбранную вами при сохранении свободную команду) и в появившемся списке подсказок явно выберите мышью сохранённую запись «Анонс книжного клуба» ([список подсказок команд](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/chat/MessageInput/CommandSuggestionList.svelte#L120-L134>) ). Просто напечатать текст `/klub-anons` в строке ввода недостаточно: нужно именно выбрать элемент из меню подсказок. Клавиши `Enter` или `Tab` сработают для выбора только в том случае, если меню подсказок открыто и нужная строка в нём уже выделена, поэтому клик мышью надёжнее.

Согласно [обработчику вставки шаблона в поле сообщения](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/chat/MessageInput.svelte#L1494-L1500>) и [логике вызова окна переменных](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/chat/MessageInput.svelte#L279-L298>) , выбор записи из списка вставляет текст заготовки в редактор чата, находит в нём наши пользовательские поля и открывает модальное окно **Input Variables**. Заполним форму для первой вымышленной встречи Анны:

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

Кнопка **Save** внутри формы переменных закрывает окно и подставляет введённые строки на место фигурных скобок в поле ввода чата ([замена переменных в текстовом редакторе](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/common/RichTextInput.svelte#L635-L665>) ). Вот ожидаемое подготовленное сообщение в поле чата после буквальной подстановки (это входной черновик, а не ответ модели и не результат выполненного теста):

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

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

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

Разделим три разных действия. Кнопка **Save & Create** в рабочей области сохранила саму заготовку в библиотеку. Кнопка **Save** в окне **Input Variables** лишь подставила значения в черновик вашего сообщения. В проверенном коде выбор сохранённого шаблона через `/` и подтверждение формы не запускают генерацию ответа сами по себе — обращение к модели происходит только при отдельной отправке сообщения из чата ([обработка отправки в компоненте чата](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/chat/Chat.svelte#L5308-L5316>) ; базовую механику мы разбирали в уроке про [первый чат и отправку сообщения](<https://timofei-ermolaev.ru/courses/open-webui/povsednevnaya-rabota/pervyy-chat/>) ). Этот вывод об отсутствии автоотправки относится именно к рассмотренному пути выбора сохранённой slash-заготовки, а не к голосовому вводу, стартовым подсказкам или встроенным служебным командам.

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

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

Очистите поле ввода от первого черновика (или откройте другое пустое поле сообщения), снова наберите `/klub-anons` (или выбранную вами свободную команду) и выберите мышью ту же сохранённую запись из списка подсказок. Согласно [логике инициализации окна переменных](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/chat/MessageInput/InputVariablesModal.svelte#L43-L58>) , при каждом новом вызове форма заново считывает определения из сохранённого шаблона: поля `book` и `when` без `default` снова окажутся пустыми, а поле `place` опять предложит исходное значение `читальный зал`. Предыдущий ввод не перезаписывает настройки шаблона.

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

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

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

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

Сравните оба подготовленных текста: первая строка с инструкцией совпала дословно, а изменились только три факта конкретной встречи. Этот же шаг объясняет, почему дату и время события Анна вводит вручную через переменную `{{when | text:required}}`, а не использует встроенную переменную `{{CURRENT_DATE}}`. В [коде обработки контекстных переменных](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/lib/components/chat/MessageInput.svelte#L392-L405>) токен `{{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** в редакторе шаблона ([страница редактирования записи](<https://github.com/open-webui/open-webui/blob/91ea4e3421d1d8069f13d4a463fcb5986d94ea60/src/routes/(app)/workspace/prompts/%5Bid%5D/+page.svelte#L18-L41>) ). Настройки доступа **Access** у существующей записи при этом также трогать не нужно.

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

Если нужно сохранить не заготовку сообщения, а порядок проверки и отдельную памятку, переходите к [уроку про Skills с инструкциями и файлами](<https://timofei-ermolaev.ru/courses/open-webui/sobstvennyy-assistent/skills-instrukcii-i-fayly/>) .

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

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

Урок пройден

![Тимофей Ермолаев](https://timofei-ermolaev.ru/_astro/timofei-ermolaev-portrait.s0mCFw-J_2r7Nkv.webp)

## Об авторе

### Тимофей Ермолаев

Директор по информационным технологиям (CIO)

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

[Подробнее об авторе](<https://timofei-ermolaev.ru/ob-avtore/>)
