Перейти к содержимому
Разделы документации
SDKNode.js

Справочник

Конструктор Sidekick

ПараметрТипОписание
apiKeyобязательноstringВаш API-ключ (sk_live_…). Создайте его в настройках. настройки
platformIdобязательноstringПубличный ID площадки (plt_…). кабинета площадок
baseUrlstringБазовый URL API. По умолчанию: "https://sidekick-ads.com".
timeoutnumberТайм-аут запроса в секундах. По умолчанию: 3.0.
platformstringТип площадки. По умолчанию: "telegram".

Обязательные поля.

inject()

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

ПараметрТипОписание
userIdобязательноnumberID пользователя Telegram (ctx.from.id): конечное число. Документация Telegram User
messageобязательноstringНепустой текст ответа LLM, в который нужно добавить рекламу.
languageCodeобязательноstringОбязателен для API. Сигнатура SDK позволяет его пропустить, но пустое значение приводит к HTTP 400: SDK вернёт исходный ответ без рекламы. Если Telegram не передал язык, используйте язык, выбранный в боте. Документация Telegram User
isPremiumbool?Статус Telegram Premium. При null/None SDK отправляет false. Документация Telegram User
keyboardInlineKeyboardMarkup?Ваша текущая inline-клавиатура. Python объединяет объекты aiogram/PTB; обычный dict возвращает без изменений. Node.js принимает объект inline_keyboard.
parseModestring?"HTML", "MarkdownV2" или "Markdown". Сервер экранирует рекламный текст и оформляет ссылку для выбранного режима.
adButtonPosition"bottom" | "top"Где добавить строку рекламной кнопки. По умолчанию: "bottom".
firstNamestring?Необязательное имя пользователя Telegram для профилирования аудитории. До 128 символов.
userMessagestring?Сообщение пользователя для контекстного подбора, проверки чувствительных тем и профилирования аудитории. До 4096 символов.
acceptFormatsstring[]?Форматы, которые принимает бот: "text", "response", "card", "consent", "quiz". По умолчанию ["text"]. См. раздел «Rich-форматы».
capabilitiesobject?Возможности отображения. Python: rich_messages, callbacks, custom_emoji; Node.js: richMessages, callbacks, customEmoji. Неуказанные флаги считаются false.
botIsAdminbool?Является ли бот администратором группы. SDK 0.8.0 не отправляет group_id, поэтому для показа с учётом группы нужен HTTP.

Обязательные поля.

Возвращаемое значение

ПолеТипОписание
messagestringТекст для отправки: исходный ответ или ответ с добавленной рекламой.
hasAdboolДобавлена ли реклама.
impressionIdstring?ID показа для учёта.
adobject?Объявление с text, formatted_text, button_text и button_url. Python возвращает dict (ad["text"]); Node.js — объект (ad.text) с ключами в camelCase.
ad.formattedTextstringРекламный текст с авторским форматированием, преобразованным в ваш parse_mode. В кампаниях с учётом кликов ссылки заменяются адресом отслеживания. Без авторского форматирования совпадает с ad.text.
formatstring?Название rich-формата в result.format. Для текстовой рекламы может отсутствовать (Node.js) или быть None (Python). Для отправки rich-сцены проверяйте result.send.
sendobject?Только rich-форматы: result.send содержит { method, params, ephemeral? }. В HTTP-ответе это ad.send. При отправке rich-сцены отправляйте исходный ответ бота отдельно.
interactTokenstring?Поле совместимости. Текущий API не возвращает его отдельно: токены интерактивных действий находятся в callback_data с префиксом sk:.
keyboardInlineKeyboardMarkup?Объединённая клавиатура (ваши кнопки + рекламная) или исходная, если рекламы нет.

fetch()

Получает объявление без отправки текста вашего сообщения. Возвращает отдельные поля, из которых вы сами собираете ответ бота. Асинхронный, не выбрасывает исключений: при любой ошибке возвращает { hasAd: false } (или { has_ad: False } в Python).

fetch.ts
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обязательноnumberID пользователя Telegram (ctx.from.id): конечное число. Документация Telegram User
languageCodeобязательноstringНепустой языковой тег IETF. Если Telegram не передал language_code, используйте язык, выбранный в боте. Документация Telegram User
isPremiumbool?Статус Telegram Premium. По умолчанию: false.
parseModestring?"HTML", "MarkdownV2" или "Markdown". Если указан, ответ содержит поле ad_text_formatted с готовой разметкой.
acceptFormatsstring[]?Форматы, которые умеет отображать бот. По умолчанию ["text"], только текст. Передайте ["text", "image"], чтобы получать и изображения: SDK заранее скачает файл в ad.image_data / ad.imageData для передачи в InputFile.

Обязательные поля.

Возвращаемое значение (FetchAnyResult)

ПолеТипОписание
hasAdboolПолучено ли объявление.
impressionIdstring?ID показа. Null, если has_ad равен false.
adobject?Null, если has_ad равен false. Иначе — объект с полями ниже.
ad.format"text" | "image"Полученный формат. Дополнительные поля изображений перечислены в разделе fetch_image() / fetchImage().
ad.adTextstringИсходный текст кампании.
ad.adUrlstringURL перехода.
ad.buttonTextstringТекст inline-кнопки.
ad.buttonUrlstringURL inline-кнопки. В зависимости от кампании — адрес отслеживания или прямая ссылка. Используйте без изменений.
ad.adTextFormattedstring?Присутствует, если в запросе задан parse_mode. Экранированный текст со ссылкой в выбранном режиме разметки.

fetch() или inject() — используйте inject() для добавления рекламы в сообщение и объединения клавиатуры средствами SDK. Выберите fetch() если ответы LLM могут содержать пользовательские данные (имена, фрагменты запросов), которые вы не хотите передавать на серверы Sidekick.

fetchImage()

Получает рекламу с изображением (фото или анимацией) для отправки отдельно от ответа LLM. Вызывает метод /api/v1/ad/fetch-image . Асинхронный, не выбрасывает исключений: при любой ошибке возвращает { hasAd: false }.

fetchImage.ts
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обязательноnumberID пользователя Telegram (ctx.from.id): конечное число. Документация Telegram User
languageCodeобязательноstringНепустой языковой тег IETF. Если Telegram не передал language_code, используйте язык, выбранный в боте. Документация Telegram User
isPremiumbool?Статус Telegram Premium. По умолчанию: false.
parseModestring?"HTML", "MarkdownV2" или "Markdown". Если указан, ответ содержит ad_text_formatted: подпись со ссылкой на переход в выбранном режиме разметки.

Обязательные поля.

Возвращаемое значение (FetchImageResult)

ПолеТипОписание
hasAdboolПолучена ли реклама с изображением.
impressionIdstring?ID показа. Null, если has_ad равен false.
adobject?Null, если has_ad равен false. Иначе — объект с полями ниже.
ad.format"image"Для этого метода всегда "image".
ad.adTextstringОбычный текст подписи к сообщению Telegram.
ad.adTextFormattedstring?Присутствует, если в запросе задан parse_mode. Подпись со ссылкой на переход в выбранном режиме разметки. Передайте её как подпись Telegram, чтобы текст был кликабельным.
ad.adUrlstringURL объявления, совпадает с button_url. Может быть адресом отслеживания или прямой ссылкой.
ad.buttonTextstringТекст inline-кнопки.
ad.buttonUrlstringURL inline-кнопки. В зависимости от кампании — адрес отслеживания или прямая ссылка. Используйте без изменений.
ad.mediaType"photo" | "animation"Метод отправки медиа в Telegram: sendPhoto или sendAnimation.
ad.imageUrlstringПрямая ссылка на изображение или GIF. Обычно скачивать вручную не нужно — см. image_data ниже.
ad.imageMimestringMIME-тип, например "image/jpeg", "image/gif", "video/mp4".
ad.imageDataUint8ArrayЗаранее скачанные байты файла — передайте в BufferedInputFile для aiogram или InputFile для grammY. SDK скачивает файл сам; это позволяет отправить его, даже если загрузчик URL Telegram не может обратиться к хранилищу.
ad.imageFileNamestringПредлагаемое имя файла по 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 символов, рекламный текст убирается, но кнопка добавляется.