首页
/ Crawl4AI v0.8.5 深度解析:反爬检测与代理升级、Shadow DOM 展平与深度爬取取消机制

Crawl4AI v0.8.5 深度解析:反爬检测与代理升级、Shadow DOM 展平与深度爬取取消机制

2026-09-04 14:23:26作者:史锋燃Gardner

Crawl4AI v0.8.5 是该项目自 v0.8.0 以来规模最大的一次版本更新,围绕"大规模、带防护站点"的抓取场景补齐了关键能力:自动反爬(Anti-Bot)检测与代理升级链、Shadow DOM 内容展平、深度爬取优雅取消、全局配置默认值 API,以及 60 余项 Bug 修复与两处 CRITICAL 级安全补丁。读完本文,你将掌握如何为受保护站点配置"直连 → 代理 → 兜底抓取"的三级降级链,如何让 Shadow DOM 中的内容进入 result.html 与 Markdown,以及如何在长会话中通过浏览器回收控制内存;同时,你将能看到这些特性在仓库源码中的真实实现位置(如 反爬检测器重试链),而不是停留在文档描述层面。

版本总览

v0.8.5 的核心特性清单如下(与 发布说明 一致):

  • Anti-Bot Detection & Proxy Escalation:三级(3-tier)检测 + 自动重试 + 代理链 + 兜底抓取函数;
  • Shadow DOM Flattening:通过 flatten_shadow_dom=True 将影子 DOM 内容序列化进浅色 DOM;
  • Deep Crawl Cancellation:BFS / DFS / BestFirst 三种深度爬取策略均支持 cancel()should_cancel 回调优雅终止;
  • Config Defaults APIset_defaults() / get_defaults() / reset_defaults(),一次设置、全局生效;
  • Source/Sibling Selector:JSON 抽取 schema 中新增 "source" 字段,跨兄弟元素取数;
  • Consent Popup Removalremove_consent_popups=True 自动关闭 40+ 个 CMP 平台的 Cookie 横幅;
  • Resource Filteringavoid_ads / avoid_css 在网络层拦截广告与 CSS 请求;
  • Browser Recyclingmemory_saving_mode 内存节省模式 + max_pages_before_recycle 自动重启浏览器;
  • GFM Table Compliance:Markdown 表格输出补齐首尾竖线,符合 GitHub 格式;
  • 60+ Bug Fixes:覆盖安全、浏览器稳定性、抽取精度等多个子系统。

下面逐一展开每个特性的用法与源码实现。

一、反爬检测、代理重试与兜底抓取(本版本头牌特性)

v0.8.5 让 Crawl4AI 在页面被反爬系统拦截时自动采取行动:更换代理重试,或调用你指定的兜底抓取函数(例如 Web Unlocker)。

1.1 三级检测模型

检测逻辑实现在 crawl4ai/antibot_detector.py(281 行),入口函数为 is_blocked(status_code, html, error_message)。源码文件头明确写明了设计哲学:"误报代价低(有兜底机制接住),漏报代价高(用户拿到垃圾数据),因此倾向判定为拦截"。三级结构如下:

  • Tier 1:高置信度结构标记_TIER1_PATTERNS,任意页面大小均可触发)。覆盖主流厂商的"指纹级"模式,例如 Akamai 的 Reference #18.2d351ab8... 引用号、Cloudflare 的 challenge-form + __cf_chl_f_tk token、cf-error-code 四位数错误码、/cdn-cgi/challenge-platform/ 挑战脚本,以及 PerimeterX 的 window._pxAppId=、DataDome 的 captcha-delivery.com 域名、Imperva/Incapsula 的 _Incapsula_Resource iframe、Sucuri 防火墙页、Kasada 的 KPSDK.scriptStart,还包括 Reddit 等平台把提示埋在 100KB+ CSS/JS 之下的 blocked by network security 文本;
  • Tier 2:中置信度通用词_TIER2_PATTERNS,仅在页面 < 10KB 时触发,阈值常量 _TIER2_MAX_SIZE = 10000)。因为 "Access Denied"、"Checking your browser" 这类词也可能出现在真实正文里,所以要求页面足够小才匹配,避免误伤文章页;
  • Tier 3:结构完整性检查_structural_integrity_check,仅对 < 50KB 且非 JSON/XML 的页面生效)。通过 4 个信号打分:无 <body> 标签(直接判定)、去除 script/style 后可见文本 < 50 字符、没有任何语义内容元素(p/h1-6/article/section/li/td/a/pre)、"脚本重壳"(有 script 但无内容且可见文本 < 100 字符)。信号 ≥ 2 个即判定拦截;信号 1 个且页面 < 5KB 也判定拦截。

除此之外还有几个值得注意的边界处理:

  • HTTP 429 一律判定为限流拦截;
  • HTTP 403/503 + HTML 内容 无条件判定拦截——源码注释解释:现代拦截页(Reddit、LinkedIn)会返回 100KB+ 的完整 SPA 壳,基于页面大小的过滤会漏掉它们;即使是误判,兜底函数也会拿到同样的 403 并正确报告失败,所以"误报是廉价的";
  • 大页面深扫:对 > 15KB 的页面,会先剥离 script/style 再重查 Tier 1 模式,专门对付"把拦截文本埋进 180KB 内联 CSS"的 SPA 拦截页;
  • 数据响应豁免_looks_like_data() 会识别裸 JSON/XML(首字符为 {/[)以及浏览器把 JSON 包在 <pre> 里渲染的形态,避免 API 响应被误判为空壳。

1.2 重试链:直连 → 代理 → 兜底

调用侧的编排逻辑在 crawl4ai/async_webcrawler.py。整体流程是一个双层循环:外层按 max_retries 重试,内层按 proxy_config 列表依次换代理;每次尝试后调用 is_blocked() 检查,未拦截即置 resolved_by = "direct" | "proxy" 并跳出;全部尝试失败后,若配置了 fallback_fetch_function 则调用它做最后一搏,成功则 resolved_by = "fallback_fetch"。若所有代理都抛异常且未配置兜底,会构造一个 success=False 的最小 CrawlResult,错误信息为 "All proxies failed: ...",确保调用方永远能拿到 crawl_stats 而不是 None

from crawl4ai import AsyncWebCrawler, CrawlerRunConfig
from crawl4ai.async_configs import ProxyConfig

config = CrawlerRunConfig(
    # 先直连,检测到拦截后再走代理
    proxy_config=[
        ProxyConfig.DIRECT,
        ProxyConfig(server="http://my-proxy:8080"),
    ],
    max_retries=2,
    # 可选:所有代理都失败时的兜底函数(如 Web Unlocker)
    fallback_fetch_function=my_web_unlocker_function,
)

async with AsyncWebCrawler() as crawler:
    result = await crawler.arun("https://protected-site.com", config=config)

    # 检查实际发生了什么
    stats = result.crawl_stats
    print(f"Resolved by: {stats['resolved_by']}")  # "direct"、"proxy" 或 "fallback_fetch"
    print(f"Proxies tried: {len(stats['proxies_used'])}")

其中 crawl_stats 由源码中的 _crawl_stats 字典生成,包含 attemptsretriesproxies_used(每项记录所用代理、状态码、是否拦截、拦截原因)、fallback_fetch_usedresolved_by 字段,可直接用于监控与告警。

几个源码层面值得了解的细节:

  • raw: / raw:// 开头的 URL(调用方直接提供 HTML)会跳过反爬检测、代理重试与兜底抓取,因为内容并非来自服务器;
  • 异常处理上,只有当"只有一个代理且没有重试额度"时才会把原始异常向上抛出,否则继续尝试下一个代理——这修复了"链中还有备选时第一次异常就 re-raise"的旧 Bug;
  • 兜底函数返回的 HTML 若含反爬脚本标记(例如 Walmart 页面上的 PerimeterX JS),源码会跳过复检,因为兜底结果被视为权威结果,避免误报;
  • 二进制下载(PDF、压缩包等)的 html 字段天然为空,复检环节会跳过,避免把 "0 bytes html" 误读为拦截。

二、Shadow DOM 展平(flatten_shadow_dom)

Web Components 的 Shadow DOM 会把内容藏在普通 DOM 遍历看不到的位置。开启该选项后,Crawl4AI 会在抽取前把影子 DOM 内容序列化进浅色 DOM:

config = CrawlerRunConfig(flatten_shadow_dom=True)

async with AsyncWebCrawler() as crawler:
    result = await crawler.arun("https://some-web-component-site.com", config=config)
    # 影子 DOM 内容此时已出现在 result.html、cleaned_html 和 markdown 中

实现位于 crawl4ai/js_snippet/flatten_shadow_dom.js(104 行 IIFE),核心手法:

  • document.documentElement 为根做手动递归序列化,不使用正则黑科技;遇到 node.shadowRoot 即切换到 serializeShadowRoot
  • slot 投影解析<slot> 元素通过 assignedNodes({ flatten: true }) 替换为其投影的浅色 DOM 内容;若无投影节点则退化为 slot 的 fallback 内容;
  • 仅剔除 shadow 作用域内的 <style> 标签(scoped CSS 离开影子后无意义),其余属性经 HTML 实体转义后原样保留;
  • 支持嵌套 shadow root 递归。

配套的两个行为变化:

  1. 该脚本修补了 attachShadow,使 closed shadow root 也能被打开并读取(文档所述 "force-open closed shadow roots");
  2. JS 执行管线重排js_code 现在在 wait_for + delay_before_return_html 之后执行,使你的脚本运行在完全水合(hydrated)的页面上;如果确实需要在等待前执行 JS,使用新增的 js_code_before_wait 参数(见 CrawlerRunConfig 参数说明)。

三、深度爬取优雅取消

BFS、DFS、BestFirst 三种深度爬取策略现在都支持取消。以 DFS 为例:

from crawl4ai.deep_crawling import DFSDeepCrawlStrategy

pages_found = 0

def should_stop():
    return pages_found >= 50  # 找到足够页面后停止

async def on_state(state):
    nonlocal pages_found
    pages_found = state["pages_crawled"]

strategy = DFSDeepCrawlStrategy(
    max_depth=3,
    max_pages=1000,
    should_cancel=should_stop,      # 同步或异步回调均可
    on_state_change=on_state,
)

config = CrawlerRunConfig(deep_crawl_strategy=strategy)

async with AsyncWebCrawler() as crawler:
    results = await crawler.arun("https://example.com", config=config)
    print(f"Cancelled: {strategy.cancelled}")

也可以在另一个线程或协程中直接调用 strategy.cancel()。源码上,should_cancelcancel() 实现在各策略基类层(见 bfs_strategy.py),回调支持同步与 Awaitable[bool] 两种形式,回调抛异常时只记录 warning 而不中断爬取,取消状态通过 strategy.cancelled 暴露给调用方。

四、Config Defaults API:全局默认值

重复传参的痛点可以通过类级默认值解决:

from crawl4ai import BrowserConfig, CrawlerRunConfig

# 一次性设置组织级默认值
BrowserConfig.set_defaults(headless=True, text_mode=True)
CrawlerRunConfig.set_defaults(verbose=False, remove_consent_popups=True)

# 所有新实例自动继承默认值
bc = BrowserConfig()                   # headless=True, text_mode=True
rc = CrawlerRunConfig()                # verbose=False, remove_consent_popups=True

# 显式传参永远优先
bc2 = BrowserConfig(text_mode=False)   # text_mode=False,headless 仍为 True

# 检查与重置
print(BrowserConfig.get_defaults())    # {"headless": True, "text_mode": True}
BrowserConfig.reset_defaults()         # 恢复默认

实现是 async_configs.py 中的 _with_defaults 类装饰器:它包装 __init__,按"显式传参 > 类级用户默认值 > 硬编码默认值"的优先级注入参数,且注入时做 copy.deepcopy 防止可变对象共享。set_defaults 会校验参数名,传入非法参数名直接抛 ValueErrorreset_defaults(*names) 支持按名称选择性清除。

五、Source/Sibling Selector:跨兄弟元素抽取

很多站点把同一条目的数据拆在相邻兄弟元素里(典型如 Hacker News:标题在一个 <tr>,分数在下一个 <tr>)。新增的 "source" 字段允许先导航到兄弟节点再执行选择器:

from crawl4ai.extraction_strategy import JsonCssExtractionStrategy

schema = {
    "name": "HackerNewsItems",
    "baseSelector": "tr.athing",
    "fields": [
        {"name": "title", "selector": ".titleline > a", "type": "text"},
        {"name": "link", "selector": ".titleline > a", "type": "attribute", "attribute": "href"},
        # 导航到下一个兄弟 <tr> 取分数
        {"name": "score", "selector": ".score", "type": "text", "source": "+ tr"},
        {"name": "author", "selector": ".hnuser", "type": "text", "source": "+ tr"},
    ]
}

strategy = JsonCssExtractionStrategy(schema=schema)

语法为 "+ <selector>"(定位匹配的下一个兄弟元素),该能力同时作用于 JsonCssExtractionStrategyJsonXPathExtractionStrategy,兄弟节点不存在时优雅降级为 None 而非报错。源码中基类提供了 _resolve_source 钩子(extraction_strategy.py),由各策略子类实现具体解析;prompts.py 中也把 "source" 写入了 LLM 生成 schema 的提示词,因此用 agenerate_schema() 时模型同样会产出带 source 的字段。

六、Cookie 同意横幅自动移除

一个开关即可自动关闭 40+ 个 CMP 平台的 Cookie 横幅:

config = CrawlerRunConfig(remove_consent_popups=True)

覆盖 OneTrust、Cookiebot、Didomi、Quantcast、Sourcepoint、Google FundingChoices、TrustArc、ConsentManager、Osano、Iubenda、Complianz、LiveRamp、CookieYes、Klaro、Termly 等主流平台。实现是一个 710 行的注入脚本 remove_consent_popups.js,在页面内定位各平台的"接受"按钮并模拟点击。该参数在 CrawlerRunConfig 中声明,默认 False

七、资源过滤:avoid_ads / avoid_css

在网络层拦截广告跟踪器与 CSS 资源,让抓取更快、更轻:

config = BrowserConfig(
    avoid_ads=True,   # 拦截 doubleclick、google-analytics 等
    avoid_css=True,   # 拦截 .css、.less、.scss 资源
)

BrowserConfig 的参数注释可见:avoid_ads 拦截广告与跟踪器网络请求,avoid_css 拦截 css/less/scss/sass 加载。两者默认均为 False,属于可选的"瘦身"开关,适合对样式与广告资源不敏感的纯内容抓取场景。

八、浏览器回收与内存节省模式

面向长时间运行的高强度爬取会话:

config = BrowserConfig(
    memory_saving_mode=True,          # 激进的缓存丢弃与 V8 堆上限标志
    max_pages_before_recycle=100,     # 每爬 N 页自动重启浏览器
)

memory_saving_mode 会向浏览器追加激进的缓存丢弃与 V8 堆上限启动标志(见 参数说明),max_pages_before_recycle 控制回收触发阈值,用于防止持续抓取期间的内存泄漏。发布说明特别提到:回收采用版本号(version-based)机制,在并发负载下是安全的——为此团队修复了三个独立的死锁 Bug(包括 issue #1640 的并发回收死锁与 #1754 的 Docker monitor LOCK 争用导致的 pod 死锁)。

九、GFM 表格合规

Markdown 输出中的表格现在带有标准 GitHub-Flavored Markdown 竖线定界符:

升级前(v0.8.0)

Name | Age | City
---|---|---
Alice | 30 | NYC

升级后(v0.8.5)

| Name | Age | City |
| --- | --- | --- |
| Alice | 30 | NYC |

这保证了输出可直接被 GitHub、Typora 等按 GFM 规范渲染的解析器正确解析。

次要特性一览

  • query_llm_config:自适应爬取器(Adaptive Crawler)查询扩展使用独立的 LLM 配置(#1682);
  • force_viewport_screenshot:只截可视区域而非整页;
  • device_scale_factor:通过 BrowserConfig 配置截图 DPI(#1463);
  • redirected_status_code:现在可在 CrawlResult 上读取(#1435),对应 async_webcrawler.pycrawl_result.redirected_status_code 的赋值;
  • wait_for_images:截图前等待图片加载完成(#1792);
  • score_threshold:BestFirstCrawlingStrategy 中过滤低分 URL(#1804);
  • link_preview_timeout:AdaptiveConfig 中可配置超时(#1793);
  • --json-ensure-ascii:CLI 标志,控制 JSON 输出的 Unicode 保留策略(#1668);
  • type-list 管道:JsonCssExtractionStrategy 支持 ["attribute", "regex"] 这类链式抽取管道(#1290)。

安全修复

Critical:Docker /crawl 端点反序列化 RCE

  • 严重级别:CRITICAL
  • 影响范围:Docker API 部署(v0.8.0 及更早版本)

/crawl 端点的反序列化逻辑对某些对象类型使用了 eval()。该版本彻底移除了这条路径,并引入允许名单(ALLOWED_DESERIALIZE_TYPES),只允许实例化已知的配置类。如果你运行过 v0.8.0 及更早的 Docker 部署,必须升级

Critical:Redis CVE-2025-49844(CVSS 10.0)

  • 影响范围:使用 Redis 的 Docker 部署

Redis 升级至 7.2.7,修复 Lua use-after-free 漏洞。

其他安全加固

  • XSS 防护:iframe 处理中改用 DOMParser 替代 innerHTML(#1796);
  • API Token 强制校验:配置了 api_token 后,/token 端点现在要求携带该 token(#1795);
  • 隐身模式改进sec-ch-ua 请求头与 User-Agent 同步,隐身模式下保持 WebGL 存活。

Bug 修复精选(60+)

按子系统分类整理(完整列表见 发布说明):

浏览器与页面管理

  • 修复 create_isolated_context=False 时的页面复用竞态;
  • 修复浏览器上下文内存泄漏——签名收缩 + LRU 逐出(#943);
  • 修复重复 add_init_script 引发的级联上下文崩溃(#1768);
  • 修复 simulate_user 因 ArrowDown 键击毁页面内容的问题;
  • 修复持续并发负载下的浏览器回收死锁(#1640);
  • 修复 Docker monitor LOCK 争用导致的 pod 死锁(#1754)。

代理与网络

  • 修复代理认证的 ERR_INVALID_AUTH_CREDENTIALS(#1281);
  • 修复持久浏览器上下文下的代理认证;
  • 修复代理升级链在还有备选时首次异常即 re-raise 的问题;
  • 修复兜底抓取:所有代理崩溃时也会执行、跳过复检、绝不返回 None。

深度爬取

  • can_process_url() 现在接收归一化后的 URL;
  • head 抽取失败的链接现在也会计算 total_score
  • 修复 FilterChain.add_filter 因元组不可变导致的 AttributeError;
  • URL Seeder 不再对 sitemap 强制使用 Common Crawl 索引(#1746);
  • 修复 is_external_url 的端口比较(#1783);
  • AdaptiveCrawler 不再爬出外部域名(#1805)。

抽取与内容

  • 修复 html2text 相对链接解析忽略 <base> 标签的问题(#1721);
  • 修复移除 script 标签时丢失相邻文本(#1364);
  • cleaned_html 现在保留 classid 属性(#1782,注意下方 Breaking Changes);
  • 修复 LINK_PATTERN 正则中的嵌套括号问题(#1790);
  • force_json_response 路径为 LLM 抽取剥离 Markdown 围栏;
  • 防御 LLM 返回 None 内容,透传 finish_reason(#1788);
  • 修复 agenerate_schema() 对 Anthropic 模型的 JSON 解析;
  • MediaItem 不再被 "100%" 这类非数字宽度值击溃(#1635);
  • BM25ContentFilter 不再返回重复 chunk(#1213);
  • 修复 raw:// URL 下 LXML 抓取忽略 css_selector 的问题(#1484)。

CLI 与 Docker

  • 修复 deep-crawl CLI 只输出第一页的问题(#1667);
  • VersionManager 现在尊重 CRAWL4_AI_BASE_DIRECTORY 环境变量(#1296);
  • Docker 健康检查端点使用动态版本号(#1686);
  • CLI 文件输出显式指定 UTF-8(#1789);
  • Redis 任务数据增加 TTL 过期,防止内存增长(#1730);
  • MCP SSE 端点崩溃修复——改用裸 ASGI Route 挂载(#1594);
  • 截图修复:尊重 scan_full_page=False(#1750)、修复 Elementor 站点截图畸变(#1370)、整页截图滚动器现在尊重 scroll_delay
  • /llm 端点支持按请求覆盖 provider,Redis 配置支持 host/port/password(#1611、#1817)。

其他

  • playwright-stealth 替换 tf-playwright-stealth(#1553);
  • 移除 OpenAI 兜底,允许使用本地 embedding 模型(#1658);
  • GoogleSearchCrawler 的 script.js 现在包含在分发包中(#1711);
  • 阻塞式 chardet.detect 移入线程执行器(#1751);
  • mean_delay/max_range 现在真正接入 dispatcher 限流器(#1786)。

回归测试套件

本次版本新增了一套覆盖核心子系统的回归测试,包括核心爬取、内容处理、抽取策略、深度爬取、浏览器管理、配置序列化、工具函数与边界用例。当前仓库中 tests/regression/ 目录下按 test_reg_browser.pytest_reg_config.pytest_reg_content.pytest_reg_core_crawl.pytest_reg_deep_crawl.pytest_reg_domain_mapper.pytest_reg_edge_cases.pytest_reg_extraction.pytest_reg_utils.py 组织(以当前仓库实际文件计,测试函数已超过 300 个)。

破坏性变更

cleaned_html 现在保留 classid 属性

如果你下游有代码解析 cleaned_html 并假设其中不含 class/id 属性,可能需要调整。此变更的动机是让用户能直接对清洗后的 HTML 做 CSS 选择器分析。

Docker:Redis 升级至 7.2.7

如果你的部署固定了 Redis 版本,请同步更新到 7.2.7 或更高。

升级指引

Python 包

pip install --upgrade crawl4ai
# 或锁定版本
pip install crawl4ai==0.8.5

Docker

docker pull unclecode/crawl4ai:0.8.5

docker run -d -p 11235:11235 --shm-size=1g unclecode/crawl4ai:0.8.5

验证安装:运行发布说明中提到的验证脚本,它会执行 13 项针对真实 URL 的端到端测试来逐一确认各特性:

python docs/releases_review/demo_v0.8.5.py

该脚本见 docs/releases_review/demo_v0.8.5.py(913 行),需要网络环境才能完整运行。

适用前提与注意事项

  • 本文基于当前仓库实际源码核实:仓库中 version.py 已演进到 0.9.0,即上述 v0.8.5 特性已包含在后续版本中;如果你使用 0.9.x 源码,这些 API 仍然有效,行为以当前仓库代码为准;
  • 反爬检测是启发式的,设计上故意"宁可误报"——若你的站点真实内容恰好命中 Tier 1 模式(例如页面正文真的在讨论 Cloudflare),请评估 fallback_fetch_function 是否能兜底;
  • flatten_shadow_dom 的序列化是纯 HTML 层面的字符串拼装,不执行样式布局,对依赖 shadow 内 scoped 样式的下游 CSS 逻辑需自行处理;
  • set_defaults()类级全局状态,多进程/多线程共享同一解释器时请留意作用范围。

结语

v0.8.5 的价值在于把"受保护站点抓取"从手工兜底变成了框架级能力:antibot_detector.py 提供可解释的三级检测,async_webcrawler.py 提供"直连 → 代理 → 兜底"的完整降级链,Shadow DOM 展平与深度爬取取消则分别解决了"取不到"与"停不下来"两个高频痛点。结合 crawl_stats 的运行时遥测与回归测试套件,这套机制在生产环境中是可观测、可验证的。完整特性清单与修复索引见 docs/blog/release-v0.8.5.md,社区贡献者名单见 CONTRIBUTORS.md

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
docsdocs
暂无描述
Markdown
889
5.78 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384
flutter_flutterflutter_flutter
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.17 K
341