Content hay mà đăng sai giờ, sai kênh thì lãng phí. Bài này biến agent thành một scheduling & publishing agent biết chọn thời điểm, định dạng lại theo kênh và đẩy bài qua API.
Tách "tạo" khỏi "đăng"
Nguyên tắc kiến trúc: content agent tạo → đẩy vào queue → publishing agent đăng theo lịch. Tách rời giúp bạn duyệt trước và tránh sự cố "đăng nhầm hàng loạt".
[Content Agent] --> review_queue --> [Người duyệt] --> approved_queue
|
[Scheduler] --+
v
[Publishing Agent] -> Kênh
Repurposing: một bài, nhiều định dạng
Đừng viết lại từ đầu cho mỗi kênh. Cho agent một atomic content rồi định dạng lại:
repurpose(master_article, channel):
facebook -> caption 120 từ + 3 hashtag + emoji nhẹ
linkedin -> góc nhìn chuyên môn, 200 từ, không hashtag lố
email -> subject line + preheader + 150 từ + 1 CTA
short -> kịch bản video 30s, 5 câu thoại
Mỗi kênh có ràng buộc riêng (độ dài, giọng, hashtag). Đưa ràng buộc vào prompt để agent không bê nguyên bài blog lên Facebook.
Chọn thời điểm dựa trên dữ liệu
Đừng đăng theo cảm tính. Cho agent tool đọc lịch sử tương tác:
def best_time(channel, audience_tz="Asia/Ho_Chi_Minh"):
# Đọc engagement lịch sử theo khung giờ
stats = analytics.hourly_engagement(channel, days=90)
top = sorted(stats, key=lambda x: x["rate"], reverse=True)[:3]
return [slot["hour"] for slot in top]
# Agent dùng để đề xuất lịch, KHÔNG tự chốt nếu trùng khung nhạy cảm
Lưu ý múi giờ: khách VN nhưng nền tảng lưu UTC — sai múi giờ là lỗi kinh điển khiến bài đăng lúc 3h sáng. Ngoài ra, đừng để agent tự chốt lịch cho các khung giờ nhạy cảm (ví dụ ngay sau một sự kiện tiêu cực của thương hiệu); hãy để nó đề xuất và người duyệt chốt.
Xử lý lỗi API kênh
API nền tảng thường trả lỗi tạm thời (rate limit, timeout) hoặc lỗi vĩnh viễn (token hết hạn, nội dung bị chặn). Agent phải phân biệt hai loại này: lỗi tạm thời thì retry có giới hạn (ví dụ 3 lần, kèm exponential backoff); lỗi vĩnh viễn thì dừng ngay và báo người phụ trách, không retry vô ích. Trộn lẫn hai loại là nguồn gốc của các sự cố "đăng trùng" hoặc "dội request".
try_publish(post):
for attempt in range(3):
r = channel_api.post(post)
if r.ok: return r
if r.permanent_error: alert(r); break # token hết hạn -> dừng
wait(2 ** attempt) # backoff cho lỗi tạm
return "failed sau retry"
Idempotency: chống đăng trùng
Agent chạy lại (do lỗi mạng, retry) có thể đăng cùng bài 2 lần. Bắt buộc mỗi bài có khóa duy nhất:
publish(post):
key = hash(post.id + post.channel + post.scheduled_date)
if already_published(key):
return "skip: đã đăng"
result = channel_api.post(post)
mark_published(key)
Các bước triển khai
- Dựng
approved_queue(bảng/DB) chứa bài đã duyệt + thời điểm dự kiến. - Viết tool
repurpose(article, channel)với ràng buộc từng kênh. - Tích hợp API kênh (Facebook Graph, LinkedIn, ESP email, Buffer...).
- Thêm
best_timetừ dữ liệu tương tác, hiển thị đề xuất cho người duyệt. - Thêm khóa idempotency trước mọi lệnh publish.
- Log mọi lần đăng: kênh, thời gian, trạng thái, link.
Checklist trước khi bật publish tự động
- [ ] Có khóa idempotency chống đăng trùng
- [ ] Múi giờ khách hàng đã đúng
- [ ] Có cơ chế retry giới hạn (không retry vô hạn)
- [ ] Có "kill switch" tắt publishing khẩn cấp
- [ ] Log đầy đủ để truy vết bài đã đăng
- [ ] Nội dung đã qua duyệt, không phải draft thô
Sai lầm thường gặp
- Không có idempotency: retry sau lỗi mạng đăng trùng bài, phiền khách và hại thương hiệu.
- Bê nguyên bài blog lên mọi kênh: mỗi nền tảng có văn hóa riêng; không repurpose làm engagement thấp.
- Sai múi giờ: đăng lúc khách đang ngủ vì nhầm UTC với giờ VN.
- Không có kill switch: khi agent lỗi, không tắt kịp thì spam cả loạt bài sai.
- Retry vô hạn: một API lỗi tạm thời khiến agent gọi lại liên tục, dội request và tốn tiền.