[ blog · use-case ]8 min read

Xây dựng tác nhân tổng hợp tin sáng với News Search API

Sarah ChoyĐăng ngày 2 tháng 5, 20268 phút đọc
Xây dựng tác nhân tổng hợp tin sáng với News Search API

Mọi founder, PM và nhà phân tích đều muốn cùng một thứ vào 8 giờ sáng: một bản tóm tắt gọn gàng về những gì đã thay đổi qua đêm. Với một News Search API, một LLM và một nền tảng cron qua HTTP, bạn có thể hoàn thành nó trong một buổi chiều.

Tóm tắt

  • Kiến trúc: cron → News Search → URL Extract cho các tin hứa hẹn → tóm tắt bằng LLM → đăng lên Slack/email.
  • Điều chỉnh độ mới bằng <code>start_date</code> = hôm nay − 1; điều chỉnh locale bằng <code>country_code</code>.
  • Chia bản tin theo chủ đề bằng các truy vấn News Search song song; LLM hợp nhất và loại trùng.
  • Tổng chi phí khoảng ~15 credit mỗi chủ đề mỗi ngày, cộng thêm token LLM. Một bản tin 5 chủ đề &lt; $0,10/ngày theo giá niêm yết.

Hình hài của một bản tin hữu ích

Một tác nhân tổng hợp tin sáng nên trả lời một câu hỏi: 'qua đêm có gì thay đổi mà tôi cần biết?' Mức yêu cầu cao hơn ta tưởng. Một đống tiêu đề là thất bại — nó chẳng khác gì RSS và bị tắt tiếng trong vòng một tuần. Thứ trụ lại được là một bản tóm tắt 5 ý có liên kết, sắp xếp theo chủ đề, theo giọng văn của người dùng.

Điều đó tách thành một pipeline nhỏ:

  • Lấy tin tức gần đây trên N chủ đề — News Search API.
  • Trích xuất phần thân của bất kỳ liên kết nào mô hình muốn trích dẫn — URL Extract API.
  • Tóm tắt + gom cụm bằng một LLM — mô hình bạn chọn.
  • Đăng lên Slack / email / Notion — kênh liên lạc hiện có của bạn.
  • Lên lịch bằng một cron — Vercel Cron, GitHub Actions, n8n, v.v.

Bước 1: chọn các chủ đề

Giữ trong khoảng 3–6 chủ đề. Bản tin 12 chủ đề bị lướt qua. Ví dụ:

  • Với một founder SaaS B2B: 'các vòng gọi vốn AI', 'tin OpenAI / Anthropic', 'động thái đối thủ'.
  • Với một nhà phân tích tài chính: 'FOMC và Treasury', 'chuỗi cung ứng bán dẫn', 'các ticker cụ thể'.
  • Với một PM mảng y tế: 'phê duyệt FDA', 'kết quả thử nghiệm lâm sàng', 'thay đổi hoàn phí'.

Bước 2: lấy tín hiệu thô

Chạy một lời gọi News Search cho mỗi chủ đề một cách song song. Dùng start_date để giới hạn độ mới:

from datetime import date, timedelta
import asyncio, aiohttp

KEY = "pk_yourkey"
TOPICS = [
    "AI agent infrastructure funding",
    "OpenAI Anthropic Google new releases",
    "RAG and LLM tool calling research",
]

async def fetch_topic(session, q):
    yesterday = (date.today() - timedelta(days=1)).isoformat()
    async with session.post(
        "https://www.apipick.com/api/search/news",
        headers={"x-api-key": KEY},
        json={"query": q, "start_date": yesterday},
    ) as r:
        return q, await r.json()

async def fetch_all():
    async with aiohttp.ClientSession() as s:
        return await asyncio.gather(*[fetch_topic(s, q) for q in TOPICS])

Mỗi lời gọi trả về tối đa 5 tiêu đề đã xếp hạng (tối đa 10 với num_results). Với một bản tin 3 chủ đề thì đó là 3 × 15 = 45 credit mỗi lần chạy. Ở mức $5 / 5.000 credit, $0,045/ngày. Chi phí hằng ngày bị chi phối bởi LLM, không phải News API.

Bước 3: trích xuất phần thân một cách chọn lọc

Bạn không cần toàn bộ nội dung của mọi tin — chỉ những tin mô hình muốn trích dẫn chi tiết. Một quy tắc kinh nghiệm đơn giản: trích xuất 2 tin hàng đầu mỗi chủ đề. Với API Pick đó là một lời gọi theo lô duy nhất:

import requests

urls = [r["url"] for topic, payload in results for r in payload["results"][:2]]

extracted = requests.post(
    "https://www.apipick.com/api/extract",
    headers={"x-api-key": KEY},
    json={"urls": urls, "extract_effort": "auto"},
).json()

Ở mức 2 credit mỗi URL, bước trích xuất thêm ~12 credit/ngày cho một bản tin 3 chủ đề.

Bước 4: prompt tóm tắt

Prompt là nơi giọng văn của bản tin nằm ở đó. Một điểm khởi đầu:

You are an assistant that writes a morning briefing in <Sarah's> voice:
direct, no fluff, no marketing language.

Input: a JSON list of {topic, headlines, extracted_bodies}.

Output rules:
- 1 short paragraph per topic, max 60 words.
- Each paragraph ends with up to 3 inline source links.
- If a topic has fewer than 2 substantive stories overnight, omit it.
- If the entire briefing has fewer than 2 substantive topics, output the
  literal token SKIP and nothing else.
- Never editorialise. Quote facts and figures verbatim from the sources.

Output format: Slack-flavoured markdown.

Chỉ dẫn 'SKIP nếu tín hiệu thấp' là quy tắc có đòn bẩy cao nhất. Đó là lý do bản tin của bạn sẽ không bị tắt tiếng.

Bước 5: đăng và lên lịch

Với một cron Python, toàn bộ script < 80 dòng. Phần đăng lên Slack:

if briefing.strip() == "SKIP":
    return
requests.post(
    SLACK_WEBHOOK_URL,
    json={"text": briefing, "username": "Morning Briefing", "icon_emoji": ":sunrise:"},
)

Lên lịch bằng Vercel Cron (trong vercel.json), GitHub Actions, AWS EventBridge hoặc n8n. Chạy vào 7:45 sáng theo múi giờ của bạn — mục tiêu là nó đã chờ sẵn khi bạn ngồi vào lúc 8 giờ.

Làm trong n8n nếu bạn thích no-code

  • Schedule trigger — hằng ngày, 7:45 theo múi giờ người dùng.
  • Các node HTTP Request (một node mỗi chủ đề), POST /api/search/news với start_date là hôm qua.
  • Node Merge kết hợp kết quả các chủ đề.
  • Node HTTP Request gọi /api/extract với các URL hàng đầu.
  • Node OpenAI / Anthropic chạy prompt tóm tắt.
  • Node If kiểm tra đầu ra không phải là SKIP.
  • Node Slack đăng bản tin.

Cần để ý gì khi chạy production

  • Trôi dạt chủ đề. 'AI agents' trở nên quá rộng sau 6 tháng — chỉ mục của API lớn dần; bản tin của bạn cần giữ tính cụ thể. Siết các truy vấn theo từng quý.
  • Lặp lại giữa các ngày. Truyền cho mô hình các URL của ngày hôm trước với 'don't re-cover stories from this list' nếu cùng một tin cứ xuất hiện.
  • Cuối tuần vắng tin. Quy tắc SKIP đã xử lý việc này; chỉ là đừng gắn thói quen điểm tin hằng ngày của bạn vào bản tin.

Lặp lại cải tiến, đừng làm-rồi-quên

Đọc bản tin mỗi sáng trong một tuần. Ghi lại nơi mô hình bịa đặt, phân loại sai hoặc bỏ sót điều gì đó. Cập nhật prompt. Sau một tuần lặp lại cải tiến, bản tin trở thành thói quen — và bạn đã xây được một tác nhân vận hành với khoảng 80 dòng mã và ba lời gọi API.

Câu hỏi thường gặp

Tại sao không chỉ dùng Google News hay một trình tổng hợp RSS?

Cả hai đều dùng được — và cả hai đều để lại cho bạn phần nhàm chán: gom cụm, loại trùng, tóm tắt và viết bản tin thực sự. Một tác nhân làm phần đó bằng LLM. RSS cho bạn các tiêu đề; tác nhân cho bạn một đoạn văn nói rõ điều gì quan trọng và liên kết đến nguồn.

News Search API mới đến mức nào?

API lập chỉ mục các hãng tin lớn gần như theo thời gian thực. Với một bản tin 8 giờ sáng bao quát 24 giờ trước đó, hãy đặt start_date thành hôm qua. Với các bot tin nóng chạy theo giờ, hãy đặt start_date thành hôm nay và chạy lại tác nhân với việc loại trùng so với lần chạy trước.

Nếu bản tin chẳng có gì mới để nói thì sao?

Đưa điều đó vào prompt: 'If fewer than 3 substantive stories changed overnight, return SKIP.' Cron job của bạn nên tôn trọng SKIP và không đăng một bản tin tín hiệu thấp. Mệt mỏi vì bản tin là cách nhanh nhất khiến một kênh Slack bị tắt tiếng.

Tôi có thể chạy nó mà không cần n8n không?

Có. Cùng một luồng chạy dưới dạng một script Python 30 dòng trên cron — xem ví dụ bên dưới. n8n tiện cho việc gỡ lỗi trực quan và tích hợp Slack, nhưng không bắt buộc.

Làm sao để cùng một tin không bị tóm tắt ở nhiều chủ đề?

Truyền cho mô hình các URL từ những truy vấn trước trong cùng một lần chạy với chỉ dẫn: 'do not re-mention any URL already covered.' Hoặc chạy một tìm kiếm đa chủ đề duy nhất và để mô hình phân vùng. Cả hai đều được; cách thứ hai rẻ hơn.

Các API dùng trong bài viết này

Sarah Choy
Viết bởi
Sarah Choy
CEO, API Pick

Sarah Choy là CEO của API Pick. Cô viết về việc xây dựng các API sẵn sàng cho production cho AI agent và quy trình LLM.