☰
用户提前断开模型流,费用账上该记成功、取消还是未知
2026/10/26 23:52:25 网站建设 项目流程

用户关闭页面,网关收到取消信号,日志里写了cancelled。财务问这次请求花了多少钱,答案仍可能是“不知道”。取消的是本地等待;供应商是否停止、是否已经产出计费 token、最终账单怎样计算,需要额外证据。

一条状态装不下两件事

执行结果和费用结果应该分开。success/cancelled/unknown描述我们观察到的执行;usage_known/bill_pending/reconciled描述费用证据。取消与待对账可以同时成立。HTTP 200、客户端断开或本地 context 结束,都不能单独证明费用为零。

OpenAI API 更新记录与供应商文档应作为字段语义的依据;OpenTelemetry GenAI 项目则是观测约定的参考,仍应固定版本。下文的字段是自定义账务模型,不冒充供应商通用响应字段。

每一次尝试都有自己的账

一个用户请求重试两次,应有一个业务请求号和三个 attempt。每条 attempt 记模型具体版本、开始和结束时间、上游请求号、取消原因、实际拿到的 usage、费率版本和对账状态。不能把最后一次成功的 usage 覆盖前两次未知尝试。

attempts = [ {'id':'a1', 'execution':'cancelled', 'cost':None}, {'id':'a2', 'execution':'success', 'cost':12}, ] def summarize(rows): return {'known_cost':sum(r['cost'] for r in rows if r['cost'] is not None), 'unknown_attempts':sum(r['cost'] is None for r in rows)} assert summarize(attempts) == {'known_cost':12, 'unknown_attempts':1} attempts[0]['cost'] = 3 assert summarize(attempts) == {'known_cost':15, 'unknown_attempts':0} print('known subtotal 12 plus one unknown; reconciled total 15')

本地 Python 3 验证通过。12 和 3 是构造的记账单位,不是 API 价格或实测消费;实验没有调用模型。它证明未知项不能被零填充,不证明任何供应商取消计费政策。

取消后做有界收尾

网关应尽力向上游传播取消,关闭资源,并保留已观察到的使用量。若供应商提供异步最终结果或用量查询,用独立对账流程补齐;若没有,应标为估算或未知,并规定最长追账窗口。不要为了等最终 usage 无限占用连接,也不要在日志中保存用户完整提示词来“留证”。

评估节费需要同口径对照:相同任务、相同模型版本、不同取消策略的最终结算费用,包含失败和重试。本文没有这组付费实验,不能声称提前断开节省某个百分比。采用前再核实 API 取消与 usage 文档,保留访问日和费率生效日的区别。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询