Important
2026-09-22 进展:旧版以 STATE 为核心的打票方法已被上游修复,当前发布的插件暂时不能恢复目标模型。新方法已经在受控实验中成功,关键由 STATE 转为 Cookie,而且有效时间窗口明显缩短。我们正在继续测试有效期、出口迁移和长期稳定性;验证完成后会尽快更新插件。当前结果仍可能波动,请不要把一次成功当作长期保证。 查看进展与实测结论
为 Sub2API 增加 账号级 STATE 票据管理,尝试应对最近 ChatGPT / Codex 账号的模型降质和降并发:请求的模型被路由到其他模型,或 OpenAI 上游限制账号可同时处理的请求数量。
- 按账号开启:需要处理哪个账号,就给哪个账号开;支持手动选择 Pro / Team。
- 自动维护票据:动态 IP 采集,同账号业务出口复验,自动续期与异常重采。
- 没票也能用:插件默认无票据正常放行,有有效票据时自动注入,也可手动关闭放行。
- 在页面里验证:测试代理、查看请求与返回模型,或运行鹈鹕动画、糖果推理和自定义提示词。
推荐插件版 v0.3.4:下载插件 · 安装与升级 · 宿主适配
基础功能支持原版 Sub2API v0.2.7;本文中的分组下拉、账号名称、已有代理选择、手动查找和代理 / 模型测试,需要配套安装 v0.3.4 宿主适配。仅上传插件不能增加宿主接口。
实测效果 · 选哪个版本 · 插件版用法 · 常见问题 · 动态代理格式 · 增量版/完整版用法
以下两张是 2026-09-20 在 v0.3.3 插件页面重新实测后直接截取的界面:同一个 Pro 账号、同一个固定业务出口,提示词均为「只回复 OK」。本轮第 2 次动态尝试取得票据并通过业务出口复验。
使用有效 STATE:请求 gpt-6-astra → 实际返回 gpt-6-astra。 页面显示「已注入 STATE」「模型匹配」,HTTP 200,响应完整结束。
同账号的无票据对照:请求 gpt-6-astra → 实际返回 gpt-5.6-luna。 页面显示「未注入 STATE」「模型不匹配」,HTTP 200,响应完整结束。
下图是 2026-09-19 另一组插件测试中,注入 STATE、完整返回 gpt-6-astra 后生成的鹈鹕 HTML 预览。
这些是注明日期和版本的历史实测,不是 v0.3.4 的新一轮模型测试。截图只隐藏账号与 IP,保留实际模型字段与回答。模型字段一致用于核对路由,不代表能力或长期有效性保证;目前没有并发压测结论。详细验证记录 · 增量版/完整版 Pro / Team 对照图
| 版本 | 适合谁 | 入口 |
|---|---|---|
| 插件版 v0.3.4(推荐) | 已有 Sub2API 0.2.7,希望通过插件管理使用 STATE | 下载 .s2plugin · 安装指南;在插件配置页操作 |
| 完整项目版 v0.2.0 | 想部署一个空白的 Sub2API + STATE 实例 | 完整部署包,包含程序、网页、Compose 和完整源码 |
| 增量版 | 已有源码,想查看、合并或自行构建修改 | overlay/ + prepare.py,基于 Sub2API 0.2.6;在账号编辑页配置 |
同一个实例选择一种 STATE 实现即可。 插件版使用官方 v0.2.7 插件接口;增量版和完整项目版基于 v0.2.6,设置入口不同。后续主要更新插件版,另外两种形式继续保留。
插件包包含 Linux amd64 / arm64、macOS arm64 三个运行时。首次安装需向宿主配置追加发布者公钥;完整图形功能还需按宿主适配说明重建宿主前后端。
所有发布文件都是空白配置,不附带作者的账号、代理/IP、API Key、STATE、数据库或签名私钥。代码免费开源,使用自己的账号与代理即可。
入口:插件管理 → STATE Kit · 账号级票据 → 配置。下面按实际操作顺序介绍;截图保留 v0.3.3 的实测界面,v0.3.4 在账号区域新增了分组下拉。
按安装指南导入签名 .s2plugin,在插件管理卡片上点击 「启用」,再打开「配置」。
这里有三个层次:宿主启用插件进程 → 页面勾选「使用 STATE」→ 开启指定账号。页面里的 STATE 开关不能代替宿主启动插件;只启动插件也不会自动给所有账号开启 STATE。
在「先连通代理」区域填写动态池地址;前置代理可选直连、手动填写、IP 管理中的已有代理。从国内连接代理服务时,可按需要配置 本机 → Clash 等前置代理 → 动态池。
点击 「测试并应用代理」,查看出口 IP、国家和结果。通过后自动保存被测试的代理配置,首次手动查找优先沿用短时保留的测通会话。代理格式见动态代理怎么填。
出口检测通过、账号授权通过、取得有效 STATE 是三个不同结果。 测试代理只确认该次动态出口的连通性;查找票据时还要验证上游授权和返回模型。单个动态出口检测失败会按设定次数换出口重试。
在「选择需要票据的账号」区域,先选分组,再选账号,点击「添加」。显示账号名称和 ID,支持「全部分组」「未分组」,已添加账号自动排除;分组只用于筛选,不改变账号归属、代理或调度。旧宿主仍可输入账号 ID。
新增账号默认关闭:确认 Pro(292)或 Team(332) 等设置,点击「保存设置」,再打开该账号的 STATE 开关。已有账号的开关点击即保存;新增账号和套餐等修改需先保存设置。
- 单行 「查找票据」 只启动该账号,进度显示在同一行。
- 「全部开启账号查找」 才会对所有已开启账号操作。
- 「自动续期与补票」 开启后按设定提前续期,并在模型不符等异常后重新获取;关闭后只手动操作,修改后保存。
在测试区选择账号 → 点击「快速检查」填入短提示词 → 点击「测试模型」。先看两个醒目的结果区域:请求模型 和 实际返回模型,再看是否注入 STATE、HTTP 状态与响应是否完整结束。
勾选「使用当前 STATE」只是请求使用,是否真正注入以结果为准。取消勾选可以做无票据对照;返回模型不一致时页面会明确标出。
- 鹈鹕动画:填入 SVG / HTML 动画提示词,生成后可切换 HTML 预览与源码。
- 糖果推理:填入同一套逻辑题,核对 JSON 回答与最坏情况证明。
- 自定义提示词:自行输入内容后测试。预设按钮只填提示词,点击「测试模型」才发送请求;测试中可以停止。
查看鹈鹕、糖果测试界面及历史异常案例
这两张保留 v0.3.3 发布当天的模型不匹配和上游过载案例。糖果测试遇到 server_is_overloaded,页面如实显示失败原因和「未返回」;HTTP 200 不等于生成完成或模型匹配,上游恢复后可重试。
模型测试是管理员直测,走账号业务出口,不经过 API Key 用量计费。要核对普通客户端调用,可另用绑定目标账号分组的 Base URL / API Key 请求。以上截图均来自本地插件,账号和代理信息已脱敏,模型字段保留实际返回值。验证记录
插件默认开启 「高级设置 → 无票据时也正常放行请求」:没有票据、票据失效或获取失败时,按账号正常业务路径请求;有有效票据时自动注入。不会仅因缺少票据阻止请求。 如果希望无票据时暂时拒绝请求,可以取消勾选并保存,此时返回暂不可用(503)。
这个开关控制插件的请求放行,不代表上游一定成功;上游限流、额度和网络错误仍会原样影响请求。源码版 / 完整版的缺票策略不同:已启用账号的目标模型会暂时退出可用调度。
如果页面显示 「插件未运行」,先关闭配置窗口,在插件管理的 STATE Kit 卡片点击「启用」,再打开配置。已经勾选「使用 STATE」或账号开关,不等于插件进程已启动。
如果缺少新版宿主适配,也无法使用这些手动动作;请核对宿主适配说明。
在 Sub2API 「账号管理 → 编辑账号」 中设置业务出口:选择“无代理”则由服务器直连,选择已有代理则使用该账号代理。插件的动态池只负责采集票据;候选票据要回到账号业务出口复验,日常请求和页面模型测试也走这个业务出口。
勾选 「固定业务代理也经过此前置代理」 后,插件列表内账号的固定代理连接会额外经过前置代理:服务器 → Clash 等前置代理 → 账号固定代理 → 上游,最终出口仍是账号固定代理。账号选择“无代理”时仍直连,本机回环代理桥保持原路径。
该选项独立于 STATE 开关:关闭 STATE 不会关闭这层网络中转;不在插件列表里的账号不受此选项影响。修改后点击「保存设置」。
它们是 STATE 的字节长度,不是 HTTP 状态码。在账号里手动选择 Pro(292)或 Team(332);312 是本实现采用的实验异常信号。长度只是候选筛选,仍需检查完整成功响应中的模型字段,不能单独证明模型身份或回答质量,也不会自动读取或修改账号订阅。
默认本地有效期 60 分钟,提前 10 分钟续期;这是本地管理策略,不是上游承诺。开启自动续期与补票后会后台维护;续期失败时,尚未过期且未判为异常的旧票据可以继续使用。关闭自动守护后,过期需手动查找。
本项目尝试改善模型改路由与上游降并发带来的可用性问题,目前没有并发压测结论。OpenAI 的 Overload、429、额度与实际容量仍会影响结果;业务请求沿用宿主原有并发配置,不代表无限并发或保证恢复。
准备一个兼容的动态 IP 代理池。插件版在 「插件配置 → 先连通代理 → 动态池地址」 填写;源码版 / 完整项目版在 「系统设置 → 网关服务 → Codex 设置 → 全局动态 IP 池」 填写。
SOCKS5 示例(全部为占位内容):
socks5h://ENCODED_USERNAME:ENCODED_PASSWORD@HOST:PORT
用户名和密码分别经过 URL 百分号编码,不要把整个 URL 一起编码。例如 @、:、#、% 分别写成 %40、%3A、%23、%25;socks5h 表示通过代理解析目标域名。程序支持自动更新用户名里的 {sid},也适配了 1024proxy 的 SID 格式,不用每次手动生成、导入一堆 IP。
动态 IP 用于采集 STATE,日常请求仍用账号原有业务出口。已有兼容代理可以继续用;如果还没有,可通过 1024proxy 动态 IP(作者邀请链接) 了解和开通。代理费用由服务商收取,项目源码免费。
适用:增量版、完整部署版(基于 Sub2API v0.2.6)。 这一版在「系统设置 → 网关服务」和「账号管理 → 编辑账号」中设置 STATE。
插件版的入口是「插件管理 → STATE Kit → 配置」,请看上面的插件版用法。下面的全局设置和账号编辑截图均属于增量版/完整版。
展开:增量版/完整版专用教程与截图
无代理账号的版本差异: 最新
main增量源码已支持账号选择“无代理”,复验和日常请求使用服务器直连;感谢 @woai66 的修复(Issue #2)。已发布的 v0.2.0 完整部署包不包含此修复,需用最新源码重新构建。独立插件版已有空代理直连路径。
只想部署使用,选择 Release 中的完整部署包。 它包含完整 Sub2API 后台和网关,以及本项目的 STATE 功能,不需要先安装原版,也不需要自己打补丁。
| 文件 / 入口 | 用途 |
|---|---|
sub2api-state-kit_v0.2.0_linux_amd64.tar.gz |
常见 x86_64 Linux 服务器;内含已编译程序、网页和 Docker Compose |
sub2api-state-kit_v0.2.0_linux_arm64.tar.gz |
ARM64 Linux 服务器;内含已编译程序、网页和 Docker Compose |
sub2api-state-kit_v0.2.0_full-source.zip / .tar.gz |
完整上游源码 + STATE 修改、测试、Dockerfile 和部署说明;无需再次拼接源码 |
本仓库 overlay/ + scripts/prepare.py |
继续保留的增量形式,方便开发者查看修改、合并或自己构建 |
GitHub 自动生成的 Source code (zip/tar.gz) 是本仓库源码(增量目录 + 插件源码),不是完整 Sub2API。需要完整项目请到 v0.2.0 Release 选择文件名带 full-source 的附件。
新安装示例(需 Docker Compose v2 和 openssl):
tar -xzf sub2api-state-kit_v0.2.0_linux_amd64.tar.gz
cd sub2api-state-kit_v0.2.0_linux_amd64
sh init.sh
# 编辑 .env,设置自己的管理员邮箱、监听地址和端口
docker compose up -d --buildARM64 使用对应文件名。部署包里的程序已编译,--build 只组装运行镜像;首次仍需下载基础镜像。默认监听 127.0.0.1:8080,需要直接从外部访问时自行调整 .env 中的 BIND_HOST。管理员密码由 init.sh 在用户机器上随机生成,记录于本机 .env。
首次安装是空白实例:自行添加账号、代理和 Key,STATE 总开关及账号开关默认关闭。已有生产实例请先备份、隔离测试,再替换应用,保留自己的配置和数据。详见 完整部署说明。
下面是使用者提供的 旧版源码界面 Team / Pro 对照图,不是本次插件的 Team 实测:原图上半部分为启用 STATE 后的请求,下半部分为未启用 STATE 的请求。保留原图的完整界面和上下顺序,用红框标出模型列,并标注“已启用 STATE / 未启用 STATE”。
未启用时,日志显示请求 gpt-6-astra,上游响应为 gpt-5.6-luna,并标记“模型不一致”;启用后,这组截图里不再出现该标记。原图不缩放、不裁剪、不重排,顶部另加 Team / Pro 大标题,并添加红框、文字与必要的隐私遮挡;模型字段和请求记录顺序未改动。
先进入「系统设置 → 网关服务 → Codex 设置」,打开下图红框中的 STATE 票据总开关。这是全局开关;仅打开它不会自动为所有账号启用 STATE。
下图:增量版/完整版的「系统设置 → 网关服务」界面。
原图仅叠加红框,未裁剪、缩放或修改其他内容。
在下方「全局动态 IP 池」填写完整代理 URL 并保存,格式见上文动态代理怎么填。
再进入「账号管理 → 编辑账号」,编辑需要启用的 OpenAI OAuth 账号:先保存业务出口设置(固定代理或“无代理”直连),再重新打开编辑窗口,在「STATE 票据」区域选择 Pro / Team,打开该账号的 STATE 开关并点击该区域的保存。这里的设置只针对当前账号,需要使用的账号要分别开启。
启用后,可以查看票据剩余时间和动态守护状态,也可以手动重新获取。
下图:增量版/完整版的「账号管理 → 编辑账号」界面。
图中代理地址已隐藏,其余保留原始界面。
对比基线为 Wei-Shaw/sub2api v0.2.6,不代表上游后续版本的能力。
| 功能 | 上游基线 | 本扩展 |
|---|---|---|
| 启用入口 | 全局 STATE 开关与策略配置 | 保留总开关,增加账号级入口和独立开关,可以逐个账号编辑 |
| Pro / Team | 全局目标长度默认 292,可修改配置 | 账号界面明确提供 Pro(292)/ Team(332),每个账号单独选择 |
| 异常处理 | 本扩展基于其原有票据机制扩展 | 增加动态守护,处理成功响应中的模型不符或 312 字节 STATE 信号 |
| 代理与验证 | 基于上游采集机制 | 全局动态池采集,同账号固定业务代理复验;日常请求继续用固定代理 |
| 使用状态 | 原有票据摘要 | 账号展示可用时间、续期、失败冷却及守护触发摘要 |
“Team 支持”指增加手动套餐选择及对应长度筛选,并不是自动读取或修改订阅。长度只作实验筛选,不能单独证明模型身份或回答质量。 312 也只是本实现采用的实验异常信号,不是上游官方确认的撤销协议。
- 在系统设置中开启总开关,配置全局动态代理池。
- 编辑指定 OpenAI OAuth 账号,保存固定业务代理,选择 Pro 或 Team 并开启该账号的 STATE 功能。
- 使用同一个账号采集候选 STATE,再通过该账号固定业务代理复验。两次完整成功响应的实际模型都须匹配目标模型,才保存使用。
- 业务成功响应触发模型不符或 312 信号时,守护程序作废本次使用的票据并重新采集。旧请求不会作废更新后的票据,并发异常会合并处理。
不会跨账号转移票据,也不会修改响应模型名称、伪造结果或重放已完成的业务请求。开关默认关闭,正常账号不必启用。支持 HTTP/SSE/JSON,以及启用账号的 WebSocket HTTP 桥接。
本地有效期 60 分钟、提前 10 分钟续期;每轮最多 8 次、失败冷却 5 分钟。续期失败保留尚未过期的旧票据。401 / 403 / 429 会终止本轮,不继续轮换出口尝试。
需要 Python 3 和 Git。在本仓库目录执行:
python3 scripts/prepare.py ../sub2api-state-source
cd ../sub2api-state-source脚本下载固定的上游提交,验证原文件和覆盖文件的 SHA-256,再写入全新目录。拒绝覆盖现有源码。输出包含完整上游源码及本扩展;不会复制任何本地配置、数据库或原仓库 Git 历史。
后续可按照生成源码中的上游文档编译,或在生成源码根目录构建镜像:
docker build --build-arg VERSION=0.2.6-state-kit.0.1.0 -t sub2api-state-kit:0.1.0 .构建依赖和资源要求沿用固定的上游版本。具体操作见 部署说明、使用说明 和 验证范围。本仓库的 overlay/ 是实际修改源码,UPSTREAM.json 固定基线和文件校验值。
思路可参考言零的文章:292 State 注入 — Codex 不降智、不 Overload 的底层原理与实现。它描述的核心流程是:先获取上游返回的状态值,再把它带到后续请求里,并持续维护它的有效性。 文章报告了携带 STATE 后路由、输出和 Overload 的改善;本扩展用采集、复验和响应观察,把这套思路接入 Sub2API 的账号管理。
可以把 STATE 理解为请求携带的一段“不透明状态”:本扩展保存并复用它,不解析其内部含义,也不生成或伪造它。实际读写的是 HTTP 头 x-codex-turn-state,注入形式如下,尖括号内仅为占位说明:
x-codex-turn-state: <当前账号已采集并复验通过的 STATE>本项目中的 292 / 332 / 312 都指 STATE 的字节长度,不是 HTTP 状态码。 Pro 按 292、Team 按 332 筛选候选值;312 用作触发重采的实验信号。文章使用了“292 / 312 响应码”和 current_turn_state 的表述,这里以仓库实际处理的请求头和长度为准。长度只是第一道筛选,后面还要核对完整成功响应中的模型字段。
flowchart TD
A["当前账号 + 目标模型"] --> B["后台经动态 IP 采集候选 STATE"]
B --> C{"长度符合所选套餐,且完整响应模型匹配?"}
C -->|是| D["同账号、同模型,经固定业务代理携带 STATE 复验"]
C -->|否| R["按尝试次数和冷却规则处理"]
D --> E{"完整响应模型匹配,且未出现 312 信号?"}
E -->|是| F["保存票据,并发布到缓存"]
E -->|否| R
F --> G["业务请求注入 STATE,经固定代理并行转发"]
G --> H["观察成功响应中的 STATE 与模型字段"]
H -->|312 或模型不符| I["作废本次使用的票据,触发后台重采"]
I --> R
F -->|到期前 10 分钟| J["触发后台续期,保留尚有效的旧票据"]
J --> B
R -->|允许继续尝试时| B
动态出口是采集时的一个实验变量,是否拿到可用 STATE 由实际响应决定。采集成功还不够:必须切回该账号固定业务代理再验证一次,确认在那里仍能得到匹配目标模型的完整响应,才保存使用。业务请求因此不必跟着采集过程反复切换出口。
STATE 始终按同账号、同目标模型使用,不把好账号的 STATE 移给另一个账号。票据还关联本地配置版本与固定代理指纹,避免账号配置或业务出口变化后误用旧值。
本扩展默认将票据的本地有效期设为 60 分钟,提前 10 分钟续期;这是本地管理策略,不是上游承诺的有效期。续期失败时,尚未过期且未被判为异常的旧票据仍可继续使用。
在携带票据的业务请求中,若成功响应的 STATE 头出现符合格式的 312 字节值,或完整响应的模型与目标不符,守护程序会作废该次使用的票据并触发后台重采。多个并发异常合并为同账号的采集任务,遵守既有冷却;较早请求的迟到响应不会误删后来取得的新票据。已经返回的业务内容不会被改写或自动重放。
业务请求只读取并注入已经验证的票据,不为每一条请求临时采集,也不持有一个覆盖整个业务转发过程的账号锁。后台限制的是同账号重复采集任务,业务仍沿用原有并发配置和调度。它让票据维护与日常转发分开进行;上游实际容量、采集开销及票据空窗仍会影响吞吐,因此不等同于无限并发或消除 Overload。
| 阶段 | 版本 / 形式 | 内容 |
|---|---|---|
| 增量版 | v0.1.x | 合并账号级 STATE、Pro / Team 和动态守护 |
| 完整项目版 | v0.2.0 | 完整源码及空白部署包 |
| 插件版 | v0.3.0–v0.3.2 | 独立插件、前置代理、账号名称和运行日志 |
| 当前推荐 | 插件 v0.3.4 | 按分组选择账号、单账号手动操作、自动续期控制、代理测试及模型对照 |
后续主要更新插件版。 增量版与完整部署版继续保留,是否同步新功能以各自发布说明为准。历史测试与当前边界见插件验证记录;测试历史导出尚未实现,目前页面保留最近一次模型结果及最近 200 条运行事件。
这是实验功能,无法保证上游持续接受 STATE,也不能承诺恢复某个模型或回答质量。路由观测使用原始成功响应的模型字段,不能代替能力评测。Team 分支的自动化验证使用模拟响应;上面的 Pro / Team 图片是使用者提供的界面对照。
当前采集锁为进程内实现,多实例可能重复采集;没有生产负载或完整上游有效期保证。本扩展不新增数据库迁移,但升级上游版本仍需单独评估兼容性。
发布包包含必要源码、测试、说明及经过隐私遮挡与标注的原始界面对照图,不提供账号、真实 STATE、代理凭据、IP 清单、数据库或原始日志。
首先感谢 gylive/ccodex-sleep-state 的思路分享,也感谢群里各位大佬在讨论、测试和排查中的帮助!这个扩展是在 Sub2API 的基础上折腾出来的,离不开原项目和大家的经验。
- 感谢 Wei-Shaw/sub2api 提供基础项目。
- 特别感谢 gylive/ccodex-sleep-state 带来的生命周期管理与状态展示思路参考。
- 感谢各位群友在讨论、测试和排查过程中的帮助与反馈。
参考项目的说明与版本记录见 NOTICE.md。本项目不代表上述项目的官方版本或背书。
需要帮忙配置?微信搜索
wangyunjeff,添加时备注「Sub2API」。请一杯奶茶,我帮你配置一下 ☕
代码免费开源,自己部署和使用不收费。 配置协助与开源代码是两回事,不购买协助也能使用完整源码。
也欢迎通过 GitHub Issues 交流使用问题,发布问题时请先移除账号、密钥、代理密码和真实 STATE。
喜欢的话,欢迎点一个 Star,也感谢你把它分享给有需要的朋友。
遵循上游 GNU LGPL v3,详见 LICENSE。保留上游版权与署名;覆盖文件是在上游基础上的修改或本扩展新增文件。
如果这个项目帮到了你,欢迎自愿请作者喝杯咖啡,支持后续维护与更新。金额随意,感谢支持!代码始终免费开源,不打赏也可以正常使用。












