tbphp
|
7cbd2e672d
|
feat(responses): 实现响应状态续接路由 (#609)
* feat(responses): 实现响应状态续接路由
* fix(responses): 限制响应 ID 长度并兼容缺失字段删除
* fix(responses): 按协议存储能力匹配续接路由
|
2026-09-09 23:13:41 +08:00 |
|
tbphp
|
fe4b6ac159
|
feat(gateway): 接入原生文本重排序协议 (#607)
|
2026-09-09 15:06:50 +08:00 |
|
tbphp
|
e0bfa07ec4
|
feat(scheduler): 统一凭据权重并调整模型错误重试 (#597)
* feat(scheduler): 统一凭据权重并调整错误重试
* docs: 更新三语配置权重说明
|
2026-09-08 17:18:08 +08:00 |
|
tbphp
|
9cb3f98688
|
feat(scheduler): 实现全局加权轮询与连续分配限制 (#591)
* feat(scheduler): 实现全局加权轮询与连续分配限制
* fix(scheduler): 补齐初始停用分组的入场校准
* fix(scheduler): 统一分组恢复校准并修正检查说明
|
2026-09-08 09:15:47 +08:00 |
|
tbphp
|
559ed2dc88
|
feat(gateway): 支持数据面 CORS 与响应头规则 (#568)
* feat(gateway): 支持数据面 CORS 与响应头规则
* fix(cors): 修正来源缓存与禁用校验
* fix(cors): 规范化允许来源
|
2026-09-05 10:34:47 +08:00 |
|
tbphp
|
1be3587000
|
feat(channel): 增加 CLIProxyAPI 多协议渠道 (#525)
|
2026-09-01 21:07:19 +08:00 |
|
tbphp
|
d7d28370da
|
feat(channel): 增加 New API 多协议渠道 (#524)
|
2026-09-01 19:56:40 +08:00 |
|
tbphp
|
aee2111290
|
feat(gateway): 支持 OpenAI Embeddings API (#496)
新增原生 OpenAI Embeddings 端点,覆盖首期 API Key 渠道,并复用现有路由、健康、用量、日志与管理流程。
|
2026-08-30 00:45:19 +08:00 |
|
tbphp
|
515c958dd1
|
feat(config): 支持运行策略与数据库连接池配置 (#492)
* feat(config): 增加重试拉黑及数据库连接池配置
* fix(settings): 恢复已提交配置快照
|
2026-08-29 18:23:34 +08:00 |
|
tbphp
|
1a6e454475
|
feat(subscription): 接入 Codex/Claude 被动额度信号观察 (#487)
* feat(subscription): 接入 Codex/Claude 被动额度信号观察
从 Codex/Claude 订阅请求的响应 Header 中安全采集额度信号,归一化为与主动观察一致的账号级窗口,
经内存 pending map 合并后由 RequestLog worker 复用现有 quotaWake 异步落库,
自动刷新账号卡的额度窗口与同步时间;额度仅用于管理面展示,不参与路由、调度或健康判定。
同时修复 recordCredentialObservationFailure / invalidateCredentialObservationAfterReset
整行 Save 覆盖并发写入 snapshot_json 的既有问题,改为按列更新。
* fix(subscription): 修正被动额度合并的两处数据错误
丢弃比已存记录更旧的被动采样:手动刷新在 pending 落库前完成时,
旧采样会让 observed_at_ms 倒退并用旧额度覆盖新值;updated_at_ms
条件更新只能拦截读取之后的写入,拦不住这种时间倒退。
MergeQuotaWindow 不再用空字符串覆盖 Label/LabelKey/Scope/Unit:
这些是快照必填字段,被清空后 ApplyQuotaWindows 会跳过该窗口并
清除管理面低额度提示。
* fix(subscription): 落库确认后清空 pending 窗口缓存
ack 此前只清 dirty 标记,不清 entry.windows;下一次响应即使只带
部分字段,也会把已经落库的陈旧字段当作当前观察重新合并进去,
可能覆盖同一时间发生的主动刷新写入的更新值。
现在版本匹配时一并清空窗口缓存,配合已有的 MergeQuotaWindow
字段级保护,落空字段的响应不会再用零值或陈旧值覆盖数据库现值。
* fix(subscription): 通用化 Codex 被动额度解析并修正三处数据错误
Codex 被动解析改为从 Header 自动发现限额命名空间,不再写死
primary/secondary 两个账号级窗口。带 Limit-Name 的附加限额
(如 GPT 5.3 Codex Spark)现在也能被动更新,且窗口 ID 与主动
JSON 路径一致;将来新增的限额类型无需改代码即可识别。缺少
Limit-Name 的命名空间跳过,因为无法生成可匹配的稳定 ID。
同时修正:
- 越界 used-percent、非正或溢出的 reset/window 一律丢弃,
不再用 0 或回绕值覆盖快照中的有效字段;
- 被动不再输出 Label/LabelKey,避免只带使用率的响应把 7d 窗口
的标签改写成 Session,与 window_seconds 自相矛盾;
- 主动成功的 observed_at_ms/updated_at_ms 改用响应完成时间
(last_attempt_at_ms 仍为尝试开始时间),慢速手动刷新不再被
刷新期间捕获的被动样本反向覆盖,CAS token 也不再可能不变;
- 窗口值未变化但确实观察到时推进 observed_at_ms,低频账号不再
长期显示数小时前同步。
* refactor(subscription): pending 只保留最新一次响应,不再跨响应合并
pending 条目此前会把多次响应的窗口字段按 ID 合并,却只记录一个
观察时间。混在一起的字段因此可能带着较晚的时间戳落库,反过来
盖掉这期间提交的主动刷新结果。上一轮给 ack 加清缓存只堵住了
"已落库后残留"这一半,尚未落库前合并的那一半仍然存在。
改为每次记录整体替换:一个 pending 条目只承载一次响应,窗口与
观察时间始终描述同一时刻,这类时序覆盖从根上不再可能,ack 也
不需要再清缓存。被丢弃的旧响应不构成数据丢失——快照中该窗口
保持原值,下一次带该窗口的响应会刷新它。
生产代码净减 19 行。
* fix(subscription): 用 observation_version 做被动写入的并发令牌
时间戳不能充当 CAS 令牌:两次写入可能落在同一毫秒,updated_at_ms
数值不变会让已过期的被动写入通过条件更新,盖掉刚提交的主动刷新。
改用 observation_version(主动成功本就递增),并保留 updated_at_ms
比对以覆盖主动失败与重置这两条只改元数据、不动版本的路径。
同时收敛三处局部合同:
- 绝对 reset 无效时继续尝试同一响应中的相对 reset,不再因一个坏
Header 丢掉可用值;
- 被动输出不再携带 Scope / Unit / IsPrimary(此前只清了 Label),
贯彻「自动更新只改额度数值与状态」,Codex 与 Claude 两侧一致;
- pending 深拷贝窗口的指针字段,调用方后续修改不会改变待落库内容。
* fix(subscription): ACK 时移除 pending 条目并让同毫秒判给主动结果
ACK 此前只清 dirty 标记,条目连同克隆的窗口一直留在 map 里。凭据
删除后也不会释放,长期运行且凭据有增删的实例会持续增长。改为版本
匹配时直接移除条目——凭据删除本就走「registry 查不到 → ACK」这条
路径,因此不需要再给删除流程挂额外的清理钩子。
被动样本与行内 observed_at_ms 相同时改为丢弃(原为严格小于才丢)。
被动 Header 先捕获、主动刷新稍后完成,两者截断到同一毫秒时,旧的
被动结果会盖掉权威的主动结果,且此时 CAS 不冲突。相同毫秒判给主动
结果即可,不引入更高精度时间戳。该判断收紧后,落库处基于
alreadyObservedAt 的分支成为死代码,一并删除。
顺带移除无生产调用方的 AckPassiveQuotaObservation 导出方法。
|
2026-08-28 18:26:00 +08:00 |
|
tbphp
|
e9e88dce99
|
feat(images): 接入 OpenAI 图片生成与编辑 (#476)
* feat(images): 接入 OpenAI 图片生成与编辑
* fix(images): 补齐响应容量与边界处理
* fix(images): 修正协议观测与响应上限覆盖
* fix(stream): 保证取消优先于流关闭
* fix(images): 修正空 SSE 错误对象判定
* fix(images): 避免媒体数据触发凭据误判
* fix(images): 阻止流式响应泄漏凭据
* fix(images): 校验完整流事件后再转发
* fix(images): 修正响应模型观测
|
2026-08-27 15:11:52 +08:00 |
|
tbphp
|
4f9eba5802
|
feat(proxy): 完成数据面代理与渠道约束 (#459)
* feat(proxy): 实现第一阶段数据面代理
* feat(proxy): 收敛渠道与代理协议支持
* fix(proxy): 修复环境检测与迁移验证
* fix(proxy): 回收旧代理运行时并校验地址
* fix(proxy): 补齐创建链路与前端校验
* fix(proxy): 收口订阅代理与迁移兼容
* fix(proxy): 修复环境代理与运行时回收
* fix(proxy): 为系统外部请求应用全局代理
* docs(config): 精简环境配置说明
* feat(proxy): 重构代理设置的前端交互与样式
设置页与分组设置页:
- 代理设置接入页面统一的草稿态与保存栏,不再独立即时提交
- 计入页面 dirty/valid,参与未保存离开拦截与并发冲突推迟
- 新增 ProxyOverrideRow,用分段控件替代原独立编辑弹层
账号卡片与密钥行:
- ProxyConfigEditor 新增 card 外观:标题在白底面板外,与相邻小节同级
- 修掉按视口宽度判断断点的问题,窄容器内不再挤压错乱
- 编辑态下拉固定宽度,不随所选模式伸缩;整体收进两行
- 新增 ProxyScopeIndicator,凭据配置了独立代理时给出标识与悬停提示
密钥行交互:
- 操作列收成「更多操作」菜单与展开图标,与账号卡片同构
- 折叠区分为权重、出站代理、运行诊断三个带标题小节,设置与诊断不再混放
- 权重编辑从弹层迁入折叠区,权重列的值可点击直达
- 释放的列宽还给凭据、权重与最近调用列
文案精简为继承、直连、自定义,并清理两处无引用的死键
* refactor(proxy): 统一代理设置的覆盖交互并消除样式重复
设置页与分组设置页:
- 代理行改用 RuntimeOverrideRow,与超时等设置项共用同一组件
- inherit 映射为“未覆盖”,direct/custom 映射为“显式覆盖”,因此补齐了
覆盖/恢复默认按钮、覆盖状态徽章、当前有效值与待恢复默认态
- 分段控件只保留直连与自定义,继承由外层覆盖开关表达
- 删除自造的 ProxyOverrideRow,新增只含编辑控件的 ProxyOverrideControl
已保存的自定义地址:
- 输入框不做回填,统一由 placeholder 展示已存地址
- 同模式下留空或与已存地址逐字相同均视为未改动,顺带挡住掩码被当作
新密码存回;无改动时保存按钮禁用
- 重新开启覆盖时回到基线已存的覆盖模式,使恢复默认可原路撤销
代码质量:
- 面板外壳(标题 + 白底面板 + 标签/值/编辑图标/操作)抽为全局
.setting-panel,代理、权重、诊断三处共用,不再各写一份
- 删除 ProxyConfigEditor 已无调用方的 row 外观及随之失效的 props、
徽章分支与始终隐藏的文案
- 占位地址推导与覆盖开关规则收敛为 proxy.ts 中的共享函数
- 移除代理输入提示文案及其失去引用的 i18n 键
密钥行折叠区诊断值字号对齐上方面板。重构以构建产物 CSS 逐条比对验证,
差异均为已论证的等价改写。
* fix(proxy): 修复代理传输与校验边界
|
2026-08-24 11:11:22 +08:00 |
|
tbphp
|
92c52ec265
|
feat(subscription): 增加账号批量操作 (#455)
* feat(subscription): 增加账号批量操作
* fix(subscription): 统一账号文件导入导出
* fix(subscription): 独立展示批量同步状态
* fix(groups): 优化凭据批量操作交互
* fix(groups): 优化凭据批量操作布局
* feat(groups): 增加凭据全量操作
* fix(groups): 修复凭据批量操作反馈
|
2026-08-22 13:30:03 +08:00 |
|
tbphp
|
24df87c280
|
feat(access-key): 优化费用额度管理与提示 (#444)
|
2026-08-20 23:51:04 +08:00 |
|
tbphp
|
03ee3048a3
|
feat(access-key): 增加估算费用额度限制 (#439)
* feat(access-key): 增加估算费用额度限制
* fix(storage): 修正 MySQL 迁移恢复断言
* fix(access-key): 修复额度并发与恢复边界
* fix(access-key): 修复额度发布与周期收敛
* test(requestlog): 稳定额度恢复状态断言
* fix(control): 保持健康额度快照一致
|
2026-08-20 17:19:32 +08:00 |
|
tbphp
|
5d9b0015e2
|
feat: 增加版本更新提示与社区入口 (#438)
* feat: 增加版本更新提示与社区入口
* fix(release): 完善版本检查分页与测试隔离
* fix(release): 改为按需触发更新检查
|
2026-08-20 10:17:30 +08:00 |
|
tbphp
|
d1fd07ce3e
|
feat(subscription): 接入 xAI OAuth 订阅渠道
|
2026-08-18 21:22:13 +08:00 |
|
tbphp
|
cb0d7018f5
|
refactor(subscription): 统一渠道展示与目录结构
|
2026-08-18 11:30:07 +08:00 |
|
tbphp
|
d5193ee6ee
|
Merge branch 'feature/antigravity-subscription' into v2
|
2026-08-17 21:08:36 +08:00 |
|
tbphp
|
f1eeb7b0a6
|
feat(credentials): 调整订阅凭据操作
|
2026-08-17 20:37:04 +08:00 |
|
tbphp
|
ef0459c347
|
feat(subscription): 接入 Antigravity 订阅渠道
|
2026-08-17 20:25:57 +08:00 |
|
tbphp
|
f5fe38ac4d
|
feat(claude): 接入 OAuth 订阅渠道
|
2026-08-16 17:21:50 +08:00 |
|
tbphp
|
0633455084
|
fix(channel): 收口订阅能力与运行时契约
|
2026-08-16 00:19:29 +08:00 |
|
tbphp
|
4c00eed40b
|
refactor(channel): 统一渠道架构与协议契约
|
2026-08-15 15:37:50 +08:00 |
|
tbphp
|
8ed9ac8eda
|
fix(codex): 收敛订阅接入架构边界
|
2026-08-14 16:00:37 +08:00 |
|
tbphp
|
2c4e4e1652
|
fix(codex): 完善订阅协议与认证流程
|
2026-08-14 14:45:51 +08:00 |
|
tbphp
|
21082ac739
|
feat(subscription): 接入 Codex 订阅账号
|
2026-08-14 08:41:02 +08:00 |
|
tbphp
|
8a7c4615df
|
fix(v2): 收口协议执行与流式边界
|
2026-08-11 08:56:59 +08:00 |
|
tbphp
|
530ee0aede
|
feat(bifrost): 按最终配置复用原生运行时
|
2026-08-10 21:30:38 +08:00 |
|
tbphp
|
f458a98b12
|
fix(lifecycle): 规范服务启动与退出流程
|
2026-08-10 18:46:59 +08:00 |
|
tbphp
|
5ca340939c
|
fix(v2): 收口发布前运行时与迁移问题
|
2026-08-10 12:17:05 +08:00 |
|
tbphp
|
61b763b96b
|
fix(channel): 收口渠道执行与终局迁移
|
2026-08-10 10:31:08 +08:00 |
|
tbphp
|
6f6f7c3efc
|
refactor(channel): 切换为 Bifrost 渠道执行架构
|
2026-08-10 08:22:15 +08:00 |
|
tbphp
|
4202cee179
|
feat(app): 优化运行时生命周期
|
2026-08-07 19:00:58 +08:00 |
|
tbphp
|
b316c6eafc
|
refactor(models): 移除设置页面中的模型价格同步部分,模型页面已提供此功能
|
2026-08-07 11:35:02 +08:00 |
|
tbphp
|
ff7d0eee26
|
Merge branch 'v2' into feat/models-page
|
2026-08-06 23:21:40 +08:00 |
|
tbphp
|
a433e73804
|
feat(models): 新增模型信息与价格管理页面
|
2026-08-06 23:21:29 +08:00 |
|
tbphp
|
ad362cddfb
|
test(logging): 对齐精简事件名称
|
2026-08-06 23:15:01 +08:00 |
|
tbphp
|
13121be65a
|
feat(monitor): 完成健康页面监控实现
|
2026-08-05 11:37:41 +08:00 |
|
tbphp
|
c25c3525b5
|
feat(pricing): 重构模型目录与价格同步
|
2026-08-03 08:37:16 +08:00 |
|
tbphp
|
2848ad296e
|
feat: 完善分组详情与密钥管理
|
2026-08-01 21:06:44 +08:00 |
|
tbphp
|
3c0577aa7f
|
feat(groups): 重构分组集合页
|
2026-08-01 08:05:37 +08:00 |
|
tbphp
|
62cf5f4a3d
|
feat(home): 重建统计存储与首页接口
|
2026-07-30 23:22:11 +08:00 |
|
tbphp
|
1e9a8ffb63
|
refactor(protocol): 统一 OpenAI Completions 协议命名
|
2026-07-30 21:31:24 +08:00 |
|
tbphp
|
b91bd5edf5
|
refactor(router): 统一路由注册与回退
|
2026-07-30 11:49:28 +08:00 |
|
tbphp
|
05d81a5123
|
feat(web): 合并 Ledger 首页重构
|
2026-07-30 09:56:25 +08:00 |
|
tbphp
|
5fcbe74851
|
feat(web): 重构 Ledger 首页与管理界面
|
2026-07-30 09:43:27 +08:00 |
|
tbphp
|
92d9bf3a5a
|
feat(responses): 合并 OpenAI Responses 协议
|
2026-07-30 09:28:56 +08:00 |
|
tbphp
|
0cf8983d07
|
feat(responses): 支持 OpenAI Responses 协议
|
2026-07-30 09:16:11 +08:00 |
|
tbphp
|
96c43766ce
|
refactor(runtime): 精简日志并统一路由回退
|
2026-07-30 09:13:04 +08:00 |
|