Firecrawl 新手教程
把杂乱网页一键变成干净的 Markdown 或结构化 JSON,专为 AI 设计。爬取、搜索、抓取、交互一次搞定,是 2026 年 agent 抓网页的事实标准。
01这是什么
Firecrawl 是一个把「网页 URL」变成「AI 可直接用的干净数据」的 API。你给它一个网址(或一个问题),它返回整洁的 Markdown、截图,或按你定义的 schema 抽好的结构化 JSON。
传统抓取要自己应付 JS 渲染、反爬、代理轮换、cookie、弹窗——Firecrawl 把这些全封装成一个 HTTP 调用。网页本来就不是给机器看的,它做的事就是把「给人看的网页」翻译成「给模型看的上下文」。
它不做什么(消除误解)
- 不是 AI 模型:它不「理解」内容,它负责把网页可靠地拿下来并清洗格式化。理解的事交给接入的 LLM。
- 不只是一个爬虫库:光
pip install一个包跑不起来——云服务要有 API Key,自托管要拉起一套多容器服务(见第 5 节)。 - 不绕过 robots.txt 去偷数据:默认遵守网站的 robots.txt 规则,UA 是
FirecrawlAgent。合规边界要自己把握。 - 不是一次性的「下载器」:它会做页面清洗(去导航栏、cookie 横幅、广告),输出是为 token 效率优化的,不是逐字节保真的原始拷贝。
💡 一句话记住它
把 Firecrawl 想成「给 AI 用的整页阅读器」:search 负责找到哪页值得读,scrape 负责把那一页干净地读完,interact 负责在需要点按钮、翻页、登录才能看到的场景里帮你去操作。三者合起来,AI 就能用上整个活网页。
02为什么需要它
想让 LLM 用上实时网页数据,最常见的三条路都有硬伤:
| 手搓方式 | 会撞上的墙 |
|---|---|
直接 requests / curl 拿 HTML | 拿回来的是 HTML 汤——导航栏、cookie 横幅、广告、JS 没渲染完的空白。喂给模型,上下文窗口塞满垃圾标记,token 白烧。 |
| 自己上 Playwright 跑无头浏览器 | 能渲染 JS,但要自己写「等多久」「怎么判加载完」,还要维护浏览器实例、处理无限滚动、登录态。写一次爽,维护一年哭。 |
| 自建反爬代理池 + OCR | IP 被 ban、验证码、TLS 指纹检测……这是分布式系统问题,不是一个周末能搞定的。 |
它在生态里的位置
搜索 API 负责「找到 URL」(比如用 /search),Firecrawl 负责「把 URL 读干净」。2026 年大量 agent 栈(LangGraph、CrewAI、以及接进 Cursor / Claude 的 MCP)都把这类「fetch 整页」当默认工具。
03核心流程
无论云服务还是自托管,认知模型都是「给它一个任务,它返回可用的数据」。核心三条能力:
| 能力 | 它回答什么 | 典型用法 |
|---|---|---|
| Search 搜索 | 「哪个页面值得读」 | 丢一个问题 → 返回结果 + 每条的整页 Markdown |
| Scrape 抓取 | 「这个 URL 里是什么」 | 丢一个网址 → 返回 Markdown / HTML / 截图 / JSON |
| Interact 交互 | 「点两下才能看到的内容」 | 抓取后,用自然语言或代码去点按钮、填表单、翻页 |
单页任务走 scrape;多 URL、不知道要爬哪些页面时,升级到 crawl(整站爬)、map(列出站内所有 URL)、agent(自然语言描述需求让它自动找)。
04两条路:云服务 vs 自托管
Firecrawl 有两种用法,选错会白费力气。先看差别,再决定走哪条。
| 维度 | 云服务(api.firecrawl.dev) | 开源自托管 |
|---|---|---|
| 体验 | 注册拿 Key,一个 HTTP 调用直接跑 | 先 docker compose up 拉起一整套服务 |
| 组件 | Fire-engine 专有反爬基础设施,零配置 | Playwright + fetch + Redis + RabbitMQ + NuQ Postgres(+ FoundationDB) |
| 反爬 / 验证码 | 自带代理轮换、验证码处理 | 基础版;要更强的反爬得自己接 Fire-engine 或第三方代理 |
| 高级功能 | 完整:agent、interact、dashboard、截图、OCR 等 | 核心爬取可用;部分 AI 功能需自接模型;对照 README 功能差异图 |
| 适合 | 想马上出活、不想运维 | 数据量大、要源码与数据主权、内部可信网络 |
| 成本 | 免费层 500–1000 积分,之后按套餐 | 花的是自己的机器与运维时间,无按量积分 |
本教程主线走云服务讲透核心概念与跑通流程,第 8 节单独讲自托管。
05环境自检
用云服务,先确认自己有没有三样东西:
- API Key:去 firecrawl.dev 注册后获取,形如
fc-xxx。在 Dashboard 的 API Keys 页能找到。 - 目标语言 SDK(或直接用 cURL,零安装)。
- 能上网——它访问的是公网网站。
选择你的 SDK / 调用方式
| 方式 | 安装 | 适合 |
|---|---|---|
| Python SDK | pip install firecrawl-py | 数据脚本、agent、RAG 管道 |
| Node SDK | npm install firecrawl | JS / TS 后端 |
| Go | go get github.com/firecrawl/firecrawl/apps/go-sdk | Go 服务 |
| Java | JitPack:com.github.firecrawl:firecrawl-java-sdk:2.0 | JVM 项目 |
| Rust / Ruby / .NET / PHP / Elixir | cargo / gem / dotnet / composer / hex | 对应生态 |
| CLI | npm i -g firecrawl-cli | 命令行快速试用 |
| cURL | 零安装 | 接口调试、临时验证 |
https://api.firecrawl.dev,全部走 POST + Authorization: Bearer fc-你的Key。0660 秒实战:第一次抓取
最稳的验证方式:用 cURL 抓一页,看能不能拿到干净的 Markdown。把下面 fc-YOUR_KEY 换成你的 Key。
curl -X POST https://api.firecrawl.dev/v2/scrape \
-H 'Authorization: Bearer fc-YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"url": "https://news.ycombinator.com", "formats": ["markdown"]}'
返回体里 data.markdown 就是清洗后的正文,data.metadata 带标题/描述等元信息。✅ 成功会看到类似:
{
"success": true,
"data": {
"markdown": "[Hacker News](https://news.ycombinator.com)\n\n---\n\n...正文...",
"metadata": { "title": "Hacker News", "statusCode": 200 }
}
}
换 Python SDK,同一件事:
from firecrawl import Firecrawl
app = Firecrawl(api_key="fc-YOUR_KEY")
result = app.scrape("https://news.ycombinator.com", formats=["markdown"])
print(result["data"]["markdown"][:500])
success: true 且 data.markdown 是一段干净的正文,而不是整页导航/广告的 HTML 堆。▶ 没通?最常见的三个原因
① 403 / 401:Key 写错或没带。检查 Bearer 头;
② 429:免费层并发/频率限制,稍等重试;
③ 500:URL 本身有问题(加 http(s)://)或目标站反爬太狠。换 proxy: "enhanced" 试试。
07能拿回什么:输出格式
scrape 的 formats 参数决定输出。核心几种:
| format | 返回内容 | 适合 |
|---|---|---|
markdown | 清洗后的正文(默认) | 喂给 LLM 的通用首选,最省 token |
html | 处理过的 HTML | 要保留结构的场景 |
rawHtml | 原始 HTML | 自己做解析 |
links | 页面里所有链接 | 顺藤摸瓜、构图 |
screenshot | 页面截图 | 视觉核对 |
json | 按你给的 schema 抽结构化数据 | 拿产品价格、联系信息等,无需再解析 |
summary 等 | 摘要 / branding / product / video… | 垂类字段(电商、餐饮菜单等) |
结构化抽取(json + schema)
不想拿回 Markdown 再让模型解析,就传一个 JSON schema,让 Firecrawl 直接返回你要的字段形状:
result = app.scrape(
"https://www.amazon.com/...",
formats=["json"],
json_options={
"schema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"price": {"type": "number"},
"rating": {"type": "number"}
},
"required": ["title", "price"]
}
}
)
print(result["data"]["json"]) # {"title": "...", "price": 123.45, ...}
json 抽取省一次模型往返、输出更稳定,适合有固定字段的页面(价格监控、商品采集)。复杂/不规则的抽取还是交给 agent 端点的自然语言描述更省事。08多页与整站:Crawl / Map / Agent
单页用 scrape。当「不止一页、但你不确定是哪些页」时,用下面三兄弟:
Map —— 先看这个站有哪些 URL
urls = app.map("https://firecrawl.dev", search="pricing")
print(urls) # 列出与 pricing 相关的站内链接
Crawl —— 顺着链接把整站(或某分区)爬下来
docs = app.crawl("https://docs.firecrawl.dev", limit=50, formats=["markdown"])
for doc in docs["data"]:
print(doc["metadata"]["sourceURL"])
crawl 是异步任务:提交后拿到 job id,SDK 会自动轮询直到完成。limit 控制最大页数,避免把整个站爬爆。
Agent —— 只描述需求,让它自己找自己抽
不预先给 URL,直接说你要什么,agent 会自动搜索、导航、抽取:
# 配合结构化 schema,拿回你要的字段
from pydantic import BaseModel
class Pricing(BaseModel):
plan: str
price: float
result = app.agent(
prompt="Find the pricing plans for Notion",
schema=Pricing
)
agent 是 /extract 的进化版:更快、更可靠、不必预先知道 URL。适合「开放式的、要跑好几个站才知道答案」的任务。💡 场景选型速记
• 已知一个 URL、要这一页 → scrape
• 要整站/整分区的所有页 → map(看有哪些)+ crawl(爬下来)
• 只有个问题、不确定去哪找 → search(找到 URL)或 agent(全自动)
09需要点两下的页面:Interact
有的信息藏在登录后、分页后面、或要靠点几次才加载(比如在电商站搜个词再点开商品)。Firecrawl 的处理方式:
- 先
scrape页面,拿到scrapeId; - 对同一个
scrapeId调interact,用自然语言或Playwright 代码让它操作页面(点击、输入、滚动、等待、按键盘); - 操作完再读取页面最新内容。
scrape = app.scrape("https://www.amazon.com")
scrape_id = scrape["id"]
app.interact(scrape_id, prompt="Search for 'mechanical keyboard'") # 自然语言即可
page = app.scrape(scrape_id) # 读取交互后的页面
print(page["data"]["markdown"][:400])
interact 会把浏览器「保持打开」的状态跨多次调用延续,适合多步骤操作。简单的单步预操作(比如等元素、点一下)也可以在 scrape 的 actions 参数里声明,但复杂的交互官方推荐走 interact。10费用与额度
云服务按「积分(credit)」计费,抓取失败一般不扣分(唯一的例外:FIRE-1 agent 请求无论成败都计费)。核心换算:
| 操作 | 积分 | 1000 积分 ≈ |
|---|---|---|
| Scrape / Crawl / Map | 1 积分 / 页 | ~1000 页 |
| Search | 2 积分 / 10 条结果 | ~5000 条结果 |
| Interact(浏览器分钟) | 2 积分 / 浏览器分钟 | ~500 分钟 |
| PDF 解析 | 1 积分 / 页 | — |
高级能力(json 抽取增强、enhanced proxy 等)会额外计分,具体看定价页的 credits 表。
套餐速览(年付价,官网为准)
| 套餐 | 积分 / 月 | 年付价 | 并发 |
|---|---|---|---|
| Free | 500–1000(一次性/每月,随时间档位微调) | $0 | 2 |
| Hobby | 3,000–5,000 | ~$16/月 | 5 |
| Standard | 100,000 | ~$83/月 | 50 |
| Growth | 500,000 | ~$333/月 | 100 |
| Scale | 1,000,000 | ~$599/月 | 150 |
11进阶:自托管
量级大、要源码/数据主权、或公司内部要用,才走这条路。心里要有数:这不是装个 pip 包,是拉起一个微服务栈。
官方推荐从 Docker Compose 起步(docker compose up)。当前基线会跑:API 与 worker、Playwright、Redis、RabbitMQ、NuQ PostgreSQL,以及可选的 FoundationDB(用作任务队列后端)。只有 API 默认暴露到宿主机,端口 3002。
几个被官方点名的注意点
- 别用
apps/api/.env.example当 compose 契约:根目录.env才对应docker-compose.yaml。上手看官方 self-host 指南 + 你 checkout 那份 compose 文件。 - 离开可信网络前先加认证:默认 API 是无认证的。要外网访问先设计好鉴权、TLS、网络策略。
- 数据持久化要自己配:默认 compose 对 Postgres/Redis/RabbitMQ 没定义持久卷,数据要存活必须自己加 volume 并测试备份恢复。
- AI 功能默认没接模型:要用到 AI 特性时,自接 OpenAI / OpenAI 兼容端点 / Ollama。
- 反爬要自己补:开源基线用自带 Playwright + fetch 兜底;更强的反爬(代理轮换、Fire-engine)得自己接。
更正式的部署可参考仓库里的 Kubernetes manifests 与 Helm chart(作为版本化起点,不是替你拍板的生产架构)。
12不止于此:Agent / MCP 一键接入
Firecrawl 在 2026 年这么火,一大半是因为它能一键接进 AI agent。你的 Claude Code / Cursor / Windsurf 等 MCP 客户端,配好后能直接「联网查网页」。
接 MCP(Claude / Cursor / Windsurf 通用)
{
"mcpServers": {
"firecrawl-mcp": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": { "FIRECRAWL_API_KEY": "fc-YOUR_KEY" }
}
}
}
接 Claude Code(skills,一条命令自动配好)
npx -y firecrawl-cli@latest init --all --browser
这条命令兼容 Claude Code、Antigravity、OpenCode 等客户端,agent 内置 skill 后就知道何时该去抓网页。
Cursor CLI:逐条命令配好 + 实际怎么用
如果你用的是 Cursor CLI(命令行 agent,不是图形界面 IDE),配 Firecrawl 很简单。Cursor CLI 会在启动时读取 .cursor/mcp.json,读取顺序是「项目级优先、全局兜底」——和 IDE 同一套机制。共有两条路径任选:
方式一:全局配置(个人常用,所有项目生效)
在用户主目录建/改 ~/.cursor/mcp.json,把下面这段合并进已有 mcpServers:
{
"mcpServers": {
"firecrawl": {
"command": "npx",
"args": ["-y", "firecrawl-mcp"],
"env": { "FIRECRAWL_API_KEY": "fc-你的KEY" }
}
}
}
若你的机器没装 Node/npx,或用远端托管版更省事(无需本地进程,适合 CI 与 headless):
{
"mcpServers": {
"firecrawl": {
"url": "https://mcp.firecrawl.dev/fc-你的KEY/v2/mcp"
}
}
}
方式二:项目级配置(随仓库走,团队共享)
在项目根目录放 .cursor/mcp.json 并提交进 Git,队友拉下来即有同样工具。配置内容与上面完全一致,只是文件位置不同。项目级与全局同名服务器冲突时,以项目级为准。
用 Cursor CLI 自带命令确认 / 管理
配置写好即可用。Cursor CLI 也提供命令直接管理服务器,方便你在终端里核对:
# 列出已注册的 MCP 服务器
cursor agent mcp list
# headless 自动批准 MCP(避免交互询问)
cursor agent --approve-mcps -p "帮我抓 https://firecrawl.dev 首页并总结"
配好后:Firecrawl 会暴露哪些工具
| 工具名(agent 会自己挑) | 它干什么 |
|---|---|
firecrawl_scrape | 抓单个 URL → 干净 Markdown / 结构化 JSON |
firecrawl_search | 联网搜索并直接返回整页内容(不只摘要) |
firecrawl_map | 列出站点所有已收录 URL,先探路再抓 |
firecrawl_crawl / check_crawl_status | 整站批量抓取(异步,轮询进度) |
firecrawl_agent / agent_status | 自主研究 agent:自己找页、跟进、出结构化结果 |
firecrawl_interact / stop | 在已抓页面上点按钮、填表单、走多步流程 |
第一次跑通:3 步看到 Firecrawl 真被调起来
配置写好保存后,开一个新终端(已开的终端不会重读 mcp.json),进入任意项目目录:
# 第 1 步:确认 firecrawl 出现在服务器列表里
cursor agent mcp list
# 看到类似 "firecrawl firecrawl-mcp stdio npx -y firecrawl-mcp" 就 OK
# 第 2 步:进项目根目录(mcp.json 所在目录),起一个交互会话
cd /你的项目
cursor agent
# 看到类似 Cursor 启动画面,按提示选模型(Composer / Sonnet 都行)
# 第 3 步:在交互 prompt 里直接说人话
> 抓 https://firecrawl.dev 首页,用 3 句话告诉我这个产品干什么的
agent 会在终端里先回一句「我要调 firecrawl_scrape」,下方打印工具调用与返回,首次会弹一行"Allow once / Always"让你确认 MCP 工具是否可调——按方向键选 Always 之后这次会话就不再问。整个过程像这样:
> 抓 https://firecrawl.dev 首页,3 句话总结
✓ Calling firecrawl_scrape
url: "https://firecrawl.dev"
formats: ["markdown"]
✓ 1 credit used
Firecrawl 是一个把任意网页转成干净 Markdown / 结构化 JSON 的 API
服务,面向 AI agent 设计。它能爬整站、做 schema 抽取、配合 LLM
做结构化提取,并提供了官方 MCP 服务器让 Claude Code / Cursor /
Windsurf 等客户端一键联网。
>
三种启动方式,按场景挑
# A. 交互式 REPL(边聊边追细节)
cursor agent
> 帮我调研 MCP 协议 2026 年的版本演进
> 抓 https://modelcontextprotocol.io 的 changelog 存到 ./changelog.md
# B. 一次性任务(脚本里最常用),-p 后跟 prompt
cursor agent -p "抓 https://news.ycombinator.com 当日 Top 10 标题与链接,列成 Markdown 表格"
# C. 管道喂 prompt(适合大量 prompt 批量跑)
echo "抓 https://example.com 并提取所有 h2 标题" | cursor agent -p -
# D. headless:自动批准所有 MCP 工具调用,省掉人工按 Allow
cursor agent --approve-mcps -p "调研 5 个网页抓取 MCP 并对比" > report.md
# E. 指定模型
cursor agent --model sonnet -p "对比 Firecrawl 和 Jina Reader 的差异"
cursor agent --model composer-1.5 -p "..."
6 组工具的真实 prompt 模板(直接抄)
| 想做的事 | 对 agent 说的话(prompt) | 它实际调用的工具 |
|---|---|---|
| 抓单个页面 | 抓 https://example.com,3 句话总结 | firecrawl_scrape |
| 拿结构化数据 | 抓 https://shop.example.com/product/1,按 {name, price, rating, stock} JSON 输出 | firecrawl_scrape(带 json schema) |
| 搜最新信息 | 搜「2026 年 Web Agent 进展」最近一周资料,列 5 条带 URL | firecrawl_search |
| 摸清一个站 | 列出 https://docs.example.com 站点所有文档 URL | firecrawl_map |
| 整站批量抓 | 把 https://docs.example.com 整站爬下来,存 ./docs.md,最多 50 页 | firecrawl_crawl + 轮询 check_crawl_status |
| 让 agent 自己研究 | 帮我研究「https://x.com vs https://threads.net 2026 现状」,出报告 | firecrawl_agent + agent_status |
| 点按钮 / 填表 | 去 https://app.example.com/login,用 test/test 登录,截屏并总结看到的 dashboard | firecrawl_interact |
进阶:串进脚本做批量
最常见的实战用法——把 prompt 列表喂给 cursor agent,每条出一份结果:
#!/usr/bin/env bash
# batch-research.sh:批量调研 10 家竞品官网首页
urls=(
"https://firecrawl.dev"
"https://jina.ai/reader"
"https://www.diffbot.com"
# ... 再加几条
)
for u in "${urls[@]}"; do
echo "=== $u ==="
cursor agent --approve-mcps -p "抓 $u ,3 句话总结它在做什么" \
| tee -a research.md
echo "" >> research.md
done
配合 cron / launchd 就能做「每天抓一次竞品首页出日报」。注意:headless 模式务必加 --approve-mcps,否则每个工具调用都要你点一下,回不到批处理场景。
常见坑 & 排错
- 改完 mcp.json 没生效:必须新开一个
cursor agent会话,已开的进程不会重读文件。 - 每次都弹 Allow 询问:加
--approve-mcps(一次性任务)或交互里选 Always(当前会话)。 - firecrawl 工具不在 agent 的工具列表里:
cursor agent mcp list看是否注册成功;再cat .cursor/mcp.json看 JSON 是否合法(多逗号、引号错位最常见)。 - 调了工具但返回 401/402:到 firecrawl.dev/app 确认 KEY 有效、积分没用完。
- 超时(crawl 大站点):crawl 是异步任务,agent 会自动轮询;终端可能被超时断,但任务在云端跑,下次重连会拿到结果。
- Windows 报
spawn npx ENOENT:把command改成npx.cmd的全路径,或改用远端 URL 模式(无需本地 Node)。
13真实用在哪
别把 Firecrawl 想窄成「爬虫」。它解决的是「任何需要把实时网页变成 AI 能用的结构数据」的地方:
深度研究 Agent
搜索 + 抓取多源并总结,是它最典型的场景。
RAG 知识库
把文档站 crawl 成 Markdown 切片,喂给向量库做检索增强。
竞品价格监控
对商品页做 json 抽取,定时抓价格/评分/库存。
销售线索补全
从公司官网/领英抽联系人、业务信息,写入 CRM。
内容生成素材
抓行业资讯做周报、竞品新闻追踪。
页面变更追踪
监控官网/文档页更新,触发通知或增量同步。
14FAQ / 踩坑
拿回来的 markdown 还是有很多杂七杂八?
试试参数:onlyMainContent: true(默认,过滤页头导航页脚);还嫌脏开 onlyCleanContent: true(Beta,额外用 LLM 清 cookie 横幅、广告)。前者确定性过滤不费额外模型,后者费。注意 onlyCleanContent 受模型输出 token 限制,超限会自动跳过保留原文。
抓 PDF / DOCX / 扫描件怎么处理?
scrape 的 parsers: ["pdf"] 会把 PDF 文本抽成 Markdown(按页计 1 积分/页);传空数组则返回整份 PDF 的 base64(固定 1 积分)。扫描件是图片的话要 OCR 提取。文本型 PDF 会先检测前几页,跑不通就中止,不会白耗整本。
对方网站反爬很狠,抓不下来?
给 proxy 传 enhanced(高级反爬);自定义 UA/cookie 用 headers 参数;需要登录/会话保持的用 profile 持久化浏览器存储,或干脆走 interact 手动操作。自托管基础版抗不住的话,考虑云服务或接第三方代理。
什么时候会遇到 402 / 429?
402 = 需要升级/充值(积分用尽或没开通高级功能);429 = 请求过多(免费层并发/频率限制)。429 等几秒重试、或把并发降到套餐允许值。官网说明里失败请求一般不扣分,除了 FIRE-1 agent(成败都计费)。
缓存 / 提速是什么鬼?
Firecrawl 有结果缓存。maxAge 控制「缓存比这年轻就直接返回」,能提速约 500%;minAge 表示「只查缓存不新抓」。命中缓存也计分但省时。敏感参数(自定义 actions/headers)会强制不入缓存。
会不会违反网站政策 / 法律风险?
Firecrawl 默认遵守 robots.txt,UA 为 FirecrawlAgent。但工具守规矩不等于你用它就合规:是否抓取、抓来做什么(尤其第三方内容、个人数据),要你自己遵守目标站 ToS 与当地法规。企业可用 lockdown(只走缓存绝不发外部请求)做隔离。生产用建议先咨询法务。
15参考链接
| 资源 | 链接 |
|---|---|
| GitHub 仓库 | github.com/firecrawl/firecrawl ↗ |
| 官方文档站 | docs.firecrawl.dev ↗ |
| 官网 / 注册 Key | firecrawl.dev ↗ |
| 自托管指南 | Self-hosting guide ↗ |
| MCP 配置 | Local MCP ↗ |
| Cursor 官方 MCP 文档 | cursor.com/docs/mcp ↗ |
| Firecrawl × Cursor(官方接入) | Firecrawl Cursor Quickstart ↗ |
| 定价 / 额度 | Pricing ↗ |
仓库结构速览
firecrawl/
├── apps/
│ ├── api/ # 核心 API 与 worker
│ ├── playwright-service-ts # 无头浏览器渲染服务
│ ├── go-html-to-md-service # HTML → Markdown 转换服务
│ ├── nuq-postgres # 任务队列存储
│ ├── python-sdk, js-sdk,
│ │ go-sdk, java-sdk, … # 各语言官方 SDK
│ └── ui/ingestion-ui # 数据导入界面
├── skills/ # 构建类 skill 源码
├── examples/ # 示例
├── docker-compose.yaml # 自托管编排
└── SELF_HOST.md # 自托管要点