brief:{userId}:{issueSlot} 中,并在 brief:latest:{userId} 写入最新指针,暴露以下路由用于仪表盘回读、公开分享以及 Telegram/Slack 轮播渲染。默认节奏为每日,但每条告警规则的 digestMode 可调度每日、每日两次或每周的版本。
关于来源选择、过滤、去重、LLM 接地和偏见控制,请参见 新闻摘要与简报方法论。
所有读取路由都需要有效的 Clerk 会话和 PRO 层级,公开分享路由(
/api/brief/public/{hash})除外。最新简报(已认证)
GET /api/latest-brief
返回调用者最近生成简报的摘要,如果所请求/当前时段尚未生成简报,则返回 { status: "composing" }。
issueDate 仍是显示/日期字段(YYYY-MM-DD)。issueSlot 是冻结的版本键(YYYY-MM-DD-HHMM),用于 Redis 查找和 HMAC 绑定;它出现在 ready 响应中,以及显式请求时段的未命中响应中。magazineUrl 针对 {userId, issueSlot} 重新签名,因此仅对已认证的所有者有效。
GET /api/brief/{userId}/{issueSlot}
issueSlot(YYYY-MM-DD-HHMM)的完整杂志阅读器。需要 HMAC 签名 URL。时段格式允许两次同日摘要投递产生不同的冻结版本。
分享
POST /api/brief/share-url?slot=YYYY-MM-DD-HHMM
为调用者在 slot 的简报物化一个公开分享指针。若省略 slot,该路由解析 brief:latest:{userId}。幂等 — hash 是 {userId, issueSlot, BRIEF_SHARE_SECRET} 的纯函数。
GET /api/brief/public/{hash}
无需认证的公开读取,用于之前分享的简报。该 hash 解析为 brief:public:{hash} → {userId, issueSlot} Redis 指针;如果不存在,则该简报从未被分享。分享指针是惰性写入的(在分享时,而非生成时)。
轮播(社交媒体图片)
GET /api/brief/carousel/{userId}/{issueDate}/{page}.png?t={token}
服务器渲染的简报 PNG 页面,用于 Telegram sendMediaGroup、Slack chat.postMessage、LinkedIn 等。
page只能是 0、1 或 2,分别表示cover、threads和story;其他值返回404 invalid_page。- 通过
@vercel/og渲染。 Content-Type: image/png,1200×630。- HMAC 能力令牌必须放在
?t=查询参数中;缺失或无效令牌均返回403。
辅助
GET /api/story?c={ISO2}&t={type}
面向社交媒体爬虫的公开只读 HTML 页面,展示一个国家故事(默认类型 ciianalysis)。参数:c(国家,必填)、t(故事类型)、ts(时间戳)、s(分数)、l(级别)。它不是简报阅读器,也不接受 date 参数。
GET /api/og-story?c={ISO2}&t={type}
/api/story 的 Open Graph 预览图,接受相同的 c/t/s/l 参数。返回 image/png,激进缓存。
POST /api/chat-analyst
仪表盘内”询问分析师”助手的流式聊天端点。接收用户提示+近期信号上下文;返回 SSE token。
- 认证:Clerk JWT + PRO
- 流式:
text/event-stream - 后端:
intelligence/v1/chat-analyst-*处理器组合上下文+提示
POST /api/widget-agent
嵌入式 widget iframe 使用的单次完成端点。通过 X-WorldMonitor-Key(合作伙伴密钥)认证。按密钥限流。