Свойства config
Необязательные настройки агента живут в его config: как уходит промпт, первое сообщение, варианты ответа, модель, теги, экран-профиль, адрес страницы на сайте. Здесь — все ключи с типами, умолчаниями и ограничениями.
Как устроен config
config — JSON-объект агента с необязательными настройками. Отдельных колонок под них нет, поэтому новые настройки появляются без изменения схемы. Методы агентов принимают ключи config двумя способами.
| Способ | Пример | Что происходит |
|---|---|---|
| Плоско, на верхнем уровне | {"tags": ["customgpt"]} | Ключ записывается в config, остальные ключи config не трогаются |
Объектом config | {"config": {"tags": ["customgpt"]}} | То же самое: присланные ключи вливаются в сохранённый config, остальные остаются |
config сливается по ключам и в POST, и в PUT: присланный ключ заменяет значение, "ключ": null удаляет ключ, неприсланные ключи остаются как были. Прислать весь config, полученный через GET, можно — результат тот же. Если ключ пришёл и плоско, и внутри config, побеждает плоский.
Проверка и нормализация одни при любом способе передачи: config.page_url приводится к /путь/, config.tags — к нижнему регистру без повторов, config.profile_screens — без пробелов по краям и повторов, строки profile_author, profile_author_url, page_markdown обрезаются по краям, а пустая строка удаляет ключ. Ошибка по вложенному ключу приходит в errors под именем config.<ключ>.
Картинки из config — character_avatar, image_references, prepared_images, out_of_credits_image — можно прислать data URL, файлом или внешней ссылкой, как image агента: сервер сохранит файл и запишет свой адрес. Подробно — Агенты → Картинка в запросе агента.
В ответе ключи config отдаются плоско, рядом с колонками агента. Ключа, который у агента не задан, в ответе нет. Исключения — prepared_suggestions, prepared_images, gallery_layout, tags, source_id, root_id: они есть всегда и всегда в нормализованном виде.
Плоско сервер принимает только известные ключи из таблиц ниже, неизвестный ключ на верхнем уровне молча отбрасывается. Внутри объекта config незнакомый ключ сохраняется как прислан.
До 26.09.2026 объект config в PUT заменял весь config агента, а вложенные ключи не проверялись. Теперь оба способа равнозначны: ключи сливаются, чтобы убрать ключ, пришлите его со значением null.
Промпт и первое сообщение
| Ключ | Тип | Описание |
|---|---|---|
prompt_target | string | Куда уходит prompt агента. user (умолчание) — скрытым первым сообщением пользователя: разовое задание вроде «напиши пост». system — добавляется к системному промпту ассистента и действует весь диалог: роль, правила, формат ответов |
prepared_suggestions | array | Варианты ответа (чипы) под первым сообщением: [{"text": "…", "response": "…"}]. text до 200 символов, response до 8000 или null. Массив строк тоже принимается. Клик по варианту с response показывает ответ сразу, без модели; без response — обычный ответ модели. Первые четыре варианта — карточки на экране-профиле. Переводится |
sticky_first_suggestions | boolean или null | Варианты первого сообщения не гаснут после клика и остаются весь диалог. Нет ключа или null — как у ассистента; true и false перебивают настройку ассистента |
prepared_images | array | Галерея картинок первого сообщения, до 5 штук: [{"url": "…", "alt": "…"}] или массив адресов. url — https://… или /storage/…, alt до 255 символов. Место в тексте задаёт шорткод в prepared_response, без него галерея над текстом. Одна на все языки |
gallery_layout | string | Раскладка галереи: grid (сетка, умолчание) или row (одна строка с прокруткой) |
file_upload_button | boolean | Кнопка «Загрузить файл» под первым сообщением. Работает у персонажей и у агентов с заготовленным первым сообщением (prepared_response или кэш) |
file_upload_button_label | string | Подпись этой кнопки, до 120 символов. Пусто — «Загрузить файл». Переводится |
Сам текст первого сообщения — колонка prepared_response (см. Агенты). Если его нет, первый ответ модели на клик может автоматически закэшироваться и дальше отдаваться мгновенно — кэш лежит в cached_responses, сбрасывается при смене prompt агента или модели и системного промпта ассистента. Ручные prepared_response и response у вариантов всегда главнее кэша.
Пример ответа с вариантами (живой запрос):
{
"prepared_suggestions": [
{ "text": "Первый вопрос", "response": null, "response_cached": null },
{ "text": "Второй", "response": "Готовый ответ", "response_cached": null }
]
}
response_cached добавляет сервер: это кэш ответа на вариант. В списке агентов он всегда null.
Модель, возможности и вызов
| Ключ | Тип | Описание |
|---|---|---|
model | string или null | Модель этого агента, до 120 символов: ключ из каталога моделей или полный id OpenRouter. Пусто — модель ассистента. Заданная модель скрывает выбор модели в чате. См. Модели |
capabilities | object | Точечное отключение возможностей внутри агента: {"images": false, "search": false}. Ключи — те же, что у возможностей ассистента: images, video, diagrams, plots, files_output, search, voice_input, voice_mode, model_selector, memory, agent. Работает только запрет: включить то, что выключено у ассистента, нельзя. Особые ключи sandbox и create_doc со значением true включают песочницу с кодом и сборку .docx, если у ассистента включена выдача файлов |
unlimited | boolean | Агент вне лимитов: пейволл его не закрывает, кредиты за него не списываются. Для служебных агентов — поддержка, партнёрская программа |
agent_callable | boolean | Ассистент может сам переключиться на этого агента в общем чате, если у него включён режим агента. Нет ключа — только по клику |
agent_when | string | Когда звать этого агента — подсказка модели, до 500 символов. Пусто — модель ориентируется на label и subtitle |
agent_post | boolean или null | Варианты ответа после сообщений ассистента для этого агента. Нет ключа или null — как у ассистента; true включает, false выключает |
agent_post_system_prompt | string | Свой промпт генерации этих вариантов, до 20000 символов. Пусто — промпт ассистента, затем стандартный |
agent_post_first_only | boolean или null | Варианты только после первого ответа (true) или после каждого (false). null — как у ассистента |
document_template | string | Оформление документов, которые создаёт агент: paper (умолчание, «бумага» для договоров и писем), resume (резюме), none (модель сама верстает html со своими стилями) |
panel | string или null | Панель справа от чата, которая открывается с агентом: posts — «План публикаций», creatives — форма креативов с референсами |
frame_id | integer или null | Свой HTML-экран вместо приветствия: id фрейма этого ассистента. Чужой или несуществующий id — 422. См. Фреймы агента |
Каталог, профиль и страница на сайте
| Ключ | Тип | Описание |
|---|---|---|
tags | array | Служебные теги для отбора, до 50 штук по 64 символа, например ["customgpt"]. Пользователю не показываются. Приводятся к нижнему регистру, пробелы по краям, пустые и повторы убираются. Нужен массив: строка — 422. Одни на все языки. По тегу каталог «Помощники» выводит только помеченных агентов, см. Каталог |
profile_screens | array | Слаги приветственных экранов ассистента, на которых агент открывается экраном-профилем, до 100 строк по 64 символа. На экране из списка клик по карточке агента и ссылка ?agent=<slug> показывают сначала профиль (аватар, автор, описание, варианты), на остальных экранах агент сразу начинает диалог. Экран определяется параметром w или screen адреса, без него — экран по умолчанию. Параметр ссылки agent_view=profile или chat перебивает список. Слаги берутся из GET /assistants/{assistantId}/welcome-screens; существование экрана не проверяется. Пробелы по краям и повторы убираются, пустая строка в массиве — 422. Заменяется целиком, null снимает список. Для каталога «Помощники» не нужен. См. Экран-профиль и ссылки |
profile_author | string | Строка «От …» на экране-профиле и карточке каталога, до 120 символов. Пусто — строки нет. Переводится |
profile_author_url | string | Ссылка автора, как «От awesomegpts.ai» со значком глобуса у GPT: полный http:// или https:// адрес, до 2048 символов. Другая схема или не ссылка — 422 profile_author_url: ожидается ссылка http(s)://…. Пока только хранится и отдаётся через API, в интерфейсе не выводится. Одна на все языки |
page_url | string или null | Адрес страницы агента на сайте ассистента, до 1024 символов. Карточка каталога «Помощники» ведёт на эту страницу вместо экрана-профиля. Нормализация — ниже. Одна на все языки |
page_markdown | string | Полный документ страницы агента на сайте для OnPress, до 50000 символов: frontmatter, строка вставки чата и тело с H2 и FAQ, формат — ниже. Базовое значение — английская страница, другие языки — locales.<язык>.page_markdown. Framesuite документ хранит и не разбирает: он публикуется на сайт как есть. В интерфейсе чата не выводится, но участвует в поиске каталога «Помощники». Старое имя — profile_markdown |
source_id | integer или null | Id агента, из которого сделана копия (копирует дашборд). null у оригинала |
root_id | integer | Корень цепочки копий. Не задан — собственный id агента |
page_url: как нормализуется адрес
Сервер приводит page_url к одному виду. Невалидное значение не даёт ошибки, а сохраняется как null — проверяйте ответ.
| Прислали | Сохранится |
|---|---|
base/canva | /base/canva/ |
/base/canva?utm=1 | /base/canva/?utm=1 |
https://bota.chat/base/canva?x=1#a | как есть |
javascript:alert(1), //evil.com/x, адрес с пробелом, пустая строка | null |
Путь (/base/canva/) открывается от домена сайта: если чат встроен в сайт или открыт на своём домене ассистента — от этого домена, на служебном адресе /f/<slug> — от своего домена ассистента. Если своего домена нет, путь некуда достроить, и карточка ведёт на экран-профиль. Полный https:// адрес работает везде.
page_url добавлен 25.09.2026. Нормализация одинакова для плоского ключа и config.page_url. Копия агента в дашборде получает page_url: null: два агента с одним адресом страницы не нужны.
page_markdown и старое имя profile_markdown
До 26.09.2026 текст страницы назывался profile_markdown. Старое имя по-прежнему принимается при записи — плоско, внутри config и внутри locales.<язык> — и сохраняется как page_markdown. Если в запросе есть оба имени, побеждает page_markdown. При чтении отдаётся только page_markdown; у агентов, сохранённых раньше, текст перенесён под новое имя.
| Прислали | Сохранится и вернётся |
|---|---|
{"profile_markdown": "## Текст"} | "page_markdown": "## Текст" |
{"config": {"profile_markdown": "## Текст"}} | "page_markdown": "## Текст" |
{"locales": {"en": {"profile_markdown": "## Text"}}} | "locales": {"en": {"page_markdown": "## Text"}} |
{"page_markdown": null} или {"page_markdown": ""} | ключа нет |
page_markdown: документ страницы для OnPress
В page_markdown лежит страница агента целиком, в формате markdown-метода OnPress v2: её публикуют на сайт ассистента как есть, запросом POST /pages/markdown к API сайта. Один документ — одна языковая версия страницы: английский — в page_markdown, остальные — в locales.<язык>.page_markdown, у каждого свой lang во frontmatter.
| Часть документа | Что в ней |
|---|---|
| frontmatter | name (заголовок H1), seo_title, seo_description, keyword, slug, url (совпадает с page_url агента), status, lang, frame |
| Строка вставки чата | <!-- onpress/assistant {"id":"<frame_slug ассистента>","agent":"<slug агента>","agent_view":"profile"} /--> — чат ассистента на странице, открытый профилем этого агента |
| Тело | Первый абзац — ответ на главный запрос, дальше разделы ## и блок вопросов <!-- onpress/faq --> … <!-- /onpress/faq --> |
---
name: "CV Review"
seo_title: "CV Review — find weak spots in your resume | bota.chat"
seo_description: "CV Review: get a point-by-point resume check with concrete fixes. Try it free on bota.chat."
keyword: "cv review"
slug: razbor-reziume
url: /base/razbor-reziume/
status: publish
lang: en
frame: landing
---
<!-- onpress/assistant {"id":"x8OA7Azs4hBy","agent":"razbor-reziume","agent_view":"profile"} /-->
CV Review is an assistant that checks your resume point by point and suggests concrete fixes.
## What it checks
Structure, wording of your experience, achievements with numbers, keywords for the job.
## CV Review FAQ
<!-- onpress/faq -->
### Is it free?
Yes, the first checks are free.
<!-- /onpress/faq -->
Документ передаётся в JSON одной строкой с \n, поэтому тело запроса удобнее собирать скриптом из файла — пример на странице Агенты. У агентов, заведённых раньше, в page_markdown может лежать только тело страницы без frontmatter.
Персонаж
Для action: character — отдельный собеседник со своим именем и аватаром. Промпт персонажа становится системным промптом диалога.
| Ключ | Тип | Описание |
|---|---|---|
character_name | string | Имя персонажа, до 255 символов в переводах. Переводится |
character_avatar | string | Адрес аватара. Заменяет image на экране-профиле и в каталоге |
character_gender | string | Пол персонажа, свободная строка |
out_of_credits_text | string | Своё сообщение «закончились кредиты», до 2000 символов. Пусто — встроенное. Переводится |
out_of_credits_image | string | Картинка в этом сообщении, до 1024 символов. Переводится |
Экран создания изображения
Для action: image. Пустые тексты — стандартные переводы интерфейса. Все текстовые ключи переводятся.
| Ключ | Тип | Описание |
|---|---|---|
image_overlay_title, image_overlay_subtitle | string | Заголовок и подзаголовок экрана |
image_reference_label, image_upload_label, image_upload_hint, image_upload_button | string | Подписи блока загрузки фото |
image_prompt_label, image_prompt_placeholder, image_prompt_button | string | Подписи поля промпта |
image_props_title, image_submit_label | string | Заголовок параметров и текст кнопки отправки |
image_show_model, image_show_aspect | boolean | Показывать выбор модели и пропорций |
image_send_reference | boolean | Отправлять reference_image модели. Умолчание — да |
image_layout | string | simple (умолчание) или landing — экран-лендинг |
image_references | array | Галерея адресов для лендинга; интерфейс рассчитан на 8. При image_gallery_kind: before-after берутся первые два |
image_gallery_kind | string | gallery (умолчание) или before-after |
image_landing_action | string | Что делает кнопка лендинга: upload (умолчание) или prompt |
image_landing_cta, image_landing_cta_upload, image_landing_cta_prompt | string | Тексты кнопки лендинга |
image_landing_benefits | array | Карточки преимуществ [{icon, title, text, color}]: icon — имя значка (sparkles, palette, globe, heart, zap…), color — hex |
image_landing_faq | array | Вопросы и ответы [{q, a}]. Зарезервировано |
image_system_reference | string | Зарезервировано, сейчас не используется |
Экран загрузки документа
Для action: document. Все ключи — строки, переводятся, пусто — стандартный текст.
| Ключ | Описание |
|---|---|
document_overlay_title, document_overlay_subtitle | Заголовок и подзаголовок экрана |
document_upload_label, document_upload_hint | Подписи блока загрузки |
document_prompt_label, document_prompt_placeholder | Подписи поля задания |
document_submit_label | Текст кнопки отправки |
Пример: настроить агента плоскими ключами
curl -s -X PUT "$BASE/assistants/$ASSISTANT/agents/3682" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt_target": "system",
"tags": ["customgpt", "docs"],
"profile_author": "Команда docs",
"profile_screens": ["main"],
"prepared_suggestions": [{"text": "Что ты умеешь?", "response": null}],
"capabilities": {"images": false},
"document_template": "none",
"agent_callable": true,
"agent_when": "если просят разобрать резюме",
"sticky_first_suggestions": true,
"agent_post": false,
"page_url": "base/razbor-rezyume",
"profile_author_url": " https://bota.chat/ "
}'
Ответ (сокращён): пробелы в profile_author_url обрезаны, page_url приведён к /путь/.
{
"success": true,
"agent": {
"id": 3682,
"slug": "zz-test-docs-agent",
"label": "ZZ test docs агент",
"action": "send",
"tags": ["customgpt", "docs"],
"page_url": "/base/razbor-rezyume/",
"profile_author_url": "https://bota.chat/",
"prompt_target": "system",
"prepared_suggestions": [
{ "text": "Что ты умеешь?", "response": null, "response_cached": null }
],
"agent_callable": true,
"agent_when": "если просят разобрать резюме",
"capabilities": { "images": false },
"document_template": "none",
"agent_post": false,
"sticky_first_suggestions": true,
"profile_screens": ["main"],
"profile_author": "Команда docs",
"prepared_images": [],
"gallery_layout": "grid",
"source_id": null,
"root_id": 3682
},
"command": { "…": "тот же объект" }
}
Ошибки
| HTTP | Когда |
|---|---|
| 422 | Значение вне списка: gallery_layout, document_template, panel, action, display_type |
| 422 | frame_id или config.frame_id не фрейм этого ассистента: frame_id: фрейм не найден в этом проекте. |
| 422 | tags, categories, profile_screens, prepared_images не массив или длиннее лимита. Для ключа внутри объекта ошибка приходит под config.<ключ>, например config.tags |
| 404 | Агент принадлежит другому ассистенту: {"success": false, "error": "Agent not found", "message": "Agent not found"} |
| 422 | Строка длиннее лимита: agent_when 500, agent_post_system_prompt 20000, profile_author 120, profile_author_url 2048, page_url 1024, page_markdown 50000. Текст вида The profile author field must not be greater than 120 characters. |
| 422 | profile_author_url не http(s)-ссылка: profile_author_url: ожидается ссылка http(s)://… |
| 422 | Пустая строка в profile_screens: The profile_screens.0 field must be a string. |
| 422 | Картинка в config не сохранилась: ключ ошибки — путь поля, например config.prepared_images.0.url. Тексты — на странице Агенты |
Дальше
- Агенты — объект агента и методы.
- Экран-профиль и ссылки — где работают
profile_*иpage_url. - Каталог «Помощники» — как теги и категории формируют каталог.