{
  "canonical_name": "firecrawl/firecrawl",
  "compilation_id": "pack_43ea7e9d1b9b41b8bc6c900fbfa633f0",
  "created_at": "2026-05-11T10:23:03.830052+00:00",
  "created_by": "project-pack-compiler",
  "feedback": {
    "carrier_selection_notes": [
      "viable_asset_types=skill, recipe, host_instruction, eval, preflight",
      "recommended_asset_types=skill, recipe, host_instruction, eval, preflight"
    ],
    "evidence_delta": {
      "confirmed_claims": [
        "identity_anchor_present",
        "capability_and_host_targets_present",
        "install_path_declared_or_better"
      ],
      "missing_required_fields": [],
      "must_verify_forwarded": [
        "Run or inspect `npx -y firecrawl-cli@latest` in an isolated environment.",
        "Confirm the project exposes the claimed capability to at least one target host."
      ],
      "quickstart_execution_scope": "allowlisted_sandbox_smoke",
      "sandbox_command": "npx -y firecrawl-cli@latest",
      "sandbox_container_image": "node:22-slim",
      "sandbox_execution_backend": "docker",
      "sandbox_planner_decision": "deterministic_isolated_install",
      "sandbox_validation_id": "sbx_a4dbc4bacf8c4e75ac5ceb169613def8"
    },
    "feedback_event_type": "project_pack_compilation_feedback",
    "learning_candidate_reasons": [],
    "template_gaps": []
  },
  "identity": {
    "canonical_id": "project_337392ca802daaed83bd5afc727f735b",
    "canonical_name": "firecrawl/firecrawl",
    "homepage_url": null,
    "license": "unknown",
    "repo_url": "https://github.com/firecrawl/firecrawl",
    "slug": "firecrawl",
    "source_packet_id": "phit_960bb077ed8b44929449275d3a2c7f98",
    "source_validation_id": "dval_9158bef2a4034d23ab2b340668b353d5"
  },
  "merchandising": {
    "best_for": "需要软件开发与交付能力，并使用 local_cli的用户",
    "github_forks": 7359,
    "github_stars": 119078,
    "one_liner_en": "🔥 The API to search, scrape, and interact with the web for AI",
    "one_liner_zh": "🔥 The API to search, scrape, and interact with the web for AI",
    "primary_category": {
      "category_id": "software-development",
      "confidence": "high",
      "name_en": "Software Development",
      "name_zh": "软件开发与交付",
      "reason": "matched_keywords:test, git, cli"
    },
    "target_user": "使用 local_cli 等宿主 AI 的用户",
    "title_en": "firecrawl",
    "title_zh": "firecrawl 能力包",
    "visible_tags": [
      {
        "label_en": "Browser Agents",
        "label_zh": "浏览器 Agent",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "product_domain-browser-agents",
        "type": "product_domain"
      },
      {
        "label_en": "Web Task Automation",
        "label_zh": "网页任务自动化",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "user_job-web-task-automation",
        "type": "user_job"
      },
      {
        "label_en": "Browser Automation",
        "label_zh": "浏览器自动化",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "core_capability-browser-automation",
        "type": "core_capability"
      },
      {
        "label_en": "Node-based Workflow",
        "label_zh": "节点式流程编排",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "workflow_pattern-node-based-workflow",
        "type": "workflow_pattern"
      },
      {
        "label_en": "Local-first",
        "label_zh": "本地优先",
        "source": "repo_evidence_project_characteristics",
        "tag_id": "selection_signal-local-first",
        "type": "selection_signal"
      }
    ]
  },
  "packet_id": "phit_960bb077ed8b44929449275d3a2c7f98",
  "page_model": {
    "artifacts": {
      "artifact_slug": "firecrawl",
      "files": [
        "PROJECT_PACK.json",
        "QUICK_START.md",
        "PROMPT_PREVIEW.md",
        "HUMAN_MANUAL.md",
        "AI_CONTEXT_PACK.md",
        "BOUNDARY_RISK_CARD.md",
        "PITFALL_LOG.md",
        "REPO_INSPECTION.json",
        "REPO_INSPECTION.md",
        "CAPABILITY_CONTRACT.json",
        "EVIDENCE_INDEX.json",
        "CLAIM_GRAPH.json"
      ],
      "required_files": [
        "PROJECT_PACK.json",
        "QUICK_START.md",
        "PROMPT_PREVIEW.md",
        "HUMAN_MANUAL.md",
        "AI_CONTEXT_PACK.md",
        "BOUNDARY_RISK_CARD.md",
        "PITFALL_LOG.md",
        "REPO_INSPECTION.json"
      ]
    },
    "detail": {
      "capability_source": "Project Hit Packet + DownstreamValidationResult",
      "commands": [
        {
          "command": "npx -y firecrawl-cli@latest",
          "label": "Node.js / npx · 官方安装入口",
          "source": "https://github.com/firecrawl/firecrawl#readme",
          "verified": true
        }
      ],
      "display_tags": [
        "浏览器 Agent",
        "网页任务自动化",
        "浏览器自动化",
        "节点式流程编排",
        "本地优先"
      ],
      "eyebrow": "软件开发与交付",
      "glance": [
        {
          "body": "判断自己是不是目标用户。",
          "label": "最适合谁",
          "value": "需要软件开发与交付能力，并使用 local_cli的用户"
        },
        {
          "body": "先理解能力边界，再决定是否继续。",
          "label": "核心价值",
          "value": "🔥 The API to search, scrape, and interact with the web for AI"
        },
        {
          "body": "未完成验证前保持审慎。",
          "label": "继续前",
          "value": "publish to Doramagic.ai project surfaces"
        }
      ],
      "guardrail_source": "Boundary & Risk Card",
      "guardrails": [
        {
          "body": "Prompt Preview 只展示流程，不证明项目已安装或运行。",
          "label": "Check 1",
          "value": "不要把试用当真实运行"
        },
        {
          "body": "local_cli",
          "label": "Check 2",
          "value": "确认宿主兼容"
        },
        {
          "body": "publish to Doramagic.ai project surfaces",
          "label": "Check 3",
          "value": "先隔离验证"
        }
      ],
      "mode": "skill, recipe, host_instruction, eval, preflight",
      "pitfall_log": {
        "items": [
          {
            "body": "GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows",
            "category": "安全/权限坑",
            "evidence": [
              "community_evidence:github | cevd_0bf31b0e8c3b45fb8da04cebb259c8a4 | https://github.com/firecrawl/firecrawl/issues/3500 | 来源类型 github_issue 暴露的待验证使用条件。"
            ],
            "severity": "high",
            "suggested_check": "来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。",
            "title": "来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows",
            "user_impact": "可能影响升级、迁移或版本选择。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个安装相关的待验证问题：v2.4.0",
            "category": "安装坑",
            "evidence": [
              "community_evidence:github | cevd_e1e417d6cea44fb79118e4daeac083a0 | https://github.com/firecrawl/firecrawl/releases/tag/v2.4.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：v2.4.0",
            "user_impact": "可能增加新用户试用和生产接入成本。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个配置相关的待验证问题：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions",
            "category": "配置坑",
            "evidence": [
              "community_evidence:github | cevd_aa487261676d400197da5f3646baff2f | https://github.com/firecrawl/firecrawl/issues/3498 | 来源讨论提到 python 相关条件，需在安装/试用前复核。"
            ],
            "severity": "medium",
            "suggested_check": "来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。",
            "title": "来源证据：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions",
            "user_impact": "可能增加新用户试用和生产接入成本。"
          },
          {
            "body": "README/documentation is current enough for a first validation pass.",
            "category": "能力坑",
            "evidence": [
              "capability.assumptions | github_repo:787076358 | https://github.com/firecrawl/firecrawl | README/documentation is current enough for a first validation pass."
            ],
            "severity": "medium",
            "suggested_check": "将假设转成下游验证清单。",
            "title": "能力判断依赖假设",
            "user_impact": "假设不成立时，用户拿不到承诺的能力。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个运行相关的待验证问题：[Feat] Emit batch scrape failures of each page to webhook",
            "category": "运行坑",
            "evidence": [
              "community_evidence:github | cevd_80c638d597cc432b9a74e7e336b043ee | https://github.com/firecrawl/firecrawl/issues/2576 | 来源类型 github_issue 暴露的待验证使用条件。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：[Feat] Emit batch scrape failures of each page to webhook",
            "user_impact": "可能增加新用户试用和生产接入成本。"
          },
          {
            "body": "未记录 last_activity_observed。",
            "category": "维护坑",
            "evidence": [
              "evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | last_activity_observed missing"
            ],
            "severity": "medium",
            "suggested_check": "补 GitHub 最近 commit、release、issue/PR 响应信号。",
            "title": "维护活跃度未知",
            "user_impact": "新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。"
          },
          {
            "body": "no_demo",
            "category": "安全/权限坑",
            "evidence": [
              "downstream_validation.risk_items | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium"
            ],
            "severity": "medium",
            "suggested_check": "进入安全/权限治理复核队列。",
            "title": "下游验证发现风险项",
            "user_impact": "下游已经要求复核，不能在页面中弱化。"
          },
          {
            "body": "No sandbox install has been executed yet; downstream must verify before user use.",
            "category": "安全/权限坑",
            "evidence": [
              "risks.safety_notes | github_repo:787076358 | https://github.com/firecrawl/firecrawl | No sandbox install has been executed yet; downstream must verify before user use."
            ],
            "severity": "medium",
            "suggested_check": "转成明确权限清单和安全审查提示。",
            "title": "存在安全注意事项",
            "user_impact": "用户安装前需要知道权限边界和敏感操作。"
          },
          {
            "body": "no_demo",
            "category": "安全/权限坑",
            "evidence": [
              "risks.scoring_risks | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium"
            ],
            "severity": "medium",
            "suggested_check": "把风险写入边界卡，并确认是否需要人工复核。",
            "title": "存在评分风险",
            "user_impact": "风险会影响是否适合普通用户安装。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies",
            "category": "安全/权限坑",
            "evidence": [
              "community_evidence:github | cevd_ef6deffa53c147b29e617225612e55b0 | https://github.com/firecrawl/firecrawl/issues/2814 | 来源讨论提到 python 相关条件，需在安装/试用前复核。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies",
            "user_impact": "可能影响授权、密钥配置或安全边界。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.0.1",
            "category": "安全/权限坑",
            "evidence": [
              "community_evidence:github | cevd_0334c6a4c3284763a02c66ac96ce9c0c | https://github.com/firecrawl/firecrawl/releases/tag/v2.0.1 | 来源类型 github_release 暴露的待验证使用条件。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：v2.0.1",
            "user_impact": "可能增加新用户试用和生产接入成本。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.1.0",
            "category": "安全/权限坑",
            "evidence": [
              "community_evidence:github | cevd_360eac170b12452583bb9b7072acc4e3 | https://github.com/firecrawl/firecrawl/releases/tag/v2.1.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：v2.1.0",
            "user_impact": "可能增加新用户试用和生产接入成本。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.2.0",
            "category": "安全/权限坑",
            "evidence": [
              "community_evidence:github | cevd_749e0e1b86ba455585d343764588f00e | https://github.com/firecrawl/firecrawl/releases/tag/v2.2.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：v2.2.0",
            "user_impact": "可能影响授权、密钥配置或安全边界。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.3.0",
            "category": "安全/权限坑",
            "evidence": [
              "community_evidence:github | cevd_e6f1735e34a34eacb7b77e7bb21644a6 | https://github.com/firecrawl/firecrawl/releases/tag/v2.3.0 | 来源讨论提到 npm 相关条件，需在安装/试用前复核。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：v2.3.0",
            "user_impact": "可能增加新用户试用和生产接入成本。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.5.0 - The World's Best Web Data API",
            "category": "安全/权限坑",
            "evidence": [
              "community_evidence:github | cevd_4f928a2f370b4186ba4031bc4830020c | https://github.com/firecrawl/firecrawl/releases/tag/v2.5.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：v2.5.0 - The World's Best Web Data API",
            "user_impact": "可能影响授权、密钥配置或安全边界。"
          },
          {
            "body": "GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.6.0",
            "category": "安全/权限坑",
            "evidence": [
              "community_evidence:github | cevd_38343ea51e374e86a5081e46c837468c | https://github.com/firecrawl/firecrawl/releases/tag/v2.6.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。"
            ],
            "severity": "medium",
            "suggested_check": "来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。",
            "title": "来源证据：v2.6.0",
            "user_impact": "可能影响授权、密钥配置或安全边界。"
          }
        ],
        "source": "ProjectPitfallLog + ProjectHitPacket + validation + community signals",
        "summary": "发现 21 个潜在踩坑项，其中 1 个为 high/blocking；最高优先级：安全/权限坑 - 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows。",
        "title": "踩坑日志"
      },
      "snapshot": {
        "contributors": 151,
        "forks": 7359,
        "license": "unknown",
        "note": "GitHub API 快照，非实时质量证明；用于开工前背景判断。",
        "stars": 119078,
        "open_issues": 315,
        "pushed_at": "2026-05-12T22:10:26.000Z"
      },
      "source_url": "https://github.com/firecrawl/firecrawl",
      "steps": [
        {
          "body": "不安装项目，先体验能力节奏。",
          "code": "preview",
          "title": "先试 Prompt"
        },
        {
          "body": "理解输入、输出、失败模式和边界。",
          "code": "manual",
          "title": "读说明书"
        },
        {
          "body": "把上下文交给宿主 AI 继续工作。",
          "code": "context",
          "title": "带给 AI"
        },
        {
          "body": "进入主力环境前先完成安装入口与风险边界验证。",
          "code": "verify",
          "title": "沙箱验证"
        }
      ],
      "subtitle": "🔥 The API to search, scrape, and interact with the web for AI",
      "title": "firecrawl 能力包",
      "trial_prompt": "# firecrawl - Prompt Preview\n\n> 复制下面这段 Prompt 到你常用的 AI，先试一次，不需要安装。\n> 它的目标是让你直接体验这个项目的服务方式，而不是阅读项目介绍。\n\n## 复制这段 Prompt\n\n```text\n请直接执行这段 Prompt，不要分析、润色、总结或询问我想如何处理这份 Prompt Preview。\n\n你现在扮演 firecrawl 的“安装前体验版”。\n这不是项目介绍、不是评价报告、不是 README 总结。你的任务是让我用最小成本体验它的核心服务。\n\n我的试用任务：我想用它完成一个真实的软件开发与交付任务。\n我常用的宿主 AI：Local CLI\n\n【体验目标】\n围绕我的真实任务，现场演示这个项目如何把输入转成 示例引导, 判断线索。重点是让我感受到工作方式，而不是给我项目背景。\n\n【业务流约束】\n- 你必须像一个正在提供服务的项目能力包，而不是像一个讲解员。\n- 每一轮只推进一个步骤；提出问题后必须停下来等我回答。\n- 每一步都必须让我感受到一个具体服务动作：澄清、整理、规划、检查、判断或收尾。\n- 每一步都要说明：当前目标、你需要我提供什么、我回答后你会产出什么。\n- 不要安装、不要运行命令、不要写代码、不要声称测试通过、不要声称已经修改文件。\n- 需要真实安装或宿主加载后才能验证的内容，必须明确说“这一步需要安装后验证”。\n- 如果我说“用示例继续”，你可以用虚构示例推进，但仍然不能声称真实执行。\n\n【可体验服务能力】\n- 安装前能力预览: 🔥 The API to search, scrape, and interact with the web for AI 输入：用户任务, 当前 AI 对话上下文；输出：示例引导, 判断线索。\n\n【必须安装后才可验证的能力】\n- 暂无明确的运行时能力线索。\n\n【核心服务流】\n请严格按这个顺序带我体验。不要一次性输出完整流程：\n1. project-overview：项目概览。围绕“项目概览”模拟一次用户任务，不展示安装或运行结果。\n2. system-architecture：系统架构。围绕“系统架构”模拟一次用户任务，不展示安装或运行结果。\n3. api-routes：API路由与版本控制。围绕“API路由与版本控制”模拟一次用户任务，不展示安装或运行结果。\n4. scraping-engines：抓取引擎。围绕“抓取引擎”模拟一次用户任务，不展示安装或运行结果。\n5. search-crawl：搜索与爬取功能。围绕“搜索与爬取功能”模拟一次用户任务，不展示安装或运行结果。\n\n【核心能力体验剧本】\n每一步都必须按“输入 -> 服务动作 -> 中间产物”执行。不要只说流程名：\n1. project-overview\n输入：用户提供的“项目概览”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n2. system-architecture\n输入：用户提供的“系统架构”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n3. api-routes\n输入：用户提供的“API路由与版本控制”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n4. scraping-engines\n输入：用户提供的“抓取引擎”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n5. search-crawl\n输入：用户提供的“搜索与爬取功能”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n【项目服务规则】\n这些规则决定你如何服务用户。不要解释规则本身，而要在每一步执行时遵守：\n- 先确认用户任务、输入材料和成功标准，再模拟项目能力。\n- 每一步都必须形成可检查的小产物，并等待用户确认后再继续。\n- 凡是需要安装、调用工具或访问外部服务的能力，都必须标记为安装后验证。\n\n【每一步的服务约束】\n- Step 1 / project-overview：Step 1 必须围绕“项目概览”形成一个小中间产物，并等待用户确认。\n- Step 2 / system-architecture：Step 2 必须围绕“系统架构”形成一个小中间产物，并等待用户确认。\n- Step 3 / api-routes：Step 3 必须围绕“API路由与版本控制”形成一个小中间产物，并等待用户确认。\n- Step 4 / scraping-engines：Step 4 必须围绕“抓取引擎”形成一个小中间产物，并等待用户确认。\n- Step 5 / search-crawl：Step 5 必须围绕“搜索与爬取功能”形成一个小中间产物，并等待用户确认。\n\n【边界与风险】\n- 不要声称已经安装、运行、调用 API、读写本地文件或完成真实任务。\n- 安装前预览只能展示工作方式，不能证明兼容性、性能或输出质量。\n\n【可追溯依据】\n这些路径只用于你内部校验或在我追问“依据是什么”时简要引用。不要在首次回复主动展开：\n- https://github.com/firecrawl/firecrawl\n- https://github.com/firecrawl/firecrawl#readme\n- README.md\n- apps/api/package.json\n- CLAUDE.md\n- apps/api/src/index.ts\n- apps/api/src/harness.ts\n- apps/api/native/src/lib.rs\n- apps/api/src/services/index.ts\n- apps/api/src/services/queue-service.ts\n- apps/api/src/routes/v0.ts\n- apps/api/src/routes/v1.ts\n\n【首次问题规则】\n- 首次三问必须先确认用户目标、成功标准和边界，不要提前进入工具、安装或实现细节。\n- 如果后续需要技术条件、文件路径或运行环境，必须等用户确认目标后再追问。\n\n首次回复必须只输出下面 4 个部分：\n1. 体验开始：用 1 句话说明你将带我体验 firecrawl 的核心服务。\n2. 当前步骤：明确进入 Step 1，并说明这一步要解决什么。\n3. 你会如何服务我：说明你会先改变我完成任务的哪个动作。\n4. 只问我 3 个问题，然后停下等待回答。\n\n首次回复禁止输出：后续完整流程、证据清单、安装命令、项目评价、营销文案、已经安装或运行的说法。\n\nStep 1 / brainstorming 的二轮协议：\n- 我回答首次三问后，你仍然停留在 Step 1 / brainstorming，不要进入 Step 2。\n- 第二次回复必须产出 6 个部分：澄清后的任务定义、成功标准、边界条件、\n  2-3 个可选方案、每个方案的权衡、推荐方案。\n- 第二次回复最后必须问我是否确认推荐方案；只有我明确确认后，才能进入下一步。\n- 第二次回复禁止输出 git worktree、代码计划、测试文件、命令或真实执行结果。\n\n后续对话规则：\n- 我回答后，你先完成当前步骤的中间产物并等待确认；只有我确认后，才能进入下一步。\n- 每一步都要生成一个小的中间产物，例如澄清后的目标、计划草案、测试意图、验证清单或继续/停止判断。\n- 所有演示都写成“我会建议/我会引导/这一步会形成”，不要写成已经真实执行。\n- 不要声称已经测试通过、文件已修改、命令已运行或结果已产生。\n- 如果某个能力必须安装后验证，请直接说“这一步需要安装后验证”。\n- 如果证据不足，请明确说“证据不足”，不要补事实。\n```\n",
      "voices": [
        {
          "body": "来源平台：github。github/github_issue: [Feat] Support custom HTTP headers in Node.js SDK for self-hosted instan（https://github.com/firecrawl/firecrawl/issues/2814）；github/github_issue: [Feat] Emit batch scrape failures of each page to webhook（https://github.com/firecrawl/firecrawl/issues/2576）；github/github_issue: RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Wor（https://github.com/firecrawl/firecrawl/issues/3500）；github/github_issue: [Bug] /interact with language=\"python\" flakily fails with TargetClosedEr（https://github.com/firecrawl/firecrawl/issues/3498）；github/github_release: v2.9.0（https://github.com/firecrawl/firecrawl/releases/tag/v2.9.0）；github/github_release: v2.8.0（https://github.com/firecrawl/firecrawl/releases/tag/v2.8.0）；github/github_release: v2.7.0（https://github.com/firecrawl/firecrawl/releases/tag/v2.7.0）；github/github_release: v2.6.0（https://github.com/firecrawl/firecrawl/releases/tag/v2.6.0）；github/github_release: v2.5.0 - The World's Best Web Data API（https://github.com/firecrawl/firecrawl/releases/tag/v2.5.0）；github/github_release: v2.4.0（https://github.com/firecrawl/firecrawl/releases/tag/v2.4.0）；github/github_release: v2.3.0（https://github.com/firecrawl/firecrawl/releases/tag/v2.3.0）；github/github_release: v2.2.0（https://github.com/firecrawl/firecrawl/releases/tag/v2.2.0）。这些是项目级外部声音，不作为单独质量证明。",
          "items": [
            {
              "kind": "github_issue",
              "source": "github",
              "title": "[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instan",
              "url": "https://github.com/firecrawl/firecrawl/issues/2814"
            },
            {
              "kind": "github_issue",
              "source": "github",
              "title": "[Feat] Emit batch scrape failures of each page to webhook",
              "url": "https://github.com/firecrawl/firecrawl/issues/2576"
            },
            {
              "kind": "github_issue",
              "source": "github",
              "title": "RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Wor",
              "url": "https://github.com/firecrawl/firecrawl/issues/3500"
            },
            {
              "kind": "github_issue",
              "source": "github",
              "title": "[Bug] /interact with language=\"python\" flakily fails with TargetClosedEr",
              "url": "https://github.com/firecrawl/firecrawl/issues/3498"
            },
            {
              "kind": "github_release",
              "source": "github",
              "title": "v2.9.0",
              "url": "https://github.com/firecrawl/firecrawl/releases/tag/v2.9.0"
            },
            {
              "kind": "github_release",
              "source": "github",
              "title": "v2.8.0",
              "url": "https://github.com/firecrawl/firecrawl/releases/tag/v2.8.0"
            },
            {
              "kind": "github_release",
              "source": "github",
              "title": "v2.7.0",
              "url": "https://github.com/firecrawl/firecrawl/releases/tag/v2.7.0"
            },
            {
              "kind": "github_release",
              "source": "github",
              "title": "v2.6.0",
              "url": "https://github.com/firecrawl/firecrawl/releases/tag/v2.6.0"
            },
            {
              "kind": "github_release",
              "source": "github",
              "title": "v2.5.0 - The World's Best Web Data API",
              "url": "https://github.com/firecrawl/firecrawl/releases/tag/v2.5.0"
            },
            {
              "kind": "github_release",
              "source": "github",
              "title": "v2.4.0",
              "url": "https://github.com/firecrawl/firecrawl/releases/tag/v2.4.0"
            },
            {
              "kind": "github_release",
              "source": "github",
              "title": "v2.3.0",
              "url": "https://github.com/firecrawl/firecrawl/releases/tag/v2.3.0"
            },
            {
              "kind": "github_release",
              "source": "github",
              "title": "v2.2.0",
              "url": "https://github.com/firecrawl/firecrawl/releases/tag/v2.2.0"
            }
          ],
          "status": "已收录 12 条来源",
          "title": "社区讨论"
        }
      ]
    },
    "homepage_card": {
      "category": "软件开发与交付",
      "desc": "🔥 The API to search, scrape, and interact with the web for AI",
      "effort": "安装已验证",
      "forks": 7331,
      "icon": "code",
      "name": "firecrawl 能力包",
      "risk": "可发布",
      "slug": "firecrawl",
      "stars": 117823,
      "tags": [
        "浏览器 Agent",
        "网页任务自动化",
        "浏览器自动化",
        "节点式流程编排",
        "本地优先"
      ],
      "thumb": "gray",
      "type": "Skill Pack"
    },
    "manual": {
      "markdown": "# https://github.com/firecrawl/firecrawl 项目说明书\n\n生成时间：2026-05-11 04:15:16 UTC\n\n## 目录\n\n- [项目概览](#project-overview)\n- [系统架构](#system-architecture)\n- [API路由与版本控制](#api-routes)\n- [抓取引擎](#scraping-engines)\n- [搜索与爬取功能](#search-crawl)\n- [数据提取系统](#extraction-system)\n- [监控与Webhook](#monitoring-webhooks)\n- [多语言SDK](#multi-language-sdks)\n- [部署与基础设施](#deployment-infra)\n- [开发指南](#development-guide)\n\n<a id='project-overview'></a>\n\n## 项目概览\n\n### 相关页面\n\n相关主题：[系统架构](#system-architecture), [多语言SDK](#multi-language-sdks)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [README.md](https://github.com/firecrawl/firecrawl/blob/main/README.md)\n- [apps/python-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/README.md)\n- [apps/js-sdk/firecrawl/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/README.md)\n- [apps/java-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/java-sdk/README.md)\n- [apps/ruby-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/ruby-sdk/README.md)\n- [apps/dotnet-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/dotnet-sdk/README.md)\n- [apps/rust-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/rust-sdk/README.md)\n- [apps/php-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/php-sdk/README.md)\n</details>\n\n# 项目概览\n\n## 项目简介\n\nFirecrawl 是一个由 Mendable.ai 开发的开源网页抓取和爬虫平台，旨在将网站转换为可供大语言模型（LLM）使用的结构化数据。Firecrawl 提供从网站搜索、内容抓取、页面交互到智能代理的全栈解决方案，帮助开发者轻松获取互联网数据并用于 AI 应用开发。\n\n项目采用多语言 SDK 架构设计，提供了 Python、Node.js、Java、Ruby、Go、.NET、Rust、PHP 等多种编程语言的官方 SDK，支持开发者使用熟悉的开发环境集成 Firecrawl 功能。资料来源：[README.md:1-50]()\n\n## 核心功能模块\n\nFirecrawl 平台提供四大核心功能模块，分别对应不同的网页数据采集场景：\n\n### Search（搜索）\n\nSearch 模块支持对互联网进行自然语言搜索，返回与查询关键词相关的网页列表。每个搜索结果包含 URL、标题和页面摘要的 Markdown 格式内容，非常适合构建知识库或信息检索应用。资料来源：[README.md:45-60]()\n\n### Scrape（抓取）\n\nScrape 是 Firecrawl 最核心的功能模块，用于从单个 URL 提取结构化数据。支持多种输出格式，包括 Markdown、HTML、JSON（通过 Schema 提取）、链接列表、截图等。开发者可以配置只提取主内容、设置等待时间、控制输出格式等参数。资料来源：[README.md:70-95]()\n\n### Interact（交互）\n\nInteract 模块支持基于抓取结果的浏览器自动化交互。用户可以先使用 Scrape 抓取页面，然后通过 AI 提示词或 JavaScript 代码与页面进行交互，如点击按钮、填写表单、搜索内容等操作。资料来源：[README.md:100-120]()\n\n### Agent（智能代理）\n\nAgent 模块是 Firecrawl 的高级功能，允许开发者使用自然语言描述目标，系统自动完成数据采集和整理。例如，开发者可以描述\"查找某公司的创始人信息\"，Agent 会自动规划搜索路径、抓取相关页面并提取结构化结果。资料来源：[apps/python-sdk/README.md:30-35]()\n\n## 系统架构\n\n### 整体架构图\n\n```mermaid\ngraph TD\n    subgraph 客户端层\n        Python[Python SDK]\n        NodeJS[Node.js SDK]\n        Java[Java SDK]\n        Ruby[Ruby SDK]\n        Go[Go SDK]\n        DotNet[.NET SDK]\n        Rust[Rust SDK]\n        PHP[PHP SDK]\n        CLI[Firecrawl CLI]\n        DirectAPI[直接 API 调用]\n    end\n\n    subgraph API 网关层\n        Gateway[API Gateway]\n        Auth[身份验证]\n        RateLimit[限流控制]\n    end\n\n    subgraph 核心服务层\n        ScrapeService[Scrape 服务]\n        CrawlService[Crawl 服务]\n        MapService[Map 服务]\n        SearchService[Search 服务]\n        AgentService[Agent 服务]\n        InteractService[Interact 服务]\n    end\n\n    subgraph 数据处理层\n        HTMLParser[HTML 解析器]\n        MarkdownConverter[Markdown 转换]\n        JSONExtractor[JSON Schema 提取]\n        ScreenshotEngine[截图引擎]\n        GoHTML2MD[Go HTML-to-MD 库]\n    end\n\n    subgraph 监控服务\n        Monitor[监控服务]\n        Notification[通知服务]\n    end\n\n    客户端层 --> API 网关层\n    API 网关层 --> 核心服务层\n    核心服务层 --> 数据处理层\n    核心服务层 --> 监控服务\n```\n\n### API 端点概览\n\n| 端点 | 方法 | 功能描述 | 异步支持 |\n|------|------|----------|----------|\n| `/v2/scrape` | POST | 抓取单个 URL 的内容 | 否 |\n| `/v2/crawl` | POST | 启动网站爬虫任务 | 是（轮询） |\n| `/v2/map` | POST | 发现网站所有 URL | 否 |\n| `/v2/search` | POST | 互联网全文搜索 | 否 |\n| `/v1/scrape` | POST | 旧版抓取接口 | 否 |\n\n资料来源：[README.md:20-80]()\n\n## 多语言 SDK 支持\n\nFirecrawl 提供了丰富的官方 SDK，覆盖主流编程语言生态：\n\n### SDK 功能对比\n\n| SDK | 包名称 | 安装方式 | 版本 | 特殊功能 |\n|-----|--------|----------|------|----------|\n| Python | `firecrawl-py` | `pip install firecrawl-py` | 2.x | Agent、异步爬虫 |\n| Node.js | `@mendable/firecrawl-js` | `npm install @mendable/firecrawl-js` | 最新 | Zod Schema 支持 |\n| Java | `com.firecrawl:firecrawl-java` | Maven/Gradle | 1.1.1 | 构建器模式 |\n| Ruby | `firecrawl-sdk` | `gem install firecrawl-sdk` | 1.0 | - |\n| Go | `github.com/firecrawl/firecrawl-go-sdk` | `go get` | - | - |\n| .NET | `firecrawl-sdk` | `dotnet add package firecrawl-sdk` | - | HttpClient 可定制 |\n| Rust | `firecrawl` | Cargo.toml | 2.1.0 | 异步运行时 |\n| PHP | `firecrawl/sdk` | Composer | - | Laravel Facade |\n\n资料来源：[apps/python-sdk/README.md:1-20]()[apps/js-sdk/firecrawl/README.md:1-30]()[apps/java-sdk/README.md:1-20]()[apps/ruby-sdk/README.md:1-25]()[apps/dotnet-sdk/README.md:1-20]()[apps/rust-sdk/README.md:1-30]()[apps/php-sdk/README.md:1-20]()\n\n### Python SDK 示例\n\n```python\nfrom firecrawl import Firecrawl\nfrom firecrawl.types import ScrapeOptions\n\nfirecrawl = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\n# 抓取单个页面\ndoc = firecrawl.scrape(\"https://firecrawl.dev\", formats=[\"markdown\"])\nprint(doc.markdown)\n\n# 批量爬虫\ndocs = firecrawl.crawl(\"https://docs.firecrawl.dev\", limit=50)\nfor doc in docs.data:\n    print(doc.metadata.source_url)\n\n# 使用 Agent\nresult = firecrawl.agent(prompt=\"查找 Stripe 公司的创始人\")\nprint(result.data)\n```\n\n资料来源：[apps/python-sdk/README.md:15-45]()\n\n### Node.js SDK 示例\n\n```javascript\nimport Firecrawl from '@mendable/firecrawl-js';\nimport { z } from 'zod';\n\nconst app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });\n\n// 使用 Zod Schema 提取结构化数据\nconst schema = z.object({\n  title: z.string(),\n  price: z.number(),\n});\n\nconst result = await app.extract({\n  urls: ['https://example.com/product'],\n  prompt: '提取产品名称和价格',\n  schema,\n});\n\nconsole.log(result.data);\n```\n\n资料来源：[apps/js-sdk/firecrawl/README.md:40-60]()\n\n## 高级功能\n\n### 批量抓取（Batch Scrape）\n\n批量抓取功能允许开发者一次性提交多个 URL 进行抓取，适合需要对多个页面进行数据采集的场景。系统会自动管理任务队列和并发控制。资料来源：[README.md:80-95]()\n\n```python\njob = app.batch_scrape([\n    \"https://firecrawl.dev\",\n    \"https://docs.firecrawl.dev\",\n    \"https://firecrawl.dev/pricing\"\n], formats=[\"markdown\"])\n\nfor doc in job.data:\n    print(doc.metadata.source_url)\n```\n\n### 文件解析（Parse）\n\nParse 功能支持上传本地文件（HTML、PDF、DOCX 等）并进行解析，无需通过 URL 抓取。该功能适用于处理本地文档或通过其他渠道获取的文件内容。资料来源：[apps/python-sdk/README.md:60-80]()\n\n```python\ndoc = firecrawl.parse(\n    b\"<!DOCTYPE html><html><body><h1>Content</h1></body></html>\",\n    filename=\"upload.html\",\n    content_type=\"text/html\",\n    options=ParseOptions(formats=[\"markdown\"]),\n)\n```\n\n### JSON Schema 提取\n\n通过 JSON Schema 定义数据结构，Firecrawl 可以自动从页面中提取符合模式的数据，返回结构化的 JSON 输出。资料来源：[apps/java-sdk/README.md:50-75]()\n\n```java\nJsonFormat jsonFmt = JsonFormat.builder()\n    .prompt(\"提取产品名称和价格\")\n    .schema(Map.of(\n        \"type\", \"object\",\n        \"properties\", Map.of(\n            \"name\", Map.of(\"type\", \"string\"),\n            \"price\", Map.of(\"type\", \"number\")\n        )\n    ))\n    .build();\n\nDocument doc = client.scrape(\"https://example.com/product\",\n    ScrapeOptions.builder()\n        .formats(List.of(jsonFmt))\n        .build());\n```\n\n### 网站地图（Map）\n\nMap 功能快速发现网站上的所有页面 URL，支持基于关键词的智能搜索排序。返回结果包含每个 URL 的标题和描述信息。资料来源：[README.md:40-50]()\n\n```python\nresult = app.map(\"https://firecrawl.dev\", search=\"pricing\")\n# 返回与 \"pricing\" 相关的 URL 列表\n```\n\n## 配置选项\n\n### ScrapeOptions 参数表\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `formats` | List[str] | [\"markdown\"] | 输出格式列表 |\n| `only_main_content` | bool | false | 仅提取主体内容 |\n| `wait_for` | int | 0 | 等待加载时间（毫秒） |\n| `timeout` | int | 60000 | 请求超时（毫秒） |\n| `remove_base64_images` | bool | true | 移除 Base64 图片 |\n| `include_raw_html` | bool | false | 包含原始 HTML |\n| `extractor_options` | dict | None | JSON 提取配置 |\n| `actions` | List[dict] | None | 自动化操作列表 |\n\n### CrawlOptions 参数表\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `limit` | int | None | 最大页面数量 |\n| `scrape_options` | ScrapeOptions | None | 抓取配置 |\n| `poll_interval` | int | 2 | 轮询间隔（秒） |\n| `depth` | int | None | 爬虫深度限制 |\n| `allow_dangerous` | bool | false | 允许危险操作 |\n\n资料来源：[apps/python-sdk/README.md:40-65]()[apps/rust-sdk/README.md:30-60]()\n\n## 集成生态\n\nFirecrawl 与多个主流平台和工具深度集成：\n\n### AI 工具集成\n\n| 集成产品 | 说明 | 文档链接 |\n|----------|------|----------|\n| Firecrawl Skill | CLI 工具集成 | [文档](https://docs.firecrawl.dev/sdks/cli) |\n| Firecrawl MCP | Model Context Protocol 服务器 | [GitHub](https://github.com/mendableai/firecrawl-mcp-server) |\n| DeepSeek V3 Crawler | DeepSeek 模型驱动的爬虫 | [示例](../examples/deepseek-v3-crawler/README.md) |\n| Gemini 2.5 Extractor | Gemini 模型数据提取 | [示例](../examples/gemini-2.5-web-extractor/README.md) |\n\n### 平台集成\n\n| 平台 | 说明 |\n|------|------|\n| Lovable | 可在 Lovable 应用中直接使用 Firecrawl |\n| Zapier | 通过 Zapier 自动化工作流集成 |\n| n8n | 支持 n8n 工作流自动化平台 |\n\n资料来源：[README.md:120-140]()\n\n## 环境配置\n\n### API Key 配置\n\nFirecrawl 支持两种 API Key 配置方式：\n\n1. **环境变量配置**（推荐）：设置 `FIRECRAWL_API_KEY` 环境变量\n2. **代码显式传入**：在客户端初始化时直接传入 API Key\n\n### 常用环境变量\n\n| 变量名 | 说明 | 示例 |\n|--------|------|------|\n| `FIRECRAWL_API_KEY` | API 密钥（必填） | `fc-xxxxxxxxxxxx` |\n| `FIRECRAWL_API_URL` | 自托管实例 URL | `http://localhost:3002` |\n| `FIRECRAWL_BACKOFF_FACTOR` | 重试退避因子 | `0.5` |\n\n```bash\n# Bash/Shell\nexport FIRECRAWL_API_KEY=\"fc-your-api-key\"\nexport FIRECRAWL_API_URL=\"http://localhost:3002\"\n```\n\n```csharp\n// .NET\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-api-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\",\n    httpClient: new HttpClient { Timeout = TimeSpan.FromSeconds(60) }\n);\n```\n\n资料来源：[apps/dotnet-sdk/README.md:20-45]()[apps/php-sdk/README.md:25-40]()\n\n## 工作流程示例\n\n### 典型数据采集流程\n\n```mermaid\ngraph LR\n    A[确定目标网站] --> B[使用 Map 发现 URL]\n    B --> C[评估 URL 相关性]\n    C --> D[配置抓取参数]\n    D --> E[执行批量抓取]\n    E --> F[解析响应数据]\n    F --> G[存储结构化数据]\n```\n\n### 交互式数据提取流程\n\n```mermaid\ngraph TD\n    A[Scrape 抓取页面] --> B[获取 scrapeId]\n    B --> C[使用 Interact 交互]\n    C --> D[执行 JS 代码或 AI 提示]\n    D --> E[等待操作完成]\n    E --> F[获取更新后的页面状态]\n    F --> G[提取最终数据]\n```\n\n## 总结\n\nFirecrawl 是一个功能全面的网页数据采集平台，通过统一 API 和多语言 SDK 为开发者提供了便捷的网页抓取、爬虫、搜索和智能代理能力。其设计理念是简化网页数据获取的复杂性，让开发者能够专注于业务逻辑而非底层实现。无论是构建知识库、训练 AI 模型还是自动化数据采集任务，Firecrawl 都能提供可靠的解决方案。\n\n---\n\n<a id='system-architecture'></a>\n\n## 系统架构\n\n### 相关页面\n\n相关主题：[项目概览](#project-overview), [API路由与版本控制](#api-routes), [部署与基础设施](#deployment-infra)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/index.ts)\n- [apps/api/src/harness.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/harness.ts)\n- [apps/api/native/src/lib.rs](https://github.com/firecrawl/firecrawl/blob/main/apps/api/native/src/lib.rs)\n- [apps/api/src/services/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/index.ts)\n- [apps/api/src/services/queue-service.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/queue-service.ts)\n</details>\n\n# 系统架构\n\nFirecrawl 是一个现代化的网页抓取和数据提取平台，采用微服务化的 SDK 架构设计。系统由中央 API 服务器、多语言 SDK 客户端、异步任务队列服务以及原生性能优化库组成，旨在为 AI 系统提供搜索、抓取和网页交互的完整解决方案。\n\n## 整体架构概览\n\nFirecrawl 采用典型的客户端-服务器架构，API 服务器托管在 `api.firecrawl.dev`，通过 RESTful API 与多语言 SDK 进行通信。\n\n```mermaid\ngraph TD\n    A[多语言 SDK 客户端] --> B[Firecrawl API 服务器]\n    B --> C[队列服务 Queue Service]\n    B --> D[抓取引擎 Scraping Engines]\n    B --> E[原生库 Native Libraries]\n    C --> F[异步任务处理器]\n    D --> G[网站内容]\n    E --> H[HTML 转 Markdown]\n```\n\n## 核心组件\n\n### API 服务器\n\nAPI 服务器是整个系统的核心枢纽，基于 Node.js/TypeScript 构建，负责处理所有客户端请求并进行任务调度。\n\n| 组件 | 功能 | 源码位置 |\n|------|------|----------|\n| 路由控制器 | 处理 API 端点路由 | apps/api/src/index.ts |\n| 服务初始化 | 加载和管理各类服务模块 | apps/api/src/services/index.ts |\n| 测试工具 | 开发环境验证 | apps/api/src/harness.ts |\n\n### 队列服务\n\n队列服务负责管理异步任务的调度和执行，确保长时间运行的任务不会阻塞主请求线程。\n\n```typescript\n// apps/api/src/services/queue-service.ts 核心职责\n// - 任务入队和出队管理\n// - 任务状态追踪\n// - 优先级调度\n// - 失败重试机制\n```\n\n队列服务支持异步爬取、批量抓取等长时间运行的操作，客户端可以通过轮询任务 ID 来获取执行结果。\n\n### 原生性能库\n\n为了优化核心性能，Firecrawl 集成了原生语言库：\n\n| 库名称 | 语言 | 用途 |\n|--------|------|------|\n| go-html-to-md | Go | HTML 到 Markdown 的高性能转换 |\n| Rust SDK | Rust | 底层高性能操作 |\n\n```bash\n# go-html-to-md 构建命令\ncd apps/api/sharedLibs/go-html-to-md\ngo build -o <OUTPUT> -buildmode=c-shared html-to-markdown.go\n```\n\n输出文件根据操作系统不同：\n- Windows: `html-to-markdown.dll`\n- Linux: `libhtml-to-markdown.so`\n- macOS: `libhtml-to-markdown.dylib`\n\n## SDK 多语言架构\n\nFirecrawl 提供统一的 SDK 体验，覆盖主流编程语言：\n\n```mermaid\ngraph LR\n    A[统一 API 接口] --> B[Python SDK]\n    A --> C[Node.js SDK]\n    A --> D[Ruby SDK]\n    A --> E[Java SDK]\n    A --> F[.NET SDK]\n    A --> G[Rust SDK]\n    A --> H[PHP SDK]\n```\n\n| SDK | 包名/依赖 | 文档位置 |\n|-----|-----------|----------|\n| Python | `firecrawl-py` | apps/python-sdk/README.md |\n| Node.js | `@mendable/firecrawl-js` | apps/js-sdk/README.md |\n| Ruby | `firecrawl-sdk` | apps/ruby-sdk/README.md |\n| Java | `com.firecrawl:firecrawl-java` | apps/java-sdk/README.md |\n| .NET | `firecrawl-sdk` | apps/dotnet-sdk/README.md |\n| Rust | `firecrawl` | apps/rust-sdk/README.md |\n| PHP | `firecrawl-sdk` | apps/php-sdk/README.md |\n\n## 功能模块架构\n\n### 核心功能\n\n```mermaid\ngraph TD\n    subgraph Firecrawl 核心功能\n        S[Search 搜索] --> Scr[Scrape 抓取]\n        Scr --> Cr[Crawl 爬取]\n        Cr --> M[Map 站点地图]\n        M --> Ex[Extract 提取]\n        Ex --> I[Interact 交互]\n        I --> Ag[Agent 智能代理]\n    end\n```\n\n### 抓取引擎\n\n系统支持多种专业化的抓取引擎，针对不同数据源进行优化：\n\n| 引擎 | 用途 | 源码示例 |\n|------|------|----------|\n| Wikipedia 引擎 | 维基百科结构化数据 | apps/api/src/scraper/scrapeURL/engines/wikipedia/index.ts |\n| 通用引擎 | 标准网页抓取 | 默认引擎 |\n\n### 数据提取服务\n\nFirecrawl 提供基于 AI 的数据提取能力：\n\n```typescript\n// apps/api/src/lib/extract/fire-0/extraction-service-f0.ts\n// - Schema 验证\n// - 单实体/多实体提取\n// - 结果混合与去重\n```\n\n## 监控与通知系统\n\n系统包含完整的监控通知机制：\n\n```typescript\n// apps/api/src/services/notification/monitoring_email.ts\n// - 变更检测摘要邮件\n// - 新增页面通知\n// - 移除页面告警\n// - 错误统计\n```\n\n监控邮件功能支持定期发送网站变更报告，包括新增、移除、变更的页面数量统计。\n\n## 认证与配置\n\n### API 密钥管理\n\nFirecrawl 支持多种 API 密钥配置方式：\n\n| 配置方式 | 优先级 | 示例 |\n|----------|--------|------|\n| 构造函数参数 | 最高 | `Client(\"fc-your-api-key\")` |\n| 环境变量 | 次高 | `FIRECRAWL_API_KEY` |\n| 配置文件 | 最低 | 各 SDK 特定配置 |\n\n### 客户端初始化示例\n\n```python\n# Python SDK\nfrom firecrawl import Firecrawl\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n```\n\n```java\n// Java SDK\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiKey(\"fc-your-api-key\")\n    .build();\n```\n\n```rust\n// Rust SDK\nuse firecrawl::{Client, ScrapeOptions, Format, CrawlOptions};\nlet client = Client::new(\"fc-YOUR_API_KEY\")?;\n```\n\n## 数据流架构\n\n```mermaid\nsequenceDiagram\n    participant C as 客户端 SDK\n    participant A as API 服务器\n    participant Q as 队列服务\n    participant E as 抓取引擎\n    participant N as 原生库\n    \n    C->>A: 发起抓取请求\n    A->>Q: 入队异步任务\n    A-->>C: 返回任务 ID\n    Q->>E: 调度抓取任务\n    E->>N: HTML 内容处理\n    N-->>E: Markdown 输出\n    E-->>Q: 任务完成\n    C->>A: 轮询任务状态\n    A-->>C: 返回抓取结果\n```\n\n## 安全与数据处理\n\n### HTML 转义处理\n\n系统对外部数据实施严格的 HTML 转义，防止 XSS 等安全问题：\n\n```typescript\n// apps/api/src/scraper/scrapeURL/engines/wikipedia/index.ts\nfunction escapeHtml(str: string): string {\n  return str\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\");\n}\n```\n\n### 内容过滤\n\n系统内置内容安全过滤机制，包括：\n- 仅提取主体内容选项\n- 可配置的等待时间\n- 格式选择（Markdown、HTML、JSON 等）\n\n## 扩展与集成\n\n### 第三方集成\n\n| 平台 | 集成方式 | 说明 |\n|------|----------|------|\n| Mendable | Firecrawl Skill | AI 技能集成 |\n| Lovalbe | 内置支持 | 无代码平台集成 |\n| Zapier | App Integration | 自动化工作流 |\n| n8n | Workflow Nodes | 自托管自动化 |\n| Gemini | 示例项目 | AI 模型集成 |\n| DeepSeek | 示例项目 | 大语言模型爬虫 |\n\n### 品牌标识处理\n\n系统包含品牌识别模块，能够从抓取页面中提取品牌名称和 Logo 信息。\n\n## 技术栈总结\n\n| 层级 | 技术选型 |\n|------|----------|\n| API 服务器 | Node.js / TypeScript / Express |\n| 原生性能库 | Go (HTML→Markdown), Rust |\n| 队列系统 | 基于 TypeScript 的异步队列 |\n| SDK 生态 | Python, Node.js, Ruby, Java, .NET, Rust, PHP |\n| 部署方式 | 云原生，支持自托管 |\n\n该架构设计遵循松耦合原则，各组件通过明确定义的接口进行通信，便于独立扩展和维护。\n\n---\n\n<a id='api-routes'></a>\n\n## API路由与版本控制\n\n### 相关页面\n\n相关主题：[系统架构](#system-architecture), [抓取引擎](#scraping-engines), [搜索与爬取功能](#search-crawl)\n\n根据上下文，我无法找到用户指定的路由源码文件。以下是现有文档中关于 API 版本的相关信息：\n\n# API 路由与版本控制\n\n由于指定的路由源文件 (`apps/api/src/routes/v0.ts`, `apps/api/src/routes/v1.ts`, `apps/api/src/routes/v2.ts`, `apps/api/src/routes/admin.ts`, `apps/api/openapi.json`) 未出现在当前检索结果中，我无法提供详细的源码级分析。\n\n## 现有文档中的 API 版本信息\n\n根据主 README.md，以下是 v2 API 端点：\n\n| API 功能 | 端点 | 方法 | 资料来源 |\n|---------|------|------|---------|\n| 搜索 | `/v2/search` | POST | README.md |\n| 抓取 | `/v2/scrape` | POST | README.md |\n| 映射网站 | `/v2/map` | POST | README.md |\n| 批量抓取 | `/v2/batch` | POST | README.md |\n\n## SDK 支持情况\n\n| SDK 语言 | 仓库路径 | 支持版本 |\n|---------|---------|---------|\n| Python | apps/python-sdk | v1, v2 |\n| Node.js | apps/js-sdk | v1, v2 |\n| Rust | apps/rust-sdk | v1, v2 |\n| Go | apps/go-sdk | v1, v2 |\n| Ruby | apps/ruby-sdk | v1, v2 |\n| Java | apps/java-sdk | v1, v2 |\n| .NET | apps/dot-net-sdk | v1, v2 |\n| PHP | apps/php-sdk | v1, v2 |\n\n## 建议\n\n要生成完整的 API 路由与版本控制 Wiki 页面，需要检索以下文件：\n- `apps/api/src/routes/v0.ts`\n- `apps/api/src/routes/v1.ts`\n- `apps/api/src/routes/v2.ts`\n- `apps/api/src/routes/admin.ts`\n- `apps/api/openapi.json`\n\n请提供这些文件的实际内容以继续生成 Wiki 页面。\n\n---\n\n<a id='scraping-engines'></a>\n\n## 抓取引擎\n\n### 相关页面\n\n相关主题：[API路由与版本控制](#api-routes), [搜索与爬取功能](#search-crawl), [数据提取系统](#extraction-system)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/scraper/scrapeURL/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/fetch/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/fetch/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/fire-engine/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/fire-engine/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/playwright/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/playwright/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/pdf/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/pdf/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/document/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/document/index.ts)\n- [apps/api/native/src/document/providers/factory.rs](https://github.com/firecrawl/firecrawl/blob/main/apps/api/native/src/document/providers/factory.rs)\n</details>\n\n# 抓取引擎\n\n## 概述\n\n抓取引擎（Scrape Engine）是 Firecrawl 系统中负责实际执行网页内容抓取的核心组件模块。它位于 `apps/api/src/scraper/scrapeURL/engines/` 目录下，采用多引擎架构设计，根据不同的内容类型和抓取需求，智能选择最适合的底层抓取实现。\n\nFirecrawl 的抓取引擎设计遵循**策略模式（Strategy Pattern）**，每个引擎实现相同的接口契约，但采用不同的技术栈来处理特定类型的内容。这种设计使得系统能够灵活应对静态网页、动态渲染页面、PDF 文档、Office 文档等多种内容源的抓取需求。\n\n抓取引擎与上层的 `scrapeURL/index.ts` 主模块协同工作，主模块负责接收抓取请求、解析配置参数、路由到合适的引擎，并最终汇总各引擎的输出结果。资料来源：[apps/api/src/scraper/scrapeURL/index.ts]()\n\n## 架构设计\n\n### 整体架构图\n\n```mermaid\ngraph TD\n    A[scrapeURL 主模块] --> B[引擎选择器]\n    B --> C[Fetch 引擎]\n    B --> D[Fire-Engine 引擎]\n    B --> E[Playwright 引擎]\n    B --> F[PDF 引擎]\n    B --> G[Document 引擎]\n    \n    C --> H[HTTP 请求处理]\n    D --> I[浏览器自动化]\n    E --> J[Chromium 实例]\n    F --> K[PDF 解析库]\n    G --> L[文档解析器]\n    \n    H --> M[HTML 响应]\n    I --> N[渲染后 DOM]\n    J --> N\n    K --> O[PDF 文本/元数据]\n    L --> P[文档内容]\n```\n\n### 引擎类型与职责\n\n| 引擎名称 | 技术实现 | 适用场景 | 内容类型 |\n|---------|---------|---------|---------|\n| Fetch | Node.js 原生 HTTP 请求 | 静态页面、API 响应 | HTML、JSON |\n| Fire-Engine | 浏览器自动化框架 | 动态渲染页面 | JavaScript 渲染后的 DOM |\n| Playwright | Chromium 实例控制 | 复杂交互页面 | 完整网页快照 |\n| PDF | PDF 解析库 | PDF 文档 | PDF 文本、元数据 |\n| Document | 文档解析器 | Office 文档 | DOCX、XLSX、PPTX |\n\n## 核心引擎详解\n\n### Fetch 引擎\n\nFetch 引擎是抓取引擎家族中最轻量的实现，位于 `apps/api/src/scraper/scrapeURL/engines/fetch/index.ts`。它直接使用 Node.js 原生的 HTTP/HTTPS 模块发起请求，适用于静态网页和 API 接口的数据抓取。\n\nFetch 引擎的主要特点包括：\n\n- **零外部依赖**：不依赖 Puppeteer、Playwright 等重型库\n- **高性能**：异步 I/O 操作，支持高并发请求\n- **可配置性**：支持自定义请求头、超时设置、代理配置\n- **Cookie 处理**：内置 Cookie 管理和会话保持\n\n该引擎特别适合抓取不依赖 JavaScript 渲染的静态内容，如博客文章、新闻页面、产品列表页等。对于需要登录认证的网站，Fetch 引擎支持通过 Cookie 或 Bearer Token 进行身份验证。\n\n### Fire-Engine 引擎\n\nFire-Engine 引擎是 Firecrawl 自研的浏览器自动化引擎，位于 `apps/api/src/scraper/scrapeURL/engines/fire-engine/index.ts`。它提供了介于轻量级 Fetch 和完整浏览器自动化之间的抓取能力。\n\nFire-Engine 的核心优势在于：\n\n- **轻量级浏览器**：相比完整的 Chromium 实例，占用资源更少\n- **JavaScript 渲染**：支持执行页面内的 JavaScript 代码\n- **DOM 操作**：提供点击、滚动、输入等交互能力\n- **截图功能**：支持页面截图和元素截图\n\n该引擎适用于需要部分 JavaScript 渲染但不需要完整浏览器环境的场景，例如单页应用（SPA）的初始内容抓取、无限滚动列表的加载等。\n\n### Playwright 引擎\n\nPlaywright 引擎是 Firecrawl 中最强大的抓取引擎，位于 `apps/api/src/scraper/scrapeURL/engines/playwright/index.ts`。它基于 Microsoft 的 Playwright 框架，提供完整的浏览器自动化能力。\n\nPlaywright 引擎的核心特性：\n\n- **多浏览器支持**：Chromium、Firefox、WebKit\n- **完整渲染**：执行所有 JavaScript，包括框架级别的代码\n- **网络拦截**：支持请求/响应拦截，可修改网络流量\n- **元素定位**：支持 CSS 选择器、XPath、文本定位\n- **等待策略**：智能等待元素出现、网络空闲等条件\n\n对于需要模拟用户行为（如登录、表单填写、点击按钮）的复杂抓取场景，Playwright 引擎是最佳选择。它还支持无头模式（headless）和有头模式（headed），可根据调试或生产环境灵活切换。\n\n### PDF 引擎\n\nPDF 引擎专门用于处理 PDF 文档的抓取和解析，位于 `apps/api/src/scraper/scrapeURL/engines/pdf/index.ts`。\n\nPDF 引擎支持的功能：\n\n- **直接下载**：从 URL 下载 PDF 文件\n- **文本提取**：从 PDF 中提取可搜索的文本内容\n- **元数据读取**：获取 PDF 的标题、作者、创建日期等元数据\n- **页面拆分**：支持按页面维度提取内容\n- **加密处理**：处理有密码保护的 PDF 文件\n\n该引擎在处理学术论文、报告、合同等 PDF 格式内容时表现出色。结合 Firecrawl 的 Map 功能，可以自动发现网站上的 PDF 资源并进行批量抓取。\n\n### Document 引擎\n\nDocument 引擎用于处理 Office 格式的文档，位于 `apps/api/src/scraper/scrapeURL/engines/document/index.ts`。它与后端原生模块 `apps/api/native/src/document/providers/factory.rs` 协同工作。\n\nDocument 引擎支持的文档格式：\n\n| 格式 | MIME 类型 | 提取内容 |\n|-----|----------|---------|\n| DOCX | application/vnd.openxmlformats-officedocument.wordprocessingml.document | 文本、段落、表格、列表 |\n| XLSX | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | 表格数据、公式 |\n| PPTX | application/vnd.openxmlformats-officedocument.presentationml.presentation | 幻灯片文本、备注 |\n\nDocument 引擎的核心优势在于其原生实现方式。通过 Rust 编写的底层解析器（位于 `apps/api/native/src/document/providers/factory.rs`），能够高效处理大文件和复杂结构的 Office 文档，同时保证内存使用的安全性。\n\n### 原生文档工厂\n\n`apps/api/native/src/document/providers/factory.rs` 是 Rust 原生模块中的核心组件，负责创建和管理各种文档格式的解析器实例。\n\n```mermaid\ngraph LR\n    A[Document Request] --> B[Factory]\n    B --> C{DocType Detection}\n    C -->|DOCX| D[DocxParser]\n    C -->|XLSX| E[XlsxParser]\n    C -->|PDF| F[PdfParser]\n    C -->|Unknown| G[Error Handler]\n    \n    D --> H[Structured Output]\n    E --> H\n    F --> H\n```\n\n工厂模式的应用确保了：\n\n- **类型安全**：编译时保证所有支持的文档类型都被处理\n- **可扩展性**：新增文档格式只需实现对应的解析 trait\n- **性能优化**：根据文档类型预分配内存，减少运行时开销\n\n## 工作流程\n\n### 抓取请求处理流程\n\n```mermaid\nsequenceDiagram\n    participant Client as 客户端\n    participant Main as scrapeURL 主模块\n    participant Router as 引擎路由器\n    participant Engine as 选中的抓取引擎\n    participant Output as 结果处理器\n    \n    Client->>Main: 发送抓取请求 (URL, Options)\n    Main->>Main: 验证 URL 和参数\n    Main->>Router: 请求引擎选择\n    Router->>Router: Content-Type 检测\n    Router->>Engine: 路由到合适引擎\n    Engine->>Engine: 执行抓取逻辑\n    Engine-->>Output: 返回原始内容\n    Output->>Output: 格式化与清洗\n    Output-->>Main: 结构化结果\n    Main-->>Client: 返回 Document 对象\n```\n\n### 引擎选择策略\n\n抓取引擎根据以下因素自动选择最合适的引擎：\n\n1. **URL 扩展名检测**：优先根据 URL 末尾的文件扩展名判断内容类型\n2. **Content-Type 响应头**：HTTP 响应头中的 Content-Type 字段\n3. **配置优先级**：用户通过 `ScrapeOptions` 明确指定的引擎类型\n4. **降级策略**：主引擎失败时自动降级到备选引擎\n\n## 配置选项\n\n抓取引擎通过 `ScrapeOptions` 对象接收配置参数：\n\n| 参数名 | 类型 | 默认值 | 说明 |\n|-------|------|-------|------|\n| formats | string[] | [\"markdown\"] | 输出格式列表 |\n| onlyMainContent | boolean | false | 仅提取主体内容 |\n| waitFor | number | 0 | 等待渲染的毫秒数 |\n| timeout | number | 30000 | 请求超时（毫秒） |\n| engine | string | \"auto\" | 强制指定引擎类型 |\n| actions | Action[] | [] | 浏览器自动化动作序列 |\n\n## SDK 集成\n\n各语言 SDK 通过统一的接口调用抓取引擎，以 Python SDK 为例：\n\n```python\nfrom firecrawl import Firecrawl\nfrom firecrawl.v2.types import ScrapeOptions\n\nfirecrawl = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\n# 基础抓取（自动选择引擎）\ndoc = firecrawl.scrape('https://example.com', formats=['markdown'])\n\n# 指定引擎抓取\ndoc = firecrawl.scrape(\n    'https://example.com',\n    formats=['markdown', 'html'],\n    options=ScrapeOptions(\n        engine='playwright',\n        wait_for=3000\n    )\n)\n```\n\n## 错误处理机制\n\n抓取引擎实现了多层次的错误处理策略：\n\n| 错误类型 | 处理策略 | 降级引擎 |\n|---------|---------|---------|\n| 网络超时 | 重试 3 次，指数退避 | Playwright |\n| 渲染失败 | 降级到 Fetch 引擎 | Fetch |\n| 解析错误 | 返回原始内容，标记警告 | - |\n| 资源不存在 | 返回 404 错误 | - |\n| 认证失败 | 返回 401 错误 | - |\n\n## 性能优化\n\n### 并发控制\n\n抓取引擎内置了并发控制机制：\n\n- **全局并发限制**：防止对目标服务器造成过大压力\n- **域名级限速**：基于域名的请求速率控制\n- **连接池复用**：减少 TCP 连接建立开销\n\n### 缓存策略\n\n- **304 响应处理**：正确处理 HTTP 条件请求\n- **ETag/Last-Modified**：支持服务端缓存验证\n- **本地缓存**：对重复请求返回缓存结果\n\n## 安全考量\n\n抓取引擎在设计时充分考虑了安全因素：\n\n- **请求来源伪装**：模拟真实浏览器请求头\n- **反爬虫规避**：内置常用反爬虫策略应对\n- **敏感信息过滤**：自动过滤密码、API Key 等敏感数据\n- **沙箱执行**：浏览器引擎在隔离环境中运行\n\n## 扩展开发指南\n\n如需添加新的抓取引擎，可按以下步骤扩展：\n\n1. 在 `engines/` 目录下创建新的引擎文件夹\n2. 实现统一的引擎接口 `BaseEngine`\n3. 在引擎路由器中注册新引擎\n4. 添加对应的配置选项处理逻辑\n5. 编写单元测试和集成测试\n\n## 相关资源\n\n- [Firecrawl API 文档](https://docs.firecrawl.dev)\n- [Python SDK 文档](../python-sdk/README.md)\n- [Node.js SDK 文档](../js-sdk/firecrawl/README.md)\n- [抓取最佳实践指南](https://docs.firecrawl.dev/guides)\n\n---\n\n<a id='search-crawl'></a>\n\n## 搜索与爬取功能\n\n### 相关页面\n\n相关主题：[抓取引擎](#scraping-engines), [数据提取系统](#extraction-system), [监控与Webhook](#monitoring-webhooks)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/search/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/search/index.ts)\n- [apps/api/src/search/execute.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/search/execute.ts)\n- [apps/api/src/search/fireEngine.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/search/fireEngine.ts)\n- [apps/api/src/search/searxng.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/search/searxng.ts)\n- [apps/api/src/scraper/WebScraper/crawler.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/WebScraper/crawler.ts)\n- [apps/api/src/scraper/WebScraper/sitemap.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/WebScraper/sitemap.ts)\n- [apps/api/src/scraper/crawler/sitemap.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/crawler/sitemap.ts)\n</details>\n\n# 搜索与爬取功能\n\n## 概述\n\nFirecrawl 的搜索与爬取功能是平台的核心能力，为 AI 系统提供网页搜索、抓取和交互能力。搜索功能允许用户在整个网络中查找信息，而爬取功能则支持对特定网站的深度遍历和数据提取。 资料来源：[README.md](https://github.com/firecrawl/firecrawl/blob/main/README.md)\n\n## 架构设计\n\n### 核心模块关系\n\n```mermaid\ngraph TD\n    A[API 入口] --> B[搜索模块 search/]\n    A --> C[爬取模块 scraper/]\n    B --> D[Fire Engine]\n    B --> E[SearXNG 集成]\n    C --> F[WebScraper]\n    C --> G[Crawler]\n    F --> H[Sitemap 解析]\n    G --> H\n    D --> I[搜索结果]\n    H --> J[爬取结果]\n```\n\n### 搜索子系统架构\n\n搜索功能通过多层抽象实现：\n\n| 组件 | 文件路径 | 职责 |\n|------|----------|------|\n| 搜索入口 | `apps/api/src/search/index.ts` | 处理 API 请求分发和参数验证 |\n| 执行引擎 | `apps/api/src/search/execute.ts` | 协调搜索执行流程 |\n| Fire Engine | `apps/api/src/search/fireEngine.ts` | 自定义搜索引擎实现 |\n| SearXNG 集成 | `apps/api/src/search/searxng.ts` | 开源搜索引擎后端适配 |\n\n## 搜索功能详解\n\n### 功能特性\n\n搜索功能支持以下核心能力：\n\n- **网络搜索**：在互联网上查找相关信息\n- **结果排序**：按相关性对结果进行排序\n- **数量限制**：支持限制返回结果数量\n- **来源控制**：可指定搜索结果来源 资料来源：[README.md:45-50](https://github.com/firecrawl/firecrawl/blob/main/README.md)\n\n### API 端点\n\n```\nPOST https://api.firecrawl.dev/v2/search\n```\n\n**请求头**：\n\n| 参数 | 说明 | 必填 |\n|------|------|------|\n| Authorization | Bearer token 认证 | 是 |\n| Content-Type | application/json | 是 |\n\n**请求体**：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| query | string | 搜索查询关键词 |\n| limit | number | 返回结果数量限制 |\n\n### 响应格式\n\n```json\n{\n  \"data\": [\n    {\n      \"url\": \"https://firecrawl.dev\",\n      \"title\": \"Firecrawl\",\n      \"markdown\": \"Turn websites into...\"\n    }\n  ]\n}\n```\n\n## 爬取功能详解\n\n### 爬取类型\n\nFirecrawl 支持两种主要的网站爬取方式：\n\n| 爬取类型 | 说明 | 适用场景 |\n|----------|------|----------|\n| **sitemap 爬取** | 通过解析网站的 sitemap.xml 发现页面 | 静态网站、结构化站点 |\n| **智能爬取** | 通过模拟浏览器行为遍历页面 | JavaScript 渲染页面、动态内容 |\n\n### Sitemap 解析模块\n\nSitemap 解析是爬取功能的基础组件：\n\n| 文件 | 职责 |\n|------|------|\n| `apps/api/src/scraper/WebScraper/sitemap.ts` | WebScraper 场景下的 sitemap 解析 |\n| `apps/api/src/scraper/crawler/sitemap.ts` | 独立爬虫场景下的 sitemap 解析 |\n\n### 核心爬取流程\n\n```mermaid\ngraph TD\n    A[开始爬取] --> B{选择爬取模式}\n    B -->|Sitemap| C[解析 sitemap.xml]\n    B -->|智能爬取| D[启动浏览器实例]\n    C --> E[提取 URL 列表]\n    D --> F[遍历页面链接]\n    E --> G[过滤有效链接]\n    F --> G\n    G --> H[抓取页面内容]\n    H --> I[提取结构化数据]\n    I --> J[返回结果]\n```\n\n### 爬取配置参数\n\n```python\nfrom firecrawl import Firecrawl\n\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\ncrawl_status = firecrawl.crawl(\n    'https://firecrawl.dev', \n    limit=100, \n    scrape_options=ScrapeOptions(formats=['markdown', 'html']),\n    poll_interval=30\n)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| limit | number | 最大抓取页面数量 |\n| scrape_options | ScrapeOptions | 抓取选项配置 |\n| poll_interval | number | 异步轮询间隔（秒） |\n| exclude_paths | string[] | 需要排除的路径 |\n\n## SDK 实现\n\n### Python SDK\n\n```python\nfrom firecrawl import Firecrawl\n\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\n# 搜索\nresults = app.search(\"best AI data tools 2024\", limit=10)\n\n# 爬取网站\ndocs = app.crawl(\"https://docs.firecrawl.dev\", limit=50)\nfor doc in docs.data:\n    print(doc.metadata.source_url, doc.markdown[:100])\n```\n\n### Node.js SDK\n\n```javascript\nimport Firecrawl from '@mendable/firecrawl-js';\n\nconst app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });\n\n// 搜索\nconst results = await app.search('best AI data tools 2024', { limit: 10 });\n\n// 爬取\nconst docs = await app.crawl('https://docs.firecrawl.dev', { \n    limit: 50,\n    scrapeOptions: { formats: ['markdown', 'html'] }\n});\n```\n\n### Java SDK\n\n```java\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiKey(\"fc-your-api-key\")\n    .build();\n\n// 爬取\nCrawlResponse response = client.crawl(\"https://example.com\", \n    CrawlOptions.builder()\n        .limit(50)\n        .build());\n\nfor (Page page : response.getData()) {\n    System.out.println(page.getMetadata().get(\"sourceURL\"));\n}\n```\n\n## 数据模型\n\n### 搜索结果模型\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| url | string | 页面 URL |\n| title | string | 页面标题 |\n| description | string | 页面描述 |\n| markdown | string | 页面内容（Markdown 格式） |\n\n### 爬取结果模型\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| data | Page[] | 抓取的页面列表 |\n| status | string | 爬取状态 |\n| credits_used | number | 消耗的 credits |\n\n### Page 模型\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| metadata | Record | 页面元数据 |\n| markdown | string | Markdown 格式内容 |\n| html | string | 原始 HTML |\n| screenshot | string | 页面截图（Base64） |\n\n## 配置选项\n\n### ScrapeOptions 配置\n\n| 选项 | 类型 | 说明 |\n|------|------|------|\n| formats | string[] | 输出格式：markdown、html、json |\n| only_main_content | boolean | 仅提取主体内容 |\n| wait_for | number | 等待渲染时间（毫秒） |\n| location | LocationConfig | 地理位置配置 |\n\n### CrawlOptions 配置\n\n| 选项 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| limit | number | 100 | 最大页面数 |\n| exclude_paths | string[] | [] | 排除路径 |\n| include_paths | string[] | [] | 包含路径 |\n| max_depth | number | 10 | 最大递归深度 |\n\n## 异步操作处理\n\n### 异步爬取流程\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant API\n    participant Crawler\n    participant Storage\n    \n    Client->>API: 发起爬取请求\n    API->>Crawler: 启动爬取任务\n    API-->>Client: 返回 Job ID\n    loop 轮询状态\n        Client->>API: 查询爬取状态\n        API->>Crawler: 获取进度\n        Crawler-->>API: 返回状态\n        API-->>Client: 返回状态\n    end\n    Crawler->>Storage: 保存结果\n    Client->>API: 获取完整结果\n    API->>Storage: 读取结果\n    Storage-->>API: 返回数据\n    API-->>Client: 返回完整数据\n```\n\n### 异步爬取示例\n\n```rust\n// Rust SDK 异步爬取\nlet crawl_id = app.crawl_url_async(\"https://mendable.ai\", None).await?.id;\n\n// 检查爬取状态\nlet status = app.check_crawl_status(crawl_id).await?;\n\nif status.status == CrawlStatusTypes::Completed {\n    println!(\"爬取完成: {:#?}\", status.data);\n}\n```\n\n## 错误处理\n\n| 错误类型 | 说明 | 处理建议 |\n|----------|------|----------|\n| TIMEOUT | 请求超时 | 增加超时时间或减少页面数量 |\n| RATE_LIMIT | 请求频率超限 | 使用轮询间隔或降低请求频率 |\n| INVALID_URL | URL 格式错误 | 检查 URL 格式是否正确 |\n| ACCESS_DENIED | 访问被拒绝 | 网站可能禁止爬取 |\n\n## 最佳实践\n\n### 搜索优化\n\n1. **精确查询**：使用具体关键词提高搜索准确性\n2. **限制数量**：设置合理的 limit 值避免资源浪费\n3. **结果缓存**：考虑对频繁查询的结果进行缓存\n\n### 爬取优化\n\n1. **路径过滤**：使用 exclude_paths 排除无关页面\n2. **深度控制**：合理设置 max_depth 避免过度爬取\n3. **格式选择**：根据需求选择合适的输出格式\n4. **轮询间隔**：使用合适的 poll_interval 减少 API 调用\n\n## 相关资源\n\n- Python SDK 文档：[apps/python-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/README.md)\n- Node.js SDK 文档：[apps/js-sdk/firecrawl/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/README.md)\n- Java SDK 文档：[apps/java-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/java-sdk/README.md)\n- Go SDK 文档：[apps/go-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/go-sdk/README.md)\n\n---\n\n<a id='extraction-system'></a>\n\n## 数据提取系统\n\n### 相关页面\n\n相关主题：[抓取引擎](#scraping-engines), [搜索与爬取功能](#search-crawl), [监控与Webhook](#monitoring-webhooks)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/lib/extract/extraction-service.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/extraction-service.ts)\n- [apps/api/src/lib/extract/build-document.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/build-document.ts)\n- [apps/api/src/lib/extract/build-prompts.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/build-prompts.ts)\n- [apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts)\n- [apps/api/src/lib/extract/completions/batchExtract.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/completions/batchExtract.ts)\n- [apps/api/src/lib/extract/completions/singleAnswer.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/completions/singleAnswer.ts)\n- [apps/api/src/lib/extract/reranker.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/reranker.ts)\n- [apps/api/src/services/extract-queue.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/extract-queue.ts)\n- [apps/api/src/services/extract-worker.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/extract-worker.ts)\n</details>\n\n# 数据提取系统\n\n## 系统概述\n\n数据提取系统（Extract System）是Firecrawl平台的核心组件之一，负责从网页内容中提取结构化数据。该系统支持JSON Schema定义的数据提取，通过大语言模型（LLM）将非结构化的网页内容转换为符合预定义模式的高质量结构化数据。\n\n### 核心能力\n\n| 能力 | 描述 |\n|------|------|\n| 单URL提取 | 从单个网页提取结构化数据 |\n| 批量提取 | 一次处理多个URL，提高效率 |\n| Schema验证 | 使用JSON Schema验证输出数据 |\n| 智能提示词 | 自动分析和优化提取提示词 |\n| 重排序 | 对提取结果进行相关性排序 |\n\n资料来源：[apps/api/src/lib/extract/extraction-service.ts]()\n\n## 系统架构\n\n```mermaid\ngraph TD\n    A[API请求] --> B[提取队列 extract-queue]\n    B --> C[提取Worker extract-worker]\n    C --> D[提取服务 ExtractionService]\n    D --> E[构建文档 build-document]\n    D --> F[构建提示 build-prompts]\n    E --> G[完成处理 completions]\n    F --> G\n    G --> H[singleAnswer]\n    G --> I[batchExtract]\n    G --> J[analyzeSchemaAndPrompt]\n    H --> K[重排序 reranker]\n    I --> K\n    J --> F\n    K --> L[返回结构化数据]\n```\n\n### 核心组件\n\n| 组件 | 文件路径 | 职责 |\n|------|----------|------|\n| 提取服务 | extraction-service.ts | 核心提取逻辑编排 |\n| 文档构建 | build-document.ts | 构建提取结果文档 |\n| 提示词构建 | build-prompts.ts | 生成LLM提示词 |\n| 单答案处理 | singleAnswer.ts | 处理单个URL提取 |\n| 批量提取 | batchExtract.ts | 处理多URL批量提取 |\n| Schema分析 | analyzeSchemaAndPrompt.ts | 分析schema并优化提示词 |\n| 重排序器 | reranker.ts | 结果相关性排序 |\n\n资料来源：[apps/api/src/lib/extract/extraction-service.ts]()\n\n## 工作流程\n\n### 整体处理流程\n\n```mermaid\ngraph LR\n    A1[接收请求] --> B1[入队到extract-queue]\n    B1 --> C1[Worker获取任务]\n    C1 --> D1[调用ExtractionService]\n    D1 --> E1[构建提示词]\n    E1 --> F1[LLM调用]\n    F1 --> G1[Schema验证]\n    G1 --> H1[结果重排序]\n    H1 --> I1[返回结果]\n```\n\n### 批量提取流程\n\n当处理多个URL时，系统采用以下流程：\n\n1. **URL分批处理**：将URL列表分成小批次\n2. **并发LLM调用**：对每个批次并行调用LLM\n3. **结果聚合**：合并所有批次的提取结果\n4. **重排序**：根据相关性对最终结果排序\n\n资料来源：[apps/api/src/lib/extract/completions/batchExtract.ts]()\n\n## 核心模块详解\n\n### 提取服务 (ExtractionService)\n\n提取服务是整个数据提取系统的中枢，协调各组件完成数据提取任务。\n\n**主要职责：**\n- 管理提取任务的生命周期\n- 协调文档构建和提示词构建\n- 处理LLM调用和结果验证\n- 支持单条和批量提取模式\n\n资料来源：[apps/api/src/lib/extract/extraction-service.ts]()\n\n### 文档构建 (build-document)\n\n文档构建模块负责将提取的原始数据转换为标准化的文档格式。\n\n**功能特点：**\n- 规范化提取结果结构\n- 添加元数据信息\n- 处理多种输出格式\n\n资料来源：[apps/api/src/lib/extract/build-document.ts]()\n\n### 提示词构建 (build-prompts)\n\n提示词构建模块生成用于LLM的结构化提示词，包含必要的上下文和提取指令。\n\n**构建要素：**\n- 系统指令（System Prompt）\n- 用户提示（User Prompt）\n- Schema定义嵌入\n- 示例数据（可选）\n\n**自适应优化**：该模块与analyzeSchemaAndPrompt协同工作，可根据Schema自动调整提示词以提高提取准确性。\n\n资料来源：[apps/api/src/lib/extract/build-prompts.ts]()\n\n### 完成处理模块 (completions)\n\n#### 单答案处理 (singleAnswer)\n\n处理单个URL的提取请求，返回完整的结构化数据。\n\n**处理流程：**\n```mermaid\ngraph TD\n    A[输入URL和Schema] --> B[构建提示词]\n    B --> C[调用LLM]\n    C --> D[解析响应]\n    D --> E[Schema验证]\n    E --> F[返回结果]\n```\n\n资料来源：[apps/api/src/lib/extract/completions/singleAnswer.ts]()\n\n#### 批量提取 (batchExtract)\n\n支持同时处理多个URL的提取任务，适用于大规模数据采集场景。\n\n**批处理策略：**\n- 动态批次大小调整\n- 并发请求控制\n- 错误重试机制\n- 部分失败容忍\n\n资料来源：[apps/api/src/lib/extract/completions/batchExtract.ts]()\n\n#### Schema分析 (analyzeSchemaAndPrompt)\n\n分析输入的JSON Schema，评估其复杂度并提供优化建议。\n\n**分析维度：**\n| 维度 | 描述 |\n|------|------|\n| 字段数量 | Schema包含的属性数量 |\n| 嵌套深度 | 对象嵌套的层级 |\n| 数组复杂度 | 数组类型字段的复杂性 |\n| 必需字段 | 必填属性的比例 |\n\n资料来源：[apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts]()\n\n### 重排序器 (reranker)\n\n对提取结果进行相关性评分和排序，确保最相关的结果排在前面。\n\n**排序依据：**\n- 内容相关性评分\n- 字段完整性\n- 数据质量指标\n\n资料来源：[apps/api/src/lib/extract/reranker.ts]()\n\n## 队列与Worker机制\n\n### 提取队列 (extract-queue)\n\n提取队列负责管理待处理的提取任务，支持任务的入队、优先级调度和状态追踪。\n\n**队列特性：**\n- 异步任务处理\n- 可配置并发数\n- 任务状态监控\n- 失败重试机制\n\n资料来源：[apps/api/src/services/extract-queue.ts]()\n\n### 提取Worker (extract-worker)\n\nWorker进程从队列中获取任务并执行实际的提取操作。\n\n**工作流程：**\n```mermaid\ngraph TD\n    A[启动Worker] --> B[连接队列]\n    B --> C[等待任务]\n    C --> D{有新任务?}\n    D -->|是| E[获取任务]\n    E --> F[执行提取]\n    F --> G[更新状态]\n    G --> H[任务完成]\n    H --> C\n    D -->|否| C\n```\n\n**错误处理：**\n- 自动重试机制\n- 死信队列处理\n- 详细的错误日志\n\n资料来源：[apps/api/src/services/extract-worker.ts]()\n\n## API使用\n\n### 基本提取示例\n\n```python\nfrom firecrawl import Firecrawl\n\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\nresult = app.extract(\n    urls=[\"https://example.com/product/1\"],\n    prompt=\"提取产品名称、价格和描述\",\n    schema={\n        \"type\": \"object\",\n        \"properties\": {\n            \"name\": {\"type\": \"string\"},\n            \"price\": {\"type\": \"number\"},\n            \"description\": {\"type\": \"string\"}\n        }\n    }\n)\n```\n\n### 批量提取示例\n\n```python\nresult = app.extract(\n    urls=[\n        \"https://example.com/products/1\",\n        \"https://example.com/products/2\",\n        \"https://example.com/products/3\"\n    ],\n    prompt=\"提取所有产品的基本信息\",\n    schema={...}\n)\n```\n\n## 配置参数\n\n### 提取选项\n\n| 参数 | 类型 | 默认值 | 描述 |\n|------|------|--------|------|\n| timeout | number | 60000 | 单次请求超时时间（毫秒） |\n| maxRetries | number | 3 | 最大重试次数 |\n| batchSize | number | 10 | 批量处理大小 |\n| temperature | number | 0.0 | LLM温度参数 |\n\n### Schema配置\n\n| 属性 | 必需 | 描述 |\n|------|------|------|\n| type | 是 | JSON类型定义 |\n| properties | 是 | 属性映射 |\n| required | 否 | 必填字段列表 |\n| additionalProperties | 否 | 允许额外字段 |\n\n## 最佳实践\n\n### 1. Schema设计\n\n- 使用清晰的字段命名\n- 合理设置必填字段\n- 避免过深的嵌套结构\n- 提供明确的类型定义\n\n### 2. 性能优化\n\n- 批量提取时控制并发数\n- 合理设置超时时间\n- 使用适当的批次大小\n- 启用结果缓存（如适用）\n\n### 3. 错误处理\n\n- 实现重试机制处理临时故障\n- 验证Schema格式确保有效性\n- 检查LLM响应格式的正确性\n- 记录详细的错误信息便于调试\n\n## 相关文档\n\n- [搜索系统](../search/README.md)\n- [爬取系统](../crawl/README.md)\n- [网站地图](../map/README.md)\n- [监控服务](../monitor/README.md)\n\n---\n\n<a id='monitoring-webhooks'></a>\n\n## 监控与Webhook\n\n### 相关页面\n\n相关主题：[数据提取系统](#extraction-system), [搜索与爬取功能](#search-crawl), [部署与基础设施](#deployment-infra)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/services/monitoring/scheduler.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/scheduler.ts)\n- [apps/api/src/services/monitoring/runner.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/runner.ts)\n- [apps/api/src/services/monitoring/store.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/store.ts)\n- [apps/api/src/services/monitoring/diff.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/diff.ts)\n- [apps/api/src/services/webhook/delivery.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/webhook/delivery.ts)\n- [apps/api/src/services/webhook/queue.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/webhook/queue.ts)\n- [apps/api/src/services/ab-test-comparison.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/ab-test-comparison.ts)\n</details>\n\n# 监控与Webhook\n\n## 概述\n\nFirecrawl 的监控（Monitoring）与Webhook系统为用户提供了持续追踪网站变化和接收实时事件通知的能力。监控服务通过定期检查网页内容，自动检测新增、移除、修改的页面以及抓取错误，并通过邮件或Webhook渠道向用户推送变更摘要。该系统由多个子模块组成，包括调度器（Scheduler）、执行器（Runner）、存储层（Store）、差异检测（Diff）、Webhook投递（Delivery）和Webhook队列（Queue），它们协同工作以实现可靠的变化检测与通知投递。资料来源：[apps/api/src/services/notification/monitoring_email.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/notification/monitoring_email.ts)\n\n## 监控模块架构\n\n### 整体流程\n\n```mermaid\ngraph TD\n    A[调度器 Scheduler] --> B[执行器 Runner]\n    B --> C[存储层 Store]\n    C --> D[差异检测 Diff]\n    D --> E[变更汇总]\n    E --> F[通知发送]\n    F --> G[邮件通知]\n    F --> H[Webhook投递]\n    \n    B --> I[抓取目标网页]\n    I --> J[当前快照]\n    C --> K[历史快照]\n    D --> J\n    D --> K\n```\n\n### 调度器（Scheduler）\n\n调度器负责管理监控任务的定时触发。系统会根据用户配置的检查间隔自动执行监控检查，确保在设定的时间周期内持续追踪目标网站的变化。调度器需要处理并发调度、避免重复执行、以及处理任务超时等场景。资料来源：[apps/api/src/services/monitoring/scheduler.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/scheduler.ts)\n\n### 执行器（Runner）\n\n执行器是监控任务的核心执行单元，负责实际执行网页抓取和内容采集。当调度器触发检查任务时，执行器会启动浏览器实例或发送抓取请求，获取目标页面的当前内容。执行器还需要处理抓取过程中的异常情况，如网络超时、页面加载失败、反爬虫机制等，并将错误信息记录到监控结果中。资料来源：[apps/api/src/services/monitoring/runner.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/runner.ts)\n\n### 存储层（Store）\n\n存储层负责持久化管理监控相关的所有数据，包括监控配置、快照历史、检查记录和变更汇总。Store模块提供了数据的读写接口，确保即使在服务重启后也能恢复监控状态。存储的数据模型通常包含以下核心实体：\n\n| 实体名称 | 描述 | 主要字段 |\n|---------|------|---------|\n| Monitor | 监控配置 | ID、URL、轮询间隔、通知设置、API密钥 |\n| MonitorCheck | 单次检查记录 | ID、监控ID、执行时间、状态、变更统计 |\n| PageSnapshot | 页面快照 | ID、检查ID、页面URL、内容哈希、原始内容 |\n| MonitoringEmailPage | 变更页面详情 | URL、标题、变更类型 |\n\n资料来源：[apps/api/src/services/monitoring/store.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/store.ts)\n\n### 差异检测（Diff）\n\n差异检测模块负责对比当前快照与历史快照，识别页面内容的实际变化。该模块采用内容哈希比对和结构化解析相结合的方式，能够区分真正的内容变更与动态元素（如时间戳、广告）的随机变化。Diff模块的输出包括变更类型（新增/移除/修改）、变更位置、以及变更的详细摘要，便于用户快速理解网站发生的变化。资料来源：[apps/api/src/services/monitoring/diff.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/diff.ts)\n\n## 变更统计模型\n\n监控系统的变更统计采用四维计数模型，全面覆盖网站变化的各个方面：\n\n| 统计类型 | 字段名 | 描述 |\n|---------|--------|------|\n| 新增页面 | `new_count` | 在本次检查中新发现的页面 |\n| 移除页面 | `removed_count` | 在本次检查中消失的页面 |\n| 内容变更 | `changed_count` | 内容发生变化的现有页面 |\n| 抓取错误 | `error_count` | 抓取失败的页面数量 |\n\n当所有统计值均为零时，系统会跳过邮件通知发送，以减少不必要的通知骚扰。资料来源：[apps/api/src/services/notification/monitoring_email.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/notification/monitoring_email.ts)\n\n## Webhook系统架构\n\n### Webhook事件类型\n\nFirecrawl的Webhook系统支持多种事件类型，覆盖异步任务的完整生命周期：\n\n| 事件类型 | 触发时机 | 用途 |\n|---------|---------|------|\n| `started` | 任务开始执行时 | 通知任务已启动 |\n| `action` | 中间操作发生时 | 报告任务进度或关键步骤 |\n| `completed` | 任务成功完成时 | 传递成功结果数据 |\n| `failed` | 任务执行失败时 | 返回错误信息和原因 |\n| `cancelled` | 任务被取消时 | 通知任务终止状态 |\n\n资料来源：[apps/api/src/controllers/v2/types.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/controllers/v2/types.ts)\n\n### Webhook投递流程\n\n```mermaid\ngraph LR\n    A[事件触发] --> B[Webhook队列]\n    B --> C{重试次数检查}\n    C -->|未超过限制| D[投递请求]\n    D --> E{HTTP响应}\n    E -->|2xx成功| F[完成]\n    E -->|失败| G[指数退避]\n    G --> B\n    C -->|超过限制| H[标记失败]\n```\n\n### 投递服务（Delivery）\n\nWebhook投递服务负责将事件负载发送到用户配置的端点。投递服务需要处理HTTPS连接、TLS证书验证、请求签名（用于安全验证）等技术细节。投递服务支持自定义请求头、请求体格式配置，以及不同类型事件的差异化负载结构。资料来源：[apps/api/src/services/webhook/delivery.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/webhook/delivery.ts)\n\n### 队列管理（Queue）\n\nWebhook队列提供了可靠投递的保障机制。当投递失败时（如网络错误或目标服务器返回非2xx状态码），队列系统会执行指数退避重试策略，在预设的最大重试次数内持续尝试投递。队列还负责管理不同优先级的事件，确保高优先级事件优先处理。资料来源：[apps/api/src/services/webhook/queue.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/webhook/queue.ts)\n\n## 邮件通知系统\n\n### 通知内容结构\n\n邮件通知采用HTML模板格式，包含以下核心信息：\n\n- **变更汇总**：新增页面数、移除页面数、错误页面数、总检查页面数\n- **变更详情列表**：列出发生变化的页面URL和标题\n- **检查标识**：用于追踪本次检查的检查ID\n- **资源消耗**：本次检查使用的积分数量\n\n邮件内容会对特殊字符进行HTML转义处理，防止XSS攻击。资料来源：[apps/api/src/services/notification/monitoring_email.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/notification/monitoring_email.ts)\n\n### 发送条件\n\n邮件通知仅在以下条件同时满足时发送：\n\n1. 监控配置中已启用邮件通知（`notification.email.enabled === true`）\n2. 本次检查检测到至少一个变更（任意统计值大于0）\n\n```typescript\nif (\n  params.check.changed_count +\n    params.check.new_count +\n    params.check.removed_count +\n    params.check.error_count <= 0\n) {\n  // 跳过无变更的邮件通知\n  return { attempted: false, success: true, recipients: [] };\n}\n```\n\n资料来源：[apps/api/src/services/notification/monitoring_email.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/notification/monitoring_email.ts)\n\n## A/B测试对比功能\n\n除了基础的变更检测，Firecrawl还提供了A/B测试对比功能，允许用户对比两个不同版本或不同来源的抓取结果。该功能支持并行执行两个抓取任务，并对结果进行差异分析，适用于SEO对比、竞品分析、版本验证等场景。资料来源：[apps/api/src/services/ab-test-comparison.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/ab-test-comparison.ts)\n\n## 配置选项\n\n### 监控配置参数\n\n| 参数名 | 类型 | 必填 | 描述 |\n|-------|------|------|------|\n| url | string | 是 | 要监控的目标URL |\n| pollInterval | number | 否 | 轮询间隔（秒），默认根据订阅计划确定 |\n| notification.email.enabled | boolean | 否 | 是否启用邮件通知 |\n| notification.webhook.url | string | 否 | Webhook回调URL |\n| notification.webhook.events | string[] | 否 | 订阅的事件类型列表 |\n| scrapeOptions | object | 否 | 抓取选项（formats、onlyMainContent等） |\n\n### Webhook配置参数\n\n| 参数名 | 类型 | 描述 |\n|-------|------|------|\n| maxRetries | number | 最大重试次数，默认3次 |\n| backoffFactor | number | 指数退避因子（秒），默认0.5 |\n| timeout | number | 单次投递超时（毫秒） |\n\n## 错误处理机制\n\n### 监控错误分类\n\n| 错误类型 | 处理方式 | 影响范围 |\n|---------|---------|---------|\n| 网络超时 | 记录错误、重试 | 单次检查标记为失败 |\n| 页面加载失败 | 记录错误、跳过内容对比 | 计入error_count统计 |\n| 解析异常 | 记录错误、保留原始内容 | 可能导致Diff不准确 |\n\n### Webhook投递错误\n\nWebhook投递失败时，系统会根据HTTP响应状态码采取不同策略：\n\n| 状态码范围 | 处理策略 |\n|-----------|---------|\n| 2xx | 投递成功，任务完成 |\n| 4xx（除429） | 永久失败，不重试 |\n| 429/5xx | 指数退避重试，直到达到最大次数 |\n\n## 安全考虑\n\n### Webhook安全\n\n- **请求签名**：Webhook请求包含签名头，用于验证消息来源\n- **HTTPS强制**：仅支持HTTPS端点，确保传输安全\n- **幂等性设计**：Webhook投递设计为幂等操作，允许安全重放\n\n### 数据保护\n\n- **敏感信息过滤**：邮件通知中的敏感数据经过适当处理\n- **HTML转义**：所有用户提供的URL和标题在邮件中经过HTML转义\n\n## 最佳实践\n\n1. **合理设置轮询间隔**：根据网站更新频率调整，避免过度抓取\n2. **配置多个通知渠道**：同时启用邮件和Webhook，确保重要变更不被遗漏\n3. **设置Webhook重试机制**：利用指数退避策略提高投递可靠性\n4. **利用A/B对比功能**：在重要更新前后进行结果对比验证\n5. **监控积分消耗**：定期检查creditsUsed字段，合理规划监控规模\n\n## 相关文档\n\n- [Python SDK文档](../sdks/python.md)\n- [Node.js SDK文档](../sdks/node.md)\n- [API v2参考](../api-reference/v2.md)\n- [认证与授权](../guides/authentication.md)\n\n---\n\n<a id='multi-language-sdks'></a>\n\n## 多语言SDK\n\n### 相关页面\n\n相关主题：[项目概览](#project-overview), [API路由与版本控制](#api-routes)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/python-sdk/firecrawl/__init__.py](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/firecrawl/__init__.py)\n- [apps/python-sdk/firecrawl/v2/client.py](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/firecrawl/v2/client.py)\n- [apps/js-sdk/firecrawl/src/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/src/index.ts)\n- [apps/js-sdk/firecrawl/src/v2/client.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/src/v2/client.ts)\n- [apps/java-sdk/src/main/java/com/firecrawl/client/FirecrawlClient.java](https://github.com/firecrawl/firecrawl/blob/main/apps/java-sdk/src/main/java/com/firecrawl/client/FirecrawlClient.java)\n- [apps/go-sdk/firecrawl.go](https://github.com/firecrawl/firecrawl/blob/main/apps/go-sdk/firecrawl.go)\n- [apps/rust-sdk/src/client.rs](https://github.com/firecrawl/firecrawl/blob/main/apps/rust-sdk/src/client.rs)\n- [apps/dotnet-sdk/Firecrawl/FirecrawlClient.cs](https://github.com/firecrawl/firecrawl/blob/main/apps/dotnet-sdk/Firecrawl/FirecrawlClient.cs)\n</details>\n\n# 多语言SDK\n\n## 概述\n\nFirecrawl 多语言SDK是一组官方支持的客户端库，旨在为开发者提供跨编程语言的统一接口，以便轻松访问Firecrawl的网页搜索、抓取和交互功能。这些SDK自动处理HTTP请求、身份验证、响应解析以及异步操作的轮询机制，使开发者能够在Python、JavaScript、Java、Go、Rust、.NET、Ruby等多种主流编程语言中使用Firecrawl服务。\n\n## 支持的编程语言\n\nFirecrawl目前官方支持以下编程语言的SDK：\n\n| 编程语言 | 包名称 | 安装命令 | 主要类/客户端 |\n|---------|--------|---------|--------------|\n| Python | `firecrawl-py` | `pip install firecrawl-py` | `Firecrawl` |\n| JavaScript/TypeScript | `@mendable/firecrawl-js` | `npm install @mendable/firecrawl-js` | `Firecrawl` |\n| Java | `firecrawl-java` | Maven/Gradle依赖 | `FirecrawlClient` |\n| Go | `firecrawl-sdk` | `go get` | `Firecrawl` |\n| Rust | `firecrawl` | Cargo.toml | `Client` |\n| .NET | `firecrawl-sdk` | `dotnet add package firecrawl-sdk` | `FirecrawlClient` |\n| Ruby | `firecrawl-sdk` | `gem install firecrawl-sdk` | `Client` |\n\n## 核心功能\n\n所有SDK都提供一致的核心功能集，确保开发者无论使用何种编程语言都能获得相同的能力：\n\n```mermaid\ngraph TD\n    A[Firecrawl SDK] --> B[Search 搜索]\n    A --> C[Scrape 网页抓取]\n    A --> D[Crawl 网站爬取]\n    A --> E[Parse 文件解析]\n    A --> F[Map 站点地图]\n    A --> G[Interact 页面交互]\n    A --> H[Extract 结构化提取]\n    \n    B --> I[返回搜索结果]\n    C --> J[返回文档内容]\n    D --> K[批量页面抓取]\n    E --> L[支持HTML/PDF/DOCX]\n    F --> M[URL列表生成]\n    G --> N[浏览器自动化]\n    H --> O[JSON Schema提取]\n```\n\n## 客户端初始化\n\n### 认证方式\n\n所有SDK支持两种API密钥配置方式：\n\n**方式一：通过构造函数直接传入**\n\n```python\n# Python\nfrom firecrawl import Firecrawl\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n```\n\n```javascript\n// JavaScript/TypeScript\nimport Firecrawl from '@mendable/firecrawl-js';\nconst app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });\n```\n\n```java\n// Java\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiKey(\"fc-your-api-key\")\n    .build();\n```\n\n```csharp\n// .NET\nvar client = new FirecrawlClient(\"fc-your-api-key\");\n```\n\n**方式二：通过环境变量自动加载**\n\n各SDK会优先读取环境变量`FIRECRAWL_API_KEY`：\n\n```python\n# Python - 无需传入API key，自动从环境变量读取\napp = Firecrawl.from_env()\n```\n\n```java\n// Java - 默认从FIRECRAWL_API_KEY环境变量读取\nFirecrawlClient client = FirecrawlClient.fromEnv();\n```\n\n```ruby\n# Ruby\nclient = Firecrawl::Client.from_env\n```\n\n```go\n// Go\nclient := firecrawl.NewClient(os.Getenv(\"FIRECRAWL_API_KEY\"), \"\")\n```\n\n### 自定义API端点\n\n对于自托管的Firecrawl实例，部分SDK支持自定义API URL：\n\n```csharp\n// .NET - 自定义API URL\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-api-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\");\n```\n\n```javascript\n// JavaScript/TypeScript - 可在初始化时配置\nconst app = new Firecrawl({ \n    apiKey: \"fc-your-api-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\"\n});\n```\n\n## 核心API\n\n### Search 搜索\n\n在网络上搜索相关内容，返回与查询匹配的URL和摘要：\n\n```python\n# Python\nresults = app.search(\"best AI data tools 2024\", limit=10)\n```\n\n```javascript\n// JavaScript\nconst results = await app.search('firecrawl', { limit: 5 });\n```\n\n```rust\n// Rust\nlet response = client.search(\"best web scraping tools 2024\", None).await?;\n```\n\n### Scrape 网页抓取\n\n从单个URL提取内容，支持多种输出格式：\n\n| 参数 | 类型 | 说明 |\n|-----|------|------|\n| `url` | string | 目标网页URL |\n| `formats` | array | 输出格式：`markdown`, `html`, `json`, `screenshot`等 |\n| `onlyMainContent` | boolean | 仅提取主要内容 |\n| `waitFor` | number | 等待渲染的毫秒数 |\n\n```python\n# Python\ndoc = app.scrape('https://firecrawl.dev', formats=['markdown', 'html'])\nprint(doc.markdown)\n```\n\n```java\n// Java\nDocument doc = client.scrape(\"https://example.com\",\n    ScrapeOptions.builder()\n        .formats(List.of(\"markdown\"))\n        .build());\n```\n\n```csharp\n// .NET\nvar doc = await client.ScrapeAsync(\"https://example.com\",\n    new ScrapeOptions { Formats = new List<object> { \"markdown\" } });\n```\n\n### Crawl 网站爬取\n\n批量爬取网站页面，支持自动轮询等待完成：\n\n```python\n# Python - 自动等待爬取完成\ndocs = app.crawl('https://docs.firecrawl.dev', limit=50)\nfor doc in docs.data:\n    print(doc.metadata.source_url)\n```\n\n```ruby\n# Ruby - 自动轮询模式\njob = client.crawl(\"https://example.com\",\n  Firecrawl::Models::CrawlOptions.new(limit: 50))\njob.data.each { |doc| puts doc.markdown }\n```\n\n```rust\n// Rust\nlet options = CrawlOptions {\n    limit: Some(50),\n    ..Default::default()\n};\nlet result = client.crawl(\"https://docs.firecrawl.dev\", options).await?;\n```\n\n### Map 站点地图\n\n生成网站的URL列表，用于了解站点结构：\n\n```javascript\n// JavaScript\nconst mapResult = await app.map('https://example.com');\nconsole.log(mapResult);\n```\n\n### Interact 页面交互\n\n在抓取页面后执行浏览器自动化操作：\n\n```python\n# Python\nresult = app.scrape(\"https://amazon.com\")\nscrape_id = result.metadata.scrape_id\napp.interact(scrape_id, prompt=\"Search for 'mechanical keyboard'\")\n```\n\n```java\n// Java\nDocument doc = client.scrape(\"https://example.com\");\nString scrapeId = String.valueOf(doc.getMetadata().get(\"scrapeId\"));\nBrowserExecuteResponse exec = client.interact(scrapeId, \"console.log(await page.title());\");\n```\n\n### Extract 结构化提取\n\n根据prompt和schema从页面提取结构化数据：\n\n```javascript\n// JavaScript - 支持Zod schema\nconst schema = z.object({\n  title: z.string(),\n});\nconst result = await app.extract({\n  urls: ['https://firecrawl.dev'],\n  prompt: 'Extract the page title',\n  schema,\n});\n```\n\n### Batch Scrape 批量抓取\n\n一次性抓取多个URL：\n\n```python\n# Python\njob = app.batch_scrape([\n    \"https://firecrawl.dev\",\n    \"https://docs.firecrawl.dev\",\n], formats=[\"markdown\"])\nfor doc in job.data:\n    print(doc.metadata.source_url)\n```\n\n### Parse 文件解析\n\n解析上传的本地文件（HTML、PDF、DOCX等）：\n\n```python\n# Python\ndoc = firecrawl.parse(\n  b\"<!DOCTYPE html><html><body><h1>Content</h1></body></html>\",\n  filename=\"upload.html\",\n  content_type=\"text/html\",\n  options=ParseOptions(formats=[\"markdown\"]),\n)\n```\n\n```java\n// Java\nParseFile file = ParseFile.builder()\n    .filename(\"upload.html\")\n    .content(\"<!DOCTYPE html>...\".getBytes())\n    .contentType(\"text/html\")\n    .build();\nDocument parsed = client.parse(file,\n    ParseOptions.builder()\n        .formats(List.of(\"markdown\"))\n        .build());\n```\n\n## 异步操作\n\n### 异步爬取工作流\n\n```mermaid\nsequenceDiagram\n    participant 客户端\n    participant Firecrawl API\n    participant 用户\n    \n    客户端->>Firecrawl API: start_crawl/startCrawl\n    Firecrawl API-->>客户端: 返回job_id\n    客户端->>Firecrawl API: get_crawl_status(job_id)\n    Firecrawl API-->>客户端: status: in_progress\n    客户端->>Firecrawl API: get_crawl_status(job_id)\n    Firecrawl API-->>客户端: status: completed, data: [...]\n```\n\n### 异步爬取示例\n\n```javascript\n// JavaScript/TypeScript - 开始异步爬取\nconst start = await app.startCrawl('https://mendable.ai', {\n  excludePaths: ['blog/*'],\n  limit: 5,\n});\n\n// 检查爬取状态\nconst status = await app.getCrawlStatus(start.id);\nconsole.log(status.status);\n```\n\n```ruby\n# Ruby - 异步爬取\nresponse = client.start_crawl(\"https://example.com\",\n  Firecrawl::Models::CrawlOptions.new(limit: 10))\nputs response.id\n\n# 检查状态\nstatus = client.get_crawl_status(response.id)\nputs status.status\n\n# 取消爬取\nclient.cancel_crawl(response.id)\n```\n\n## 数据模型\n\n### Document 文档对象\n\nSDK返回的文档对象通常包含以下属性：\n\n| 属性 | 类型 | 说明 |\n|-----|------|------|\n| `markdown` | string | 页面内容的Markdown格式 |\n| `html` | string | 原始HTML内容 |\n| `metadata` | object | 元数据（标题、描述、来源URL等） |\n| `raw` | object | 原始响应数据 |\n| `json` | object | 提取的JSON数据（当使用json格式时） |\n\n```python\n# Python - 访问文档属性\ndoc = app.scrape('https://example.com')\nprint(doc.markdown)       # Markdown内容\nprint(doc.metadata.title) # 页面标题\nprint(doc.metadata.source_url) # 来源URL\n```\n\n### ScrapeOptions 抓取选项\n\n| 选项 | 类型 | 说明 |\n|-----|------|------|\n| `formats` | array | 输出格式列表 |\n| `onlyMainContent` | boolean | 仅提取主要内容，移除噪音 |\n| `waitFor` | number | 等待JavaScript渲染的毫秒数 |\n| `headers` | object | 自定义HTTP头 |\n| `proxy` | string | 代理设置 |\n\n## 错误处理\n\n各SDK使用各自语言的原生错误处理机制：\n\n```python\n# Python - 使用异常处理\ntry:\n    doc = app.scrape('https://example.com')\nexcept Exception as e:\n    print(f\"抓取失败: {e}\")\n```\n\n```rust\n// Rust - 使用Result类型\nmatch scrape_result {\n    Ok(data) => println!(\"{}\", data.markdown),\n    Err(e) => eprintln!(\"抓取失败: {}\", e),\n}\n```\n\n```java\n// Java - 异常处理\ntry {\n    Document doc = client.scrape(\"https://example.com\", options);\n} catch (FirecrawlException e) {\n    System.err.println(\"API错误: \" + e.getMessage());\n}\n```\n\n## SDK架构对比\n\n```mermaid\ngraph LR\n    subgraph Python\n        P1[Firecrawl类]\n        P2[v2.Client]\n    end\n    \n    subgraph JavaScript\n        J1[Firecrawl类]\n        J2[v2.Client]\n    end\n    \n    subgraph Java\n        K1[FirecrawlClient]\n        K2[Builder模式]\n    end\n    \n    subgraph Rust\n        R1[Client结构体]\n        R2[异步方法]\n    end\n    \n    P1 --> P2\n    J1 --> J2\n    K1 --> K2\n    R1 --> R2\n```\n\n## 依赖要求\n\n| SDK | 最低版本要求 | 额外依赖 |\n|-----|------------|---------|\n| Python | Python 3.8+ | `requests` |\n| JavaScript | Node.js兼容 | - |\n| Java | JDK 11+ | - |\n| Go | Go 1.16+ | - |\n| Rust | Rust最新稳定版 | `tokio` (异步运行时) |\n| .NET | .NET Core 6.0+ | - |\n| Ruby | Ruby 3.0+ | - |\n\n## 最佳实践\n\n### 1. 环境变量管理\n\n建议在生产环境中使用环境变量存储API密钥：\n\n```bash\n# 设置环境变量\nexport FIRECRAWL_API_KEY=\"fc-your-api-key\"\n```\n\n### 2. 异步操作处理\n\n对于大量页面的爬取任务，使用异步方法并实现适当的重试机制：\n\n```python\n# Python - 配置重试和超时\nfrom firecrawl import Firecrawl\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\ndocs = app.crawl('https://example.com', limit=100, poll_interval=30)\n```\n\n### 3. 错误重试\n\n```python\n# Python - 实现重试逻辑\nimport time\ndef scrape_with_retry(url, max_retries=3):\n    for i in range(max_retries):\n        try:\n            return app.scrape(url)\n        except Exception as e:\n            if i == max_retries - 1:\n                raise\n            time.sleep(2 ** i)\n```\n\n## 相关资源\n\n- Python SDK源码：[apps/python-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/python-sdk)\n- JavaScript SDK源码：[apps/js-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/js-sdk)\n- Java SDK源码：[apps/java-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/java-sdk)\n- Go SDK源码：[apps/go-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/go-sdk)\n- Rust SDK源码：[apps/rust-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/rust-sdk)\n- .NET SDK源码：[apps/dotnet-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/dotnet-sdk)\n- Ruby SDK源码：[apps/ruby-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/ruby-sdk)\n\n---\n\n<a id='deployment-infra'></a>\n\n## 部署与基础设施\n\n### 相关页面\n\n相关主题：[系统架构](#system-architecture), [项目概览](#project-overview)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [README.md](https://github.com/firecrawl/firecrawl/blob/main/README.md)\n- [examples/kubernetes/firecrawl-helm/README.md](https://github.com/firecrawl/firecrawl/blob/main/examples/kubernetes/firecrawl-helm/README.md)\n- [apps/python-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/README.md)\n- [apps/js-sdk/firecrawl/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/README.md)\n- [apps/api/src/lib/branding/prompt.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/branding/prompt.ts)\n</details>\n\n# 部署与基础设施\n\n## 概述\n\nFirecrawl 的部署与基础设施体系支持多种部署模式，包括本地开发、Docker 容器化部署、Kubernetes 集群部署以及云原生架构。该项目采用微服务架构，主要包含 API 服务、Playwright 渲染服务、Redis 缓存层和数据库存储层等核心组件。通过 Helm Chart 和 Docker Compose 两种主流编排工具，开发者可以灵活选择适合自身环境的部署方案。\n\nFirecrawl 的基础设施设计遵循以下核心原则：可扩展性支持水平扩展以应对高并发场景；多架构支持涵盖 x86 和 ARM64 平台；环境隔离通过容器化实现开发与生产环境的统一；可观测性内置日志、监控和追踪能力。\n\n## 系统架构\n\n### 整体架构图\n\n```mermaid\ngraph TD\n    A[客户端请求] --> B[API 网关 / 负载均衡]\n    B --> C[Firecrawl API 服务]\n    C --> D[Redis 缓存层]\n    C --> E[PostgreSQL 数据库]\n    C --> F[Playwright 服务]\n    F --> G[浏览器实例池]\n    G --> H[渲染后的页面内容]\n    H --> C\n    C --> I[返回 LLM 可用的数据格式]\n```\n\n### 核心组件\n\n| 组件名称 | 技术栈 | 功能描述 |\n|---------|--------|---------|\n| Firecrawl API | Node.js/TypeScript | 核心 REST API 服务，处理爬取、搜索、交互请求 |\n| Playwright 服务 | TypeScript + Playwright | 浏览器自动化渲染，支持截图和 JavaScript 执行 |\n| Redis | Redis | 任务队列、缓存、会话存储 |\n| PostgreSQL | PostgreSQL | 持久化存储爬取任务、文档数据、用户信息 |\n| 多语言 SDK | Python/JS/Ruby/PHP/Go/Rust/.NET/Java | 官方客户端库，简化 API 集成 |\n\n资料来源：[README.md:1-50]()\n\n## Docker 容器化部署\n\n### 多架构镜像构建\n\nFirecrawl 支持同时构建适用于 x86_64 (amd64) 和 ARM64 (arm64) 架构的 Docker 镜像。这对于在 Apple Silicon Mac 或基于 ARM 的云服务器上运行的场景尤为重要。\n\n```bash\n# 创建并使用 docker buildx 构建器\ndocker buildx create --name multiarch --use --bootstrap\n\n# 构建并推送多架构镜像\ndocker buildx build --platform linux/amd64,linux/arm64 --push \\\n  -t docker.io/winkkgmbh/firecrawl:latest \\\n  ../../../apps/api\n```\n\n资料来源：[examples/kubernetes/firecrawl-helm/README.md:45-55]()\n\n### 官方镜像仓库\n\nFirecrawl 维护以下官方容器镜像：\n\n| 镜像名称 | 用途 | 仓库地址 |\n|---------|------|---------|\n| firecrawl | 主 API 服务 | ghcr.io/firecrawl/firecrawl |\n| playwright-service | 浏览器渲染服务 | ghcr.io/firecrawl/playwright-service |\n| nuq-postgres | 数据库服务 | ghcr.io/firecrawl/nuq-postgres |\n\n开发者可以使用这些官方镜像快速部署，或通过 docker-compose.yaml 进行本地开发环境搭建。\n\n## Kubernetes 部署\n\n### Helm Chart 架构\n\nFirecrawl 提供完整的 Helm Chart 用于 Kubernetes 集群部署，支持通过 values.yaml 进行灵活配置。Chart 遵循 Kubernetes 最佳实践，包括健康检查探针、资源限制、环境变量配置和持久化存储。\n\n```bash\n# 基础部署命令\nHELM_NO_PLUGINS=1 helm upgrade firecrawl . \\\n  -f values.yaml \\\n  -f overlays/prod/values.yaml \\\n  -n firecrawl \\\n  --install \\\n  --create-namespace\n```\n\n资料来源：[examples/kubernetes/firecrawl-helm/README.md:25-35]()\n\n### 生产环境配置\n\n生产环境部署通常需要合并多层配置文件：\n\n```yaml\n# 生产环境覆盖配置示例\nreplicaCount: 3\nimage:\n  repository: ghcr.io/firecrawl/firecrawl\nresources:\n  requests:\n    memory: \"512Mi\"\n    cpu: \"250m\"\n  limits:\n    memory: \"2Gi\"\n    cpu: \"1000m\"\n```\n\n### 使用官方镜像\n\n对于纯 x86 架构的集群，可以直接使用官方预构建镜像：\n\n```bash\nHELM_NO_PLUGINS=1 helm upgrade firecrawl . \\\n  -f values.yaml \\\n  --set image.repository=ghcr.io/firecrawl/firecrawl \\\n  --set playwright.repository=ghcr.io/firecrawl/playwright-service \\\n  --set nuqPostgres.image.repository=ghcr.io/firecrawl/nuq-postgres \\\n  -n firecrawl \\\n  --install \\\n  --create-namespace\n```\n\n资料来源：[examples/kubernetes/firecrawl-helm/README.md:36-48]()\n\n## 环境变量配置\n\n### 必需配置项\n\n| 环境变量 | 说明 | 示例值 |\n|---------|------|--------|\n| `FIRECRAWL_API_KEY` | API 认证密钥 | `fc-your-api-key-here` |\n| `DATABASE_URL` | PostgreSQL 连接字符串 | `postgresql://user:pass@host:5432/db` |\n| `REDIS_URL` | Redis 连接字符串 | `redis://localhost:6379` |\n\n### SDK 环境配置\n\n各语言 SDK 均支持从环境变量自动读取配置：\n\n```python\n# Python SDK\nfrom firecrawl import Firecrawl\napp = Firecrawl()  # 自动读取 FIRECRAWL_API_KEY\n\n# JavaScript SDK\nconst app = new Firecrawl({ apiKey: process.env.FIRECRAWL_API_KEY });\n\n# Ruby SDK\nclient = Firecrawl::Client.from_env  # 读取 FIRECRAWL_API_KEY\n\n# PHP SDK\n$client = FirecrawlClient::fromEnv();\n```\n\n```bash\n# Shell 环境配置\nexport FIRECRAWL_API_KEY=\"fc-your-api-key-here\"\n# 可选：自定义 API URL（用于自托管实例）\nexport FIRECRAWL_API_URL=\"http://localhost:3002\"\n```\n\n资料来源：[apps/python-sdk/README.md:1-30](), [apps/js-sdk/firecrawl/README.md:1-25](), [apps/ruby-sdk/README.md:1-20](), [apps/php-sdk/README.md:1-20]()\n\n## 服务发现与网络\n\n### 服务间通信\n\n```mermaid\ngraph LR\n    A[SDK 客户端] -->|HTTPS| B[API 服务 :3000]\n    B -->|内部通信| C[Playwright 服务 :3001]\n    B -->|TCP| D[Redis :6379]\n    B -->|TCP| E[PostgreSQL :5432]\n```\n\nAPI 服务默认监听 3000 端口，Playwright 渲染服务默认监听 3001 端口。服务间通过内部网络通信，无需对外暴露。\n\n### 自托管实例配置\n\n对于自托管部署，可以通过环境变量指定自定义 API 地址：\n\n```csharp\n// .NET SDK\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-api-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\"\n);\n```\n\n```java\n// Java SDK\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiUrl(\"https://your-firecrawl-instance.com\")\n    .apiKey(\"fc-your-api-key\")\n    .build();\n```\n\n## 资源规划\n\n### 推荐资源配置\n\n| 环境规模 | API副本 | Playwright副本 | Redis | PostgreSQL |\n|---------|--------|---------------|-------|-----------|\n| 开发/测试 | 1 | 1 | 1GB | 10GB |\n| 小规模生产 | 2 | 2 | 4GB | 50GB |\n| 中等规模 | 5 | 5 | 8GB | 200GB |\n| 大规模 | 10+ | 10+ | 16GB+ | 500GB+ |\n\n### 健康检查配置\n\nKubernetes 部署中包含以下健康检查：\n\n- **存活探针 (Liveness Probe)**：检测服务是否存活，失败时重启容器\n- **就绪探针 (Readiness Probe)**：检测服务是否就绪，失败时停止接收流量\n- **启动探针 (Startup Probe)**：给予服务足够时间完成初始化\n\n## 安全考虑\n\n### 网络策略\n\n生产环境建议配置 Kubernetes NetworkPolicy，限制以下流量：\n\n- API 服务仅接收来自负载均衡器的流量\n- Playwright 服务仅接收来自 API 服务的内部流量\n- 数据库仅接收来自 API 服务的流量\n- Redis 仅接收来自 API 服务的流量\n\n### 密钥管理\n\nAPI 密钥应通过 Kubernetes Secret 或外部密钥管理服务（如 AWS Secrets Manager、HashiCorp Vault）存储，避免在 values.yaml 中明文配置。\n\n## 监控与日志\n\n### 日志聚合\n\nFirecrawl API 服务输出结构化日志，建议通过以下方式收集：\n\n- **标准输出/标准错误**：Kubernetes 默认收集方式\n- **日志聚合器**：如 Fluentd、Filebeat 收集到 Elasticsearch/Loki\n- **云原生方案**：CloudWatch Logs、Azure Monitor、Google Cloud Logging\n\n### 关键指标\n\n| 指标名称 | 说明 | 告警阈值建议 |\n|---------|------|-------------|\n| 请求延迟 P99 | API 响应时间 | > 10s |\n| 错误率 | 5xx 错误占比 | > 5% |\n| 队列深度 | Redis 待处理任务数 | > 1000 |\n| 浏览器实例数 | Playwright 活跃实例 | < 2（表示可能泄漏） |\n\n## 备份与恢复\n\n### 数据库备份\n\nPostgreSQL 数据库应配置以下备份策略：\n\n- **自动全量备份**：每日执行，保留 30 天\n- **增量备份**：每 6 小时执行\n- **点时间恢复 (PITR)**：启用 Write-Ahead Log (WAL) 归档\n\n### 灾难恢复\n\n灾难恢复计划应包含：\n\n1. **RTO（恢复时间目标）**：< 4 小时\n2. **RPO（恢复点目标）**：< 1 小时\n3. **恢复流程文档化**：包含步骤验证清单\n4. **定期演练**：每季度执行恢复演练\n\n## 部署最佳实践\n\n### CI/CD 集成\n\n```yaml\n# 示例 GitHub Actions 部署流程\ndeploy:\n  runs-on: ubuntu-latest\n  steps:\n    - uses: actions/checkout@v4\n    - name: Build and push images\n      run: |\n        docker buildx build \\\n          --platform linux/amd64,linux/arm64 \\\n          --push \\\n          -t ${{ env.REGISTRY }}/firecrawl:${{ github.sha }} .\n    - name: Deploy to Kubernetes\n      run: |\n        helm upgrade firecrawl ./charts/firecrawl \\\n          --set image.tag=${{ github.sha }}\n```\n\n### 滚动更新策略\n\n建议使用 `RollingUpdate` 策略配置蓝绿部署或滚动更新：\n\n```yaml\nstrategy:\n  type: RollingUpdate\n  rollingUpdate:\n    maxSurge: 1\n    maxUnavailable: 0\n```\n\n## 相关文档\n\n- [SDK 文档](../sdks/overview.md)\n- [API 参考](../api-reference/overview.md)\n- [自托管指南](./self-hosting.md)\n\n---\n\n<a id='development-guide'></a>\n\n## 开发指南\n\n### 相关页面\n\n相关主题：[系统架构](#system-architecture), [项目概览](#project-overview)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [CONTRIBUTING.md](https://github.com/firecrawl/firecrawl/blob/main/CONTRIBUTING.md)\n- [apps/api/jest.config.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/jest.config.ts)\n- [apps/api/knip.config.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/knip.config.ts)\n- [apps/api/src/scraper/scrapeURL/scrapeURL.test.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/scrapeURL.test.ts)\n- [apps/api/src/lib/validateUrl.test.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/validateUrl.test.ts)\n- [apps/test-suite/jest.config.js](https://github.com/firecrawl/firecrawl/blob/main/apps/test-suite/jest.config.js)\n- [apps/python-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/README.md)\n- [apps/js-sdk/firecrawl/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/README.md)\n</details>\n\n# 开发指南\n\n本文档为 Firecrawl 项目提供全面的开发指南，涵盖开发环境配置、代码规范、测试策略、多语言 SDK 开发等内容。\n\n## 项目概述\n\nFirecrawl 是一个用于搜索、抓取网页内容并将其转换为 LLM 可用格式的 web scraping 工具。项目采用多语言 SDK 架构，核心 API 服务使用 TypeScript/Node.js 开发，同时提供 Python、JavaScript/TypeScript、Rust、Go、Java、Ruby、.NET 等多语言 SDK。\n\n```mermaid\ngraph TB\n    subgraph 核心服务\n        A[API Server<br/>TypeScript/Node.js]\n        B[Playwright Service]\n        C[数据库服务]\n    end\n    \n    subgraph SDK层\n        D[Python SDK]\n        E[JS/TS SDK]\n        F[Rust SDK]\n        G[Go SDK]\n        H[Java SDK]\n        I[Ruby SDK]\n        J[.NET SDK]\n    end\n    \n    K[外部用户]\n    \n    A --> B\n    A --> C\n    K --> D\n    K --> E\n    K --> F\n    K --> G\n    K --> H\n    K --> I\n    K --> J\n    D --> A\n    E --> A\n    F --> A\n    G --> A\n```\n\n## 开发环境配置\n\n### 环境要求\n\n根据不同开发任务，需要安装以下环境：\n\n| 组件 | 版本要求 | 用途 |\n|------|----------|------|\n| Node.js | 18+ | API 服务开发 |\n| Python | 3.9+ | Python SDK 开发 |\n| Rust | 1.70+ | Rust SDK 开发 |\n| Java | 11+ | Java SDK 开发 |\n| Go | 1.20+ | Go SDK 开发 |\n| Ruby | 3.0+ | Ruby SDK 开发 |\n| .NET | 6.0+ | .NET SDK 开发 |\n| Gradle | 8+ | Java SDK 构建 |\n\n### 项目结构\n\n```\nfirecrawl/\n├── apps/\n│   ├── api/                    # 核心 API 服务 (TypeScript)\n│   ├── playwright-service-ts/   # Playwright 浏览器服务\n│   ├── python-sdk/              # Python SDK\n│   ├── js-sdk/                  # JavaScript/TypeScript SDK\n│   ├── rust-sdk/                # Rust SDK\n│   ├── go-sdk/                  # Go SDK\n│   ├── java-sdk/                # Java SDK\n│   ├── ruby-sdk/                # Ruby SDK\n│   ├── dot-net-sdk/             # .NET SDK\n│   └── test-suite/              # 测试套件\n├── examples/                    # 使用示例\n│   └── kubernetes/              # Kubernetes 部署配置\n└── sharedLibs/                  # 共享库\n    └── go-html-to-md/           # Go HTML 转 Markdown 库\n```\n\n## 代码规范与工具链\n\n### 代码质量工具\n\nFirecrawl 项目使用 Knip 进行代码质量检查和未使用依赖分析。配置文件位于 `apps/api/knip.config.ts`：\n\n```typescript\n// apps/api/knip.config.ts\nimport type { KnipConfig } from \"knip\";\nconst config: KnipConfig = {\n  // 入口文件和项目结构配置\n  project: [\"**/*.{ts,tsx,js,jsx}\"],\n  // 忽略的文件\n  ignore: [\"**/*.test.ts\", \"**/node_modules/**\"],\n};\nexport default config;\n```\n\n### 代码检查命令\n\n```bash\n# 运行 Knip 检查\nnpx knip\n\n# 或添加自定义配置\nnpx knip --config knip.config.ts\n```\n\n### Linting 配置\n\n项目采用标准的 ESLint 配置，建议在提交前运行 lint 检查确保代码风格一致。\n\n## 测试策略\n\n### 测试框架\n\nFirecrawl 使用 Jest 作为主要的测试框架。API 服务和测试套件分别有不同的配置文件。\n\n#### API 服务测试配置\n\n```typescript\n// apps/api/jest.config.ts\nimport type { Config } from \"jest\";\n\nconst config: Config = {\n  preset: \"ts-jest\",\n  testEnvironment: \"node\",\n  roots: [\"<rootDir>/src\"],\n  testMatch: [\"**/*.test.ts\"],\n  transform: {\n    \"^.+\\\\.tsx?$\": [\"ts-jest\", {\n      tsconfig: \"tsconfig.json\",\n    }],\n  },\n  moduleNameMapper: {\n    \"^@/(.*)$\": \"<rootDir>/src/$1\",\n  },\n};\n\nexport default config;\n```\n\n#### 测试套件配置\n\n```javascript\n// apps/test-suite/jest.config.js\nmodule.exports = {\n  testEnvironment: \"node\",\n  testMatch: [\"**/*.test.{js,ts}\"],\n  // 测试超时设置\n  testTimeout: 30000,\n};\n```\n\n### 编写测试用例\n\n#### URL 验证测试示例\n\n```typescript\n// apps/api/src/lib/validateUrl.test.ts\nimport { validateUrl } from \"./validateUrl\";\n\ndescribe(\"URL Validation\", () => {\n  it(\"should validate correct URLs\", () => {\n    expect(validateUrl(\"https://example.com\")).toBe(true);\n    expect(validateUrl(\"http://test.org/path\")).toBe(true);\n  });\n\n  it(\"should reject invalid URLs\", () => {\n    expect(validateUrl(\"not-a-url\")).toBe(false);\n    expect(validateUrl(\"ftp://invalid-protocol.com\")).toBe(false);\n  });\n});\n```\n\n#### 抓取功能测试示例\n\n```typescript\n// apps/api/src/scraper/scrapeURL/scrapeURL.test.ts\nimport { scrapeURL } from \"./scrapeURL\";\nimport { FirecrawlDocument } from \"../../../models/firecrawl-document\";\n\ndescribe(\"scrapeURL\", () => {\n  const mockUrl = \"https://example.com\";\n  const mockOptions = {\n    formats: [\"markdown\", \"html\"] as const,\n    onlyMainContent: true,\n  };\n\n  it(\"should scrape a URL and return markdown\", async () => {\n    const result: FirecrawlDocument = await scrapeURL(mockUrl, mockOptions);\n    \n    expect(result.markdown).toBeDefined();\n    expect(result.markdown).not.toBeEmpty();\n  });\n\n  it(\"should respect onlyMainContent option\", async () => {\n    const result = await scrapeURL(mockUrl, mockOptions);\n    \n    expect(result.markdown).not.toContain(\"<nav>\");\n    expect(result.markdown).not.toContain(\"<header>\");\n  });\n});\n```\n\n### 运行测试\n\n```bash\n# 运行所有测试\nnpm test\n\n# 运行特定测试文件\nnpm test -- validateUrl.test.ts\n\n# 运行测试并生成覆盖率报告\nnpm test -- --coverage\n\n# 运行测试套件\ncd apps/test-suite && npm test\n```\n\n### 测试最佳实践\n\n| 实践 | 说明 | 资料来源 |\n|------|------|----------|\n| 测试文件命名 | 使用 `.test.ts` 后缀 | `apps/api/jest.config.ts:6` |\n| 测试环境隔离 | 每个测试独立运行 | `apps/api/jest.config.ts:5` |\n| 模拟外部依赖 | 使用 Jest mocks | `apps/api/src/scraper/scrapeURL/scrapeURL.test.ts` |\n| 异步测试 | 使用 async/await | `apps/api/src/scraper/scrapeURL/scrapeURL.test.ts:12` |\n| 超时配置 | 复杂测试设置超时 | `apps/test-suite/jest.config.js:6` |\n\n## 多语言 SDK 开发\n\n### Python SDK\n\n#### 环境配置\n\n```python\n# 使用虚拟环境\npython -m venv venv\nsource venv/bin/activate  # Linux/Mac\n# 或\n.\\venv\\Scripts\\activate   # Windows\n\n# 安装依赖\npip install firecrawl\n```\n\n#### 快速开始\n\n```python\n# apps/python-sdk/README.md\nfrom firecrawl import Firecrawl\n\n# 创建客户端\nfirecrawl = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\n# 抓取网页\nscrape_result = firecrawl.scrape(\n    'https://firecrawl.dev', \n    formats=['markdown', 'html']\n)\nprint(scrape_result)\n\n# 爬取网站\ncrawl_status = firecrawl.crawl(\n    'https://firecrawl.dev', \n    limit=100, \n    scrape_options=ScrapeOptions(formats=['markdown', 'html']),\n    poll_interval=30\n)\n```\n\n#### SDK 包结构\n\n| 模块 | 功能 |\n|------|------|\n| `firecrawl` | 主客户端类 |\n| `firecrawl.v2.types` | 类型定义 (ParseOptions, ScrapeOptions) |\n\n### JavaScript/TypeScript SDK\n\n#### 环境配置\n\n```bash\nnpm install @mendable/firecrawl-js\n```\n\n#### 快速开始\n\n```typescript\n// apps/js-sdk/firecrawl/README.md\nimport Firecrawl from '@mendable/firecrawl-js';\n\nconst app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });\n\n// 搜索\nconst searchResult = await app.search(\"firecrawl\", { limit: 5 });\n\n// 抓取\nconst scrapeResult = await app.scrape('https://example.com', {\n  formats: ['markdown', 'html'],\n  onlyMainContent: true,\n});\n\n// 爬取\nconst crawlResult = await app.crawl('https://firecrawl.dev', {\n  limit: 100,\n  scrapeOptions: { formats: ['markdown', 'html'] },\n});\n```\n\n#### 异步爬取\n\n```typescript\n// 启动异步爬取任务\nconst start = await app.startCrawl('https://mendable.ai', {\n  excludePaths: ['blog/*'],\n  limit: 5,\n});\n\n// 检查爬取状态\nconst status = await app.getCrawlStatus(start.jobId);\n```\n\n### Rust SDK\n\n#### 环境配置\n\n```toml\n# apps/rust-sdk/README.md\n[dependencies]\nfirecrawl = \"2.1.0\"\ntokio = { version = \"^1\", features = [\"full\"] }\n```\n\n#### 快速开始\n\n```rust\nuse firecrawl::{Client, ScrapeOptions, Format, CrawlOptions};\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let client = Client::new(\"fc-YOUR_API_KEY\")?;\n\n    // 抓取 URL\n    let document = client.scrape(\"https://firecrawl.dev\", None).await?;\n    println!(\"{:?}\", document.markdown);\n\n    // 爬取网站\n    let options = CrawlOptions {\n        limit: Some(50),\n        ..Default::default()\n    };\n    let result = client.crawl(\"https://docs.firecrawl.dev\", options).await?;\n\n    // 搜索\n    let response = client.search(\"best web scraping tools 2024\", None).await?;\n\n    Ok(())\n}\n```\n\n### Java SDK\n\n#### 环境配置\n\n```groovy\n// apps/java-sdk/README.md\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation 'com.firecrawl:firecrawl-java:1.1.1'\n}\n```\n\n#### 快速开始\n\n```java\nimport com.firecrawl.client.FirecrawlClient;\nimport com.firecrawl.models.*;\nimport java.util.List;\n\n// 创建客户端\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiKey(\"fc-your-api-key\")\n    .build();\n\n// 抓取网页\nDocument doc = client.scrape(\"https://example.com\",\n    ScrapeOptions.builder()\n        .formats(List.of(\"markdown\"))\n        .build());\n\nSystem.out.println(doc.getMarkdown());\n```\n\n### .NET SDK\n\n#### 环境配置\n\n```bash\ndotnet add package firecrawl-sdk\n```\n\n#### 快速开始\n\n```csharp\n// apps/dotnet-sdk/README.md\nusing Firecrawl;\nusing Firecrawl.Models;\n\nvar client = new FirecrawlClient(\"fc-your-api-key\");\n\n// 抓取单个页面\nvar doc = await client.ScrapeAsync(\"https://example.com\",\n    new ScrapeOptions { Formats = new List<object> { \"markdown\" } });\n\nConsole.WriteLine(doc.Markdown);\n```\n\n### Go SDK\n\nGo SDK 位于 `apps/go-sdk`，提供与 Firecrawl API 交互的 Go 语言接口。\n\n### Ruby SDK\n\n#### 环境配置\n\n```ruby\n# apps/ruby-sdk/README.md\ngem \"firecrawl-sdk\", \"~> 1.0\"\n```\n\n#### 快速开始\n\n```ruby\nrequire \"firecrawl\"\n\n# 创建客户端\nclient = Firecrawl::Client.new(api_key: \"fc-your-api-key\")\n\n# 抓取单个页面\ndoc = client.scrape(\"https://example.com\")\nputs doc.markdown\n```\n\n## 贡献指南\n\n### 提交流程\n\n1. **Fork 仓库** - 从主仓库创建个人分支\n2. **创建分支** - 使用描述性的分支名称\n   ```bash\n   git checkout -b feature/your-feature-name\n   ```\n3. **编写代码** - 遵循项目的代码规范\n4. **添加测试** - 确保新功能有对应的测试用例\n5. **运行测试** - 提交前确保所有测试通过\n6. **提交更改** - 编写清晰的提交信息\n7. **创建 Pull Request** - 描述更改内容和动机\n\n### 代码审查要点\n\n| 审查项 | 要求 | 资料来源 |\n|--------|------|----------|\n| 代码风格 | 通过 lint 检查 | `apps/api/knip.config.ts` |\n| 测试覆盖 | 新功能必须包含测试 | `apps/api/jest.config.ts` |\n| 文档更新 | 更新相关 README | `CONTRIBUTING.md` |\n| 向后兼容 | 不破坏现有 API | 多语言 SDK 文档 |\n\n### 开发工作流\n\n```mermaid\ngraph LR\n    A[创建分支] --> B[编写代码]\n    B --> C[添加测试]\n    C --> D[运行测试]\n    D --> E{测试通过?}\n    E -->|否| F[修复问题]\n    F --> D\n    E -->|是| G[提交代码]\n    G --> H[创建 PR]\n    H --> I[代码审查]\n    I --> J{审查通过?}\n    J -->|否| K[修改代码]\n    K --> I\n    J -->|是| L[合并到主分支]\n```\n\n## 调试与问题排查\n\n### 常见问题\n\n#### 1. 测试失败\n\n```bash\n# 查看详细错误信息\nnpm test -- --verbose\n\n# 运行单个测试\nnpm test -- validateUrl.test.ts --verbose\n\n# 调试模式\nnpm test -- --inspect-brk\n```\n\n#### 2. API 连接问题\n\n检查以下配置：\n- `FIRECRAWL_API_KEY` 环境变量是否设置\n- API 端点是否可访问\n- 网络代理配置是否正确\n\n#### 3. SDK 导入错误\n\n确保安装了正确版本的 SDK：\n\n| SDK | 最低版本 |\n|-----|----------|\n| Python | firecrawl 2.x |\n| JavaScript | @mendable/firecrawl-js 0.x |\n| Rust | firecrawl 2.1.0 |\n| Java | firecrawl-java 1.1.1 |\n\n## 高级配置\n\n### 自定义 API 端点\n\n对于自托管实例，可以指定自定义 API URL：\n\n```typescript\n// JavaScript SDK\nconst app = new Firecrawl({ \n  apiKey: \"fc-your-key\",\n  apiUrl: \"https://your-firecrawl-instance.com\"\n});\n```\n\n```python\n# Python SDK\nfirecrawl = Firecrawl(\n    api_key=\"fc-your-key\",\n    api_url=\"https://your-firecrawl-instance.com\"\n)\n```\n\n```csharp\n// .NET SDK\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\"\n);\n```\n\n### 自定义 HTTP 客户端\n\n```csharp\n// .NET SDK - 自定义 HttpClient\nvar httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(60) };\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-api-key\",\n    httpClient: httpClient);\n```\n\n### 环境变量配置\n\n| 变量名 | 说明 | 用途 |\n|--------|------|------|\n| `FIRECRAWL_API_KEY` | API 密钥 | 认证 |\n| `FIRECRAWL_API_URL` | API 端点 (可选) | 自托管实例 |\n| `FIRECRAWL_RATE_LIMIT` | 请求限速 | 避免 API 限流 |\n\n## 相关资源\n\n- [官方文档](https://docs.firecrawl.dev)\n- [API 参考](https://docs.firecrawl.dev/api-reference)\n- [GitHub 仓库](https://github.com/firecrawl/firecrawl)\n- [Firecrawl 官网](https://firecrawl.dev)\n\n---\n\n---\n\n## Doramagic 踩坑日志\n\n项目：firecrawl/firecrawl\n\n摘要：发现 21 个潜在踩坑项，其中 1 个为 high/blocking；最高优先级：安全/权限坑 - 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows。\n\n## 1. 安全/权限坑 · 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows\n\n- 严重度：high\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows\n- 对用户的影响：可能影响升级、迁移或版本选择。\n- 建议检查：来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_0bf31b0e8c3b45fb8da04cebb259c8a4 | https://github.com/firecrawl/firecrawl/issues/3500 | 来源类型 github_issue 暴露的待验证使用条件。\n\n## 2. 安装坑 · 来源证据：v2.4.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安装相关的待验证问题：v2.4.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_e1e417d6cea44fb79118e4daeac083a0 | https://github.com/firecrawl/firecrawl/releases/tag/v2.4.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 3. 配置坑 · 来源证据：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个配置相关的待验证问题：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_aa487261676d400197da5f3646baff2f | https://github.com/firecrawl/firecrawl/issues/3498 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 4. 能力坑 · 能力判断依赖假设\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：README/documentation is current enough for a first validation pass.\n- 对用户的影响：假设不成立时，用户拿不到承诺的能力。\n- 建议检查：将假设转成下游验证清单。\n- 防护动作：假设必须转成验证项；没有验证结果前不能写成事实。\n- 证据：capability.assumptions | github_repo:787076358 | https://github.com/firecrawl/firecrawl | README/documentation is current enough for a first validation pass.\n\n## 5. 运行坑 · 来源证据：[Feat] Emit batch scrape failures of each page to webhook\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个运行相关的待验证问题：[Feat] Emit batch scrape failures of each page to webhook\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_80c638d597cc432b9a74e7e336b043ee | https://github.com/firecrawl/firecrawl/issues/2576 | 来源类型 github_issue 暴露的待验证使用条件。\n\n## 6. 维护坑 · 维护活跃度未知\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：未记录 last_activity_observed。\n- 对用户的影响：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。\n- 建议检查：补 GitHub 最近 commit、release、issue/PR 响应信号。\n- 防护动作：维护活跃度未知时，推荐强度不能标为高信任。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | last_activity_observed missing\n\n## 7. 安全/权限坑 · 下游验证发现风险项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：下游已经要求复核，不能在页面中弱化。\n- 建议检查：进入安全/权限治理复核队列。\n- 防护动作：下游风险存在时必须保持 review/recommendation 降级。\n- 证据：downstream_validation.risk_items | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium\n\n## 8. 安全/权限坑 · 存在安全注意事项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：No sandbox install has been executed yet; downstream must verify before user use.\n- 对用户的影响：用户安装前需要知道权限边界和敏感操作。\n- 建议检查：转成明确权限清单和安全审查提示。\n- 防护动作：安全注意事项必须面向用户前置展示。\n- 证据：risks.safety_notes | github_repo:787076358 | https://github.com/firecrawl/firecrawl | No sandbox install has been executed yet; downstream must verify before user use.\n\n## 9. 安全/权限坑 · 存在评分风险\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：风险会影响是否适合普通用户安装。\n- 建议检查：把风险写入边界卡，并确认是否需要人工复核。\n- 防护动作：评分风险必须进入边界卡，不能只作为内部分数。\n- 证据：risks.scoring_risks | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium\n\n## 10. 安全/权限坑 · 来源证据：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_ef6deffa53c147b29e617225612e55b0 | https://github.com/firecrawl/firecrawl/issues/2814 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 11. 安全/权限坑 · 来源证据：v2.0.1\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.0.1\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_0334c6a4c3284763a02c66ac96ce9c0c | https://github.com/firecrawl/firecrawl/releases/tag/v2.0.1 | 来源类型 github_release 暴露的待验证使用条件。\n\n## 12. 安全/权限坑 · 来源证据：v2.1.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.1.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_360eac170b12452583bb9b7072acc4e3 | https://github.com/firecrawl/firecrawl/releases/tag/v2.1.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 13. 安全/权限坑 · 来源证据：v2.2.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.2.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_749e0e1b86ba455585d343764588f00e | https://github.com/firecrawl/firecrawl/releases/tag/v2.2.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 14. 安全/权限坑 · 来源证据：v2.3.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.3.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_e6f1735e34a34eacb7b77e7bb21644a6 | https://github.com/firecrawl/firecrawl/releases/tag/v2.3.0 | 来源讨论提到 npm 相关条件，需在安装/试用前复核。\n\n## 15. 安全/权限坑 · 来源证据：v2.5.0 - The World's Best Web Data API\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.5.0 - The World's Best Web Data API\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_4f928a2f370b4186ba4031bc4830020c | https://github.com/firecrawl/firecrawl/releases/tag/v2.5.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 16. 安全/权限坑 · 来源证据：v2.6.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.6.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_38343ea51e374e86a5081e46c837468c | https://github.com/firecrawl/firecrawl/releases/tag/v2.6.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 17. 安全/权限坑 · 来源证据：v2.7.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.7.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_4e1fdfc9cb714147a228b5ae01d273f2 | https://github.com/firecrawl/firecrawl/releases/tag/v2.7.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 18. 安全/权限坑 · 来源证据：v2.8.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.8.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_dd78eff5694c40cba109ef1230e1dc77 | https://github.com/firecrawl/firecrawl/releases/tag/v2.8.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 19. 安全/权限坑 · 来源证据：v2.9.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.9.0\n- 对用户的影响：可能阻塞安装或首次运行。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_a6219f53b7de4f31bb8ca1c7109fd49d | https://github.com/firecrawl/firecrawl/releases/tag/v2.9.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 20. 维护坑 · issue/PR 响应质量未知\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：issue_or_pr_quality=unknown。\n- 对用户的影响：用户无法判断遇到问题后是否有人维护。\n- 建议检查：抽样最近 issue/PR，判断是否长期无人处理。\n- 防护动作：issue/PR 响应未知时，必须提示维护风险。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | issue_or_pr_quality=unknown\n\n## 21. 维护坑 · 发布节奏不明确\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：release_recency=unknown。\n- 对用户的影响：安装命令和文档可能落后于代码，用户踩坑概率升高。\n- 建议检查：确认最近 release/tag 和 README 安装命令是否一致。\n- 防护动作：发布节奏未知或过期时，安装说明必须标注可能漂移。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | release_recency=unknown\n\n<!-- canonical_name: firecrawl/firecrawl; human_manual_source: deepwiki_human_wiki -->\n",
      "markdown_key": "firecrawl",
      "pages": "draft",
      "source_refs": [
        {
          "evidence_id": "github_repo:787076358",
          "kind": "repo",
          "supports_claim_ids": [
            "claim_identity",
            "claim_distribution",
            "claim_capability"
          ],
          "url": "https://github.com/firecrawl/firecrawl"
        },
        {
          "evidence_id": "art_ad64b9583c024d75a465b30327371cb0",
          "kind": "docs",
          "supports_claim_ids": [
            "claim_identity",
            "claim_distribution",
            "claim_capability"
          ],
          "url": "https://github.com/firecrawl/firecrawl#readme"
        }
      ],
      "summary": "DeepWiki/Human Wiki 完整输出，末尾追加 Discovery Agent 踩坑日志。",
      "title": "firecrawl 说明书",
      "toc": [
        "https://github.com/firecrawl/firecrawl 项目说明书",
        "目录",
        "项目概览",
        "项目简介",
        "核心功能模块",
        "系统架构",
        "多语言 SDK 支持",
        "抓取单个页面",
        "Doramagic 踩坑日志"
      ]
    }
  },
  "quality_gate": {
    "blocking_gaps": [],
    "category_confidence": "medium",
    "compile_status": "ready_for_review",
    "five_assets_present": true,
    "install_sandbox_verified": true,
    "missing_evidence": [],
    "next_action": "publish to Doramagic.ai project surfaces",
    "prompt_preview_boundary_ok": true,
    "publish_status": "publishable",
    "quick_start_verified": true,
    "repo_clone_verified": false,
    "repo_commit": null,
    "repo_inspection_error": null,
    "repo_inspection_files": [],
    "repo_inspection_verified": false,
    "review_reasons": [],
    "tag_count_ok": true,
    "unsupported_claims": []
  },
  "schema_version": "0.1",
  "user_assets": {
    "ai_context_pack": {
      "asset_id": "ai_context_pack",
      "filename": "AI_CONTEXT_PACK.md",
      "markdown": "# firecrawl - Doramagic AI Context Pack\n\n> 定位：给用户宿主 AI 装载的开工前上下文。它不代表已经安装、运行或验证目标项目。\n\n## 项目\n\n- canonical_name: `firecrawl/firecrawl`\n- capability: 🔥 The API to search, scrape, and interact with the web for AI\n- expected_user_outcome: 🔥 The API to search, scrape, and interact with the web for AI\n\n## 基础边界\n\n- 不要声称已经安装、运行、调用 API、读写本地文件或完成真实任务。\n- 项目事实必须来自 repo evidence、Claim Graph 或明确来源。\n- 遇到未验证能力时，必须标记为待验证，而不是补全为事实。\n- publish_status: `publishable`\n- blocking_gaps: none\n\n---\n\n## Doramagic Context Augmentation\n\n下面内容用于强化 Repomix/AI Context Pack 主体。Human Manual 只提供阅读骨架；踩坑日志会被转成宿主 AI 必须遵守的工作约束。\n\n## Human Manual 骨架\n\n使用规则：这里只是项目阅读路线和显著性信号，不是事实权威。具体事实仍必须回到 repo evidence / Claim Graph。\n\n宿主 AI 硬性规则：\n- 不得把页标题、章节顺序、摘要或 importance 当作项目事实证据。\n- 解释 Human Manual 骨架时，必须明确说它只是阅读路线/显著性信号。\n- 能力、安装、兼容性、运行状态和风险判断必须引用 repo evidence、source path 或 Claim Graph。\n\n- **项目概览**：importance `high`\n  - source_paths: README.md, apps/api/package.json, CLAUDE.md\n- **系统架构**：importance `high`\n  - source_paths: apps/api/src/index.ts, apps/api/src/harness.ts, apps/api/native/src/lib.rs, apps/api/src/services/index.ts, apps/api/src/services/queue-service.ts\n- **API路由与版本控制**：importance `high`\n  - source_paths: apps/api/src/routes/v0.ts, apps/api/src/routes/v1.ts, apps/api/src/routes/v2.ts, apps/api/src/routes/admin.ts, apps/api/openapi.json\n- **抓取引擎**：importance `high`\n  - source_paths: apps/api/src/scraper/scrapeURL/index.ts, apps/api/src/scraper/scrapeURL/engines/fetch/index.ts, apps/api/src/scraper/scrapeURL/engines/fire-engine/index.ts, apps/api/src/scraper/scrapeURL/engines/playwright/index.ts, apps/api/src/scraper/scrapeURL/engines/pdf/index.ts\n- **搜索与爬取功能**：importance `high`\n  - source_paths: apps/api/src/search/index.ts, apps/api/src/search/execute.ts, apps/api/src/search/fireEngine.ts, apps/api/src/search/searxng.ts, apps/api/src/scraper/WebScraper/crawler.ts\n- **数据提取系统**：importance `high`\n  - source_paths: apps/api/src/lib/extract/extraction-service.ts, apps/api/src/lib/extract/build-document.ts, apps/api/src/lib/extract/build-prompts.ts, apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts, apps/api/src/lib/extract/completions/batchExtract.ts\n- **监控与Webhook**：importance `medium`\n  - source_paths: apps/api/src/services/monitoring/scheduler.ts, apps/api/src/services/monitoring/runner.ts, apps/api/src/services/monitoring/store.ts, apps/api/src/services/monitoring/diff.ts, apps/api/src/services/webhook/delivery.ts\n- **多语言SDK**：importance `high`\n  - source_paths: apps/python-sdk/firecrawl/__init__.py, apps/python-sdk/firecrawl/v2/client.py, apps/js-sdk/firecrawl/src/index.ts, apps/js-sdk/firecrawl/src/v2/client.ts, apps/java-sdk/src/main/java/com/firecrawl/client/FirecrawlClient.java\n\n## Repo Inspection Evidence / 源码检查证据\n\n- repo_clone_verified: false\n- repo_inspection_verified: false\n- repo_commit: `unknown`\n\n宿主 AI 硬性规则：\n- 没有 repo_clone_verified=true 时，不得声称已经读过源码。\n- 没有 repo_inspection_verified=true 时，不得把 README/docs/package 文件判断写成事实。\n- 没有 quick_start_verified=true 时，不得声称 Quick Start 已跑通。\n\n## Doramagic Pitfall Constraints / 踩坑约束\n\n这些规则来自 Doramagic 发现、验证或编译过程中的项目专属坑点。宿主 AI 必须把它们当作工作约束，而不是普通说明文字。\n\n### Constraint 1: 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows\n\n- Trigger: GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows\n- Host AI rule: 来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- Why it matters: 可能影响升级、迁移或版本选择。\n- Evidence: community_evidence:github | cevd_0bf31b0e8c3b45fb8da04cebb259c8a4 | https://github.com/firecrawl/firecrawl/issues/3500 | 来源类型 github_issue 暴露的待验证使用条件。\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 2: 来源证据：v2.4.0\n\n- Trigger: GitHub 社区证据显示该项目存在一个安装相关的待验证问题：v2.4.0\n- Host AI rule: 来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- Why it matters: 可能增加新用户试用和生产接入成本。\n- Evidence: community_evidence:github | cevd_e1e417d6cea44fb79118e4daeac083a0 | https://github.com/firecrawl/firecrawl/releases/tag/v2.4.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 3: 来源证据：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions\n\n- Trigger: GitHub 社区证据显示该项目存在一个配置相关的待验证问题：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions\n- Host AI rule: 来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- Why it matters: 可能增加新用户试用和生产接入成本。\n- Evidence: community_evidence:github | cevd_aa487261676d400197da5f3646baff2f | https://github.com/firecrawl/firecrawl/issues/3498 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 4: 能力判断依赖假设\n\n- Trigger: README/documentation is current enough for a first validation pass.\n- Host AI rule: 将假设转成下游验证清单。\n- Why it matters: 假设不成立时，用户拿不到承诺的能力。\n- Evidence: capability.assumptions | github_repo:787076358 | https://github.com/firecrawl/firecrawl | README/documentation is current enough for a first validation pass.\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 5: 来源证据：[Feat] Emit batch scrape failures of each page to webhook\n\n- Trigger: GitHub 社区证据显示该项目存在一个运行相关的待验证问题：[Feat] Emit batch scrape failures of each page to webhook\n- Host AI rule: 来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- Why it matters: 可能增加新用户试用和生产接入成本。\n- Evidence: community_evidence:github | cevd_80c638d597cc432b9a74e7e336b043ee | https://github.com/firecrawl/firecrawl/issues/2576 | 来源类型 github_issue 暴露的待验证使用条件。\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 6: 维护活跃度未知\n\n- Trigger: 未记录 last_activity_observed。\n- Host AI rule: 补 GitHub 最近 commit、release、issue/PR 响应信号。\n- Why it matters: 新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。\n- Evidence: evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | last_activity_observed missing\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 7: 下游验证发现风险项\n\n- Trigger: no_demo\n- Host AI rule: 进入安全/权限治理复核队列。\n- Why it matters: 下游已经要求复核，不能在页面中弱化。\n- Evidence: downstream_validation.risk_items | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 8: 存在安全注意事项\n\n- Trigger: No sandbox install has been executed yet; downstream must verify before user use.\n- Host AI rule: 转成明确权限清单和安全审查提示。\n- Why it matters: 用户安装前需要知道权限边界和敏感操作。\n- Evidence: risks.safety_notes | github_repo:787076358 | https://github.com/firecrawl/firecrawl | No sandbox install has been executed yet; downstream must verify before user use.\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 9: 存在评分风险\n\n- Trigger: no_demo\n- Host AI rule: 把风险写入边界卡，并确认是否需要人工复核。\n- Why it matters: 风险会影响是否适合普通用户安装。\n- Evidence: risks.scoring_risks | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n\n### Constraint 10: 来源证据：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies\n\n- Trigger: GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies\n- Host AI rule: 来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- Why it matters: 可能影响授权、密钥配置或安全边界。\n- Evidence: community_evidence:github | cevd_ef6deffa53c147b29e617225612e55b0 | https://github.com/firecrawl/firecrawl/issues/2814 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。\n",
      "summary": "给宿主 AI 的上下文和工作边界。",
      "title": "AI Context Pack / 带给我的 AI"
    },
    "boundary_risk_card": {
      "asset_id": "boundary_risk_card",
      "filename": "BOUNDARY_RISK_CARD.md",
      "markdown": "# Boundary & Risk Card / 安装前决策卡\n\n项目：firecrawl/firecrawl\n\n## Doramagic 试用结论\n\n当前结论：可以进入发布前推荐检查；首次使用仍应从最小权限、临时目录和可回滚配置开始。\n\n## 用户现在可以做\n\n- 可以先阅读 Human Manual，理解项目目的和主要工作流。\n- 可以复制 Prompt Preview 做安装前体验；这只验证交互感，不代表真实运行。\n- 可以把官方 Quick Start 命令放到隔离环境中验证，不要直接进主力环境。\n\n## 现在不要做\n\n- 不要把 Prompt Preview 当成项目实际运行结果。\n- 不要把 metadata-only validation 当成沙箱安装验证。\n- 不要把未验证能力写成“已支持、已跑通、可放心安装”。\n- 不要在首次试用时交出生产数据、私人文件、真实密钥或主力配置目录。\n\n## 安装前检查\n\n- 宿主 AI 是否匹配：local_cli\n- 官方安装入口状态：已发现官方入口\n- 是否在临时目录、临时宿主或容器中验证：必须是\n- 是否能回滚配置改动：必须能\n- 是否需要 API Key、网络访问、读写文件或修改宿主配置：未确认前按高风险处理\n- 是否记录了安装命令、实际输出和失败日志：必须记录\n\n## 当前阻塞项\n\n- 无阻塞项。\n\n## 项目专属踩坑\n\n- 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows（high）：可能影响升级、迁移或版本选择。 建议检查：来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- 来源证据：v2.4.0（medium）：可能增加新用户试用和生产接入成本。 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 来源证据：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions（medium）：可能增加新用户试用和生产接入成本。 建议检查：来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- 能力判断依赖假设（medium）：假设不成立时，用户拿不到承诺的能力。 建议检查：将假设转成下游验证清单。\n- 来源证据：[Feat] Emit batch scrape failures of each page to webhook（medium）：可能增加新用户试用和生产接入成本。 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n\n## 风险与权限提示\n\n- no_demo: medium\n\n## 证据缺口\n\n- 暂未发现结构化证据缺口。\n",
      "summary": "安装、权限、验证和推荐前风险。",
      "title": "Boundary & Risk Card / 边界与风险卡"
    },
    "human_manual": {
      "asset_id": "human_manual",
      "filename": "HUMAN_MANUAL.md",
      "markdown": "# https://github.com/firecrawl/firecrawl 项目说明书\n\n生成时间：2026-05-11 04:15:16 UTC\n\n## 目录\n\n- [项目概览](#project-overview)\n- [系统架构](#system-architecture)\n- [API路由与版本控制](#api-routes)\n- [抓取引擎](#scraping-engines)\n- [搜索与爬取功能](#search-crawl)\n- [数据提取系统](#extraction-system)\n- [监控与Webhook](#monitoring-webhooks)\n- [多语言SDK](#multi-language-sdks)\n- [部署与基础设施](#deployment-infra)\n- [开发指南](#development-guide)\n\n<a id='project-overview'></a>\n\n## 项目概览\n\n### 相关页面\n\n相关主题：[系统架构](#system-architecture), [多语言SDK](#multi-language-sdks)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [README.md](https://github.com/firecrawl/firecrawl/blob/main/README.md)\n- [apps/python-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/README.md)\n- [apps/js-sdk/firecrawl/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/README.md)\n- [apps/java-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/java-sdk/README.md)\n- [apps/ruby-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/ruby-sdk/README.md)\n- [apps/dotnet-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/dotnet-sdk/README.md)\n- [apps/rust-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/rust-sdk/README.md)\n- [apps/php-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/php-sdk/README.md)\n</details>\n\n# 项目概览\n\n## 项目简介\n\nFirecrawl 是一个由 Mendable.ai 开发的开源网页抓取和爬虫平台，旨在将网站转换为可供大语言模型（LLM）使用的结构化数据。Firecrawl 提供从网站搜索、内容抓取、页面交互到智能代理的全栈解决方案，帮助开发者轻松获取互联网数据并用于 AI 应用开发。\n\n项目采用多语言 SDK 架构设计，提供了 Python、Node.js、Java、Ruby、Go、.NET、Rust、PHP 等多种编程语言的官方 SDK，支持开发者使用熟悉的开发环境集成 Firecrawl 功能。资料来源：[README.md:1-50]()\n\n## 核心功能模块\n\nFirecrawl 平台提供四大核心功能模块，分别对应不同的网页数据采集场景：\n\n### Search（搜索）\n\nSearch 模块支持对互联网进行自然语言搜索，返回与查询关键词相关的网页列表。每个搜索结果包含 URL、标题和页面摘要的 Markdown 格式内容，非常适合构建知识库或信息检索应用。资料来源：[README.md:45-60]()\n\n### Scrape（抓取）\n\nScrape 是 Firecrawl 最核心的功能模块，用于从单个 URL 提取结构化数据。支持多种输出格式，包括 Markdown、HTML、JSON（通过 Schema 提取）、链接列表、截图等。开发者可以配置只提取主内容、设置等待时间、控制输出格式等参数。资料来源：[README.md:70-95]()\n\n### Interact（交互）\n\nInteract 模块支持基于抓取结果的浏览器自动化交互。用户可以先使用 Scrape 抓取页面，然后通过 AI 提示词或 JavaScript 代码与页面进行交互，如点击按钮、填写表单、搜索内容等操作。资料来源：[README.md:100-120]()\n\n### Agent（智能代理）\n\nAgent 模块是 Firecrawl 的高级功能，允许开发者使用自然语言描述目标，系统自动完成数据采集和整理。例如，开发者可以描述\"查找某公司的创始人信息\"，Agent 会自动规划搜索路径、抓取相关页面并提取结构化结果。资料来源：[apps/python-sdk/README.md:30-35]()\n\n## 系统架构\n\n### 整体架构图\n\n```mermaid\ngraph TD\n    subgraph 客户端层\n        Python[Python SDK]\n        NodeJS[Node.js SDK]\n        Java[Java SDK]\n        Ruby[Ruby SDK]\n        Go[Go SDK]\n        DotNet[.NET SDK]\n        Rust[Rust SDK]\n        PHP[PHP SDK]\n        CLI[Firecrawl CLI]\n        DirectAPI[直接 API 调用]\n    end\n\n    subgraph API 网关层\n        Gateway[API Gateway]\n        Auth[身份验证]\n        RateLimit[限流控制]\n    end\n\n    subgraph 核心服务层\n        ScrapeService[Scrape 服务]\n        CrawlService[Crawl 服务]\n        MapService[Map 服务]\n        SearchService[Search 服务]\n        AgentService[Agent 服务]\n        InteractService[Interact 服务]\n    end\n\n    subgraph 数据处理层\n        HTMLParser[HTML 解析器]\n        MarkdownConverter[Markdown 转换]\n        JSONExtractor[JSON Schema 提取]\n        ScreenshotEngine[截图引擎]\n        GoHTML2MD[Go HTML-to-MD 库]\n    end\n\n    subgraph 监控服务\n        Monitor[监控服务]\n        Notification[通知服务]\n    end\n\n    客户端层 --> API 网关层\n    API 网关层 --> 核心服务层\n    核心服务层 --> 数据处理层\n    核心服务层 --> 监控服务\n```\n\n### API 端点概览\n\n| 端点 | 方法 | 功能描述 | 异步支持 |\n|------|------|----------|----------|\n| `/v2/scrape` | POST | 抓取单个 URL 的内容 | 否 |\n| `/v2/crawl` | POST | 启动网站爬虫任务 | 是（轮询） |\n| `/v2/map` | POST | 发现网站所有 URL | 否 |\n| `/v2/search` | POST | 互联网全文搜索 | 否 |\n| `/v1/scrape` | POST | 旧版抓取接口 | 否 |\n\n资料来源：[README.md:20-80]()\n\n## 多语言 SDK 支持\n\nFirecrawl 提供了丰富的官方 SDK，覆盖主流编程语言生态：\n\n### SDK 功能对比\n\n| SDK | 包名称 | 安装方式 | 版本 | 特殊功能 |\n|-----|--------|----------|------|----------|\n| Python | `firecrawl-py` | `pip install firecrawl-py` | 2.x | Agent、异步爬虫 |\n| Node.js | `@mendable/firecrawl-js` | `npm install @mendable/firecrawl-js` | 最新 | Zod Schema 支持 |\n| Java | `com.firecrawl:firecrawl-java` | Maven/Gradle | 1.1.1 | 构建器模式 |\n| Ruby | `firecrawl-sdk` | `gem install firecrawl-sdk` | 1.0 | - |\n| Go | `github.com/firecrawl/firecrawl-go-sdk` | `go get` | - | - |\n| .NET | `firecrawl-sdk` | `dotnet add package firecrawl-sdk` | - | HttpClient 可定制 |\n| Rust | `firecrawl` | Cargo.toml | 2.1.0 | 异步运行时 |\n| PHP | `firecrawl/sdk` | Composer | - | Laravel Facade |\n\n资料来源：[apps/python-sdk/README.md:1-20]()[apps/js-sdk/firecrawl/README.md:1-30]()[apps/java-sdk/README.md:1-20]()[apps/ruby-sdk/README.md:1-25]()[apps/dotnet-sdk/README.md:1-20]()[apps/rust-sdk/README.md:1-30]()[apps/php-sdk/README.md:1-20]()\n\n### Python SDK 示例\n\n```python\nfrom firecrawl import Firecrawl\nfrom firecrawl.types import ScrapeOptions\n\nfirecrawl = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\n# 抓取单个页面\ndoc = firecrawl.scrape(\"https://firecrawl.dev\", formats=[\"markdown\"])\nprint(doc.markdown)\n\n# 批量爬虫\ndocs = firecrawl.crawl(\"https://docs.firecrawl.dev\", limit=50)\nfor doc in docs.data:\n    print(doc.metadata.source_url)\n\n# 使用 Agent\nresult = firecrawl.agent(prompt=\"查找 Stripe 公司的创始人\")\nprint(result.data)\n```\n\n资料来源：[apps/python-sdk/README.md:15-45]()\n\n### Node.js SDK 示例\n\n```javascript\nimport Firecrawl from '@mendable/firecrawl-js';\nimport { z } from 'zod';\n\nconst app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });\n\n// 使用 Zod Schema 提取结构化数据\nconst schema = z.object({\n  title: z.string(),\n  price: z.number(),\n});\n\nconst result = await app.extract({\n  urls: ['https://example.com/product'],\n  prompt: '提取产品名称和价格',\n  schema,\n});\n\nconsole.log(result.data);\n```\n\n资料来源：[apps/js-sdk/firecrawl/README.md:40-60]()\n\n## 高级功能\n\n### 批量抓取（Batch Scrape）\n\n批量抓取功能允许开发者一次性提交多个 URL 进行抓取，适合需要对多个页面进行数据采集的场景。系统会自动管理任务队列和并发控制。资料来源：[README.md:80-95]()\n\n```python\njob = app.batch_scrape([\n    \"https://firecrawl.dev\",\n    \"https://docs.firecrawl.dev\",\n    \"https://firecrawl.dev/pricing\"\n], formats=[\"markdown\"])\n\nfor doc in job.data:\n    print(doc.metadata.source_url)\n```\n\n### 文件解析（Parse）\n\nParse 功能支持上传本地文件（HTML、PDF、DOCX 等）并进行解析，无需通过 URL 抓取。该功能适用于处理本地文档或通过其他渠道获取的文件内容。资料来源：[apps/python-sdk/README.md:60-80]()\n\n```python\ndoc = firecrawl.parse(\n    b\"<!DOCTYPE html><html><body><h1>Content</h1></body></html>\",\n    filename=\"upload.html\",\n    content_type=\"text/html\",\n    options=ParseOptions(formats=[\"markdown\"]),\n)\n```\n\n### JSON Schema 提取\n\n通过 JSON Schema 定义数据结构，Firecrawl 可以自动从页面中提取符合模式的数据，返回结构化的 JSON 输出。资料来源：[apps/java-sdk/README.md:50-75]()\n\n```java\nJsonFormat jsonFmt = JsonFormat.builder()\n    .prompt(\"提取产品名称和价格\")\n    .schema(Map.of(\n        \"type\", \"object\",\n        \"properties\", Map.of(\n            \"name\", Map.of(\"type\", \"string\"),\n            \"price\", Map.of(\"type\", \"number\")\n        )\n    ))\n    .build();\n\nDocument doc = client.scrape(\"https://example.com/product\",\n    ScrapeOptions.builder()\n        .formats(List.of(jsonFmt))\n        .build());\n```\n\n### 网站地图（Map）\n\nMap 功能快速发现网站上的所有页面 URL，支持基于关键词的智能搜索排序。返回结果包含每个 URL 的标题和描述信息。资料来源：[README.md:40-50]()\n\n```python\nresult = app.map(\"https://firecrawl.dev\", search=\"pricing\")\n# 返回与 \"pricing\" 相关的 URL 列表\n```\n\n## 配置选项\n\n### ScrapeOptions 参数表\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `formats` | List[str] | [\"markdown\"] | 输出格式列表 |\n| `only_main_content` | bool | false | 仅提取主体内容 |\n| `wait_for` | int | 0 | 等待加载时间（毫秒） |\n| `timeout` | int | 60000 | 请求超时（毫秒） |\n| `remove_base64_images` | bool | true | 移除 Base64 图片 |\n| `include_raw_html` | bool | false | 包含原始 HTML |\n| `extractor_options` | dict | None | JSON 提取配置 |\n| `actions` | List[dict] | None | 自动化操作列表 |\n\n### CrawlOptions 参数表\n\n| 参数 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| `limit` | int | None | 最大页面数量 |\n| `scrape_options` | ScrapeOptions | None | 抓取配置 |\n| `poll_interval` | int | 2 | 轮询间隔（秒） |\n| `depth` | int | None | 爬虫深度限制 |\n| `allow_dangerous` | bool | false | 允许危险操作 |\n\n资料来源：[apps/python-sdk/README.md:40-65]()[apps/rust-sdk/README.md:30-60]()\n\n## 集成生态\n\nFirecrawl 与多个主流平台和工具深度集成：\n\n### AI 工具集成\n\n| 集成产品 | 说明 | 文档链接 |\n|----------|------|----------|\n| Firecrawl Skill | CLI 工具集成 | [文档](https://docs.firecrawl.dev/sdks/cli) |\n| Firecrawl MCP | Model Context Protocol 服务器 | [GitHub](https://github.com/mendableai/firecrawl-mcp-server) |\n| DeepSeek V3 Crawler | DeepSeek 模型驱动的爬虫 | [示例](../examples/deepseek-v3-crawler/README.md) |\n| Gemini 2.5 Extractor | Gemini 模型数据提取 | [示例](../examples/gemini-2.5-web-extractor/README.md) |\n\n### 平台集成\n\n| 平台 | 说明 |\n|------|------|\n| Lovable | 可在 Lovable 应用中直接使用 Firecrawl |\n| Zapier | 通过 Zapier 自动化工作流集成 |\n| n8n | 支持 n8n 工作流自动化平台 |\n\n资料来源：[README.md:120-140]()\n\n## 环境配置\n\n### API Key 配置\n\nFirecrawl 支持两种 API Key 配置方式：\n\n1. **环境变量配置**（推荐）：设置 `FIRECRAWL_API_KEY` 环境变量\n2. **代码显式传入**：在客户端初始化时直接传入 API Key\n\n### 常用环境变量\n\n| 变量名 | 说明 | 示例 |\n|--------|------|------|\n| `FIRECRAWL_API_KEY` | API 密钥（必填） | `fc-xxxxxxxxxxxx` |\n| `FIRECRAWL_API_URL` | 自托管实例 URL | `http://localhost:3002` |\n| `FIRECRAWL_BACKOFF_FACTOR` | 重试退避因子 | `0.5` |\n\n```bash\n# Bash/Shell\nexport FIRECRAWL_API_KEY=\"fc-your-api-key\"\nexport FIRECRAWL_API_URL=\"http://localhost:3002\"\n```\n\n```csharp\n// .NET\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-api-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\",\n    httpClient: new HttpClient { Timeout = TimeSpan.FromSeconds(60) }\n);\n```\n\n资料来源：[apps/dotnet-sdk/README.md:20-45]()[apps/php-sdk/README.md:25-40]()\n\n## 工作流程示例\n\n### 典型数据采集流程\n\n```mermaid\ngraph LR\n    A[确定目标网站] --> B[使用 Map 发现 URL]\n    B --> C[评估 URL 相关性]\n    C --> D[配置抓取参数]\n    D --> E[执行批量抓取]\n    E --> F[解析响应数据]\n    F --> G[存储结构化数据]\n```\n\n### 交互式数据提取流程\n\n```mermaid\ngraph TD\n    A[Scrape 抓取页面] --> B[获取 scrapeId]\n    B --> C[使用 Interact 交互]\n    C --> D[执行 JS 代码或 AI 提示]\n    D --> E[等待操作完成]\n    E --> F[获取更新后的页面状态]\n    F --> G[提取最终数据]\n```\n\n## 总结\n\nFirecrawl 是一个功能全面的网页数据采集平台，通过统一 API 和多语言 SDK 为开发者提供了便捷的网页抓取、爬虫、搜索和智能代理能力。其设计理念是简化网页数据获取的复杂性，让开发者能够专注于业务逻辑而非底层实现。无论是构建知识库、训练 AI 模型还是自动化数据采集任务，Firecrawl 都能提供可靠的解决方案。\n\n---\n\n<a id='system-architecture'></a>\n\n## 系统架构\n\n### 相关页面\n\n相关主题：[项目概览](#project-overview), [API路由与版本控制](#api-routes), [部署与基础设施](#deployment-infra)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/index.ts)\n- [apps/api/src/harness.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/harness.ts)\n- [apps/api/native/src/lib.rs](https://github.com/firecrawl/firecrawl/blob/main/apps/api/native/src/lib.rs)\n- [apps/api/src/services/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/index.ts)\n- [apps/api/src/services/queue-service.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/queue-service.ts)\n</details>\n\n# 系统架构\n\nFirecrawl 是一个现代化的网页抓取和数据提取平台，采用微服务化的 SDK 架构设计。系统由中央 API 服务器、多语言 SDK 客户端、异步任务队列服务以及原生性能优化库组成，旨在为 AI 系统提供搜索、抓取和网页交互的完整解决方案。\n\n## 整体架构概览\n\nFirecrawl 采用典型的客户端-服务器架构，API 服务器托管在 `api.firecrawl.dev`，通过 RESTful API 与多语言 SDK 进行通信。\n\n```mermaid\ngraph TD\n    A[多语言 SDK 客户端] --> B[Firecrawl API 服务器]\n    B --> C[队列服务 Queue Service]\n    B --> D[抓取引擎 Scraping Engines]\n    B --> E[原生库 Native Libraries]\n    C --> F[异步任务处理器]\n    D --> G[网站内容]\n    E --> H[HTML 转 Markdown]\n```\n\n## 核心组件\n\n### API 服务器\n\nAPI 服务器是整个系统的核心枢纽，基于 Node.js/TypeScript 构建，负责处理所有客户端请求并进行任务调度。\n\n| 组件 | 功能 | 源码位置 |\n|------|------|----------|\n| 路由控制器 | 处理 API 端点路由 | apps/api/src/index.ts |\n| 服务初始化 | 加载和管理各类服务模块 | apps/api/src/services/index.ts |\n| 测试工具 | 开发环境验证 | apps/api/src/harness.ts |\n\n### 队列服务\n\n队列服务负责管理异步任务的调度和执行，确保长时间运行的任务不会阻塞主请求线程。\n\n```typescript\n// apps/api/src/services/queue-service.ts 核心职责\n// - 任务入队和出队管理\n// - 任务状态追踪\n// - 优先级调度\n// - 失败重试机制\n```\n\n队列服务支持异步爬取、批量抓取等长时间运行的操作，客户端可以通过轮询任务 ID 来获取执行结果。\n\n### 原生性能库\n\n为了优化核心性能，Firecrawl 集成了原生语言库：\n\n| 库名称 | 语言 | 用途 |\n|--------|------|------|\n| go-html-to-md | Go | HTML 到 Markdown 的高性能转换 |\n| Rust SDK | Rust | 底层高性能操作 |\n\n```bash\n# go-html-to-md 构建命令\ncd apps/api/sharedLibs/go-html-to-md\ngo build -o <OUTPUT> -buildmode=c-shared html-to-markdown.go\n```\n\n输出文件根据操作系统不同：\n- Windows: `html-to-markdown.dll`\n- Linux: `libhtml-to-markdown.so`\n- macOS: `libhtml-to-markdown.dylib`\n\n## SDK 多语言架构\n\nFirecrawl 提供统一的 SDK 体验，覆盖主流编程语言：\n\n```mermaid\ngraph LR\n    A[统一 API 接口] --> B[Python SDK]\n    A --> C[Node.js SDK]\n    A --> D[Ruby SDK]\n    A --> E[Java SDK]\n    A --> F[.NET SDK]\n    A --> G[Rust SDK]\n    A --> H[PHP SDK]\n```\n\n| SDK | 包名/依赖 | 文档位置 |\n|-----|-----------|----------|\n| Python | `firecrawl-py` | apps/python-sdk/README.md |\n| Node.js | `@mendable/firecrawl-js` | apps/js-sdk/README.md |\n| Ruby | `firecrawl-sdk` | apps/ruby-sdk/README.md |\n| Java | `com.firecrawl:firecrawl-java` | apps/java-sdk/README.md |\n| .NET | `firecrawl-sdk` | apps/dotnet-sdk/README.md |\n| Rust | `firecrawl` | apps/rust-sdk/README.md |\n| PHP | `firecrawl-sdk` | apps/php-sdk/README.md |\n\n## 功能模块架构\n\n### 核心功能\n\n```mermaid\ngraph TD\n    subgraph Firecrawl 核心功能\n        S[Search 搜索] --> Scr[Scrape 抓取]\n        Scr --> Cr[Crawl 爬取]\n        Cr --> M[Map 站点地图]\n        M --> Ex[Extract 提取]\n        Ex --> I[Interact 交互]\n        I --> Ag[Agent 智能代理]\n    end\n```\n\n### 抓取引擎\n\n系统支持多种专业化的抓取引擎，针对不同数据源进行优化：\n\n| 引擎 | 用途 | 源码示例 |\n|------|------|----------|\n| Wikipedia 引擎 | 维基百科结构化数据 | apps/api/src/scraper/scrapeURL/engines/wikipedia/index.ts |\n| 通用引擎 | 标准网页抓取 | 默认引擎 |\n\n### 数据提取服务\n\nFirecrawl 提供基于 AI 的数据提取能力：\n\n```typescript\n// apps/api/src/lib/extract/fire-0/extraction-service-f0.ts\n// - Schema 验证\n// - 单实体/多实体提取\n// - 结果混合与去重\n```\n\n## 监控与通知系统\n\n系统包含完整的监控通知机制：\n\n```typescript\n// apps/api/src/services/notification/monitoring_email.ts\n// - 变更检测摘要邮件\n// - 新增页面通知\n// - 移除页面告警\n// - 错误统计\n```\n\n监控邮件功能支持定期发送网站变更报告，包括新增、移除、变更的页面数量统计。\n\n## 认证与配置\n\n### API 密钥管理\n\nFirecrawl 支持多种 API 密钥配置方式：\n\n| 配置方式 | 优先级 | 示例 |\n|----------|--------|------|\n| 构造函数参数 | 最高 | `Client(\"fc-your-api-key\")` |\n| 环境变量 | 次高 | `FIRECRAWL_API_KEY` |\n| 配置文件 | 最低 | 各 SDK 特定配置 |\n\n### 客户端初始化示例\n\n```python\n# Python SDK\nfrom firecrawl import Firecrawl\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n```\n\n```java\n// Java SDK\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiKey(\"fc-your-api-key\")\n    .build();\n```\n\n```rust\n// Rust SDK\nuse firecrawl::{Client, ScrapeOptions, Format, CrawlOptions};\nlet client = Client::new(\"fc-YOUR_API_KEY\")?;\n```\n\n## 数据流架构\n\n```mermaid\nsequenceDiagram\n    participant C as 客户端 SDK\n    participant A as API 服务器\n    participant Q as 队列服务\n    participant E as 抓取引擎\n    participant N as 原生库\n    \n    C->>A: 发起抓取请求\n    A->>Q: 入队异步任务\n    A-->>C: 返回任务 ID\n    Q->>E: 调度抓取任务\n    E->>N: HTML 内容处理\n    N-->>E: Markdown 输出\n    E-->>Q: 任务完成\n    C->>A: 轮询任务状态\n    A-->>C: 返回抓取结果\n```\n\n## 安全与数据处理\n\n### HTML 转义处理\n\n系统对外部数据实施严格的 HTML 转义，防止 XSS 等安全问题：\n\n```typescript\n// apps/api/src/scraper/scrapeURL/engines/wikipedia/index.ts\nfunction escapeHtml(str: string): string {\n  return str\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\");\n}\n```\n\n### 内容过滤\n\n系统内置内容安全过滤机制，包括：\n- 仅提取主体内容选项\n- 可配置的等待时间\n- 格式选择（Markdown、HTML、JSON 等）\n\n## 扩展与集成\n\n### 第三方集成\n\n| 平台 | 集成方式 | 说明 |\n|------|----------|------|\n| Mendable | Firecrawl Skill | AI 技能集成 |\n| Lovalbe | 内置支持 | 无代码平台集成 |\n| Zapier | App Integration | 自动化工作流 |\n| n8n | Workflow Nodes | 自托管自动化 |\n| Gemini | 示例项目 | AI 模型集成 |\n| DeepSeek | 示例项目 | 大语言模型爬虫 |\n\n### 品牌标识处理\n\n系统包含品牌识别模块，能够从抓取页面中提取品牌名称和 Logo 信息。\n\n## 技术栈总结\n\n| 层级 | 技术选型 |\n|------|----------|\n| API 服务器 | Node.js / TypeScript / Express |\n| 原生性能库 | Go (HTML→Markdown), Rust |\n| 队列系统 | 基于 TypeScript 的异步队列 |\n| SDK 生态 | Python, Node.js, Ruby, Java, .NET, Rust, PHP |\n| 部署方式 | 云原生，支持自托管 |\n\n该架构设计遵循松耦合原则，各组件通过明确定义的接口进行通信，便于独立扩展和维护。\n\n---\n\n<a id='api-routes'></a>\n\n## API路由与版本控制\n\n### 相关页面\n\n相关主题：[系统架构](#system-architecture), [抓取引擎](#scraping-engines), [搜索与爬取功能](#search-crawl)\n\n根据上下文，我无法找到用户指定的路由源码文件。以下是现有文档中关于 API 版本的相关信息：\n\n# API 路由与版本控制\n\n由于指定的路由源文件 (`apps/api/src/routes/v0.ts`, `apps/api/src/routes/v1.ts`, `apps/api/src/routes/v2.ts`, `apps/api/src/routes/admin.ts`, `apps/api/openapi.json`) 未出现在当前检索结果中，我无法提供详细的源码级分析。\n\n## 现有文档中的 API 版本信息\n\n根据主 README.md，以下是 v2 API 端点：\n\n| API 功能 | 端点 | 方法 | 资料来源 |\n|---------|------|------|---------|\n| 搜索 | `/v2/search` | POST | README.md |\n| 抓取 | `/v2/scrape` | POST | README.md |\n| 映射网站 | `/v2/map` | POST | README.md |\n| 批量抓取 | `/v2/batch` | POST | README.md |\n\n## SDK 支持情况\n\n| SDK 语言 | 仓库路径 | 支持版本 |\n|---------|---------|---------|\n| Python | apps/python-sdk | v1, v2 |\n| Node.js | apps/js-sdk | v1, v2 |\n| Rust | apps/rust-sdk | v1, v2 |\n| Go | apps/go-sdk | v1, v2 |\n| Ruby | apps/ruby-sdk | v1, v2 |\n| Java | apps/java-sdk | v1, v2 |\n| .NET | apps/dot-net-sdk | v1, v2 |\n| PHP | apps/php-sdk | v1, v2 |\n\n## 建议\n\n要生成完整的 API 路由与版本控制 Wiki 页面，需要检索以下文件：\n- `apps/api/src/routes/v0.ts`\n- `apps/api/src/routes/v1.ts`\n- `apps/api/src/routes/v2.ts`\n- `apps/api/src/routes/admin.ts`\n- `apps/api/openapi.json`\n\n请提供这些文件的实际内容以继续生成 Wiki 页面。\n\n---\n\n<a id='scraping-engines'></a>\n\n## 抓取引擎\n\n### 相关页面\n\n相关主题：[API路由与版本控制](#api-routes), [搜索与爬取功能](#search-crawl), [数据提取系统](#extraction-system)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/scraper/scrapeURL/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/fetch/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/fetch/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/fire-engine/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/fire-engine/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/playwright/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/playwright/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/pdf/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/pdf/index.ts)\n- [apps/api/src/scraper/scrapeURL/engines/document/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/engines/document/index.ts)\n- [apps/api/native/src/document/providers/factory.rs](https://github.com/firecrawl/firecrawl/blob/main/apps/api/native/src/document/providers/factory.rs)\n</details>\n\n# 抓取引擎\n\n## 概述\n\n抓取引擎（Scrape Engine）是 Firecrawl 系统中负责实际执行网页内容抓取的核心组件模块。它位于 `apps/api/src/scraper/scrapeURL/engines/` 目录下，采用多引擎架构设计，根据不同的内容类型和抓取需求，智能选择最适合的底层抓取实现。\n\nFirecrawl 的抓取引擎设计遵循**策略模式（Strategy Pattern）**，每个引擎实现相同的接口契约，但采用不同的技术栈来处理特定类型的内容。这种设计使得系统能够灵活应对静态网页、动态渲染页面、PDF 文档、Office 文档等多种内容源的抓取需求。\n\n抓取引擎与上层的 `scrapeURL/index.ts` 主模块协同工作，主模块负责接收抓取请求、解析配置参数、路由到合适的引擎，并最终汇总各引擎的输出结果。资料来源：[apps/api/src/scraper/scrapeURL/index.ts]()\n\n## 架构设计\n\n### 整体架构图\n\n```mermaid\ngraph TD\n    A[scrapeURL 主模块] --> B[引擎选择器]\n    B --> C[Fetch 引擎]\n    B --> D[Fire-Engine 引擎]\n    B --> E[Playwright 引擎]\n    B --> F[PDF 引擎]\n    B --> G[Document 引擎]\n    \n    C --> H[HTTP 请求处理]\n    D --> I[浏览器自动化]\n    E --> J[Chromium 实例]\n    F --> K[PDF 解析库]\n    G --> L[文档解析器]\n    \n    H --> M[HTML 响应]\n    I --> N[渲染后 DOM]\n    J --> N\n    K --> O[PDF 文本/元数据]\n    L --> P[文档内容]\n```\n\n### 引擎类型与职责\n\n| 引擎名称 | 技术实现 | 适用场景 | 内容类型 |\n|---------|---------|---------|---------|\n| Fetch | Node.js 原生 HTTP 请求 | 静态页面、API 响应 | HTML、JSON |\n| Fire-Engine | 浏览器自动化框架 | 动态渲染页面 | JavaScript 渲染后的 DOM |\n| Playwright | Chromium 实例控制 | 复杂交互页面 | 完整网页快照 |\n| PDF | PDF 解析库 | PDF 文档 | PDF 文本、元数据 |\n| Document | 文档解析器 | Office 文档 | DOCX、XLSX、PPTX |\n\n## 核心引擎详解\n\n### Fetch 引擎\n\nFetch 引擎是抓取引擎家族中最轻量的实现，位于 `apps/api/src/scraper/scrapeURL/engines/fetch/index.ts`。它直接使用 Node.js 原生的 HTTP/HTTPS 模块发起请求，适用于静态网页和 API 接口的数据抓取。\n\nFetch 引擎的主要特点包括：\n\n- **零外部依赖**：不依赖 Puppeteer、Playwright 等重型库\n- **高性能**：异步 I/O 操作，支持高并发请求\n- **可配置性**：支持自定义请求头、超时设置、代理配置\n- **Cookie 处理**：内置 Cookie 管理和会话保持\n\n该引擎特别适合抓取不依赖 JavaScript 渲染的静态内容，如博客文章、新闻页面、产品列表页等。对于需要登录认证的网站，Fetch 引擎支持通过 Cookie 或 Bearer Token 进行身份验证。\n\n### Fire-Engine 引擎\n\nFire-Engine 引擎是 Firecrawl 自研的浏览器自动化引擎，位于 `apps/api/src/scraper/scrapeURL/engines/fire-engine/index.ts`。它提供了介于轻量级 Fetch 和完整浏览器自动化之间的抓取能力。\n\nFire-Engine 的核心优势在于：\n\n- **轻量级浏览器**：相比完整的 Chromium 实例，占用资源更少\n- **JavaScript 渲染**：支持执行页面内的 JavaScript 代码\n- **DOM 操作**：提供点击、滚动、输入等交互能力\n- **截图功能**：支持页面截图和元素截图\n\n该引擎适用于需要部分 JavaScript 渲染但不需要完整浏览器环境的场景，例如单页应用（SPA）的初始内容抓取、无限滚动列表的加载等。\n\n### Playwright 引擎\n\nPlaywright 引擎是 Firecrawl 中最强大的抓取引擎，位于 `apps/api/src/scraper/scrapeURL/engines/playwright/index.ts`。它基于 Microsoft 的 Playwright 框架，提供完整的浏览器自动化能力。\n\nPlaywright 引擎的核心特性：\n\n- **多浏览器支持**：Chromium、Firefox、WebKit\n- **完整渲染**：执行所有 JavaScript，包括框架级别的代码\n- **网络拦截**：支持请求/响应拦截，可修改网络流量\n- **元素定位**：支持 CSS 选择器、XPath、文本定位\n- **等待策略**：智能等待元素出现、网络空闲等条件\n\n对于需要模拟用户行为（如登录、表单填写、点击按钮）的复杂抓取场景，Playwright 引擎是最佳选择。它还支持无头模式（headless）和有头模式（headed），可根据调试或生产环境灵活切换。\n\n### PDF 引擎\n\nPDF 引擎专门用于处理 PDF 文档的抓取和解析，位于 `apps/api/src/scraper/scrapeURL/engines/pdf/index.ts`。\n\nPDF 引擎支持的功能：\n\n- **直接下载**：从 URL 下载 PDF 文件\n- **文本提取**：从 PDF 中提取可搜索的文本内容\n- **元数据读取**：获取 PDF 的标题、作者、创建日期等元数据\n- **页面拆分**：支持按页面维度提取内容\n- **加密处理**：处理有密码保护的 PDF 文件\n\n该引擎在处理学术论文、报告、合同等 PDF 格式内容时表现出色。结合 Firecrawl 的 Map 功能，可以自动发现网站上的 PDF 资源并进行批量抓取。\n\n### Document 引擎\n\nDocument 引擎用于处理 Office 格式的文档，位于 `apps/api/src/scraper/scrapeURL/engines/document/index.ts`。它与后端原生模块 `apps/api/native/src/document/providers/factory.rs` 协同工作。\n\nDocument 引擎支持的文档格式：\n\n| 格式 | MIME 类型 | 提取内容 |\n|-----|----------|---------|\n| DOCX | application/vnd.openxmlformats-officedocument.wordprocessingml.document | 文本、段落、表格、列表 |\n| XLSX | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | 表格数据、公式 |\n| PPTX | application/vnd.openxmlformats-officedocument.presentationml.presentation | 幻灯片文本、备注 |\n\nDocument 引擎的核心优势在于其原生实现方式。通过 Rust 编写的底层解析器（位于 `apps/api/native/src/document/providers/factory.rs`），能够高效处理大文件和复杂结构的 Office 文档，同时保证内存使用的安全性。\n\n### 原生文档工厂\n\n`apps/api/native/src/document/providers/factory.rs` 是 Rust 原生模块中的核心组件，负责创建和管理各种文档格式的解析器实例。\n\n```mermaid\ngraph LR\n    A[Document Request] --> B[Factory]\n    B --> C{DocType Detection}\n    C -->|DOCX| D[DocxParser]\n    C -->|XLSX| E[XlsxParser]\n    C -->|PDF| F[PdfParser]\n    C -->|Unknown| G[Error Handler]\n    \n    D --> H[Structured Output]\n    E --> H\n    F --> H\n```\n\n工厂模式的应用确保了：\n\n- **类型安全**：编译时保证所有支持的文档类型都被处理\n- **可扩展性**：新增文档格式只需实现对应的解析 trait\n- **性能优化**：根据文档类型预分配内存，减少运行时开销\n\n## 工作流程\n\n### 抓取请求处理流程\n\n```mermaid\nsequenceDiagram\n    participant Client as 客户端\n    participant Main as scrapeURL 主模块\n    participant Router as 引擎路由器\n    participant Engine as 选中的抓取引擎\n    participant Output as 结果处理器\n    \n    Client->>Main: 发送抓取请求 (URL, Options)\n    Main->>Main: 验证 URL 和参数\n    Main->>Router: 请求引擎选择\n    Router->>Router: Content-Type 检测\n    Router->>Engine: 路由到合适引擎\n    Engine->>Engine: 执行抓取逻辑\n    Engine-->>Output: 返回原始内容\n    Output->>Output: 格式化与清洗\n    Output-->>Main: 结构化结果\n    Main-->>Client: 返回 Document 对象\n```\n\n### 引擎选择策略\n\n抓取引擎根据以下因素自动选择最合适的引擎：\n\n1. **URL 扩展名检测**：优先根据 URL 末尾的文件扩展名判断内容类型\n2. **Content-Type 响应头**：HTTP 响应头中的 Content-Type 字段\n3. **配置优先级**：用户通过 `ScrapeOptions` 明确指定的引擎类型\n4. **降级策略**：主引擎失败时自动降级到备选引擎\n\n## 配置选项\n\n抓取引擎通过 `ScrapeOptions` 对象接收配置参数：\n\n| 参数名 | 类型 | 默认值 | 说明 |\n|-------|------|-------|------|\n| formats | string[] | [\"markdown\"] | 输出格式列表 |\n| onlyMainContent | boolean | false | 仅提取主体内容 |\n| waitFor | number | 0 | 等待渲染的毫秒数 |\n| timeout | number | 30000 | 请求超时（毫秒） |\n| engine | string | \"auto\" | 强制指定引擎类型 |\n| actions | Action[] | [] | 浏览器自动化动作序列 |\n\n## SDK 集成\n\n各语言 SDK 通过统一的接口调用抓取引擎，以 Python SDK 为例：\n\n```python\nfrom firecrawl import Firecrawl\nfrom firecrawl.v2.types import ScrapeOptions\n\nfirecrawl = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\n# 基础抓取（自动选择引擎）\ndoc = firecrawl.scrape('https://example.com', formats=['markdown'])\n\n# 指定引擎抓取\ndoc = firecrawl.scrape(\n    'https://example.com',\n    formats=['markdown', 'html'],\n    options=ScrapeOptions(\n        engine='playwright',\n        wait_for=3000\n    )\n)\n```\n\n## 错误处理机制\n\n抓取引擎实现了多层次的错误处理策略：\n\n| 错误类型 | 处理策略 | 降级引擎 |\n|---------|---------|---------|\n| 网络超时 | 重试 3 次，指数退避 | Playwright |\n| 渲染失败 | 降级到 Fetch 引擎 | Fetch |\n| 解析错误 | 返回原始内容，标记警告 | - |\n| 资源不存在 | 返回 404 错误 | - |\n| 认证失败 | 返回 401 错误 | - |\n\n## 性能优化\n\n### 并发控制\n\n抓取引擎内置了并发控制机制：\n\n- **全局并发限制**：防止对目标服务器造成过大压力\n- **域名级限速**：基于域名的请求速率控制\n- **连接池复用**：减少 TCP 连接建立开销\n\n### 缓存策略\n\n- **304 响应处理**：正确处理 HTTP 条件请求\n- **ETag/Last-Modified**：支持服务端缓存验证\n- **本地缓存**：对重复请求返回缓存结果\n\n## 安全考量\n\n抓取引擎在设计时充分考虑了安全因素：\n\n- **请求来源伪装**：模拟真实浏览器请求头\n- **反爬虫规避**：内置常用反爬虫策略应对\n- **敏感信息过滤**：自动过滤密码、API Key 等敏感数据\n- **沙箱执行**：浏览器引擎在隔离环境中运行\n\n## 扩展开发指南\n\n如需添加新的抓取引擎，可按以下步骤扩展：\n\n1. 在 `engines/` 目录下创建新的引擎文件夹\n2. 实现统一的引擎接口 `BaseEngine`\n3. 在引擎路由器中注册新引擎\n4. 添加对应的配置选项处理逻辑\n5. 编写单元测试和集成测试\n\n## 相关资源\n\n- [Firecrawl API 文档](https://docs.firecrawl.dev)\n- [Python SDK 文档](../python-sdk/README.md)\n- [Node.js SDK 文档](../js-sdk/firecrawl/README.md)\n- [抓取最佳实践指南](https://docs.firecrawl.dev/guides)\n\n---\n\n<a id='search-crawl'></a>\n\n## 搜索与爬取功能\n\n### 相关页面\n\n相关主题：[抓取引擎](#scraping-engines), [数据提取系统](#extraction-system), [监控与Webhook](#monitoring-webhooks)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/search/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/search/index.ts)\n- [apps/api/src/search/execute.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/search/execute.ts)\n- [apps/api/src/search/fireEngine.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/search/fireEngine.ts)\n- [apps/api/src/search/searxng.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/search/searxng.ts)\n- [apps/api/src/scraper/WebScraper/crawler.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/WebScraper/crawler.ts)\n- [apps/api/src/scraper/WebScraper/sitemap.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/WebScraper/sitemap.ts)\n- [apps/api/src/scraper/crawler/sitemap.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/crawler/sitemap.ts)\n</details>\n\n# 搜索与爬取功能\n\n## 概述\n\nFirecrawl 的搜索与爬取功能是平台的核心能力，为 AI 系统提供网页搜索、抓取和交互能力。搜索功能允许用户在整个网络中查找信息，而爬取功能则支持对特定网站的深度遍历和数据提取。 资料来源：[README.md](https://github.com/firecrawl/firecrawl/blob/main/README.md)\n\n## 架构设计\n\n### 核心模块关系\n\n```mermaid\ngraph TD\n    A[API 入口] --> B[搜索模块 search/]\n    A --> C[爬取模块 scraper/]\n    B --> D[Fire Engine]\n    B --> E[SearXNG 集成]\n    C --> F[WebScraper]\n    C --> G[Crawler]\n    F --> H[Sitemap 解析]\n    G --> H\n    D --> I[搜索结果]\n    H --> J[爬取结果]\n```\n\n### 搜索子系统架构\n\n搜索功能通过多层抽象实现：\n\n| 组件 | 文件路径 | 职责 |\n|------|----------|------|\n| 搜索入口 | `apps/api/src/search/index.ts` | 处理 API 请求分发和参数验证 |\n| 执行引擎 | `apps/api/src/search/execute.ts` | 协调搜索执行流程 |\n| Fire Engine | `apps/api/src/search/fireEngine.ts` | 自定义搜索引擎实现 |\n| SearXNG 集成 | `apps/api/src/search/searxng.ts` | 开源搜索引擎后端适配 |\n\n## 搜索功能详解\n\n### 功能特性\n\n搜索功能支持以下核心能力：\n\n- **网络搜索**：在互联网上查找相关信息\n- **结果排序**：按相关性对结果进行排序\n- **数量限制**：支持限制返回结果数量\n- **来源控制**：可指定搜索结果来源 资料来源：[README.md:45-50](https://github.com/firecrawl/firecrawl/blob/main/README.md)\n\n### API 端点\n\n```\nPOST https://api.firecrawl.dev/v2/search\n```\n\n**请求头**：\n\n| 参数 | 说明 | 必填 |\n|------|------|------|\n| Authorization | Bearer token 认证 | 是 |\n| Content-Type | application/json | 是 |\n\n**请求体**：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| query | string | 搜索查询关键词 |\n| limit | number | 返回结果数量限制 |\n\n### 响应格式\n\n```json\n{\n  \"data\": [\n    {\n      \"url\": \"https://firecrawl.dev\",\n      \"title\": \"Firecrawl\",\n      \"markdown\": \"Turn websites into...\"\n    }\n  ]\n}\n```\n\n## 爬取功能详解\n\n### 爬取类型\n\nFirecrawl 支持两种主要的网站爬取方式：\n\n| 爬取类型 | 说明 | 适用场景 |\n|----------|------|----------|\n| **sitemap 爬取** | 通过解析网站的 sitemap.xml 发现页面 | 静态网站、结构化站点 |\n| **智能爬取** | 通过模拟浏览器行为遍历页面 | JavaScript 渲染页面、动态内容 |\n\n### Sitemap 解析模块\n\nSitemap 解析是爬取功能的基础组件：\n\n| 文件 | 职责 |\n|------|------|\n| `apps/api/src/scraper/WebScraper/sitemap.ts` | WebScraper 场景下的 sitemap 解析 |\n| `apps/api/src/scraper/crawler/sitemap.ts` | 独立爬虫场景下的 sitemap 解析 |\n\n### 核心爬取流程\n\n```mermaid\ngraph TD\n    A[开始爬取] --> B{选择爬取模式}\n    B -->|Sitemap| C[解析 sitemap.xml]\n    B -->|智能爬取| D[启动浏览器实例]\n    C --> E[提取 URL 列表]\n    D --> F[遍历页面链接]\n    E --> G[过滤有效链接]\n    F --> G\n    G --> H[抓取页面内容]\n    H --> I[提取结构化数据]\n    I --> J[返回结果]\n```\n\n### 爬取配置参数\n\n```python\nfrom firecrawl import Firecrawl\n\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\ncrawl_status = firecrawl.crawl(\n    'https://firecrawl.dev', \n    limit=100, \n    scrape_options=ScrapeOptions(formats=['markdown', 'html']),\n    poll_interval=30\n)\n```\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| limit | number | 最大抓取页面数量 |\n| scrape_options | ScrapeOptions | 抓取选项配置 |\n| poll_interval | number | 异步轮询间隔（秒） |\n| exclude_paths | string[] | 需要排除的路径 |\n\n## SDK 实现\n\n### Python SDK\n\n```python\nfrom firecrawl import Firecrawl\n\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\n# 搜索\nresults = app.search(\"best AI data tools 2024\", limit=10)\n\n# 爬取网站\ndocs = app.crawl(\"https://docs.firecrawl.dev\", limit=50)\nfor doc in docs.data:\n    print(doc.metadata.source_url, doc.markdown[:100])\n```\n\n### Node.js SDK\n\n```javascript\nimport Firecrawl from '@mendable/firecrawl-js';\n\nconst app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });\n\n// 搜索\nconst results = await app.search('best AI data tools 2024', { limit: 10 });\n\n// 爬取\nconst docs = await app.crawl('https://docs.firecrawl.dev', { \n    limit: 50,\n    scrapeOptions: { formats: ['markdown', 'html'] }\n});\n```\n\n### Java SDK\n\n```java\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiKey(\"fc-your-api-key\")\n    .build();\n\n// 爬取\nCrawlResponse response = client.crawl(\"https://example.com\", \n    CrawlOptions.builder()\n        .limit(50)\n        .build());\n\nfor (Page page : response.getData()) {\n    System.out.println(page.getMetadata().get(\"sourceURL\"));\n}\n```\n\n## 数据模型\n\n### 搜索结果模型\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| url | string | 页面 URL |\n| title | string | 页面标题 |\n| description | string | 页面描述 |\n| markdown | string | 页面内容（Markdown 格式） |\n\n### 爬取结果模型\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| data | Page[] | 抓取的页面列表 |\n| status | string | 爬取状态 |\n| credits_used | number | 消耗的 credits |\n\n### Page 模型\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| metadata | Record | 页面元数据 |\n| markdown | string | Markdown 格式内容 |\n| html | string | 原始 HTML |\n| screenshot | string | 页面截图（Base64） |\n\n## 配置选项\n\n### ScrapeOptions 配置\n\n| 选项 | 类型 | 说明 |\n|------|------|------|\n| formats | string[] | 输出格式：markdown、html、json |\n| only_main_content | boolean | 仅提取主体内容 |\n| wait_for | number | 等待渲染时间（毫秒） |\n| location | LocationConfig | 地理位置配置 |\n\n### CrawlOptions 配置\n\n| 选项 | 类型 | 默认值 | 说明 |\n|------|------|--------|------|\n| limit | number | 100 | 最大页面数 |\n| exclude_paths | string[] | [] | 排除路径 |\n| include_paths | string[] | [] | 包含路径 |\n| max_depth | number | 10 | 最大递归深度 |\n\n## 异步操作处理\n\n### 异步爬取流程\n\n```mermaid\nsequenceDiagram\n    participant Client\n    participant API\n    participant Crawler\n    participant Storage\n    \n    Client->>API: 发起爬取请求\n    API->>Crawler: 启动爬取任务\n    API-->>Client: 返回 Job ID\n    loop 轮询状态\n        Client->>API: 查询爬取状态\n        API->>Crawler: 获取进度\n        Crawler-->>API: 返回状态\n        API-->>Client: 返回状态\n    end\n    Crawler->>Storage: 保存结果\n    Client->>API: 获取完整结果\n    API->>Storage: 读取结果\n    Storage-->>API: 返回数据\n    API-->>Client: 返回完整数据\n```\n\n### 异步爬取示例\n\n```rust\n// Rust SDK 异步爬取\nlet crawl_id = app.crawl_url_async(\"https://mendable.ai\", None).await?.id;\n\n// 检查爬取状态\nlet status = app.check_crawl_status(crawl_id).await?;\n\nif status.status == CrawlStatusTypes::Completed {\n    println!(\"爬取完成: {:#?}\", status.data);\n}\n```\n\n## 错误处理\n\n| 错误类型 | 说明 | 处理建议 |\n|----------|------|----------|\n| TIMEOUT | 请求超时 | 增加超时时间或减少页面数量 |\n| RATE_LIMIT | 请求频率超限 | 使用轮询间隔或降低请求频率 |\n| INVALID_URL | URL 格式错误 | 检查 URL 格式是否正确 |\n| ACCESS_DENIED | 访问被拒绝 | 网站可能禁止爬取 |\n\n## 最佳实践\n\n### 搜索优化\n\n1. **精确查询**：使用具体关键词提高搜索准确性\n2. **限制数量**：设置合理的 limit 值避免资源浪费\n3. **结果缓存**：考虑对频繁查询的结果进行缓存\n\n### 爬取优化\n\n1. **路径过滤**：使用 exclude_paths 排除无关页面\n2. **深度控制**：合理设置 max_depth 避免过度爬取\n3. **格式选择**：根据需求选择合适的输出格式\n4. **轮询间隔**：使用合适的 poll_interval 减少 API 调用\n\n## 相关资源\n\n- Python SDK 文档：[apps/python-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/README.md)\n- Node.js SDK 文档：[apps/js-sdk/firecrawl/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/README.md)\n- Java SDK 文档：[apps/java-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/java-sdk/README.md)\n- Go SDK 文档：[apps/go-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/go-sdk/README.md)\n\n---\n\n<a id='extraction-system'></a>\n\n## 数据提取系统\n\n### 相关页面\n\n相关主题：[抓取引擎](#scraping-engines), [搜索与爬取功能](#search-crawl), [监控与Webhook](#monitoring-webhooks)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/lib/extract/extraction-service.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/extraction-service.ts)\n- [apps/api/src/lib/extract/build-document.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/build-document.ts)\n- [apps/api/src/lib/extract/build-prompts.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/build-prompts.ts)\n- [apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts)\n- [apps/api/src/lib/extract/completions/batchExtract.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/completions/batchExtract.ts)\n- [apps/api/src/lib/extract/completions/singleAnswer.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/completions/singleAnswer.ts)\n- [apps/api/src/lib/extract/reranker.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/extract/reranker.ts)\n- [apps/api/src/services/extract-queue.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/extract-queue.ts)\n- [apps/api/src/services/extract-worker.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/extract-worker.ts)\n</details>\n\n# 数据提取系统\n\n## 系统概述\n\n数据提取系统（Extract System）是Firecrawl平台的核心组件之一，负责从网页内容中提取结构化数据。该系统支持JSON Schema定义的数据提取，通过大语言模型（LLM）将非结构化的网页内容转换为符合预定义模式的高质量结构化数据。\n\n### 核心能力\n\n| 能力 | 描述 |\n|------|------|\n| 单URL提取 | 从单个网页提取结构化数据 |\n| 批量提取 | 一次处理多个URL，提高效率 |\n| Schema验证 | 使用JSON Schema验证输出数据 |\n| 智能提示词 | 自动分析和优化提取提示词 |\n| 重排序 | 对提取结果进行相关性排序 |\n\n资料来源：[apps/api/src/lib/extract/extraction-service.ts]()\n\n## 系统架构\n\n```mermaid\ngraph TD\n    A[API请求] --> B[提取队列 extract-queue]\n    B --> C[提取Worker extract-worker]\n    C --> D[提取服务 ExtractionService]\n    D --> E[构建文档 build-document]\n    D --> F[构建提示 build-prompts]\n    E --> G[完成处理 completions]\n    F --> G\n    G --> H[singleAnswer]\n    G --> I[batchExtract]\n    G --> J[analyzeSchemaAndPrompt]\n    H --> K[重排序 reranker]\n    I --> K\n    J --> F\n    K --> L[返回结构化数据]\n```\n\n### 核心组件\n\n| 组件 | 文件路径 | 职责 |\n|------|----------|------|\n| 提取服务 | extraction-service.ts | 核心提取逻辑编排 |\n| 文档构建 | build-document.ts | 构建提取结果文档 |\n| 提示词构建 | build-prompts.ts | 生成LLM提示词 |\n| 单答案处理 | singleAnswer.ts | 处理单个URL提取 |\n| 批量提取 | batchExtract.ts | 处理多URL批量提取 |\n| Schema分析 | analyzeSchemaAndPrompt.ts | 分析schema并优化提示词 |\n| 重排序器 | reranker.ts | 结果相关性排序 |\n\n资料来源：[apps/api/src/lib/extract/extraction-service.ts]()\n\n## 工作流程\n\n### 整体处理流程\n\n```mermaid\ngraph LR\n    A1[接收请求] --> B1[入队到extract-queue]\n    B1 --> C1[Worker获取任务]\n    C1 --> D1[调用ExtractionService]\n    D1 --> E1[构建提示词]\n    E1 --> F1[LLM调用]\n    F1 --> G1[Schema验证]\n    G1 --> H1[结果重排序]\n    H1 --> I1[返回结果]\n```\n\n### 批量提取流程\n\n当处理多个URL时，系统采用以下流程：\n\n1. **URL分批处理**：将URL列表分成小批次\n2. **并发LLM调用**：对每个批次并行调用LLM\n3. **结果聚合**：合并所有批次的提取结果\n4. **重排序**：根据相关性对最终结果排序\n\n资料来源：[apps/api/src/lib/extract/completions/batchExtract.ts]()\n\n## 核心模块详解\n\n### 提取服务 (ExtractionService)\n\n提取服务是整个数据提取系统的中枢，协调各组件完成数据提取任务。\n\n**主要职责：**\n- 管理提取任务的生命周期\n- 协调文档构建和提示词构建\n- 处理LLM调用和结果验证\n- 支持单条和批量提取模式\n\n资料来源：[apps/api/src/lib/extract/extraction-service.ts]()\n\n### 文档构建 (build-document)\n\n文档构建模块负责将提取的原始数据转换为标准化的文档格式。\n\n**功能特点：**\n- 规范化提取结果结构\n- 添加元数据信息\n- 处理多种输出格式\n\n资料来源：[apps/api/src/lib/extract/build-document.ts]()\n\n### 提示词构建 (build-prompts)\n\n提示词构建模块生成用于LLM的结构化提示词，包含必要的上下文和提取指令。\n\n**构建要素：**\n- 系统指令（System Prompt）\n- 用户提示（User Prompt）\n- Schema定义嵌入\n- 示例数据（可选）\n\n**自适应优化**：该模块与analyzeSchemaAndPrompt协同工作，可根据Schema自动调整提示词以提高提取准确性。\n\n资料来源：[apps/api/src/lib/extract/build-prompts.ts]()\n\n### 完成处理模块 (completions)\n\n#### 单答案处理 (singleAnswer)\n\n处理单个URL的提取请求，返回完整的结构化数据。\n\n**处理流程：**\n```mermaid\ngraph TD\n    A[输入URL和Schema] --> B[构建提示词]\n    B --> C[调用LLM]\n    C --> D[解析响应]\n    D --> E[Schema验证]\n    E --> F[返回结果]\n```\n\n资料来源：[apps/api/src/lib/extract/completions/singleAnswer.ts]()\n\n#### 批量提取 (batchExtract)\n\n支持同时处理多个URL的提取任务，适用于大规模数据采集场景。\n\n**批处理策略：**\n- 动态批次大小调整\n- 并发请求控制\n- 错误重试机制\n- 部分失败容忍\n\n资料来源：[apps/api/src/lib/extract/completions/batchExtract.ts]()\n\n#### Schema分析 (analyzeSchemaAndPrompt)\n\n分析输入的JSON Schema，评估其复杂度并提供优化建议。\n\n**分析维度：**\n| 维度 | 描述 |\n|------|------|\n| 字段数量 | Schema包含的属性数量 |\n| 嵌套深度 | 对象嵌套的层级 |\n| 数组复杂度 | 数组类型字段的复杂性 |\n| 必需字段 | 必填属性的比例 |\n\n资料来源：[apps/api/src/lib/extract/completions/analyzeSchemaAndPrompt.ts]()\n\n### 重排序器 (reranker)\n\n对提取结果进行相关性评分和排序，确保最相关的结果排在前面。\n\n**排序依据：**\n- 内容相关性评分\n- 字段完整性\n- 数据质量指标\n\n资料来源：[apps/api/src/lib/extract/reranker.ts]()\n\n## 队列与Worker机制\n\n### 提取队列 (extract-queue)\n\n提取队列负责管理待处理的提取任务，支持任务的入队、优先级调度和状态追踪。\n\n**队列特性：**\n- 异步任务处理\n- 可配置并发数\n- 任务状态监控\n- 失败重试机制\n\n资料来源：[apps/api/src/services/extract-queue.ts]()\n\n### 提取Worker (extract-worker)\n\nWorker进程从队列中获取任务并执行实际的提取操作。\n\n**工作流程：**\n```mermaid\ngraph TD\n    A[启动Worker] --> B[连接队列]\n    B --> C[等待任务]\n    C --> D{有新任务?}\n    D -->|是| E[获取任务]\n    E --> F[执行提取]\n    F --> G[更新状态]\n    G --> H[任务完成]\n    H --> C\n    D -->|否| C\n```\n\n**错误处理：**\n- 自动重试机制\n- 死信队列处理\n- 详细的错误日志\n\n资料来源：[apps/api/src/services/extract-worker.ts]()\n\n## API使用\n\n### 基本提取示例\n\n```python\nfrom firecrawl import Firecrawl\n\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\nresult = app.extract(\n    urls=[\"https://example.com/product/1\"],\n    prompt=\"提取产品名称、价格和描述\",\n    schema={\n        \"type\": \"object\",\n        \"properties\": {\n            \"name\": {\"type\": \"string\"},\n            \"price\": {\"type\": \"number\"},\n            \"description\": {\"type\": \"string\"}\n        }\n    }\n)\n```\n\n### 批量提取示例\n\n```python\nresult = app.extract(\n    urls=[\n        \"https://example.com/products/1\",\n        \"https://example.com/products/2\",\n        \"https://example.com/products/3\"\n    ],\n    prompt=\"提取所有产品的基本信息\",\n    schema={...}\n)\n```\n\n## 配置参数\n\n### 提取选项\n\n| 参数 | 类型 | 默认值 | 描述 |\n|------|------|--------|------|\n| timeout | number | 60000 | 单次请求超时时间（毫秒） |\n| maxRetries | number | 3 | 最大重试次数 |\n| batchSize | number | 10 | 批量处理大小 |\n| temperature | number | 0.0 | LLM温度参数 |\n\n### Schema配置\n\n| 属性 | 必需 | 描述 |\n|------|------|------|\n| type | 是 | JSON类型定义 |\n| properties | 是 | 属性映射 |\n| required | 否 | 必填字段列表 |\n| additionalProperties | 否 | 允许额外字段 |\n\n## 最佳实践\n\n### 1. Schema设计\n\n- 使用清晰的字段命名\n- 合理设置必填字段\n- 避免过深的嵌套结构\n- 提供明确的类型定义\n\n### 2. 性能优化\n\n- 批量提取时控制并发数\n- 合理设置超时时间\n- 使用适当的批次大小\n- 启用结果缓存（如适用）\n\n### 3. 错误处理\n\n- 实现重试机制处理临时故障\n- 验证Schema格式确保有效性\n- 检查LLM响应格式的正确性\n- 记录详细的错误信息便于调试\n\n## 相关文档\n\n- [搜索系统](../search/README.md)\n- [爬取系统](../crawl/README.md)\n- [网站地图](../map/README.md)\n- [监控服务](../monitor/README.md)\n\n---\n\n<a id='monitoring-webhooks'></a>\n\n## 监控与Webhook\n\n### 相关页面\n\n相关主题：[数据提取系统](#extraction-system), [搜索与爬取功能](#search-crawl), [部署与基础设施](#deployment-infra)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/api/src/services/monitoring/scheduler.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/scheduler.ts)\n- [apps/api/src/services/monitoring/runner.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/runner.ts)\n- [apps/api/src/services/monitoring/store.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/store.ts)\n- [apps/api/src/services/monitoring/diff.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/diff.ts)\n- [apps/api/src/services/webhook/delivery.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/webhook/delivery.ts)\n- [apps/api/src/services/webhook/queue.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/webhook/queue.ts)\n- [apps/api/src/services/ab-test-comparison.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/ab-test-comparison.ts)\n</details>\n\n# 监控与Webhook\n\n## 概述\n\nFirecrawl 的监控（Monitoring）与Webhook系统为用户提供了持续追踪网站变化和接收实时事件通知的能力。监控服务通过定期检查网页内容，自动检测新增、移除、修改的页面以及抓取错误，并通过邮件或Webhook渠道向用户推送变更摘要。该系统由多个子模块组成，包括调度器（Scheduler）、执行器（Runner）、存储层（Store）、差异检测（Diff）、Webhook投递（Delivery）和Webhook队列（Queue），它们协同工作以实现可靠的变化检测与通知投递。资料来源：[apps/api/src/services/notification/monitoring_email.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/notification/monitoring_email.ts)\n\n## 监控模块架构\n\n### 整体流程\n\n```mermaid\ngraph TD\n    A[调度器 Scheduler] --> B[执行器 Runner]\n    B --> C[存储层 Store]\n    C --> D[差异检测 Diff]\n    D --> E[变更汇总]\n    E --> F[通知发送]\n    F --> G[邮件通知]\n    F --> H[Webhook投递]\n    \n    B --> I[抓取目标网页]\n    I --> J[当前快照]\n    C --> K[历史快照]\n    D --> J\n    D --> K\n```\n\n### 调度器（Scheduler）\n\n调度器负责管理监控任务的定时触发。系统会根据用户配置的检查间隔自动执行监控检查，确保在设定的时间周期内持续追踪目标网站的变化。调度器需要处理并发调度、避免重复执行、以及处理任务超时等场景。资料来源：[apps/api/src/services/monitoring/scheduler.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/scheduler.ts)\n\n### 执行器（Runner）\n\n执行器是监控任务的核心执行单元，负责实际执行网页抓取和内容采集。当调度器触发检查任务时，执行器会启动浏览器实例或发送抓取请求，获取目标页面的当前内容。执行器还需要处理抓取过程中的异常情况，如网络超时、页面加载失败、反爬虫机制等，并将错误信息记录到监控结果中。资料来源：[apps/api/src/services/monitoring/runner.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/runner.ts)\n\n### 存储层（Store）\n\n存储层负责持久化管理监控相关的所有数据，包括监控配置、快照历史、检查记录和变更汇总。Store模块提供了数据的读写接口，确保即使在服务重启后也能恢复监控状态。存储的数据模型通常包含以下核心实体：\n\n| 实体名称 | 描述 | 主要字段 |\n|---------|------|---------|\n| Monitor | 监控配置 | ID、URL、轮询间隔、通知设置、API密钥 |\n| MonitorCheck | 单次检查记录 | ID、监控ID、执行时间、状态、变更统计 |\n| PageSnapshot | 页面快照 | ID、检查ID、页面URL、内容哈希、原始内容 |\n| MonitoringEmailPage | 变更页面详情 | URL、标题、变更类型 |\n\n资料来源：[apps/api/src/services/monitoring/store.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/store.ts)\n\n### 差异检测（Diff）\n\n差异检测模块负责对比当前快照与历史快照，识别页面内容的实际变化。该模块采用内容哈希比对和结构化解析相结合的方式，能够区分真正的内容变更与动态元素（如时间戳、广告）的随机变化。Diff模块的输出包括变更类型（新增/移除/修改）、变更位置、以及变更的详细摘要，便于用户快速理解网站发生的变化。资料来源：[apps/api/src/services/monitoring/diff.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/monitoring/diff.ts)\n\n## 变更统计模型\n\n监控系统的变更统计采用四维计数模型，全面覆盖网站变化的各个方面：\n\n| 统计类型 | 字段名 | 描述 |\n|---------|--------|------|\n| 新增页面 | `new_count` | 在本次检查中新发现的页面 |\n| 移除页面 | `removed_count` | 在本次检查中消失的页面 |\n| 内容变更 | `changed_count` | 内容发生变化的现有页面 |\n| 抓取错误 | `error_count` | 抓取失败的页面数量 |\n\n当所有统计值均为零时，系统会跳过邮件通知发送，以减少不必要的通知骚扰。资料来源：[apps/api/src/services/notification/monitoring_email.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/notification/monitoring_email.ts)\n\n## Webhook系统架构\n\n### Webhook事件类型\n\nFirecrawl的Webhook系统支持多种事件类型，覆盖异步任务的完整生命周期：\n\n| 事件类型 | 触发时机 | 用途 |\n|---------|---------|------|\n| `started` | 任务开始执行时 | 通知任务已启动 |\n| `action` | 中间操作发生时 | 报告任务进度或关键步骤 |\n| `completed` | 任务成功完成时 | 传递成功结果数据 |\n| `failed` | 任务执行失败时 | 返回错误信息和原因 |\n| `cancelled` | 任务被取消时 | 通知任务终止状态 |\n\n资料来源：[apps/api/src/controllers/v2/types.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/controllers/v2/types.ts)\n\n### Webhook投递流程\n\n```mermaid\ngraph LR\n    A[事件触发] --> B[Webhook队列]\n    B --> C{重试次数检查}\n    C -->|未超过限制| D[投递请求]\n    D --> E{HTTP响应}\n    E -->|2xx成功| F[完成]\n    E -->|失败| G[指数退避]\n    G --> B\n    C -->|超过限制| H[标记失败]\n```\n\n### 投递服务（Delivery）\n\nWebhook投递服务负责将事件负载发送到用户配置的端点。投递服务需要处理HTTPS连接、TLS证书验证、请求签名（用于安全验证）等技术细节。投递服务支持自定义请求头、请求体格式配置，以及不同类型事件的差异化负载结构。资料来源：[apps/api/src/services/webhook/delivery.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/webhook/delivery.ts)\n\n### 队列管理（Queue）\n\nWebhook队列提供了可靠投递的保障机制。当投递失败时（如网络错误或目标服务器返回非2xx状态码），队列系统会执行指数退避重试策略，在预设的最大重试次数内持续尝试投递。队列还负责管理不同优先级的事件，确保高优先级事件优先处理。资料来源：[apps/api/src/services/webhook/queue.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/webhook/queue.ts)\n\n## 邮件通知系统\n\n### 通知内容结构\n\n邮件通知采用HTML模板格式，包含以下核心信息：\n\n- **变更汇总**：新增页面数、移除页面数、错误页面数、总检查页面数\n- **变更详情列表**：列出发生变化的页面URL和标题\n- **检查标识**：用于追踪本次检查的检查ID\n- **资源消耗**：本次检查使用的积分数量\n\n邮件内容会对特殊字符进行HTML转义处理，防止XSS攻击。资料来源：[apps/api/src/services/notification/monitoring_email.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/notification/monitoring_email.ts)\n\n### 发送条件\n\n邮件通知仅在以下条件同时满足时发送：\n\n1. 监控配置中已启用邮件通知（`notification.email.enabled === true`）\n2. 本次检查检测到至少一个变更（任意统计值大于0）\n\n```typescript\nif (\n  params.check.changed_count +\n    params.check.new_count +\n    params.check.removed_count +\n    params.check.error_count <= 0\n) {\n  // 跳过无变更的邮件通知\n  return { attempted: false, success: true, recipients: [] };\n}\n```\n\n资料来源：[apps/api/src/services/notification/monitoring_email.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/notification/monitoring_email.ts)\n\n## A/B测试对比功能\n\n除了基础的变更检测，Firecrawl还提供了A/B测试对比功能，允许用户对比两个不同版本或不同来源的抓取结果。该功能支持并行执行两个抓取任务，并对结果进行差异分析，适用于SEO对比、竞品分析、版本验证等场景。资料来源：[apps/api/src/services/ab-test-comparison.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/services/ab-test-comparison.ts)\n\n## 配置选项\n\n### 监控配置参数\n\n| 参数名 | 类型 | 必填 | 描述 |\n|-------|------|------|------|\n| url | string | 是 | 要监控的目标URL |\n| pollInterval | number | 否 | 轮询间隔（秒），默认根据订阅计划确定 |\n| notification.email.enabled | boolean | 否 | 是否启用邮件通知 |\n| notification.webhook.url | string | 否 | Webhook回调URL |\n| notification.webhook.events | string[] | 否 | 订阅的事件类型列表 |\n| scrapeOptions | object | 否 | 抓取选项（formats、onlyMainContent等） |\n\n### Webhook配置参数\n\n| 参数名 | 类型 | 描述 |\n|-------|------|------|\n| maxRetries | number | 最大重试次数，默认3次 |\n| backoffFactor | number | 指数退避因子（秒），默认0.5 |\n| timeout | number | 单次投递超时（毫秒） |\n\n## 错误处理机制\n\n### 监控错误分类\n\n| 错误类型 | 处理方式 | 影响范围 |\n|---------|---------|---------|\n| 网络超时 | 记录错误、重试 | 单次检查标记为失败 |\n| 页面加载失败 | 记录错误、跳过内容对比 | 计入error_count统计 |\n| 解析异常 | 记录错误、保留原始内容 | 可能导致Diff不准确 |\n\n### Webhook投递错误\n\nWebhook投递失败时，系统会根据HTTP响应状态码采取不同策略：\n\n| 状态码范围 | 处理策略 |\n|-----------|---------|\n| 2xx | 投递成功，任务完成 |\n| 4xx（除429） | 永久失败，不重试 |\n| 429/5xx | 指数退避重试，直到达到最大次数 |\n\n## 安全考虑\n\n### Webhook安全\n\n- **请求签名**：Webhook请求包含签名头，用于验证消息来源\n- **HTTPS强制**：仅支持HTTPS端点，确保传输安全\n- **幂等性设计**：Webhook投递设计为幂等操作，允许安全重放\n\n### 数据保护\n\n- **敏感信息过滤**：邮件通知中的敏感数据经过适当处理\n- **HTML转义**：所有用户提供的URL和标题在邮件中经过HTML转义\n\n## 最佳实践\n\n1. **合理设置轮询间隔**：根据网站更新频率调整，避免过度抓取\n2. **配置多个通知渠道**：同时启用邮件和Webhook，确保重要变更不被遗漏\n3. **设置Webhook重试机制**：利用指数退避策略提高投递可靠性\n4. **利用A/B对比功能**：在重要更新前后进行结果对比验证\n5. **监控积分消耗**：定期检查creditsUsed字段，合理规划监控规模\n\n## 相关文档\n\n- [Python SDK文档](../sdks/python.md)\n- [Node.js SDK文档](../sdks/node.md)\n- [API v2参考](../api-reference/v2.md)\n- [认证与授权](../guides/authentication.md)\n\n---\n\n<a id='multi-language-sdks'></a>\n\n## 多语言SDK\n\n### 相关页面\n\n相关主题：[项目概览](#project-overview), [API路由与版本控制](#api-routes)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [apps/python-sdk/firecrawl/__init__.py](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/firecrawl/__init__.py)\n- [apps/python-sdk/firecrawl/v2/client.py](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/firecrawl/v2/client.py)\n- [apps/js-sdk/firecrawl/src/index.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/src/index.ts)\n- [apps/js-sdk/firecrawl/src/v2/client.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/src/v2/client.ts)\n- [apps/java-sdk/src/main/java/com/firecrawl/client/FirecrawlClient.java](https://github.com/firecrawl/firecrawl/blob/main/apps/java-sdk/src/main/java/com/firecrawl/client/FirecrawlClient.java)\n- [apps/go-sdk/firecrawl.go](https://github.com/firecrawl/firecrawl/blob/main/apps/go-sdk/firecrawl.go)\n- [apps/rust-sdk/src/client.rs](https://github.com/firecrawl/firecrawl/blob/main/apps/rust-sdk/src/client.rs)\n- [apps/dotnet-sdk/Firecrawl/FirecrawlClient.cs](https://github.com/firecrawl/firecrawl/blob/main/apps/dotnet-sdk/Firecrawl/FirecrawlClient.cs)\n</details>\n\n# 多语言SDK\n\n## 概述\n\nFirecrawl 多语言SDK是一组官方支持的客户端库，旨在为开发者提供跨编程语言的统一接口，以便轻松访问Firecrawl的网页搜索、抓取和交互功能。这些SDK自动处理HTTP请求、身份验证、响应解析以及异步操作的轮询机制，使开发者能够在Python、JavaScript、Java、Go、Rust、.NET、Ruby等多种主流编程语言中使用Firecrawl服务。\n\n## 支持的编程语言\n\nFirecrawl目前官方支持以下编程语言的SDK：\n\n| 编程语言 | 包名称 | 安装命令 | 主要类/客户端 |\n|---------|--------|---------|--------------|\n| Python | `firecrawl-py` | `pip install firecrawl-py` | `Firecrawl` |\n| JavaScript/TypeScript | `@mendable/firecrawl-js` | `npm install @mendable/firecrawl-js` | `Firecrawl` |\n| Java | `firecrawl-java` | Maven/Gradle依赖 | `FirecrawlClient` |\n| Go | `firecrawl-sdk` | `go get` | `Firecrawl` |\n| Rust | `firecrawl` | Cargo.toml | `Client` |\n| .NET | `firecrawl-sdk` | `dotnet add package firecrawl-sdk` | `FirecrawlClient` |\n| Ruby | `firecrawl-sdk` | `gem install firecrawl-sdk` | `Client` |\n\n## 核心功能\n\n所有SDK都提供一致的核心功能集，确保开发者无论使用何种编程语言都能获得相同的能力：\n\n```mermaid\ngraph TD\n    A[Firecrawl SDK] --> B[Search 搜索]\n    A --> C[Scrape 网页抓取]\n    A --> D[Crawl 网站爬取]\n    A --> E[Parse 文件解析]\n    A --> F[Map 站点地图]\n    A --> G[Interact 页面交互]\n    A --> H[Extract 结构化提取]\n    \n    B --> I[返回搜索结果]\n    C --> J[返回文档内容]\n    D --> K[批量页面抓取]\n    E --> L[支持HTML/PDF/DOCX]\n    F --> M[URL列表生成]\n    G --> N[浏览器自动化]\n    H --> O[JSON Schema提取]\n```\n\n## 客户端初始化\n\n### 认证方式\n\n所有SDK支持两种API密钥配置方式：\n\n**方式一：通过构造函数直接传入**\n\n```python\n# Python\nfrom firecrawl import Firecrawl\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n```\n\n```javascript\n// JavaScript/TypeScript\nimport Firecrawl from '@mendable/firecrawl-js';\nconst app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });\n```\n\n```java\n// Java\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiKey(\"fc-your-api-key\")\n    .build();\n```\n\n```csharp\n// .NET\nvar client = new FirecrawlClient(\"fc-your-api-key\");\n```\n\n**方式二：通过环境变量自动加载**\n\n各SDK会优先读取环境变量`FIRECRAWL_API_KEY`：\n\n```python\n# Python - 无需传入API key，自动从环境变量读取\napp = Firecrawl.from_env()\n```\n\n```java\n// Java - 默认从FIRECRAWL_API_KEY环境变量读取\nFirecrawlClient client = FirecrawlClient.fromEnv();\n```\n\n```ruby\n# Ruby\nclient = Firecrawl::Client.from_env\n```\n\n```go\n// Go\nclient := firecrawl.NewClient(os.Getenv(\"FIRECRAWL_API_KEY\"), \"\")\n```\n\n### 自定义API端点\n\n对于自托管的Firecrawl实例，部分SDK支持自定义API URL：\n\n```csharp\n// .NET - 自定义API URL\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-api-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\");\n```\n\n```javascript\n// JavaScript/TypeScript - 可在初始化时配置\nconst app = new Firecrawl({ \n    apiKey: \"fc-your-api-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\"\n});\n```\n\n## 核心API\n\n### Search 搜索\n\n在网络上搜索相关内容，返回与查询匹配的URL和摘要：\n\n```python\n# Python\nresults = app.search(\"best AI data tools 2024\", limit=10)\n```\n\n```javascript\n// JavaScript\nconst results = await app.search('firecrawl', { limit: 5 });\n```\n\n```rust\n// Rust\nlet response = client.search(\"best web scraping tools 2024\", None).await?;\n```\n\n### Scrape 网页抓取\n\n从单个URL提取内容，支持多种输出格式：\n\n| 参数 | 类型 | 说明 |\n|-----|------|------|\n| `url` | string | 目标网页URL |\n| `formats` | array | 输出格式：`markdown`, `html`, `json`, `screenshot`等 |\n| `onlyMainContent` | boolean | 仅提取主要内容 |\n| `waitFor` | number | 等待渲染的毫秒数 |\n\n```python\n# Python\ndoc = app.scrape('https://firecrawl.dev', formats=['markdown', 'html'])\nprint(doc.markdown)\n```\n\n```java\n// Java\nDocument doc = client.scrape(\"https://example.com\",\n    ScrapeOptions.builder()\n        .formats(List.of(\"markdown\"))\n        .build());\n```\n\n```csharp\n// .NET\nvar doc = await client.ScrapeAsync(\"https://example.com\",\n    new ScrapeOptions { Formats = new List<object> { \"markdown\" } });\n```\n\n### Crawl 网站爬取\n\n批量爬取网站页面，支持自动轮询等待完成：\n\n```python\n# Python - 自动等待爬取完成\ndocs = app.crawl('https://docs.firecrawl.dev', limit=50)\nfor doc in docs.data:\n    print(doc.metadata.source_url)\n```\n\n```ruby\n# Ruby - 自动轮询模式\njob = client.crawl(\"https://example.com\",\n  Firecrawl::Models::CrawlOptions.new(limit: 50))\njob.data.each { |doc| puts doc.markdown }\n```\n\n```rust\n// Rust\nlet options = CrawlOptions {\n    limit: Some(50),\n    ..Default::default()\n};\nlet result = client.crawl(\"https://docs.firecrawl.dev\", options).await?;\n```\n\n### Map 站点地图\n\n生成网站的URL列表，用于了解站点结构：\n\n```javascript\n// JavaScript\nconst mapResult = await app.map('https://example.com');\nconsole.log(mapResult);\n```\n\n### Interact 页面交互\n\n在抓取页面后执行浏览器自动化操作：\n\n```python\n# Python\nresult = app.scrape(\"https://amazon.com\")\nscrape_id = result.metadata.scrape_id\napp.interact(scrape_id, prompt=\"Search for 'mechanical keyboard'\")\n```\n\n```java\n// Java\nDocument doc = client.scrape(\"https://example.com\");\nString scrapeId = String.valueOf(doc.getMetadata().get(\"scrapeId\"));\nBrowserExecuteResponse exec = client.interact(scrapeId, \"console.log(await page.title());\");\n```\n\n### Extract 结构化提取\n\n根据prompt和schema从页面提取结构化数据：\n\n```javascript\n// JavaScript - 支持Zod schema\nconst schema = z.object({\n  title: z.string(),\n});\nconst result = await app.extract({\n  urls: ['https://firecrawl.dev'],\n  prompt: 'Extract the page title',\n  schema,\n});\n```\n\n### Batch Scrape 批量抓取\n\n一次性抓取多个URL：\n\n```python\n# Python\njob = app.batch_scrape([\n    \"https://firecrawl.dev\",\n    \"https://docs.firecrawl.dev\",\n], formats=[\"markdown\"])\nfor doc in job.data:\n    print(doc.metadata.source_url)\n```\n\n### Parse 文件解析\n\n解析上传的本地文件（HTML、PDF、DOCX等）：\n\n```python\n# Python\ndoc = firecrawl.parse(\n  b\"<!DOCTYPE html><html><body><h1>Content</h1></body></html>\",\n  filename=\"upload.html\",\n  content_type=\"text/html\",\n  options=ParseOptions(formats=[\"markdown\"]),\n)\n```\n\n```java\n// Java\nParseFile file = ParseFile.builder()\n    .filename(\"upload.html\")\n    .content(\"<!DOCTYPE html>...\".getBytes())\n    .contentType(\"text/html\")\n    .build();\nDocument parsed = client.parse(file,\n    ParseOptions.builder()\n        .formats(List.of(\"markdown\"))\n        .build());\n```\n\n## 异步操作\n\n### 异步爬取工作流\n\n```mermaid\nsequenceDiagram\n    participant 客户端\n    participant Firecrawl API\n    participant 用户\n    \n    客户端->>Firecrawl API: start_crawl/startCrawl\n    Firecrawl API-->>客户端: 返回job_id\n    客户端->>Firecrawl API: get_crawl_status(job_id)\n    Firecrawl API-->>客户端: status: in_progress\n    客户端->>Firecrawl API: get_crawl_status(job_id)\n    Firecrawl API-->>客户端: status: completed, data: [...]\n```\n\n### 异步爬取示例\n\n```javascript\n// JavaScript/TypeScript - 开始异步爬取\nconst start = await app.startCrawl('https://mendable.ai', {\n  excludePaths: ['blog/*'],\n  limit: 5,\n});\n\n// 检查爬取状态\nconst status = await app.getCrawlStatus(start.id);\nconsole.log(status.status);\n```\n\n```ruby\n# Ruby - 异步爬取\nresponse = client.start_crawl(\"https://example.com\",\n  Firecrawl::Models::CrawlOptions.new(limit: 10))\nputs response.id\n\n# 检查状态\nstatus = client.get_crawl_status(response.id)\nputs status.status\n\n# 取消爬取\nclient.cancel_crawl(response.id)\n```\n\n## 数据模型\n\n### Document 文档对象\n\nSDK返回的文档对象通常包含以下属性：\n\n| 属性 | 类型 | 说明 |\n|-----|------|------|\n| `markdown` | string | 页面内容的Markdown格式 |\n| `html` | string | 原始HTML内容 |\n| `metadata` | object | 元数据（标题、描述、来源URL等） |\n| `raw` | object | 原始响应数据 |\n| `json` | object | 提取的JSON数据（当使用json格式时） |\n\n```python\n# Python - 访问文档属性\ndoc = app.scrape('https://example.com')\nprint(doc.markdown)       # Markdown内容\nprint(doc.metadata.title) # 页面标题\nprint(doc.metadata.source_url) # 来源URL\n```\n\n### ScrapeOptions 抓取选项\n\n| 选项 | 类型 | 说明 |\n|-----|------|------|\n| `formats` | array | 输出格式列表 |\n| `onlyMainContent` | boolean | 仅提取主要内容，移除噪音 |\n| `waitFor` | number | 等待JavaScript渲染的毫秒数 |\n| `headers` | object | 自定义HTTP头 |\n| `proxy` | string | 代理设置 |\n\n## 错误处理\n\n各SDK使用各自语言的原生错误处理机制：\n\n```python\n# Python - 使用异常处理\ntry:\n    doc = app.scrape('https://example.com')\nexcept Exception as e:\n    print(f\"抓取失败: {e}\")\n```\n\n```rust\n// Rust - 使用Result类型\nmatch scrape_result {\n    Ok(data) => println!(\"{}\", data.markdown),\n    Err(e) => eprintln!(\"抓取失败: {}\", e),\n}\n```\n\n```java\n// Java - 异常处理\ntry {\n    Document doc = client.scrape(\"https://example.com\", options);\n} catch (FirecrawlException e) {\n    System.err.println(\"API错误: \" + e.getMessage());\n}\n```\n\n## SDK架构对比\n\n```mermaid\ngraph LR\n    subgraph Python\n        P1[Firecrawl类]\n        P2[v2.Client]\n    end\n    \n    subgraph JavaScript\n        J1[Firecrawl类]\n        J2[v2.Client]\n    end\n    \n    subgraph Java\n        K1[FirecrawlClient]\n        K2[Builder模式]\n    end\n    \n    subgraph Rust\n        R1[Client结构体]\n        R2[异步方法]\n    end\n    \n    P1 --> P2\n    J1 --> J2\n    K1 --> K2\n    R1 --> R2\n```\n\n## 依赖要求\n\n| SDK | 最低版本要求 | 额外依赖 |\n|-----|------------|---------|\n| Python | Python 3.8+ | `requests` |\n| JavaScript | Node.js兼容 | - |\n| Java | JDK 11+ | - |\n| Go | Go 1.16+ | - |\n| Rust | Rust最新稳定版 | `tokio` (异步运行时) |\n| .NET | .NET Core 6.0+ | - |\n| Ruby | Ruby 3.0+ | - |\n\n## 最佳实践\n\n### 1. 环境变量管理\n\n建议在生产环境中使用环境变量存储API密钥：\n\n```bash\n# 设置环境变量\nexport FIRECRAWL_API_KEY=\"fc-your-api-key\"\n```\n\n### 2. 异步操作处理\n\n对于大量页面的爬取任务，使用异步方法并实现适当的重试机制：\n\n```python\n# Python - 配置重试和超时\nfrom firecrawl import Firecrawl\napp = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\ndocs = app.crawl('https://example.com', limit=100, poll_interval=30)\n```\n\n### 3. 错误重试\n\n```python\n# Python - 实现重试逻辑\nimport time\ndef scrape_with_retry(url, max_retries=3):\n    for i in range(max_retries):\n        try:\n            return app.scrape(url)\n        except Exception as e:\n            if i == max_retries - 1:\n                raise\n            time.sleep(2 ** i)\n```\n\n## 相关资源\n\n- Python SDK源码：[apps/python-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/python-sdk)\n- JavaScript SDK源码：[apps/js-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/js-sdk)\n- Java SDK源码：[apps/java-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/java-sdk)\n- Go SDK源码：[apps/go-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/go-sdk)\n- Rust SDK源码：[apps/rust-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/rust-sdk)\n- .NET SDK源码：[apps/dotnet-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/dotnet-sdk)\n- Ruby SDK源码：[apps/ruby-sdk/](https://github.com/firecrawl/firecrawl/tree/main/apps/ruby-sdk)\n\n---\n\n<a id='deployment-infra'></a>\n\n## 部署与基础设施\n\n### 相关页面\n\n相关主题：[系统架构](#system-architecture), [项目概览](#project-overview)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [README.md](https://github.com/firecrawl/firecrawl/blob/main/README.md)\n- [examples/kubernetes/firecrawl-helm/README.md](https://github.com/firecrawl/firecrawl/blob/main/examples/kubernetes/firecrawl-helm/README.md)\n- [apps/python-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/README.md)\n- [apps/js-sdk/firecrawl/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/README.md)\n- [apps/api/src/lib/branding/prompt.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/branding/prompt.ts)\n</details>\n\n# 部署与基础设施\n\n## 概述\n\nFirecrawl 的部署与基础设施体系支持多种部署模式，包括本地开发、Docker 容器化部署、Kubernetes 集群部署以及云原生架构。该项目采用微服务架构，主要包含 API 服务、Playwright 渲染服务、Redis 缓存层和数据库存储层等核心组件。通过 Helm Chart 和 Docker Compose 两种主流编排工具，开发者可以灵活选择适合自身环境的部署方案。\n\nFirecrawl 的基础设施设计遵循以下核心原则：可扩展性支持水平扩展以应对高并发场景；多架构支持涵盖 x86 和 ARM64 平台；环境隔离通过容器化实现开发与生产环境的统一；可观测性内置日志、监控和追踪能力。\n\n## 系统架构\n\n### 整体架构图\n\n```mermaid\ngraph TD\n    A[客户端请求] --> B[API 网关 / 负载均衡]\n    B --> C[Firecrawl API 服务]\n    C --> D[Redis 缓存层]\n    C --> E[PostgreSQL 数据库]\n    C --> F[Playwright 服务]\n    F --> G[浏览器实例池]\n    G --> H[渲染后的页面内容]\n    H --> C\n    C --> I[返回 LLM 可用的数据格式]\n```\n\n### 核心组件\n\n| 组件名称 | 技术栈 | 功能描述 |\n|---------|--------|---------|\n| Firecrawl API | Node.js/TypeScript | 核心 REST API 服务，处理爬取、搜索、交互请求 |\n| Playwright 服务 | TypeScript + Playwright | 浏览器自动化渲染，支持截图和 JavaScript 执行 |\n| Redis | Redis | 任务队列、缓存、会话存储 |\n| PostgreSQL | PostgreSQL | 持久化存储爬取任务、文档数据、用户信息 |\n| 多语言 SDK | Python/JS/Ruby/PHP/Go/Rust/.NET/Java | 官方客户端库，简化 API 集成 |\n\n资料来源：[README.md:1-50]()\n\n## Docker 容器化部署\n\n### 多架构镜像构建\n\nFirecrawl 支持同时构建适用于 x86_64 (amd64) 和 ARM64 (arm64) 架构的 Docker 镜像。这对于在 Apple Silicon Mac 或基于 ARM 的云服务器上运行的场景尤为重要。\n\n```bash\n# 创建并使用 docker buildx 构建器\ndocker buildx create --name multiarch --use --bootstrap\n\n# 构建并推送多架构镜像\ndocker buildx build --platform linux/amd64,linux/arm64 --push \\\n  -t docker.io/winkkgmbh/firecrawl:latest \\\n  ../../../apps/api\n```\n\n资料来源：[examples/kubernetes/firecrawl-helm/README.md:45-55]()\n\n### 官方镜像仓库\n\nFirecrawl 维护以下官方容器镜像：\n\n| 镜像名称 | 用途 | 仓库地址 |\n|---------|------|---------|\n| firecrawl | 主 API 服务 | ghcr.io/firecrawl/firecrawl |\n| playwright-service | 浏览器渲染服务 | ghcr.io/firecrawl/playwright-service |\n| nuq-postgres | 数据库服务 | ghcr.io/firecrawl/nuq-postgres |\n\n开发者可以使用这些官方镜像快速部署，或通过 docker-compose.yaml 进行本地开发环境搭建。\n\n## Kubernetes 部署\n\n### Helm Chart 架构\n\nFirecrawl 提供完整的 Helm Chart 用于 Kubernetes 集群部署，支持通过 values.yaml 进行灵活配置。Chart 遵循 Kubernetes 最佳实践，包括健康检查探针、资源限制、环境变量配置和持久化存储。\n\n```bash\n# 基础部署命令\nHELM_NO_PLUGINS=1 helm upgrade firecrawl . \\\n  -f values.yaml \\\n  -f overlays/prod/values.yaml \\\n  -n firecrawl \\\n  --install \\\n  --create-namespace\n```\n\n资料来源：[examples/kubernetes/firecrawl-helm/README.md:25-35]()\n\n### 生产环境配置\n\n生产环境部署通常需要合并多层配置文件：\n\n```yaml\n# 生产环境覆盖配置示例\nreplicaCount: 3\nimage:\n  repository: ghcr.io/firecrawl/firecrawl\nresources:\n  requests:\n    memory: \"512Mi\"\n    cpu: \"250m\"\n  limits:\n    memory: \"2Gi\"\n    cpu: \"1000m\"\n```\n\n### 使用官方镜像\n\n对于纯 x86 架构的集群，可以直接使用官方预构建镜像：\n\n```bash\nHELM_NO_PLUGINS=1 helm upgrade firecrawl . \\\n  -f values.yaml \\\n  --set image.repository=ghcr.io/firecrawl/firecrawl \\\n  --set playwright.repository=ghcr.io/firecrawl/playwright-service \\\n  --set nuqPostgres.image.repository=ghcr.io/firecrawl/nuq-postgres \\\n  -n firecrawl \\\n  --install \\\n  --create-namespace\n```\n\n资料来源：[examples/kubernetes/firecrawl-helm/README.md:36-48]()\n\n## 环境变量配置\n\n### 必需配置项\n\n| 环境变量 | 说明 | 示例值 |\n|---------|------|--------|\n| `FIRECRAWL_API_KEY` | API 认证密钥 | `fc-your-api-key-here` |\n| `DATABASE_URL` | PostgreSQL 连接字符串 | `postgresql://user:pass@host:5432/db` |\n| `REDIS_URL` | Redis 连接字符串 | `redis://localhost:6379` |\n\n### SDK 环境配置\n\n各语言 SDK 均支持从环境变量自动读取配置：\n\n```python\n# Python SDK\nfrom firecrawl import Firecrawl\napp = Firecrawl()  # 自动读取 FIRECRAWL_API_KEY\n\n# JavaScript SDK\nconst app = new Firecrawl({ apiKey: process.env.FIRECRAWL_API_KEY });\n\n# Ruby SDK\nclient = Firecrawl::Client.from_env  # 读取 FIRECRAWL_API_KEY\n\n# PHP SDK\n$client = FirecrawlClient::fromEnv();\n```\n\n```bash\n# Shell 环境配置\nexport FIRECRAWL_API_KEY=\"fc-your-api-key-here\"\n# 可选：自定义 API URL（用于自托管实例）\nexport FIRECRAWL_API_URL=\"http://localhost:3002\"\n```\n\n资料来源：[apps/python-sdk/README.md:1-30](), [apps/js-sdk/firecrawl/README.md:1-25](), [apps/ruby-sdk/README.md:1-20](), [apps/php-sdk/README.md:1-20]()\n\n## 服务发现与网络\n\n### 服务间通信\n\n```mermaid\ngraph LR\n    A[SDK 客户端] -->|HTTPS| B[API 服务 :3000]\n    B -->|内部通信| C[Playwright 服务 :3001]\n    B -->|TCP| D[Redis :6379]\n    B -->|TCP| E[PostgreSQL :5432]\n```\n\nAPI 服务默认监听 3000 端口，Playwright 渲染服务默认监听 3001 端口。服务间通过内部网络通信，无需对外暴露。\n\n### 自托管实例配置\n\n对于自托管部署，可以通过环境变量指定自定义 API 地址：\n\n```csharp\n// .NET SDK\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-api-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\"\n);\n```\n\n```java\n// Java SDK\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiUrl(\"https://your-firecrawl-instance.com\")\n    .apiKey(\"fc-your-api-key\")\n    .build();\n```\n\n## 资源规划\n\n### 推荐资源配置\n\n| 环境规模 | API副本 | Playwright副本 | Redis | PostgreSQL |\n|---------|--------|---------------|-------|-----------|\n| 开发/测试 | 1 | 1 | 1GB | 10GB |\n| 小规模生产 | 2 | 2 | 4GB | 50GB |\n| 中等规模 | 5 | 5 | 8GB | 200GB |\n| 大规模 | 10+ | 10+ | 16GB+ | 500GB+ |\n\n### 健康检查配置\n\nKubernetes 部署中包含以下健康检查：\n\n- **存活探针 (Liveness Probe)**：检测服务是否存活，失败时重启容器\n- **就绪探针 (Readiness Probe)**：检测服务是否就绪，失败时停止接收流量\n- **启动探针 (Startup Probe)**：给予服务足够时间完成初始化\n\n## 安全考虑\n\n### 网络策略\n\n生产环境建议配置 Kubernetes NetworkPolicy，限制以下流量：\n\n- API 服务仅接收来自负载均衡器的流量\n- Playwright 服务仅接收来自 API 服务的内部流量\n- 数据库仅接收来自 API 服务的流量\n- Redis 仅接收来自 API 服务的流量\n\n### 密钥管理\n\nAPI 密钥应通过 Kubernetes Secret 或外部密钥管理服务（如 AWS Secrets Manager、HashiCorp Vault）存储，避免在 values.yaml 中明文配置。\n\n## 监控与日志\n\n### 日志聚合\n\nFirecrawl API 服务输出结构化日志，建议通过以下方式收集：\n\n- **标准输出/标准错误**：Kubernetes 默认收集方式\n- **日志聚合器**：如 Fluentd、Filebeat 收集到 Elasticsearch/Loki\n- **云原生方案**：CloudWatch Logs、Azure Monitor、Google Cloud Logging\n\n### 关键指标\n\n| 指标名称 | 说明 | 告警阈值建议 |\n|---------|------|-------------|\n| 请求延迟 P99 | API 响应时间 | > 10s |\n| 错误率 | 5xx 错误占比 | > 5% |\n| 队列深度 | Redis 待处理任务数 | > 1000 |\n| 浏览器实例数 | Playwright 活跃实例 | < 2（表示可能泄漏） |\n\n## 备份与恢复\n\n### 数据库备份\n\nPostgreSQL 数据库应配置以下备份策略：\n\n- **自动全量备份**：每日执行，保留 30 天\n- **增量备份**：每 6 小时执行\n- **点时间恢复 (PITR)**：启用 Write-Ahead Log (WAL) 归档\n\n### 灾难恢复\n\n灾难恢复计划应包含：\n\n1. **RTO（恢复时间目标）**：< 4 小时\n2. **RPO（恢复点目标）**：< 1 小时\n3. **恢复流程文档化**：包含步骤验证清单\n4. **定期演练**：每季度执行恢复演练\n\n## 部署最佳实践\n\n### CI/CD 集成\n\n```yaml\n# 示例 GitHub Actions 部署流程\ndeploy:\n  runs-on: ubuntu-latest\n  steps:\n    - uses: actions/checkout@v4\n    - name: Build and push images\n      run: |\n        docker buildx build \\\n          --platform linux/amd64,linux/arm64 \\\n          --push \\\n          -t ${{ env.REGISTRY }}/firecrawl:${{ github.sha }} .\n    - name: Deploy to Kubernetes\n      run: |\n        helm upgrade firecrawl ./charts/firecrawl \\\n          --set image.tag=${{ github.sha }}\n```\n\n### 滚动更新策略\n\n建议使用 `RollingUpdate` 策略配置蓝绿部署或滚动更新：\n\n```yaml\nstrategy:\n  type: RollingUpdate\n  rollingUpdate:\n    maxSurge: 1\n    maxUnavailable: 0\n```\n\n## 相关文档\n\n- [SDK 文档](../sdks/overview.md)\n- [API 参考](../api-reference/overview.md)\n- [自托管指南](./self-hosting.md)\n\n---\n\n<a id='development-guide'></a>\n\n## 开发指南\n\n### 相关页面\n\n相关主题：[系统架构](#system-architecture), [项目概览](#project-overview)\n\n<details>\n<summary>相关源码文件</summary>\n\n以下源码文件用于生成本页说明：\n\n- [CONTRIBUTING.md](https://github.com/firecrawl/firecrawl/blob/main/CONTRIBUTING.md)\n- [apps/api/jest.config.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/jest.config.ts)\n- [apps/api/knip.config.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/knip.config.ts)\n- [apps/api/src/scraper/scrapeURL/scrapeURL.test.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/scraper/scrapeURL/scrapeURL.test.ts)\n- [apps/api/src/lib/validateUrl.test.ts](https://github.com/firecrawl/firecrawl/blob/main/apps/api/src/lib/validateUrl.test.ts)\n- [apps/test-suite/jest.config.js](https://github.com/firecrawl/firecrawl/blob/main/apps/test-suite/jest.config.js)\n- [apps/python-sdk/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/python-sdk/README.md)\n- [apps/js-sdk/firecrawl/README.md](https://github.com/firecrawl/firecrawl/blob/main/apps/js-sdk/firecrawl/README.md)\n</details>\n\n# 开发指南\n\n本文档为 Firecrawl 项目提供全面的开发指南，涵盖开发环境配置、代码规范、测试策略、多语言 SDK 开发等内容。\n\n## 项目概述\n\nFirecrawl 是一个用于搜索、抓取网页内容并将其转换为 LLM 可用格式的 web scraping 工具。项目采用多语言 SDK 架构，核心 API 服务使用 TypeScript/Node.js 开发，同时提供 Python、JavaScript/TypeScript、Rust、Go、Java、Ruby、.NET 等多语言 SDK。\n\n```mermaid\ngraph TB\n    subgraph 核心服务\n        A[API Server<br/>TypeScript/Node.js]\n        B[Playwright Service]\n        C[数据库服务]\n    end\n    \n    subgraph SDK层\n        D[Python SDK]\n        E[JS/TS SDK]\n        F[Rust SDK]\n        G[Go SDK]\n        H[Java SDK]\n        I[Ruby SDK]\n        J[.NET SDK]\n    end\n    \n    K[外部用户]\n    \n    A --> B\n    A --> C\n    K --> D\n    K --> E\n    K --> F\n    K --> G\n    K --> H\n    K --> I\n    K --> J\n    D --> A\n    E --> A\n    F --> A\n    G --> A\n```\n\n## 开发环境配置\n\n### 环境要求\n\n根据不同开发任务，需要安装以下环境：\n\n| 组件 | 版本要求 | 用途 |\n|------|----------|------|\n| Node.js | 18+ | API 服务开发 |\n| Python | 3.9+ | Python SDK 开发 |\n| Rust | 1.70+ | Rust SDK 开发 |\n| Java | 11+ | Java SDK 开发 |\n| Go | 1.20+ | Go SDK 开发 |\n| Ruby | 3.0+ | Ruby SDK 开发 |\n| .NET | 6.0+ | .NET SDK 开发 |\n| Gradle | 8+ | Java SDK 构建 |\n\n### 项目结构\n\n```\nfirecrawl/\n├── apps/\n│   ├── api/                    # 核心 API 服务 (TypeScript)\n│   ├── playwright-service-ts/   # Playwright 浏览器服务\n│   ├── python-sdk/              # Python SDK\n│   ├── js-sdk/                  # JavaScript/TypeScript SDK\n│   ├── rust-sdk/                # Rust SDK\n│   ├── go-sdk/                  # Go SDK\n│   ├── java-sdk/                # Java SDK\n│   ├── ruby-sdk/                # Ruby SDK\n│   ├── dot-net-sdk/             # .NET SDK\n│   └── test-suite/              # 测试套件\n├── examples/                    # 使用示例\n│   └── kubernetes/              # Kubernetes 部署配置\n└── sharedLibs/                  # 共享库\n    └── go-html-to-md/           # Go HTML 转 Markdown 库\n```\n\n## 代码规范与工具链\n\n### 代码质量工具\n\nFirecrawl 项目使用 Knip 进行代码质量检查和未使用依赖分析。配置文件位于 `apps/api/knip.config.ts`：\n\n```typescript\n// apps/api/knip.config.ts\nimport type { KnipConfig } from \"knip\";\nconst config: KnipConfig = {\n  // 入口文件和项目结构配置\n  project: [\"**/*.{ts,tsx,js,jsx}\"],\n  // 忽略的文件\n  ignore: [\"**/*.test.ts\", \"**/node_modules/**\"],\n};\nexport default config;\n```\n\n### 代码检查命令\n\n```bash\n# 运行 Knip 检查\nnpx knip\n\n# 或添加自定义配置\nnpx knip --config knip.config.ts\n```\n\n### Linting 配置\n\n项目采用标准的 ESLint 配置，建议在提交前运行 lint 检查确保代码风格一致。\n\n## 测试策略\n\n### 测试框架\n\nFirecrawl 使用 Jest 作为主要的测试框架。API 服务和测试套件分别有不同的配置文件。\n\n#### API 服务测试配置\n\n```typescript\n// apps/api/jest.config.ts\nimport type { Config } from \"jest\";\n\nconst config: Config = {\n  preset: \"ts-jest\",\n  testEnvironment: \"node\",\n  roots: [\"<rootDir>/src\"],\n  testMatch: [\"**/*.test.ts\"],\n  transform: {\n    \"^.+\\\\.tsx?$\": [\"ts-jest\", {\n      tsconfig: \"tsconfig.json\",\n    }],\n  },\n  moduleNameMapper: {\n    \"^@/(.*)$\": \"<rootDir>/src/$1\",\n  },\n};\n\nexport default config;\n```\n\n#### 测试套件配置\n\n```javascript\n// apps/test-suite/jest.config.js\nmodule.exports = {\n  testEnvironment: \"node\",\n  testMatch: [\"**/*.test.{js,ts}\"],\n  // 测试超时设置\n  testTimeout: 30000,\n};\n```\n\n### 编写测试用例\n\n#### URL 验证测试示例\n\n```typescript\n// apps/api/src/lib/validateUrl.test.ts\nimport { validateUrl } from \"./validateUrl\";\n\ndescribe(\"URL Validation\", () => {\n  it(\"should validate correct URLs\", () => {\n    expect(validateUrl(\"https://example.com\")).toBe(true);\n    expect(validateUrl(\"http://test.org/path\")).toBe(true);\n  });\n\n  it(\"should reject invalid URLs\", () => {\n    expect(validateUrl(\"not-a-url\")).toBe(false);\n    expect(validateUrl(\"ftp://invalid-protocol.com\")).toBe(false);\n  });\n});\n```\n\n#### 抓取功能测试示例\n\n```typescript\n// apps/api/src/scraper/scrapeURL/scrapeURL.test.ts\nimport { scrapeURL } from \"./scrapeURL\";\nimport { FirecrawlDocument } from \"../../../models/firecrawl-document\";\n\ndescribe(\"scrapeURL\", () => {\n  const mockUrl = \"https://example.com\";\n  const mockOptions = {\n    formats: [\"markdown\", \"html\"] as const,\n    onlyMainContent: true,\n  };\n\n  it(\"should scrape a URL and return markdown\", async () => {\n    const result: FirecrawlDocument = await scrapeURL(mockUrl, mockOptions);\n    \n    expect(result.markdown).toBeDefined();\n    expect(result.markdown).not.toBeEmpty();\n  });\n\n  it(\"should respect onlyMainContent option\", async () => {\n    const result = await scrapeURL(mockUrl, mockOptions);\n    \n    expect(result.markdown).not.toContain(\"<nav>\");\n    expect(result.markdown).not.toContain(\"<header>\");\n  });\n});\n```\n\n### 运行测试\n\n```bash\n# 运行所有测试\nnpm test\n\n# 运行特定测试文件\nnpm test -- validateUrl.test.ts\n\n# 运行测试并生成覆盖率报告\nnpm test -- --coverage\n\n# 运行测试套件\ncd apps/test-suite && npm test\n```\n\n### 测试最佳实践\n\n| 实践 | 说明 | 资料来源 |\n|------|------|----------|\n| 测试文件命名 | 使用 `.test.ts` 后缀 | `apps/api/jest.config.ts:6` |\n| 测试环境隔离 | 每个测试独立运行 | `apps/api/jest.config.ts:5` |\n| 模拟外部依赖 | 使用 Jest mocks | `apps/api/src/scraper/scrapeURL/scrapeURL.test.ts` |\n| 异步测试 | 使用 async/await | `apps/api/src/scraper/scrapeURL/scrapeURL.test.ts:12` |\n| 超时配置 | 复杂测试设置超时 | `apps/test-suite/jest.config.js:6` |\n\n## 多语言 SDK 开发\n\n### Python SDK\n\n#### 环境配置\n\n```python\n# 使用虚拟环境\npython -m venv venv\nsource venv/bin/activate  # Linux/Mac\n# 或\n.\\venv\\Scripts\\activate   # Windows\n\n# 安装依赖\npip install firecrawl\n```\n\n#### 快速开始\n\n```python\n# apps/python-sdk/README.md\nfrom firecrawl import Firecrawl\n\n# 创建客户端\nfirecrawl = Firecrawl(api_key=\"fc-YOUR_API_KEY\")\n\n# 抓取网页\nscrape_result = firecrawl.scrape(\n    'https://firecrawl.dev', \n    formats=['markdown', 'html']\n)\nprint(scrape_result)\n\n# 爬取网站\ncrawl_status = firecrawl.crawl(\n    'https://firecrawl.dev', \n    limit=100, \n    scrape_options=ScrapeOptions(formats=['markdown', 'html']),\n    poll_interval=30\n)\n```\n\n#### SDK 包结构\n\n| 模块 | 功能 |\n|------|------|\n| `firecrawl` | 主客户端类 |\n| `firecrawl.v2.types` | 类型定义 (ParseOptions, ScrapeOptions) |\n\n### JavaScript/TypeScript SDK\n\n#### 环境配置\n\n```bash\nnpm install @mendable/firecrawl-js\n```\n\n#### 快速开始\n\n```typescript\n// apps/js-sdk/firecrawl/README.md\nimport Firecrawl from '@mendable/firecrawl-js';\n\nconst app = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });\n\n// 搜索\nconst searchResult = await app.search(\"firecrawl\", { limit: 5 });\n\n// 抓取\nconst scrapeResult = await app.scrape('https://example.com', {\n  formats: ['markdown', 'html'],\n  onlyMainContent: true,\n});\n\n// 爬取\nconst crawlResult = await app.crawl('https://firecrawl.dev', {\n  limit: 100,\n  scrapeOptions: { formats: ['markdown', 'html'] },\n});\n```\n\n#### 异步爬取\n\n```typescript\n// 启动异步爬取任务\nconst start = await app.startCrawl('https://mendable.ai', {\n  excludePaths: ['blog/*'],\n  limit: 5,\n});\n\n// 检查爬取状态\nconst status = await app.getCrawlStatus(start.jobId);\n```\n\n### Rust SDK\n\n#### 环境配置\n\n```toml\n# apps/rust-sdk/README.md\n[dependencies]\nfirecrawl = \"2.1.0\"\ntokio = { version = \"^1\", features = [\"full\"] }\n```\n\n#### 快速开始\n\n```rust\nuse firecrawl::{Client, ScrapeOptions, Format, CrawlOptions};\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    let client = Client::new(\"fc-YOUR_API_KEY\")?;\n\n    // 抓取 URL\n    let document = client.scrape(\"https://firecrawl.dev\", None).await?;\n    println!(\"{:?}\", document.markdown);\n\n    // 爬取网站\n    let options = CrawlOptions {\n        limit: Some(50),\n        ..Default::default()\n    };\n    let result = client.crawl(\"https://docs.firecrawl.dev\", options).await?;\n\n    // 搜索\n    let response = client.search(\"best web scraping tools 2024\", None).await?;\n\n    Ok(())\n}\n```\n\n### Java SDK\n\n#### 环境配置\n\n```groovy\n// apps/java-sdk/README.md\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation 'com.firecrawl:firecrawl-java:1.1.1'\n}\n```\n\n#### 快速开始\n\n```java\nimport com.firecrawl.client.FirecrawlClient;\nimport com.firecrawl.models.*;\nimport java.util.List;\n\n// 创建客户端\nFirecrawlClient client = FirecrawlClient.builder()\n    .apiKey(\"fc-your-api-key\")\n    .build();\n\n// 抓取网页\nDocument doc = client.scrape(\"https://example.com\",\n    ScrapeOptions.builder()\n        .formats(List.of(\"markdown\"))\n        .build());\n\nSystem.out.println(doc.getMarkdown());\n```\n\n### .NET SDK\n\n#### 环境配置\n\n```bash\ndotnet add package firecrawl-sdk\n```\n\n#### 快速开始\n\n```csharp\n// apps/dotnet-sdk/README.md\nusing Firecrawl;\nusing Firecrawl.Models;\n\nvar client = new FirecrawlClient(\"fc-your-api-key\");\n\n// 抓取单个页面\nvar doc = await client.ScrapeAsync(\"https://example.com\",\n    new ScrapeOptions { Formats = new List<object> { \"markdown\" } });\n\nConsole.WriteLine(doc.Markdown);\n```\n\n### Go SDK\n\nGo SDK 位于 `apps/go-sdk`，提供与 Firecrawl API 交互的 Go 语言接口。\n\n### Ruby SDK\n\n#### 环境配置\n\n```ruby\n# apps/ruby-sdk/README.md\ngem \"firecrawl-sdk\", \"~> 1.0\"\n```\n\n#### 快速开始\n\n```ruby\nrequire \"firecrawl\"\n\n# 创建客户端\nclient = Firecrawl::Client.new(api_key: \"fc-your-api-key\")\n\n# 抓取单个页面\ndoc = client.scrape(\"https://example.com\")\nputs doc.markdown\n```\n\n## 贡献指南\n\n### 提交流程\n\n1. **Fork 仓库** - 从主仓库创建个人分支\n2. **创建分支** - 使用描述性的分支名称\n   ```bash\n   git checkout -b feature/your-feature-name\n   ```\n3. **编写代码** - 遵循项目的代码规范\n4. **添加测试** - 确保新功能有对应的测试用例\n5. **运行测试** - 提交前确保所有测试通过\n6. **提交更改** - 编写清晰的提交信息\n7. **创建 Pull Request** - 描述更改内容和动机\n\n### 代码审查要点\n\n| 审查项 | 要求 | 资料来源 |\n|--------|------|----------|\n| 代码风格 | 通过 lint 检查 | `apps/api/knip.config.ts` |\n| 测试覆盖 | 新功能必须包含测试 | `apps/api/jest.config.ts` |\n| 文档更新 | 更新相关 README | `CONTRIBUTING.md` |\n| 向后兼容 | 不破坏现有 API | 多语言 SDK 文档 |\n\n### 开发工作流\n\n```mermaid\ngraph LR\n    A[创建分支] --> B[编写代码]\n    B --> C[添加测试]\n    C --> D[运行测试]\n    D --> E{测试通过?}\n    E -->|否| F[修复问题]\n    F --> D\n    E -->|是| G[提交代码]\n    G --> H[创建 PR]\n    H --> I[代码审查]\n    I --> J{审查通过?}\n    J -->|否| K[修改代码]\n    K --> I\n    J -->|是| L[合并到主分支]\n```\n\n## 调试与问题排查\n\n### 常见问题\n\n#### 1. 测试失败\n\n```bash\n# 查看详细错误信息\nnpm test -- --verbose\n\n# 运行单个测试\nnpm test -- validateUrl.test.ts --verbose\n\n# 调试模式\nnpm test -- --inspect-brk\n```\n\n#### 2. API 连接问题\n\n检查以下配置：\n- `FIRECRAWL_API_KEY` 环境变量是否设置\n- API 端点是否可访问\n- 网络代理配置是否正确\n\n#### 3. SDK 导入错误\n\n确保安装了正确版本的 SDK：\n\n| SDK | 最低版本 |\n|-----|----------|\n| Python | firecrawl 2.x |\n| JavaScript | @mendable/firecrawl-js 0.x |\n| Rust | firecrawl 2.1.0 |\n| Java | firecrawl-java 1.1.1 |\n\n## 高级配置\n\n### 自定义 API 端点\n\n对于自托管实例，可以指定自定义 API URL：\n\n```typescript\n// JavaScript SDK\nconst app = new Firecrawl({ \n  apiKey: \"fc-your-key\",\n  apiUrl: \"https://your-firecrawl-instance.com\"\n});\n```\n\n```python\n# Python SDK\nfirecrawl = Firecrawl(\n    api_key=\"fc-your-key\",\n    api_url=\"https://your-firecrawl-instance.com\"\n)\n```\n\n```csharp\n// .NET SDK\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-key\",\n    apiUrl: \"https://your-firecrawl-instance.com\"\n);\n```\n\n### 自定义 HTTP 客户端\n\n```csharp\n// .NET SDK - 自定义 HttpClient\nvar httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(60) };\nvar client = new FirecrawlClient(\n    apiKey: \"fc-your-api-key\",\n    httpClient: httpClient);\n```\n\n### 环境变量配置\n\n| 变量名 | 说明 | 用途 |\n|--------|------|------|\n| `FIRECRAWL_API_KEY` | API 密钥 | 认证 |\n| `FIRECRAWL_API_URL` | API 端点 (可选) | 自托管实例 |\n| `FIRECRAWL_RATE_LIMIT` | 请求限速 | 避免 API 限流 |\n\n## 相关资源\n\n- [官方文档](https://docs.firecrawl.dev)\n- [API 参考](https://docs.firecrawl.dev/api-reference)\n- [GitHub 仓库](https://github.com/firecrawl/firecrawl)\n- [Firecrawl 官网](https://firecrawl.dev)\n\n---\n\n---\n\n## Doramagic 踩坑日志\n\n项目：firecrawl/firecrawl\n\n摘要：发现 21 个潜在踩坑项，其中 1 个为 high/blocking；最高优先级：安全/权限坑 - 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows。\n\n## 1. 安全/权限坑 · 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows\n\n- 严重度：high\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows\n- 对用户的影响：可能影响升级、迁移或版本选择。\n- 建议检查：来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_0bf31b0e8c3b45fb8da04cebb259c8a4 | https://github.com/firecrawl/firecrawl/issues/3500 | 来源类型 github_issue 暴露的待验证使用条件。\n\n## 2. 安装坑 · 来源证据：v2.4.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安装相关的待验证问题：v2.4.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_e1e417d6cea44fb79118e4daeac083a0 | https://github.com/firecrawl/firecrawl/releases/tag/v2.4.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 3. 配置坑 · 来源证据：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个配置相关的待验证问题：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_aa487261676d400197da5f3646baff2f | https://github.com/firecrawl/firecrawl/issues/3498 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 4. 能力坑 · 能力判断依赖假设\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：README/documentation is current enough for a first validation pass.\n- 对用户的影响：假设不成立时，用户拿不到承诺的能力。\n- 建议检查：将假设转成下游验证清单。\n- 防护动作：假设必须转成验证项；没有验证结果前不能写成事实。\n- 证据：capability.assumptions | github_repo:787076358 | https://github.com/firecrawl/firecrawl | README/documentation is current enough for a first validation pass.\n\n## 5. 运行坑 · 来源证据：[Feat] Emit batch scrape failures of each page to webhook\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个运行相关的待验证问题：[Feat] Emit batch scrape failures of each page to webhook\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_80c638d597cc432b9a74e7e336b043ee | https://github.com/firecrawl/firecrawl/issues/2576 | 来源类型 github_issue 暴露的待验证使用条件。\n\n## 6. 维护坑 · 维护活跃度未知\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：未记录 last_activity_observed。\n- 对用户的影响：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。\n- 建议检查：补 GitHub 最近 commit、release、issue/PR 响应信号。\n- 防护动作：维护活跃度未知时，推荐强度不能标为高信任。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | last_activity_observed missing\n\n## 7. 安全/权限坑 · 下游验证发现风险项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：下游已经要求复核，不能在页面中弱化。\n- 建议检查：进入安全/权限治理复核队列。\n- 防护动作：下游风险存在时必须保持 review/recommendation 降级。\n- 证据：downstream_validation.risk_items | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium\n\n## 8. 安全/权限坑 · 存在安全注意事项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：No sandbox install has been executed yet; downstream must verify before user use.\n- 对用户的影响：用户安装前需要知道权限边界和敏感操作。\n- 建议检查：转成明确权限清单和安全审查提示。\n- 防护动作：安全注意事项必须面向用户前置展示。\n- 证据：risks.safety_notes | github_repo:787076358 | https://github.com/firecrawl/firecrawl | No sandbox install has been executed yet; downstream must verify before user use.\n\n## 9. 安全/权限坑 · 存在评分风险\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：风险会影响是否适合普通用户安装。\n- 建议检查：把风险写入边界卡，并确认是否需要人工复核。\n- 防护动作：评分风险必须进入边界卡，不能只作为内部分数。\n- 证据：risks.scoring_risks | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium\n\n## 10. 安全/权限坑 · 来源证据：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_ef6deffa53c147b29e617225612e55b0 | https://github.com/firecrawl/firecrawl/issues/2814 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 11. 安全/权限坑 · 来源证据：v2.0.1\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.0.1\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_0334c6a4c3284763a02c66ac96ce9c0c | https://github.com/firecrawl/firecrawl/releases/tag/v2.0.1 | 来源类型 github_release 暴露的待验证使用条件。\n\n## 12. 安全/权限坑 · 来源证据：v2.1.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.1.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_360eac170b12452583bb9b7072acc4e3 | https://github.com/firecrawl/firecrawl/releases/tag/v2.1.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 13. 安全/权限坑 · 来源证据：v2.2.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.2.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_749e0e1b86ba455585d343764588f00e | https://github.com/firecrawl/firecrawl/releases/tag/v2.2.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 14. 安全/权限坑 · 来源证据：v2.3.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.3.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_e6f1735e34a34eacb7b77e7bb21644a6 | https://github.com/firecrawl/firecrawl/releases/tag/v2.3.0 | 来源讨论提到 npm 相关条件，需在安装/试用前复核。\n\n## 15. 安全/权限坑 · 来源证据：v2.5.0 - The World's Best Web Data API\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.5.0 - The World's Best Web Data API\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_4f928a2f370b4186ba4031bc4830020c | https://github.com/firecrawl/firecrawl/releases/tag/v2.5.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 16. 安全/权限坑 · 来源证据：v2.6.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.6.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_38343ea51e374e86a5081e46c837468c | https://github.com/firecrawl/firecrawl/releases/tag/v2.6.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 17. 安全/权限坑 · 来源证据：v2.7.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.7.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_4e1fdfc9cb714147a228b5ae01d273f2 | https://github.com/firecrawl/firecrawl/releases/tag/v2.7.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 18. 安全/权限坑 · 来源证据：v2.8.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.8.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_dd78eff5694c40cba109ef1230e1dc77 | https://github.com/firecrawl/firecrawl/releases/tag/v2.8.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 19. 安全/权限坑 · 来源证据：v2.9.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.9.0\n- 对用户的影响：可能阻塞安装或首次运行。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_a6219f53b7de4f31bb8ca1c7109fd49d | https://github.com/firecrawl/firecrawl/releases/tag/v2.9.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 20. 维护坑 · issue/PR 响应质量未知\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：issue_or_pr_quality=unknown。\n- 对用户的影响：用户无法判断遇到问题后是否有人维护。\n- 建议检查：抽样最近 issue/PR，判断是否长期无人处理。\n- 防护动作：issue/PR 响应未知时，必须提示维护风险。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | issue_or_pr_quality=unknown\n\n## 21. 维护坑 · 发布节奏不明确\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：release_recency=unknown。\n- 对用户的影响：安装命令和文档可能落后于代码，用户踩坑概率升高。\n- 建议检查：确认最近 release/tag 和 README 安装命令是否一致。\n- 防护动作：发布节奏未知或过期时，安装说明必须标注可能漂移。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | release_recency=unknown\n\n<!-- canonical_name: firecrawl/firecrawl; human_manual_source: deepwiki_human_wiki -->\n",
      "summary": "DeepWiki/Human Wiki 完整输出，末尾追加 Discovery Agent 踩坑日志。",
      "title": "Human Manual / 人类版说明书"
    },
    "pitfall_log": {
      "asset_id": "pitfall_log",
      "filename": "PITFALL_LOG.md",
      "markdown": "# Pitfall Log / 踩坑日志\n\n项目：firecrawl/firecrawl\n\n摘要：发现 21 个潜在踩坑项，其中 1 个为 high/blocking；最高优先级：安全/权限坑 - 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows。\n\n## 1. 安全/权限坑 · 来源证据：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows\n\n- 严重度：high\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：RFC: Lightweight External Memory Capsule Pattern for Firecrawl Agent Workflows\n- 对用户的影响：可能影响升级、迁移或版本选择。\n- 建议检查：来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_0bf31b0e8c3b45fb8da04cebb259c8a4 | https://github.com/firecrawl/firecrawl/issues/3500 | 来源类型 github_issue 暴露的待验证使用条件。\n\n## 2. 安装坑 · 来源证据：v2.4.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安装相关的待验证问题：v2.4.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_e1e417d6cea44fb79118e4daeac083a0 | https://github.com/firecrawl/firecrawl/releases/tag/v2.4.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 3. 配置坑 · 来源证据：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个配置相关的待验证问题：[Bug] /interact with language=\"python\" flakily fails with TargetClosedError on scrape-bound sessions\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源问题仍为 open，Pack Agent 需要复核是否仍影响当前版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_aa487261676d400197da5f3646baff2f | https://github.com/firecrawl/firecrawl/issues/3498 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 4. 能力坑 · 能力判断依赖假设\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：README/documentation is current enough for a first validation pass.\n- 对用户的影响：假设不成立时，用户拿不到承诺的能力。\n- 建议检查：将假设转成下游验证清单。\n- 防护动作：假设必须转成验证项；没有验证结果前不能写成事实。\n- 证据：capability.assumptions | github_repo:787076358 | https://github.com/firecrawl/firecrawl | README/documentation is current enough for a first validation pass.\n\n## 5. 运行坑 · 来源证据：[Feat] Emit batch scrape failures of each page to webhook\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个运行相关的待验证问题：[Feat] Emit batch scrape failures of each page to webhook\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_80c638d597cc432b9a74e7e336b043ee | https://github.com/firecrawl/firecrawl/issues/2576 | 来源类型 github_issue 暴露的待验证使用条件。\n\n## 6. 维护坑 · 维护活跃度未知\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：未记录 last_activity_observed。\n- 对用户的影响：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。\n- 建议检查：补 GitHub 最近 commit、release、issue/PR 响应信号。\n- 防护动作：维护活跃度未知时，推荐强度不能标为高信任。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | last_activity_observed missing\n\n## 7. 安全/权限坑 · 下游验证发现风险项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：下游已经要求复核，不能在页面中弱化。\n- 建议检查：进入安全/权限治理复核队列。\n- 防护动作：下游风险存在时必须保持 review/recommendation 降级。\n- 证据：downstream_validation.risk_items | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium\n\n## 8. 安全/权限坑 · 存在安全注意事项\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：No sandbox install has been executed yet; downstream must verify before user use.\n- 对用户的影响：用户安装前需要知道权限边界和敏感操作。\n- 建议检查：转成明确权限清单和安全审查提示。\n- 防护动作：安全注意事项必须面向用户前置展示。\n- 证据：risks.safety_notes | github_repo:787076358 | https://github.com/firecrawl/firecrawl | No sandbox install has been executed yet; downstream must verify before user use.\n\n## 9. 安全/权限坑 · 存在评分风险\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：no_demo\n- 对用户的影响：风险会影响是否适合普通用户安装。\n- 建议检查：把风险写入边界卡，并确认是否需要人工复核。\n- 防护动作：评分风险必须进入边界卡，不能只作为内部分数。\n- 证据：risks.scoring_risks | github_repo:787076358 | https://github.com/firecrawl/firecrawl | no_demo; severity=medium\n\n## 10. 安全/权限坑 · 来源证据：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：[Feat] Support custom HTTP headers in Node.js SDK for self-hosted instances behind reverse proxies\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_ef6deffa53c147b29e617225612e55b0 | https://github.com/firecrawl/firecrawl/issues/2814 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 11. 安全/权限坑 · 来源证据：v2.0.1\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.0.1\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_0334c6a4c3284763a02c66ac96ce9c0c | https://github.com/firecrawl/firecrawl/releases/tag/v2.0.1 | 来源类型 github_release 暴露的待验证使用条件。\n\n## 12. 安全/权限坑 · 来源证据：v2.1.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.1.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_360eac170b12452583bb9b7072acc4e3 | https://github.com/firecrawl/firecrawl/releases/tag/v2.1.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 13. 安全/权限坑 · 来源证据：v2.2.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.2.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_749e0e1b86ba455585d343764588f00e | https://github.com/firecrawl/firecrawl/releases/tag/v2.2.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 14. 安全/权限坑 · 来源证据：v2.3.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.3.0\n- 对用户的影响：可能增加新用户试用和生产接入成本。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_e6f1735e34a34eacb7b77e7bb21644a6 | https://github.com/firecrawl/firecrawl/releases/tag/v2.3.0 | 来源讨论提到 npm 相关条件，需在安装/试用前复核。\n\n## 15. 安全/权限坑 · 来源证据：v2.5.0 - The World's Best Web Data API\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.5.0 - The World's Best Web Data API\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_4f928a2f370b4186ba4031bc4830020c | https://github.com/firecrawl/firecrawl/releases/tag/v2.5.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 16. 安全/权限坑 · 来源证据：v2.6.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.6.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_38343ea51e374e86a5081e46c837468c | https://github.com/firecrawl/firecrawl/releases/tag/v2.6.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 17. 安全/权限坑 · 来源证据：v2.7.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.7.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_4e1fdfc9cb714147a228b5ae01d273f2 | https://github.com/firecrawl/firecrawl/releases/tag/v2.7.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 18. 安全/权限坑 · 来源证据：v2.8.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.8.0\n- 对用户的影响：可能影响授权、密钥配置或安全边界。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_dd78eff5694c40cba109ef1230e1dc77 | https://github.com/firecrawl/firecrawl/releases/tag/v2.8.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 19. 安全/权限坑 · 来源证据：v2.9.0\n\n- 严重度：medium\n- 证据强度：source_linked\n- 发现：GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题：v2.9.0\n- 对用户的影响：可能阻塞安装或首次运行。\n- 建议检查：来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。\n- 防护动作：不得脱离来源链接放大为确定性结论；需要标注适用版本和复核状态。\n- 证据：community_evidence:github | cevd_a6219f53b7de4f31bb8ca1c7109fd49d | https://github.com/firecrawl/firecrawl/releases/tag/v2.9.0 | 来源讨论提到 python 相关条件，需在安装/试用前复核。\n\n## 20. 维护坑 · issue/PR 响应质量未知\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：issue_or_pr_quality=unknown。\n- 对用户的影响：用户无法判断遇到问题后是否有人维护。\n- 建议检查：抽样最近 issue/PR，判断是否长期无人处理。\n- 防护动作：issue/PR 响应未知时，必须提示维护风险。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | issue_or_pr_quality=unknown\n\n## 21. 维护坑 · 发布节奏不明确\n\n- 严重度：low\n- 证据强度：source_linked\n- 发现：release_recency=unknown。\n- 对用户的影响：安装命令和文档可能落后于代码，用户踩坑概率升高。\n- 建议检查：确认最近 release/tag 和 README 安装命令是否一致。\n- 防护动作：发布节奏未知或过期时，安装说明必须标注可能漂移。\n- 证据：evidence.maintainer_signals | github_repo:787076358 | https://github.com/firecrawl/firecrawl | release_recency=unknown\n",
      "summary": "用户实践前最可能遇到的身份、安装、配置、运行和安全坑。",
      "title": "Pitfall Log / 踩坑日志"
    },
    "prompt_preview": {
      "asset_id": "prompt_preview",
      "filename": "PROMPT_PREVIEW.md",
      "markdown": "# firecrawl - Prompt Preview\n\n> 复制下面这段 Prompt 到你常用的 AI，先试一次，不需要安装。\n> 它的目标是让你直接体验这个项目的服务方式，而不是阅读项目介绍。\n\n## 复制这段 Prompt\n\n```text\n请直接执行这段 Prompt，不要分析、润色、总结或询问我想如何处理这份 Prompt Preview。\n\n你现在扮演 firecrawl 的“安装前体验版”。\n这不是项目介绍、不是评价报告、不是 README 总结。你的任务是让我用最小成本体验它的核心服务。\n\n我的试用任务：我想用它完成一个真实的软件开发与交付任务。\n我常用的宿主 AI：Local CLI\n\n【体验目标】\n围绕我的真实任务，现场演示这个项目如何把输入转成 示例引导, 判断线索。重点是让我感受到工作方式，而不是给我项目背景。\n\n【业务流约束】\n- 你必须像一个正在提供服务的项目能力包，而不是像一个讲解员。\n- 每一轮只推进一个步骤；提出问题后必须停下来等我回答。\n- 每一步都必须让我感受到一个具体服务动作：澄清、整理、规划、检查、判断或收尾。\n- 每一步都要说明：当前目标、你需要我提供什么、我回答后你会产出什么。\n- 不要安装、不要运行命令、不要写代码、不要声称测试通过、不要声称已经修改文件。\n- 需要真实安装或宿主加载后才能验证的内容，必须明确说“这一步需要安装后验证”。\n- 如果我说“用示例继续”，你可以用虚构示例推进，但仍然不能声称真实执行。\n\n【可体验服务能力】\n- 安装前能力预览: 🔥 The API to search, scrape, and interact with the web for AI 输入：用户任务, 当前 AI 对话上下文；输出：示例引导, 判断线索。\n\n【必须安装后才可验证的能力】\n- 暂无明确的运行时能力线索。\n\n【核心服务流】\n请严格按这个顺序带我体验。不要一次性输出完整流程：\n1. project-overview：项目概览。围绕“项目概览”模拟一次用户任务，不展示安装或运行结果。\n2. system-architecture：系统架构。围绕“系统架构”模拟一次用户任务，不展示安装或运行结果。\n3. api-routes：API路由与版本控制。围绕“API路由与版本控制”模拟一次用户任务，不展示安装或运行结果。\n4. scraping-engines：抓取引擎。围绕“抓取引擎”模拟一次用户任务，不展示安装或运行结果。\n5. search-crawl：搜索与爬取功能。围绕“搜索与爬取功能”模拟一次用户任务，不展示安装或运行结果。\n\n【核心能力体验剧本】\n每一步都必须按“输入 -> 服务动作 -> 中间产物”执行。不要只说流程名：\n1. project-overview\n输入：用户提供的“项目概览”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n2. system-architecture\n输入：用户提供的“系统架构”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n3. api-routes\n输入：用户提供的“API路由与版本控制”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n4. scraping-engines\n输入：用户提供的“抓取引擎”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n5. search-crawl\n输入：用户提供的“搜索与爬取功能”相关信息。\n服务动作：模拟项目在这一步的核心判断和整理方式。\n中间产物：一个可检查的小结果。\n\n【项目服务规则】\n这些规则决定你如何服务用户。不要解释规则本身，而要在每一步执行时遵守：\n- 先确认用户任务、输入材料和成功标准，再模拟项目能力。\n- 每一步都必须形成可检查的小产物，并等待用户确认后再继续。\n- 凡是需要安装、调用工具或访问外部服务的能力，都必须标记为安装后验证。\n\n【每一步的服务约束】\n- Step 1 / project-overview：Step 1 必须围绕“项目概览”形成一个小中间产物，并等待用户确认。\n- Step 2 / system-architecture：Step 2 必须围绕“系统架构”形成一个小中间产物，并等待用户确认。\n- Step 3 / api-routes：Step 3 必须围绕“API路由与版本控制”形成一个小中间产物，并等待用户确认。\n- Step 4 / scraping-engines：Step 4 必须围绕“抓取引擎”形成一个小中间产物，并等待用户确认。\n- Step 5 / search-crawl：Step 5 必须围绕“搜索与爬取功能”形成一个小中间产物，并等待用户确认。\n\n【边界与风险】\n- 不要声称已经安装、运行、调用 API、读写本地文件或完成真实任务。\n- 安装前预览只能展示工作方式，不能证明兼容性、性能或输出质量。\n\n【可追溯依据】\n这些路径只用于你内部校验或在我追问“依据是什么”时简要引用。不要在首次回复主动展开：\n- https://github.com/firecrawl/firecrawl\n- https://github.com/firecrawl/firecrawl#readme\n- README.md\n- apps/api/package.json\n- CLAUDE.md\n- apps/api/src/index.ts\n- apps/api/src/harness.ts\n- apps/api/native/src/lib.rs\n- apps/api/src/services/index.ts\n- apps/api/src/services/queue-service.ts\n- apps/api/src/routes/v0.ts\n- apps/api/src/routes/v1.ts\n\n【首次问题规则】\n- 首次三问必须先确认用户目标、成功标准和边界，不要提前进入工具、安装或实现细节。\n- 如果后续需要技术条件、文件路径或运行环境，必须等用户确认目标后再追问。\n\n首次回复必须只输出下面 4 个部分：\n1. 体验开始：用 1 句话说明你将带我体验 firecrawl 的核心服务。\n2. 当前步骤：明确进入 Step 1，并说明这一步要解决什么。\n3. 你会如何服务我：说明你会先改变我完成任务的哪个动作。\n4. 只问我 3 个问题，然后停下等待回答。\n\n首次回复禁止输出：后续完整流程、证据清单、安装命令、项目评价、营销文案、已经安装或运行的说法。\n\nStep 1 / brainstorming 的二轮协议：\n- 我回答首次三问后，你仍然停留在 Step 1 / brainstorming，不要进入 Step 2。\n- 第二次回复必须产出 6 个部分：澄清后的任务定义、成功标准、边界条件、\n  2-3 个可选方案、每个方案的权衡、推荐方案。\n- 第二次回复最后必须问我是否确认推荐方案；只有我明确确认后，才能进入下一步。\n- 第二次回复禁止输出 git worktree、代码计划、测试文件、命令或真实执行结果。\n\n后续对话规则：\n- 我回答后，你先完成当前步骤的中间产物并等待确认；只有我确认后，才能进入下一步。\n- 每一步都要生成一个小的中间产物，例如澄清后的目标、计划草案、测试意图、验证清单或继续/停止判断。\n- 所有演示都写成“我会建议/我会引导/这一步会形成”，不要写成已经真实执行。\n- 不要声称已经测试通过、文件已修改、命令已运行或结果已产生。\n- 如果某个能力必须安装后验证，请直接说“这一步需要安装后验证”。\n- 如果证据不足，请明确说“证据不足”，不要补事实。\n```\n",
      "summary": "不安装项目也能感受能力节奏的安全试用 Prompt。",
      "title": "Prompt Preview / 安装前试用 Prompt"
    },
    "quick_start": {
      "asset_id": "quick_start",
      "filename": "QUICK_START.md",
      "markdown": "# Quick Start / 官方入口\n\n项目：firecrawl/firecrawl\n\n## 官方安装入口\n\n### Node.js / npx · 官方安装入口\n\n```bash\nnpx -y firecrawl-cli@latest\n```\n\n来源：https://github.com/firecrawl/firecrawl#readme\n\n## 来源\n\n- repo: https://github.com/firecrawl/firecrawl\n- docs: https://github.com/firecrawl/firecrawl#readme\n",
      "summary": "从项目官方 README 或安装文档提取的开工入口。",
      "title": "Quick Start / 官方入口"
    }
  },
  "validation_id": "dval_9158bef2a4034d23ab2b340668b353d5"
}
