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
|
5dc5304c25
|
fix(gateway): 完善统一错误规则 (#468)
* fix(gateway): 完善统一错误规则
* fix(gateway): 采纳错误规则审查意见
* fix(gateway): 收紧未发送网络错误判断
|
2026-08-25 00:20:53 +08:00 |
|
tbphp
|
d518b06acc
|
refactor: 统一错误决策与执行链路 (#466)
* refactor: 统一错误决策与执行链路
* fix(gateway): 修正错误来源与候选预算
|
2026-08-24 23:26:22 +08:00 |
|
tbphp
|
bd539713da
|
perf: 优化测试性能与 CI/发布流水线耗时 (#465)
* test(control): 消除测试 fixture 中的重复密钥派生
- internal/control:fixture 构造中 388 次重复执行 PBKDF2(10 万轮
SHA256)密钥派生,改为共享单例,仅派生一次
- 新增 internal/testutil/encryptiontest,提供按 key material 值
memoize 的共享 encryption.Service,横向覆盖 gateway、subscription、
execution/cpa 中同样存在的重复派生(PBKDF2 占比最高达 79%)
- aesService 构造后只读,跨 fixture(含并行测试)共享安全;container
包同类调用经排查确认属于被测装配流程本身,不适用本次改造
* test(state): 迁移测试改用共享 schema 模板
state/loader 中 openMigratedDatabase 被 21 次调用,每次都完整走一遍
迁移注册表;改为复用 sqlitetest.OpenMigrated 的模板缓存,与 control、
requestlog 部分测试已采用的方式一致。app、container、requestlog 中同
类调用点经逐点排查,均属被测对象本身或依赖真实文件/账本状态,不适用。
* ci(release): 消除 CI 与发布流水线中的耗时浪费
- race-tests 独立 setup-go 缓存命名空间,避免与 test/database-contract
共用 key 导致 race-instrumented GOCACHE 永远无法写回
- 移除 publish-images 中零命中的 GHA buildx image cache,同时消除其
失败会拖累发布状态判定为 partial/blocked 的关联风险
- 三个只读 job(仅用 buildx imagetools 查询)移除多余的 buildx 初始化
- native-artifact-smoke 改为按需下载单个 binary + 独立 checksums,
不再下载完整 release-assets
* test(control): 第一批测试标记 t.Parallel(35 个文件)
internal/control 651 个顶层测试里只有 5.8% 标了 t.Parallel(),其余
在包内是排队串行执行的;race-tests 总耗时现在完全由该包的最长执行时
间决定(213s),是唯一剩余的瓶颈。
本批覆盖 35 个文件、299 个函数。排除 18 个不适用的函数:
- 16 个直接操作全局 logrus 状态的测试(catalog_sync_test.go 等 8 个
文件),继续保持串行;Go 的 t.Parallel() 调度语义保证未标记的测试
会在所有并行测试开始前完整跑完,两者不会交叉执行
- external_database_integration_test.go 的 2 个测试依赖
GPT_LOAD_DATABASE_TEST_DSN:race-tests 中因未设置而被 t.Skip,标记
并行无收益;database-contract job 中会共享同一个外部数据库实例真
实执行,标记并行有正确性风险(唯一索引冲突/断言假设独占)
已排查确认安全:t.Setenv/os.Setenv 均为 0 处,无硬编码端口占用,每个
fixture 走独立 :memory: 数据库;本地 -count=3 重复验证无 flaky。
剩余约 297 个函数(36 个文件)作为第二批,待本批 CI 实测确认收益后
再决定是否推进。
* test(control): 第二批测试标记 t.Parallel,补齐排除说明(36 个文件)
覆盖剩余 297 个函数、36 个文件,加上第一批的 299 个,internal/control
除 18 个明确排除的函数外全部标记 t.Parallel()。
为 18 个排除函数逐一补充一行注释说明原因,避免日后被误认为遗漏而被
顺手加上 t.Parallel():
- 16 个劫持全局 logrus 状态的测试
- 2 个依赖 GPT_LOAD_DATABASE_TEST_DSN 共享外部数据库的测试
本地 -count=3 重复验证、全量 go test -count=1 . ./internal/...(58
包 ok)均通过。
* fix(release): 采纳 Review 反馈,修正文档措辞与产物保留期
- encryptiontest.Service 的文档注释修正为明确说明缓存仅在单个包的
测试二进制内有效,不跨包共享(每个包的 go test 是独立进程)
- native-artifact-smoke 依赖的 binary-*、release-checksums 保留期
从 1 天提高到与 release-assets 一致的 14 天:失败的 release run
若延迟超过 1 天才重试,此前较短的保留期会导致产物过期、下载失败,
阻塞发布流程
以下反馈经核实判定为不成立,未采纳:
- validation_test.go 中两个测试被指"竞争全局并发槽位"——经查
newValidationWorkerForTest 每次调用构造全新独立实例(worker、
channel、mutation coordinator 等),validationConcurrency 只是
编译期常量,两个测试之间不存在任何运行时共享状态
|
2026-08-24 20:07:11 +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
|
8898421ee8
|
refactor(subscription): 分离额度刷新与请求调度 (#449)
* refactor(subscription): 分离额度刷新与请求调度
* fix(subscription): 重置后刷新额度信息
* fix(subscription): 修正重置刷新并发状态
* fix(subscription): 收口重置后额度刷新状态
|
2026-08-21 17:40:38 +08:00 |
|
tbphp
|
e74919e819
|
fix(stream): 修复订阅流组帧并收口响应头 (#450)
* fix(stream): 修复订阅流组帧并收口响应头
* fix(stream): 修复空流块与部分响应头
|
2026-08-21 16:08:50 +08:00 |
|
tbphp
|
25a3612c3c
|
fix(subscription): 补全 Grok 套餐与额度观察
|
2026-08-18 23:02:58 +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
|
c3b132daf3
|
fix(antigravity): 完善订阅渠道故障转移与导入
|
2026-08-18 08:08:44 +08:00 |
|
tbphp
|
ef0459c347
|
feat(subscription): 接入 Antigravity 订阅渠道
|
2026-08-17 20:25:57 +08:00 |
|
tbphp
|
7f018218f4
|
fix(cpa): 修正本地计数执行元数据
|
2026-08-17 16:08:29 +08:00 |
|
tbphp
|
f63777aced
|
fix(subscription): 完善局部观察与本地计数归属
|
2026-08-17 15:00:14 +08:00 |
|
tbphp
|
fd7b87827a
|
fix(subscription): 收口观察与本地计数边界
|
2026-08-17 13:25:01 +08:00 |
|
tbphp
|
fb63141d9a
|
feat(codex): 接入订阅 Token 计数
|
2026-08-17 11:39:46 +08:00 |
|
tbphp
|
1c00680484
|
fix(subscription): 修复观察失败与401刷新
|
2026-08-17 11:13:04 +08:00 |
|
tbphp
|
3333f49f36
|
fix(claude): 补全订阅渠道能力
|
2026-08-17 09:38:45 +08:00 |
|
tbphp
|
a36cf1be53
|
feat(claude): 补齐订阅渠道能力
|
2026-08-16 18:52:45 +08:00 |
|
tbphp
|
f5fe38ac4d
|
feat(claude): 接入 OAuth 订阅渠道
|
2026-08-16 17:21:50 +08:00 |
|
tbphp
|
6ddbf5b56d
|
fix(ci): 稳定 race 测试门禁
|
2026-08-16 11:31:03 +08:00 |
|
tbphp
|
9a23a87e05
|
fix(protocol): 统一模型列表协议归属
|
2026-08-16 09:20: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
|
d623459b83
|
feat(codex): 增加订阅渠道与认证流程
|
2026-08-14 12:36:49 +08:00 |
|
tbphp
|
bae4207233
|
Merge branch 'v2' into codex/codex-subscription
|
2026-08-14 08:41:15 +08:00 |
|
tbphp
|
21082ac739
|
feat(subscription): 接入 Codex 订阅账号
|
2026-08-14 08:41:02 +08:00 |
|
tbphp
|
e9daf96865
|
feat(channel): 支持 DeepSeek 三种原生协议
|
2026-08-13 23:33:06 +08:00 |
|
tbphp
|
22a6f1c57b
|
fix: 修复上游执行与迁移边界问题
|
2026-08-12 23:49:18 +08:00 |
|
tbphp
|
8cf67efdf0
|
feat(vertex): 简化凭据配置并支持 Gemini 原生请求
|
2026-08-12 15:50:15 +08:00 |
|
tbphp
|
36d2915fbd
|
fix(import): 根据 SDK 展示上游地址提示
|
2026-08-12 11:39:40 +08:00 |
|
tbphp
|
59d07c9b6b
|
feat: 日志协议优化
|
2026-08-12 08:37:53 +08:00 |
|
tbphp
|
e7de10ec73
|
feat(route): 支持有损协议转换与参数追踪
|
2026-08-11 17:42:10 +08:00 |
|
tbphp
|
6162826efa
|
fix(runtime): 稳定流空闲超时分类
|
2026-08-11 13:58:17 +08:00 |
|
tbphp
|
1ef573ae34
|
fix(health): 改进凭据自动恢复检测
|
2026-08-11 11:33:50 +08:00 |
|
tbphp
|
8a7c4615df
|
fix(v2): 收口协议执行与流式边界
|
2026-08-11 08:56:59 +08:00 |
|
tbphp
|
d6be4272d1
|
feat(console): 完善日志诊断与模型视图
|
2026-08-11 08:18:45 +08:00 |
|
tbphp
|
c13906f001
|
fix(logs): 展示脱敏后的上游错误消息
|
2026-08-10 22:11:52 +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
|
9c05b41966
|
feat(channel): 支持自定义上游地址
|
2026-08-10 13:19:48 +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 |
|