Build an AI-powered system for WhatsApp that decides which messages deserve immediate attention, which should wait, and which should be muted.
The system must reason over multimodal messages, including text messages, image posters/screenshots, and voice notes.
WhatsApp is noisy. A user can receive family chats, society notices, school updates, co-worker messages, business account promotions, image posters, voice notes, and scams in the same message stream. Treating every message the same creates two bad outcomes: important messages get missed, and unwanted or risky messages interrupt the user.
Your task is to build a message notification router for this platform. For every incoming WhatsApp message, the system must decide whether the user should be interrupted now, whether the message can be batched into a digest, or whether it should be muted.
The routing decision must be personalized to the receiving user. A sale poster may be useful for one user and unwanted noise for another. A payment reminder may be legitimate from a trusted admin but risky from a new sender. A muted family group can still contain an urgent direct mention. At the same time, clear scam or safety risk should be muted regardless of the user's usual engagement.
Build a system that reviews each incoming message and decides how it should be handled for that user:
notify: important enough to interrupt nowdigest: useful, but can be shown latermute: low-value, repetitive, unwanted, suspicious, or unsafe
Your system should use the provided message, user, group, business, media, and historical interaction data to make personalized routing decisions.
All participant-facing files are inside dataset/.
Only dataset/messages.csv needs predictions. The other files provide context:
dataset/messages.csv- Incoming messages that your system must route.dataset/sample_messages.csv- Example messages with the expectedaction,message_type,reason,confidence, andevidence_message_idscolumns filled in. Use this only to understand the expected output format and style.dataset/users.csv- Basic user notification behavior, such as quiet hours and recent opens, replies, dismissals, and reports.dataset/groups.csv- Basic information about each group chat, such as group type, size, admins, and recent activity.dataset/group_members.csv- How each user relates to each group: role, activity, read/reply behavior, dismissals, and mute state.dataset/business_accounts.csv- Information about business senders, including brand identity, verification, domain used by the sender, account age, and reports.dataset/user_business_history.csv- Whether a user has a recent relationship with a business, such as orders, bookings, payments, opt-ins, or opt-outs.dataset/message_history.csv- Past messages received by users. These help identify repeated patterns, ignored messages, useful updates, and risky content.dataset/message_events.csv- How users reacted to those past messages: opened, replied, dismissed, muted, or reported.dataset/images.csv- Image IDs and file paths for image messages.dataset/voice_notes.csv- Voice note IDs and file paths for audio messages.dataset/daily_notification_summary.csv- Daily notification load for each user.dataset/output.csv- Blank submission template. Fill this file with your predictions.
Media files referenced by images.csv and voice_notes.csv are available under dataset/media/.
Each row in dataset/messages.csv represents one incoming message.
Input fields:
message_id: unique incoming message IDuser_id: user receiving the messageconversation_type:personal,group, orbusinessgroup_id: group ID if the message is from a groupbusiness_id: business ID if the message is from a business accountsender_user_id: sender user ID if the message is from a usercreated_at: message timestampmessage_text: text content for text messages; empty for voice-note messagesmedia_type: empty,image, orvoicemedia_id: linked image or voice-note ID, if presentforwarded_count: forwarding signal
For every row in dataset/messages.csv, generate one row in output.csv.
Required columns, in order:
message_idactionmessage_typereasonconfidenceevidence_message_ids
action: final routing decisionmessage_type: best-fit message categoryreason: short human-readable explanation for the decisionconfidence: number from0to1evidence_message_ids: semicolon-separated historical message IDs used as evidence; writenoneif no useful historical message exists
action:
notify: interrupt the user nowdigest: safe but low priority; show latermute: repetitive, unwanted, low-value, suspicious, scam-like, or unsafe for this user
message_type:
personalurgenteventpaymentbusiness_updatepromotiongreetingforwardspamscamunknown
Your system should make personalized decisions using the full context provided. Similar-looking messages may need different actions depending on the user, sender, conversation, business relationship, and media content.
The final decision should balance usefulness, urgency, repetition, and risk. Risky messages should use mute with an appropriate message_type such as scam or spam.
Your output.csv will be compared against hidden ground-truth labels.
The scoring will consider:
- correctness of
action - correctness of
message_type - usefulness and consistency of
reason - whether
evidence_message_idspoint to relevant historical messages - reasonable confidence calibration
Submit:
| File | Description |
|---|---|
code.zip |
Full runnable solution, prompts/configs, and README |
output.csv |
Predictions for all rows in dataset/messages.csv |
chat_transcript |
Conversation transcript showing how you developed or used the system |
These are the must-haves. Beyond that, participants are encouraged to improve retrieval, prompting, evidence selection, confidence handling, batching, caching, or safety logic.