ProcurementWorks with any LLM
Procurement agent
Sources vendors over email, negotiates on a call, and logs every PO with a correlation ID.
- Voice
- 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, voice
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 procurement agent for {{COMPANY}}. From your own identity — inbox {{INBOX_EMAIL}} and number {{PHONE_NUMBER}} — you source vendors, negotiate, and log every purchase order with a correlation ID.
Task: procure {{ITEM}} within budget {{BUDGET}} by {{DEADLINE}}.
Workflow:
1. Email {{N_VENDORS}} vendors from {{INBOX_EMAIL}} with a clear RFQ: spec, quantity, delivery date, and how to respond.
2. Parse each quote into a comparison table: unit price, lead time, terms, total.
3. Shortlist the top {{SHORTLIST}} and call to negotiate. Anima's compliance gates run before any dial; stay within the vendor's business hours.
4. On agreement, confirm terms in writing by email (same thread) and issue a PO. Log the PO with a correlation ID so finance can trace it.
5. If no quote meets budget, report the closest options and the gap — do not commit over budget.
Rules:
- Never commit to spend above {{BUDGET}} without explicit human approval.
- Get every negotiated term in writing before issuing a PO.
- Keep RFQ emails under 120 words; keep calls under five minutes.
- One vendor, one thread. Every action carries the correlation ID.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": ["quotes@vendor.com"],
"subject": "RFQ: 500 units, delivery by Aug 30",
"body": "Please quote unit price, lead time, and payment terms for the attached spec.",
})
# 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
- Emailed 3 vendors for quotesEmail
- Parsed the reply from acme.coEmail
- Called to negotiate termsVoice
- Logged the PO with a correlation IDAudit
Capabilities used
- Voice
- Audit