sig
  type message = {
    message_id : int;
    from : TelegramApi.User.user option;
    date : int;
    chat : TelegramApi.Chat.chat;
    forward_from : TelegramApi.User.user option;
    forward_from_chat : TelegramApi.Chat.chat option;
    forward_date : int option;
    reply_to_message : TelegramApi.Message.message option;
    edit_date : int option;
    text : string option;
    entities : TelegramApi.MessageEntity.message_entity list option;
    audio : TelegramApi.Audio.audio option;
    document : TelegramApi.Document.document option;
    photo : TelegramApi.PhotoSize.photo_size list option;
    sticker : TelegramApi.Sticker.sticker option;
    video : TelegramApi.Video.video option;
    voice : TelegramApi.Voice.voice option;
    caption : string option;
    contact : TelegramApi.Contact.contact option;
    location : TelegramApi.Location.location option;
    venue : TelegramApi.Venue.venue option;
    new_chat_member : TelegramApi.User.user option;
    left_chat_member : TelegramApi.User.user option;
    new_chat_title : string option;
    new_chat_photo : TelegramApi.PhotoSize.photo_size list option;
    delete_chat_photo : bool option;
    group_chat_created : bool option;
    supergroup_chat_created : bool option;
    channel_chat_created : bool option;
    migrate_to_chat_id : int option;
    migrate_from_chat_id : int option;
    pinned_message : TelegramApi.Message.message option;
  }
  val create :
    message_id:int ->
    ?from:TelegramApi.User.user option ->
    date:int ->
    chat:TelegramApi.Chat.chat ->
    ?forward_from:TelegramApi.User.user option ->
    ?forward_from_chat:TelegramApi.Chat.chat option ->
    ?forward_date:int option ->
    ?reply_to:TelegramApi.Message.message option ->
    ?edit_date:int option ->
    ?text:string option ->
    ?entities:TelegramApi.MessageEntity.message_entity list option ->
    ?audio:TelegramApi.Audio.audio option ->
    ?document:TelegramApi.Document.document option ->
    ?photo:TelegramApi.PhotoSize.photo_size list option ->
    ?sticker:TelegramApi.Sticker.sticker option ->
    ?video:TelegramApi.Video.video option ->
    ?voice:TelegramApi.Voice.voice option ->
    ?caption:string option ->
    ?contact:TelegramApi.Contact.contact option ->
    ?location:TelegramApi.Location.location option ->
    ?venue:TelegramApi.Venue.venue option ->
    ?new_chat_member:TelegramApi.User.user option ->
    ?left_chat_member:TelegramApi.User.user option ->
    ?new_chat_title:string option ->
    ?new_chat_photo:TelegramApi.PhotoSize.photo_size list option ->
    ?delete_chat_photo:bool option ->
    ?group_chat_created:bool option ->
    ?supergroup_chat_created:bool option ->
    ?channel_chat_created:bool option ->
    ?migrate_to_chat_id:int option ->
    ?migrate_from_chat_id:int option ->
    ?pinned_message:TelegramApi.Message.message option ->
    unit -> TelegramApi.Message.message
  val read : Yojson.Safe.json -> TelegramApi.Message.message
  val get_sender_first_name : TelegramApi.Message.message -> string
  val get_sender_username : TelegramApi.Message.message -> string
  val get_sender : TelegramApi.Message.message -> string
end