8000 GitHub - sbyinin/oai-adversarial-plugin: CLIProxyAPI plugin: timezone normalization, model consistency monitor, X-Codex-Turn-State observation & override, probe track. · GitHub
[go: up one dir, main page]

Skip to content

About

CLIProxyAPI plugin: timezone normalization, model consistency monitor, X-Codex-Turn-State observation & override, probe track.

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Latest commit

 

History

31 Commits

Folders and files

Repository files navigation

OAI-Adversarial Plugin(O/对抗插件)

开发说明与声明

  • 本插件由 DeepSeek「大肥鱼」 进行编程开发;
  • 存在潜在的 bug 与问题属于正常现象,本项目主要用于提供实现思路;
  • 欢迎在遵循开源许可(MIT)的前提下进行二次开发。

面向 CLIProxyAPI 的自研插件(内部 ID:timezone-override),聚焦 Codex / ChatGPT 上游请求链路的三类能力:请求时区规范化、上游模型一致性监测、X-Codex-Turn-State 的观测与有效值覆写。

⚠️ 重要提示(务必先读) 本文中「292 字节」是本项目在特定账号与套餐下观察到的有效状态长度基准。不同账号、地区、套餐或上游策略下,有效字段长度可能不同——我们也曾观察到 312 字节的风控降级态(模型响应一致但状态被降级)。 因此:探测验收规则(模型一致 + 长度)需要按你自己的实际观测调整,请勿直接假设 292 就是唯一正确答案。调整位置见「验收标准」一节。


目录


功能特性

1. 请求时区规范化(原始功能)

对发往 Codex 上游的请求体做时区处理:检测 <environment_context><timezone>…</timezone></environment_context> 块,将原时区替换(或缺失时补入)为目标时区(默认 America/Los_Angeles),支持 Responses / Chat Completions / Claude 格式与 WebSocket 通道。

2. 上游模型一致性监测

捕获上游实际返回的模型名,与入站请求模型比对;不一致的记录在面板醒目打标(类 sub2api 的「模型不一致」提示)。

3. X-Codex-Turn-State 全链路观测

对每条请求记录该字段的长度、来源(请求 / 响应 / 流 / 探测轨)、完整值(4096 字节上限)与短预览,并通过 Fernet 内嵌时间戳计算剩余有效期。

4. 请求侧覆写(健康基线优先)

将匹配模型的请求头 X-Codex-Turn-State 替换为有效值:

  • 健康基线优先:每个模型维护一条基线值(启动时从服务器记录/种子文件自动播种,业务流量与手动探测持续刷新);
  • 异常值必换:客户端携带的 state 长度不符合(如 312 字节降级态)时,无论 force 模式都会回灌基线;健康长度(292)且 force:false 时保留原值;
  • 配置值兜底:基线不可用(过期/从未获得)时回退到配置的静态值。

5. 手动探测轨

「开始探测」启用自动预备并排队一轮任务;所有入口共用一个 FIFO worker。健康值仍充裕或已有有效接班值的模型会跳过。获得模型一致且长度符合的 state 后才更新对应槽位。

  • luna / terra 不检测:直接请求这两个模型家族时,不判断 state 长度或响应模型一致性,不进行降智拦截、静态/健康基线注入或异常 state 回灌。自动与单模型探测均跳过,面板显示“不检测”。原始响应模型和长度仅作为请求记录保留;旧失败、疑似和业务异常标记不再影响这些请求。
  • 按原始请求判断:优先采用 requested_model,缺少时采用 model;不能因为 astra/sol 的响应变成 luna 而豁免原请求。支持 gpt-<版本>-luna/terra 及带后缀的模型名,按名称分段匹配,不误匹配 lunafoo。
  • 停止当前轮:取消当前排队与在途探测,保留自动预备原状态;在途请求在尝试边界结束,临近到期的模型可在后续扫描中重新排队。
  • 停止全部:取消当前任务并停止自动预备,重启后保持停止,直到再次点击「开始探测」。旧 API stop-round 保持停止全部语义,新 API 为 stop-current / stop-all。
  • 代理池轮询:direct / socks5 / http 出口按序轮换;轮换池(# pool:)享有独立的池探测预算(pool-attempts,默认 100 次):普通 8000 出口仍按每出口 attempts-per-proxy 次,而池子每轮最多可抽 100 次全新源地址的奖,自动单轮上限 =(普通出口数 × 每出口次数)+(池子 × 池预算);
  • 验收规则:模型一致 + 有效长度(默认 292 字节)才算成功;
  • 降智请求拒绝:全局独立开关(默认开启),仅适用于参与检测的模型。业务流量自身确认的异常仍按开关拦截;探测轨的失败或疑似降智只有在请求没有可用健康基线时才参与拦截判断。旧值仍有效或已有有效接班值时,预备失败不会使业务请求收到 403。429 限流不计入降智。
  • 失败标注与业务分离:探测失败保留诊断记录,现有健康值继续服务;自动预备是否重试取决于预备开关、模型暂停、有效接班值及 90 秒节流,不以失败徽标判断业务值是否失效。

6. 状态路由台 UI

CPA 管理面板内三个标签页:请求记录、状态路由台(模型健康基线 TTL 进度、手动探测控制、探测轨迹、失败徽标、来源提示)、代理池(出口总数/可用/冷却·轮休中统计,每个出口的状态、连续失败次数、冷却或轮休至(UTC+8)、剩余时间与最后错误)。标题右侧常驻「降智请求拒绝」开关,各标签页均可见。

7. 出口池熔断与轮休(IPv4/IPv6 混合友好)

探测轮询会在出口间轮换;未获得正确 state token 的普通出口(长度异常、模型不一致或连接类错误)连续失败达到阈值后,被短暂移出池子并进入 exit-cooldown-minutes(默认 180 分钟)冷却,到期后自动回归;而成功获取一次健康状态后也会轮休 exit-success-cooldown-minutes(默认 30 分钟),让后续尝试优先分散到其他出口,避免同一地址持续高频使用。两类出口:

  • 普通出口(固定端点):成功轮休(30 分钟,设 0 关闭);exit-fail-threshold(默认 3)次连续失败进入冷却;
  • 轮换池(# pool: 标记,一个端点背后是大量可轮换源 IP,例如本地 IPv6 /64 动态代理):永不冷却 + 独立探测预算 —— 每次连接都会换一个新源地址,"这次抽到坏的"只反映当前上游状态,不代表池子坏了;失败计数继续累计(供面板观测),健康捕获清空计数,但不会把池子雪藏 3 小时。每轮尝试额度也单独计算:池子享有 pool-attempts(默认 100)次抽奖机会,优先与普通出口轮询混合取样,份额用完后继续深潜自己的剩余预算;普通出口保持 attempts-per-proxy(默认 3)次/出口的小份额。自动单轮上限 = Σ(普通出口×3 + 池预算)。exit-pool-fail-threshold 仅为旧配置向后兼容保留,不再参与判定;max-attempts-per-round 显式设置时仍然全局覆盖。

在 proxies 文件中用行尾标记声明池成员:

direct
socks5h://192.0.2.1:1080   # pool:ipv6

面板「代理池」标签页会把该出口显示为「IPv6 池」(或标记里声明的名称);探测轨迹对 socks5 出口还会显示本次连接实际使用的源地址(服务端 BND.ADDR 回报,聚合池下每次不同)。升级时自动做策略迁移:轮换池的任何历史冷却立即解除。

8. 预备接管(无感换 token)

每个模型维护 两个槽位:业务轨正在使用的 active 值 + 探测轨提前备好的接班值。

  • 一个健康值就够:一旦获得有效状态值,系统就安静等待,不会在远离到期时反复探测;
  • 临近才预备:自动预备开启且模型未暂停时,active 剩余有效期进入 prefetch-minutes(默认 3 分钟)窗口,看门狗每 30 秒巡检并排队;每模型有 90 秒节流,已备好有效接班值时不重复。窗口是触发时机,串行队列等待与上游失败可能导致来不及取得新值;
  • 平滑接手:成功获得的新值先停在接班槽;业务继续使用旧 active,到期后的业务取值、状态读取或预备扫描会在锁内提升有效接班值。若已备好仍有效的接班值,业务无需等待新的探测;没有接班值时不能保证连续覆盖;
  • 重启与新旧值保护:快照恢复 active、candidate 和停止全部状态。重启不主动替换仍有效的 active;重复值、较旧值与已过期的新捕获不能覆盖较新的接班值,旧快照中无续期能力的重复接班值会被清除;
  • 手动轮自动跳过:“开始探测”只探测尚未持有健康值(或已临近到期)的模型,仍在有效期内的模型直接跳过(运行备注会说明),需要强制刷新单个模型时用行内的 ⟳ 按钮;
  • 彻底手动仍可用:prefetch-minutes: 0 关闭自动预备,回到纯手动模式;
  • 面板上出现绿色「预备就绪(剩余 xx)」徽标即表示该模型的下一任 token 已停当待命。

状态路由台支持输入“提前预备”分钟数并点击“确认保存”。只接受非负整数且小于 token 有效期,0 关闭后续自动预备;当前已经排队/执行的任务不因此取消。保存成功后后续扫描采用新窗口,仍遵守模型暂停、全局停止、有效接班值和重试节流,不会自动点击“开始探测”。输入中的草稿不被后台刷新覆盖,保存失败保持原设置。窗口较大可以给较慢的代理池留出时间,但预备 token 等待接管时也消耗自身有效期。

状态路由台还支持输入“串行间隔”秒数(probe-interval,1–3600)并点击“确认保存”。它同时控制同一模型的重试间隔与跨模型排队节奏:保存后从下一次间隔等待开始生效;已经开始的等待(含在途请求之后的等待)按原值结束,不会重置当前计时器。保存不会重启任务、解除全部停止或模型暂停,也不会自动发起探测;写入 runtime-settings.json 后在重启后保留。输入中的草稿同样不被后台刷新覆盖,保存失败保持原设置。

9. 代理入口新增、编辑与热加载

代理池页面可以新增单代理或 Pool 聚合代理入口,并编辑名称、地址、认证、类型、每轮基础次数和探测次数倍率。支持 socks5、socks5h、http、https,需填写有效端口;direct 的地址不可修改。Pool 指已有的聚合服务入口,背后的服务负责轮换出口 IP;仅修改类型不会把静态代理变成轮换服务。

  • 每轮基础次数为 0 时继承全局 attempts-per-proxy / pool-attempts;实际预算为基础次数乘以倍率并向上取整。例如聚合池基础 100 次、倍率 2,预算为 200 次。
  • 倍率支持 0.01–100,每个出口每轮最多 1000000 次。倍率影响尝试总预算,不改变 FIFO 单 worker,也不改变份额内轮询顺序。显式 max-attempts-per-round 仍优先限制整轮总次数。
  • 保存成功后热加载,不启动新任务、不解除停止或暂停。已选定的在途尝试允许结束,后续尝试采用新地址/类型/预算;按稳定出口 ID 扣除本轮已消耗次数,编辑或增加预算不会清零已经消耗的次数。
  • 编辑地址/认证保留该出口的禁用状态和冷却统计。改为聚合池时解除与聚合池规则不符的冷却,保留失败计数;单纯修改名称、预算或预备时间不会清除统计。
  • 编辑时用户名和密码留空保留原值;清除认证需要显式勾选。密码不回显,管理摘要和探测活动中的代理地址移除认证信息,操作通过不含凭据的出口 ID 定位。

面板设置同步写入状态目录旁的 runtime-settings.json(原子替换、权限 0600),写入成功才更新运行配置;无需重启。面板设置优先于 YAML/出口文件,未编辑的入口继续沿用配置文件,已编辑及新增入口由面板保存值覆盖并在重启后保留。若以后缩短 token TTL,实际预备窗口会限制为新 TTL 以下。运行设置与票据快照分开存储,备份/迁移时须同时保留;文件损坏会显示错误,不会静默覆盖。配置热重载不清空票据;进程重启仍先恢复 state.json 中有效的 active/candidate 和停止模式,再进行预备扫描。

管理接口新增 prefetch-window(minutes)、probe-interval(seconds,1–3600)和 save-exit(exit 对象:id、url、label、pool、attempts、multiplier,可选 username / password / clear_auth)。新增出口不传 id;编辑使用状态摘要返回的 id。exit-enabled、reset-exit 也支持 id,保留旧 proxy 参数兼容。


架构总览

业务轨(正常流量):
  Code Desktop / API Client
     └─► CPA (:8317)
           ├─ 时区规范化
           ├─ Turn-State 覆写(健康基线 → 配置值兜底)
           └─► 既有代理出口 ──► Upstream (chatgpt.com/backend-api/codex)

响应轨(丢弃并回灌):
  Upstream 响应携带异常 X-Codex-Turn-State(长度不符 / 模型不一致)
     └─► 下游响应头替换为该模型的健康基线(丢弃异常值,防止污染回流)

探测轨(手动触发 + 临近到期自动预备,独立 egress 池):
  状态路由台「开始探测」/ 自动预备扫描
     ├─ 按优先级逐模型尝试(可随时停止)
     ├─ egress 池轮换:direct → socks5 → http proxy
     ├─ 验收:模型一致 + 长度 == 292B
     └─ 通过 → 写入 active 或接班槽;失败标注,不影响仍有效的业务基线

插件钩子(CPA 插件宿主能力): request.intercept_before / request.intercept_after(请求覆写)、response.intercept_after(非流式观测)、response.intercept_stream_chunk(流式观测)、websocket.response_event(WS 观测)、management_api(面板路由)。


快速开始

前置条件

  • Go 1.26+(含 CGO,需 gcc/cc)
  • 已启用插件机制的 CLIProxyAPI v7.x(插件 schema_version 6 支持)
  • Codex 账号的 auth JSON(含 access_token / account_id,由 CPA 的 OAuth 流程生成)
  • 可选:一个或多个代理出口(socks5 / http)用于探测轨轮换

构建

make build          # 等价于:CGO_ENABLED=1 go build -buildmode=c-shared -o build/plugin.so ./src

安装

  1. 将 build/plugin.so 放到 CPA 插件目录,命名为 <plugin-id>.so(本插件:timezone-override.so):
<CPA plugins dir>/linux/amd64/timezone-override.so
  1. 在 CPA config.yaml 中加入配置(参考 config.example.yaml):
plugins:
  enabled: true
  dir: "/CLIProxyAPI/logs/.plugins"
  configs:
    timezone-override:
      enabled: true
      priority: 100
      turn-state-override: { ... }   # 详见配置详解
  1. 热加载:修改配置后 CPA 会自动重载插件(无需重启容器)。

  2. 验证:CPA 管理页 → 插件菜单「O/对抗插件」→ 查看「状态路由台」。


配置详解

所有配置位于 plugins.configs.timezone-override 之下,均为热加载。

turn-state-override

键 类型 默认 说明
enabled bool false 启用请求侧覆写
models []string [] 覆写目标模型(不区分大小写前缀匹配)
value string "" 兜底静态值(健康基线不可用时使用)
force bool false true=总是替换;false=客户端已携带健康长度(292)值时保留,异常长度值仍会回灌

💡 健康基线:每个模型的基线值由插件自动维护——启动时依次从部署种子文件(seeds.json)与自身审计记录中提取最近的 292 字节健康值;之后由业务流量观测(模型一致 + 292)与手动探测的成功结果持续刷新。事务性要求:只有通过「模型一致 + 长度符合」验收的值才会入库。

turn-state-override.probe

键 类型 默认 说明
enabled bool false 探测轨总开关(关闭时「开始探测」会提示未启用)
models []string astra→sol→luna→terra 手动轮的探测优先级(按顺序逐模型尝试一次)
cred-file string — Codex auth JSON 路径(容器内路径)
proxies []string ["direct"] 内联出口列表
proxies-file string — 独立出口文件(每行一个,# 注释;优先于内联)
ttl-minutes int 55 有效期时长(分钟)。到期时间 = token 内嵌签发时间戳 + 本时长;超过后不再对外提供该基线
prefetch-minutes int 3 临近到期自动预备窗口;0 为纯手动。停止全部或暂停模型时不自动探测
probe-interval-seconds int 5 探测重试间隔
attempts-per-proxy int 3 单出口连续尝试次数(之后轮换)
max-attempts-per-round int 0(自动) 单轮总尝试上限;0 表示按「出口数 × 每出口尝试次数」自动计算(默认 4 出口 × 3 次 = 12),超限标注失败
cooldown-minutes int 20 失败标注的冷却提示时间(仅用于面板展示,不再自动重试)
suspect-threshold int 3 轮内降智证据失败达到该次数后提前触发降智拒绝(打满后转正式判定)
timeout-seconds int 60 单次探测超时
prompt string "hi" 探测请求内容(最小化消耗)
upstream-url string chatgpt.com/backend-api/codex/responses 上游探测端点

出口文件(proxies-file)示例

# one egress per line; 'direct' = 容器自身网络
direct
socks5://user:pass@host:port
http://user:pass@host:port

🔐 建议:该文件仅包含出口凭据,存放于仓库之外(例如插件目录旁),权限 600。


工作原理

Turn-State 是什么

X-Codex-Turn-State 是上游在响应头下发、客户端在后续请求回传的会话粘性状态,用于连续性/缓存亲和。其值为 Fernet 认证加密 token:

[1B 版本 0x80][8B 大端 Unix 时间戳][16B IV][160B 密文][32B HMAC-SHA256] = 217 字节(base64url 后 292 字符)
  • 内嵌时间戳可用于估算有效期(本项目默认 TTL 55 分钟);
  • HMAC 覆盖全部前置字段:任何字节级改动(包括改时间戳)都会破坏签名,密钥在上游侧,本地无法重新生成合法 token;
  • 因此覆写策略是「复用一个曾由上游签发的真实值」,而不是改造/伪造。

探测轨状态机

自动预备待命 ──(未暂停且剩余 TTL ≤ 窗口)──► 排队 ──► probing
probing ──(验收通过: 模型一致 + 292B)──► 接班就绪(旧值继续服务,到期取值时原子接管)
probing ──(单轮达到 max-attempts)──► failed(标注: 次数/轮数/最后错误/时间)
停止当前轮 ──► 正在停止 ──► 原预备模式(保持健康基线)
停止全部 ──► 正在停止 ──► 全部停止(重启保持,开始探测恢复)

覆写决策链

请求命中 models 前缀匹配?
 ├─ 否 → 不处理
 └─ 是 → 有可用的健康基线(未过期)?
         ├─ 是 → 客户端值健康(292B)且 force:false → 保留(skipped-existing)
         │       否则 → 覆写为基线 (applied)
         └─ 否 → 有配置 value?
                 ├─ 是 → 同上规则后覆写 (applied-config)
                 └─ 否 → 不处理

响应侧(非流式 / 流式 / WebSocket 观测):
 上游返回的 X-Codex-Turn-State 长度异常或模型不一致?
 ├─ 是 → 丢弃该值,向下游回灌健康基线(未回流污染)
 └─ 否 → 292 字节且模型一致 → 作为该模型的最新健康基线入库

验收标准与长度说明

当前实现

探测成功 = HTTP 200 + 模型响应一致 + 长度恰好 292 字节(三条缺一不可)。 非 292(如 312)视为疑似风控降级态,判定失败并继续重试换 IP。

⚠️ 为什么 292 需要按你的环境调整

  • 292 字节 = 217 字节 Fernet 结构(160 字节密文恰好是 16 的倍数),这是本项目观测到的健康值形态;
  • 我们曾在同一模型上观察到 312 字节(224 字节解码、密文非 16 倍数,结构异常),且出现时上游行为异常——因此判断为风控/降级态;
  • 不能保证所有账号/套餐的有效字段都是 292 字节。如果你在自己的环境观测到不同长度始终一致地伴随正常响应,请调整验收规则。

如何调整

编辑 src/probe.go 中的常量并重新构建:

const probeRequiredStateLength = 292   // 改为你的有效长度

真实有效期(token 自证)

X-Codex-Turn-State 是 Fernet 认证加密 token,其结构自带 签发时间戳:

base64url → [1B 版本 0x80][8B 大端 Unix 时间戳][16B IV][160B 密文][32B HMAC] = 292 字符

因此 无需依赖捕获时刻与固定定时:直接解码 token 第 2–9 字节即可得到签发时间,加上有效期时长(ttl-minutes,默认 55 分钟)即为真实到期时间。状态路由台以 UTC+8(Asia/Shanghai) 显示每个模型持久化值的:

  • 签发时间(token 内嵌)
  • 到期时间(签发 + 有效期)
  • 真实剩余(实时倒计时,时/分/秒)
  • 已到期时标红「已到期」徽标;到期值不再对外提供,直到获得新的健康值

注意:token 的 HMAC 覆盖全部字段,不能改时间戳伪造有效期;这里仅做解码推算展示。


管理面板

CPA 管理页 → 插件菜单「O/对抗插件」,两个标签页:

请求记录

  • 每请求:时间(洛杉矶)、模型、上游响应模型(不一致打标)、时区处理、覆写状态徽标(已覆写 / 已覆写(配置值)/ 保留原值)、Turn-State 长度与来源。

状态路由台

  • 模型健康基线:长度彩色徽标(292 绿 / 非 292 橙)、来源(历史种子 / 业务观测 / 探测轨)、生成/到期时间、剩余 TTL 进度条;
  • 探测控制:「开始探测 / 停止当前轮 / 停止全部」区分本轮任务与自动预备。每行 ⏸/▶ 表示实际暂停/恢复参与状态,⟳ 排队探测该模型一次;单模型动作不解除全局停止。所有任务串行执行;
  • 状态显示:分别显示正在停止、自动预备待命、手动待命和全部停止;空闲不等于暂停。探测活动与失败标注不遮挡健康值剩余时间;
  • 失败标注:红色「上次探测 N 次失败」徽标(悬停查看完整错误);
  • 探测轨迹:时间 / 模型 / 出口 / 结果 / 耗时 / 说明(含上游模型名,便于核对一致性校验);
  • 顶部:探测轨状态胶囊、优先模型、探测成功数、最近活动。
  • 标题右侧:「降智请求拒绝」全局开关(独立标签页之外,始终可见)。

常见问题

Q1:为什么我固定了一个值,上游有时表现异常(延迟高、状态不再更新)? 固定值可能与当前会话/时间窗不匹配。上游对「合法但过期」的值有时容忍、有时拒绝。建议开启探测轨以持续获得新鲜值。

Q2:312 字节是什么? 疑似风控降级态(模型响应一致但状态结构异常)。本插件的验收规则会拒绝它并继续重试。

Q3:能自己改时间戳让它"更新鲜"吗? 不能。HMAC 覆盖全部字段,任何改动都会验签失败。能通过校验的只有上游自己签发的 token。

Q4:探测消耗什么? 使用与业务相同的账号配额,单次为最小请求(几十 tokens 级);仅在有效期窗口内按需触发。

Q5:需要几个出口? 一个也可以(默认 direct)。多出口的价值在于:某个出口拿到降级/无效状态时轮换到另一个出口重试。

Q6:会不会影响已有业务流量? 探测轨完全独立、不经 CPA 主链路;覆写逻辑只对配置的模型生效,可随时用 enabled:false 关闭。

Q7:支持哪些平台? 本插件为 Go c-shared 动态库,与平台无关:Linux .so / Darwin .dylib / Windows .dll(按目标平台构建)。


开发与测试

make vet            # go vet
make test           # 单元测试(无需 CPA)
make integration    # 隔离集成测试(需 CPA_INTEGRATION_BINARY + CPA_INTEGRATION_PLUGIN)

集成测试会启动一个真实的 CPA 进程与 mock 上游,覆盖:时区规范化、模型一致性、流式/非流式观测、覆写到达上游、面板鉴权等场景。

目录结构:

src/
├── plugin.go          # 插件注册、方法路由、管理 API
├── observer.go        # 观测扩展、覆写引擎、配置解析
├── probe.go           # 探测轨引擎(调度/代理池/验收/重试)
├── normalize.go       # 时区规范化(原功能)
├── abi.go             # CPA C ABI 桥接
├── *_test.go          # 单元 + 集成测试
├── web/index.html     # 管理面板(内嵌)
├── cmd/probetest/     # 一次性探测试验工具
└── scripts/           # 运维辅助脚本(脱敏状态摘要/合成 token 分析)

src/scripts/ 中的在线诊断脚本从环境变量 CPA_MANAGEMENT_KEY 读取管理密钥,访问本机 127.0.0.1:8317,不依赖特定 Docker 容器。通过你自己的秘密管理方式注入环境变量,不把真实密钥写入命令示例、源码或报告。脚本仅输出白名单元数据;fetch_record.py 用 SHA-256 比较 state,不打印完整值或预览,probe_status.py 不输出代理地址或原始错误正文。analyze_turn_state.py 只分析代码生成的合成样本,不访问服务。

示例地址使用文档保留地址,不代表可连接的代理。真实配置、auth、state、seeds、代理凭据及私钥应保留在仓库外;.gitignore 提供额外误提交保护。诊断脚本的脱敏回归可运行 python -m unittest discover -s src/scripts -p 'test_*.py',测试仅使用 mock 响应。


状态快照(持久化)

  • 插件将面板状态(健康基线值、失败标注、疑似计数、暂停列表、降智拒绝开关、探测计数、探测轨迹与请求记录)定期写入本地 JSON 快照(原子写、权限 0600),插件重载或容器重启后自动恢复,无需重新设置。
  • 默认路径:/CLIProxyAPI/logs/.plugins/timezone-override/state.json(可用环境变量 LKS_TZ_STATE_FILE 覆盖,测试用)。
  • 面板确认的预备窗口和代理编辑保存在同目录的 runtime-settings.json,其中可能包含代理认证,不能公开或提交仓库;它不替代上述票据快照。
  • 种子文件(可选):/CLIProxyAPI/logs/.plugins/timezone-override/seeds.json({"模型": "292字节值"}),启动时用于补全缺失基线;由部署流程从历史记录/备份中提取,权限 600,不随仓库分发。
  • 写入频率:状态变化后最迟 15s 落盘一次;plugin.shutdown 时立即终轮一次。
  • 容量有界(200 条请求记录 + 200 条探测轨迹 + 每模型 4096 字节状态值),典型快照 < 1MB。

合规与免责声明

  • 本项目仅供技术研究与学习,用于调试自有的网关与账号环境;
  • 使用前请确认符合所在国家/地区法律法规及上游服务条款;
  • 拼改、伪造或滥用会话状态可能违反上游条款并导致账号风控,所有风险由使用者自行承担;
  • 请妥善保管你的凭据文件(auth JSON / 代理凭据),不要提交到任何仓库。

License

MIT © 2026 FlashyyL

About

CLIProxyAPI plugin: timezone normalization, model consistency monitor, X-Codex-Turn-State observation & override, probe track.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

0