Tôi Đã Xây Dựng Một Personal Agent 24/7 Với Chi Phí $0 Như Thế Nào? (Kèm 50+ Ý Tưởng Và Kiến Trúc Miễn Phí)
Tôi Đã Xây Dựng Một Personal Agent 24/7 Với Chi Phí $0 Như Thế Nào? (Kèm 50+ Ý Tưởng Và Kiến Trúc Miễn Phí)
“Bạn có một trợ lý cá nhân làm việc không ngừng nghỉ, nhắc nhở bạn sáng nào cũng có một bản tóm tắt email quan trọng, tự động draft reply nhưng không tự ý gửi, điểm danh các khái niệm cần ôn tập mỗi ngày, và thậm chí còn quét các job remote phù hợp với profile của bạn. Và tất cả những thứ đó – hoàn toàn miễn phí.”
Nghe có vẻ viễn tưởng, nhưng đó chính là thứ tôi đã bắt tay xây dựng. Tôi gọi nó là Personal Agent – không phải một con bot Telegram đơn giản hay một đống script cron rời rạc, mà là một hệ thống có khả năng ghi nhớ, ra quyết định và tương tác với tôi như một cộng sự thực sự. Bài viết này chia sẻ toàn bộ kế hoạch (plan) mà tôi đã thiết kế: từ nguyên tắc cốt lõi, kiến trúc free-tier, danh sách hơn 50 use case cụ thể, cho đến lộ trình triển khai từng tuần và cả code skeleton để bạn có thể bắt tay vào làm ngay.
Nếu bạn là một developer bận rộn, muốn tự động hóa cuộc sống nhưng vẫn giữ quyền kiểm soát, và đặc biệt là không muốn tốn một xu nào, thì bài viết này dành cho bạn.
1. Tại sao lại là Personal Agent? Và những nguyên tắc “nằm lòng”
Trước khi lao vào code, tôi đã định ra 5 nguyên tắc thiết kế để tránh những cái bẫy thường gặp ở các dự án automation cá nhân. Đây là kim chỉ nam cho mọi quyết định sau này:
1.1 Một lõi, nhiều kích hoạt (One Core, Many Triggers)
Thay vì xây 10 script riêng lẻ, mỗi cái một crontab, tôi tập trung vào một core duy nhất chứa LLM + công cụ + bộ nhớ. Core này được kích hoạt bởi nhiều trigger khác nhau: cron schedule (chạy giờ cố định), webhook (nhận sự kiện từ Telegram hay Gmail), manual trigger (tôi gọi thủ công), và on-demand (khi cần). Điều này giúp mọi thứ nhất quán, dễ bảo trì và mở rộng.
1.2 Agent phải có trí nhớ, không phải cron task vô hồn
Một script cron gửi email mỗi sáng vẫn chỉ là script. Agent thực sự cần có state (trạng thái) được duy trì giữa các lần chạy, có ngữ cảnh, có khả năng ghi nhớ quyết định trước đó và học hỏi. Ví dụ: nếu nó đã nhắc một nhiệm vụ ba lần rồi tôi vẫn lờ đi, nó sẽ tự hỏi có nên đổi cách nhắc không, thay vì cứ lặp lại một cách mù quáng.
1.3 Quan sát được (Observability) ngay từ ngày đầu
Mỗi lần gọi mô hình ngôn ngữ (LLM) – dù là Gemini, DeepSeek hay Claude – tôi đều ghi log: đầu vào (prompt), đầu ra, chi phí ước tính, thời gian thực thi. Nếu không có log, bạn sẽ không bao giờ biết mình đang “đốt tiền” ở đâu, dù số tiền đó rất nhỏ. Tệ hơn, bạn không thể debug khi agent hành xử kỳ lạ.
1.4 Con người luôn ở vòng phê duyệt (Human-in-the-loop)
Bất kỳ hành động nào có hậu quả cao – gửi email đến người khác, chi tiền, xóa file – đều bắt buộc phải có sự chấp thuận của tôi qua Telegram trước khi thực thi. Agent có thể soạn sẵn email, nhưng nút “Send” phải do chính tay tôi nhấn. Đây là ranh giới giữa trợ lý đáng tin và Skynet tự tung tự tác.
1.5 Suy giảm chức năng một cách duyên dáng (Graceful Degradation)
Khi một dịch vụ miễn phí đụng giới hạn, hệ thống không được phép im lặng chết. Ví dụ, nếu Gemini free-tier hết quota, nó sẽ tự động chuyển sang DeepSeek (rẻ tiền) hoặc thậm chí Ollama local. Nếu Telegram bot lỗi, nó sẽ gửi cảnh báo qua email dự phòng. Không có silent fail – tôi luôn biết khi có trục trặc.
2. Kiến trúc “0 đồng” nhưng mạnh mẽ
Làm sao để chạy agent 24/7 mà không tốn phí hosting? Tôi kết hợp ba nền tảng miễn phí một cách chiến lược, mỗi thứ đảm nhận một vai trò riêng:
- GitHub Actions (2,000 phút/tháng cho repo private): Đây là “xương sống” cho các tác vụ chạy định kỳ (cron) như morning brief, email triage, weekly review. Chiếm đến 90% use case.
- Cloudflare Workers (100,000 request/ngày): Xử lý các trigger bất đồng bộ, nhận webhook từ Telegram (khi tôi nhắn tin hoặc nhấn nút) hoặc Gmail push notification.
- Oracle Cloud Always Free ARM VM (4 vCPU, 24GB RAM, 200GB ổ cứng – vĩnh viễn): Dành cho các thành phần cần chạy nền liên tục như bot Telegram polling, hoặc các tác vụ nặng như scrape web bằng Playwright.
Mọi thành phần đều xoay quanh một Agent Core được viết bằng Python/TypeScript, lưu trạng thái vào database miễn phí và giao tiếp với tôi qua Telegram.
Stack chi tiết (tất cả $0)
| Tầng | Công cụ | Free tier đủ dùng | Mục đích sử dụng |
|---|---|---|---|
| LLM chính | Gemini 1.5 Flash | 15 request/phút, 1,500 req/ngày | Tác vụ thường nhật: tóm tắt, trích xuất, phân loại |
| LLM dự phòng (rẻ) | DeepSeek V3 | $0.14/M input token, $0.28/M output token | Xử lý batch lớn khi vượt free tier Gemini |
| LLM chất lượng cao | Claude Haiku 4.5 | Cực rẻ với prompt caching (~$1/M input token) | Quyết định quan trọng, cần structured output chính xác |
| LLM nội bộ | Ollama (llama 3.2, qwen 2.5) | $0, chạy trên laptop hoặc VM Oracle | Dữ liệu nhạy cảm, offline |
| Bộ nhớ chính | Turso (libSQL) | 500 DB, 9GB storage, 1 tỷ row reads/tháng | Lưu trạng thái bền vững, lịch sử, vector embedding |
| Cache nhanh | Cloudflare KV | 100k reads/ngày | Lưu cờ, trạng thái tạm |
| Vector search | Turso vector / pgvector (Supabase free) | Đủ dùng cho cá nhân | RAG (Retrieval-Augmented Generation) trên ghi chú cá nhân |
| Thông báo chính | Telegram Bot API | Không giới hạn | Tương tác hai chiều, phê duyệt inline |
| Gửi email | Resend | 3,000 email/tháng | Email digest, cảnh báo quan trọng |
| Nhận email | Gmail API | Miễn phí | Đọc và phân tích hộp thư đến |
| Quản lý bí mật | GitHub Actions Secrets | Miễn phí | Lưu API key an toàn |
| Log & Audit | GitHub Actions log + JSONL files | Miễn phí | Lịch sử mọi lần chạy, chi phí từng LLM call |
| Observability | Grafana OSS tự host trên Oracle VM | Miễn phí | Dashboard trực quan theo dõi agent hoạt động |
Thuật ngữ:
- LLM (Large Language Model): Mô hình ngôn ngữ lớn như Gemini, GPT, Claude – “bộ não” của agent.
- RAG (Retrieval-Augmented Generation): Kỹ thuật kết hợp tìm kiếm dữ liệu liên quan trước khi sinh câu trả lời, giúp câu trả lời chính xác và có ngữ cảnh hơn.
- Vector database: Nơi lưu trữ các vector embedding (biểu diễn số của văn bản) để tìm kiếm ngữ nghĩa.
- Prompt caching: Tính năng lưu trữ phần không thay đổi của prompt để giảm chi phí và độ trễ.
Cách chọn nền tảng trong 30 giây
- Chạy định kỳ, dưới 10 phút, không cần state thời gian thực? → GitHub Actions
- Phản ứng sự kiện (webhook, tin nhắn Telegram đến)? → Cloudflare Workers
- Cần chạy nền liên tục (bot Telegram polling, theo dõi IMAP)? → Oracle ARM VM
- Chỉ khi hệ thống quá phức tạp mới nghĩ đến multi-server hay container orchestration (mà với cá nhân, có lẽ không bao giờ cần).
3. 50+ Use Case: Từ “ngách” đến “đời thường”
Tôi đã phác thảo hơn 50 nhiệm vụ tiềm năng, sắp xếp theo mức độ giá trị mà chúng mang lại cho chính tôi – một developer sống tại Việt Nam, làm việc với backend, AI, viết blog và xây dựng thương hiệu cá nhân. Bạn có thể lọc theo nhu cầu của mình.
Bậc S – Giá trị kép cao nhất (nên xây đầu tiên)
Đây là những agent mang lại “compound interest” – giá trị tích lũy theo thời gian.
- Morning Brief 7AM ⭐: Quét email quan trọng (LLM lọc), lịch hôm nay, GitHub notifications, tin tức công nghệ ngách → gửi một tin nhắn Telegram gọn gàng.
- Email Triage & Draft ⭐: Mỗi 2 giờ, phân loại inbox thành 4 nhóm: Cần trả lời / Để biết / Rác / Cần theo dõi. Với nhóm “Cần trả lời”, agent soạn sẵn email draft trong Gmail (chưa gửi).
- Weekly Review Generator ⭐: Chiều Chủ nhật, tổng hợp git commits, blog đã publish, GitHub issues đã đóng trong tuần → bản tin insight qua Telegram.
- Reading Queue Processor ⭐: Tối, chọn 3 bài từ Pocket/Raindrop phù hợp với kế hoạch học → tóm tắt 200 từ + lưu vào Obsidian.
- Feynman Prompt Daily ⭐: Sáng, gửi 1 khái niệm trong master list học tập kèm 3 câu hỏi kiểm tra. Tôi trả lời bằng voice/text, agent chấm điểm và ghi log tiến độ.
- Blog Idea Generator: Thứ Hai tuần mới, tổng hợp Hacker News, GitHub trending, Twitter dev → gợi ý 5 chủ đề blog.
- GitHub Plugin Monitor: Theo dõi các repo về MCP, Claude Code, Cursor. Có release mới hoặc star spike → alert Telegram.
Bậc A – Năng suất hàng ngày
- Meeting Prep: 30 phút trước cuộc họp, lấy danh sách người tham gia, lịch sử chat/email, context từ ticket → tóm tắt 200 chữ.
- Meeting Notes Processor: Upload audio ghi âm → Whisper transcribe (qua Groq free/local) → LLM trích xuất action items → tạo task Todoist.
- Follow-up Tracker: Gán tag email cần reply trong X ngày, quá hạn thì “thúc” qua Telegram.
- Calendar Optimizer: Phát hiện meeting back-to-back không có break, thiếu focus time → đề xuất reschedule.
- Expense Extractor: Đọc email hoá đơn, SMS ngân hàng → trích xuất số tiền, danh mục → ghi vào Google Sheet.
- Subscription Audit: Hàng tháng quét tìm invoice/subscription, cảnh báo nếu có dịch vụ không dùng >30 ngày.
- Bill Reminder: Nhắc thanh toán credit card, điện nước 3 ngày trước hạn.
Bậc B – Học tập & Tri thức
- RSS Smart Filter: 30 RSS feed, LLM chấm điểm từng bài theo interest profile → chỉ gửi top 5/ngày.
- arXiv Sanity: Lọc paper theo keyword, LLM rate “khả năng hữu ích” 1-10.
- YouTube Summarizer: Dán link vào Telegram → lấy transcript, tóm tắt 5 gạch đầu dòng.
- Twitter Thread Archiver: Bookmark tweet → lưu full thread + context vào Obsidian kèm tag.
- Stack Overflow Watcher: Theo dõi tag như
mcp-protocol,pgvector, cảnh báo câu hỏi mới để build reputation. - Obsidian Auto-link: Gợi ý backlink cho note vừa viết dựa trên vault.
- Concept Graph Visualizer: Mỗi tuần vẽ graph các khái niệm đã Feynman, chỉ ra cluster và “cầu nối” còn thiếu.
Bậc C – Sự nghiệp & Side Hustle
- Remote Job Scanner: Scrape WeWorkRemotely, RemoteOK, LinkedIn filter “backend + AI” → alert job fit, tự động draft cover letter.
- Upwork Job Alert: Backend/MCP/LLM integration, budget >$X → alert kèm gợi ý “pitch angle”.
- Blog SEO Monitor: Track ranking keyword từ Google Search Console → weekly report.
- GitHub Star Alert: Repo của tôi có star spike bất thường → Telegram.
- Newsletter Growth Tracker: Subscriber hôm nay vs tuần trước, lý do unsubscribe.
- Competitor Watch: Theo dõi 10 creator/ repo trong niche, weekly digest họ publish gì.
Bậc D – Backend-dev specific
- Side-project Uptime Watch: Ping endpoint mỗi 5 phút, down thì báo Telegram (thay thế UptimeRobot free).
- Error Log Anomaly: Tail Sentry/Logflare, phát hiện spike error rate → alert kèm suspected root cause (LLM phân tích recent commits).
- Dependency Update Agent: Hàng tuần chạy
npm outdated,pip list --outdated, LLM đánh giá rủi ro → tạo PR tự động. - Auto Code-review on Self-PR: Trước khi submit PR cho công ty, chạy agent review bằng Claude → gắn comment “pre-review”.
- Slow Query Scanner: Poll
pg_stat_statementsmỗi đêm, top 10 slow query kèm EXPLAIN suggestion. - Post-mortem Drafter: Khi có incident, trigger manual, agent pull git log + error trace → draft post-mortem.
Bậc E – Content Pipeline
- Blog Draft from Voice: Ghi âm 5 phút → transcribe → outline → draft 1000 từ.
- Cross-post Distributor: Blog mới publish → auto post dev.to, Hashnode, tweet thread, LinkedIn post (mỗi kênh một phiên bản phù hợp).
- Old Post Refresher: Hàng tháng chọn 1 bài cũ, check thông tin còn đúng không, đề xuất cập nhật.
- Twitter Thread Generator: Từ blog post mới → thread 8 tweet.
- Newsletter Weekly: Tổng hợp bài publish, repo đã star, insight nổi bật → draft newsletter.
- Reader Question Aggregator: Gom câu hỏi từ Disqus/comment/email → gợi ý bài FAQ.
Bậc F – Nghiên cứu & Tình báo
- MCP Registry Scanner: Mỗi ngày quét MCP mới, filter ngách quan tâm.
- Hacker News Radar: Top story lọc theo interest profile.
- Reddit Niche Watch: r/mcp, r/ClaudeAI, r/LocalLLaMA… bài hot.
- Paper Implementation Tracker: Khi paper AI hot ra, kiểm tra có ai implement chưa → cơ hội blog.
- AI API Pricing Monitor: Giá các nhà cung cấp thay đổi → alert.
- Deep Research Task: Gửi topic + depth level, agent tự search-read-summarize → PDF report 3-5 trang.
Bậc G – Đời sống & Admin
- Birthday & Contact Nudge: Liên hệ quan trọng >3 tháng chưa liên lạc → nhắc kèm lời mở đầu.
- Shopping Price Watcher: Link Shopee/Tiki/Amazon → alert khi giảm > X%.
- Travel Deal Scanner: Đường bay yêu thích → alert giá rớt.
- Document Expiry Tracker: Gia hạn passport, visa, chứng chỉ → nhắc trước 30 ngày.
- Journal Prompter: 10h tối, Telegram hỏi một câu reflection cuối ngày, reply được lưu vào journal.
Và còn một số ý tưởng “bên lề” như Agent Usage Dashboard công khai để phục vụ build-in-public, hay Agent “tự sửa chính mình” khi fail quá 3 lần.
4. Lộ trình 9 tuần: Từ con số 0 đến hệ thống đáng tin cậy
Tôi không muốn “ôm” quá nhiều cùng lúc. Lộ trình này giúp tôi có nền móng vững chắc rồi mới mở rộng.
Tuần 1 – Foundation (8-10h)
Xây dựng agent đầu tiên: Morning Brief
Đây là use case “lành” nhất – không gửi email ra ngoài, không chi tiền, chỉ đọc và tóm tắt. Qua đó tôi học được toàn bộ pipeline: cron, gọi LLM, gửi Telegram, ghi log state.
- Milestone cuối tuần: 7h sáng mỗi ngày nhận được một tin nhắn gồm 20 email quan trọng, lịch hôm nay, top 5 Hacker News, tất cả được tóm bằng Gemini.
Tuần 2 – Thêm bộ nhớ và 2 agent mới
Tích hợp Turso DB để lưu trạng thái bền vững (không chỉ là file JSON tạm). Xây dựng Weekly Review và Feynman Prompt Daily. Lúc này agent bắt đầu nhớ tôi đang học đến đâu, concept nào đã kiểm tra.
Tuần 3 – Webhook và vòng phê duyệt của con người
Dựng Cloudflare Worker nhận webhook từ Telegram inline button. Đây là bước ngoặt: xây dựng Email Triage với draft reply. Tôi sẽ nhận được Telegram hỏi: “Tôi đã soạn email trả lời cho anh A. Send? Edit? Skip?” kèm nút bấm. Từ đây, mọi agent cần phê duyệt đều có thể tận dụng cơ chế này.
Tuần 4 – Mở rộng theo chiều ngang
Chọn thêm 3 agent thuộc bậc B/C mà tôi cảm thấy cấp thiết nhất, ví dụ: GitHub Plugin Monitor, Remote Job Scanner, Side-project Uptime Watch. Mỗi agent mới chỉ mất khoảng 1-2 giờ nhờ tái sử dụng core.
Tuần 5–8 – Chuyên biệt hóa cho Domain A
Với nền tảng vững chắc, tôi tập trung vào các agent phục vụ trực tiếp cho blog và nghiên cứu của mình – những thứ tạo ra giá trị kinh tế.
Tuần 9 trở đi – Ổn định, không thêm mới
Quy tắc vàng: Không chạy theo số lượng. Tập trung đo lường mức độ sử dụng, “kill” những agent tôi không còn đọc output, tối ưu chi phí và bắt đầu viết blog chi tiết về từng agent (content recycling miễn phí).
5. “Bộ xương” code cho repo agent-base
Để bạn dễ hình dung, đây là cấu trúc thư mục tôi đề xuất:
agent-base/
├── .github/workflows/
│ ├── morning-brief.yml
│ ├── email-triage.yml
│ └── weekly-review.yml
├── agents/
│ ├── morning_brief.py
│ ├── email_triage.py
│ └── weekly_review.py
├── core/
│ ├── llm.py # router: Gemini → DeepSeek → Claude
│ ├── memory.py # Turso client + JSONL append
│ ├── telegram.py # send + inline button
│ ├── gmail.py # Gmail API wrapper
│ ├── calendar.py # Google Calendar wrapper
│ └── logger.py # structured JSONL logger
├── state/ # committed back by Actions bot
│ ├── runs.jsonl
│ └── concepts_tested.json
├── configs/
│ └── interests.yaml # user profile cho filter
├── requirements.txt
└── README.md
Ví dụ “trái tim” – LLM router có fallback (core/llm.py)
Module này quyết định gọi mô hình nào dựa trên loại task và tự động chuyển đổi dự phòng khi có lỗi.
import os, time, json
from google import generativeai as gemini
import requests
LOG_PATH = "state/llm_calls.jsonl"
def _log(entry):
with open(LOG_PATH, "a") as f:
f.write(json.dumps(entry) + "\n")
def call_llm(prompt: str, task_tier: str = "routine") -> str:
"""
task_tier: routine | bulk | important
"""
start = time.time()
try:
if task_tier == "routine":
gemini.configure(api_key=os.environ["GEMINI_API_KEY"])
model = gemini.GenerativeModel("gemini-1.5-flash")
resp = model.generate_content(prompt)
out = resp.text
cost = 0.0
elif task_tier == "bulk":
# Gọi DeepSeek API với giá rẻ
# ... (code mẫu trong thiết kế gốc)
else: # important
# Gọi Claude Haiku với structured output
# ...
except Exception as e:
_log({"error": str(e), "task_tier": task_tier})
if task_tier != "bulk":
return call_llm(prompt, task_tier="bulk") # fallback xuống DeepSeek
raise
_log({
"ts": time.time(),
"task_tier": task_tier,
"duration": time.time() - start,
"cost_usd": cost,
"input_len": len(prompt),
"output_len": len(out),
})
return out
Ví dụ agent đầu tay: Morning Brief (agents/morning_brief.py)
from core.llm import call_llm
from core.telegram import send_message
from core.gmail import fetch_recent_emails
from core.calendar import today_events
from core.logger import log_run
import requests
def fetch_hn_top(n=5):
r = requests.get("https://hacker-news.firebaseio.com/v0/topstories.json")
ids = r.json()[:n]
return [requests.get(f"https://hacker-news.firebaseio.com/v0/item/{i}.json").json() for i in ids]
def run():
emails = fetch_recent_emails(max_results=15)
events = today_events()
hn = fetch_hn_top(10)
prompt = f"""You are my personal morning brief agent.
... (prompt chi tiết như trong thiết kế)
"""
brief = call_llm(prompt, task_tier="routine")
send_message(brief)
log_run("morning_brief", {"brief_len": len(brief)})
Workflow GitHub Actions (morning-brief.yml) sẽ kích hoạt cron vào 00:00 UTC (7h sáng Việt Nam), checkout code, cài dependencies, chạy script và commit lại state log lên repo – tất cả đều tự động.
6. Những cái bẫy tôi đã thấy trước (và cách né)
- Over-engineering trước khi có agent đầu tiên: Đừng đụng đến Kubernetes, Docker Swarm hay monorepo phức tạp. Một file Python chạy trên GitHub Actions là đủ cho cả năm đầu tiên.
- Không đặt trần chi phí: Tôi thêm một CI check: nếu tổng chi phí trong
llm_calls.jsonlcủa tháng vượt quá 5$, workflow sẽ fail. Như vậy tôi không bao giờ “vỡ nợ” vì gọi API quá đà. - Agent im lặng chết: Mỗi workflow phải kết thúc bằng một ping Telegram “OK/Fail”. Nếu hai ngày liên tiếp không thấy ping, tôi biết ngay có vấn đề.
- Xây những thứ “nghĩ là hay” chứ không phải pain point thực: Nếu một agent suốt 7 ngày tôi không thèm đọc output, nó sẽ bị xóa. Không tình cảm.
- Quên idempotency (tính bất biến khi thực hiện lại): Nếu GitHub Actions chạy lại do lỗi mạng, agent có gửi email trùng không? Luôn dùng lock key trong state để đảm bảo mỗi action chỉ thực hiện một lần.
7. Tiêu chí thành công sau 30 ngày
Tôi đặt ra các mục tiêu cụ thể để biết mình có đang đi đúng hướng không:
- ✅ Có 5–7 agent đang chạy ổn định, tổng chi phí LLM dưới 2$/tháng.
- ✅ Mọi lần gọi LLM đều có log, tính được chi phí cho từng agent.
- ✅ Ít nhất 3 lần mỗi tuần tôi thực sự hành động dựa trên output của agent (không chỉ đọc rồi quên).
- ✅ Đã viết và xuất bản ít nhất 1 bài blog kể về quá trình build một agent cụ thể.
- ✅ Hạ tầng đã tái sử dụng được: thêm một agent mới chỉ mất 1–2 giờ.
Nếu sau 30 ngày chưa đạt được, tôi sẽ dừng việc thêm mới và tập trung sửa những gì hiện có.
Kết: Một cộng sự thầm lặng, không thay thế tư duy
Personal Agent không phải để thay thế bạn suy nghĩ, mà là để loại bỏ những “sương mù” thông tin hàng ngày, giúp bạn tập trung vào những việc thực sự cần chất xám. Với ràng buộc chi phí bằng 0, tôi tin bất kỳ developer nào cũng có thể bắt đầu. Hãy thử build Morning Brief của riêng bạn vào cuối tuần này, và cảm nhận sự khác biệt khi mỗi sáng thức dậy đã có một bản tóm tắt thế giới dành riêng cho mình. Chúc bạn thành công!