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
- Vault
- 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: 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
- Answered an inbound callVoice
- Verified the caller via SMS 2FASMS
- Resolved the ticket on the callAgent
- Emailed a recap and next stepsEmail
Capabilities used
- Voice
- SMS
- Audit