Personal & Consumer Use Cases Basics
8 concept-first examples for a tiny personal agent - 5 basic and 3 intermediate.
You will model inbox triage, a chat-channel reply, approval for sends, and hard stop conditions. Code stays sketch-level so the use-case shape stays clear.
Prerequisites
- Comfort with the agent loop idea (model decides, tools run, observations return)
- Optional: Python 3.11+ if you want to type the sketches locally
- Treat mail and chat credentials as production secrets even in demos
# Optional local env for later experiments (not required to learn the patterns)
python -m venv .venv && source .venv/bin/activate
pip install pydanticBasic Examples
1. Describe the Goal, Not the Product
Write a personal-agent goal as a checkable outcome.
Goal: Post a morning digest of (a) unread mail from VIP list and
(b) calendar events in the next 24 hours to my Telegram chat.
Stop when digest is posted or after 6 tool turns.- Success is observable without "vibes."
- Stop conditions travel with the goal.
- No vendor name is required to scope the work.
2. Split Read Tools from Write Tools
Register tools with different risk levels.
from pydantic import BaseModel, Field
class ListUnreadArgs(BaseModel):
max_messages: int = Field(default=20, ge=1, le=50)
class DraftReplyArgs(BaseModel):
thread_id: str
body: str
class SendReplyArgs(BaseModel):
thread_id: str
body: str
approved: bool = False
# Read tools: list_unread, get_calendar_day
# Write tools: send_reply, create_event - only when approved is True- The model can draft freely if send is blocked without
approved. - Descriptions should say when to use each tool.
- Day-one agents often ship read-only.
3. Simulate a Morning Mail Check
Walk one turn sequence on paper or in logs.
User/schedule: "Morning digest"
→ list_unread(max_messages=20)
← [{from: boss, subject: "Budget"}, {from: newsletter, ...}]
→ get_calendar_day(date=today)
← [{10:00 Standup}, {15:00 Dentist}]
→ final: "VIP: Budget email. Today: Standup 10:00, Dentist 15:00."- Observations drive what goes in the digest.
- Newsletters can be filtered by rules or model judgment with a VIP allowlist.
- No send tools were needed for value.
4. Post the Result to a Chat Channel
Treat chat as a delivery tool, not as the whole agent.
def post_chat(channel: str, text: str) -> dict:
# Platform SDK or webhook; return message id + ok flag
return {"ok": True, "channel": channel, "chars": len(text)}
# Observation for the model:
# {"ok": true, "channel": "telegram:personal", "chars": 180}- Chat integration is I/O.
- Keep messages short; link out if details are long.
- Rate-limit proactive posts so the agent does not spam you.
Related: Chat-Integrated Agents
5. Bound Every Wake with max_turns
Personal agents wake often. Each wake needs a budget.
def run_personal_wake(goal: str, tools: dict, max_turns: int = 6) -> str:
state = {"goal": goal, "trace": []}
for turn in range(max_turns):
decision = decide(state, tools) # model call
if decision.done:
return decision.answer
obs = tools[decision.tool](**decision.args)
state["trace"].append({"turn": turn, "tool": decision.tool, "obs": obs})
return "stopped: max turns - partial digest not posted"- Six turns is a reasonable first default for digests.
- Controlled stop beats silent hang.
- Log the trace; it is how you debug wrong tool choice.
Intermediate Examples
6. Draft a Reply, Wait for Approval
Never auto-send on day one.
User: "Reply to budget email: I'll send numbers by Friday."
→ get_thread(thread_id=...)
← {body, participants}
→ draft_reply(...) # stores draft only
← {draft_id, preview}
→ final: "Draft ready. Reply APPROVE <draft_id> to send."
# Later message: APPROVE d_123
→ send_reply(thread_id=..., body=..., approved=True)- Human-in-the-loop is a feature for personal mail.
- Separate draft storage from send execution.
- Log who approved and when (you).
Related: Email and Calendar Agents
7. Handle Tool Auth Errors as Observations
Expired Google tokens are normal life, not edge cases.
def list_unread(max_messages: int = 20) -> dict:
try:
return {"messages": fetch_mail(max_messages)}
except AuthError:
return {
"error": "auth_expired",
"action_needed": "Reconnect mail OAuth in settings.",
}- The model should tell you to reconnect, not invent an empty inbox.
- Do not put refresh tokens into the prompt.
- Count auth errors separately in your own notes or metrics.
8. Prefer a Preference File Over "Remember Everything"
Store durable personal rules outside the raw chat log.
PREFS = {
"timezone": "America/Los_Angeles",
"quiet_hours": ["22:00", "07:00"],
"vip_senders": ["boss@example.com"],
"tone": "concise, no emojis",
}
# Inject a short prefs block into system context each wake.- Preferences are product requirements for a personal agent.
- Full-history memory is optional and privacy-heavy.
- Update prefs deliberately; do not let the model rewrite them freely without review.
Related: Why Self-Hosting a Personal Agent Appeals to Privacy-Conscious Users
Related
- What a Personal AI Agent Actually Does Day to Day - daily pattern overview
- Chat-Integrated Agents - channel surfaces
- Email and Calendar Agents - triage and scheduling depth
- Shell-Access Personal Agents - when local power is too much
- Personal & Consumer Use Cases Best Practices - access checklist before real accounts
- Self-Hosted Personal Agents Basics - runtime-focused follow-on
Stack versions: Pins from the category manifest (verify at build): OpenRouter (~315+ models, July 2026 pricing/fees); LangGraph 1.0+; CrewAI 1.14+; Microsoft Agent Framework 1.0; Vercel AI SDK 6; Pydantic AI (latest); LlamaIndex (latest); OpenAI Agents SDK (latest + MCP); MCP (Linux Foundation governance); A2A (HTTP+SSE+JSON-RPC 2.0); Solana
@solana/web3.js+@solana/spl-token.