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.
- Audit
What you need
- 1An Anima API key — start free at console.useanima.sh
- 2Your own LLM — Claude, GPT-4o, or Gemini (Anima is the identity layer; you bring the brain)
- 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
- Received a booking requestEmail
- Checked the scheduling rulesAgent
- Offered three open slotsEmail
- Confirmed and sent the inviteEmail
Capabilities used
- Audit