Переменные промпта
Все переменные, которые может использовать промпт Read Frog, и реальное значение, которым каждая заменяется.
Переменная записывается как {{name}}. Прямо перед отправкой запроса Read Frog заменяет каждую известную переменную строкой. Больше ничего не трогается: неизвестное имя вроде {{url}} остаётся в промпте буквальными символами {{url}}.
Все примеры ниже взяты с одной страницы — англоязычной статьи по адресу https://devblog.example.com/posts/timestamps, переводимой на упрощённый китайский.
Какие переменные где существуют
| Переменная | Промпты страниц | Промпты субтитров |
|---|---|---|
{{targetLanguage}} | Да | Да |
{{input}} | Да | Да |
{{webTitle}} | Да | Да |
{{webDescription}} | Да | Да |
{{webContent}} | Да | — |
{{webSummary}} | Да | — |
{{videoSummary}} | — | Да |
Промпт страниц, использующий {{videoSummary}}, или промпт субтитров, использующий {{webContent}}, сохраняет буквальный текст. Кнопки переменных под каждым полем редактора предлагают только те, которые этот список умеет заполнить.
{{targetLanguage}}
Английское название языка, на который вы переводите — не код и не перевод на язык вашего интерфейса.
Simplified Mandarin ChineseДругие примеры: English, Traditional Mandarin Chinese, Japanese, Spanish. Поэтому промпт, написанный как Translate to {{targetLanguage}}:, приходит как Translate to Simplified Mandarin Chinese:.
{{input}}
Текст для перевода. Это единственная переменная, без которой промпт обойтись не может.
По одному абзацу за раз — пробелы в начале и конце убраны, невидимые символы вычищены:
Every timestamp you store without a zone is a bug waiting for a plane ticket.Несколько абзацев сразу — так это происходит на LLM-провайдере с включённым пакетным переводом. Абзацы соединяются строкой, в которой нет ничего, кроме %%, с пустой строкой с каждой стороны:
Every timestamp you store without a zone is a bug waiting for a plane ticket.
%%
The fix is boring: store UTC, render local, and never let the two meet in a database column.
%%
Ordering by a naive timestamp works until the clocks change, and then it works wrongly.От модели ожидается то же количество абзацев, в том же порядке, разделённых тем же способом. Read Frog разбирает ответ обратно по этим строкам %%. Если вы перепишете промпт так, что изменится разделитель, или попросите нумеровать либо объединять абзацы, разбор не удастся, весь пакет будет повторён, а затем отправлен заново по одному абзацу.
С HTML — когда абзац содержит inline-разметку. Атрибуты, которые обязаны уцелеть, вырезаются, а элемент помечается data-rf-attr, поэтому модель видит метку вместо адреса:
The fix is <a data-rf-attr="0">boring</a>: store <code data-rf-attr="1">UTC</code>, render local.С формулой или встроенным символом — он заменяется нумерованной подстановкой, а затем клонируется обратно в перевод:
Converting is just {{0}}, which is why nobody gets it wrong twice.При написании промпта эти две формы обычно не встречаются, но именно они объясняют дополнительные
блоки правил, появляющиеся в запросе: инструкции про data-rf-attr и про нумерованные подстановки
Read Frog дописывает только тогда, когда отправляемый текст действительно их содержит.
{{webTitle}}
Тег <title> страницы — в точности как его показывает вкладка браузера.
Why your timestamps are eight hours off — devblogВ промпте субтитров это вместо него название видео.
{{webDescription}}
Собственное описание страницы, взятое из первого непустого среди <meta name="description">, <meta property="og:description"> и <meta name="twitter:description">.
A short tour of the three places a naive timestamp can go wrong, and the one rule that prevents all three.В промпте субтитров это описание видео.
{{webContent}}
Основное тело страницы, извлечённое как Markdown и обрезанное до первых 2000 символов. Навигация, боковые панели и подвалы отбрасываются. Ни один встроенный промпт её не использует — она здесь для промптов, которым нужно больше, чем заголовок.
# Why your timestamps are eight hours off
Every timestamp you store without a zone is a bug waiting for a plane ticket.
It works on your laptop, it works in CI, and it fails the first time somebody
in another country opens the report.
## Three places it goes wrong
1. **At the boundary.** A form posts `2026-03-14 09:00` and the server decides
what that means.
2. **In the column.** `timestamp without time zone` is not a moment in time; it
is a picture of a wall clock.
3. **On the way out.** Formatting in UTC and labelling it local is the same bug
wearing a hat.
The fix is boring: store UTC, render local, and never let the twОбрезка идёт по простому счёту символов, а не по границе предложения или абзаца, поэтому значение обычно заканчивается посреди слова — как и выше. Промпт, который сообщает модели, что содержимое полное, будет неверен на любой странице длиннее пары экранов.
{{webSummary}}
Краткое содержание страницы, написанное вашим LLM-провайдером, — отдельное обращение к модели, кэшируемое по странице, сделанное один раз и переиспользуемое для каждого абзаца.
A technical blog post arguing that timestamps should be stored in UTC and rendered in the reader's local zone. It identifies three failure points — form input, database column type, and output formatting — and recommends a single rule for all three. Written for backend developers; uses PostgreSQL column types as examples.Для этого требуется умный контекст ИИ (Настройки → Перевод). Когда он выключен, вставлять нечего, и переменная превращается в резервную строку, описанную ниже. Промпт по умолчанию использует {{webSummary}}, поэтому с выключенным умным контекстом системный промпт по умолчанию всегда читается как Webpage summary: No summary available.
{{videoSummary}}
Эквивалент для субтитров: краткое содержание видео, тоже за умным контекстом ИИ, и тоже с резервной строкой, когда он выключен.
A conference talk on time zone handling in web applications. The speaker walks through a production incident caused by naive timestamps, then demonstrates a UTC-in, local-out pattern. Names mentioned: PostgreSQL, Temporal, Luxon.Когда значения нет
Переменная никогда не остаётся пустой и никогда не исчезает. Если значения нет, оно пустое или состоит только из пробелов, Read Frog подставляет фиксированную английскую фразу:
| Переменная | Что подставляется вместо |
|---|---|
{{webTitle}} | No title available |
{{webDescription}} | No description available |
{{webContent}} | No content available |
{{webSummary}}, {{videoSummary}} | No summary available |
Поэтому системный промпт по умолчанию на странице без метаданных и с выключенным умным контекстом приходит вот так:
## Document Metadata for Context Awareness
Webpage title: No title available
Webpage summary: No summary availableВажнее всего это, если вы пишете few-shot-примеры. Промпт, показывающий модели разобранный пример, построенный из заголовка страницы, на странице без заголовка покажет ей пример про страницу под названием «No title available» — и модели будут переводить эту фразу или комментировать её. Если ваш промпт опирается на переменную с метаданными, скажите в самом промпте, что делать, когда значение читается как «No ... available».
Для {{input}} и {{targetLanguage}} резервного значения нет. У {{targetLanguage}} значение есть всегда, а {{input}} — это абзац: запрос для пустого текста не отправляется никогда.
Что происходит дальше
Подставленный текст — ещё не весь запрос: после него дописываются дополнительные блоки правил и термины вашего глоссария, а готовый результат становится ключом кэша переводов. См. Как собирается запрос.
