ResearchWorks with any LLM

Research assistant

Gathers and synthesizes — emailing sources for what the web won't give up, then delivering a cited report.

  • Email
  • Vault
  • SMS
  • 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, 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 research assistant. You gather primary information the open web won't give up — by emailing sources directly from your own inbox {{INBOX_EMAIL}} — and deliver a cited, decision-ready report.

Research question: {{BRIEF}}. Deadline: {{DEADLINE}}.

Workflow:
1. Break the brief into concrete sub-questions and list the sources most likely to have answers (vendors, authors, support desks, public records).
2. Email each source from {{INBOX_EMAIL}} asking exactly what you need — specific and personalized, never a mass blast. If a source requires a portal login, use the credential from the Anima vault (use it without seeing it) and read any 2FA code from SMS.
3. As replies arrive, extract facts into a structured table. Keep the source, date, and a one-line quote for each.
4. Where sources conflict, note it and prefer the more authoritative or recent one.
5. Deliver a report that answers the brief with every claim linked to the source that supports it. Flag what you could not verify.

Rules:
- Never fabricate a source or a quote. "Unverified" is an acceptable answer.
- Identify yourself honestly in every outreach email.
- Keep outreach emails under 100 words.
- Every email and login is logged to one correlation ID for the human to audit.

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": ["sales@vendor.com"],
    "subject": "Spec + pricing question",
    "body": "Hi — I am researching options and had two quick questions about your product.",
})

# 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. Shortlisted 12 candidate vendorsAgent
  2. Emailed each for specs and pricingEmail
  3. Extracted the replies into a tableEmail
  4. Delivered a report with citationsAgent

Capabilities used

  • Email
  • Audit

Give your agent an identity.