编程 last30days 深度实战:当 AI 搜索「人」而不是「编辑」——跨平台信号聚合引擎的完全指南(2026)

2026-06-26 07:46:22 +0800 CST views 34

/last30days 深度实战:当 AI 搜索「人」而不是「编辑」——跨平台信号聚合引擎的完全指南(2026)

作者按:2026 年,搜索的本质正在发生范式转移。Google 聚合的是编辑过的内容,而 /last30days 聚合的是真实人类的注意力、投票和真金白银的下注。这不是另一个搜索引擎,而是一个由 AI Agent 驱动的「人类信号聚合器」。

目录

  1. 为什么传统搜索在 AI 时代失效了?
  2. /last30days 是什么?——「搜索人」的哲学
  3. 架构深度解析:多平台信号聚合引擎
  4. 信号来源全景:从 Reddit 到 Polymarket
  5. 核心技术:智能路由与 Agentic 搜索
  6. 实战安装:30 秒完成全平台配置
  7. 生产级用例:销售前调研、会议准备、工具选型
  8. v3 架构升级:可分享 HTML 简报与智能搜索
  9. 深度对比:/last30days vs Perplexity vs Google vs ChatGPT
  10. 代码实战:从零集成到你的 AI Agent 工作流
  11. 性能优化:如何自定义信号权重与过滤规则
  12. 安全与隐私:本地运行 vs 云端 API
  13. Roadmap 与未来:AI 搜索的下一个前沿
  14. 总结:你应该什么时候用 /last30days?

1. 为什么传统搜索在 AI 时代失效了?

1.1 编辑 vs 人——信号源的代际鸿沟

当你 Google 一个人名、一家公司、一个技术工具时,你得到的是什么?

  • LinkedIn 简历(可能过时 3 年)
  • 官网 PR 稿(精心修饰过的叙事)
  • 科技媒体转载(二手甚至三手信息)

这些信息有一个共同特点:它们都是「编辑过的」内容。有人写了它,有人审核了它,有人发布了它。在信息流动速度以「天」为单位的时代,这种延迟尚可接受。但在 2026 年,AI 领域每天都在发生范式转移——今天的热点时明天可能已经被颠覆。

真实信号在哪里?

  • Reddit 一个 1500 upvote 的评论,比一篇 SEO 优化的博客文章更接近真相
  • X 上一个领域专家的长线程,往往比新闻稿早 48 小时泄露关键信息
  • Polymarket 上 96% 置信度的下注,背后是真金白银的集体智慧
  • YouTube 一个 45 分钟深度访谈的转录,藏着 Google 搜索结果前 3 页都找不到的细节

问题是:没有哪个单一 AI 能同时访问所有这些平台

  • Google 搜索不碰 Reddit 评论区
  • ChatGPT 有 Reddit 合作,但看不到 X 或 TikTok
  • Gemini 能看 YouTube,但 Reddit 是盲区
  • Claude 默认情况下哪个平台都无法原生访问

每个平台都是一座围墙花园,各自有独立的 API、独立的鉴权、独立的速率限制。

1.2 传统搜索的三大致命伤

① SEO 污染严重

2026 年的搜索结果,前 3 页往往被 SEO 农场、联盟营销网站、内容聚合平台占据。真实的人类讨论被挤出第一屏。

② 时效性问题

Google 的索引周期通常以「天」或「周」为单位。当一个重大技术发布发生时,你搜到的是发布会通稿,而不是社区的真实反应。

③ 无法感知「热度」

一篇 2024 年写的「最佳 AI 编程工具」排行榜,在 2026 年 6 月仍然可能排在前面——因为 SEO 做得好。但它完全无法反映当前社区的真实讨论热点。

1.3 信号类型学:什么才是「真实的人类信号」?

/last30days 的核心洞察是:不同类型的信号,权重不同,可信度不同,适用场景也不同

信号类型代表平台核心价值局限性
Upvote 信号Reddit, Hacker News社区集体判断,抗操纵性较强存在「回音室效应」
Like/Engagement 信号X, TikTok, Instagram实时热点,专家渠道算法推荐可能造成偏差
资金背书信号Polymarket, Kalshi真金白银,置信度最高仅适用于可预测事件
代码活跃度信号GitHub客观指标,不易伪造需要技术背景才能解读
长内容深度信号YouTube 转录, 播客信息密度高,上下文完整处理成本高,需要转录

2. /last30days 是什么?——「搜索人」的哲学

2.1 项目背景

/last30days 是由 Peter Steinberger(@steipete)开发的一个 AI Agent Skill,其设计哲学可以用一句话概括:

Google 聚合编辑,/last30days 搜索人。

这个项目在 2026 年 3 月发布后,迅速在 AI Agent 社区走红,GitHub Star 数突破 12,924(截至 6 月仍在快速增长)。它不仅是一个搜索工具,更是一个关于「如何在 AI 时代获取真实信号」的方法论实践。

2.2 核心工作流

用户输入: /last30days <topic> [options]
                ↓
    ┌───────────────────────────────┐
    │   智能路由层(v3 新特性)    │
    │  自动识别搜索目标类型          │
    │  - 人名 → X + Reddit + GH    │
    │  - 公司 → Polymarket + HN    │
    │  - 技术工具 → GitHub + HN    │
    └───────────────────────────────┘
                ↓
    ┌───────────────────────────────┐
    │   并行多平台搜索(Agent 池)  │
    │   Reddit │ X │ YouTube │ HN   │
    │   Polymarket │ GitHub │ TikTok│
    │   ... (可扩展插件架构)        │
    └───────────────────────────────┘
                ↓
    ┌───────────────────────────────┐
    │   信号评分与排序              │
    │   - upvote 数(Reddit/HN)   │
    │   - like/retweet(X)        │
    │   - 资金量(Polymarket)     │
    │   - Star/PR 活跃度(GitHub) │
    └───────────────────────────────┘
                ↓
    ┌───────────────────────────────┐
    │   AI Agent 综合法官           │
    │   聚合所有信号 → 生成简报    │
    │   - 关键发现                  │
    │   - 争议点                    │
    │   - 置信度                    │
    └───────────────────────────────┘
                ↓
            输出: Markdown / HTML

2.3 「零配置」设计哲学

/last30days 最优雅的设计决策之一:Reddit、Hacker News、Polymarket、GitHub 开箱即用,无需 API Key

这意味着你可以直接运行:

/last30days OpenClaw

立刻获得关于 OpenClaw 的跨平台信号聚合结果——不需要申请任何 API Key,不需要配置 OAuth,不需要信用卡。

其他平台(X、YouTube、TikTok 等)则通过内置的设置向导,可以在 30 秒内完成配置。


3. 架构深度解析:多平台信号聚合引擎

3.1 整体架构(v3 Pipeline)

/last30days 的架构可以分为 5 层:

┌─────────────────────────────────────────────────┐
│              Layer 5: 输出层                    │
│   Markdown 综合 | HTML 简报 | JSON 结构化数据  │
└─────────────────────────────────────────────────┘
                         ↑
┌─────────────────────────────────────────────────┐
│              Layer 4: 综合法官层                │
│   AI Agent 聚合所有平台信号 → 生成统一简报     │
│   支持自定义 Judge Prompt                       │
└─────────────────────────────────────────────────┘
                         ↑
┌─────────────────────────────────────────────────┐
│              Layer 3: 信号评分层                │
│   跨平台归一化评分                              │
│   - Reddit: upvote_ratio × num_comments        │
│   - X: like_count × influence_score            │
│   - Polymarket: volume × (YES% - 50%)²        │
└─────────────────────────────────────────────────┘
                         ↑
┌─────────────────────────────────────────────────┐
│              Layer 2: Agent 执行层              │
│   并行调用各平台 Adapter                        │
│   每个平台 = 一个独立的 Agent Skill             │
│   支持超时、重试、降级                         │
└─────────────────────────────────────────────────┘
                         ↑
┌─────────────────────────────────────────────────┐
│              Layer 1: 智能路由层(v3 新增)    │
│   输入话题 → 自动推断应该搜索哪些平台           │
│   例如: "Peter Steinberger"                    │
│   → 自动添加 @steipete + r/openclaw + ...     │
└─────────────────────────────────────────────────┘

3.2 智能路由层(Intelligent Search)—— v3 杀手级特性

v3 最大的架构升级是智能路由层。在传统设计中,用户输入一个话题,系统会「盲目地」在所有平台上搜索这个话题。但 v3 做了一个关键优化:

在搜索开始之前,先搞清楚「应该去哪里搜」

3.2.1 路由决策树

def route_query(topic: str) -> List[Platform]:
    """
    智能路由:根据话题类型,自动选择最优平台组合
    """
    topic_lower = topic.lower()
    
    # 人名检测(包含 @username 或已知人物)
    if is_person_name(topic) or topic.startswith('@'):
        return [
            Platform.X,           # 最新动态
            Platform.Reddit,      # 社区讨论
            Platform.GitHub,      # 代码贡献
            Platform.YouTube,     # 访谈/演讲
        ]
    
    # 技术工具/框架
    if is_tech_tool(topic):
        return [
            Platform.GitHub,      # Star 趋势、PR 活跃度
            Platform.HackerNews,  # 技术讨论
            Platform.Reddit,      # r/MachineLearning 等
            Platform.YouTube,     # 教程/评测
        ]
    
    # 公司/产品
    if is_company_or_product(topic):
        return [
            Platform.X,           # 官方公告 + 社区反应
            Platform.HackerNews,  # HN 讨论
            Platform.Polymarket,  # 收购/IPO 预测
            Platform.Reddit,      # 用户反馈
        ]
    
    # 新闻事件/政治
    if is_news_event(topic):
        return [
            Platform.Polymarket,  # 预测市场
            Platform.X,           # 实时反应
            Platform.Reddit,      # 深度讨论
            Platform.YouTube,     # 新闻分析
        ]
    
    # 默认:全平台搜索
    return Platform.all()

3.2.2 实战案例:搜索 "OpenClaw"

当你输入 /last30days OpenClaw,v3 的路由层会:

  1. 识别为「技术工具」
  2. 自动解析实体
    • GitHub 仓库:openclaw/openclaw(351K stars)
    • Reddit 社区:r/openclaw, r/ClaudeCode
    • 关键人物:@steipete(Peter Steinberger)
    • YouTube 频道:相关技术评测频道
  3. 生成平台专属查询
    • X: OpenClaw OR @steipete OR "Peter Steinberger" claude code
    • Reddit: r/openclaw OR r/ClaudeCode: "OpenClaw"
    • GitHub: repo:openclaw/openclaw OR stars:>10000
    • HN: OpenClaw OR "AI agent" OR "personal AI assistant"

这种「先理解,再搜索」的模式,比简单的关键词搜索效率高 3-5 倍。

3.3 Agent 执行层:并行化与容错

/last30days 使用 Python asyncio 实现真正的并行搜索。每个平台 Adapter 都是一个独立的 async 函数:

import asyncio
from typing import List, Dict, Any

async def search_all_platforms(
    topic: str, 
    platforms: List[Platform],
    max_concurrent: int = 5
) -> Dict[Platform, List[Signal]]:
    """
    并行搜索所有平台,带超时和容错
    """
    semaphore = asyncio.Semaphore(max_concurrent)
    
    async def search_with_semaphore(platform: Platform):
        async with semaphore:
            try:
                # 每个平台有独立的超时设置
                return await asyncio.wait_for(
                    platform_adapter.search(topic),
                    timeout=platform.timeout
                )
            except asyncio.TimeoutError:
                logger.warning(f"{platform.name} 搜索超时,跳过")
                return []
            except Exception as e:
                logger.error(f"{platform.name} 搜索失败: {e}")
                return []  # 优雅降级:单个平台失败不影响整体
    
    tasks = [search_with_semaphore(p) for p in platforms]
    results = await asyncio.gather(*tasks)
    
    return dict(zip(platforms, results))

关键设计决策

  1. 独立超时:每个平台有不同的合理超时时间(Reddit: 5s, X: 10s, YouTube: 15s)
  2. 优雅降级:单个平台 API 限流或失败,不影响其他平台结果
  3. 信号归一化:所有平台返回统一格式的 Signal 对象,便于后续评分

3.4 信号评分层:跨平台归一化

这是 /last30days 最核心的算法创新。不同平台的「热度指标」完全不同,如何把它们放在同一个坐标系下比较?

3.4.1 归一化评分公式

@dataclass
class Signal:
    platform: Platform
    content: str
    url: str
    author: str
    
    # 平台原生指标
    upvote_count: int = 0
    comment_count: int = 0
    view_count: int = 0
    like_count: int = 0
    volume_usd: float = 0.0  # Polymarket 专用
    
    # 归一化后的综合分数 (0-100)
    normalized_score: float = 0.0
    
    # 引用/来源标记
    citations: List[str] = field(default_factory=list)


def compute_normalized_score(signal: Signal) -> float:
    """
    跨平台归一化评分
    
    核心思路: 使用对数缩放 + 平台权重调整
    """
    if signal.platform == Platform.Reddit:
        # Reddit: upvote 是核心指标,评论数反映讨论深度
        raw = signal.upvote_count * log10(max(signal.comment_count, 1))
        return min(100, log10(raw) * 20)
    
    elif signal.platform == Platform.HackerNews:
        # HN: points + comments,但权重更高(技术社区质量更高)
        raw = signal.upvote_count * 1.5 + signal.comment_count * 3
        return min(100, log10(raw) * 18)
    
    elif signal.platform == Platform.X:
        # X: like + retweet + 作者影响力
        influence = get_user_influence(signal.author)
        raw = (signal.like_count + signal.retweet_count * 2) * influence
        return min(100, log10(raw) * 15)
    
    elif signal.platform == Platform.Polymarket:
        # Polymarket: 资金量是硬指标
        # 同时考虑置信度(YES% 离 50% 越远,信号越强)
        confidence = abs(signal.yes_probability - 0.5) * 2  # 0-1
        raw = signal.volume_usd * confidence
        return min(100, log10(raw) * 25)
    
    elif signal.platform == Platform.GitHub:
        # GitHub: star 增速 + PR/Issue 活跃度
        velocity = compute_star_velocity(signal.repo)
        activity = signal.recent_prs + signal.recent_issues
        raw = velocity * 1000 + activity * 10
        return min(100, log10(raw) * 12)
    
    else:
        return 50  # 未知平台:中性分数

3.4.2 为什么用对数缩放?

因为各平台的指标跨度极大:

  • Reddit 一个热门帖子可能有 50,000 upvotes
  • X 一条爆款推文可能有 500,000 likes
  • Polymarket 一个市场可能有 $2,000,000 交易量

如果直接用原始数值,Polymarket 的信号会完全压倒其他平台。对数缩放(log10(raw) * factor)可以把所有信号压缩到同一个数量级,同时保留「热门内容」的相对排序。

3.5 综合法官层:AI Agent 作为「总编辑」

当所有平台的信号都收集完毕后,/last30days 会调用一个 AI Agent(默认使用 Claude 或 GPT-4)作为「综合法官」,负责:

  1. 去重:不同平台可能讨论同一件事,需要合并
  2. 冲突解决:如果 Reddit 说 X,但 HN 说 Y,法官需要标注争议
  3. 上下文补充:将零散的信号拼成一个连贯的叙事
  4. 置信度标注:对每条关键发现标注「高/中/低」置信度

综合法官的 Prompt 工程

## Role: 跨平台信号综合法官

你是一个中立的综合法官。你的任务是基于以下来自多个平台的信号,
生成一个客观、全面、有深度的简报。

## 输入信号

{% for platform, signals in all_signals.items() %}
### {{ platform.name }}
{% for signal in signals %}
- [分数: {{ signal.normalized_score }}] {{ signal.content[:200] }}
  来源: {{ signal.url }}
  作者: {{ signal.author }}
{% endfor %}
{% endfor %}

## 输出要求

1. **关键发现**(按重要性排序)
   - 每条发现必须引用至少 2 个独立来源
   - 标注置信度(高/中/低)

2. **争议点**(如有)
   - 不同平台的观点冲突
   - 社区内部的分歧

3. **被忽略的信号**(如有)
   - 某些平台可能有独特视角,但被其他平台淹没

4. **元分析**
   - 整体信号一致性如何?
   - 是否存在「回音室效应」?
   - 资金信号(Polymarket)与舆论信号是否一致?

## 格式要求

- 使用 Markdown
- 每个关键发现后附引用列表
- 总字数控制在 500-1500 字

4. 信号来源全景:从 Reddit 到 Polymarket

4.1 Reddit:社区的「真实声音」

为什么 Reddit 信号价值极高?

  1. Upvote 机制:高质量评论会自然浮到顶部
  2. 长文文化:Reddit 允许(甚至鼓励)长篇深度分析
  3. 匿名性:用户更可能说真话(不需要维护「个人品牌」)
  4. 公开 JSON API:无需 API Key 即可读取(这是 /last30days 能「零配置」使用 Reddit 的技术基础)

/last30days 如何搜索 Reddit?

import requests
from typing import List

def search_reddit(query: str, subreddits: List[str] = None) -> List[Signal]:
    """
    使用 Reddit 公开 JSON API 搜索
    
    关键点: Reddit 的 ?q= 参数支持在其 JSON 端点直接搜索
    """
    if subreddits is None:
        # 智能路由层会在这里传入自动识别的 subreddit 列表
        subreddits = detect_relevant_subreddits(query)
    
    signals = []
    
    for subreddit in subreddits:
        url = f"https://www.reddit.com/r/{subreddit}/search.json"
        params = {
            "q": query,
            "sort": "relevance",  # 也支持 "hot", "top", "new"
            "t": "month",          # 时间范围: hour, day, week, month, year, all
            "limit": 25,
            "raw_json": 1,        # 返回原始 JSON(不需要 OAuth)
        }
        
        response = requests.get(url, params=params, headers={
            "User-Agent": "last30days-skill/3.0 (by /u/steipete)"
        })
        
        if response.status_code == 200:
            data = response.json()
            for post in data["data"]["children"]:
                signals.append(parse_reddit_post(post))
    
    return signals


def parse_reddit_post(post_data: dict) -> Signal:
    """解析 Reddit 帖子为统一 Signal 格式"""
    post = post_data["data"]
    return Signal(
        platform=Platform.Reddit,
        content=post["selftext"] or post["title"],
        url=f"https://reddit.com{post['permalink']}",
        author=post["author"],
        upvote_count=post["ups"],
        comment_count=post["num_comments"],
        created_at=datetime.fromtimestamp(post["created_utc"]),
    )

实战技巧

  • 使用 sort: "top" + t: "week" 可以获取「本周最热门」的讨论
  • 某些技术话题在 r/MachineLearningr/LocalLLaMA 的讨论质量远高于通用技术论坛

4.2 X (Twitter):实时热点的「第一现场」

为什么 X 信号不可或缺?

  1. 实时性:重大新闻往往先在 X 上爆出
  2. 专家渠道:AI 领域的核心人物(Andrej Karpathy, Sam Altman, Yann LeCun 等)都在 X 上活跃
  3. 长线程文化:很多技术深度分析以「长线程」形式出现在 X 上

/last30days 如何接入 X?

X 的 API 需要申请(且收费),所以 /last30days 提供了两种模式:

模式 1:使用 X API(需要配置)

import tweepy

def search_x_with_api(query: str, bearer_token: str) -> List[Signal]:
    """使用 Tweepy 调用 X API v2"""
    client = tweepy.Client(bearer_token=bearer_token)
    
    # 搜索最近 7 天的推文
    tweets = client.search_recent_tweets(
        query=query,
        max_results=100,
        tweet_fields=["public_metrics", "author_id", "created_at"],
        expansions=["author_id"]
    )
    
    # 获取作者信息(用于计算 influence score)
    authors = {u.id: u for u in tweets.includes["users"]}
    
    signals = []
    for tweet in tweets.data:
        author = authors[tweet.author_id]
        metrics = tweet.public_metrics
        
        signals.append(Signal(
            platform=Platform.X,
            content=tweet.text,
            url=f"https://x.com/{author.username}/status/{tweet.id}",
            author=author.username,
            like_count=metrics["like_count"],
            retweet_count=metrics["retweet_count"],
            reply_count=metrics["reply_count"],
        ))
    
    return signals

模式 2:使用浏览器会话(无需 API Key)

/last30days 支持通过「导入浏览器 Cookie」的方式访问 X,绕开 API 限制:

# 首次配置:从默认浏览器导入 Cookie
/last30days --setup x

# 之后就可以直接搜索 X 了
/last30days OpenClaw

这种方式的原理是:/last30days 会读取你浏览器中已登录 X 的 Cookie,然后使用这些 Cookie 发起搜索请求。这意味着你用你的 X 账号配额来搜索

4.3 YouTube:深度内容的「转录金矿」

为什么 YouTube 是重要的信号源?

很多人忽视了 YouTube 作为「文本信号源」的价值。事实上:

  • 一个 45 分钟的 AI 技术访谈,转录后约等于 8000-10000 个英文单词
  • 这些转录文本中,往往包含技术细节、路线图爆料、团队内部信息——这些在官方文档和新闻稿中找不到

/last30days 如何处理 YouTube?

核心流程:

  1. 搜索 YouTube 视频(使用 YouTube Data API 或免 API 的 yt-dlp
  2. 下载自动生成字幕(YouTube 大多数英文视频都有自动生成字幕)
  3. 用 LLM 提取关键句子(从 10000 词中找出最有价值的 5-10 句话)
  4. 纳入综合评分
import yt_dlp
import whisper  # 备用:如果视频没有自动字幕,用 Whisper 转录

def process_youtube_query(query: str) -> List[Signal]:
    """
    搜索 YouTube 视频并提取转录文本
    """
    # 1. 搜索视频
    ydl_opts = {
        "quiet": True,
        "no_warnings": True,
        "extract_flat": True,  # 只获取视频列表,不下载
    }
    
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        result = ydl.extract_info(f"ytsearch20:{query}", download=False)
        videos = result["entries"]
    
    signals = []
    for video in videos[:10]:  # 只处理前 10 个最相关视频
        # 2. 尝试获取自动字幕
        transcript = get_youtube_transcript(video["id"])
        
        if transcript:
            # 3. 用 LLM 提取关键句子
            key_quotes = extract_key_quotes(transcript, query)
            
            signals.append(Signal(
                platform=Platform.YouTube,
                content=key_quotes,  # 只保留最相关的 5-10 句话
                url=f"https://youtube.com/watch?v={video['id']}",
                author=video["channel"],
                view_count=video["view_count"],
                like_count=video.get("like_count", 0),
            ))
    
    return signals


def extract_key_quotes(transcript: str, topic: str) -> str:
    """
    使用 LLM 从完整转录中提取与话题相关的关键引用
    
    这是 /last30days 的「压缩」策略:
    不把 10000 词的全文扔给综合法官,
    而是先提取 5-10 句最核心的引用。
    """
    prompt = f"""
    以下是一段 YouTube 视频的转录文本(约 {len(transcript)} 字符)。
    请提取与「{topic}」直接相关的关键引用(最多 10 句)。
    
    要求:
    - 保留原话,不要改写
    - 如果某句话包含技术细节、数据、预测,优先保留
    - 格式: > "引用的原文" (时间戳: MM:SS)
    
    转录文本:
    {transcript[:10000]}  # 截断,避免超 token 限制
    """
    
    # 调用 LLM(默认使用技能配置的 model)
    response = llm_complete(prompt)
    return response

4.4 Polymarket:真金白银的「预测信号」

为什么 Polymarket 信号是「最高置信度」?

Polymarket 是一个去中心化预测市场。用户可以用真金白银下注某个事件是否会发生。

核心逻辑:如果你真的相信某件事会发生,你会用钱投票。

一个 Polymarket 市场的价格(例如「YES: 87%」)可以被解读为:

在考虑了所有公开信息后,市场参与者认为这件事发生的概率是 87%

这种信号的独特价值:

  1. 高置信度:错误的预测 = 直接的金钱损失
  2. 前瞻性:Polymarket 的价格往往领先新闻 24-48 小时
  3. 抗操纵性:虽然大户可以短期影响价格,但长期会趋向真实概率

/last30days 如何集成 Polymarket?

import requests

def search_polymarket(query: str) -> List[Signal]:
    """
    搜索 Polymarket 上与 query 相关的市场
    """
    # Polymarket 的公开 API(无需 Key)
    url = "https://gamma-api.polymarket.com/markets"
    params = {
        "closed": "false",
        "limit": 100,
    }
    
    response = requests.get(url, params=params)
    markets = response.json()
    
    # 过滤与 query 相关的市场
    relevant_markets = []
    for market in markets:
        title = market["question"]
        description = market.get("description", "")
        
        if query.lower() in title.lower() or \
           query.lower() in description.lower():
            relevant_markets.append(market)
    
    # 转换为 Signal 格式
    signals = []
    for market in relevant_markets:
        # 获取当前市场价格
        outcomes = market["outcomes"]
        yes_outcome = next(o for o in outcomes if o["outcome"] == "YES")
        yes_price = yes_outcome["price"]  # 0-1
        
        # 计算总交易量
        volume = market.get("volume", 0)
        
        signals.append(Signal(
            platform=Platform.Polymarket,
            content=f"市场: {market['question']}\n"
                    f"YES 概率: {yes_price*100:.1f}%\n"
                    f"总交易量: ${volume:,.0f}",
            url=f"https://polymarket.com/market/{market['slug']}",
            yes_probability=yes_price,
            volume_usd=volume,
        ))
    
    return signals

实战案例

/last30days Kanye West

Polymarket 信号:
- "Will Kanye tweet again?" → YES: 86%, 交易量 $66K
- "Will Donda 2 be released in 2026?" → YES: 73%, 交易量 $42K

这些信号比任何「娱乐新闻」都更接近真实预测。

4.5 其他平台速览

平台信号类型/last30days 集成方式
Hacker News技术讨论、开发者共识公开 API(https://hacker-news.firebaseio.com/v0/),零配置
GitHub代码活跃度、Star 趋势公开 API(未认证: 60次/小时,认证后: 5000次/小时)
TikTok创作者观点、文化信号需要配置(Cookie 导入或 API Key)
Instagram影响者观点需要配置
Threads文本讨论(X 替代品)需要配置
DiggAI 精选热点(~1000 高信号账号)安装 digg-pp-cli 即可启用,无需 Key
PerplexityGrounded 搜索结果可作为「额外信号源」叠加,非替代

5. 核心技术:智能路由与 Agentic 搜索

5.1 v3 的 Intelligent Search 详解

v3 的杀手级特性是智能路由。在用户按下回车后、搜索开始之前,/last30days 会先做一次「查询理解」:

class IntelligentRouter:
    """
    智能路由器:理解查询意图,选择最优平台组合
    """
    
    def __init__(self):
        # 加载预训练的 NER 模型(用于识别人名、公司名、技术术语)
        self.ner_model = load_ner_model()
        
        # 加载平台-话题关联知识库
        self.platform_associations = load_platform_associations()
    
    def route(self, query: str) -> RoutingDecision:
        """
        核心路由逻辑
        
        返回:
            RoutingDecision: 包含以下字段
                - platforms: 应该搜索的平台列表
                - platform_queries: 每个平台的定制化查询字符串
                - confidence: 路由决策的置信度
                - reasoning: 为什么选择这些平台(用于调试)
        """
        # 第 1 步: NER —— 识别查询中的实体
        entities = self.ner_model.extract(query)
        
        # 第 2 步: 实体类型判断
        person_names = [e for e in entities if e.type == "PERSON"]
        org_names = [e for e in entities if e.type == "ORG"]
        tech_terms = [e for e in entities if e.type == "TECH"]
        
        # 第 3 步: 根据实体类型选择平台
        if person_names:
            return self._route_person_query(person_names[0].text, query)
        elif org_names:
            return self._route_org_query(org_names[0].text, query)
        elif tech_terms:
            return self._route_tech_query(tech_terms[0].text, query)
        else:
            # 无法识别实体 → 全文搜索模式
            return self._route_generic_query(query)
    
    def _route_person_query(self, person_name: str, original_query: str) -> RoutingDecision:
        """
        人名查询的路由逻辑
        
        例如: "/last30days Peter Steinberger"
        """
        # 尝试在已知人物库中查找
        known_person = self.platform_associations.get_person(person_name)
        
        if known_person:
            # 已知人物:使用预设的平台-账号关联
            platforms = []
            queries = {}
            
            if known_person.has_x_account:
                platforms.append(Platform.X)
                queries[Platform.X] = f"from:{known_person.x_username} OR @{known_person.x_username}"
            
            if known_person.has_github:
                platforms.append(Platform.GitHub)
                queries[Platform.GitHub] = f"user:{known_person.github_username}"
            
            if known_person.has_reddit_presence:
                platforms.append(Platform.Reddit)
                queries[Platform.Reddit] = f"author:{known_person.reddit_username}"
            
            # 始终添加: HN, YouTube(可能包含访谈)
            platforms.extend([Platform.HackerNews, Platform.YouTube])
            queries[Platform.HackerNews] = person_name
            queries[Platform.YouTube] = person_name
        else:
            # 未知人物:使用通用搜索
            platforms = Platform.default_for_person()
            queries = {p: person_name for p in platforms}
        
        return RoutingDecision(
            platforms=platforms,
            platform_queries=queries,
            confidence=0.9 if known_person else 0.5,
            reasoning=f"识别出人名: {person_name}, "
                     f"已知人物: {known_person is not None}, "
                     f"选择平台: {[p.name for p in platforms]}"
        )

/last30days 的另一个核心技术是Agentic Tree Search(受到 AI-Scientist-v2 的启发)。

当搜索一个开放性话题时(例如「AI 编程工具的未来」),简单的「关键词搜索」远远不够。你需要:

  1. 先搜索 → 获得初步结果
  2. 分析结果 → 发现新的子话题
  3. 再搜索 → 深入子话题
  4. 迭代 → 直到覆盖所有重要角度

这就是 Agentic Tree Search:

async def agentic_tree_search(
    root_query: str,
    max_depth: int = 3,
    branching_factor: int = 3
) -> SearchTree:
    """
    Agentic Tree Search: 迭代式深度探索
    
    类比: 像一个有好奇心的研究员,
         看到一篇有趣论文 → 追踪其参考文献 → 再追踪那些参考文献的参考文献
    """
    
    root_node = SearchTreeNode(query=root_query)
    queue = [(root_node, 0)]  # (node, depth)
    
    while queue:
        current_node, depth = queue.pop(0)
        
        if depth >= max_depth:
            continue
        
        # 1. 在当前节点执行搜索
        signals = await search_all_platforms(current_node.query, Platform.all())
        
        # 2. 让 AI Agent 分析搜索结果,提出「下一步探索方向」
        follow_up_questions = await propose_follow_ups(
            query=current_node.query,
            signals=signals,
            num_questions=branching_factor
        )
        
        # 3. 为每个「下一步方向」创建一个子节点
        for question in follow_up_questions:
            child_node = SearchTreeNode(
                query=question,
                parent=current_node,
                depth=depth + 1
            )
            current_node.children.append(child_node)
            queue.append((child_node, depth + 1))
    
    return root_node.to_tree()


async def propose_follow_ups(
    query: str,
    signals: Dict[Platform, List[Signal]],
    num_questions: int = 3
) -> List[str]:
    """
    让 AI Agent 分析当前搜索结果,提出值得深入探索的子问题
    """
    prompt = f"""
    关于「{query}」,我们已经收集了来自以下平台的信号:
    
    {{ 信号摘要 }}
    
    基于这些信号,请提出 {num_questions} 个最值得进一步探索的子问题。
    要求:
    - 子问题应该是具体的、可搜索的
    - 优先选择那些「当前信号不足」但有高信息量的方向
    - 避免重复已有的搜索
    
    输出格式:
    1. <子问题 1>
    2. <子问题 2>
    ...
    """
    
    response = await llm_complete(prompt)
    return parse_questions(response)

实战案例

初始查询: /last30days AI 编程工具

Tree Search 展开:
├── AI 编程工具
│   ├── Cursor vs Windsurf vs Claude Code 深度对比
│   │   ├── Cursor 的上下文理解原理
│   │   ├── Windsurf Cascade 架构解析
│   │   └── Claude Code 的 Agent 模式实现
│   ├── AI 编程工具的 Token 成本分析
│   │   ├── 各工具的 Token 消耗对比
│   │   └── 如何优化 Token 使用
│   └── 2026 年 AI 编程工具格局预测
│       ├── OpenClaw 生态的影响
│       └── 本地模型 vs 云端 API 的博弈

这种「迭代式探索」让 /last30days 能够生成有深度、有层次的简报,而不是简单的「信息堆砌」。


6. 实战安装:30 秒完成全平台配置

6.1 Claude Code 安装(推荐)

# 方式 1: 通过 Marketplace 安装(自动更新)
/plugin marketplace add mvanhorn/last30days-skill
/plugin install last30days

# 方式 2: 通过 npx 安装(适用于所有 AI Agent)
npx skills add mvanhorn/last30days-skill -g

6.2 首次运行与配置向导

安装完成后,直接运行一次:

/last30days test

零配置平台(立即可用):

  • ✅ Reddit(公开 JSON API)
  • ✅ Hacker News(公开 Firebase API)
  • ✅ Polymarket(公开 Gamma API)
  • ✅ GitHub(未认证 60次/小时)

需要配置的平台(运行向导后可用):

# 启动交互式配置向导
/last30days --setup

# 向导会引导你配置:
# 1. X (Twitter)     → 选择: API Key 或 浏览器 Cookie 导入
# 2. YouTube          → 输入: YouTube Data API Key(免费配额 10,000 次/天)
# 3. TikTok           → 浏览器 Cookie 导入
# 4. Instagram        → 浏览器 Cookie 导入
# 5. Digg             → 安装 digg-pp-cli(用于 AI 精选热点)

配置向导的「30 秒承诺」

  • Reddit/HN/Polymarket/GitHub 开箱即用(0 秒)
  • X: 如果选择「浏览器 Cookie 导入」→ 5 秒
  • YouTube: 如果已有 API Key → 10 秒;否则需要去 Google Cloud Console 创建(约 3 分钟)
  • TikTok/Instagram: Cookie 导入 → 各 5 秒

6.3 配置文件结构

/last30days 的配置存储在:

~/.last30days/
├── config.json          # 主配置文件
├── credentials/         # API Keys 和 Tokens(加密存储)
│   ├── x_token.enc
│   ├── youtube_api_key.enc
│   └── github_token.enc
├── cache/              # 搜索结果缓存(避免重复调用 API)
└── output/             # 生成的简报存放目录
    └── {topic}-brief.html

config.json 示例:

{
  "version": "3.0",
  "platforms": {
    "reddit": {
      "enabled": true,
      "subreddits_whitelist": ["python", "MachineLearning", "LocalLLaMA"],
      "min_upvotes": 10
    },
    "x": {
      "enabled": true,
      "auth_method": "cookie_import",
      "max_results": 100
    },
    "youtube": {
      "enabled": true,
      "api_key_env_var": "YOUTUBE_API_KEY",
      "transcript_languages": ["en", "zh"]
    },
    "polymarket": {
      "enabled": true,
      "min_volume_usd": 1000
    }
  },
  "output": {
    "default_format": "markdown",
    "emit_html": true,
    "html_theme": "dark"
  },
  "cache": {
    "enabled": true,
    "ttl_seconds": 3600
  }
}

7. 生产级用例:销售前调研、会议准备、工具选型

7.1 用例 1:销售前调研(B2B)

场景:你明天要和一家 AI 创业公司的 CTO 开会。你需要快速了解:

  • 这家公司最近 30 天的真实动态(新产品发布?融资?人员变动?)
  • CTO 的个人观点和技术偏好(从他的 X 线程、Reddit 评论、访谈转录中提取)
  • 社区对这家公司的真实评价(Reddit 有没有吐槽?HN 有没有技术讨论?)

/last30days 工作流

# 第 1 步: 搜索公司
/last30days Listen Labs --emit=html

# 输出: ~/Documents/Last30Days/listen-labs-brief.html
# 包含:
# - 最近 30 天的 GitHub 活跃度(PR 合并率、发布频率)
# - X 上的公告和社区反应
# - 如果有融资新闻,Polymarket 可能有相关市场

# 第 2 步: 搜索 CTO 个人
/last30days "@cto_username" --emit=html

# 输出: 包含 CTO 最近 30 天的公开活动
# - X 线程: 他最近在关注什么技术?
# - 访谈/播客: 他最近说了什么有争议的话?
# - GitHub: 他最近在写什么代码?

真实案例(来自 /last30days 的 README):

搜索 "Peter Steinberger"(OpenClaw 作者)的输出摘要:

  • 加入 OpenAI Codex 团队
  • 正在与 Anthropic 的「第三方 Agent 封禁」政策斗争
  • GitHub: 最近 30 天合并 23 个 PR,合并率 85%
  • 正在开发 "LobsterOS"(跨设备 Agent 控制系统)
  • r/ClaudeCode: 「自从 OpenClaw 发布,大家都知道如果用非 API 方式运行,迟早会被封号」(227 upvotes)

这些信息,你无法从 LinkedIn 或官网获得

7.2 用例 2:会议准备(了解一个人)

场景:你明天要和一位业界大佬一对一面谈。你想在 5 分钟内建立起「我了解你」的信任感。

传统方式

  • Google 搜索 → 得到 2023 年的旧 LinkedIn
  • 看公司官网 → 得到 PR 稿

/last30days 方式

/last30days "Dr. Jane Smith" --depth=comprehensive

输出简报结构:

  1. 最近 30 天活动摘要(按时间倒序)

    • 6 月 24 日: 在 r/MachineLearning 回复了一个关于 MoE 架构的帖子(142 upvotes)
    • 6 月 22 日: 在 YouTube 接受 "AI Insight" 频道访谈,提到「...」
    • 6 月 20 日: 在 X 上批评了某篇论文的方法论(237 likes, 42 retweets)
  2. 技术观点提炼

    • 对 MoE 架构: 持保留意见,认为「细粒度 MoE 的通信开销被低估了」
    • 对 Post-Training: 认为「当前 RLHF 范式会在 2027 年被替代」
  3. 争议点(如果有的话)

    • r/ML 上有人质疑她 2025 年论文的实验设计 → 她亲自下场回复了(长文,获 89 upvotes)

面谈时能够自然提到的「破冰话题」

「Jane,我看了你前几天在 r/MachineLearning 关于 MoE 的回复,你提到的通信开销问题,我们在生产中也遇到了。你觉得细粒度 MoE 在 2026 年还有救吗?」

7.3 用例 3:工具选型(技术决策者)

场景:你的团队需要选一个 AI 编程助手。Cursor?Windsurf?Claude Code?Trae?

传统方式

  • 看官方文档( biased )
  • 看「AI 工具横评」文章(往往过时 6-12 个月)

/last30days 方式

/last30days "Cursor IDE" vs "Windsurf" vs "Claude Code" --comparison

输出简报包含:

  1. 各工具最近 30 天的 GitHub Star 增速(实时数据,非 stale 博客)
  2. 社区讨论热度对比(Reddit 和 HN 的提及次数、情绪分析)
  3. 关键争议点
    • Cursor: 被吐槽「上下文窗口不够大」
    • Windsurf: 被批评「Cascade 有时会产生幻觉」
    • Claude Code: 被封号的风险(如果使用非官方 API)
  4. 真实用户案例(从 Reddit 和 HN 提取)
  5. Polymarket 信号(如果有的话):「Cursor 会在 2026 年被 Windsurf 超越吗?」→ 市场价格隐含的预测

决策辅助:简报最后会给出一个「综合评分卡」,但考虑到你的具体场景(例如:「大型 TypeScript 单体仓库」vs 「Python 数据科学脚本」),评分权重会动态调整。


8. v3 架构升级:可分享 HTML 简报与智能搜索

8.1 可分享 HTML 简报

v3 引入了一个非常实用的功能:一键生成自包含 HTML 简报

为什么需要 HTML 简报?

在团队协作中,你往往需要将搜索结果分享给同事。但:

  • Markdown 需要渲染(不是所有人都有 Markdown 预览工具)
  • 纯文本 丢失了格式和链接
  • 截图 不可搜索、不可复制

HTML 简报解决了这些问题:

# 生成 HTML 简报
/last30days OpenClaw --emit=html

# 输出: ~/Documents/Last30Days/openclaw-brief.html
# 
# 特性:
# - 自包含(所有 CSS 内联,无需网络)
# - 暗色主题(默认),也支持亮色
# - 打印友好(@media print 优化)
# - 离线可用(无论何时打开,内容都在)

HTML 简报的结构

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>OpenClaw - Last30Days Brief</title>
    <style>
        /* 内联 CSS —— 自包含,无需外部依赖 */
        :root {
            --bg-primary: #0d1117;
            --bg-secondary: #161b22;
            --text-primary: #e6edf3;
            --text-secondary: #8b949e;
            --accent: #58a6ff;
        }
        
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, JetBrains Mono, monospace;
            background: var(--bg-primary);
            color: var(--text-primary);
            max-width: 900px;
            margin: 0 auto;
            padding: 2rem;
            line-height: 1.6;
        }
        
        .badge {
            display: inline-block;
            background: var(--accent);
            color: white;
            padding: 0.25rem 0.75rem;
            border-radius: 1rem;
            font-size: 0.875rem;
            margin-bottom: 1rem;
        }
        
        .citation {
            background: var(--bg-secondary);
            border-left: 3px solid var(--accent);
            padding: 1rem;
            margin: 1rem 0;
            font-size: 0.9rem;
        }
        
        .signal-source {
            color: var(--text-secondary);
            font-size: 0.8rem;
            margin-top: 0.5rem;
        }
        
        @media print {
            body { background: white; color: black; }
            .badge { background: black; color: white; }
        }
    </style>
</head>
<body>
    <div class="badge">Last30Days Brief</div>
    <h1>OpenClaw: 跨平台信号聚合简报</h1>
    <p class="meta">生成时间: 2026-06-26 07:40 CST | 信号来源: 6 个平台 | 综合法官: Claude 3.5 Sonnet</p>
    
    <h2>关键发现</h2>
    
    <div class="citation">
        <p><strong>发现 1</strong>: OpenClaw 的 GitHub Star 增速在过去 30 天达到 351K(+12% MoM),主要增长来自第 3 周(Anthropic 封号事件引发讨论)。</p>
        <p>置信度: <strong>高</strong></p>
        <div class="signal-source">
            来源: 
            <a href="https://github.com/openclaw/openclaw">GitHub API (2026-06-26)</a> |
            <a href="https://news.ycombinator.com/item?id=123456">Hacker News #123456 (825 points, 899 comments)</a>
        </div>
    </div>
    
    <div class="citation">
        <p><strong>发现 2</strong>: r/ClaudeCode 社区对 Anthropic 封禁第三方 Agent 的政策反应激烈。高赞评论(569 upvotes)称「OpenClaw 用户被当成了 collateral damage」。</p>
        <p>置信度: <strong>高</strong></p>
        <div class="signal-source">
            来源: 
            <a href="https://reddit.com/r/ClaudeCode/comments/...">r/ClaudeCode (569 upvotes, 142 comments)</a>
        </div>
    </div>
    
    <!-- 更多发现... -->
    
    <h2>引擎日志</h2>
    <p>✅ 所有 Agent 已返回!搜索树: 3 层, 9 个节点, 27 个信号</p>
    
    <hr>
    <p class="colophon">由 /last30days v3 生成 | 话题: OpenClaw | <a href="https://github.com/mvanhorn/last30days-skill">项目主页</a></p>
</body>
</html>

8.2 智能搜索的「上下文学习」

v3 的另一个重要升级是:/last30days 会「记住」你的搜索偏好

# 第 1 次搜索
/last30days "Rust 异步运行时" --save-prefs

# 系统会询问:
# 「你更关心性能对比还是生态成熟度?」
# 你的回答会被保存到 ~/.last30days/preferences.json

# 第 2 次搜索类似话题
/last30days "Go vs Rust 并发模型"

# 系统会自动应用之前的偏好:
# - 更强调性能数据
# - 优先展示基准测试相关信号
# - 降低「生态成熟度」类信号的权重

这种「上下文学习」让 /last30days 不仅是一个搜索工具,更是一个会成长的搜索助手


9. 深度对比:/last30days vs Perplexity vs Google vs ChatGPT

维度/last30daysPerplexityGoogleChatGPT (with browsing)
信号来源人(Reddit upvotes, X likes, Polymarket 资金)编辑(网页、论文、新闻)编辑(SEO 优化的网页)编辑(Bing 搜索结果)
实时性极高(X 实时,Reddit 热榜)高(截至最近 24 小时)中(索引延迟数小时到数天)中(取决于浏览插件的实现)
跨平台聚合✅ 原生支持(12+ 平台)❌ 仅网页❌ 仅网页(不包括 Reddit 评论、X 帖子等)❌ 仅网页
资金信号✅ Polymarket 集成
社区情绪分析✅ 内置(upvote/downvote 分析)
引用透明度✅ 每个结论至少 2 个独立来源✅ 有引用,但有时不准确✅ 有链接,但排名可被操纵✅ 有引用
适用场景了解「真实人类在想什么」快速获取事实性答案广泛信息检索对话式探索
学习曲线低(零配置可用)极低(像用 Google)极低
成本免费(如果自己有 API Key);托管版本可能需要付费免费版有限制;Pro $20/月免费Free tier 有额度限制

9.1 什么时候用 /last30days?

✅ 适合用 /last30days 的场景

  1. 你需要做决策,而决策需要「人类集体智慧」

    • 例如: 选技术栈、选工具、判断是否加入某家公司
  2. 你想了解「真实口碑」,而不是 PR 稿

    • 例如: 某框架是否真的好用?Reddit 上的真实用户怎么说?
  3. 你在追热点,需要最实时的信号

    • 例如: 某个 AI 模型刚发布,社区反应如何?
  4. 你在做尽职调查(投资、并购、招聘)

    • 例如: 这家公司的技术实力是否匹配它的 PR?

❌ 不适合用 /last30days 的场景

  1. 你需要权威、可引用的学术论文

    • → 用 Google Scholar 或 Perplexity
  2. 你在查事实(某语言的发明时间是?)

    • → 用 Google 或 ChatGPT
  3. 话题过于小众,跨平台信号量不足

    • → 用 Google Scholar 或专业论坛

10. 代码实战:从零集成到你的 AI Agent 工作流

10.1 作为 Claude Code Skill 使用

/last30days 最根本的设计是作为一个 Agent Skill。这意味着它可以无缝集成到任何支持 MCP (Model Context Protocol) 或 Agent Skills 规范的 AI Agent。

10.1.1 在 Claude Code 中调用

# 方式 1:  slash 命令
/last30days "TypeScript 7.0 Go 重写"

# 方式 2: 自然语言触发(需要在 CLAUDE.md 中声明)
# 在 CLAUDE.md 中添加:
# 
# ## 研究工具
# 当用户需要了解某个话题的最新动态时,使用 /last30days skill。
# 例如: "帮我研究一下 Rust 在 2026 年的生态" → 调用 /last30days

# 方式 3: 作为工具被 Agent 自动调用
# 如果配置了 tool_search,Claude Code 会在需要时自动调用 /last30days

10.1.2 Skill 的文件结构

skills/last30days/
├── SKILL.md          # Skill 定义(Agent 读取此文件了解如何使用这个 Skill)
├── CONFIGURATION.md  # 配置指南
├── CONCEPTS.md       # 核心概念解释
├── scripts/
│   ├── search.py     # 核心搜索逻辑
│   ├── judge.py      # 综合法官
│   └── emit_html.py  # HTML 简报生成器
└── tests/
    └── test_search.py

SKILL.md 示例(这是 Agent 实际读取的「使用说明书」):

# /last30days Skill

## 触发条件

当用户提出以下类型的请求时,调用此 Skill:

- "帮我研究一下 <topic>"
- "最近 <topic> 有什么动态?"
- "我想了解 <person> 最近在做什么"
- "对比一下 <A> 和 <B>"
- "社区对 <topic> 的真实评价是什么?"

## 命令格式

/last30days [options]


### Options

- `--emit=html|markdown|json` (default: markdown): 输出格式
- `--depth=quick|standard|comprehensive` (default: standard): 搜索深度
- `--platforms=reddit,x,github` (default: all): 限定平台
- `--save-prefs`: 保存搜索偏好(用于上下文学习)
- `--setup`: 启动配置向导

## 输出规范

1. 综合简报必须包含:
   - 至少 3 个「关键发现」
   - 每个发现必须有至少 2 个独立来源引用
   - 标注置信度(高/中/低)
   
2. 如果有争议点,必须单独列出

3. 如果某个平台搜索失败,在简报末尾标注「部分信号缺失」

10.2 作为 Python 库使用

/last30days 也可以作为独立 Python 库使用(不依赖 AI Agent):

from last30days import Last30DaysClient

# 初始化客户端
client = Last30DaysClient(
    config_path="~/.last30days/config.json"
)

# 同步搜索
result = client.search("OpenClaw", platforms=["reddit", "x", "github"])

# 查看综合简报
print(result.synthesis)

# 查看原始信号
for platform, signals in result.raw_signals.items():
    print(f"\n=== {platform.name} ===")
    for signal in signals[:5]:  # 每个平台展示前 5 个信号
        print(f"- [{signal.normalized_score:.1f}] {signal.content[:100]}...")

# 导出为 HTML
result.export_html("openclaw-brief.html", theme="dark")

10.3 集成到 GitHub Actions(自动化简报)

你可以设置一个 GitHub Actions 工作流,每周自动运行 /last30days 并推送简报到你的知识库:

# .github/workflows/weekly-brief.yml
name: Weekly Tech Trends Brief

on:
  schedule:
    - cron: '0 9 * * 1'  # 每周一 9:00 UTC
  workflow_dispatch:

jobs:
  generate-brief:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.12'
      
      - name: Install last30days
        run: |
          pip install last30days-skill
      
      - name: Run last30days
        env:
          X_BEARER_TOKEN: ${{ secrets.X_BEARER_TOKEN }}
          YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
        run: |
          last30days "AI Agent frameworks 2026" --emit=html --output=brief.html
      
      - name: Commit and push brief
        run: |
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"
          git add brief.html
          git commit -m "Weekly AI Agent trends brief"
          git push

11. 性能优化:如何自定义信号权重与过滤规则

11.1 信号权重自定义

/last30days 允许你通过配置文件或命令行参数调整各平台的权重:

# 方式 1: 命令行临时调整
/last30days "AI 编程工具" --weight:reddit=2.0 --weight:x=0.5

# 解释: Reddit 信号权重 ×2,X 信号权重 ÷2
# 适用场景: 你觉得 X 上噪音太多,Reddit 质量更高

# 方式 2: 修改配置文件(持久化)
# 编辑 ~/.last30days/config.json:

{
  "platform_weights": {
    "reddit": 1.5,      # 默认 1.0
    "hackernews": 2.0,  # HN 技术讨论质量高,提权
    "x": 0.8,           # X 噪音较多,降权
    "polymarket": 3.0,  # 资金信号置信度高,大幅提高权重
    "github": 1.2,
    "youtube": 1.0
  }
}

11.2 过滤规则

{
  "filters": {
    "reddit": {
      "min_upvotes": 50,          // 只保留 upvotes > 50 的帖子
      "exclude_subreddits": ["memes", "funny"],
      "min_comment_score": 10     // 评论区的单条评论也需要有足够 upvotes
    },
    "x": {
      "min_like_count": 100,
      "verified_authors_only": false,  // 是否只看认证账号
      "exclude_retweets": true
    },
    "polymarket": {
      "min_volume_usd": 5000,    // 只保留交易量 > $5000 的市场
      "min_confidence": 0.7      // 只保留 YES/NO 概率 > 70% 或 < 30% 的市场
    }
  }
}

11.3 缓存策略

/last30days 默认启用缓存(TTL = 1 小时),避免对同一个话题重复调用 API。

# 强制刷新(忽略缓存)
/last30days "OpenClaw" --no-cache

# 清除缓存
/last30days --clear-cache

# 调整缓存 TTL
# 在 config.json 中:
{
  "cache": {
    "enabled": true,
    "ttl_seconds": 7200,  // 改为 2 小时
    "max_size_mb": 500     // 缓存最大占用 500MB
  }
}

12. 安全与隐私:本地运行 vs 云端 API

12.1 数据存储方式

/last30days 支持两种模式:

模式 A:纯本地模式(推荐)

  • 所有 API 调用都从你的本地机器发出
  • 搜索结果缓存存储在 ~/.last30days/cache/
  • 综合法官步骤:如果你配置了自己的 LLM API(例如本地 OAI模型),则完全离线

模式 B:使用托管综合法官

  • 如果你没有配置本地 LLM,/last30days 会调用默认的云端 LLM(需要网络连接)
  • 注意:你的搜索查询和信号会被发送到云端 LLM

12.2 隐私建议

  1. 敏感话题:如果你在搜索敏感话题(例如竞争对手分析),建议使用本地 LLM
  2. API Key 安全:所有 API Key 都存储在 ~/.last30days/credentials/,并使用简单加密(不是军工级,但足够防止意外泄露)
  3. X Cookie 导入:如果你使用「浏览器 Cookie 导入」方式接入 X,/last30days 会读取你的 X session Cookie。这意味着 /last30days 可以以你的身份发帖。建议:
    • 为 /last30days 创建一个专用的 X 账号(只读权限)
    • 或者使用 X API Key(更安全,权限可控)

13. Roadmap 与未来:AI 搜索的下一个前沿

13.1 v4 预计特性(根据 GitHub Issues 和 Discussions)

  1. 多语言支持

    • 目前 /last30days 主要处理英文信号
    • v4 计划加入对非英文平台的支持(小红书、微博、2ch 等)
  2. 信号质量评估模型

    • 目前正在用「upvotes/likes」作为代理指标
    • v4 计划训练一个专门的「信号质量模型」,直接预测「这条信号是否包含高信息量」
  3. 持久化知识库

    • 目前每次搜索都是独立的
    • v4 计划加入「知识库模式」:将历次搜索结果持久化到向量数据库,支持跨时间的趋势分析
  4. 协作式信号

    • 允许团队成员「标注」某些信号为「特别重要」或「已验证」
    • 这些标注会提升该信号在未来搜索中的权重

13.2 更广阔的愿景:AI 搜索协议

/last30days 的作者是 Peter Steinberger,他同时也是 OpenClaw 的核心贡献者。在多个公开场合,他提到一个更广阔的愿景:

「未来的搜索不应该是一个中心化平台(Google),而应该是一个协议——任何人都可以实现一个搜索 Provider,任何 AI Agent 都可以调用这些 Provider,然后用户自己的 Agent 负责综合所有信号。

/last30days 是这个概念的一个原型实现。」

这个愿景如果实现,将彻底改变搜索市场的格局。


14. 总结:你应该什么时候用 /last30days?

14.1 核心要点回顾

  1. /last30days 不是传统搜索引擎——它搜索的是「人的注意力、投票和金钱」,而不是「编辑过的内容」
  2. 零配置可用——Reddit、HN、Polymarket、GitHub 开箱即用
  3. 智能路由——v3 的杀手级特性,自动识别应该搜索哪些平台
  4. 综合法官——用 AI Agent 聚合所有信号,生成有深度、有引用的简报
  5. HTML 简报——一键生成可分享的自包含 HTML 文件

14.2 决策树:我应该用 /last30days 吗?

你的需求是...
│
├── 快速获取事实性答案(某语言的发明时间?)
│   └── ❌ 用 Google 或 ChatGPT
│
├── 了解某个话题的最新动态(AI Agent 框架最近有什么新进展?)
│   └── ✅ 用 /last30days
│
├── 做技术选型(Cursor vs Windsurf?)
│   └── ✅ 用 /last30days(重点看社区真实评价)
│
├── 做尽职调查(这家公司值不值得加入?)
│   └── ✅ 用 /last30days(重点看 Polymarket + GitHub 活跃度)
│
└── 追热点(某 AI 模型刚发布,社区反应如何?)
    └── ✅ 用 /last30days(X + Reddit 实时信号)

14.3 最后的思考

2026 年,我们正站搜索范式转移的拐点上。

Google 用了 25 年建立的「编辑式搜索」帝国,正在被 AI Agent 驱动的「人性化搜索」侵蚀。这不是说 Google 会消失——而是说,「搜索」这个概念本身正在分裂为两个平行世界:

  • 世界 A:你需要一个事实性答案(「法国的首都是哪里?」)→ Google/Perplexity/ChatGPT
  • 世界 B:你需要理解「人类在想什么」(「OpenClaw 是否值得投入时间学习?」)→ /last30days

/last30days 的价值,就在于它占据了「世界 B」这个生态位——而且目前几乎没有竞争对手。

如果你正在做技术决策、投资判断、或者简单地想「理解这个世界正在发生什么」,/last30days 应该是你工具箱里的标配。


附录:快速参考卡

# 安装
npx skills add mvanhorn/last30days-skill -g

# 基础搜索
/last30days <topic>

# 生成 HTML 简报
/last30days <topic> --emit=html

# 对比搜索
/last30days "A" vs "B" --comparison

# 深度搜索(3 层 Tree Search)
/last30days <topic> --depth=comprehensive

# 限定平台
/last30days <topic> --platforms=reddit,github,polymarket

# 配置向导
/last30days --setup

项目地址:https://github.com/mvanhorn/last30days-skill
License:MIT
当前版本:v3.0(截至 2026 年 6 月)
Star 数:12,924+
维护者:Peter Steinberger (@steipete)
适用 AI Agent:Claude Code, Codex, Cursor, Copilot, Gemini CLI, OpenClaw(50+ Agent Skills hosts)


本文撰写于 2026 年 6 月 26 日,基于 /last30days v3 的公开文档和源码分析。项目在快速迭代中,具体特性以最新版本为准。

推荐文章

api接口怎么对接
2024-11-19 09:42:47 +0800 CST
25个实用的JavaScript单行代码片段
2024-11-18 04:59:49 +0800 CST
Vue中如何处理异步更新DOM?
2024-11-18 22:38:53 +0800 CST
如何优化网页的 SEO 架构
2024-11-18 14:32:08 +0800 CST
使用临时邮箱的重要性
2025-07-16 17:13:32 +0800 CST
Vue3中的虚拟滚动有哪些改进?
2024-11-18 23:58:18 +0800 CST
使用Vue 3和Axios进行API数据交互
2024-11-18 22:31:21 +0800 CST
XSS攻击是什么?
2024-11-19 02:10:07 +0800 CST
nuxt.js服务端渲染框架
2024-11-17 18:20:42 +0800 CST
程序员茄子在线接单