每月固定费 0 元:别让 SSE 解析错误浪费 token
01 / 固定费可以是 0 元,解析错误仍可能增加账单
小预算接入 AI 流式接口,最容易忽略的成本是重复请求:页面漏字,用户点击重试;程序误判断流,又自动生成一次。已经发生的生成可能产生费用,取消请求也不代表此前用量免费。先把流读对,比急着增加重试按钮更划算。
CheapRelay 按实际 token 用量计费,包括缓存读取和写入,没有月费或订阅费,因此平台月度固定费是 0 元,调用费用则随用量产生。下面先用本地字符串验证解析逻辑,不需要发送付费请求。
02 / 一次读取不等于一条消息
SSE 是服务端发送事件。它通过持续打开的 HTTP 响应传输文本,但网络交给你的首先是字节。一次读取可能只收到半个汉字,也可能收到三条事件加下一条事件的开头。读取次数、文本行数和事件数量没有一一对应关系。
因此,别对每次读取的结果直接做 JSON 解析,也别把每个数据块当成完整事件。正确顺序是:字节解码成文本,文本拆成行,按行累积事件,最后交给业务层处理。
03 / 保留一个解码器,再处理三种换行
整个响应复用同一个 UTF-8 解码器。使用 TextDecoder 时,中间各次解码开启 stream 模式;读取结束后再调用一次解码,刷新残余字节。每块新建解码器,可能把跨块汉字变成替换字符。流开头的字节顺序标记也应正确处理,避免它混入第一个字段名。
行解析器需要识别 LF、CRLF 和单独的 CR。尤其注意:一个数据块可能以 CR 结束,下一个以 LF 开始;这仍然只有一次换行,不能凭空多出一个空行。保留跨块状态,用尚未结束的文本继续拼下一块。
04 / 空行才是事件边界,data 可以出现多次
得到完整行后,先判断它是否为空。空行触发事件派发;以冒号开头的行是注释,通常用于心跳,直接忽略。其他行只按第一个冒号拆成字段名和值,并删除值开头至多一个普通空格。不要对整行使用 trim,否则会误删正文空格。
- ■ 遇到 data,把值追加到当前事件的数据缓冲区,并追加一个换行符。
- ■ 遇到 event,保存事件类型;派发后重置,未指定时使用默认类型 message。
- ■ 派发时,数据缓冲区为空就不发送事件;否则只移除最后一个追加的换行符,多行 data 之间的换行要保留。
- ■ 无冒号的行按值为空的字段处理;未知字段忽略。单独一行 data 因而可以形成空字符串数据事件。
例如两行 data 的值分别是“第一行”和“第二行”,随后出现空行,得到的是一个包含换行的字符串,而不是两条消息。只有一个空行、没有 data 的心跳,不应变成空消息。
05 / 把结束标记和 JSON 留给业务层
某些接口使用 [DONE] 表示生成结束,但它不是 SSE 协议本身的结束规则。先解析出完整事件,再由接口适配层识别标记;只有接口约定数据是 JSON 时,才执行 JSON 解析。注释、事件类型和错误事件都不该被当成普通正文。
连接关闭也不能充当空行。按照 SSE 的事件派发规则,流结束时仍未由空行结束的事件要丢弃。即使最后一段看起来是完整 JSON,也不要擅自补齐;业务层应记录“连接结束但未确认生成完成”,让用户决定是否重试。
如果准备自动重连,还要实现 id 和 retry:id 可以为空,含空字符的值应忽略;retry 只接受由数字组成的值,单位是毫秒。保存事件编号不代表服务端一定支持续传,更不代表再次提交生成请求可以避免重复计费。
06 / 用本地切片测试守住小预算
准备一份固定字节样本,包含中文、注释、多行 data、空数据事件、CRLF 和结束标记。先整段输入,再在每一个字节位置分别切成两块输入,比较输出事件是否完全一致。还要测试逐字节输入,以及连接在事件中途关闭的情况。这些检查都可以在本地完成。
给行缓冲区和单个事件设置可配置上限,例如先用 1 MiB 作为项目保护值;这不是 SSE 标准限制,实际值应按接口数据调整。超限时明确报错,避免无限占用内存。页面更新也可以短暂合并,减少每收到几个字符就重新渲染的开销。
本地测试通过后,再用较短输入和较小输出上限验证一次真实请求。若需要按量接入,可以注册 CheapRelay,使用 https://api.cheapapirelay.com/v1 对接兼容接口。记录响应状态、完成标记和接口返回的用量信息,能帮助你区分解析失败、网络中断与正常结束,把有限预算花在有效生成上。
注册 价格自己试,注册就送试用额度。
顺手再看
| 日期 | 货架 | 语言 | 标题 |
|---|---|---|---|
| 2026-10-28 | 协议细节 | ZH | 先把输出限到128个令牌:低预算读懂Anthropic Messages API 从OpenAI聊天接口迁移,先弄清system位置、内容块、请求头与令牌用量。用128个输出令牌做小测试,避免把格式错误和重复上下文变成账单。 |
| 2026-10-28 | 少花一点 | ZH | 输出从1000减到200词元:示例每次省0.0032元 预算很小时,先管住回答长度。用一笔明确标注的假设账单,学会写长度要求、设置输出上限,并检查回答缩短后是否真的省钱。 |
| 2026-10-28 | 少花一点 | ZH | 先定5元预算:用AI生成20条样本,再扩成1000条测试数据 从5元自定预算出发,让AI只处理难编的样本,再用脚本扩充数据;附提示词、令牌成本算法和检查步骤,适合第一次尝试的新手。 |
| 2026-10-28 | 低成本上手 | ZH | 先设1美元上限,批量写100条商品描述 用表格、低价按量计费API和一个小脚本,零经验也能低成本批量生成商品描述。 |
| 2026-10-28 | 模型比价 | ZH | 1美元预算,Gemini 3.8 Flash每次回答多少钱 用真实Token账单计算Gemini 3.8 Flash与Gemini 3.1 Pro的单次成本,适合预算只有1美元的新手。 |
| 2026-10-28 | 省钱用编码 Agent | ZH | 预算0.90元:用Codex CLI只重构一个小函数 把一次小重构的预算定为0.90元:先核对接口与计费,再限制文件、上下文和尝试次数。附新手操作顺序,不把预算冒充实测账单。 |