Chào mừng bạn đến với thế giới của Hermes Agent – một tác nhân AI đột phá từ Nous Research, được thiết kế để tự cải thiện liên tục. Bài viết này cung cấp một cái nhìn sâu sắc, thực tế và toàn diện về các nguyên lý cốt lõi, kiến trúc tinh vi, và một danh sách kiểm tra cụ thể để bạn có thể tự xây dựng một tác nhân tự học tương tự. Với khả năng tương tác linh hoạt và cơ chế học tập khép kín, Hermes Agent không chỉ là một chatbot thông thường mà còn là một nền tảng mạnh mẽ giúp giải quyết vấn đề hiệu quả hơn theo thời gian.
Mục lục
📋 Mục Lục
- 🤖 1. Hermes Agent Thực Sự Là Gì?
- 🧭 2. Các Nguyên Tắc Cốt Lõi
- 🏗️ 3. Kiến Trúc Tổng Quan Cấp Cao
- 🔄 4. Vòng Lặp Agent (Trái Tim Của Mọi Thứ)
- 🧩 5. Lắp Ráp System Prompt
- 🛠️ 6. Hệ Thống Công Cụ
- 🧠 7. Hệ Thống Kỹ Năng (Tính Năng Đột Phá)
- 💾 8. Hệ Thống Bộ Nhớ
- 🔌 9. Hệ Thống Plugin
- 📋 9b. Mẫu
COMMAND_REGISTRY(Đáng để học hỏi) - 🎨 9c. Skin Engine (Tạo chủ đề dưới dạng dữ liệu)
- 📡 9d. Đa Phương Tiện & Phát Trực Tiếp
- 🎓 9e. Tích Hợp Đào Tạo RL / Atropos (
environments/) - 🖥️ 10. Giao Diện Người Dùng (Cách Agent Tiếp Cận Người Dùng)
- 👤 11. Hồ Sơ & Đa Phiên Bản
- ⚙️ 12. Cấu Hình & Bí Mật
- 💰 13. Cache Prompt (Câu chuyện về chi phí)
- 🗺️ 14. Xây Dựng Agent Của Riêng Bạn — Danh Sách Kiểm Tra Cụ Thể
- 🌱 Giai đoạn 1 — Vòng lặp (Ngày 1–2)
- 💻 Giai đoạn 2 — CLI (Ngày 3)
- 🛠️ Giai đoạn 3 — Registry Công cụ (Ngày 4–5)
- 💾 Giai đoạn 4 — Bộ nhớ & Persona (Ngày 6)
- 🧠 Giai đoạn 5 — Kỹ năng (Ngày 7–10) ← Phép thuật
- 💰 Giai đoạn 6 — Cache Prompt (Ngày 11)
- 📨 Giai đoạn 7 — Gateways (Ngày 12+)
- 🔗 Giai đoạn 8 — MCP (Ngày 14+)
- ✨ Giai đoạn 9 — Hồ sơ & Hoàn thiện
- ⚡ 15. Ngăn Xếp Công Nghệ Khuyến Nghị
- ⚠️ 16. Những Cạm Bẫy Bạn Sẽ Gặp
- 💡 17. Mô Hình Tư Duy Trong Một Câu
- 📚 18. Tham Khảo
🤖 1. Hermes Agent Thực Sự Là Gì?
Hermes là một tác nhân đàm thoại tự cải thiện, độc lập với mô hình, có khả năng chạy cục bộ dưới dạng CLI/TUI, trên máy chủ như một cổng nhắn tin (Telegram/Discord/Slack/WhatsApp/Signal), hoặc như một tác vụ cron theo lịch trình. Điểm khác biệt chính của nó là vòng lặp học tập khép kín: trong khi giải quyết vấn đề bằng các công cụ, nó tạo ra các tài liệu “kỹ năng” có thể tái sử dụng và quản lý một tệp bộ nhớ liên tục, nhờ đó tác nhân này trở nên có khả năng hơn theo đúng nghĩa đen khi nó chạy càng lâu. Mọi thứ – mô hình, công cụ, kỹ năng, backend bộ nhớ, môi trường thực thi, giao diện người dùng – đều có thể cắm ghép được.
Hai ý tưởng quan trọng cần hiểu rõ trước khi bạn bắt tay vào xây dựng:
- Một tác nhân, nhiều giao diện. Một lớp
AIAgentduy nhất cung cấp sức mạnh cho mọi giao diện. Các giao diện (CLI, gateway, cron, batch, API) là các điểm vào mỏng, xây dựng một tác nhân và gọirun_conversation(). - Bộ nhớ theo thủ tục > prompt thông minh. Hầu hết các hành vi “tác nhân thông minh” không đến từ kỹ thuật prompt mà từ việc tác nhân sở hữu một thư mục chứa các tài liệu markdown (kỹ năng + bộ nhớ + persona) mà nó có thể đọc, viết và phát triển theo thời gian.
🧭 2. Các Nguyên Tắc Cốt Lõi
Đây là những quy tắc thiết kế mà Hermes tuân theo. Hãy ghi nhớ chúng cho dự án của riêng bạn – hầu hết các quyết định “kỳ lạ” trong codebase đều bắt nguồn từ một trong những nguyên tắc này.
2.1. Lõi Độc Lập Nền Tảng 🌐
Agent không cần biết nó đang chạy trong một terminal, một cuộc trò chuyện Telegram, hay một tác vụ cron. Tất cả các đặc điểm cụ thể của nền tảng đều nằm trong các adapter, chúng chuyển đổi các sự kiện của nền tảng thành agent.run_conversation(...) và chuyển đổi phản hồi trở lại. Nếu bạn thấy mình thêm một nhánh if cụ thể cho Telegram vào mã lõi của agent, bạn đã đi chệch khỏi kiến trúc.
2.2. Tính Ổn Định Của Prompt (Thân thiện với Cache) 🔒
System prompt được lắp ráp một lần khi bắt đầu phiên và không thay đổi giữa cuộc trò chuyện. Điều này không phải vì tính thẩm mỹ – mà là vì yếu tố kinh tế. Cache prompt của Anthropic và OpenAI yêu cầu một tiền tố ổn định để đạt được lượt truy cập. Việc thay đổi bộ công cụ, tải lại bộ nhớ hoặc hoán đổi kỹ năng giữa cuộc trò chuyện sẽ làm mất hiệu lực cache và tăng chi phí của bạn lên 10 lần. Mặc định, hãy hoãn các thay đổi đến “phiên tiếp theo”.
2.3. Tiết Lộ Dần Dần 🔍
Đừng tải mọi kỹ năng, mọi bộ nhớ, mọi tài liệu đầy đủ của công cụ vào system prompt. Hãy tải mô tả (Cấp độ 0). Hãy để agent chỉ kéo nội dung đầy đủ (Cấp độ 1) khi nó thực sự cần kỹ năng đó. Tải các tệp được tham chiếu (Cấp độ 2) chỉ khi bản thân kỹ năng yêu cầu chúng. Đây là cách Hermes có thể cung cấp 47 công cụ và hàng tá kỹ năng mà vẫn nằm trong giới hạn ngữ cảnh.
2.4. Tự Đăng Ký Thay Vì Danh Sách Tập Trung 📝
Các công cụ và plugin nên tự đăng ký khi nhập (registry.register(...)) thay vì được thêm vào một danh sách __all__ được duy trì thủ công. Công cụ mới = một tệp mới, không cần chỉnh sửa ở nơi khác.
2.5. Cô Lập Hồ Sơ 🧱
Nhiều phiên bản agent độc lập cùng tồn tại bằng cách mỗi phiên bản sở hữu một thư mục HERMES_HOME (mặc định ~/.hermes/, ghi đè qua biến môi trường). Mọi đường dẫn hệ thống tệp trong codebase đều đi qua get_hermes_home() – không bao giờ mã hóa cứng ~/.hermes.
2.6. Agent Sở Hữu Các Tạo Tác Học Tập Của Riêng Nó 🎒
Các kỹ năng không được con người thêm vào bằng cách chỉnh sửa mã nguồn. Agent tự viết chúng thông qua một công cụ gọi là skill_manage sau khi giải quyết một tác vụ không tầm thường. Bộ nhớ không được con người quản lý – agent chỉnh sửa MEMORY.md và USER.md giữa các lượt. Đây chính là vòng lặp học tập.
🏗️ 3. Kiến Trúc Tổng Quan Cấp Cao
Sơ đồ kiến trúc tổng quan của Hermes Agent được chia thành ba cấp độ rõ ràng, giúp dễ dàng hiểu được cách các thành phần tương tác với nhau:
┌──────────────────────────────────────────────────────────────────┐
│ ENTRY POINTS │
│ CLI / TUI / Gateway (TG, Discord, Slack) / Cron / Batch / API │
└──────────────────┬───────────────────────────────────────────────┘
│ Mỗi điểm vào xây dựng một AIAgent
▼
┌──────────────────────────────────────────────────────────────────┐
│ AIAgent (vòng lặp cốt lõi) │
│ build_system_prompt → gọi model → điều phối lệnh công cụ → lặp lại │
└─────┬─────────────┬────────────────┬────────────────┬────────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌────────────┐ ┌─────────────┐
│ Công cụ │ │ Kỹ năng │ │ Bộ nhớ │ │ Nhà cung cấp │
│ Registry │ │ Loader │ │ Manager │ │ (API model) │
└──────────┘ └──────────┘ └────────────┘ └─────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ Môi Trường Thực Thi: cục bộ / Docker / SSH / Modal / Daytona │
└──────────────────────────────────────────────────────────────────┘
Giải thích cụ thể ba cấp độ:
- Cấp 1 — Giao diện (Surfaces): Cách con người hoặc hệ thống tương tác với agent (CLI, nền tảng trò chuyện, cron).
- Cấp 2 — Lõi Agent (Agent core): Vòng lặp chính, cùng với bốn hệ thống con có thể cắm ghép (công cụ, kỹ năng, bộ nhớ, mô hình).
- Cấp 3 — Backend thực thi (Execution backends): Nơi các công cụ chạy lệnh shell/mã thực sự được thực thi. Có thể là máy tính cục bộ, Docker được sandbox, hoặc đám mây Modal trong môi trường sản xuất.
🔄 4. Vòng Lặp Agent (Trái Tim Của Mọi Thứ)
Đây là phần quan trọng nhất của Hermes Agent. Toàn bộ lớp AIAgent về cơ bản là vòng lặp này:
1. Nhận đầu vào → từ CLI / gateway / cron / ACP / web
2. Xây dựng system prompt → persona + bộ nhớ + kỹ năng + công cụ (MỘT LẦN mỗi phiên)
3. Giải quyết nhà cung cấp → khóa API + điểm cuối nào cho mô hình đã chọn
4. Gọi mô hình → một trong BỐN chế độ API (tự động phát hiện theo điểm cuối/mô hình):
chat_completions | codex_responses |
anthropic_messages | bedrock_converse
5. Phân tích phản hồi
├─ nếu có lệnh gọi công cụ → điều phối từng lệnh qua registry → thêm kết quả → ĐI TỚI 4
└─ nếu không → tin nhắn trợ lý cuối cùng → hiển thị → duy trì → hoàn tất
6. Duy trì → SQLite SessionDB (chế độ WAL + chỉ mục FTS5)
Một số chi tiết không rõ ràng nhưng quan trọng:
- Ngân sách lặp – sắc thái hơn một bộ đếm đơn giản. Một
IterationBudgetan toàn cho luồng được chia sẻ giữa agent cha và bất kỳ subagent nào nó sinh ra.execute_codehoàn lại các lượt lặp khi hoàn thành để một vòng lặp công cụ lập trình không làm cạn kiệt ngân sách. Khi hết: một tin nhắn cảnh báo được chèn (_budget_exhausted_injected), chính xác một cuộc gọi API cuối cùng được phép (_budget_grace_call), sau đó buộc phải tóm tắt. Không có cảnh báo trung gian – đây là một thiết kế có chủ đích, để ngăn mô hình bỏ cuộc sớm. - Nội dung suy luận được lưu trữ riêng khỏi tin nhắn trợ lý hiển thị (cả OpenAI o-series và Anthropic extended thinking đều tạo ra các token “suy luận” ẩn). Hãy giữ chúng trong trường riêng của chúng; chúng cần thiết cho tính hợp lệ của cache nhưng không nên được hiển thị. Các callback:
stream_delta_callback,interim_assistant_callback,thinking_callback,reasoning_callback. - Phát trực tiếp với việc làm sạch có trạng thái. Một
_stream_context_scrubberloại bỏ các đoạn<memory-context>ngay cả khi chúng bị phân tách qua các chunk – đừng đánh giá thấp sự phức tạp của việc này khi các thẻ bị chia cắt qua ranh giới mạng. - Nén, không cắt bớt. Khi ngữ cảnh đầy, một
context_compressorsẽ tóm tắt các lượt giữa thay vì loại bỏ chúng. Bản tóm tắt đó tự nó trở thành một tin nhắn. Mất dữ liệu là chấp nhận được; không mất dữ liệu sẽ gây ra lỗi bộ nhớ (OOM). - Ngắt. Ctrl-C giữa lệnh gọi công cụ phải hủy sạch công cụ đang thực thi, thêm kết quả công cụ “người dùng đã ngắt” vào lịch sử và trả lại quyền kiểm soát. Đừng tắt toàn bộ vòng lặp – hãy để agent thấy sự gián đoạn và phản hồi.
- Tiếp tục phiên. Các cờ
--continue/--resumetải lịch sử trước đó quaSessionDB.get_messages(). Chế độ WAL của SQLite + một lớp thử lại tùy chỉnh (dao động 20–150 ms,BEGIN IMMEDIATE) xử lý tranh chấp ghi đa tiến trình. Một bản tóm tắt được hiển thị cho người dùng trước khi tiếp tục.
🧩 5. Lắp Ráp System Prompt
Một hàm prompt_builder.build_system_prompt() nối các phần sau, theo thứ tự này:
- Persona —
SOUL.md/DEFAULT_AGENT_IDENTITY. Danh tính, giọng điệu, giá trị. - Gợi ý nền tảng —
PLATFORM_HINTS. Cho mô hình biết nó đang chạy trong CLI, Telegram, Slack, v.v. — điều này thay đổi các quy tắc định dạng (không có MarkdownV2 trong CLI, không có khối mã lồng nhau trong Telegram, …). - Hướng dẫn bộ nhớ —
MEMORY_GUIDANCE. Nhúng một ảnh chụp nhanh đóng băng củaMEMORY.md+USER.mddưới dạng một khối duy nhất (phân tách bằng dấu phân cách§). Giới hạn kích thước (~2200 ký tự MEMORY, ~1375 ký tự USER). - Hướng dẫn tìm kiếm phiên —
SESSION_SEARCH_GUIDANCE. Cho agent biết nó có thể tìm kiếm các phiên trước đó qua FTS5, với một ví dụ nhỏ. - Hướng dẫn kỹ năng —
SKILLS_GUIDANCE. Chỉ mục kỹ năng Cấp độ 0 cộng với văn bản gợi ý heuristic khuyến khích agent tạo kỹ năng sau khi giải quyết các tác vụ khó. - Tệp ngữ cảnh —
AGENTS.mdvà.hermes.mdtừ thư mục làm việc. - Thực thi sử dụng công cụ —
TOOL_USE_ENFORCEMENT_GUIDANCE. Các quy tắc cứng về lệnh gọi song song, phục hồi lỗi, v.v. - Lược đồ công cụ — Lược đồ JSON cho tất cả các công cụ đã bật.
Sau đó, prompt_caching.py chèn các điểm ngắt cache (Anthropic cache_control: {type: ephemeral}; các tương đương cho các nhà cung cấp khác). Toàn bộ tiền tố được lắp ráp trở thành vùng có thể cache.
Mẫu ảnh chụp nhanh đóng băng (đây là mẹo). MEMORY.md và USER.md được đọc một lần khi bắt đầu phiên và được nhúng bất biến vào system prompt trong suốt phần còn lại của phiên. Agent vẫn có thể ghi vào các tệp đó trên đĩa trong phiên – nhưng system prompt không thay đổi. Kết quả: cache vẫn hợp lệ trong suốt cuộc trò chuyện và bộ nhớ mới có hiệu lực ở phiên tiếp theo. Bỏ qua điều này sẽ phá hủy cache tiền tố của bạn.
Quét bảo mật bộ nhớ. Trước khi chèn, nội dung MEMORY/USER được quét các mẫu prompt injection, các nỗ lực exfiltration (curl/wget tham chiếu biến môi trường), backdoor bền vững và Unicode ẩn. Một tệp bộ nhớ bị nhiễm độc là bệnh prion của agent – hãy quét phòng thủ.
Quy tắc chính: các phần 1–8 là đóng băng cho phiên. Tin nhắn người dùng và kết quả công cụ được thêm vào lịch sử; chúng không đi vào system prompt.
🛠️ 6. Hệ Thống Công Cụ
6.1. Registry Tự Đăng Ký 📦
Một tệp tools/registry.py trung tâm cung cấp:
registry.register(
name="read_file",
toolset="filesystem",
schema={...Lược đồ JSON...},
handler=read_file_handler,
available=lambda ctx: True, # điều kiện kiểm tra tính khả dụng
)
Mọi tệp công cụ đều gọi hàm này khi module được nhập. Registry xử lý:
- Thu thập lược đồ cho system prompt.
- Điều phối theo tên khi mô hình phát ra một lệnh gọi công cụ.
- Lọc tính khả dụng (theo người dùng, theo nền tảng, theo bộ công cụ).
- Xử lý lỗi — mọi ngoại lệ trong một handler đều được chuyển đổi thành kết quả công cụ mà mô hình có thể thấy và phản ứng. Không bao giờ để một công cụ làm sập vòng lặp.
Tất cả các handler trả về chuỗi JSON, không phải đối tượng Python. Mô hình chỉ luôn thấy văn bản.
6.2. Các Bộ Công Cụ (Toolsets) 🗂️
Các công cụ được nhóm thành các bộ logic (hệ thống tệp, web, trình duyệt, mã, mcp, thị giác, âm thanh, …) — Hermes cung cấp khoảng 40+ công cụ (tài liệu ghi “47 tích hợp sẵn” ở một số nơi, “40+” ở những nơi khác; AGENTS.md nói rằng hệ thống tệp là nguồn gốc đáng tin cậy vì số lượng thay đổi liên tục – đừng mã hóa cứng các con số trong phiên bản của bạn). Người dùng bật/tắt theo bộ công cụ thay vì từng công cụ. Các bộ công cụ bị tắt hoàn toàn không có mặt trong system prompt – tiết kiệm token và ngăn mô hình thậm chí không biết về chúng.
6.3. Môi Trường Thực Thi 🖥️
Các công cụ chạy lệnh shell hoặc mã đi qua một lớp trừu tượng môi trường (tools/environments/):
| Backend | Trường hợp sử dụng |
|---|---|
local |
Phát triển trên máy tính xách tay của bạn. Nhanh nhất. Không có cách ly. |
docker |
Hộp phát triển dùng chung. Một container cho mỗi phiên. |
ssh |
VM từ xa. Xử lý VM như “máy tính” của agent. |
daytona / modal |
Sandboxes không máy chủ cho sản xuất. Tự động khởi tạo. |
singularity |
Các cụm HPC. |
Cùng một công cụ, phạm vi tác động khác nhau. Agent không biết – chỉ có môi trường thay đổi.
6.4. Các Công Cụ Cấp Agent 🤖
Một vài công cụ (todo_*, memory_*, skill_manage, skills_list, skill_view) được chặn trước khi điều phối công cụ chung và được agent tự xử lý, vì chúng thay đổi trạng thái của agent (bộ nhớ, kỹ năng, danh sách việc cần làm) thay vì thế giới bên ngoài. Giữ danh mục này nhỏ và rõ ràng.
6.5. Tích Hợp MCP 🔗
Các máy chủ Model Context Protocol có thể được cắm vào làm các nguồn công cụ bổ sung. Hermes coi mỗi máy chủ MCP là một bộ công cụ ảo, cho phép người dùng lọc các công cụ riêng lẻ và điều phối các lệnh gọi thông qua cùng một registry. Đây là cách bạn có được một loạt các tích hợp (GitHub, Slack, Linear, …) mà không cần tự viết chúng.
6.6. Phê Duyệt & An Toàn Công Cụ (Hệ thống phòng thủ nhiều lớp) 🛡️
Các công cụ shell rất nguy hiểm. Hermes sử dụng bốn cơ chế phòng vệ:
- Tirith — một trình quét bên ngoài dựa trên Rust với tính năng tự cài đặt + xác minh SHA-256. Phát hiện các URL homograph, tấn công chèn vào terminal (các ký tự thoát ANSI ẩn lệnh) và các mẫu nguy hiểm đã biết.
- Phát hiện lệnh nguy hiểm bằng Regex — chạy trên một chuỗi lệnh đã chuẩn hóa (không phân biệt chữ hoa chữ thường, loại bỏ khoảng trắng) để kẻ tấn công không thể vượt qua bằng cách sử dụng
RM -RF. - Smart Approval — một LLM đánh giá rủi ro của từng lệnh. Các lệnh rủi ro thấp tự động được phê duyệt; các lệnh trung bình/cao bị chặn để con người phê duyệt.
- Phạm vi phê duyệt — khi con người phê duyệt, họ chọn Một lần / Phiên / Vĩnh viễn. Sự tin cậy tích lũy thay vì hỏi trên mỗi lệnh gọi.
Khi agent đang chạy trên một gateway nhắn tin và cần phê duyệt, nó sử dụng một threading.Event để chặn cho đến khi con người phản hồi trong cuộc trò chuyện. Một lệnh /yolo bỏ qua hoàn toàn việc phê duyệt cho các phiên đáng tin cậy. Các backend được sandbox tự động bỏ qua phê duyệt (sandbox Docker/Modal là ranh giới an toàn; nhắc nhở hai lần chỉ gây ma sát).
🧠 7. Hệ Thống Kỹ Năng (Tính Năng Đột Phá)
7.1. Một Kỹ Năng Là Gì? 📄
Một kỹ năng là một tài liệu markdown với frontmatter YAML dạy agent cách làm tốt một việc. Không phải mã. Không phải cấu hình. Mà là một sổ tay hướng dẫn mà agent đọc.
---
name: deploy-staging
description: Push current branch to staging via Vercel and verify health.
version: 1.2.0
platforms: [macos, linux]
requires_toolsets: [shell, web]
fallback_for_toolsets: []
required_environment_variables: [VERCEL_TOKEN]
tags: [deploy, vercel]
category: devops
---
## Khi Nào Nên Sử Dụng
Người dùng yêu cầu "ship", "deploy lên staging", hoặc "xem trước branch này".
## Quy Trình
1. Chạy `git status` — hủy bỏ nếu có thay đổi chưa commit.
2. Chạy `vercel --token=$VERCEL_TOKEN`.
3. Kiểm tra `/healthz` cho đến khi 200 HOẶC hết thời gian chờ 60 giây.
4. Báo cáo URL xem trước.
## Cạm Bẫy
- Không deploy từ `main` — chỉ từ các feature branch.
- Nếu build thất bại, lấy log qua `vercel logs <deployment>`.
## Xác Minh
Điểm cuối healthz trả về `{"status":"ok"}`.
7.2. Nơi Lưu Trữ Kỹ Năng 📁
~/.hermes/skills/
├── devops/deploy-staging/
│ ├── SKILL.md ← tệp trên
│ ├── references/ ← tài liệu bổ sung mà kỹ năng có thể kéo vào
│ ├── templates/ ← mẫu tệp
│ ├── scripts/ ← script trợ giúp mà agent có thể chạy
│ └── assets/ ← hình ảnh, v.v.
├── .hub/ ← được cài đặt từ skills hub
└── .bundled_manifest ← những gì được cung cấp cùng với Hermes
7.3. Tiết Lộ Dần Dần (3 Cấp Độ) 🔍
Đây là cách giữ cho việc sử dụng token hợp lý:
| Cấp độ | Nội dung tải | Khi nào |
|---|---|---|
| 0 | tên, mô tả, danh mục | Luôn luôn — trong system prompt |
| 1 | nội dung đầy đủ của SKILL.md | Khi agent quyết định sử dụng kỹ năng |
| 2 | các tệp trong references/, scripts/ |
Khi nội dung kỹ năng nói “xem references/foo.md” |
Agent gọi một công cụ read_skill (hoặc tương đương) để leo từ L0 lên L1 rồi L2.
7.4. Kích Hoạt ⚡
Ba cách một kỹ năng được kích hoạt:
- Lệnh slash — người dùng gõ
/deploy-staging please ship #123. - Ngôn ngữ tự nhiên — “deploy cái này lên staging”; agent khớp với mô tả L0 và kéo vào L1.
- Lập trình — các tác vụ cron rõ ràng gắn kèm kỹ năng.
7.5. Kích Hoạt Có Điều Kiện 🎛️
Các trường frontmatter kiểm soát khả năng hiển thị:
platforms: [linux]— bị ẩn trên macOS.fallback_for_toolsets: [web]— chỉ hiển thị nếu không có công cụ web cao cấp nào được bật (ví dụ: một kỹ năng DuckDuckGo sẽ được sử dụng khi Brave Search không được cấu hình).requires_toolsets: [shell]— bị ẩn nếu công cụ shell bị tắt.
Điều này làm cho danh mục kỹ năng thích ứng với môi trường triển khai.
7.6. Tự Cải Thiện: Công Cụ skill_manage 🔁
Agent sử dụng hai công cụ bổ trợ:
- Đường dẫn đọc:
skills_list(duyệt chỉ mục Cấp độ 0) vàskill_view(leo lên nội dung Cấp độ 1/2). - Đường dẫn ghi:
skill_manage, một công cụ meta với các thao tác con:
| Hành động | Hiệu quả |
|---|---|
create |
Kỹ năng mới từ đầu |
patch |
Thay thế văn bản có chọn lọc (được ưu tiên cho các bản cập nhật) |
edit |
Viết lại hoàn toàn |
delete |
Xóa kỹ năng (chỉ giới hạn ở các kỹ năng do người dùng/agent tạo — không thể xóa các kỹ năng được đóng gói sẵn) |
Lưu ý: quản lý tệp trong một kỹ năng (references/, scripts/) đi qua các công cụ write_file / remove_file chung được giới hạn trong thư mục của kỹ năng.
Khối SKILLS_GUIDANCE trong system prompt rõ ràng thúc đẩy agent tạo một kỹ năng sau khi:
- Giải quyết một tác vụ mất hơn 5 lệnh gọi công cụ.
- Tìm ra một cách giải quyết không rõ ràng.
- Phát hiện ra một quy trình làm việc có thể lặp lại.
Việc cài đặt kỹ năng từ hub chỉ do người dùng điều khiển (bảo mật). Agent không bao giờ tự cài đặt các kỹ năng không đáng tin cậy – nó chỉ có thể skill_manage create từ kinh nghiệm của riêng mình.
Đây là vòng lặp học tập khép kín. Agent tự viết sổ tay hướng dẫn của mình trong khi làm việc.
7.7. Trung Tâm Kỹ Năng & Chia Sẻ 🌐
Kỹ năng là tài liệu markdown di động – chúng dễ dàng chia sẻ. Hermes tích hợp với nhiều nguồn (official/, skills-sh/, github/, well-known/, url, clawhub, lobehub). Khi cài đặt, mỗi kỹ năng được quét bảo mật để phát hiện prompt injection, rò rỉ dữ liệu và các lệnh phá hoại trước khi được tin cậy. Các cấp độ tin cậy: builtin > official > community.
Định dạng là tiêu chuẩn mở agentskills.io – nghĩa là các kỹ năng được viết cho Hermes hoạt động trong các agent tương thích khác.
💾 8. Hệ Thống Bộ Nhớ
Ba cơ chế độc lập hoạt động cùng nhau (khung “3 lớp” là một sự đơn giản hóa trong giảng dạy – trong mã chúng là các thành phần trực giao):
8.1. Cơ Chế 1 — Bộ Nhớ Liên Tục Ảnh Chụp Đông Lạnh 🧊
Hai tệp markdown, cả hai đều do agent quản lý:
MEMORY.md— các sự kiện. “Dự án xuất xưởng vào mỗi thứ Ba.” “Mật khẩu cơ sở dữ liệu thử nghiệm nằm trong vault 1Password X.” (Giới hạn ~2200 ký tự)USER.md— mô hình người dùng. “Thích câu trả lời ngắn gọn.” “Kỹ sư Go cấp cao, mới làm quen với React.” (Giới hạn ~1375 ký tự)
Một MemoryStore đọc chúng một lần khi bắt đầu phiên và nhúng chúng vào system prompt dưới dạng một khối bất biến duy nhất (phân tách bằng §). Agent có thể ghi vào các tệp đó giữa phiên (và các ghi này sẽ được ghi vào đĩa), nhưng bản sao của system prompt không thay đổi cho đến phiên tiếp theo. Đây là điều giúp cache tiền tố hợp lệ.
8.2. Cơ Chế 2 — Gợi Nhớ Giữa Các Phiên Qua SessionDB 🗃️
Một SessionDB (SQLite, chế độ WAL, chỉ mục toàn văn FTS5) lưu trữ mọi lượt trò chuyện trước đó. Khi cần, agent sử dụng công cụ session_search để truy vấn nó; một công cụ tóm tắt LLM cô đọng các kết quả thành một đoạn văn phù hợp với ngữ cảnh. Tranh chấp ghi đa tiến trình được xử lý bằng BEGIN IMMEDIATE + một vòng lặp thử lại tùy chỉnh (dao động 20–150 ms).
8.3. Cơ Chế 3 — Nhà Cung Cấp Có Thể Cắm (Honcho / mem0 / supermemory) 🔌
Đây là một cơ chế hoán đổi, không phải một lớp bổ sung. Một MemoryProvider ABC duy nhất (agent/memory_provider.py); điều phối qua agent/memory_manager.py. Các hook vòng đời: prefetch() (trước khi gọi mô hình), sync_turn() (sau lượt), shutdown().
Các cài đặt quan trọng của nhà cung cấp:
- Chế độ gợi nhớ:
hybrid/context/tools. Chế độ công cụ cho phép mô hình quyết định khi nào truy vấn; chế độ ngữ cảnh chỉ chèn các bộ nhớ liên quan vào mỗi lượt. - Tần suất ghi:
async/turn/session/ số (mỗi N lượt).
“Biện chứng” của Honcho đáng được lưu ý vì nó nghe có vẻ huyền bí nhưng không phải: nó chạy ba lần suy luận tuần tự – Đánh giá ban đầu → Tự kiểm tra → Hòa giải – độ sâu được kiểm soát bởi dialecticDepth (1–3). Nó thực sự là sự tự phê bình được xâu chuỗi để tạo ra mô hình người dùng chất lượng cao hơn.
Bạn chỉ có một nhà cung cấp hoạt động tại một thời điểm. Chọn lớp trừu tượng phù hợp cho trường hợp sử dụng của bạn (Honcho cho mô hình người dùng sâu sắc, mem0/supermemory cho gợi nhớ vector, không có nếu tệp + FTS5 là đủ).
🔌 9. Hệ Thống Plugin
Một PluginManager phát hiện các plugin từ ba nơi:
~/.hermes/plugins/(cấp độ người dùng)./.hermes/plugins/(cấp độ dự án)- Các điểm vào pip (
hermes.plugins)
Mỗi plugin định nghĩa một hàm register(ctx) và có thể móc vào các sự kiện vòng đời:
pre_tool/post_toolpre_llm/post_llmsession_start/session_end
…và có thể đăng ký các công cụ mới, các lệnh CLI mới hoặc thay thế các nhà cung cấp bộ nhớ.
Quy tắc bất di bất dịch: các plugin KHÔNG BAO GIỜ được sửa đổi các tệp lõi. Nếu một plugin cần thứ gì đó mà framework không hiển thị, framework sẽ phát triển một hook chung – không phải một import đặc biệt. Điều này giữ cho bề mặt plugin ổn định.
📋 9b. Mẫu COMMAND_REGISTRY (Đáng để học hỏi)
Một hằng số COMMAND_REGISTRY duy nhất trong hermes_cli/commands.py là nguồn chân lý cho mọi lệnh slash. Từ cấu trúc này, codebase tự động suy ra:
- Điều phối CLI
- Các hook Gateway (để
/skill foohoạt động trong Telegram) - Các mục menu nội tuyến của Telegram
- Các subcommand slash của Slack
- Tự động hoàn thành
prompt_toolkit - Văn bản
/help
Thêm một lệnh slash mới chỉ cần một mục nhập CommandDef mới cùng với một handler. Không có chỉnh sửa phân tán. Đây là cùng một mẫu với registry công cụ, được áp dụng cho các lệnh UI. Hãy học hỏi nó cho dự án của riêng bạn – đây là cách Hermes mở rộng diện tích bề mặt mà không tăng chi phí bảo trì.
🎨 9c. Skin Engine (Tạo chủ đề dưới dạng dữ liệu)
Các tệp YAML trong ~/.hermes/skins/ (với kế thừa từ default). Một tệp YAML kiểm soát 18 màu được đặt tên, khuôn mặt và động từ của spinner, tên và lời chào/tạm biệt của agent, biểu tượng prompt, emoji công cụ, banner ASCII với đánh dấu Rich. Mười skin tích hợp sẵn (default, daylight, mono, poseidon, charizard, …). Hermes Mod cung cấp một trình chỉnh sửa web với bản xem trước trực tiếp và chuyển đổi hình ảnh sang ASCII.
Điểm mấu chốt về kiến trúc là: thương hiệu nằm trong YAML, không phải mã. Người dùng có thể chỉnh sửa giao diện mà không cần chạm vào Python. Điều này quan trọng hơn bạn nghĩ đối với một agent mà người dùng dành hàng giờ để sử dụng.
📡 9d. Đa Phương Tiện & Phát Trực Tiếp
- Thị giác: công cụ
vision_analyze. Cache dự phòng chuyển đổi hình ảnh thành văn bản của Anthropic qua_anthropic_image_fallback_cache(khi một mô hình không thể xem hình ảnh gốc, cache tránh mô tả lại chúng). - Âm thanh đầu ra: công cụ
text_to_speech. - Âm thanh đầu vào: chuyển đổi ghi âm giọng nói ở phía đầu vào.
- Công cụ trình duyệt: chèn ngữ cảnh đa phương tiện (ảnh chụp màn hình + DOM + văn bản được trích xuất).
- Phát trực tiếp:
_stream_callback,_current_streamed_assistant_text, cộng với_stream_context_scrubbercó trạng thái loại bỏ các đoạn<memory-context>ngay cả khi chúng bị phân tách qua các chunk.
🎓 9e. Tích Hợp Đào Tạo RL / Atropos (environments/)
Đây có thể nói là mục đích của dự án đối với Nous Research, không phải là một tính năng phụ. Thư mục environments/ gói gọn Hermes để đào tạo học tăng cường:
HermesAgentBaseEnv— trừu tượng hóa việc giải quyết công cụ và kết nối sandbox.HermesAgentLoop— chạy vòng lặp gọi công cụ theo cách mà các lần chạy thử RL có thể điều khiển.ToolContext— hiển thị sandbox cho các hàm thưởng (để phần thưởng có thể grep hệ thống tệp để xác minh agent đã thực hiện công việc).resize_tool_pool— ngăn chặn các deadlock của thread-pool trong quá trình chạy thử song song.- Pipeline đào tạo hai pha:
- Pha 1: Phân tích cú pháp lệnh gọi công cụ gốc của VLLM/SGLang.
- Pha 2: Phân tích cú pháp token thô của
ManagedServer— cần thiết cho các thẻ công cụ kiểu XML của Hermes và các dấu phân cách Unicode của DeepSeek.
- Ngân sách kết quả công cụ ba lớp: cắt bớt theo công cụ → tràn sandbox với bản xem trước → ngân sách theo lượt. Nếu không có điều này, một lệnh
ls /duy nhất sẽ làm đầy cửa sổ ngữ cảnh của một lần chạy thử đào tạo. - Các điểm chuẩn được tích hợp sẵn: TerminalBench 2.0, YC-Bench, WebResearch.
Bạn có thể không cần điều này cho phiên bản v1 của agent của riêng mình. Chỉ cần biết rằng các hook đã có sẵn nếu bạn muốn tinh chỉnh mô hình của mình trên các dấu vết của chính nó.
🖥️ 10. Giao Diện Người Dùng (Cách Agent Tiếp Cận Người Dùng)
Cùng một AIAgent cung cấp sức mạnh cho sáu giao diện riêng biệt. Mỗi giao diện là một adapter mỏng, không phải là một triển khai lại.
10.1. CLI (Cổ Điển) 💻
cli.py (~11k dòng). Các panel dựa trên Rich, đầu vào prompt_toolkit với tự động hoàn thành, các spinner hoạt hình (KawaiiSpinner), nguồn cấp dữ liệu hoạt động trong các lệnh gọi API.
10.2. TUI (hermes --tui) — Thật Sự Độc Đáo 🖼️
Không chỉ là một CLI đẹp mắt hơn. Kiến trúc:
- Frontend: Node.js + React Ink.
- Backend: Python
tui_gateway/server.py. - Định dạng dây: JSON-RPC 2.0 qua stdio được phân tách bằng dòng mới.
Phía Python chuyển hướng print đến stderr để stdout giữ sạch cho giao thức. Một tiến trình con _SlashWorker liên tục chạy các lệnh slash, và các handler chậm được định tuyến qua một ThreadPoolExecutor để các ngắt vẫn phản hồi. Các tính năng đặc biệt: chuỗi suy nghĩ phát trực tiếp với spinner chữ nổi, một hình ảnh hóa cây ToolTrail, viewport lịch sử ảo (chỉ hiển thị các hàng nhìn thấy), lựa chọn bằng chuột.
Quy tắc thiết kế từ AGENTS.md: Không triển khai lại giao diện trò chuyện trong React. Bản ghi, trình soạn thảo và hành vi lệnh slash thuộc về TUI được nhúng. Các thanh bên và trình kiểm tra là được – các chế độ xem thay thế thì không.
10.3. Gateway (Nền Tảng Nhắn Tin) 📨
Telegram, Discord, Slack, WhatsApp, Signal. Mỗi adapter:
- Kết nối với nền tảng (websocket / long-poll / webhook).
- Khi có tin nhắn đến: ủy quyền người dùng, lấy ra một
session_keyổn định, tra cứu phiên trong SessionDB, khởi tạo mộtAIAgentvới lịch sử đó. - Gọi
agent.run_conversation(). - Định dạng và gửi phản hồi trở lại (MarkdownV2 của Telegram so với định dạng của Discord so với mrkdwn của Slack — điều này nằm trong adapter).
10.4. ACP (Giao Thức Client Agent) — Cho các Editor AI-native 🔗
ACP là giao thức tiêu chuẩn mà Zed và các tích hợp VS Code mới nổi sử dụng để nói chuyện với các agent. Hermes triển khai HermesACPAgent. Các phiên ACP được gắn với cwd của editor và duy trì trong cùng một SessionDB được chia sẻ. Các công cụ Hermes ánh xạ tới các kiểu ngữ nghĩa ACP (ví dụ: read_file → read), và IDE có thể đăng ký các máy chủ MCP mà agent sau đó coi là các bộ công cụ bổ sung.
10.5. Web UI (hermes web) 🌐
React SPA trong web/ + FastAPI trong hermes_cli/web_server.py. Các tab: Trạng thái, Phiên (UI tìm kiếm FTS5), Cấu hình (biểu mẫu + YAML thô), Cron, Kỹ năng. Bảo mật: token phiên tạm thời, bảo vệ chống DNS rebinding, CORS, giới hạn tốc độ. Hỗ trợ bản địa hóa EN/中文.
10.6. Bộ Lập Lịch Cron (~/.hermes/cron/) ⏰
Không phải APScheduler. Một bộ lập lịch tùy chỉnh với vòng lặp tick() 60 giây chạy trên một luồng nền bên trong tiến trình gateway. Các tác vụ được lưu trữ dưới dạng JSON trong ~/.hermes/cron/jobs.json (không phải SQLite). Đầu ra được duy trì tại ~/.hermes/cron/output/{job_id}/{timestamp}.md.
Định nghĩa tác vụ hỗ trợ:
- Khoảng thời gian (
every 30m), cron 5 trường, thời lượng một lần, dấu thời gian ISO. - Một trường
prompt(tin nhắn người dùng để gửi). - Một danh sách
skillstùy chọn để gắn kèm trước khi thực thi (để một tác vụ cron “review-PRs” có thể tải trước kỹ năngpr-review). - Mục tiêu phân phối:
local(chỉ ghi),origin(trở lại nơi tác vụ được tạo), hoặcplatform:chat_id(đăng lên một cuộc trò chuyện Telegram/Slack cụ thể).
Mỗi lần tick: một AIAgent mới không có lịch sử được tạo, các kỹ năng gắn kèm được tải, prompt chạy, đầu ra được phân phối, trạng thái tác vụ được cập nhật.
10.7. Batch Runners (Pipeline Dữ Liệu Đào Tạo) 🏭
Hai thành phần liên quan trong thư mục gốc của kho:
batch_runner.py—BatchRunnerquamultiprocessing.Pool, mộtAIAgentcô lập cho mỗi worker.toolset_distributions.pylấy mẫu các bộ công cụ cho mỗi prompt bằng các xác suất bao gồm độc lập. Checkpointing trongcheckpoint.jsonđược khóa theo văn bản prompt, không phải chỉ mục (để các chỉnh sửa danh sách prompt không làm mất hiệu lực checkpoint). Đầu ra các quỹ đạo được định dạng cho HuggingFace; suy luận được phát hiện qua các thẻ<REASONING_SCRATCHPAD>hoặc các token suy nghĩ gốc — các quỹ đạo không có suy luận sẽ bị loại bỏ.mini_swe_runner.py— runner tương tự cho các lần chạy benchmark kiểu SWE.
Đây là cách Nous tạo dữ liệu đào tạo từ các lần chạy agent thực tế.
👤 11. Hồ Sơ & Đa Phiên Bản
Bạn muốn chạy một agent “cá nhân” và một agent “công việc” trên cùng một máy mà không làm lẫn lộn bộ nhớ của chúng? Đó là lúc hồ sơ phát huy tác dụng.
Việc triển khai rất đơn giản nhưng thời điểm là cực kỳ quan trọng:
- Mỗi hồ sơ có thư mục
HERMES_HOMEriêng. _apply_profile_override()tronghermes_cli/main.pyđặtHERMES_HOMEtrước khi bất kỳ module nào khác được import. Nếu bạn đặt nó sau khi import, các module đọc đường dẫn tại thời điểm import sẽ sử dụng thư mục gốc sai.- Mọi tra cứu đường dẫn đều đi qua
get_hermes_home(). Các đường dẫn~/.hermesđược mã hóa cứng ở bất kỳ đâu trong codebase sẽ phá vỡ sự cô lập hồ sơ.
Những điều cần thực hiện đúng:
- Các bài kiểm tra phải giả lập cả
Path.home()và biến môi trườngHERMES_HOME— thiếu một trong hai sẽ dẫn đến các lỗi không ổn định. - Các adapter Gateway sử dụng khóa token trên mỗi hồ sơ để hai hồ sơ không thể cùng lúc cố gắng sử dụng cùng một token bot Telegram.
- Các định danh Honcho (và các ID nhà cung cấp bộ nhớ khác) được giới hạn theo hồ sơ — đừng chia sẻ chúng giữa các hồ sơ hoặc bạn sẽ làm lẫn lộn các mô hình người dùng.
⚙️ 12. Cấu Hình & Bí Mật
Ba cài đặt, ba vị trí:
| Nội dung | Vị trí | Lý do |
|---|---|---|
| Mô hình, bộ công cụ, backend terminal, skin | config.yaml |
Không bí mật, được kiểm soát phiên bản cùng với hồ sơ |
| Khóa API, token | .env |
Bí mật, không bao giờ được ghi log |
| Cài đặt trên mỗi kỹ năng | config.yaml của mỗi kỹ năng |
Cục bộ cho kỹ năng |
Ba bộ tải cấu hình (load_cli_config, load_config, YAML trực tiếp) tồn tại vì CLI/công cụ/thời gian chạy gateway có những nhu cầu khác biệt tinh tế. Đừng hợp nhất chúng quá sớm – việc trùng lặp là có chủ ý.
💰 13. Cache Prompt (Câu chuyện về chi phí)
Đây là lý do lớn nhất khiến agent của bạn sẽ rẻ hoặc đắt trong môi trường sản xuất.
Nên làm:
- Xây dựng system prompt một lần mỗi phiên.
- Chèn các điểm ngắt cache cụ thể cho nhà cung cấp (Anthropic:
cache_control: {type: "ephemeral"}trên tin nhắn tĩnh cuối cùng trong tiền tố). - Sử dụng mẫu ảnh chụp nhanh đóng băng cho bộ nhớ: đọc các tệp MEMORY/USER một lần khi bắt đầu phiên và nhúng chúng bất biến ngay cả khi chúng thay đổi trên đĩa sau đó.
- Hoãn các thay đổi cấu hình (“bật/tắt bộ công cụ”, “chuyển đổi mô hình”) đến phiên tiếp theo. Các lệnh slash thay đổi trạng thái nên chấp nhận cờ
--nowtùy chọn nếu việc vô hiệu hóa thực sự cần thiết, nhưng mặc định là trì hoãn.
Không nên làm:
- Tải lại bộ nhớ giữa cuộc trò chuyện.
- Thêm/xóa công cụ giữa cuộc trò chuyện.
- Thay đổi system prompt vì người dùng “chuyển chủ đề”.
- Làm cho system prompt phụ thuộc vào thời gian hiện tại, ID ngẫu nhiên hoặc bất kỳ thứ gì thay đổi theo từng lượt.
Một tiền tố được cache rẻ hơn khoảng 10 lần khi đọc so với ghi. Với một tiền tố ổn định, một cuộc trò chuyện 10 lượt tốn khoảng 1.5 lần so với một lượt duy nhất. Với một tiền tố không ổn định, nó tốn 10 lần.
🗺️ 14. Xây Dựng Agent Của Riêng Bạn — Danh Sách Kiểm Tra Cụ Thể
Đây là những gì cần xây dựng, theo thứ tự tôi sẽ xây dựng nó. Mỗi bước có thể được xuất xưởng độc lập.
🌱 Giai đoạn 1 — Vòng lặp (Ngày 1–2)
- Chọn một ngôn ngữ (Python là thứ Hermes sử dụng; Go cũng hoạt động – xem thư mục
backend-go/của repo bạn). - Triển khai
AIAgent.run_conversation(messages) -> messages:- Gọi mô hình.
- Nếu phản hồi có lệnh gọi công cụ, điều phối từng lệnh, thêm một tin nhắn kết quả công cụ, lặp lại.
- Ngược lại, trả về tin nhắn trợ lý cuối cùng.
- Thêm một
IterationBudget(mặc định: 25 lệnh gọi công cụ mỗi lượt người dùng). Một lượt ưu tiên khi hết. - Bọc mỗi lệnh gọi công cụ trong try/except — trả về lỗi dưới dạng kết quả công cụ, không bao giờ gây ra lỗi ngoài vòng lặp.
Bây giờ bạn đã có một “chatbot sử dụng công cụ”. Đây là 80% của bất kỳ agent nào.
💻 Giai đoạn 2 — CLI (Ngày 3)
- Xây dựng một CLI mỏng: đọc dòng, gọi
run_conversation, in phản hồi, lặp lại. - Thêm xử lý ngắt Ctrl-C để hủy công cụ đang chạy một cách sạch sẽ.
- Lưu trữ các phiên vào SQLite. Thêm một bảng ảo FTS5 trên cột văn bản tin nhắn.
🛠️ Giai đoạn 3 — Registry Công cụ (Ngày 4–5)
- Tạo một lớp
Registryvớiregister(name, toolset, schema, handler, available). - Tự động nhập mọi tệp trong thư mục
tools/để các module công cụ có thể tự đăng ký. - Triển khai 5 công cụ khởi đầu:
read_file,write_file,list_dirrun_shell(bắt đầu với chỉ cục bộ)web_fetch
- Thêm một cấu hình
terminal.backendđể hoán đổirun_shellgiữa cục bộ / docker / ssh.
💾 Giai đoạn 4 — Bộ nhớ & Persona (Ngày 6)
- Thêm các tệp
~/.youragent/{SOUL.md, MEMORY.md, USER.md}. - Trong
build_system_prompt(), nhúng chúng theo thứ tự đó. - Thêm các công cụ cấp agent
memory_append,memory_replace,memory_deleteđể agent có thể cập nhật chúng.
🧠 Giai đoạn 5 — Kỹ năng (Ngày 7–10) ← Phép thuật
- Xác định đặc tả frontmatter SKILL.md (sao chép của Hermes – nó đã là một tiêu chuẩn mở).
- Khi khởi động, quét
~/.youragent/skills/**/SKILL.mdvà phát ra các mục Cấp độ 0 (tên + mô tả) vào system prompt. - Thêm các công cụ:
read_skill(name)→ trả về nội dung SKILL.md đầy đủ (Cấp độ 1).read_skill_file(name, path)→ trả về các tệp được tham chiếu (Cấp độ 2).skill_manage(action, name, ...)→create | patch | edit | delete.
- Trong system prompt của bạn, thêm các lời nhắc rõ ràng: “Khi bạn hoàn thành một tác vụ khó, hãy viết một kỹ năng để bạn không phải tìm cách giải quyết lại.” Câu này biến một chatbot thành một agent tự cải thiện.
💰 Giai đoạn 6 — Cache Prompt (Ngày 11)
- Chọn một nhà cung cấp chính (cache của Anthropic là hào phóng nhất).
- Đánh dấu cuối system prompt là một điểm ngắt cache.
- Kiểm tra mọi đường dẫn mã chạm vào
agent.system_prompt— đảm bảo không có đường dẫn nào kích hoạt giữa cuộc trò chuyện. - Thêm một bài kiểm tra CI khẳng định system prompt là giống hệt nhau ở lượt 1 và lượt 10.
📨 Giai đoạn 7 — Gateways (Ngày 12+)
- Xây dựng một adapter (Telegram là dễ nhất –
python-telegram-bothoặc tương đương). - Trách nhiệm của adapter: xác thực, lấy khóa phiên, tải xuống tệp đính kèm, định dạng phản hồi.
- Xác minh: cùng một agent, cùng kỹ năng, cùng bộ nhớ, truy cập từ CLI và Telegram, thấy cùng các cập nhật bộ nhớ.
🔗 Giai đoạn 8 — MCP (Ngày 14+)
- Thêm một client MCP. Mỗi máy chủ MCP trở thành một bộ công cụ ảo trong registry của bạn.
- Bây giờ bạn có GitHub, Slack, Linear, Postgres, Notion, v.v. miễn phí.
✨ Giai đoạn 9 — Hồ sơ & Hoàn thiện
- Định tuyến mọi đường dẫn hệ thống tệp qua một hàm trợ giúp
get_home(). Thêm cờ--profileđể đặt thư mục gốc trước khi import. - Thêm một bộ nén ngữ cảnh (LLM tóm tắt các lượt giữa khi cuộc trò chuyện vượt quá N token).
- Thêm một trình chạy cron tải các tác vụ từ
~/.youragent/cron.yamlvà chạy chúng mà không có lịch sử.
Đó là toàn bộ sản phẩm. Khoảng 2–3 tuần làm việc tập trung cho một kỹ sư.
⚡ 15. Ngăn Xếp Công Nghệ Khuyến Nghị
Những gì Hermes sử dụng, và những gì tôi sẽ hoán đổi.
| Vấn đề | Lựa chọn của Hermes | Thay thế hợp lý |
|---|---|---|
| Ngôn ngữ | Python 3.11+ | Go (khởi động CLI nhanh hơn, một binary duy nhất), TypeScript (web-native) |
| Render CLI | rich + prompt_toolkit |
bubbletea (Go), ink (TS) |
| TUI | Node.js + Ink, JSON-RPC sang Python | Tương tự, hoặc một ngăn xếp ngôn ngữ duy nhất |
| Lưu trữ | SQLite + FTS5 | Tương tự. Đừng phức tạp ở đây. |
| Bộ nhớ vector (tùy chọn) | Honcho / mem0 / supermemory | pgvector, Chroma, Qdrant |
| Sandbox | Docker / Modal / Daytona | Firecracker, gVisor, E2B |
| MCP | Python MCP SDK | SDK chính thức của Anthropic |
| Cấu hình | YAML | TOML nếu bạn thích |
Các lựa chọn “nhàm chán” (SQLite, tệp markdown, lược đồ JSON) không phải là ngẫu nhiên. Hãy chống lại sự cám dỗ “nâng cấp” chúng – mỗi nơi Hermes sử dụng một thứ gì đó “nhàm chán”, đó là vì nó tích hợp một cách dễ dàng với các công cụ của chính agent (agent có thể cat MEMORY.md và suy luận về nó).
⚠️ 16. Những Cạm Bẫy Bạn Sẽ Gặp
Liệt kê theo thứ tự bạn sẽ gặp phải:
- Lỗi công cụ làm sập vòng lặp. Bọc mọi handler trong try/except, trả về lỗi cho mô hình.
- Prompt phá vỡ cache. Một
datetime.now()trong system prompt sẽ lặng lẽ phá hủy mô hình chi phí của bạn. Kiểm tra sớm. - Vòng lặp công cụ vô hạn. Nếu không có ngân sách lặp, một mô hình sẽ vui vẻ gọi
list_dir400 lần. Hãy giới hạn cứng nó. - Truy cập shell không giới hạn. Backend cục bộ là ổn cho phát triển; trong sản xuất, hãy sử dụng Docker với quyền root chỉ đọc và một không gian làm việc có thể ghi rõ ràng.
- Kỹ năng nói dối. Agent sẽ viết các kỹ năng tham chiếu đến các công cụ hoặc biến môi trường không tồn tại. Hãy làm cho việc xác thực
requires_toolsetsvàrequired_environment_variablestrở nên nghiêm ngặt tại thời điểm cài đặt. - Thối rữa tệp bộ nhớ. Agent sẽ thêm vào
MEMORY.mdmãi mãi. Thêm một lời nhắc nén định kỳ trong system prompt: “Nếu MEMORY.md vượt quá 500 dòng, hãy hợp nhất.” - Rò rỉ hồ sơ trong các bài kiểm tra. Một bài kiểm tra tạo tệp trong
~/.youragent/vì bạn quên giả lập thư mục gốc. Giả lập cảPath.home()VÀ biến môi trường gốc của bạn. - Chuyển đổi bộ công cụ giữa cuộc trò chuyện. Người dùng gõ
/toolsvà thay đổi cài đặt. Hãy nói với họ “áp dụng cho phiên tiếp theo” – đừng phá vỡ cache. - Điều kiện chạy đua qua các gateway. Hai tin nhắn Telegram đến trong 100ms. Sử dụng khóa trên mỗi phiên.
- Mất nội dung suy luận. OpenAI o-series và Claude extended thinking phát ra các khối suy luận phải được giữ trong lịch sử (hoặc bị loại bỏ theo cùng một quy tắc ở mỗi lượt) – sự không nhất quán làm hỏng cache.
💡 17. Mô Hình Tư Duy Trong Một Câu
Một agent kiểu Hermes là một vòng lặp tự điền vào tủ hồ sơ của chính nó: nó đọc từ skills/ và MEMORY.md để thực hiện công việc của mình, và ghi lại vào chính các tệp đó khi nó học được điều gì đó — và mọi hệ thống khác (công cụ, gateway, nhà cung cấp, plugin, hồ sơ) đều tồn tại để làm cho vòng lặp đó nhanh hơn, an toàn hơn và có thể tiếp cận từ nhiều nơi hơn.
Xây dựng vòng lặp, xây dựng tủ hồ sơ, cung cấp cho nó một công cụ để chỉnh sửa tủ hồ sơ, và nói với nó (trong system prompt) rằng nó được phép làm điều đó. Mọi thứ khác chỉ là giàn giáo.
📚 18. Tham Khảo
- Repo: github.com/nousresearch/hermes-agent
- Docs: hermes-agent.nousresearch.com/docs
- Architecture page: hermes-agent.nousresearch.com/docs/developer-guide/architecture
- Skills format spec: agentskills.io
- Skills hub: agentskills.io
- DeepWiki overview: deepwiki.com/NousResearch/hermes-agent
Đọc thêm 🏗️ Xây Dựng Các Agent AI Chất Lượng Cao 🤖 — Hướng Dẫn Thực Địa Toàn Diện, Có Thể Hành Động 📚
Nếu bạn thấy bài viết này hữu ích, hãy cho tôi biết bằng cách để lại 👍 hoặc một bình luận! Hoặc nếu bạn nghĩ bài viết này có thể giúp ích cho ai đó, đừng ngần ngại chia sẻ nó nhé! Cảm ơn bạn rất nhiều! 😃



