This is a Chinese AI news aggregator that pulls daily summaries and recent updates from aihot.virxact.com without opening a browser. It's built for developers who want fresh AI industry news in Mandarin, organized into five categories: model releases, product launches, industry news, research papers, and tips. The skill defaults to curated content from the past week unless you explicitly ask for "日报" (daily digest) or "全部" (everything). It searches across OpenAI, Anthropic, Google releases and lets you filter by keywords like "Sora" or "RAG论文". One quirk: you must set a browser User-Agent header or the API returns 403. Useful if you're tracking Chinese AI discourse or building in that market and tired of stale training data.
npx -y skills add kkkkhazix/khazix-skills --skill aihot --agent claude-codeInstalls into .claude/skills of the current project.
让 Agent 用最自然的中文查询拿到 aihot.virxact.com 上每天的 AI HOT 日报和全部 AI 动态,不需要打开浏览器。SKILL.md 标准格式,跨 Claude Code / Codex CLI / Cursor / Gemini CLI / OpenCode / 任何兼容平台可用。
线上:https://aihot.virxact.com(公开匿名可访,无需 token)
/api/public/* 走 nginx UA 黑名单挡商业爬虫,默认 curl/X.Y UA 会被 403 Forbidden。调 API 时所有 curl 都必须带浏览器 UA:
UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
# 之后所有调 API 的 curl 都加 -H "User-Agent: $UA",例如:
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily"
后面"工作流"章节的 curl 例子为了简洁默认你已经设了 $UA——实际调用必须加 -H "User-Agent: $UA",不要忘。漏掉这一步会让你以为接口挂了,实际只是被 403 挡了。
范围澄清:这条 UA 要求只针对
/api/public/*API 端点。/aihot-skill/{install.sh,SKILL.md,README.md}安装入口 nginx 上特意豁免 UA 黑名单(设计前提就是给curl -fsSL ... | bash一行装用),用 default curl UA 直通 200。不要把"先决条件"误推广到所有 aihot.virxact.com 路径。
路由优先级(第一原则):默认走精选
items?mode=selected——它是 AI HOT 每天精挑细选的"主菜单",覆盖用户关心的事且数据新鲜。
- 仅当用户在话里明确说出"日报" 二字才走
daily(编辑成品,按 UTC 整日切片,跟"过去 24 小时 / 今天"等滚动窗口对不上)- 仅当用户明确说"全部 / 完整 / 所有 / 全量" 才走
mode=all(含未精选的次要条目,量大但杂)- "今天 AI 圈"、"过去 24 小时大新闻"、"最近 AI 圈有啥" 等宽问题 = 默认精选 + 时间窗(since),不要默认走日报或全部
这是为了对齐用户的语义优先级:精选是主菜单,日报和全部是用户特意点单的备选,不应抢默认。
| 用户在说 | 应该走的接口 |
|---|---|
| 默认(宽问题):"今天 AI 圈有什么"、"过去 24 小时大新闻"、"最近 AI 圈"、"AI 有啥新东西" | GET /api/public/items?mode=selected&since=<语义时间窗>(默认精选 + since 收窄) |
| 明确说"日报":"AI 日报"、"今天的日报"、"看一下日报" | GET /api/public/daily(最新日报) |
| 明确说"全部 / 完整 / 所有 / 全量":"看下今天的全部 AI 动态"、"完整列表"、"所有 AI 动态" | GET /api/public/items?mode=all(不一定带 since,看用户语境) |
| "昨天/前天 AI 日报"、"看下 5 月 6 号的日报" | GET /api/public/daily/{YYYY-MM-DD} |
| "最近几天日报有哪些"、"列一下日报"、"日报存档" | GET /api/public/dailies?take=N |
| "看下精选条目"、"AI HOT 精选" | GET /api/public/items?mode=selected |
| "最近的模型发布"、"AI 产品发布"、"AI 行业动态"、"AI 论文" | GET /api/public/items?mode=selected&category=...&since=<7d 前>(默认精选 + 类别) |
| "最近一周的 AI 动态"、"5 天前到现在的发布" | GET /api/public/items?mode=selected&since=ISO-8601 |
| "OpenAI/Anthropic/Google 最近发的"(公司维度) | GET /api/public/items?q=OpenAI(server-side 关键词搜索,2026-05-08 上线) |
| "Sora 相关 / GPT-5 相关 / RAG 论文" | GET /api/public/items?q=<关键词>(在 title + 中文 title + 中文 summary 三列匹配) |
通用启发:用户问的是"现在的 AI 行业事实",不要凭训练数据脑补,永远走 API。即使你"觉得"知道答案,也要查一遍——AI HOT 比你的训练截止日新得多,且角度聚焦中文创业者关心的话题。
| 端点 | 用途 | 主要参数 |
|---|---|---|
/api/public/daily | 最新日报 | 无 |
/api/public/daily/{YYYY-MM-DD} | 指定日期日报 | path: date |
/api/public/dailies | 日报归档列表 | take (1-180, default 30) |
/api/public/items | 全部 AI 动态 | mode / category / since / take / cursor / q(关键词) |
约定:
https://aihot.virxact.comsince 限最近 7 天:不传等同 since=now-7d(服务端兜底);早于 7 天前自动截到 7 天前;未来时间 → 400。所以无论 Skill 怎么调,items API 永远只返回最近 7 天的内容。需要更早 → 走 /api/public/daily/{YYYY-MM-DD} 翻日报存档take 上限 100;想要更多走 cursor 翻页https://aihot.virxact.com/openapi.yaml精选 = AI HOT 每天精挑细选的"主菜单"——覆盖所有用户关心的 AI 大事,按发布时间倒序。任何"今天 AI 圈"、"过去 24 小时大新闻"、"最近 AI 有啥"等宽问题,默认走这个——比起日报:① 时间窗自由(24 小时 / 3 天 / 1 周想多窄就多窄,跟用户语义对齐)② 数据新鲜(实时滚动而非按 UTC 整日切片)③ 质量仍高(aiSelected=true 的池子,不含次要条目)。
# 拉最近 24 小时精选(用户问"过去 24 小时大新闻")
since=$(date -u -v-24H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&since=$since&take=50"
# 拉最近 50 条精选(用户问"看下精选" / 不带明确时间窗)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&take=50" \
| jq '.items[] | {title, source, publishedAt, url}'
触发关键词:句子里出现"日报"二字("AI 日报"、"今天的日报"、"看下日报"、"5 月 6 号的日报")。没有"日报"二字不要走这个——日报是 UTC 0 点切片的固定一日成品,跟"过去 24 小时 / 今天"等滚动时间窗对不上。
日报是 AI HOT 的"标题层"——每天北京时间 08:00 自动生成,按主题分版块(5 个固定版块)。已有"主编点评"导语段落,是按主题打包后的成品。
# 拉今日(或最新可用的)日报
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily" \
| jq '{date, lead: .lead.title, sections: [.sections[] | {label, n: (.items | length)}]}'
# YYYY-MM-DD,UTC 0 点为基准
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/daily/2026-05-07"
不知道有哪些日期可查时,先看归档:
# 最近 N 天日报索引(不含正文,只有日期 + 头条标题)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/dailies?take=14" \
| jq '.items[] | {date, leadTitle}'
触发关键词:句子里出现"全部"、"完整"、"所有"、"全量"、"包括老的"——用户主动想看精选之外的次要条目(被精选筛掉但仍相关的内容)。没有这些关键词不要走 mode=all——精选已经覆盖大部分用户关心的事,全部池子量大但杂。
# 拉最近 24 小时全部 AI 动态(用户问"看下今天全部的 AI 动态")
since=$(date -u -v-24H +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=all&since=$since&take=100"
5 个 category(items API 用英文 slug,daily API 看到的 section label 是中文):
items?category= | daily.sections[].label |
|---|---|
ai-models | 模型发布/更新 |
ai-products | 产品发布/更新 |
industry | 行业动态 |
paper | 论文研究 |
tip | 技巧与观点 |
用户问"公众号最近发什么":items API 不含公众号(mp_hot 信源单独走前端 /mp 页),Skill 暂时无法回答这类问题,可以提示用户去 https://aihot.virxact.com/mp 看公众号爆文页。
# 例:拉最近 50 条 AI 论文(默认精选 + paper 类别)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&category=paper&take=50" \
| jq '.items[] | {title, source, publishedAt, url}'
# 例:精选里的模型发布
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&category=ai-models&take=20"
# 例外:用户明确说"全部论文 / 所有模型发布"才走 mode=all
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=all&category=paper&take=100"
关键规则:用户问"最近 X"(最近的模型发布 / 最近 AI 论文 / 最近 OpenAI 等)时,需要带
since参数把窗口收窄到用户实际意图(说"最近 3 天" 就 3d,"昨天" 就 1d,"最近一周" 就 7d)。服务端兜底:items API 服务端默认
since=now-7d(硬上限,保护服务器),所以即使 Skill 完全不带 since 也只会返回最近 7 天的内容,不会拉到几个月前的老条目。但仍建议显式带 since:① 用户问"最近 3 天" 时显式 3d 比让服务端默认 7d 更精确 ② 输出元信息可以写人话级时间窗 ③ 跟用户公开宣传的"最长 7 天"对齐意图清晰。
# 拉最近 7 天的精选模型发布(用户问"最近的模型发布")
since=$(date -u -v-7d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&category=ai-models&since=$since&take=100"
# 拉最近 3 天的精选动态(用户明确说"最近 3 天")
since=$(date -u -v-3d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&since=$since&take=100"
例外:用户明确说"全量 / 所有 / 完整列表 / 包括老的" → mode 切到 all,可以不带 since;用户问"看下精选"(看精选池而非时间窗)mode 保持 selected 也可以不带 since。但只要句子里有"最近 / 最新 / 这两天 / 这周",默认带 since + mode=selected。
/api/public/items 响应里有 nextCursor(opaque token),下次请求把它原样塞进 cursor 参数即可。
# 第 1 页
resp1=$(curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=all&take=100")
echo "$resp1" | jq '.items | length' # 100
# 第 2 页
cursor=$(echo "$resp1" | jq -r '.nextCursor')
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=all&take=100&cursor=$cursor"
hasNext = false 或 nextCursor = null 时停止翻页。cursor 是不透明 token,视作黑盒,不要尝试解析、递增、或跨端点复用。
API 直接支持 server-side 关键词搜索 — q 参数在 title + 中文 title + 中文 summary 三列上 ILIKE 匹配,走 PostgreSQL pg_trgm GIN 索引(2-6ms)。不要再走"拉一批 + 客户端 jq grep"模式 — 那只能看到前 100 条池子里的命中,关键词若在 100 条外完全找不到。
# 找 OpenAI 最近发的(覆盖全池,不仅前 100)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?q=OpenAI&take=30"
# 找 Sora 相关的所有 AI 动态(任何包含 Sora 的标题或摘要)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?q=Sora"
# 找 RAG 论文(category 限定 + 关键词)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?category=paper&q=RAG&take=30"
# 关键词 + 时间窗(Anthropic 最近 3 天的精选)
SINCE=$(date -u -v-3d +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ)
curl -sH "User-Agent: $UA" "https://aihot.virxact.com/api/public/items?mode=selected&q=Anthropic&since=$SINCE"
q 约束:
/api/public/daily 返回{
"date": "2026-05-07",
"generatedAt": "2026-05-07T00:01:23.456Z",
"windowStart": "2026-05-06T00:00:00.000Z",
"windowEnd": "2026-05-07T00:00:00.000Z",
"lead": { "title": "...", "leadParagraph": "..." },
"sections": [
{
"label": "模型发布/更新",
"items": [
{
"title": "...",
"summary": "...",
"sourceUrl": "https://...",
"sourceName": "OpenAI Blog"
}
]
}
],
"flashes": [
{ "title": "...", "sourceName": "...", "sourceUrl": "...", "publishedAt": "..." }
]
}
sections[].label 固定 5 个:"模型发布/更新" / "产品发布/更新" / "行业动态" / "论文研究" / "技巧与观点"。lead 极少数日报为 null。
/api/public/dailies 返回{
"count": 14,
"items": [
{ "date": "2026-05-07", "generatedAt": "...", "leadTitle": "..." }
]
}
/api/public/items 返回{
"count": 50,
"hasNext": true,
"nextCursor": "eyJhIjoxNzE0OTk1MjAwMDAwLCJpIjoiY205eHl6MTIzIn0",
"items": [
{
"id": "cm9abc456def789ghi012jkl3",
"title": "中文标题(normalize 过)",
"title_en": "原英文标题(仅当与 title 不同时存在,否则 null)",
"url": "https://...",
"source": "OpenAI Blog",
"publishedAt": "2026-05-07T15:30:00.000Z",
"summary": "中文摘要(LLM 生成)",
"category": "ai-models"
}
]
}
字段不变量:
id / title / url / sourcetitle_en / summary / publishedAt / categorycategory 取值集:ai-models / ai-products / industry / paper / tip / nullpublishedAt:ISO 8601 UTC(带 Z)id:cuid 字符串(25 字符),不要假设是数字⚠️ 核心原则:这一节是直接展示给用户的最终内容——必须 markdown 格式 + 排版好 + 普通人能看得懂的人话。用户多数是非技术 AI 创业者 / 设计师 / 普通读者,看到的应该是中文资讯简报,不是 API 调试日志。
所有"端点路径 /
mode=selected这种 raw 参数 / 限流 / nginx 缓存 / cursor / hasNext"等基础设施细节都不能出现在用户看到的输出里。人话级元数据(时间窗 / 条数 / "按发布时间倒序")可以保留——判断标准:用户能直接看懂吗?能 → 保留;不能 → 删掉。
**AI HOT 日报 · 2026-05-07**
## 模型发布/更新
1. **<title>** — <source>
<summary 简化版 50 字内>
<url>
## 产品发布/更新
2. ...
## 行业动态
3. ...
## 论文研究
4. ...
## 技巧与观点
5. ...
## 快讯(如果 flashes 有内容)
- <flash.title> — <flash.source>(<flash.publishedAt 转人话>)
编号贯穿全文(1, 2, 3 ... N),不在每个 ## 内重新计数——这样用户能一眼数到"今天 27 条"。
默认按 category 分组 + 全局编号——用户对"模型/产品/行业/论文/技巧"五版块结构已经形成预期(来自日报),混合 category 时这个结构最自然:
**AI HOT — 最近 30 条精选**
## 模型发布/更新
1. **<title>** — <source>
2 小时前
<summary>
<url>
## 产品发布/更新
2. **<title>** — <source>
...
3. ...
## 行业动态
4. ...
只有 1 个 category 时(用户明确说"AI 论文"/"模型发布"等),用扁平编号列表:
**AI HOT — 最近一周 AI 论文**(2026-05-01 ~ 2026-05-08)
1. **<title>** — <source>
<summary>
<url>
2. ...
OK(用户能直接懂的):
不 OK(基础设施泄漏,坚决不写):
mode=selected / category=paper / take=30 这种 raw 参数名/api/public/items?since=2026-04-30T18:39:31Z&take=50数据源最多写一句:"数据来自 aihot.virxact.com",要么干脆不提(用户在用 skill 时已经知道源头)。
publishedAt 是 ISO 8601 UTC,展示时必须转成北京时间 + 用户能扫读的相对/绝对时间:
| 内部值 | 展示给用户 |
|---|---|
2026-05-08T01:48:00.000Z | "今天上午 09:48" / "2 小时前" |
2026-05-07T18:08:17.000Z | "今天凌晨 02:08" / "10 小时前" |
2026-05-06T16:43:00.000Z | "5/7 00:43" / "昨天" |
不要直接展示 2026-05-07T15:30:00.000Z 这种 ISO 字符串——用户看不懂。
默认输出 title(中文 normalize 过的)。title_en 只在以下场景才用:
title 为空(极少见)不要两个都展示。
{"error":"No daily report available yet."}(HTTP 404):当天日报还没生成(北京时间 08:00 之前)。建议给用户:拉昨天日报 curl /api/public/daily/{昨天日期}{"error":"Invalid date format..."}(HTTP 400):date 必须是 YYYY-MM-DD,UTC 基准"invalid mode (must be 'selected' or 'all')""invalid category (must be one of: ai-models, ai-products, industry, paper, tip)""invalid since (must be ISO date, not in future)""invalid take (must be integer 1-100)"mode=selected + since=<语义窗>。仅当用户在话里明确说"日报"二字才走 dailymode=all — 精选已经覆盖大部分用户关心的事,全部池子量大但杂含未精选次要条目。默认 mode=selected,只有用户主动点单"全部"才切到 mode=allsummary)当原文引用 — 摘要由 LLM 生成,引用需要回 url / sourceUrl 核对?q=<词>,不要走"拉一批 + 客户端 jq grep"(那只能看到前 100 条池子,会漏)since=<N天前>(意图明确 + 元信息能写人话时间窗)。不带 since 服务端默认 7d 兜底,所以不会拉到老条目,但用户问"最近 3 天" 时让服务端默认 7d 会多带 4 天的内容<source>(OpenAI 官网 / Anthropic Newsroom / X:Berry Xia 这种),不是 GET /api/public/items?...juliusbrussee/caveman
mattpocock/skills
shadcn/improve
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills