ValueError: content = r.text # fallback if response isn’t valid JSON

该报错通常出现在自建 LangChain 网页抓取 Loader/Tool 时,调用 r.json() 但目标网站(如 Cloudflare 防护页面)返回了 HTML 或非 JSON 内容。优先在 r.json() 外层增加 try/except ValueError 并回退到 r.text ,同

快速结论:该报错通常出现在自建 LangChain 网页抓取 Loader/Tool 时,调用 r.json() 但目标网站(如 Cloudflare 防护页面)返回了 HTML 或非 JSON 内容。优先在 r.json() 外层增加 try/except ValueError 并回退到 r.text,同时为 requests.post 设置 timeout,避免抓取请求长时间阻塞 Agent 循环。

适用环境:LangChain 自定义 BaseTool / Loader;Python 环境;依赖为 requestslangchain-core。Issue 中未确认具体操作系统、CUDA、显卡等硬件信息。

最快修复方案:暂无确认的一步修复方案。可优先尝试在 Loader 的 load() 方法中使用评论中给出的包装方式:先 r.raise_for_status(),再用 try/except ValueError 包裹 r.json(),失败时回退为 r.text,并设置默认 timeout=30

注意事项:该方案来自 Issue 讨论中的建议,未经过官方集成验证;LangChain 官方已明确不再接受额外集成到 monorepo,需要自行发布 PyPI 包。Cloudflare 防护页面首次渲染较慢,可能需要把超时调整到 45–60 秒;抓取内容应在 metadata 中标记 trust_level: "untrusted",避免下游将外部抓取内容等同于内部数据。

问题场景

用户在 LangChain Agent 或研究链中使用自定义网页抓取 Loader/Tool(例如访问 LinkedIn、Amazon、政府页面等 Cloudflare 防护站点)时,调用 requests.post(...).json() 解析响应。如果目标站点返回的不是 JSON(例如 Cloudflare 返回 HTML 错误块),代码会抛出 ValueError,导致抓取任务失败,甚至可能让整个 Agent 循环中断。

报错原文

ValueError: content = r.text # fallback if response isn't valid JSON

原因分析

可能原因:requestsresponse.json() 要求响应体必须是合法 JSON;当目标站点受到 Cloudflare 保护或返回非 200 错误页时,响应体通常是 HTML 或纯文本,此时 r.json() 会抛出 ValueError。另外,若请求没有设置 timeout,慢速站点可能让抓取请求无限挂起,阻塞整个 Agent 执行。

环境排查

  • 确认 Python 版本以及 requests 库是否已安装。
  • 确认是否使用 langchain-core 中的 Document 类。
  • 确认目标 URL 是否确实返回 non-JSON 内容(可在浏览器 DevTools 或 curl 中查看响应头与正文)。
  • 如使用 API Key,确认请求头中 Authorization 是否正确设置。
  • 确认当前 LangChain 版本是否已停止接受新的社区工具集成(该 Issue 已标记 external,官方建议另建仓库并通过 PyPI 分发)。

解决步骤

  1. 在自定义 Loader/Tool 的请求处理中,先调用 r.raise_for_status() 显式检查 HTTP 状态码。
  2. 使用 try/except ValueError 包裹 r.json(),捕获解析失败后回退到 r.text
    try:
        data = r.json()
        content = data.get("markdown", "")
    except ValueError:
        content = r.text  # fallback if response isn't valid JSON
  3. requests.post 增加 timeout 参数,默认可设置为 30 秒;遇到 Cloudflare 防护页面可适当提高到 45–60 秒。
  4. 同时捕获 requests.exceptions.Timeoutrequests.exceptions.RequestException,避免未处理异常中断 Agent 循环。
  5. 在返回的 Document.metadata 中加入 "trust_level": "untrusted",标识外部抓取内容不可直接信任。
  6. 如果打算将工具发布给他人使用,不要提交到 LangChain 主仓库,而是创建独立仓库并发布到 PyPI。

验证方法

用受 Cloudflare 保护的测试 URL 调用自定义 Loader,确认不再抛出 ValueError,而是返回 markdown 或原始响应文本;再模拟慢速站点或超时场景,确认返回超时错误信息,且 Agent 循环不会被阻塞。

参考来源

langchain-ai/langchain #36134

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 16925

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注