Triage a shared inbox: what it is, how urgent, and whether a draft may go out
Classify inbound email by intent and urgency, decide what an agent may answer and what a person must see, and reject the ones that fit no category. How to run inbox triage with Saina Helm 2 in n8n or your own code.
In short: Put a decision step in front of the inbox automation. Helm reads each message and answers: what kind of request, how urgent, is a reply safe to send without review, and does it match any category at all. Your workflow acts on the scores; unsure and off-category mail goes to a person. The reply itself is still written by whatever you use today.
Saina Helm 2
Text
Shared inboxes, order and booking mailboxes, inbound sales and support email
The step
“The agent handles the easy ones fine. What scares me is the one it shouldn’t have answered: an angry customer, a legal threat, a refund it promised that we don’t give. I need a gate before Send, not a smarter writer.”
What people building inbox agents say, paraphrased from the threads we read every dayInbox automation has two halves. Writing the reply is the half that gets all the attention. Deciding whether this message should be answered automatically at all, by whom, and how soon, is the half that decides whether the project survives contact with real customers.
- Intent from a prompt. “Classify this email as order, complaint, question or spam.” The model answers in prose, sometimes with a fifth category, and a message that is half complaint, half order lands in one bucket with no trace of the other.
- Urgency from keywords. “urgent”, “asap”, “lawyer”. Everyone writes “urgent”. The one that matters doesn’t.
- Nothing fits. The message is in the wrong language, a vendor pitch, an out-of-office. A prompt forces it into the closest category; your workflow then does something with it.
Each of those is a pick between options you know in advance. A decision model scores the options and tells you how sure it is, so the workflow can be careful exactly where it should be.
What the request looks like
{
"model": "saina-helm-2-0.8b",
"state": "Subject: Order 48213\n\nHi, the blender arrived yesterday with a cracked jug. I'd like a replacement sent before the weekend, I'm hosting on Saturday. If that's not possible please refund me. Receipt attached.",
"mode": "decision",
"threshold": 0.7,
"min_margin": 0.15,
"questions": {
"intent": {
"type": "single_choice",
"question": "What is this message about?",
"options": {
"damaged": "Damaged or defective item received",
"status": "Where is my order",
"return": "Return or refund of an undamaged item",
"question": "Pre-sales or product question",
"other": "None of the above"
}
},
"urgency": {
"type": "rating",
"question": "How soon does this need a reply?",
"levels": ["This week", "Today", "Now"]
},
"auto_ok": {
"type": "yes_no",
"question": "Can a standard reply be sent without a person reading this first?"
},
"tags": {
"type": "multi_choice",
"question": "Which apply?",
"options": { "refund_request": null, "deadline": "Mentions a date or deadline", "attachment": "Refers to an attachment", "upset": "Customer is upset or threatening" }
}
}
}
And what comes back:
{
"answers": {
"intent": {
"type": "single_choice",
"selection": "damaged",
"reason": "accepted",
"probabilities": {
"damaged": 0.88,
"return": 0.08,
"status": 0.02,
"question": 0.01,
"other": 0.01
},
"confidence": 0.85
},
"urgency": {
"type": "rating",
"expected_level": 1.21,
"reason": "accepted",
"probabilities": {
"0": 0.12,
"1": 0.55,
"2": 0.33
},
"levels": [
"This week",
"Today",
"Now"
],
"level": 1,
"confidence": 0.55
},
"auto_ok": {
"type": "yes_no",
"yes": 0.41,
"no": 0.59,
"confidence": 0.18,
"selected": null,
"reason": "below_threshold"
},
"tags": {
"type": "multi_choice",
"selections": [
"refund_request",
"deadline",
"attachment"
],
"reason": "accepted",
"memberships": {
"refund_request": 0.86,
"deadline": 0.93,
"attachment": 0.95,
"upset": 0.18
}
}
}
}
Four questions, one read of the email. The intent is clear and accepted. The urgency comes back as a probability-weighted level on your scale. The tags are independent, so three can be true at once. And the question that matters most, auto_ok, came back below_threshold: that is the gate doing its job. The agent still drafts; a person presses Send.
Putting it in place
Make “none of the above” a real option
Give the intent question an explicit other option with a description, and treat a low top score as a signal too. Between the two, off-category mail stops being forced into a bucket. (Spotting the message that matches none of a hundred intents is on our roadmap; with a handful of intents and an explicit other, it works today.)
Gate on two numbers, not one
Let a reply go out automatically only when auto_ok clears your threshold and no risk tag (upset, a legal word, a refund promise) is above its own. Everything else is drafted and queued for a person. Start strict, loosen with data.
Wire it in
In n8n: Gmail or IMAP trigger → the Saina Helm node → Switch on intent, with the node’s Fallback output going to a review label. Start from the node’s support-routing template and swap in the questions above. From code, it is the same request to api.saina.run/v1/ask or to a server you run with pip install 'saina[local,server]', so the mail never leaves your infrastructure.
Use distribution mode while you are calibrating, decision mode with thresholds once you have picked them.
What it won’t do
- It does not write the reply and does not extract fields (order numbers, dates). Keep your LLM or your parser for that; Helm decides whether and where.
- It reads what you send. For a long thread, send the latest message and a short summary of the rest rather than the whole thread.
- Text only with Helm 2. If the decision depends on an attached image, use Helm 2 Omni and send the image in the same request.
Frequently asked questions
Can it decide whether an AI reply is safe to send?
It scores a yes/no question you phrase, such as “can a standard reply be sent without a person reading this first?”, and your workflow acts only when the score clears the threshold you set. It is a gate on the decision, not a check of the reply text itself.
What happens to email that fits none of my categories?
Give the intent question an explicit “none of the above” option, and set a threshold: a low top score falls back instead of picking. Both paths send the message to a person instead of forcing it into a bucket.
Can one request return several answers?
Yes. Up to 256 questions in one request, all answered from the same read of the message: intent, urgency, tags and a gate in one call.
Does it work in languages other than English?
Describe the options in the language you want the model to read, and test on your own mail. Measure before relying on it; the playground takes a free run on any message you paste.