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

Справочник

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

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

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

inject()

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

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

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

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

ПолеТипОписание
messagestringТекст для отправки: исходный ответ или ответ с добавленной рекламой.
has_adboolДобавлена ли реклама.
impression_idstring?ID показа для учёта.
adobject?Объявление с text, formatted_text, button_text и button_url. Python возвращает dict (ad["text"]); Node.js — объект (ad.text) с ключами в camelCase.
ad.formatted_textstringРекламный текст с авторским форматированием, преобразованным в ваш 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-сцены отправляйте исходный ответ бота отдельно.
interact_tokenstring?Поле совместимости. Текущий API не возвращает его отдельно: токены интерактивных действий находятся в callback_data с префиксом sk:.
keyboardInlineKeyboardMarkup?Объединённая клавиатура (ваши кнопки + рекламная) или исходная, если рекламы нет.

fetch()

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

fetch.py
from sidekick_ads import Sidekick
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
sk = Sidekick(api_key="sk_live_xxx", platform_id="plt_xxx")
result = await sk.fetch(
user_id=message.from_user.id,
language_code=message.from_user.language_code or "en",
parse_mode="HTML", # Match the parse mode used when sending.
)
if result.has_ad and result.ad is not None:
await message.answer(
f"{llm_reply}\n\n{result.ad.ad_text_formatted}",
parse_mode="HTML",
reply_markup=InlineKeyboardMarkup(inline_keyboard=[[
InlineKeyboardButton(
text=result.ad.button_text, url=result.ad.button_url,
),
]]),
)
else:
await message.answer(llm_reply)

Параметры

ПараметрТипОписание
user_idобязательноnumberID пользователя Telegram (ctx.from.id): конечное число. Документация Telegram User
language_codeобязательноstringНепустой языковой тег IETF. Если Telegram не передал language_code, используйте язык, выбранный в боте. Документация Telegram User
is_premiumbool?Статус Telegram Premium. По умолчанию: false.
parse_modestring?"HTML", "MarkdownV2" или "Markdown". Если указан, ответ содержит поле ad_text_formatted с готовой разметкой.
accept_formatsstring[]?Форматы, которые умеет отображать бот. По умолчанию ["text"], только текст. Передайте ["text", "image"], чтобы получать и изображения: SDK заранее скачает файл в ad.image_data / ad.imageData для передачи в InputFile.

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

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

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

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

fetch_image()

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

fetch_image.py
from sidekick_ads import Sidekick
from aiogram.types import (
InlineKeyboardMarkup, InlineKeyboardButton, BufferedInputFile,
)
sk = Sidekick(api_key="sk_live_xxxxx", platform_id="plt_xxxxx")
result = await sk.fetch_image(
user_id=message.from_user.id,
language_code="en",
parse_mode="HTML",
)
if result.has_ad and result.ad:
ad = result.ad
# SDK already downloaded the bytes — hand straight to InputFile.
media = BufferedInputFile(ad.image_data, filename=ad.image_filename)
kb = InlineKeyboardMarkup(inline_keyboard=[[
InlineKeyboardButton(text=ad.button_text, url=ad.button_url)
]])
caption = ad.ad_text_formatted or ad.ad_text
if ad.media_type == "animation":
await message.answer_animation(media, caption=caption,
parse_mode="HTML", reply_markup=kb)
else:
await message.answer_photo(media, caption=caption,
parse_mode="HTML", reply_markup=kb)

Параметры

ПараметрТипОписание
user_idобязательноnumberID пользователя Telegram (ctx.from.id): конечное число. Документация Telegram User
language_codeобязательноstringНепустой языковой тег IETF. Если Telegram не передал language_code, используйте язык, выбранный в боте. Документация Telegram User
is_premiumbool?Статус Telegram Premium. По умолчанию: false.
parse_modestring?"HTML", "MarkdownV2" или "Markdown". Если указан, ответ содержит ad_text_formatted: подпись со ссылкой на переход в выбранном режиме разметки.

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

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

ПолеТипОписание
has_adboolПолучена ли реклама с изображением.
impression_idstring?ID показа. Null, если has_ad равен false.
adobject?Null, если has_ad равен false. Иначе — объект с полями ниже.
ad.format"image"Для этого метода всегда "image".
ad.ad_textstringОбычный текст подписи к сообщению Telegram.
ad.ad_text_formattedstring?Присутствует, если в запросе задан parse_mode. Подпись со ссылкой на переход в выбранном режиме разметки. Передайте её как подпись Telegram, чтобы текст был кликабельным.
ad.ad_urlstringURL объявления, совпадает с button_url. Может быть адресом отслеживания или прямой ссылкой.
ad.button_textstringТекст inline-кнопки.
ad.button_urlstringURL inline-кнопки. В зависимости от кампании — адрес отслеживания или прямая ссылка. Используйте без изменений.
ad.media_type"photo" | "animation"Метод отправки медиа в Telegram: sendPhoto или sendAnimation.
ad.image_urlstringПрямая ссылка на изображение или GIF. Обычно скачивать вручную не нужно — см. image_data ниже.
ad.image_mimestringMIME-тип, например "image/jpeg", "image/gif", "video/mp4".
ad.image_databytesЗаранее скачанные байты файла — передайте в BufferedInputFile для aiogram или InputFile для grammY. SDK скачивает файл сам; это позволяет отправить его, даже если загрузчик URL Telegram не может обратиться к хранилищу.
ad.image_filenamestringПредлагаемое имя файла по MIME-типу, например "ad.jpg".

Обработка ошибок

inject() не выбрасывает исключений. При любой ошибке — тайм-ауте, сбое сети, 5xx или некорректном JSON — возвращает исходное сообщение и клавиатуру без изменений. Ваш бот продолжает работать.

Поведение при ошибке
# On a handled Sidekick request error:
result = await sk.inject(user_id=123, message="Hello world", language_code="en")
# result.message == "Hello world" (unchanged)
# result.has_ad == False
# result.keyboard == None (or your original keyboard)

Клавиатуры бота

  • Рекламная кнопка добавляется отдельной строкой и не смешивается с вашими кнопками.
  • Положение задаётся параметром ad_button_position: "bottom" (по умолчанию) или "top".
  • Telegram допускает не более 13 строк клавиатуры. Если их уже 13, рекламная кнопка не добавляется — остаётся только рекламный текст.
  • Ваши существующие кнопки не изменяются и не удаляются.
  • Если сообщение с рекламой превышает 4096 символов, рекламный текст убирается, но кнопка добавляется.