## 变更内容 / What
浏览器升级计划 S31 最终验收信号:web-access 技能与内置受管浏览器新能力面对齐,**删除「用户手工启动调试 Chrome +
Python Playwright」回落路径**。
- **删除回落路径**:Prerequisites: Chrome CDP Setup、Layer 3 CDP Browser(Python
Playwright 模板)、Installation Note(pip install
playwright)整段删除;references/cdp-browser.md 文件删除;jina-reader.md 的 CDP 引用改为
page.extract-text
- **订正陈旧断言**:
- 「没有批量取文通道」→ BrowserSnapshot mode:text /
page.extract-text(maxBytes/cursor 分页,超出截断给 nextCursor)
- 「page.evaluate 基本不可用」→ 返回真实值(expression/awaitPromise,超预算截断标
truncated);仍走人工闸门
- 「截图前必须 tab.activate / 串行截图 / BROWSER_TAB_HOST_NOT_FOUND」→ S36 订正:Agent
单标签会话免 activate;多标签后台 tab 秒级报 BROWSER_VIEWPORT_UNAVAILABLE;命令超时只 stop 不
close,标签页可重试
- 「accessibility 超限即失败」→ 尊重 depth + maxBytes 截断翻页(S8)
- 「只有整页截图」→ clip{x,y,width,height,scale≤4} + captureBeyondViewport
- **provides.tools 加 BrowserScript**(code-mode;信任级别等同 Bash)
- **新增选用规则(D4 唯一约束机制)**:反检测站点一律优先 input.*(#1808 输入拟真 +
身份一致性);page.element 写类仅用于表单批量填充等站点不检测场景;JS 直调 el.click() 为禁止回退
- **新增 fetch.browser 配方**:page.evaluate 页面上下文跑 fetch(带 origin Cookie、同
origin、受 Grant origins 约束)——登录态取站内接口的正解
- **能力速查**:page.element 九 op / page.wait 九 until / inline wait 块 / loc=
方言 / BrowserScript / 跨源 iframe 快照(S35)
- **版本** 2.2.1 → 3.0.0(删除回落层为 breaking);source_hash
重算;required_client_version 维持 10.0.98(新能力在正文标注 10.0.112+)
## Why
v2.x 时代回落路径存在的每一条理由(无批量取文、evaluate 不可用、截图必须串行 activate)均已被
S2–S14/S35/S36 覆盖;文档继续引导用户手工起调试 Chrome 会误导新 Agent 走已废弃路径。
双语同步修改(SKILL.md / SKILL.zh-CN.md heading 数一致,i18n-validate 通过)。
- [x] CLA
4.2 KiB
Jina Reader — Default Token-Optimization Layer
Jina Reader is a free public service that renders any URL server-side and returns clean Markdown. In this skill's three-layer architecture, Jina is Layer 2: the default extractor for heavy/JS-rendered pages, not just a fallback.
Positioning in the three-layer model
L1 WebFetch ── simple public static pages (docs, Wikipedia, HN)
│
│ WebFetch empty/truncated/garbled
▼
L2 Jina Reader ── DEFAULT for JS-heavy SPAs, long articles, Medium, Twitter
│ Strips nav/ads automatically, saves 50-80% tokens
│
│ Login required, or Jina also fails
▼
L3 CDP Browser ── user's logged-in Chrome (小红书/B站/微博/飞书/Twitter)
Key insight: Don't wait for WebFetch to fail before trying Jina. For any URL you expect to be JS-heavy (any major SPA, Medium, Dev.to, long-form articles), go straight to Jina for the token savings.
Basic Usage (no API key)
curl -sL "https://r.jina.ai/https://example.com/article"
The original URL goes after r.jina.ai/. The response is plain Markdown — pipe to a file or read directly.
When to use each layer
| Scenario | Primary choice | Why |
|---|---|---|
| Wikipedia, MDN, official docs | L1 WebFetch | Static clean HTML, fastest |
| GitHub README (public) | L1 WebFetch | Simple markup |
| Medium articles | L2 Jina | Member walls + heavy JS |
| Dev.to, Hashnode | L2 Jina | JS-rendered |
| Substack, Ghost blogs | L2 Jina | Partial JS rendering |
| News sites with lazy-load | L2 Jina | Scroll-triggered content |
| Twitter/X public threads | L2 Jina first, L3 CDP if truncated | Sometimes works |
| 公众号 (mp.weixin.qq.com) | L2 Jina | Clean Markdown extraction |
| LinkedIn articles | L3 CDP | Hard login wall |
| 小红书, B站, 微博, 飞书 | L3 CDP | 登录强制 |
Token savings example
Raw HTML of a long Medium article: ~150 KB, ~50,000 tokens Same article via Jina Reader: ~20 KB, ~7,000 tokens
86% reduction, with cleaner structure and no ads/nav cruft.
Advanced Endpoints (optional)
If you need more than basic content extraction, Jina also offers:
- Search:
https://s.jina.ai/<query>— returns top 5 results as Markdown - Embeddings:
https://api.jina.ai/v1/embeddings(requires free API key) - Reranker:
https://api.jina.ai/v1/rerank(requires free API key)
For DesireCore, prefer the built-in WebSearch tool over s.jina.ai for consistency.
Rate Limits
- Free tier: ~20 requests/minute, no authentication needed
- With free API key: higher limits, fewer throttles
curl -sL "https://r.jina.ai/https://example.com" \ -H "Authorization: Bearer YOUR_KEY" - Get a free key at jina.ai — stored in env var
JINA_API_KEYif available
Usage tips
Cache your own results
Jina itself doesn't cache for you. If you call the same URL repeatedly in a session, save the Markdown to a temp file:
curl -sL "https://r.jina.ai/$URL" > /tmp/jina-cache.md
Handle very long articles
Jina returns the full article in one response. For articles > 50K chars, pipe through head or extract specific sections with Python/awk before feeding back to the model context.
Combine with the built-in browser
For login-gated pages, the built-in browser already has its own extraction channel with paged budgets — BrowserAct({ action: 'page.extract-text', params: { format: 'markdown', maxBytes: 65536 } }) returns clean Markdown directly (beyond maxBytes it truncates and hands back a nextCursor). Jina can't log in on your behalf, so use Jina for public pages and page.extract-text for logged-in ones; there is no need to round-trip HTML through Jina anymore.
Failure Mode
If Jina Reader returns garbage or error:
- Hard login wall → escalate to L3 CDP browser
- Geographically restricted → tell the user, suggest VPN or manual access
- Cloudflare challenge → try L3 CDP (user's browser passes challenges naturally)
- 404 / gone → confirm the URL is correct
In all cases, tell the user explicitly which URL failed and what you tried.