mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-12 22:20:19 +08:00
3.2 KiB
3.2 KiB
调度策略:取消请求立即打断
管理入口:调度策略配置 → 系统配置 → 取消请求立即打断。
配置保存在当前策略的 config_json.default_policy.cancel_on_client_disconnect,默认 false。
旧策略缺失此字段也按关闭处理;不需要数据库结构迁移,不读取同名全局系统设置。
策略选定后,请求沿用该次解析的配置,不因管理员随后修改策略而改变断连处理。
| 配置 | 客户端取消/断连时 | 计费 |
|---|---|---|
| 关闭(默认) | 已选定策略的请求继续执行,后台读取响应直到正常完成或原有超时/上游错误 | 按实际完成结果正常结算 |
| 开启 | 中止仍在执行的请求、停止读取上游响应 | Token、缓存 Token 和图片产出费用不收取;配置了 price_per_request 的请求保留一次请求费用及对应倍率 |
已经取得上游终态的请求不会因最后一跳投递失败而撤销已完成的结算。
取消按次收费的记录仍显示 cancelled/499,但计费状态可为 settled;不要仅凭请求状态判断是否收费。
执行边界
- HTTP 同步、SSE、同格式直通和 CF 心跳响应共用请求生命周期保护。
- Responses WebSocket 断连后只完成当前进行中的 turn,不无限维持空闲连接;开启开关则直接终止当前 turn。
- 鉴权、请求体接收等尚未选定策略的阶段仍可直接取消。
- Live/Realtime 长连接会话关闭、异步任务显式取消不是有限 HTTP/Responses 请求的断连续跑,不转成后台常驻会话。
- 原有上游总超时、首字节超时及故障处理仍有效;这里不创建持久化后台作业,进程退出不能保证继续执行。
代码调整
request_lifecycle.rs将 HTTP 请求 Future 和响应 Body 的所有权与客户端连接解耦。正常连接保留原来的逐帧路径、响应头、长度提示和 trailers;仅断连时启动后台接管,逐帧丢弃待发送内容,不聚合完整响应。- 请求准入凭证随原 Future/Body 保留至完成,防止断连提前释放并发额度;诊断上下文同时保留。
- CF 心跳后台执行显式监听响应接收端关闭,避免打开开关后仍继续执行。
- Responses WebSocket 将“客户端已断开”和“上游已完成”分别处理,复用既有终态观察、超时和结算逻辑。
- 计费统一在 billing enrichment 中计算取消请求的单次费用。
cancelled_request_fee由服务端计算后标记,贯穿审计持久化、钱包结算及套餐成本预留结算,避免有费用却仍写为void或释放成本预留。
回归覆盖
- 新旧配置默认关闭、布尔校验、策略保存及模型级调度编辑保留开关。
- 响应头前断连、首帧前/首帧后断连、立即取消、并发额度、诊断信息、响应头/trailers 透传。
- 真实流式执行链路的完成/取消 usage 与候选状态,以及心跳取消。
- 取消时按次/按 Token/混合定价、图片请求单次费、倍率、审计状态、钱包及成本预留结算。
- Responses WebSocket 使用真实网关和临时 PostgreSQL 验证断连继续完成、开启后不收费,以及按次费用实际结算。