Справочник
Конструктор Sidekick
| Параметр | Тип | Описание |
|---|---|---|
apiKeyобязательно | string | Ваш API-ключ (sk_live_…). Создайте его в настройках. настройки → |
platformIdобязательно | string | Публичный ID площадки (plt_…). кабинета площадок → |
baseUrl | string | Базовый URL API. По умолчанию: "https://sidekick-ads.com". |
timeout | number | Тайм-аут запроса в секундах. По умолчанию: 3.0. |
platform | string | Тип площадки. По умолчанию: "telegram". |
Обязательные поля.
inject()
Единственный метод, который нужно вызывать. Асинхронный, не выбрасывает исключений: при любой ошибке возвращает исходное сообщение и клавиатуру без изменений.
| Параметр | Тип | Описание |
|---|---|---|
userIdобязательно | number | ID пользователя Telegram (ctx.from.id): конечное число. Документация Telegram User → |
messageобязательно | string | Непустой текст ответа LLM, в который нужно добавить рекламу. |
languageCodeобязательно | string | Обязателен для API. Сигнатура SDK позволяет его пропустить, но пустое значение приводит к HTTP 400: SDK вернёт исходный ответ без рекламы. Если Telegram не передал язык, используйте язык, выбранный в боте. Документация Telegram User → |
isPremium | bool? | Статус Telegram Premium. При null/None SDK отправляет false. Документация Telegram User → |
keyboard | InlineKeyboardMarkup? | Ваша текущая inline-клавиатура. Python объединяет объекты aiogram/PTB; обычный dict возвращает без изменений. Node.js принимает объект inline_keyboard. |
parseMode | string? | "HTML", "MarkdownV2" или "Markdown". Сервер экранирует рекламный текст и оформляет ссылку для выбранного режима. |
adButtonPosition | "bottom" | "top" | Где добавить строку рекламной кнопки. По умолчанию: "bottom". |
firstName | string? | Необязательное имя пользователя Telegram для профилирования аудитории. До 128 символов. |
userMessage | string? | Сообщение пользователя для контекстного подбора, проверки чувствительных тем и профилирования аудитории. До 4096 символов. |
acceptFormats | string[]? | Форматы, которые принимает бот: "text", "response", "card", "consent", "quiz". По умолчанию ["text"]. См. раздел «Rich-форматы». |
capabilities | object? | Возможности отображения. Python: rich_messages, callbacks, custom_emoji; Node.js: richMessages, callbacks, customEmoji. Неуказанные флаги считаются false. |
botIsAdmin | bool? | Является ли бот администратором группы. SDK 0.8.0 не отправляет group_id, поэтому для показа с учётом группы нужен HTTP. |
Обязательные поля.
Возвращаемое значение
| Поле | Тип | Описание |
|---|---|---|
message | string | Текст для отправки: исходный ответ или ответ с добавленной рекламой. |
hasAd | bool | Добавлена ли реклама. |
impressionId | string? | ID показа для учёта. |
ad | object? | Объявление с text, formatted_text, button_text и button_url. Python возвращает dict (ad["text"]); Node.js — объект (ad.text) с ключами в camelCase. |
ad.formattedText | string | Рекламный текст с авторским форматированием, преобразованным в ваш parse_mode. В кампаниях с учётом кликов ссылки заменяются адресом отслеживания. Без авторского форматирования совпадает с ad.text. |
format | string? | Название rich-формата в result.format. Для текстовой рекламы может отсутствовать (Node.js) или быть None (Python). Для отправки rich-сцены проверяйте result.send. |
send | object? | Только rich-форматы: result.send содержит { method, params, ephemeral? }. В HTTP-ответе это ad.send. При отправке rich-сцены отправляйте исходный ответ бота отдельно. |
interactToken | string? | Поле совместимости. Текущий API не возвращает его отдельно: токены интерактивных действий находятся в callback_data с префиксом sk:. |
keyboard | InlineKeyboardMarkup? | Объединённая клавиатура (ваши кнопки + рекламная) или исходная, если рекламы нет. |
fetch()
Получает объявление без отправки текста вашего сообщения. Возвращает отдельные поля, из которых вы сами собираете ответ бота. Асинхронный, не выбрасывает исключений: при любой ошибке возвращает { hasAd: false } (или { has_ad: False } в Python).
import { Sidekick } from "sidekick-sdk";const sk = new Sidekick({ apiKey: "sk_live_xxx", platformId: "plt_xxx" });const result = await sk.fetch({userId: ctx.from.id,languageCode: ctx.from.language_code || "en",parseMode: "HTML", // Match the parse mode used when sending.});if (result.hasAd && result.ad) {await ctx.reply(`${llmReply}\n\n${result.ad.adTextFormatted}`, {parse_mode: "HTML",reply_markup: {inline_keyboard: [[{ text: result.ad.buttonText, url: result.ad.buttonUrl },]],},});} else {await ctx.reply(llmReply);}
Параметры
| Параметр | Тип | Описание |
|---|---|---|
userIdобязательно | number | ID пользователя Telegram (ctx.from.id): конечное число. Документация Telegram User → |
languageCodeобязательно | string | Непустой языковой тег IETF. Если Telegram не передал language_code, используйте язык, выбранный в боте. Документация Telegram User → |
isPremium | bool? | Статус Telegram Premium. По умолчанию: false. |
parseMode | string? | "HTML", "MarkdownV2" или "Markdown". Если указан, ответ содержит поле ad_text_formatted с готовой разметкой. |
acceptFormats | string[]? | Форматы, которые умеет отображать бот. По умолчанию ["text"], только текст. Передайте ["text", "image"], чтобы получать и изображения: SDK заранее скачает файл в ad.image_data / ad.imageData для передачи в InputFile. |
Обязательные поля.
Возвращаемое значение (FetchAnyResult)
| Поле | Тип | Описание |
|---|---|---|
hasAd | bool | Получено ли объявление. |
impressionId | string? | ID показа. Null, если has_ad равен false. |
ad | object? | Null, если has_ad равен false. Иначе — объект с полями ниже. |
ad.format | "text" | "image" | Полученный формат. Дополнительные поля изображений перечислены в разделе fetch_image() / fetchImage(). |
ad.adText | string | Исходный текст кампании. |
ad.adUrl | string | URL перехода. |
ad.buttonText | string | Текст inline-кнопки. |
ad.buttonUrl | string | URL inline-кнопки. В зависимости от кампании — адрес отслеживания или прямая ссылка. Используйте без изменений. |
ad.adTextFormatted | string? | Присутствует, если в запросе задан parse_mode. Экранированный текст со ссылкой в выбранном режиме разметки. |
fetch() или inject() — используйте inject() для добавления рекламы в сообщение и объединения клавиатуры средствами SDK. Выберите fetch() если ответы LLM могут содержать пользовательские данные (имена, фрагменты запросов), которые вы не хотите передавать на серверы Sidekick.
fetchImage()
Получает рекламу с изображением (фото или анимацией) для отправки отдельно от ответа LLM. Вызывает метод /api/v1/ad/fetch-image . Асинхронный, не выбрасывает исключений: при любой ошибке возвращает { hasAd: false }.
import { Sidekick } from "sidekick-sdk";import { InputFile } from "grammy";const sk = new Sidekick({ apiKey: "sk_live_xxxxx", platformId: "plt_xxxxx" });const r = await sk.fetchImage({userId: ctx.from.id,languageCode: "en",parseMode: "HTML",});if (r.hasAd && r.ad) {// SDK already downloaded the bytes — hand straight to InputFile.const media = new InputFile(r.ad.imageData, r.ad.imageFileName);const options = {caption: r.ad.adTextFormatted ?? r.ad.adText,parse_mode: "HTML" as const,reply_markup: {inline_keyboard: [[{ text: r.ad.buttonText, url: r.ad.buttonUrl }]],},};if (r.ad.mediaType === "animation") {await ctx.replyWithAnimation(media, options);} else {await ctx.replyWithPhoto(media, options);}}
Параметры
| Параметр | Тип | Описание |
|---|---|---|
userIdобязательно | number | ID пользователя Telegram (ctx.from.id): конечное число. Документация Telegram User → |
languageCodeобязательно | string | Непустой языковой тег IETF. Если Telegram не передал language_code, используйте язык, выбранный в боте. Документация Telegram User → |
isPremium | bool? | Статус Telegram Premium. По умолчанию: false. |
parseMode | string? | "HTML", "MarkdownV2" или "Markdown". Если указан, ответ содержит ad_text_formatted: подпись со ссылкой на переход в выбранном режиме разметки. |
Обязательные поля.
Возвращаемое значение (FetchImageResult)
| Поле | Тип | Описание |
|---|---|---|
hasAd | bool | Получена ли реклама с изображением. |
impressionId | string? | ID показа. Null, если has_ad равен false. |
ad | object? | Null, если has_ad равен false. Иначе — объект с полями ниже. |
ad.format | "image" | Для этого метода всегда "image". |
ad.adText | string | Обычный текст подписи к сообщению Telegram. |
ad.adTextFormatted | string? | Присутствует, если в запросе задан parse_mode. Подпись со ссылкой на переход в выбранном режиме разметки. Передайте её как подпись Telegram, чтобы текст был кликабельным. |
ad.adUrl | string | URL объявления, совпадает с button_url. Может быть адресом отслеживания или прямой ссылкой. |
ad.buttonText | string | Текст inline-кнопки. |
ad.buttonUrl | string | URL inline-кнопки. В зависимости от кампании — адрес отслеживания или прямая ссылка. Используйте без изменений. |
ad.mediaType | "photo" | "animation" | Метод отправки медиа в Telegram: sendPhoto или sendAnimation. |
ad.imageUrl | string | Прямая ссылка на изображение или GIF. Обычно скачивать вручную не нужно — см. image_data ниже. |
ad.imageMime | string | MIME-тип, например "image/jpeg", "image/gif", "video/mp4". |
ad.imageData | Uint8Array | Заранее скачанные байты файла — передайте в BufferedInputFile для aiogram или InputFile для grammY. SDK скачивает файл сам; это позволяет отправить его, даже если загрузчик URL Telegram не может обратиться к хранилищу. |
ad.imageFileName | string | Предлагаемое имя файла по MIME-типу, например "ad.jpg". |
Обработка ошибок
inject() не выбрасывает исключений. При любой ошибке — тайм-ауте, сбое сети, 5xx или некорректном JSON — возвращает исходное сообщение и клавиатуру без изменений. Ваш бот продолжает работать.
// On a handled Sidekick request error:const result = await sk.inject({ userId: 123, message: "Hello world", languageCode: "en" });// result.message === "Hello world" (unchanged)// result.hasAd === false// result.keyboard === null (or your original keyboard)
Клавиатуры бота
- •Рекламная кнопка добавляется отдельной строкой и не смешивается с вашими кнопками.
- •Положение задаётся параметром
adButtonPosition:"bottom"(по умолчанию) или"top". - •Telegram допускает не более 13 строк клавиатуры. Если их уже 13, рекламная кнопка не добавляется — остаётся только рекламный текст.
- •Ваши существующие кнопки не изменяются и не удаляются.
- •Если сообщение с рекламой превышает 4096 символов, рекламный текст убирается, но кнопка добавляется.