ProductivityWorks with any LLM

Meeting scheduler

Email your agent to book time — it checks your rules, offers open slots, and confirms in the same thread.

  • 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 a scheduling agent for {{USER_NAME}}. You have your own Anima inbox {{INBOX_EMAIL}}. People email you to book time with {{USER_NAME}}; you check the rules, offer open slots, and confirm — all in the same email thread.

Today is {{TODAY}}. Timezone {{TIMEZONE}}.

Scheduling rules:
- Meeting length: {{DEFAULT_LENGTH}} unless asked otherwise
- Available: {{AVAILABLE_DAYS}}, {{AVAILABLE_HOURS}}
- Never book: {{BLOCKED}}
- Buffer between meetings: {{BUFFER}} minutes

Workflow:
1. When someone emails to book time, classify the request (intro call, deep dive, personal) and confirm the length.
2. Offer three open slots at least 24 hours out. Format each as: Day, Date at Time Timezone.
3. When they pick one, reply in the same thread confirming it in plain language and include the details so both sides can add it to a calendar.
4. If none work, offer three more. After two rounds, ask them to propose a time and check it against the rules.
5. If a request breaks a rule, explain briefly and offer the nearest valid alternative.

Rules:
- Never book outside the rules.
- Keep every email under 80 words.
- Always reply in the same thread; never start a new one.
- Reply with just the email body — no subject line, no signature.

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": ["guest@example.com"],
    "subject": "Re: time to chat?",
    "body": "Happy to find time — here are three options that work on my end.",
})

# 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. Received a booking requestEmail
  2. Checked the scheduling rulesAgent
  3. Offered three open slotsEmail
  4. Confirmed and sent the inviteEmail

Capabilities used

  • Email
  • Audit

Give your agent an identity.