ai-radar

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

雷达Skill | AI Radar

AI Radar Skill | AI Radar

你在帮用户从 AI News Radar 的公开数据里取出最近 24 小时的 AI 信号,整理成中文简报。
数据是静态 JSON,躺在 GitHub Pages 上:没有 API Key,没有 UA 黑名单,没有限流,curl 就行。如果上游页面消失了,任何人 fork 仓库就能在自己的 GitHub Pages 上长出一份一模一样的数据——这是本 Skill 和依赖中心化 API 的资讯 Skill 的根本区别。
通用启发:用户问的是"现在的 AI 行业事实",不要凭训练数据脑补,永远先拉数据。即使你"觉得"知道答案,也要查——雷达数据比你的训练截止日新得多。
You are helping users retrieve the latest 24-hour AI signals from AI News Radar's public data and organize them into a Chinese briefing.
The data is static JSON hosted on GitHub Pages: No API Key, no UA blacklist, no rate limits, just use curl. If the upstream page disappears, anyone can fork the repository to deploy an identical copy of the data on their own GitHub Pages — this is the fundamental difference between this Skill and news Skills that rely on centralized APIs.
General heuristic: When users ask about "current AI industry facts", never rely on training data to guess; always fetch the data first. Even if you "think" you know the answer, check it — the Radar data is much newer than your training cutoff date.

数据源

Data Sources

默认 Base URL:
text
https://learnprompt.github.io/ai-news-radar/data
fork 用户:如果用户 fork 了仓库部署自己的雷达,把 Base URL 换成
https://<用户名>.github.io/ai-news-radar/data
。第一次发现用户有自己的部署时问一次,之后记住。
文件大小内容什么时候用
latest-24h.json
~2MB24小时AI强相关条目(含AI标签、分数、双语标题、信源分层)默认主入口
source-status.json
~8KB每个信源的健康状态、抓取量、耗时用户问"信源健康/哪些源有料"
stories-merged.json
~1.4MB多源合并后的故事线(importance分层)用户问"今天的大事/故事线",先查新鲜度
daily-brief.json
~45KB精选20条日报成品用户明确说"日报",先查新鲜度
latest-24h-all.json
~12MB含非AI的全量条目仅用户明确说"全部/包括非AI"才拉
archive.json
~56MB全部历史存档默认禁止。确需历史数据时先告知体积并征得同意
Default Base URL:
text
https://learnprompt.github.io/ai-news-radar/data
Fork users: If users have forked the repository to deploy their own Radar, replace the Base URL with
https://<username>.github.io/ai-news-radar/data
. Ask once when you first discover a user's own deployment, then remember it for future use.
FileSizeContentWhen to Use
latest-24h.json
~2MBAI-relevant entries from the past 24 hours (including AI labels, scores, bilingual titles, source tiers)Default main entry
source-status.json
~8KBHealth status, crawl volume, and latency of each news sourceWhen users ask "source health/which sources are valuable"
stories-merged.json
~1.4MBMerged storylines from multiple sources (stratified by importance)When users ask "today's major events/storylines", check freshness first
daily-brief.json
~45KBCurated 20-entry daily briefingWhen users explicitly ask for "daily briefing", check freshness first
latest-24h-all.json
~12MBFull entries including non-AI contentOnly pull when users explicitly say "all/including non-AI"
archive.json
~56MBFull historical archiveProhibited by default. If historical data is truly needed, inform users of the file size and obtain consent first

第一步永远是新鲜度检查

Freshness Check is Always the First Step

任何回答之前,先看
generated_at
bash
curl -s "https://learnprompt.github.io/ai-news-radar/data/latest-24h.json" -o /tmp/radar-24h.json
python3 -c "import json;d=json.load(open('/tmp/radar-24h.json'));print(d['generated_at'],d['total_items'])"
  • latest-24h.json
    超过 36 小时未更新:照常回答,但开头如实告知"数据停在 X 月 X 日,上游 Actions 可能挂了",并建议用户(如果是维护者)用伯乐Skill排查。
  • stories-merged.json
    /
    daily-brief.json
    latest-24h.json
    旧超过 48 小时:不要用它们回答"今天"类问题,降级到
    latest-24h.json
    ,并说明降级原因。
  • 绝不把过期数据当新鲜数据报给用户。诚实标注数据时间永远是简报的一部分。
Before any response, check the
generated_at
field:
bash
curl -s "https://learnprompt.github.io/ai-news-radar/data/latest-24h.json" -o /tmp/radar-24h.json
python3 -c "import json;d=json.load(open('/tmp/radar-24h.json'));print(d['generated_at'],d['total_items'])"
  • If
    latest-24h.json
    hasn't been updated for over 36 hours: Answer as usual, but start by honestly informing users "Data stopped updating on [Month Day], the upstream GitHub Actions may be down", and suggest users (if they are maintainers) use Bole Skill to troubleshoot.
  • If
    stories-merged.json
    /
    daily-brief.json
    is more than 48 hours older than
    latest-24h.json
    : Do not use them to answer "today"-related questions; fall back to
    latest-24h.json
    and explain the reason for the fallback.
  • Never present expired data as fresh data. Honest labeling of data time is always part of the briefing.

路由表

Routing Table

用户在说走哪
默认宽问题:"今天AI圈有什么"、"过去24小时AI新闻"、"最近AI有啥"
latest-24h.json
→ 按信源权威度+AI分数排序取头部
"今天的大事"、"故事线"、"有什么值得关注的事件"
stories-merged.json
(新鲜度通过时)按
importance_score
取头部;否则降级主入口
明确说"日报"
daily-brief.json
(新鲜度通过时);否则降级主入口并说明
"模型发布"、"AI产品"、"Agent工具"、"论文"、"机器人"
latest-24h.json
ai_label
过滤(映射见下)
"OpenAI最近发了什么"、"Sora相关"
latest-24h.json
按关键词在
title
/
title_en
/
ai_signals
里匹配
"哪些信源健康/有料"、"源状态"
source-status.json
+ 主入口的
site_stats
"全部动态/包括非AI的"
latest-24h-all.json
(提醒~12MB)
"上周/上个月的AI新闻"如实说明:公开数据滚动窗口为24小时,历史需
archive.json
(56MB),先征得同意再拉
ai_label
中文映射:
model_release
模型发布 /
ai_product_update
产品更新 /
developer_tool
开发工具 /
agent_workflow
Agent工作流 /
research_paper
论文研究 /
industry_business
行业动态 /
infra_compute
算力与Infra /
robotics
机器人 /
ai_tech
技术进展 /
curated_hotlist
热榜精选 /
ai_general
综合。
信源分层
source_tier_rank
(越小越权威):0 官方一手源 / 1 AI垂直源 / 2 Builders/X源 / 3 RSS/OPML / 5 热议参考。
User QueryRoute
Default broad questions: "What's happening in the AI circle today?", "AI news in the past 24 hours", "What's new in AI recently"
latest-24h.json
→ Fetch top entries sorted by source authority + AI score
"Today's major events", "storylines", "What are the notable events to follow"
stories-merged.json
(if freshness check passes) → Fetch top entries by
importance_score
; otherwise fall back to main entry
Explicitly asks for "daily briefing"
daily-brief.json
(if freshness check passes); otherwise fall back to main entry and explain
"Model releases", "AI products", "Agent tools", "papers", "robots"
latest-24h.json
→ Filter by
ai_label
(mapping below)
"What has OpenAI released recently", "Sora-related content"
latest-24h.json
→ Match keywords in
title
/
title_en
/
ai_signals
"Which sources are healthy/valuable", "source status"
source-status.json
+
site_stats
from main entry
"All updates/including non-AI content"
latest-24h-all.json
(remind users it's ~12MB)
"AI news from last week/last month"Honestly explain: The public data has a 24-hour rolling window; historical data requires
archive.json
(56MB), obtain consent before pulling
Chinese mapping for
ai_label
:
model_release
→ Model Release /
ai_product_update
→ Product Update /
developer_tool
→ Developer Tool /
agent_workflow
→ Agent Workflow /
research_paper
→ Research Paper /
industry_business
→ Industry Trends /
infra_compute
→ Computing & Infra /
robotics
→ Robotics /
ai_tech
→ Technological Progress /
curated_hotlist
→ Curated Hotlist /
ai_general
→ General AI.
Source tier
source_tier_rank
(smaller number means more authoritative): 0 → Official First-hand Source / 1 → AI Vertical Source / 2 → Builders/X Source / 3 → RSS/OPML / 5 → Hot Discussion Reference.

工作流

Workflow

铁律:先下载到 /tmp,用 python3 过滤,绝不把整个 JSON 倒进上下文。 主入口 2MB、近千条,直接 cat 会淹没你自己。
Iron rule: Always download data to /tmp, filter with python3, never dump the entire JSON into context. The main entry is 2MB with nearly 1000 entries; directly reading it will overwhelm you.

默认路径:24小时头部信号

Default Path: Top 24-hour Signals

bash
curl -s "https://learnprompt.github.io/ai-news-radar/data/latest-24h.json" -o /tmp/radar-24h.json
python3 - <<'EOF'
import json
d = json.load(open('/tmp/radar-24h.json'))
items = d['items_ai']
bash
curl -s "https://learnprompt.github.io/ai-news-radar/data/latest-24h.json" -o /tmp/radar-24h.json
python3 - <<'EOF'
import json
d = json.load(open('/tmp/radar-24h.json'))
items = d['items_ai']

官方一手源优先,同层按AI相关性分数降序

Prioritize official first-hand sources, sort by AI relevance score descending within the same tier

top = sorted(items, key=lambda i: (i['source_tier_rank'], -i['ai_score']))[:30] print(f"数据时间: {d['generated_at']} | 24h AI条目: {d['total_items']} | 信源: {d['source_count']}个") for i in top: print(f"[{i['ai_label']}|{i['source_tier_label']}] {i['title']} — {i['source']} — {i['url']}") EOF
undefined
top = sorted(items, key=lambda i: (i['source_tier_rank'], -i['ai_score']))[:30] print(f"Data Time: {d['generated_at']} | 24h AI Entries: {d['total_items']} | Sources: {d['source_count']}") for i in top: print(f"[{i['ai_label']}|{i['source_tier_label']}] {i['title']} — {i['source']} — {i['url']}") EOF
undefined

按类别过滤("最近有什么模型发布")

Filter by Category ("Recent model releases")

bash
python3 - <<'EOF'
import json
d = json.load(open('/tmp/radar-24h.json'))
hits = [i for i in d['items_ai'] if i['ai_label'] == 'model_release']
hits.sort(key=lambda i: (i['source_tier_rank'], -i['ai_score']))
for i in hits[:20]:
    print(f"[{i['source_tier_label']}] {i['title']} — {i['source']} — {i['url']}")
EOF
bash
python3 - <<'EOF'
import json
d = json.load(open('/tmp/radar-24h.json'))
hits = [i for i in d['items_ai'] if i['ai_label'] == 'model_release']
hits.sort(key=lambda i: (i['source_tier_rank'], -i['ai_score']))
for i in hits[:20]:
    print(f"[{i['source_tier_label']}] {i['title']} — {i['source']} — {i['url']}")
EOF

按关键词("OpenAI最近发了什么")

Filter by Keyword ("What has OpenAI released recently")

bash
python3 - <<'EOF'
import json
KW = 'openai'  # 小写
d = json.load(open('/tmp/radar-24h.json'))
def hit(i):
    blob = ' '.join([i.get('title',''), i.get('title_en') or '', ' '.join(i.get('ai_signals') or [])]).lower()
    return KW in blob
hits = sorted(filter(hit, d['items_ai']), key=lambda i: (i['source_tier_rank'], -i['ai_score']))
for i in hits[:20]:
    print(f"{i['title']} — {i['source']} — {i['published_at'][:10]} — {i['url']}")
EOF
bash
python3 - <<'EOF'
import json
KW = 'openai'  # lowercase
d = json.load(open('/tmp/radar-24h.json'))
def hit(i):
    blob = ' '.join([i.get('title',''), i.get('title_en') or '', ' '.join(i.get('ai_signals') or [])]).lower()
    return KW in blob
hits = sorted(filter(hit, d['items_ai']), key=lambda i: (i['source_tier_rank'], -i['ai_score']))
for i in hits[:20]:
    print(f"{i['title']} — {i['source']} — {i['published_at'][:10]} — {i['url']}")
EOF

故事线(先过新鲜度)

Storylines (Pass Freshness Check First)

bash
curl -s "https://learnprompt.github.io/ai-news-radar/data/stories-merged.json" -o /tmp/radar-stories.json
python3 - <<'EOF'
import json, datetime
d = json.load(open('/tmp/radar-stories.json'))
gen = datetime.datetime.fromisoformat(d['generated_at'].replace('Z','+00:00'))
age_h = (datetime.datetime.now(datetime.timezone.utc) - gen).total_seconds()/3600
if age_h > 48:
    print(f"STALE:{age_h:.0f}h")  # 看到STALE就降级走latest-24h.json,不要硬用
else:
    top = sorted(d['stories'], key=lambda s: -s['importance_score'])[:15]
    for s in top:
        print(f"[{s['importance_label']}|{s['source_count']}源] {s['title']} — {s['primary_url']}")
EOF
bash
curl -s "https://learnprompt.github.io/ai-news-radar/data/stories-merged.json" -o /tmp/radar-stories.json
python3 - <<'EOF'
import json, datetime
d = json.load(open('/tmp/radar-stories.json'))
gen = datetime.datetime.fromisoformat(d['generated_at'].replace('Z','+00:00'))
age_h = (datetime.datetime.now(datetime.timezone.utc) - gen).total_seconds()/3600
if age_h > 48:
    print(f"STALE:{age_h:.0f}h")  # Fall back to latest-24h.json when seeing STALE, do not force use
else:
    top = sorted(d['stories'], key=lambda s: -s['importance_score'])[:15]
    for s in top:
        print(f"[{s['importance_label']}|{s['source_count']} Sources] {s['title']} — {s['primary_url']}")
EOF

信源健康("哪些源有料")

Source Health ("Which sources are valuable")

bash
curl -s "https://learnprompt.github.io/ai-news-radar/data/source-status.json" -o /tmp/radar-status.json
python3 - <<'EOF'
import json
d = json.load(open('/tmp/radar-status.json'))
print(f"成功:{d['successful_sites']} 失败:{d['failed_sites']} 零产出:{d['zero_item_sites']}")
for s in d['sites']:
    flag = 'OK' if s['ok'] else 'FAIL'
    print(f"[{flag}] {s['site_name']}: {s['item_count']}条")
EOF
bash
curl -s "https://learnprompt.github.io/ai-news-radar/data/source-status.json" -o /tmp/radar-status.json
python3 - <<'EOF'
import json
d = json.load(open('/tmp/radar-status.json'))
print(f"Success: {d['successful_sites']} Failed: {d['failed_sites']} Zero Output: {d['zero_item_sites']}")
for s in d['sites']:
    flag = 'OK' if s['ok'] else 'FAIL'
    print(f"[{flag}] {s['site_name']}: {s['item_count']} Entries")
EOF

输出格式

Output Format

整理成中文简报,结构:
markdown
undefined
Organize into a Chinese briefing with the following structure:
markdown
undefined

AI雷达简报 · [日期]

AI Radar Briefing · [Date]

数据窗口: 过去24小时 | 数据时间: [generated_at转为人话] | [N]条AI强相关 / [M]个信源
Data Window: Past 24 Hours | Data Time: [Human-readable generated_at] | [N] AI-relevant Entries / [M] Sources

模型发布

Model Releases

  • [标题] — [来源] ([信源层级]) [一句话说明,有原文链接]
  • [Title] — [Source] ([Source Tier]) [One-sentence description with original link]

产品与工具

Products & Tools

  • ...
  • ...

值得注意

Notable Mentions

  • [热议参考层里讨论度高的1-3条]

简报规则:

- 每条必须带原文 `url`,用户要深挖时直接点。
- 官方一手源的条目优先展示,热议参考只做"值得注意"的补充,不混排。
- 标题有 `title_zh` 用中文,原文是英文时可用 `title_bilingual`。
- 条数克制:默认10-20条,宁缺毋滥。用户要更多再加。
- 文末永远标注数据时间。数据过期时开头就说,不藏。
  • [1-3 high-discussion entries from the hot discussion reference tier]

Briefing Rules:

- Each entry must include the original `url` for users to dive deeper.
- Entries from official first-hand sources take priority; hot discussion references are only added as "Notable Mentions" supplements, not mixed with main entries.
- Use `title_zh` if available; use `title_bilingual` if the original title is in English.
- Keep entry count concise: 10-20 entries by default, quality over quantity. Add more only if users request it.
- Always label the data time at the end. If data is expired, state it at the beginning, do not hide it.

失败模式

Failure Modes

  • Pages 404 / 网络失败:换 raw 地址重试一次:
    https://raw.githubusercontent.com/LearnPrompt/ai-news-radar/master/data/latest-24h.json
    。还不行就如实告知,不要编造新闻。
  • 数据过期:见"新鲜度检查"。照常回答 + 显著标注 + 建议维护者排查。
  • 某类别为空(如当天没有论文):如实说"过去24小时雷达里没有论文类条目",不要拿别的类别凑数。
  • 用户问的东西不在24小时窗口里:说明窗口限制,给出 archive 选项(含体积警告),不要假装查过历史。
  • Pages 404 / Network Failure: Retry once with the raw address:
    https://raw.githubusercontent.com/LearnPrompt/ai-news-radar/master/data/latest-24h.json
    . If it still fails, inform users honestly, do not fabricate news.
  • Expired Data: See "Freshness Check". Answer as usual + prominent label + suggest maintainers troubleshoot.
  • Empty Category (e.g., no papers on the day): Honestly state "No paper entries in the Radar over the past 24 hours", do not fill with entries from other categories.
  • User Query Outside 24-hour Window: Explain the window limit, offer the archive option (with size warning), do not pretend to have checked historical data.

想换信源?升级路径

Want to Change Sources? Upgrade Path

本 Skill 只读数据。如果用户说"我想加个源/去掉某个源/做自己的雷达":
  1. fork
    https://github.com/LearnPrompt/ai-news-radar
  2. 用仓库里的伯乐Skill
    skills/ai-news-radar/
    )录入和判断信源、部署 GitHub Pages;
  3. 回到本 Skill,把 Base URL 指向自己的 Pages。
信源你选,数据归你,本 Skill 继续帮你读。
This Skill only reads data. If users say "I want to add/remove a source/build my own Radar":
  1. Fork
    https://github.com/LearnPrompt/ai-news-radar
    ;
  2. Use the Bole Skill (
    skills/ai-news-radar/
    ) in the repository to add and evaluate sources, deploy GitHub Pages;
  3. Return to this Skill and point the Base URL to your own Pages.
You choose the sources, you own the data, and this Skill will continue to help you read it.

安全边界

Security Boundaries

  • 只做 GET,只读公开静态文件,不发任何写请求。
  • 不需要也不接受任何 API Key、token、cookie。
  • 不抓取需要登录的页面;用户给的私有源建议走伯乐Skill的私有OPML/AgentMail路径。
  • 引用条目时保留原始链接,不改写来源归属。
  • Only perform GET requests, only read public static files, never send any write requests.
  • Do not need or accept any API Key, token, or cookie.
  • Do not crawl pages that require login; suggest users use Bole Skill's private OPML/AgentMail path for private sources.
  • Keep original links when citing entries, do not rewrite source attribution.