Crawl4AI v0.8.5 深度解析:反爬检测与代理升级、Shadow DOM 展平与深度爬取取消机制
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 API:
set_defaults()/get_defaults()/reset_defaults(),一次设置、全局生效; - Source/Sibling Selector:JSON 抽取 schema 中新增
"source"字段,跨兄弟元素取数; - Consent Popup Removal:
remove_consent_popups=True自动关闭 40+ 个 CMP 平台的 Cookie 横幅; - Resource Filtering:
avoid_ads/avoid_css在网络层拦截广告与 CSS 请求; - Browser Recycling:
memory_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_tktoken、cf-error-code四位数错误码、/cdn-cgi/challenge-platform/挑战脚本,以及 PerimeterX 的window._pxAppId=、DataDome 的captcha-delivery.com域名、Imperva/Incapsula 的_Incapsula_Resourceiframe、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 字典生成,包含 attempts、retries、proxies_used(每项记录所用代理、状态码、是否拦截、拦截原因)、fallback_fetch_used 与 resolved_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 递归。
配套的两个行为变化:
- 该脚本修补了
attachShadow,使 closed shadow root 也能被打开并读取(文档所述 "force-open closed shadow roots"); - 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_cancel 与 cancel() 实现在各策略基类层(见 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 会校验参数名,传入非法参数名直接抛 ValueError;reset_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>"(定位匹配的下一个兄弟元素),该能力同时作用于 JsonCssExtractionStrategy 与 JsonXPathExtractionStrategy,兄弟节点不存在时优雅降级为 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.py 中crawl_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现在保留class与id属性(#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.py、test_reg_config.py、test_reg_content.py、test_reg_core_crawl.py、test_reg_deep_crawl.py、test_reg_domain_mapper.py、test_reg_edge_cases.py、test_reg_extraction.py、test_reg_utils.py 组织(以当前仓库实际文件计,测试函数已超过 300 个)。
破坏性变更
cleaned_html 现在保留 class 与 id 属性
如果你下游有代码解析 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。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00