核验清单
- ✓用结果文件里的
custom_id对成功行,用错误文件对失败行。失败行、校验失败的整单、窗口到期时仍未处理的行,不应进这一批的 token 费用。取消前已经成功的行仍要计。 - ✓看 JSONL 里
body最外层的enable_thinking,不要看extra_body。qwen3.5 到 qwen3.8 默认开启。结果文件没有reasoning_content,不能用content的字数去对输出 token。 - ✓同一文件的
body.model和思考模式必须一致。混了模型,任务会在校验阶段失败,整单不跑、也不计推理费。 - ✓账单实例 ID 的调用渠道应是
batch。新人免费额度和上下文缓存解释不了这一列。阶梯价按这一行的输入总量整段跳档,再打五折。 - ✓任务还在跑时,用量页查不到这批调用。批量按任务结束统计,出账是小时级。提交后几分钟的空账单,不能当成没扣。
1. 半价只落在成功的行上
百炼批量推理说明把单价写成:成功请求的输入和输出 token,都按对应模型实时推理价格的 50%。这是行级折扣,不是「文件一上传就整包半价」。文件解析失败、任务执行失败、行级错误,都不产生费用。状态停在 validating 然后变成 failed,通常是文件级错误,文档写明此时不会执行任何推理请求,也不会生成结果文件。混了不同模型就会走这条路,错误信息会指出某一行的 model 和批次其余行不一致。
取消和过期要拆开看。OpenAI 兼容 Batch 接口写明:任务在 completion_window 内没完成,状态变为 expired,未处理的请求不再执行,也不产生费用。被取消的任务里,取消前已经成功完成的请求仍正常计费。控制台把最长等待写成 1 到 14 天;兼容接口把 completion_window 写成最短 24h、最长 336h,只接受整数。窗口用完,已经成功的行留在结果文件里照计,没轮到的行既没有结果也不收费。整单状态写成已终止,不等于这批文件免费。
提交成功也还不是成交。多模态行里的图片、视频地址必须是公网 URL。本地路径和内网地址可以让任务提交成功,但不会被处理完成。处理不完就进不了「成功请求」那一档,也就不该按半价出 token 账。对账时先分三堆:结果文件里的 custom_id、错误文件里的 custom_id、窗口到期时根本没出现在这两个文件里的行。只有第一堆进入 50% 的输入和输出。
2. 半价乘的是思考后的输出
50% 乘的是这一行实际产生的输入和输出,不是可见答案的字数。批量说明写明:qwen3.8、qwen3.7、qwen3.6 和 qwen3.5 系列默认开启思考模式。开启后会产生思考 token,并按输出 token 价格计费。半价因此是「实时输出价的一半,乘上包含思考的输出量」。短答案旁边可以有很长的思考。文档建议在混合思考模型上显式设置 enable_thinking,true 开、false 关。不写这个字段,用的是该模型的默认,当前这几系的默认是开。
参数放错地方等于没关。批量说明写明:enable_thinking 和 thinking_budget 必须放在 JSONL 每行 body 的最外层,与 model 同级。放进 extra_body 无效,那是实时推理里 OpenAI Python SDK 透传非标准参数的写法,批量文件不吃。同一文件里的请求还得使用相同模型和相同思考模式。想关思考,每一行的 body 都要带上 enable_thinking: false。thinking_budget 是思考 token 的数量上限,只在你打开思考时用来封顶,不是把已经生成的思考退款。
更容易对错账的是结果文件本身。文档写明:批量结果文件不包含 reasoning_content。即便 enable_thinking 为 true,choices[0].message 里也只有 content 和 role。要看思考过程,得改走实时接口。所以批量账单上的输出 token,可以明显大于你下载到的那段答案。拿 content 去做本地 tokenizer,对不上是预期,不是漏单。DeepSeek 把思维链放进可见的 reasoning_content 是另一口返回。这里是付了思考的输出价,下载文件里却没有那段文本。
3. 半价不叠缓存,阶梯按整段跳
批量是独立计费项。说明里写它支持「AI 通用型节省计划」,同时不支持「预付费(节省计划)」、新人免费额度,以及上下文缓存。两套名字都带「节省计划」,抵扣范围并不相同,不能用其中一套的余额去解释另一套。新人免费额度解释不了渠道为 batch 的这一列。实时推理里能抵的额度,不会自动把批量行变成 0 元。
模型价格页把两件折扣写成不能同时生效:模型支持 Batch 时,输入和输出都按实时价的 50%;模型支持上下文缓存时,只是输入享有折扣。批量任务上不要再期待缓存命中把输入再打一层折。价格页还写了阶梯规则:单价取决于单次请求的输入 token 总量,该请求的所有 token 都按对应阶梯结算。文档举例,两档若是不超过 32K 和 32K 到 128K,输入 100K 就整段按第二档,而不是前 32K 走便宜档、超出部分再跳档。批量的 50% 是这一档实时价的一半。输入一跨档,成功行的输入和输出一起变贵,然后再打五折。
窗口长度也别拿实时价目表直接套。批量说明写明,qwen3.8-max、qwen3.8-flash、qwen3.7、qwen3.6、qwen3.5 以及列出的全模态模型,在 Batch 场景下单次请求的上下文最大 256K。价目表里同一族模型的实时阶梯可以标到更长。超过批量上限的行,不是按实时长窗口的半价成交。地域表也不一样:华北 2(北京)列出的模型远多于新加坡。模型不在该地域的支持表里,任务会在校验失败,整单不跑。失败单不计推理费,也没有半价结果。
4. 账单晚到,渠道才写 batch
账单查询说明把出账节奏分开:大模型推理通常 2 到 10 分钟出账,批量推理、模型训练、知识库按小时汇总,高峰还可以再晚。用量页更慢一层。批量说明写明,调用数据以任务结束时间为准,正在运行的任务在完成前查不到,监控还有 1 到 2 小时延迟。提交之后立刻打开费用概览,看到的空档是出账时点,不是免费。
对上之后看实例 ID 的调用渠道。账单说明把「资产/资源实例 ID」按分号拆段,其中一段是调用渠道,batch 表示批量推理。同一模型的实时调用渠道是空的,或是控制台、应用、知识库等别的代码。把实时行和批量行加在同一个模型名下,会把 50% 的成功行和全价的实时行混成一笔。免费额度用完即停的标志是另一段,取值 0 或 1。渠道已经是 batch 时,先别用那个开关解释金额。
结果文件还有一道和账单不同的时钟。批量说明写明,任务结束超过 30 天,结果和错误文件会自动删除。账单按月留着。过了这 30 天,你还能看到渠道为 batch 的总额,却可能已经没有 custom_id 去区分哪些行成功、哪些行该是 0。要按行对账,得在删除前把两个文件存下来。文件里的 custom_id 最长 256 个字符,更长的标识要放在创建任务时的 metadata 自定义字段里回传,不要硬塞进 custom_id,否则校验失败,整单不跑。
5. 充值换不来这一批的半价
对账按五列走。第一列是任务状态:failed 在校验阶段通常整单未跑;expired 只放过已经处理完的行;cancelled 仍要收取消前的成功行。第二列是 enable_thinking 是否写在 body 顶层,以及结果文件有没有 reasoning_content(按当前文档,没有)。第三列是这一行输入落在哪一档,50% 打在那一档上。第四列是实例 ID 里的渠道是不是 batch,以及有没有人拿免费额度或上下文缓存去减它。第五列是结果文件还在不在 30 天里。型号和默认思考会变,以这一笔的 body.model 和批量说明里的支持表为准。
给百炼账户充值发生在扣款之前。批量按后付费从余额扣,开通服务后就可以用,不需要另买一个批量套餐。链上把稳定币换成能充进账户的资产,不改变成功行的 50%,也不把思考 token 从输出里拿掉,更不会让失败行突然开始计费。需要这一步时,可以用无需注册、非托管的 AllSwap 完成链上兑换。兑换成功只说明资产换了手。成功行里的思考输出,该按实时输出价的一半出现,还是会出现。