feat(settings): add preferred account affinity mode

Route relaxed requests through the configured scheduler and keep the session primary during preferred-mode spillover. Default new settings to strict while preserving saved modes.

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Zyy
2026-10-07 03:50:59 +08:00
co-authored by Codex
parent 3d1dc79f5d
commit 119032c067
21 changed files with 722 additions and 335 deletions
+11 -7
View File
@@ -1233,8 +1233,8 @@ HTTP 请求头及新建 WS 的握手提示按当时的最终出站档位构造
`response.create`;空闲连接不占名额,内部重试不重复占用。
修改 Key 策略对既有 WebSocket 连接的下一次请求同样生效,已开始的请求保持原有快照
运行设置可以分别启用 Key 与账号的有界排队。Key 并发满时按 Key 等待;OpenAI 宽松亲和下各线程独立调度,
新子线程优先沿用根账号,必要时可分流;已有子绑定不随根账号迁移。严格亲和下后代线程只等待当前会话账号,
运行设置可以分别启用 Key 与账号的有界排队。Key 并发满时按 Key 等待;OpenAI 优先亲和下会话请求优先主账号,
繁忙时先按调度策略选择可用账号,临时分流不改写会话绑定;没有可立即使用的账号时才按配置排队。严格亲和下后代线程只等待当前会话账号,
根线程迁移后跟随新账号,没有绑定时等待根线程首次认领
严格亲和下的后代线程始终排队,沿用 `concurrencyWaitTimeoutSeconds` 和请求截止时间;
@@ -1348,10 +1348,13 @@ Guardian 以 `subagent_kind` 或 `client_metadata.x-openai-subagent` 值 `guardi
仍受总等待容量与等待时限约束。不限并发的账号和关闭排队时的其余行为不变。
设置更新请求须包含该字段
`openaiAccountAffinity` 控制 OpenAI 账号亲和,默认 `relaxed`(宽松),也可设置为 `strict`(严格)。
宽松模式允许子代理按模型权限、可用性与容量独立分流,各线程保留自己的账号绑定;严格模式让同一会话共用账号,
子代理等待当前账号。需要选号时仍使用 `rotationStrategy` 指定的调度策略。
插件显式选号及原生续写的状态归属约束仍然生效,缺少可识别线程身份的子请求仍按跟随方式处理
`openaiAccountAffinity` 控制 OpenAI 账号亲和,默认 `strict`(严格),已有保存的模式保持不变:
- `relaxed`(宽松):会话内请求直接按 `rotationStrategy` 选号,不优先主账号
- `preferred`(优先):会话内所有可关联请求优先主账号,并发已满、请求间隔未到、额度耗尽、停用、限流冷却或不支持当前模型时临时分流,保留会话绑定,后续请求仍优先主账号
- `strict`(严格):同一会话共用账号,后代请求等待当前账号并跟随根请求换号
插件显式选号及原生续写的状态归属约束在三种模式下仍然生效
`openaiSessionAffinityTtlHours` 是账号绑定及其会话关联的滑动保留时长,单位小时,默认 24,取值 1~720。
各类请求统一在发送前成功准入时按请求冻结值续期。
@@ -1396,7 +1399,8 @@ Guardian 以 `subagent_kind` 或 `client_metadata.x-openai-subagent` 值 `guardi
不影响已入队请求的位置、队内 FIFO、容量上限或等待超时。两项默认均为 `0`
`preferHigherWeight` 默认关闭。开启后,更高权重账号恢复可用时,后续允许重新选号的请求优先回切;
同权重且可用的会话亲和继续保留。没有可用亲和时,在最高可用权重层内按配置评分。
同权重且可用的会话亲和继续保留。OpenAI 优先模式沿用可用的会话主账号,不因权重回切而分流。
没有可用亲和时,在最高可用权重层内按配置评分。
原生续写账号绑定仍是硬约束,不因回切而主动换号或触发历史重放。配置随运行设置原子保存和发布,
新请求使用新值,已开始请求及其重试沿用原快照,无需重启
+7 -5
View File
@@ -354,6 +354,7 @@ Client Key 并发占用、账号调度槽位与请求恢复记录使用可续期
`ConcurrencyWaitQueue` 在同一锁内读取队长并入队;Provider 只传递已限定续写范围的候选。
排队系数为零时保留最短队列规则;已入队位置、队内 FIFO、取消回收、容量上限和请求共享等待预算保持原合同。
高权重回切仅影响智能调度的软亲和:先验证候选资格,再决定是否由更高权重层覆盖亲和;同层亲和保留。
OpenAI 优先模式沿用可用的会话主账号,高权重回切仅参与需要重新选号的请求。
Provider 限定的原生续写账号范围仍是硬约束。回切在请求选号时发生,不新增后台任务或主动历史重放。
插件显式选号沿用既有候选校验和实际亲和结果,委托内置选号时才应用智能调度配置
@@ -614,18 +615,19 @@ Continuation 仍受原请求的 Client Key、账号范围、Provider 和发送/
OpenAI Provider 解释官方逻辑 `session_id` 与 `thread_id`,按 Client Key 隔离账号绑定,
不将缓存路由键或请求内容推断为账号身份。账号亲和模式随请求策略冻结:
- 宽松:根线程与各子线程独立绑定,新子线程优先使用根账号,模型权限、可用性或容量不允许时可独立选号;
根绑定只提供初始偏好,子线程认领、迁移和续写校验只操作自己的绑定,根迁移也不改写已有子绑定
- 宽松:会话内请求直接按调度策略选号,不使用主账号偏好,成功准入后更新当前账号
- 优先:会话内所有可关联请求优先使用主账号,并发已满、请求间隔未到、模型权限或可用性不允许时按调度策略临时分流;
首次成功准入认领会话主账号,分流只改变本次租约,不改写绑定,后续请求继续优先主账号
- 严格:根线程及后代共享当前账号,后代没有绑定时等待根线程认领,账号不可用时只排队,根迁移后重读共享绑定
无法识别线程的后代请求保留跟随约束。可关联的 Search、Images、Live 创建请求使用所属线程的绑定。
可关联的 Search、Images、Live 创建请求共用会话绑定,宽松和优先模式不依赖线程身份分流;严格模式下后代请求保留跟随约束。
需要选号时统一使用配置的调度策略;插件显式选号沿用原有裁决,native continuation 仍受独立的状态 owner 与安全重放边界约束
Store 只保存带版本的绑定事实,Provider 在取得租约后、发送前原子认领或迁移;快照冲突释放租约并重新选择。
Store 只保存带版本的绑定事实,Provider 在取得租约后、发送前原子认领、续期或按模式迁移;快照冲突释放租约并重新选择。
响应完成不写回账号,迁移前已准入的请求可以完成,不能把绑定改回旧账号。绑定存储不可用时不绕过绑定发送
官方独立 Images 仅携带 `turn_id`,通过已观测 Responses 轮次关联到会话,关联同时保留根线程或后代线程的调度权限。
轮次关联保存不透明线程键及可选的根会话键,不复制账号;显式根身份只用于校验轮次归属。
轮次关联保存不透明会话键,不复制账号;显式会话身份只用于校验轮次归属。
绑定和轮次关联按同一请求策略中的可配置时长保留,均按 Client Key 隔离。
成功准入按冻结时长续期,已关联的 Images 同时续期轮次关联;更新配置不扫描旧键,响应完成不续期。
未知轮次不推测会话归属,已有轮次不能改指其他会话或更改调度权限