Files
market/skills/web-access/references/jina-reader.md
Yige 0d4d7b208b feat(web-access): v3.0 内置浏览器能力面同步——删除 Python Playwright 回落(S31) (#85)
## 变更内容 / 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
2026-08-17 01:25:46 -04:00

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_KEY if 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:

  1. Hard login wall → escalate to L3 CDP browser
  2. Geographically restricted → tell the user, suggest VPN or manual access
  3. Cloudflare challenge → try L3 CDP (user's browser passes challenges naturally)
  4. 404 / gone → confirm the URL is correct

In all cases, tell the user explicitly which URL failed and what you tried.