Claude API 报 413 怎么办?测量 JSON 请求大小并缩减图片与历史消息

Claude API 的 413 通常需要缩减请求体。教程测量实际 UTF-8 JSON 字节数,定位大图片和历史消息,并说明压缩、配对消息保留及修复后核验。

Claude API 返回 HTTP 413 或 request_too_large,优先检查发送出去的请求体有多少字节。它表示请求体超过大小限制;单纯提高 max_tokens、连续重试或缩短预期答案,都不能减少已经装进 JSON 的图片和历史消息。

本文面向 Python 直连 api.anthropic.com 的 Messages API。按照 2026 年 10 月 1 日核对的官方错误文档,Messages 与 Token Counting 请求大小上限均为 32 MB。其他端点和托管平台的上限不同;这里的示例没有进行线上付费请求实测。

Claude API 报 413 怎么办?测量 JSON 请求大小并缩减图片与历史消息

先确认是字节超限,还是另一种错误

症状 先看什么 处理方向
HTTP 413,request_too_large 序列化后的整个请求体字节数 减少图片体积、内容块或重发历史
HTTP 400,提示上下文太长 模型、输入 token、输出预算 按上下文窗口计算,不能只测文件大小
HTTP 400,提示图片格式或尺寸不合法 真实图像格式、media_type、像素尺寸 修复该图片,不要当成总请求体超限
来自自己的网关的 413 网关/反向代理的请求体限制 先定位限制层,并保留直连 API 的上限约束

记录 HTTP 状态、请求发生时间和 request-id 响应头;如果响应带有 JSON request_id,一并保存。直连 API 的超大请求可能在到达 API 服务器前被边缘层拒绝,因此不要把“没有正常业务响应”当成认证失败的证明,也不要记录密钥或完整敏感材料。

测量实际发送的 JSON,而不是原始图片文件

Base64 每 3 个原始字节通常编码为 4 个字符,长度为 4 × ceil(原始字节数 / 3)。例如 12,000,000 字节的图片编码后约为 16,000,000 字节,再加上 JSON 和其他内容。多张图片、重发的旧图片、工具返回的截图都可能一起累积。

下面先在本地读入 payload.json,测量各字段和内容块,只输出大小与位置,不打印内容。它把 JSON 重新压成紧凑 UTF-8,然后使用同一份字节发送,因此测量值与本例请求体一致。真实 SDK 若用另一种序列化方法,应测它最终发送的字节,而不是照搬这个数值。

  1. 把待诊断的 Messages 请求 JSON 保存为 UTF-8 的 payload.json。认证头不放在这个文件里;诊断完妥善处理含业务材料的文件。
  2. 安装 Python 3.10 或更新版本和 requests:python -m pip install requests。
  3. 保存下列代码为 measure_payload.py,先运行 python measure_payload.py,此时不会发网络请求。
import json
import os
import sys
from pathlib import Path
import requests

def encode(value):
    return json.dumps(value, ensure_ascii=False,
                      separators=(",", ":")).encode("utf-8")

payload = json.loads(Path("payload.json").read_text(encoding="utf-8"))
body = encode(payload)
print("body_bytes", len(body), "decimal_MB", round(len(body) / 1_000_000, 3))
for field, value in payload.items():
    print("field", field, "bytes", len(encode(value)))
for i, message in enumerate(payload.get("messages", [])):
    content = message.get("content", "")
    print("message", i, "role", message.get("role"), "bytes", len(encode(content)))
    if isinstance(content, list):
        for j, block in enumerate(content):
            print("block", i, j, "type", block.get("type"),
                  "bytes", len(encode(block)))

# 28,000,000 是本例设置的保守发送阈值,不是官方接口上限。
if len(body) > 28_000_000:
    raise SystemExit("先缩减请求体,本例拒绝发送超过保守阈值的请求")
if "--send" in sys.argv:
    response = requests.post(
        "https://api.anthropic.com/v1/messages",
        headers={"x-api-key": os.environ["ANTHROPIC_API_KEY"],
                 "anthropic-version": "2023-06-01",
                 "content-type": "application/json"},
        data=body, timeout=(10, 60),
    )
    print("status", response.status_code,
          "request_id", response.headers.get("request-id"))
    response.raise_for_status()
    result = response.json()
    print("stop_reason", result.get("stop_reason"))
    print("\n".join(b["text"] for b in result.get("content", [])
                    if b.get("type") == "text"))

各子项数字用于定位占用来源,包含它们自己的 JSON 结构,不应把所有行再相加来替代 body_bytes。先找最大的图片块、工具结果或历史消息,再决定怎样缩减。

按占用来源进行缩减

图片大:先裁掉无关区域,再控制分辨率和编码

如果任务只需要读取一张截图中的某个表格,裁掉无关区域通常比把整张图压得模糊更合适。不要裁掉列标题、单位、图例或影响判断的上下文。文字类截图缩小后必须打开检查,重要文字仍要可读。

下面是可选的本地压缩例子,需执行 python -m pip install pillow。它生成新文件,不覆盖原图;1600 像素和质量 85 是演示参数,需要按内容调整。

from PIL import Image

with Image.open("original.png") as image:
    image = image.convert("RGB")
    image.thumbnail((1600, 1600))
    image.save("smaller.jpg", format="JPEG", quality=85, optimize=True)

将请求中的图片数据重新编码为 smaller.jpg 的字节,同时把 media_type 改为 image/jpeg,不能只改文件名。支持格式和压缩对文字可读性的影响可查官方视觉文档。总请求体合规后仍需满足单张图像的大小、尺寸和格式限制。

历史消息大:保留任务事实,移出不再需要的原材料

先查是否每轮都重复加进同一张图片或同一份附件。删除重复材料前,核对当前任务是否仍需要它;需要的部分可以摘要,但摘要必须保留关键事实、引用位置和未解决问题。重新开启任务时,也要把当前目标与已确认事实带过去。

工具会话不能随便删掉一半协议消息。包含 tool_use 的 assistant 消息与对应 tool_result 应保持配对,相关格式见官方工具结果处理说明。历史里的 thinking 内容也不要自行改写后原样冒充原块;先按所用模型的规则处理。

材料确实很多:拆成可核对的子任务

例如分别读取三张表,再把经过人工核对的表格内容交给最后一次汇总。拆分前写清公共字段、单位和文件来源,避免最后把不同口径的数据混在一起。拆分不是绕过单张图像限制,也不意味着模型上下文窗口会变大。

修复后这样验证

  1. 重新生成 payload.json,运行测量脚本,确认 body_bytes 确实下降,最大的占用块已缩减。
  2. 检查图片和摘要仍包含完成任务需要的信息;只让错误消失、却丢了关键列,不算完成修复。
  3. 确认模型 ID、消息结构和输出预算正确,配置 ANTHROPIC_API_KEY 后执行 python measure_payload.py --send。
  4. 预期是请求不再报 413。成功时检查 stop_reason 与回答是否完整;若变成 400,按新错误排查格式、图像或上下文,不要认为已经得到有效答案。

本例没有自动重试。请求体完全相同的 413 应先调整输入再发送;原样重复只会得到同样的限制问题。

相关问答

能用 token 数判断会不会报 413 吗?

不能单独判断。413 看请求体字节数,上下文看模型 token;同一份图片的 Base64 字符串可能占很多请求体字节,但视觉 token 是另一种计数。两道限制都要满足。

把 max_tokens 改小为什么仍然报错?

max_tokens 约束生成输出。请求里的图片、文本和历史消息仍要完整上传;应先按测量结果缩减输入,再校验输出预算。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30424.html

赞 (0)
AI小管家的头像AI小管家
用 Kimi 做阅读理解:把原文事实、合理推断和无法判断分开
上一篇 1天前
Kimi 文档能对比两个版本吗?用差异表核对新增、删除和数值修改
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部