sig
  type reply_keyboard_markup = {
    keyboard : TelegramApi.KeyboardButton.keyboard_button list list;
    resize_keyboard : bool option;
    one_time_keyboard : bool option;
    selective : bool option;
  }
  type inline_keyboard_markup = {
    inline_keyboard :
      TelegramApi.InlineKeyboardButton.inline_keyboard_button list list;
  }
  type reply_keyboard_hide = { selective : bool option; }
  type force_reply = { selective : bool option; }
  type reply_markup =
      ReplyKeyboardMarkup of TelegramApi.ReplyMarkup.reply_keyboard_markup
    | InlineKeyboardMarkup of TelegramApi.ReplyMarkup.inline_keyboard_markup
    | ReplyKeyboardHide of TelegramApi.ReplyMarkup.reply_keyboard_hide
    | ForceReply of TelegramApi.ReplyMarkup.force_reply
  val prepare : TelegramApi.ReplyMarkup.reply_markup -> Yojson.Safe.json
  val create_reply_keyboard_markup :
    keyboard:TelegramApi.KeyboardButton.keyboard_button list list ->
    ?resize_keyboard:bool option ->
    ?one_time_keyboard:bool option ->
    ?selective:bool option -> unit -> TelegramApi.ReplyMarkup.reply_markup
  val create_inline_keyboard_markup :
    inline_keyboard:TelegramApi.InlineKeyboardButton.inline_keyboard_button
                    list list ->
    unit -> TelegramApi.ReplyMarkup.reply_markup
  val create_reply_keyboard_hide :
    ?selective:bool option -> unit -> TelegramApi.ReplyMarkup.reply_markup
  val create_force_reply :
    ?selective:bool option -> unit -> TelegramApi.ReplyMarkup.reply_markup
end