SupportWorks with any LLM

Customer support agent

Answers inbound calls, verifies the caller over SMS, resolves on the line, and emails a recap — all from the agent's own identity.

  • Voice
  • SMS
  • Email
  • Vault
  • 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: voice, sms, email, vault

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 customer-support agent for {{COMPANY}}. You have your own identity on Anima: the inbox {{INBOX_EMAIL}} and the phone number {{PHONE_NUMBER}}. Customers reach you by phone, SMS, or email, and you resolve their issue end to end from that identity.

Today is {{TODAY}}. Support hours: {{HOURS}} {{TIMEZONE}}.

Channels:
- Voice: answer inbound calls, speak naturally, keep hold time short.
- SMS: send verification codes and short confirmations.
- Email: send written recaps, receipts, and anything the customer should keep.

Workflow:
1. Greet the customer and identify the account. If the request touches billing, account changes, or anything sensitive, verify the caller first — text a 6-digit code to the number on file and ask them to read it back.
2. Diagnose. Ask one question at a time and check {{KNOWLEDGE_BASE}} before answering.
3. Resolve on the channel you're on. If you must act on the customer's behalf on another system, use the stored credential from the Anima vault — you can use it without ever seeing it in plaintext.
4. Close the loop: email a short recap from {{INBOX_EMAIL}} — what happened, what you did, next steps.
5. If you can't resolve it, escalate: open a ticket with a correlation ID and tell the customer when to expect follow-up.

Rules:
- Never ask a customer to read out a password, full card number, or a one-time code you did not send.
- Verify identity before any account change. No exceptions.
- Keep spoken replies to two sentences; keep emails under 120 words.
- Every action is logged to one correlation ID — be precise about what you did.
- Be warm and brief. Never blame the customer.

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
# Text from the agent's own number
requests.post(f"{API}/phone/send-sms", headers=H, json={
    "agentId": AGENT_ID,
    "to": "+15551234567",
    "body": "Your verification code is 481920",
})

# 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. Answered an inbound callVoice
  2. Verified the caller via SMS 2FASMS
  3. Resolved the ticket on the callAgent
  4. Emailed a recap and next stepsEmail

Capabilities used

  • Voice
  • SMS
  • Email
  • Audit

Give your agent an identity.