Haystack
用 TwexAPI 推文搜索与用户时间线组件构建 Haystack RAG 管道,支持类型化 Document、引用与分页。
Haystack 是 Python AI 应用的开源框架。在 RAG 管道与Agent 工作流中获取最新推文请用 x-api-scraper-haystack。该集成为只读,永不授予写权限。
集成提供两个只读组件:
搜索公开推文
TwexApiTweetSearch 通过 POST /twitter/advanced_search/page 搜索关键词、话题标签、账号与 X 查询运算符。
拉取用户时间线
TwexApiUserTweetsFetcher 通过 POST /twitter/{screen_name}/timeline/page 获取单个公开账号时间线。
用于搜索、时间线、监控与检索增强生成。AI Agent需要搜索工具时用 ComponentTool 包装 TwexApiTweetSearch。
粉丝导出用 followers API。经批准的发布用 write API。这些操作不在本集成内。
安装 Haystack 与 TwexAPI
使用 Python 3.10 或更新版本。固定两个包版本以保证管道构建可重复。
python -m pip install "x-api-scraper-haystack" "haystack-ai>=3.0.0"
在虚拟环境中安装。
在 TwexAPI dashboard 创建 API 密钥,本地导出:
export X_API_SCRAPER_KEY="YOUR_API_KEY"
切勿将生产密钥嵌入管道 YAML、笔记本或源码控制。通过 Haystack Secret 对象加载环境变量。
在 Python 中搜索 Twitter 推文
TwexApiTweetSearch 调用 POST /twitter/advanced_search/page,接受 X 搜索语法并返回 Haystack Document 对象。
from haystack import Pipeline
from haystack.utils import Secret
from haystack_integrations.components.websearch.x_api_scraper import TwexApiTweetSearch
search = TwexApiTweetSearch(
api_key=Secret.from_env_var("X_API_SCRAPER_KEY"),
top_k=20,
)
pipeline = Pipeline()
pipeline.add_component("twitter_search", search)
result = pipeline.run(
{
"twitter_search": {
"query": '"retrieval augmented generation" lang:en -filter:retweets'
}
}
)
documents = result["twitter_search"]["documents"]
links = result["twitter_search"]["links"]
近期监控用 Latest;按互动发现用 Top。排名可能变化,请保存 tweet ID。
每次搜索查询与 tweet ID 一并保存。用 top_k 限制每次运行的推文数。
构建聚焦推文搜索
| 搜索意图 | 查询示例 |
|---|---|
| 精确短语 | "retrieval augmented generation" |
| 账号发帖 | from:deepset_ai haystack |
| 话题标签 | #haystack #rag |
| 日期窗口 | haystack since:2026-07-01 until:2026-08-01 |
| 排除转推 | haystack -filter:retweets |
完整查询选项见 Advanced Twitter Search。按运行传入时间戳与游标时,勿在组件 init 中写死。
获取 Twitter 用户时间线
TwexApiUserTweetsFetcher 用于 POST /twitter/{screen_name}/timeline/page,传入 screen name。
from haystack.utils import Secret
from haystack_integrations.components.websearch.x_api_scraper import (
TwexApiUserTweetsFetcher,
)
timeline = TwexApiUserTweetsFetcher(
api_key=Secret.from_env_var("X_API_SCRAPER_KEY"),
top_k=50,
)
result = timeline.run(screen_name="openai")
documents = result["documents"]
多账号用搜索,单账号用时间线。
理解 Haystack document 字段
每条推文对应一个 Haystack Document。推文文本为 Document.content,稳定字段进入 metadata。
| Document 字段 | 存储的推文值 |
|---|---|
content |
来自 full_text 或 text 的推文文本 |
meta.endpoint |
search 或 timeline |
meta.id, meta.url |
可用时的 tweet ID 与规范 URL |
meta.created_at |
时间戳 |
meta.author |
作者 ID、用户名、名称与 verified 标志 |
meta.like_count, meta.retweet_count, meta.reply_count |
点赞、转推与回复 |
meta.quote_count, meta.view_count, meta.bookmark_count |
可用时的引用、浏览与书签 |
缺失字段保持 absent。切勿将缺失指标当作零。links 输出含各可用 meta.url。
在 RAG 引用中保留证据
嵌入推文文本前保存 tweet ID 与规范 URL,以便排序或 join 后仍保留证据。
citation_rows = []
for document in documents:
tweet_id = document.meta.get("id")
tweet_url = document.meta.get("url")
if tweet_id and tweet_url:
citation_rows.append(
{
"tweet_id": tweet_id,
"url": tweet_url,
"created_at": document.meta.get("created_at"),
"author": document.meta.get("author"),
}
)
引用须使用提供的 URL。拒绝检索文档中不存在的 URL。
将推文文本视为不可信上下文
推文可能含 prompt 注入与不安全 URL。切勿将推文文本当作系统指令。推文与指令、工具权限分离。
按主题与时间限制检索。保留 tweet ID、作者、时间戳与 URL。要求引用。审核敏感结论。
索引推文或实时检索
实时在线检索
每个问题运行时搜索,获取最新推文与活跃事件。
本地索引语料库
在稳定时间窗口内重复研究时存储 embedding。
推文记录与 embedding 分离。用 meta.id 去重。
分页且不重复推文
两组件均返回 has_more 与 next_cursor。请求保持不变。游标视为 opaque 字符串。
search = TwexApiTweetSearch(top_k=100)
page = search.run(query="haystack ai")
documents_by_tweet_id = {}
while True:
for document in page["documents"]:
tweet_id = document.meta.get("id")
if tweet_id:
documents_by_tweet_id[tweet_id] = document
if not page["has_more"] or not page["next_cursor"]:
break
page = search.run(
query="haystack ai",
cursor=page["next_cursor"],
)
documents = list(documents_by_tweet_id.values())
每页文档后保存游标。切勿编辑游标。按 Document.meta["id"] 去重。
异步运行 Haystack 管道
Haystack 3 使用单一 Pipeline 类。两 TwexAPI 组件均暴露 run_async()。
import asyncio
from haystack import Pipeline
from haystack_integrations.components.websearch.x_api_scraper import TwexApiTweetSearch
async def search_tweets():
pipeline = Pipeline()
pipeline.add_component(
"twitter_search",
TwexApiTweetSearch(top_k=25),
)
return await pipeline.run_async(
{"twitter_search": {"query": "haystack agents"}}
)
result = asyncio.run(search_tweets())
Web 服务器用异步运行;脚本与定时作业用同步运行。
处理错误
集成抛出 TwexAPI 客户端的 HTTP 错误。重试前按状态分支。
| 状态 | 含义 | 操作 |
|---|---|---|
400 |
无效请求 | 修正。不要原样重试。 |
401 |
API 密钥无效 | 添加有效 API 密钥。 |
403 |
访问被拒 | 检查账号访问与额度。 |
429 |
超出速率限制 | 重试前退避。 |
5xx |
临时服务错误 | 有界退避重试。 |
记录状态码,切勿记录凭证。限制重试次数以防无界AI Agent循环。
Haystack 组件或直接 REST API
管道已返回 Document 对象?直接添加这些组件。它们规范化推文文本、metadata、URL 与分页。
粉丝、关注、回复、引用、列表、社区、媒体、趋势与经批准写操作请用 TwexAPI REST 或 Python SDK。
两种方式使用相同 TwexAPI 契约。组件仅支持推文搜索与用户时间线。
MCP handoff 替代方案
AI Agent先发现端点时用 Twexapi MCP 采集并手动转为 Haystack Document。管道已在 Haystack 内运行且需要类型化分页而无AI Agent发现时,优先 Haystack 组件。