这类问题我又碰上了一次。讯飞星火 Spark4.0 Ultra 的 WebSocket 接口,一次把 40 页 PDF 文本塞进 payload,收到 code 10013,原文 input content is too long,控制台写的是 128k 上下文,而文本只有 3 万汉字。

第一反应是「domain 参数写的是 4.0 Ultra,套餐实际给的是 Lite」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。汉字按 1 字约 1.5 token 计,3 万字已经接近 45k;请求里还带了前几轮历史,一起计入上下文;附件被转成 base64 混进了文本字段。

第一件事是按官方口径估算这段文本的 token

python -c "t=open('doc.txt',encoding='utf-8').read();print(len(t), int(len(t)*1.5))"

接着把历史轮次清空,只发本轮文本验证

python spark_probe.py --no-history --file doc.txt

然后核对 domain 与套餐是否匹配

python -c "print({'domain':'4.0Ultra','plan':'check console'})"

末了按 20k 字切段,用 summarize 链路汇总

python chunk_doc.py --chars 20000 --out parts/

这类问题以前遇到过,但这次的触发条件和上次不一样。

怎么算真的好了,看的是同一批现象。WebSocket 返回 code 0 且 finish_reason 为 stop,日志里的 token 估算与用量接口对得上。

容易忽略的是,厂商写的上下文长度通常按 token 计,中文换算要乘系数,报 10013 时先砍历史再砍正文,比反复调 domain 有效。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189