115 Commits
Author SHA1 Message Date
tbphp fe8cc17835 chore(release): 将验证任务迁回自托管 (#690) 2026-09-18 18:26:59 +08:00
tbphp e9a10bb509 test(ci): reduce race gate overhead (#688) 2026-09-18 13:05:49 +08:00
tbphp 47e3838e0b fix(release): use GitHub-hosted runners (#685) 2026-09-18 09:57:18 +08:00
tbphp d01656a1d8 perf(ci): 迁移自托管运行器并优化并行验收 (#634)
* perf(ci): 切换现有自托管运行器并复用本机缓存

* perf(ci): 将主要 Linux 任务迁至 Mac ARM64 运行器

* fix(ci): 使用动态端口执行 Windows 安装验收

* test(cpa): 等待异步处理完成后校验 WebSocket 行为

* perf(ci): 并行数据库测试并隔离容器验收端口

* ci: 为数据库合同测试启用内存盘

* test(cpa): 固定断连日志脱敏测试的执行顺序

* fix(ci): 修复自托管验收中断和架构兼容问题

* fix(ci): 原子准备 Windows 安装验收配置
2026-09-13 08:31:56 +08:00
tbphp 175949e20a feat(usage): 支持自定义时间统计并统一时间筛选 (#594)
* feat(usage): 统一时间区间统计与快捷筛选

* fix(usage): 精简时间筛选与趋势提示布局

* fix(usage): 保留未修改时间端点的原始时刻
2026-09-08 13:33:06 +08:00
tbphp c4cefc0655 chore(ci): 收敛主分支检查与命名 (#564)
* chore(ci): 收敛主分支检查与命名

* test(ci): 加强工作流合同断言
2026-09-04 19:51:00 +08:00
dependabot[bot]andtbphp 866f0f13fc chore(ci): bump the github-actions-minor-and-patch group across 1 directory with 2 updates (#559)
* chore(ci): bump the github-actions-minor-and-patch group across 1 directory with 2 updates

Bumps the github-actions-minor-and-patch group with 2 updates in the / directory: [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) and [softprops/action-gh-release](https://github.com/softprops/action-gh-release).


Updates `docker/setup-qemu-action` from 4.2.0 to 4.3.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/96fe6ef7f33517b61c61be40b68a1882f3264fb8...1f40c72289eff860ee54a304f1438e3cff362e0a)

Updates `softprops/action-gh-release` from 3.0.2 to 3.0.3
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/3d0d9888cb7fd7b750713d6e236d1fcb99157228...efb35369e0ad2afab669f228072c1b0d510eae64)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-minor-and-patch
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* test(ci): 同步发布 Action 引用

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: tbphp <tangb7420@gmail.com>
2026-09-04 18:52:41 +08:00
tbphp 1c30bf6ba7 ci: 删除重复依赖漏洞检查 (#562)
* ci: 删除重复依赖漏洞检查

* ci: 禁用 pnpm 安装时的隐式审计
2026-09-04 18:27:51 +08:00
Ryan Chou d1cb37a11f fix(ci): update references after default branch rename (#556) 2026-09-04 12:59:23 +08:00
tbphp 30a1bac965 fix(release): 修正 CPA 版本文档漂移与数据库合同测试遗漏 (#514)
* fix(release): 修正 CPA 版本文档漂移与数据库合同测试遗漏

THIRD_PARTY_NOTICES.md 与 cpaembedded/README.md 的 CLIProxyAPI 版本号
未随 #507 依赖升级同步,仍是 v7.2.143(实际 v7.2.144)。

ci.yml 与 release.yml 的数据库合同测试 -run 正则手工维护测试名单,
已产生漂移:ci.yml 含一个不存在的测试名(静默不匹配),两者都缺失
TestExternalDatabaseMySQLRecoversObservationFreshnessCheckDrop,
release.yml 还缺失 TestExternalDatabaseAccessKeyCostLimitPeriodPermutation。
改为按前缀匹配同目录下全部 TestExternal* 测试,避免后续再次漂移。

补上 ja-JP/settings.ts 缺失的 runtime.pendingRestoreSource key,
该 key 在 4 个组件共 8 处引用,此前日文界面回退显示英文文案。

* fix(storage): 修正 0003 迁移恢复对 MySQL 中间态的误判

启用数据库合同测试的完整名单后,
TestExternalDatabaseMySQLRecoversObservationFreshnessCheckDrop
第一次在真实 MySQL 上执行即失败:ValidateCurrent0001 仅凭
fresh_until_ms 列是否存在判断 0003 是否已完成,但 MySQL 上
0003 的 DROP CHECK 与 DropColumn 是两条独立、非事务性 DDL,
崩溃可能停在"约束已删、列还在"的中间态。此时 ValidateCurrent0001
误判为"0003 未开始",转而用要求约束存在的冻结校验器 Validate0001,
导致误报 chk_credential_observation_fresh_until 缺失。

改为以约束是否存在作为判断信号,与同文件 ValidateRecoverable0003
已经正确处理该中间态的逻辑保持一致。已用一次性 MySQL 8.4 与
PostgreSQL 18 容器验证三态恢复路径与完整数据库合同测试套件。
2026-08-31 21:10:42 +08:00
tbphp 3d14c18dcf feat(release): 统一 2.x 镜像标签通道 (#512) 2026-08-31 17:35:12 +08:00
dependabot[bot]andtbphp d6a66e9877 chore(ci): bump the github-actions-minor-and-patch group across 1 directory with 2 updates (#509)
* chore(ci): bump the github-actions-minor-and-patch group across 1 directory with 2 updates

Bumps the github-actions-minor-and-patch group with 2 updates in the / directory: [docker/login-action](https://github.com/docker/login-action) and [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action).


Updates `docker/login-action` from 4.5.2 to 4.6.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/371161bbe7024a29a25c5e19bfcbc0804fe9ad2c...dbcb813823bdd20940b903addbd779551569679f)

Updates `docker/setup-buildx-action` from 4.2.0 to 4.3.0
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/bb05f3f5519dd87d3ba754cc423b652a5edd6d2c...37fe631027851001ddb9b187196cc803df7f5f0e)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-minor-and-patch
- dependency-name: docker/setup-buildx-action
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions-minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* test(webui): 同步 Docker Action 固定引用

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: tbphp <tangb7420@gmail.com>
2026-08-31 16:37:45 +08:00
tbphp 9593c08beb chore(ci): 移除 Dependabot target-branch 并更正版权年份 (#506) 2026-08-31 15:34:31 +08:00
tbphp 2aacd9e761 chore(community): 补齐社区规范文件与日文协议说明 (#503)
* docs(readme): 补齐日文协议表与 Embeddings 说明

* chore(community): 新增贡献指南、行为准则与社区配置

* chore(community): 明确行为准则举报渠道与 Dependabot 限制

* chore(community): 补齐 embedded module 的检查说明与依赖监控
2026-08-31 14:16:50 +08:00
tbphp 118c9a91b1 feat(release): 增加 Render 镜像部署 (#502)
* feat(release): 增加 Render 镜像部署

* fix(release): 重试 Render 版本检查
2026-08-31 12:44:42 +08:00
tbphp 5c16ed84b3 feat(windows): 增加原生服务安装包 (#493)
* feat(windows): 增加原生服务安装包

* fix(windows): 收紧服务安装与升级流程

* fix(windows): 固定服务安装路径与语言资源

* fix(windows): 等待安装器进程完成

* fix(windows): 清理首次安装失败残留
2026-08-29 23:26:23 +08:00
tbphp d4bbb9193a feat: 升级 Go 与 SDK 版本 (#485)
* feat(gateway): 升级 SDK 并封口兼容合同

* fix: 修正升级后的格式与模型过滤

* fix(ci): 更新 Go 漏洞扫描器

* fix(gateway): 拒绝非标准服务层级字段
2026-08-27 22:48:16 +08:00
tbphp a6d2e712ac fix(release): 统一使用版本号作为标题 (#481) 2026-08-27 15:53:39 +08:00
tbphp d518b06acc refactor: 统一错误决策与执行链路 (#466)
* refactor: 统一错误决策与执行链路

* fix(gateway): 修正错误来源与候选预算
2026-08-24 23:26:22 +08:00
tbphp 1bc4c7fead perf(release): 镜像复用预编译产物 + GOPROXY 网络容错 (#467)
* fix(ci): GOPROXY 在网络错误时回退到直连源

默认的 GOPROXY=https://proxy.golang.org,direct 用逗号分隔,只在收到
404/410 时才回退到下一个源;proxy.golang.org 的瞬时网络故障(如
HTTP/2 stream INTERNAL_ERROR)会直接让整个 job 失败,默认配置里的
direct 后备源在最需要它的场景下形同虚设。

改用竖线分隔,任何错误(含网络错误)都回退。实验验证:
- 逗号:首个源 EOF -> 直接失败,不尝试第二个源
- 竖线:首个源 EOF -> 成功回退并完成下载

ci.yml、release.yml 以 workflow 级 env 统一设置;Dockerfile 内的
go mod download 走同一问题,一并设置。不引入第三方镜像源,避免为
发布链路增加新的信任方。

* perf(release): 镜像打包复用预编译产物,不再重复编译

publish-images 此前在 Docker 内从 go mod download 开始重新编译 Go 与
Web(两个平台各一次,实测 216s),而 build-binaries 早已交叉编译出
gpt-load-linux-amd64/arm64——正是镜像需要的那两个文件。

Dockerfile 拆出共享的 runtime stage,两条打包路径都以它为基:
- source-build:默认 target,自包含源码构建,供本地与用户自建使用,
  必须保持在文件末尾,否则默认构建会落到 prebuilt 而要求预编译产物
- prebuilt:发布用,直接 COPY 预编译二进制

runtime 配置只定义一次,避免两套配置各自漂移。GitHub artifact 不保留
可执行位,prebuilt 用 COPY --chmod=0755 显式恢复。

发布证据链:新增 prebuilt-image-smoke,在发布前用与 publish-images
完全相同的打包路径做 smoke 与 Trivy 扫描,并加入 publication-preflight
的 needs;docker-smoke 继续覆盖源码自包含路径,两者不可互相替代。
release-docker-smoke.sh 新增 RELEASE_SMOKE_BUILD_TARGET 支持指定 target。

container_contract_test.go 原用「最后一个 FROM」定位 runtime 契约,多
stage 后不再成立,改为定位共享 runtime stage,并新增两条断言:每个可
发布 stage 必须派生自 runtime、除 runtime 外不得再有直接以 alpine 为基
的 stage,防止新增路径绕开全部 runtime 断言。已反向验证两条断言均能
拦截对应的破坏方式。

本地验证:prebuilt 镜像实跑 release-docker-smoke.sh 全流程通过(含
非 root 运行、数据目录权限、健康检查、Web UI、认证边界);删除
release/ 后默认 target 仍能正常源码构建。

* fix(release): prebuilt smoke 覆盖 arm64,补全发布前验证

publish-images 推送 linux/amd64 与 linux/arm64 两个平台,两条 prebuilt
路径 COPY 的是不同的二进制,但此前 prebuilt-image-smoke 只在 x86_64
runner 上验证了 amd64,arm64 打包路径没有发布前验证。

改为双架构矩阵,arm64 使用原生 ubuntu-24.04-arm runner(仓库在
native-artifact-smoke 已有先例)而非 QEMU:QEMU 模拟下的启动行为不能
代表真实 arm64 运行时。同时按架构精确下载单个产物,不再整批拉取。

另外让 RELEASE_SMOKE_BUILD_TARGET 的校验错误信息带上实际传入的值,
便于排查 CI 环境变量配置问题。

本地在 arm64 主机上实跑 prebuilt smoke 全流程通过。
2026-08-24 22:26:58 +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 e19e77ff34 docs: release info 2026-08-22 08:14:32 +08:00
tbphp 9369c74273 Merge branch 'v2' of github.com:tbphp/gpt-load into v2 2026-08-20 17:24:48 +08:00
tbphp 13f361a912 docs: ci releaes 2026-08-20 17:24:41 +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 c76524f408 fix(release): 修复间接祖先跳过导致发布后续 job 被连带跳过的问题 2026-08-19 22:55:06 +08:00
tbphp bb1f5680df docs(release): 精简发布说明并提供中英双语文案 2026-08-19 21:36:05 +08:00
tbphp a991251bc3 ci(release): 复用 CI 结论并消除发布流程重复验证 2026-08-19 19:45:52 +08:00
tbphp 4eeb6bb6ec fix: 修复发布问题 2026-08-19 17:16:55 +08:00
tbphp 413837607f fix: release 修复发布问题 2026-08-19 16:51:15 +08:00
tbphp 7745ed5ab5 fix: release 修复发布问题 2026-08-19 16:36:32 +08:00
tbphp ad26607510 fix: release 修复发布问题 2026-08-19 16:19:12 +08:00
tbphp c804e081a8 fix(release): 修复 Beta 发布 Smoke 检查 2026-08-19 15:37:05 +08:00
tbphp 3e1157a2af ci(release): 优化 V2 构建发布并发 2026-08-19 15:04:44 +08:00
tbphp 4ba93ab196 merge: 合并 Beta.1 初始迁移 2026-08-19 13:30:37 +08:00
tbphp 9d63f4095e refactor(storage): 合并 Beta.1 初始迁移 2026-08-19 13:30:19 +08:00
tbphp 70b1afb995 chore(license): 补齐第三方许可证声明与发布分发 2026-08-19 13:28:49 +08:00
tbphp 411a234338 chore(release): 规范 V2 预发布与协作流程 2026-08-19 12:52:18 +08:00
tbphp f7102bfd0f test(storage): 精简迁移测试覆盖 2026-08-16 17:48:10 +08:00
tbphp 4ca07d18e2 Merge branch 'v2' into feat/claude-oauth 2026-08-16 17:22:00 +08:00
tbphp f5fe38ac4d feat(claude): 接入 OAuth 订阅渠道 2026-08-16 17:21:50 +08:00
tbphp 55b41b16b7 fix(pricing): 持久化模式价格计划 2026-08-16 16:41:02 +08:00
tbphp 141819c632 test(ci): 优化测试夹具与并行门禁 2026-08-16 12:38:26 +08:00
tbphp 6ddbf5b56d fix(ci): 稳定 race 测试门禁 2026-08-16 11:31:03 +08:00
tbphp 4c00eed40b refactor(channel): 统一渠道架构与协议契约 2026-08-15 15:37:50 +08:00
tbphp 25424d61c4 feat(codex): 完善订阅额度与调度体验 2026-08-14 23:16:21 +08:00
tbphp 22a6f1c57b fix: 修复上游执行与迁移边界问题 2026-08-12 23:49:18 +08:00
tbphp 3e948eedbe test(ci): 稳定远端 race 门禁 2026-08-11 16:32:43 +08:00
tbphp 5e8c709df3 test: ci 2026-08-11 10:53:38 +08:00
tbphp 5ca340939c fix(v2): 收口发布前运行时与迁移问题 2026-08-10 12:17:05 +08:00