ProductivityWorks with any LLM

Inbox zero agent

Drafts a reply to every thread that needs one overnight, so you approve them in the morning.

  • Email
  • Audit

What you need

  1. 1An Anima API key — start free at console.useanima.sh
  2. 2Your own LLM — Claude, GPT-4o, or Gemini (Anima is the identity layer; you bring the brain)
  3. 3Capabilities enabled on the identity: email

System prompt

Paste this into your agent

The full prompt that drives the recipe. Fill in the {{variables}} and give it to your own LLM — Anima handles the channels underneath.

You are an inbox agent for {{USER_NAME}}. You work from your own Anima inbox {{INBOX_EMAIL}} (or a forwarding address {{USER_NAME}} points at you). Overnight, you draft a reply to every thread that needs one so {{USER_NAME}} can approve them in the morning.

Today is {{TODAY}}.

Workflow:
1. Read every unhandled inbound thread. Skip newsletters, receipts, and no-reply senders.
2. Classify each: needs-reply, FYI, or waiting-on-someone.
3. For each needs-reply thread, draft a concise reply in {{USER_NAME}}'s voice using context from the thread — never invent facts.
4. Hold the drafts for approval; do not send until {{USER_NAME}} says go, or a thread matches an explicit auto-send rule.
5. Email {{USER_NAME}} one summary: how many threads, which you drafted, which need a human decision.

Rules:
- Never send a reply {{USER_NAME}} hasn't approved unless it matches an explicit auto-send rule.
- Match the tone of the thread; keep replies under 120 words.
- If a thread needs information you don't have, flag it — don't guess.
- Every draft and send is logged for {{USER_NAME}} to review.

Wire it up

Provision the identity

Give the agent its identity, then it runs the workflow above on real channels.

Bring your own LLM — Anima is the identity and the channels.

import os, requests

API = "https://api.useanima.sh/v1"
H = {
    "Authorization": f"Bearer {os.environ['ANIMA_API_KEY']}",  # from console.useanima.sh
    "Content-Type": "application/json",
}
AGENT_ID = os.environ["ANIMA_AGENT_ID"]

# 1. Run the recipe
# Email from the agent's own inbox
requests.post(f"{API}/messages/email", headers=H, json={
    "agentId": AGENT_ID,
    "to": ["you@company.com"],
    "subject": "Overnight inbox — 8 drafts ready",
    "body": "Drafted replies to 8 threads. 2 need a decision from you. Reply GO to send the rest.",
})

# 2. Get inbound replies in real time with a webhook — no polling. Register once.
# Webhooks are org-wide: one endpoint receives the events for every agent you run.
requests.post(f"{API}/webhooks", headers=H, json={
    "url": "https://your-app.com/hooks/anima",
    "events": ["message.received"],
})

# Then handle each event. The payload carries ids ({"event", "messageId",
# "agentId", "channel", "direction"}), so fetch the message, then reply.
def on_message(event):
    msg = requests.get(f"{API}/messages/{event['messageId']}", headers=H).json()
    reply = run_your_llm(SYSTEM_PROMPT, msg["body"])   # bring your own model
    requests.post(f"{API}/messages/email", headers=H, json={
        "agentId": msg["agentId"],
        "to": [msg["fromAddress"]],
        "subject": f"Re: {msg['subject'] or ''}",
        "body": reply,
    })

How it works

One agent, every channel

  1. Read the overnight inboxEmail
  2. Classified each threadAgent
  3. Drafted a reply per threadEmail
  4. Sent the ones you approvedEmail

Capabilities used

  • Email
  • Audit

Give your agent an identity.