Crawl4AI v0.7.7 自托管与监控更新:Monitor API、WebSocket 实时流与三级浏览器池实战解析
v0.7.7 是 Crawl4AI 的“自托管与监控”版本,它把 Docker 部署从“一个容器化的爬虫”升级为具备企业级实时监控能力的自托管平台。本文完整覆盖该版本的实时监控仪表盘、Monitor REST API、WebSocket 流式推送、三级浏览器池(permanent/hot/cold)、Janitor 自动清理、控制动作与生产集成模式,并结合当前仓库 deploy/docker/ 目录下的源码实现,解释每项功能的底层机制、调用链与可验证依据,帮助你在生产环境中真正掌控爬取基础设施的可见性与可控性。
v0.7.7 版本概览
v0.7.7 的核心目标:让运行在 Docker 中的 Crawl4AI 具备完整的可观测性(observability)与运维干预能力。主要能力一览:
- 实时监控仪表盘:带实时系统指标与浏览器池状态的交互式 Web UI
- 完整的 Monitor API:以 REST 方式暴露所有监控数据
- WebSocket 流式推送:2 秒一次的实时更新,可构建自定义仪表盘
- 控制动作:手动管理浏览器(强制清理、终止、重启)
- 智能浏览器池:permanent/hot/cold 三层架构,自动升级(promotion)
- Janitor 清理系统:自动资源管理并记录事件日志
- 生产指标:面向运维的 6 项关键指标
- 生产集成:Prometheus 导出、告警、日志聚合示例
- 关键 Bug 修复:异步 LLM 抽取、DFS 深爬、视口配置等
自托管价值主张:在 v0.7.7 之前,Docker 只是容器化爬虫——容器里发生什么完全不可见:内存、活跃请求、浏览器池、错误都要翻日志。v0.7.7 之后,自托管方案带来:
- 数据隐私:数据不离开你的基础设施
- 成本可控:无按请求计费与速率限制
- 完全可定制:完整掌控配置与策略
- 完全透明:对每个环节的实时可见性
- 性能:直接访问、无网络开销
- 企业安全:工作流保留在防火墙之后
实时监控仪表盘:完整可视化
仪表盘部署在 /dashboard 路径下。从源码看,它由 server.py 中的静态文件挂载提供:
# deploy/docker/server.py
MONITOR_DIR = pathlib.Path(__file__).parent / "static" / "monitor"
app.mount(
"/dashboard",
StaticFiles(directory=MONITOR_DIR, html=True),
name="monitor_ui",
)
即 http://localhost:11235/dashboard 实际服务的是 static/monitor/index.html 前端页面,而页面背后的所有数据来自 Monitor API 与 WebSocket 端点。
打开仪表盘后可以看到:
- 系统健康总览:CPU、内存、网络、运行时长,实时更新
- 实时请求追踪:进行中与已完成的请求,含完整细节
- 浏览器池管理:permanent/hot/cold 浏览器的交互式表格
- Janitor 事件日志:自动清理活动
- 错误监控:带完整上下文的错误日志
仪表盘通过 WebSocket 每 2 秒刷新一次(下文详述推送端点的源码实现),为爬取操作提供实时视图。
Monitor API:程序化访问
仪表盘面向人,而自动化与集成需要程序化访问——v0.7.7 提供了覆盖所有监控数据的 REST API。所有端点挂载在 /monitor 前缀下,由 monitor_routes.py 中的 APIRouter(prefix="/monitor") 统一定义。
系统健康端点
GET /monitor/health 返回容器指标、浏览器池状态与统计信息:
import httpx
import asyncio
async def monitor_system_health():
async with httpx.AsyncClient() as client:
response = await client.get("http://localhost:11235/monitor/health")
health = response.json()
print(f"Container Metrics:")
print(f" CPU: {health['container']['cpu_percent']:.1f}%")
print(f" Memory: {health['container']['memory_percent']:.1f}%")
print(f" Uptime: {health['container']['uptime_seconds']}s")
print(f"\nBrowser Pool:")
print(f" Permanent: {health['pool']['permanent']['active']} active")
print(f" Hot Pool: {health['pool']['hot']['count']} browsers")
print(f" Cold Pool: {health['pool']['cold']['count']} browsers")
print(f"\nStatistics:")
print(f" Total Requests: {health['stats']['total_requests']}")
print(f" Success Rate: {health['stats']['success_rate_percent']:.1f}%")
print(f" Avg Latency: {health['stats']['avg_latency_ms']:.0f}ms")
asyncio.run(monitor_system_health())
从源码看,该响应的核心数据结构由 monitor.py 的 get_health_summary() 生成:container 块给出 memory_percent、cpu_percent、网络收发 MB 与 uptime_seconds;pool 块通过 get_pool_snapshot() 无锁快照输出 permanent/hot/cold 各层数量与估算内存(源码注释明确这是基于典型 Chromium 用量的保守估算值:常驻浏览器约 270MB、池内浏览器约 180MB/个);janitor 块还给出 memory_pressure(<60% 为 LOW、<80% 为 MEDIUM、否则 HIGH)。
请求追踪
GET /monitor/requests 返回活跃与已完成请求。支持 status 过滤参数(all / active / completed / success / error)与 limit 参数(1–1000),见 monitor_routes.py。
async def track_requests():
async with httpx.AsyncClient() as client:
response = await client.get("http://localhost:11235/monitor/requests")
requests_data = response.json()
print(f"Active Requests: {len(requests_data['active'])}")
print(f"Completed Requests: {len(requests_data['completed'])}")
# 查看最近请求详情
for req in requests_data['completed'][:5]:
status_icon = "OK" if req['success'] else "FAIL"
print(f"{status_icon} {req['endpoint']} - {req['latency_ms']:.0f}ms")
数据侧的实现:monitor.py 中 MonitorStats 用 active_requests 字典记录进行中请求、completed_requests 固定长度 deque(最多 100 条)记录最近完成请求;每条完成记录包含 elapsed、mem_delta(请求前后进程 RSS 差值)、success、error、status_code、pool_hit 字段,其中 URL 会做 html.escape 处理以防 XSS。
浏览器池管理
GET /monitor/browsers 返回池内浏览器明细与效率指标:
async def monitor_browser_pool():
async with httpx.AsyncClient() as client:
response = await client.get("http://localhost:11235/monitor/browsers")
browsers = response.json()
print(f"Pool Summary:")
print(f" Total Browsers: {browsers['summary']['total_count']}")
print(f" Total Memory: {browsers['summary']['total_memory_mb']} MB")
print(f" Reuse Rate: {browsers['summary']['reuse_rate_percent']:.1f}%")
# 列出所有浏览器
for browser in browsers['permanent']:
print(f"Permanent: {browser['browser_id'][:8]}... | "
f"Requests: {browser['request_count']} | "
f"Memory: {browser['memory_mb']:.0f} MB")
复用率(reuse rate)的计算逻辑在 monitor_routes.py:取最近 100 条完成请求,统计其中 pool_hit 为真的比例。注意:不同版本的该接口响应结构略有差异——当前仓库实现返回 browsers 明细列表加 summary 汇总两个字段,而 0.7.7 发布说明示例中为 permanent / hot / cold 分组;接入时以你所部署版本的实际响应为准。
端点性能统计
GET /monitor/endpoints/stats 输出每个 API 端点的性能分析:
async def get_endpoint_stats():
async with httpx.AsyncClient() as client:
response = await client.get("http://localhost:11235/monitor/endpoints/stats")
stats = response.json()
print("Endpoint Analytics:")
for endpoint, data in stats.items():
print(f" {endpoint}:")
print(f" Requests: {data['count']}")
print(f" Avg Latency: {data['avg_latency_ms']:.0f}ms")
print(f" Success Rate: {data['success_rate_percent']:.1f}%")
端点统计在请求开始/结束时由 track_request_start / track_request_end(monitor.py)累计 count、total_time、success、errors、pool_hits,并持久化到 Redis(键 monitor:endpoint_stats,24 小时 TTL),由后台 worker 异步写入,不阻塞请求主路径。
时序数据与日志
GET /monitor/timeline?metric=memory&window=5m— 时间序列数据,用于绘图。源码(monitor_routes.py)限定metric为memory/requests/browsers,window目前仅支持5m;数据来自 monitor.py 中每 5 秒采样一次、保留 60 个点(5 分钟窗口)的三条 timeline 队列GET /monitor/logs/janitor?limit=10— 清理活动日志,返回events列表,事件类型包括close_cold、close_hot、promote、force_cleanup、kill_browser、restart_browserGET /monitor/logs/errors?limit=10— 带上下文的错误日志,返回errors列表,每条含timestamp、endpoint、url、error、request_id
完整 API 参考
Monitor API 包含以下端点:
| 端点 | 方法 | 说明 |
|---|---|---|
/monitor/health |
GET | 系统健康 + 池统计 |
/monitor/requests |
GET | 活跃与已完成请求追踪 |
/monitor/browsers |
GET | 浏览器池明细与效率 |
/monitor/endpoints/stats |
GET | 按端点的性能分析 |
/monitor/timeline?minutes=5 |
GET | 时序数据,用于图表 |
/monitor/logs/janitor?limit=10 |
GET | 清理活动日志 |
/monitor/logs/errors?limit=10 |
GET | 带上下文的错误日志 |
/monitor/actions/cleanup |
POST | 强制立即清理 |
/monitor/actions/kill_browser |
POST | 终止指定浏览器 |
/monitor/actions/restart_browser |
POST | 重启浏览器 |
/monitor/stats/reset |
POST | 重置累计统计 |
/monitor/ws |
WebSocket | 实时流式更新 |
WebSocket 流式推送:2 秒实时数据
轮询 API 会浪费资源且引入延迟,实时仪表盘需要即时更新。v0.7.7 提供 WebSocket 流,间隔 2 秒推送一帧。端点实现见 monitor_routes.py:
@router.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
monitor = get_monitor()
data = {
"timestamp": asyncio.get_event_loop().time(),
"health": await monitor.get_health_summary(),
"requests": {
"active": monitor.get_active_requests(),
"completed": monitor.get_completed_requests(limit=10)
},
"browsers": await monitor.get_browser_list(),
"timeline": {...},
"janitor": monitor.get_janitor_log(limit=10),
"errors": monitor.get_errors_log(limit=10)
}
await websocket.send_json(data)
await asyncio.sleep(2) # 2 秒后再次推送
每帧推送聚合了健康快照、最近 10 条活跃/完成请求、浏览器列表、三条 timeline、Janitor 事件与错误日志——也就是说一个 WebSocket 连接即可驱动整个自定义仪表盘。
WebSocket 集成示例
import websockets
import json
import asyncio
async def monitor_realtime():
uri = "ws://localhost:11235/monitor/ws"
async with websockets.connect(uri) as websocket:
print("Connected to real-time monitoring stream")
while True:
# 每 2 秒收到一次更新
data = await websocket.recv()
update = json.loads(data)
# 访问所有监控数据
print(f"\n--- Update at {update['timestamp']} ---")
print(f"Memory: {update['health']['container']['memory_percent']:.1f}%")
print(f"Active Requests: {len(update['requests']['active'])}")
print(f"Total Browsers: {update['browsers']['summary']['total_count']}")
if update['errors']:
print(f"Recent Errors: {len(update['errors'])}")
asyncio.run(monitor_realtime())
典型应用:为团队构建定制监控 UI、指标越阈即时告警、把实时数据喂给 Grafana 等监控工具、无需轮询即可对事件做出自动化响应。
智能浏览器池:三层架构
为每个请求新建浏览器既慢又吃内存,而传统静态浏览器池缺乏弹性。v0.7.7 的方案是按配置签名(config signature)分层的智能三级池:
- Permanent(常驻):常驻运行、默认配置、即时响应
- Hot(热池):使用次数达到 3 次后由冷池升级而来,保持热备以便快速访问
- Cold(冷池):为变体配置按需创建,空闲后由 Janitor 清理
源码级工作机制
核心实现在 crawler_pool.py:
- 配置签名:
_sig()把BrowserConfig.to_dict()序列化后取 SHA1,作为池的键。相同配置必命中同一浏览器(crawler_pool.py); - 取浏览器:
get_crawler()按「permanent → hot → cold → 新建」顺序匹配;默认配置命中常驻浏览器,变体配置首次使用进冷池,累计使用次数>= 3时立即提升到热池,并通过track_janitor_event("promote", ...)上报监控事件(crawler_pool.py); - 内存护栏:新建浏览器前先检查容器内存,超过阈值(
memory_threshold_percent,默认 95%)直接抛出MemoryError拒绝创建,避免 OOM(crawler_pool.py); - 无锁快照:
get_pool_snapshot()专供监控读取,利用 GIL 下字典拷贝的原子性避免与慢速的浏览器启动/关闭操作争抢LOCK(源码注释标注了这是为修复 issue #1754 引入的)(crawler_pool.py)。
池参数可在 config.yml 中调整:
crawler:
memory_threshold_percent: 95.0 # 内存压力阈值,超过则拒绝新建浏览器
pool:
max_pages: 40 # 全局并发许可数
idle_ttl_sec: 300 # Janitor 基础空闲 TTL(秒)
演示池行为的示例脚本
import httpx
async def demonstrate_browser_pool():
async with httpx.AsyncClient() as client:
# 请求 1-3:默认配置 → 使用常驻浏览器
print("Phase 1: Using permanent browser")
for i in range(3):
await client.post(
"http://localhost:11235/crawl",
json={"urls": [f"https://httpbin.org/html?req={i}"]}
)
print(f" Request {i+1}: Reused permanent browser")
# 请求 4-7:自定义视口 → 冷池(首次使用)
print("\nPhase 2: Custom config creates cold pool browser")
viewport_config = {"viewport": {"width": 1280, "height": 720}}
for i in range(4):
await client.post(
"http://localhost:11235/crawl",
json={
"urls": [f"https://httpbin.org/json?v={i}"],
"browser_config": viewport_config
}
)
if i < 2:
print(f" Request {i+1}: Cold pool browser")
else:
print(f" Request {i+1}: Promoted to hot pool! (after 3 uses)")
# 检查池状态
response = await client.get("http://localhost:11235/monitor/browsers")
browsers = response.json()
print(f"\nPool Status:")
print(f" Permanent: {len(browsers['permanent'])} (always active)")
print(f" Hot: {len(browsers['hot'])} (frequently used configs)")
print(f" Cold: {len(browsers['cold'])} (on-demand)")
print(f" Reuse Rate: {browsers['summary']['reuse_rate_percent']:.1f}%")
asyncio.run(demonstrate_browser_pool())
预期实际收益:相比每请求新建浏览器,内存占用大幅下降;常用配置即时可用;池随使用模式自动优化;空闲浏览器由 Janitor 自动回收。
Janitor 系统:自适应自动清理
长时间运行的爬虫会累积空闲浏览器、持续消耗内存。Janitor 是 crawler_pool.py 中的后台清理循环,其关键设计是按内存压力自适应调整检查间隔与空闲 TTL:
| 内存使用率 | 检查间隔 | 冷池 TTL | 热池 TTL |
|---|---|---|---|
| 低于 60% | 60s | 300s(idle_ttl_sec 配置值) |
600s |
| 60%–80% | 30s | 60s | 300s |
| 高于 80% | 10s | 30s | 120s |
清理逻辑只关闭 active_requests == 0 的浏览器(正在服务请求的浏览器一律跳过),每次关闭都会记录 Janitor 事件(close_cold / close_hot),并可通过 /monitor/logs/janitor 查询:
async def monitor_janitor_activity():
async with httpx.AsyncClient() as client:
response = await client.get("http://localhost:11235/monitor/logs/janitor?limit=5")
logs = response.json()
print("Recent Cleanup Activities:")
for log in logs:
print(f" {log['timestamp']}: {log['message']}")
# 示例输出:
# 2025-11-14 10:30:00: Cleaned up 2 cold pool browsers (idle > 5min)
# 2025-11-14 10:25:00: Browser reuse rate: 85.3%
# 2025-11-14 10:20:00: Hot pool browser promoted (10 requests)
控制动作:手动运维干预
有时需要人工干预——杀掉卡死的浏览器、强制清理、重启资源。v0.7.7 提供了 API 级控制动作。注意:从当前仓库实现看,这四个 POST 端点都挂了 require_admin 依赖(monitor_routes.py),即需要管理凭据才能调用,这是控制类操作的安全边界。
强制清理
立即关闭所有冷池浏览器(hot/cold 之外的常驻浏览器不受影响):
async def force_cleanup():
async with httpx.AsyncClient() as client:
response = await client.post("http://localhost:11235/monitor/actions/cleanup")
result = response.json()
print(f"Cleanup completed:")
print(f" Browsers cleaned: {result.get('killed_count', 0)}")
print(f" Memory freed: {result.get('memory_freed_mb', 0):.1f} MB")
终止指定浏览器
async def kill_stuck_browser(browser_sig: str):
async with httpx.AsyncClient() as client:
response = await client.post(
"http://localhost:11235/monitor/actions/kill_browser",
json={"sig": browser_sig}
)
if response.status_code == 200:
print(f"Browser {browser_sig} killed successfully")
实现细节(monitor_routes.py):按签名前缀(前 8 位)在热池、冷池中匹配目标;常驻浏览器不可被 kill(返回 403,提示改用 restart);若当前有活跃请求会记录警告日志,因为浏览器可能正在被使用。
重启浏览器
POST /monitor/actions/restart_browser 支持 sig: "permanent" 重启常驻浏览器(关闭后按 config.yml 中的浏览器配置重新初始化),对 hot/cold 浏览器则是关闭旧实例、由后续请求按原签名自动重建(monitor_routes.py)。
重置统计
async def reset_stats():
async with httpx.AsyncClient() as client:
response = await client.post("http://localhost:11235/monitor/stats/reset")
print("Statistics reset for fresh monitoring")
生产集成模式
Prometheus 指标导出
# 导出 Prometheus 格式指标
async def export_prometheus_metrics():
async with httpx.AsyncClient() as client:
health = await client.get("http://localhost:11235/monitor/health")
data = health.json()
metrics = f"""
# HELP crawl4ai_memory_usage_percent Memory usage percentage
# TYPE crawl4ai_memory_usage_percent gauge
crawl4ai_memory_usage_percent {data['container']['memory_percent']}
# HELP crawl4ai_request_success_rate Request success rate
# TYPE crawl4ai_request_success_rate gauge
crawl4ai_request_success_rate {data['stats']['success_rate_percent']}
# HELP crawl4ai_browser_pool_count Total browsers in pool
# TYPE crawl4ai_browser_pool_count gauge
crawl4ai_browser_pool_count {data['pool']['permanent']['active'] + data['pool']['hot']['count'] + data['pool']['cold']['count']}
"""
return metrics
告警示例
async def check_alerts():
async with httpx.AsyncClient() as client:
health = await client.get("http://localhost:11235/monitor/health")
data = health.json()
# 内存告警
if data['container']['memory_percent'] > 80:
print("ALERT: Memory usage above 80%")
# 触发清理
await client.post("http://localhost:11235/monitor/actions/cleanup")
# 成功率告警
if data['stats']['success_rate_percent'] < 90:
print("ALERT: Success rate below 90%")
# 检查错误日志
errors = await client.get("http://localhost:11235/monitor/logs/errors")
print(f"Recent errors: {len(errors.json())}")
# 延迟告警
if data['stats']['avg_latency_ms'] > 5000:
print("ALERT: Average latency above 5s")
关键指标跟踪表
| 指标 | 数据路径 | 目标值 | 告警阈值 | 应对动作 |
|---|---|---|---|---|
| 内存使用率 | container.memory_percent |
<80% | >80% | 强制清理或扩容 |
| 成功率 | stats.success_rate_percent |
>95% | <90% | 检查错误日志 |
| 平均延迟 | stats.avg_latency_ms |
<2000ms | >5000ms | 排查慢请求 |
| 浏览器复用率 | browsers.summary.reuse_rate_percent |
>80% | <60% | 检查池配置 |
| 浏览器总数 | browsers.summary.total_count |
<15 | >20 | 排查浏览器泄漏 |
| 错误频率 | len(errors) |
<5/小时 | >10/小时 | 复盘错误模式 |
关键 Bug 修复
v0.7.7 同时包含一批重要的稳定性与性能修复:
- 异步 LLM 抽取(#1590):LLM 抽取此前会阻塞异步执行,导致 URL 串行处理而非并行(issue #1055)。修复后
arun_many配合LLMExtractionStrategy可实现真正的并行处理,批量 LLM 抽取工作流性能显著提升 - DFS 深爬(#1607):增强
DFSDeepCrawlStrategy的已见 URL 跟踪并补充文档 - 浏览器与爬虫配置文档(#1609):配置文档此前与
async_configs.py实际实现不一致,已全部对齐 - Sitemap Seeder(#1598):修复
AsyncUrlSeeder的 sitemap 命名空间解析与 URL 归一化问题(issue #1559),并补充了覆盖性测试 - 移除遮罩元素(#1529):修复
remove_overlay_elements不生效的问题(issue #1396),根因是未正确调用注入的 JS 函数(相关 JS 片段见 js_snippet/remove_overlay_elements.js) - 视口配置(#1495):修复托管浏览器下视口配置不生效的问题(issue #1490),浏览器启动时正确应用视口尺寸
- 托管浏览器 CDP 时序(#1528):CDP 端点校验存在时序问题导致连接失败(issue #1445),改为指数退避重试
- 安全更新:pyOpenSSL 从
>=24.3.0升级到>=25.3.0以修复安全漏洞,并附带验证测试 - Docker 修复:端口统一为 11235(此前 11234/11235 不一致);LLM API key 处理支持多 provider(PR #1537);Docker API 错误信息补充完整状态码;修复
/crawl与/crawl/stream中fit_html属性的序列化问题 - 其他:
arun_many在任何异常情况下也保证返回列表(PR #1530);webhook 配置中 PydanticHttpUrl的正确序列化;LLMConfig文档大小写与变量名一致性(issue #1551);放弃 Python 3.9 支持,现要求 Python >= 3.10
实际影响:面向不同角色
DevOps 与基础设施团队
- 完全可见性:精确知道爬取基础设施内部发生了什么
- 主动监控:在问题演变为故障之前捕获
- 资源优化:定位内存泄漏与性能瓶颈
- 运维控制:自动化系统失灵时人工介入
生产部署
- 企业级可观测性:对接 Prometheus、Grafana 与告警体系
- 调试:实时日志与错误追踪
- 容量规划:基于历史指标做扩容决策
- SLA 监控:对照目标跟踪成功率与延迟
开发团队
- 本地监控:开发期间理解爬虫行为
- 性能测试:量化配置变更的影响
- 排障:快速定位并修复问题
- 学习:直观理解浏览器池的工作方式
破坏性变更与升级说明
v0.7.7 无破坏性变更,完全向后兼容:所有现有 Docker 配置继续可用;现有端点无 API 改动;监控是纯增量功能;无需迁移。
Docker 升级
# 拉取指定版本
docker pull unclecode/crawl4ai:0.7.7
# 或使用 latest 标签
docker pull unclecode/crawl4ai:latest
# 运行(监控默认启用)
docker run -d \
-p 11235:11235 \
--shm-size=1g \
--name crawl4ai \
unclecode/crawl4ai:0.7.7
# 访问监控仪表盘
# http://localhost:11235/dashboard
Python 包升级
# 升级到最新版
pip install --upgrade crawl4ai
# 或安装指定版本
pip install crawl4ai==0.7.7
注意:Python 版本要求从此版本起为 Python >= 3.10。
运行官方监控 Demo
仓库提供了完整演示脚本 demo_v0.7.7.py,前置条件是 Docker 容器运行在 localhost:11235 且本机安装 httpx 与 websockets:
python docs/releases_review/demo_v0.7.7.py
Demo 依次演示:系统健康总览(实时指标)、请求追踪(活跃/完成)、浏览器池管理(permanent/hot/cold)、完整 Monitor API 端点示例、WebSocket 流演示、控制动作(清理/终止/重启)、生产指标与告警模式、自托管价值主张。此外,仓库内还有更轻量的仪表盘验证脚本 test_monitor_demo.py:提交单 URL 与多 URL 抓取后,依次检查 /monitor/health、/monitor/requests、/monitor/endpoints/stats,确认仪表盘已产生活动数据。
实用建议(Pro Tips)
- 从仪表盘入手:先访问
/dashboard熟悉整个监控系统 - 盯住 6 项关键指标:内存、成功率、延迟、复用率、浏览器数量、错误频率
- 尽早配置告警:在问题发生前用 Monitor API 搭建告警
- 关注浏览器池效率:复用率目标 >80% 为最佳状态
- 自定义仪表盘用 WebSocket:为团队构建贴合需求的监控 UI
- 利用 Prometheus 集成:指标长期存储与分析
- 查看 Janitor 日志:理解自动清理节奏(空闲 TTL 会随内存压力自适应变化)
- 慎用控制动作:手动干预仅针对异常场景
版本适用性说明
本文以 Crawl4AI v0.7.7 发布说明(release-v0.7.7.md)为主体,源码佐证取自当前仓库 deploy/docker/ 目录。需要说明:当前仓库的版本号已演进(见 version.py,当前为 0.9.0),监控子系统在后续版本中有多处实现调整——例如 /monitor/browsers 响应结构、控制动作的管理鉴权(require_admin)、无锁池快照(issue #1754)等均为 0.7.7 之后的演进。如果你部署的是 0.7.7 镜像,本文的 API 示例可直接使用;若部署更新版本,端点与数据结构请以 monitor_routes.py 与 monitor.py 的当前实现为准。相关文档可进一步参考 self-hosting.md 与 ARCHITECTURE.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 StartedRust0623
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