"""国际 AI 时讯 RSS 源定义(按类别分组)。""" from __future__ import annotations from dataclasses import dataclass @dataclass(frozen=True) class NewsFeed: name: str url: str slow: bool = False # 限速源(如 Reddit)串行抓取 @dataclass(frozen=True) class NewsCategory: id: str name: str icon: str feeds: tuple[NewsFeed, ...] NEWS_CATEGORIES: tuple[NewsCategory, ...] = ( NewsCategory( id="official", name="厂商官方", icon="🏢", feeds=( NewsFeed("Anthropic Claude 更新", "https://docs.anthropic.com/en/release-notes/feed"), NewsFeed("OpenAI", "https://openai.com/news/rss.xml"), NewsFeed("Google AI", "https://blog.google/technology/ai/rss/"), NewsFeed("DeepMind", "https://deepmind.google/blog/rss.xml"), NewsFeed("Meta Engineering", "https://engineering.fb.com/feed/"), NewsFeed("Microsoft Research", "https://www.microsoft.com/en-us/research/feed/"), NewsFeed("Microsoft Blog", "https://blogs.microsoft.com/feed/"), NewsFeed("Cohere", "https://cohere.com/blog/rss.xml"), NewsFeed("Cursor Changelog", "https://cursor.com/changelog/rss.xml"), ), ), NewsCategory( id="developer", name="Agent / LLM 开发者", icon="🛠", feeds=( NewsFeed("LangChain", "https://blog.langchain.dev/rss/"), NewsFeed("Hugging Face", "https://huggingface.co/blog/feed.xml"), NewsFeed("Vercel Changelog", "https://vercel.com/changelog/rss.xml"), NewsFeed("GitHub Copilot", "https://github.blog/changelog/label/copilot/feed/"), ), ), NewsCategory( id="media", name="综合科技媒体", icon="📰", feeds=( NewsFeed("The Verge AI", "https://www.theverge.com/rss/ai-artificial-intelligence/index.xml"), NewsFeed("TechCrunch AI", "https://techcrunch.com/category/artificial-intelligence/feed/"), NewsFeed("Ars Technica AI", "https://arstechnica.com/ai/feed/"), NewsFeed("Wired AI", "https://www.wired.com/feed/tag/ai/latest/rss"), NewsFeed("MIT Tech Review", "https://www.technologyreview.com/feed/"), NewsFeed("VentureBeat AI", "https://venturebeat.com/category/ai/feed/"), ), ), NewsCategory( id="newsletter", name="Newsletter 日报", icon="✉️", feeds=( NewsFeed("Ben's Bites", "https://bensbites.substack.com/feed"), NewsFeed("The Rundown AI", "https://therundown.substack.com/feed"), NewsFeed("Latent Space", "https://www.latent.space/feed"), NewsFeed("Simon Willison", "https://simonwillison.net/atom/everything/"), NewsFeed("Import AI", "https://importai.substack.com/feed"), NewsFeed("Last Week in AI", "https://lastweekin.ai/feed"), NewsFeed("The Neuron", "https://www.theneuron.ai/feed"), ), ), NewsCategory( id="research", name="研究 / 论文", icon="📚", feeds=( NewsFeed("arXiv cs.CL", "https://arxiv.org/rss/cs.CL"), NewsFeed("arXiv cs.AI", "https://arxiv.org/rss/cs.AI"), NewsFeed("arXiv cs.LG", "https://arxiv.org/rss/cs.LG"), ), ), NewsCategory( id="trending", name="热点 / 趋势", icon="🔥", feeds=( NewsFeed( "Google News · AI", "https://news.google.com/rss/search?q=artificial+intelligence+OR+LLM+OR+Claude+OR+GPT&hl=en-US&gl=US&ceid=US:en", ), NewsFeed( "Google News · Technology", "https://news.google.com/rss/headlines/section/topic/TECHNOLOGY?hl=en-US&gl=US&ceid=US:en", ), NewsFeed("Techmeme", "https://www.techmeme.com/feed.xml"), NewsFeed("HN · Front Page", "https://hnrss.org/frontpage"), NewsFeed("HN · 100+ Points", "https://hnrss.org/newest?points=100"), NewsFeed("Dev.to · AI", "https://dev.to/feed/tag/ai"), NewsFeed("Lobsters", "https://lobste.rs/rss"), ), ), NewsCategory( id="community", name="社区讨论", icon="💬", feeds=( NewsFeed( "HN · AI/LLM/Agent", "https://hnrss.org/newest?q=AI+OR+LLM+OR+Claude+OR+agent+OR+GPT+OR+Gemini", ), NewsFeed( "Reddit · LLM/Claude/ML", "https://old.reddit.com/r/LocalLLaMA+ClaudeAI+MachineLearning+OpenAI/.rss?limit=25", slow=True, ), ), ), )